Skip to content

fix(brains): sync the generated capability catalog and bump to 2.9.1 [BRNS-MCP-052][BRNS-CORE-061] - #28

Merged
olegshmuelov merged 2 commits into
mainfrom
chore/sync-generated-catalog
Aug 12, 2026
Merged

fix(brains): sync the generated capability catalog and bump to 2.9.1 [BRNS-MCP-052][BRNS-CORE-061]#28
olegshmuelov merged 2 commits into
mainfrom
chore/sync-generated-catalog

Conversation

@olegshmuelov

@olegshmuelov olegshmuelov commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Merge gate

Do not merge until the release is serving in production. ssvlabs/brains#1326 promotes both source changes to main; until it merges and every production MCP replica is on that image, merging here publishes guidance ahead of the server it describes.

The manifest stamps source_commit: 6fb7b2356592b4e5313176cc55d6d06cb3130e31, which is contained in #1326. Once that promotion merges, this commit is an ancestor of main and production runs its code, so the stamp names the exact tree these bytes were rendered from — more precise than the promotion commit, which merely contains it — and no re-render is needed.

What this does

Regenerates the five published skill artifacts and their digest manifest from the capability catalog in ssvlabs/brains. These artifacts are build output and are not editable here; wording changes belong upstream. Both client manifests move 2.9.02.9.1 together.

Three generated skills move:

  • brains-write/SKILL.md — two rules added to the action contract (BRNS-MCP-052): get the user's go-ahead for a write before calling rather than calling to find out whether it drafts, and a second cap of 10 direct executions/user/60s across every install, past which a direct execution degrades to a draft.
  • brains-automation/SKILL.md — corrects the dry-run guidance (BRNS-MCP-052). A verify-mode smoke test suppresses act sends and telegram_push, but board and page writes run live, so a smoke test mutates real rows; the previous wording implied every side effect was muted. This is the change worth reading — the published text is false in the direction that costs a user real data.
  • brains-build/SKILL.md — admits a recipe-install row, names create_integration_flow for integration authoring, and drops create_share_circle from the sharing row (BRNS-CORE-061), which sat under "give someone access" and grants access to nothing.

capability-catalog.json advances three artifact_sha256 values, two catalog_sha256 values, and source_commit. tests/plugin-contract/run.ts pins the action contract verbatim and has to move with the rendered bytes — that pin forces a human read of the text before it ships; the digest checks, not the pin, verify provenance. Seven files; brains-board and brains-workflow re-render byte-identically and nothing else authored is touched.

Why patch, not minor

Every tool the new rows name is already published elsewhere in the skill set, so no new capability is advertised — measured as a set difference over the whole published tree, not a spot check: zero identifiers in the render are absent from 2.9.0. The counter-signal, recorded rather than buried: create_share_circle is a net removal, named only in the skill being rewritten. It still exists and works and no published skill's instructions depend on it, so this narrows guidance rather than breaking an API.

Why this waits for the release

Provenance, not contradiction. The manifest stamps source_commit, and that must name a commit production actually serves — or is contained in — so a later reader is not misled about what was live when these bytes shipped. Nothing here advertises behaviour production lacks: the second rate cap already exists server-side, all five tools the new row names already exist, and the corrected dry-run text describes today's behaviour.

A version bump reaches an install only when that install updates, so this correction does not reach anyone pinned to 2.9.0 or running with auto-update off.

Verification

  • Source tree proved self-consistent with the generator's --check before being used as a source.
  • Rendered twice into separate scratch roots, byte-identical; all five skills byte-compared against the source repo's own generated copies at that commit.
  • Every digest cross-checked against the source manifest and recomputed from the bytes on disk; the two manifests differ in exactly one key, source_commit, stamped on the published copy only.
  • Contract, inbox-v2 and tool-error suites green locally; delivery guard reports both manifests 2.9.0 -> 2.9.1.

Before merging

  • ssvlabs/brains#1326 is merged to main as a merge commit, so 6fb7b2356 stays an ancestor. A squash would rewrite it and the stamp would name a commit main no longer contains.
  • Every production MCP replica serves that image, confirmed against the statefulset's desired image and currentRevision == updateRevision rather than a deploy status.

…[BRNS-MCP-052][BRNS-CORE-061]

The five published skill artifacts and their digest manifest are generated in
ssvlabs/brains and are not editable here. This regenerates them from the catalog and
moves both client manifests together.

Three rendered skills change.

brains-write gains two rules in the action contract: get the user's go-ahead for a
write before calling, rather than calling to find out whether it drafts; and a second
cap, since direct execution is limited to 10/user/60s across every install and past
either cap a direct execution degrades to a draft.

brains-automation corrects its dry-run guidance. A verify-mode smoke test suppresses
act sends and telegram_push, but board and page writes run live, so a smoke test
mutates real rows. The previous wording implied every side effect was muted.

brains-build admits a recipe-install row, names create_integration_flow as the
integration-authoring entry point, and drops create_share_circle from the sharing
row, which sat under "give someone access" and grants access to nothing.

Patch rather than minor: every tool these rows name is already published elsewhere in
the skill set, so no new capability is advertised.

tests/plugin-contract/run.ts pins the action contract verbatim and moves with the
rendered bytes. That pin forces a human read of the text before it ships; the digest
checks, not the pin, are what verify provenance.
@olegshmuelov
olegshmuelov marked this pull request as ready for review August 12, 2026 12:12

@stefan-ssv-labs stefan-ssv-labs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🛑 review-pr: 2 blockers against BRNS-MCP-052 / BRNS-CORE-061 — see inline comments.

Comment thread plugins/brains/generated/capability-catalog.json
Comment thread plugins/brains/skills/brains-automation/SKILL.md

@sebastian-ssvlabs sebastian-ssvlabs left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Reviewed-at: 5c509e6

Comment thread tests/plugin-contract/run.ts
Comment thread plugins/brains/generated/capability-catalog.json
…S-MCP-052]

brains-automation had three content assertions, all Telegram secret-hygiene rules.
Everything else about the artifact was digest equality, which proves the bytes came
from the catalog and says nothing about what they say. A regeneration could re-drop
any draft-vs-execute rule and this suite would stay green — the same blind spot that
let the upstream defect reach production.

Three rules now pinned, matching how the brains-write contract is pinned:

- The write-policy contract, as a whole region from the confirmation-boundary opener
  to the notify-me lead-in. Automation tokens cannot self-confirm, and a
  confirmation-required action is released by write_policy rather than the sandbox.
- The smoke-test contract, as a whole region covering the run_automation_once
  argument list. Board and page writes run live under dry_run AND verify_mode, so a
  mandated smoke test mutates real rows.
- The Send grant row, verbatim, plus a uniqueness check that exactly one row in the
  grant table states act_on_integration's draft-vs-send disposition.

Whole regions rather than substrings because both failure modes are known here: a
keyword pin dies to paraphrase, and a lone sentence pin dies at the seam, where the
contradiction is written beside the pinned text and every substring check still
passes. The Send row is the exception and takes a uniqueness check instead of a
region, because the other twenty rows are a grant inventory that moves for unrelated
reasons and pinning them would add no coverage of this rule.

Each rule was mutation-proved independently: deleted, then paraphrased with
surrounding text intact, with the manifest digest realigned each time so the digest
check could not be what failed. Six mutations, six failures, each naming its own
region.

@stefan-ssv-labs stefan-ssv-labs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ review-pr: clean re-review; both prior blockers are verified fixed.

@olegshmuelov
olegshmuelov merged commit 0bd8505 into main Aug 12, 2026
4 checks passed
@olegshmuelov
olegshmuelov deleted the chore/sync-generated-catalog branch August 12, 2026 13:31
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.

3 participants