Skip to content

chore: promote runtime surface deriv@1.0.2 - #9

Merged
vaibhavkumar-deriv merged 1 commit into
masterfrom
promote/deriv-1.0.2
Sep 16, 2026
Merged

vaibhavkumar-deriv merged 1 commit into
masterfrom
promote/deriv-1.0.2

Conversation

@vaibhavkumar-deriv

Copy link
Copy Markdown
Collaborator

Promotes the plugin runtime surface to deriv@1.0.2.

Built by scripts/build-promotion-bundle.mjs from scripts/promotion-allowlist.json in the private working repo at master 04174e7. Copy-by-inclusion — 27 files modified, none added, none removed; 116 allowlisted paths plus the 4 public-repo scaffold files, 120 total.

What this carries

  • 1.0.11.0.2 across all four manifests. Version-only in .claude-plugin/, .cursor-plugin/ and .codex-plugin/ — no other field moved.
  • Three MCP dependency descriptions restored. deriv-market-data, deriv-trade-lifecycle and deriv-trade-types return to "Live Deriv API guides, schemas, examples, and payload validation" — the copy authored here in docs: align marketplace listing copy with Deriv UX writing #7, which the 1.0.1 promotion overwrote with the upstream wording. That decision is now settled upstream at the authoring root (deriv-com/deriv-api-mcp 8f2d892), so it will not be reverted again by a later refresh.
  • The set stays deliberately non-uniform. deriv-auth keeps its authentication wording and both chart skills keep their chart-feed wording; docs: align marketplace listing copy with Deriv UX writing #7 never touched those. A gate in the working repo now fails a later tidy-up that flattens them all.
  • Publish and verify workflow hardeningpublish.yml no longer evaluates a tar listing through a pipeline where pipefail plus SIGPIPE could invert the traversal guard; verify-surface.mjs gains presence, MCP URL pin and Codex gates.
  • Partner trust copy in README.md and SECURITY.md.
  • Chart and docs-snapshot reference pages refreshed, including overlay hardening on the go-live and llms skills. The deriv-llms snapshot date moves with no content change — the published pages re-fetched byte-identical, so the date records when the snapshot was last verified.

Verification

Run against this branch's tree before pushing:

  • verify-surface.mjs as it exists on master today (what CI runs on this PR): OK — 120 path(s), surface + content + internal-reference gates clean
  • verify-surface.mjs as this PR replaces it: OK — 120 path(s), surface + presence + MCP URL pin + content + internal-reference + Codex gates clean
  • All 8 skills/*/SKILL.md frontmatter blocks parse — 0 failures
  • .mcp.json pins https://mcp-api-v2.deriv.com/mcp; Codex interface.developerName stays lowercase deriv
  • Working-tree status against master was exactly 27 modified, 0 untracked, 0 deleted — matching the measured delta with no surprises

Upstream sync was confirmed before building: deriv-com/deriv-api-mcp master is 8f2d892, exactly the commit the working repo's bundle records, and re-running the refresh produced no content change. This repo has had no hand-authored commits since the 1.0.1 promotion.

🤖 Generated with Claude Code

Built by scripts/build-promotion-bundle.mjs from scripts/promotion-allowlist.json
in the private working repo, at master 04174e7. Copy-by-inclusion: 116 allowlisted
paths plus the 4 public-repo scaffold files, 27 modified, none added or removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

OpenSSF Scorecard

PackageVersionScoreDetails
actions/actions/create-github-app-token 3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 🟢 5.1
Details
CheckScoreReason
Code-Review⚠️ 2Found 3/14 approved changesets -- score normalized to 2
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 7dependency not pinned by hash detected -- score normalized to 7
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 6SAST tool is not run on all commits -- score normalized to 6
actions/actions/create-github-app-token d72941d797fd3113feb6b93fd0dec494b13a2547 🟢 5.1
Details
CheckScoreReason
Code-Review⚠️ 2Found 3/14 approved changesets -- score normalized to 2
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 7dependency not pinned by hash detected -- score normalized to 7
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 6SAST tool is not run on all commits -- score normalized to 6

Scanned Manifest Files

.github/workflows/publish.yml

@ako-deriv ako-deriv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the workflow hardening, the verifier changes, the manifests, and the skill/docs overlays. Everything checks out; CI is green on the current verify-surface.mjs, .mcp.json matches the new URL pin, and the ws-demo/ws-real overlay fix is correct — I re-fetched the live developers.deriv.com/llms/ws-demo.md and its example really does send {"ws_demo":1} on the public socket, which contradicts its own otp query-param schema, so replacing that with "connect to the OTP URL" is the right call.

Good fixes worth calling out:

  • source_repo_name now derives from the trusted vars.PROMOTION_SOURCE_REPO instead of the dispatch payload.
  • The surface guard now runs from the checked-out .github/workflows/verify-surface.mjs, not from inside the artifact it is checking.
  • git add -A before git diff --cached --quiet closes the untracked-new-file blind spot in the "nothing to commit" branch.
  • The create-github-app-token SHA 3ff1caaa… is the actual v2.0.2 tag; the previous d72941d… pin was mislabeled. Might be worth a one-liner in the PR body since the description calls the workflow changes out but not this.

One trust-model note, not a blocker: with the cp _staged/.github/workflows/publish.yml step, the promoter can now rewrite the receiver's own workflow (the App needs Workflows: write for exactly this, as the comment says). That's a deliberate and documented extension of the existing trust boundary — the artifact must come from the validated source repo's release — so fine, just flagging it for anyone reading the history.

Everything else is nits, inline. Approving.

Pre-existing nit outside the diff: publish.yml step 6 comment still says "13 allowlisted runtime paths"; the allowlist is 116 now.

--exclude '.git' --exclude '.github' \
--exclude '_staged' --exclude '_incoming' \
_staged/ ./
cp _staged/.github/workflows/publish.yml .github/workflows/publish.yml

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit / question: only publish.yml is synced from _staged/.github/, but verify-surface.mjs, verify-surface.yml, and update-changelog.mjs (which this workflow depends on) are not — this PR carries a verify-surface.mjs change by hand that the steady-state receiver wouldn't pick up. If "the artifact must never replace its own verifier in the same run" is the intent, a short comment here would make that explicit. Either way, a [ -f _staged/.github/workflows/publish.yml ] || fail "artifact is missing publish.yml" guard would give a legible error instead of a bare cp failure under set -e.

deletes=$(rsync -a --delete --dry-run --itemize-changes \
--exclude '.git' --exclude '.github' \
--exclude '_staged' --exclude '_incoming' \
_staged/ ./ | grep -F '*deleting' || true)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: under pipefail, the trailing || true also swallows an rsync failure in the dry-run, not just grep's no-match exit. Harmless in practice since the real rsync below would then fail under set -e, but if you want the guard to be strict you could check PIPESTATUS[0] or run the dry-run to a file first.

```

```javascript
onUserConfirmed(() => ws.send(JSON.stringify({ buy: pendingProposal.id, price: pendingProposal.ask_price })));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (docs pseudo-code): if the user confirms before a proposal message arrives, pendingProposal is undefined and this throws. A one-line guard (if (!pendingProposal) return;) keeps the snippet copy-paste safe, and it's also a natural place to note that proposal ids expire and should be refreshed rather than reused.

```

```javascript
onUserConfirmed(() => ws.send(JSON.stringify({ buy: pendingProposal.id, price: pendingProposal.ask_price })));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same nit as in examples.md: guard against pendingProposal being undefined when the confirmation fires early.

Comment thread SECURITY.md
does not collect API tokens. It asks you to configure nothing. There are
no user Deriv credentials in this plugin.
The hosted server's own deployment secrets are never part of the plugin;
deployment secrets are not in this repo.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: these two sentences say the same thing ("deployment secrets are never part of the plugin" / "deployment secrets are not in this repo"). One of them can go.

@vaibhavkumar-deriv
vaibhavkumar-deriv merged commit 5e92823 into master Sep 16, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants