Skip to content

fix(brains): sync the generated capability catalog to production and bump to 2.9.4 [BRNS-DIST-017] - #31

Merged
olegshmuelov merged 3 commits into
mainfrom
chore/sync-catalog-2026-08-25
Aug 26, 2026
Merged

fix(brains): sync the generated capability catalog to production and bump to 2.9.4 [BRNS-DIST-017]#31
olegshmuelov merged 3 commits into
mainfrom
chore/sync-catalog-2026-08-25

Conversation

@olegshmuelov

@olegshmuelov olegshmuelov commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

What

Syncs the two stale generated artifacts to what production serves — ssvlabs/brains @ 96e3f1dbc, the stage → main promotion that merged today — and bumps the plugin to 2.9.4 on both manifests. plugins/brains/skills/brains-automation/SKILL.md and plugins/brains/generated/capability-catalog.json are byte-identical to the monorepo generator's output at that commit (--plugin-root run from a detached worktree, --source-commit stamped; no hand edits). The other four published skills were already fresh at that commit.

Why

The published skill currently teaches an integration read shape that silently ingests nothing: brains.fetch({source, input}). An explicit input is forwarded verbatim to the source's fetch action, so without write_pages: true the call reaches Google, writes zero pages, returns ingested_count: 0, and discards what it fetched. Only the request arm sets the flag for you. Every automation an agent authors from the current copy inherits that bug. The regenerated copy teaches brains.fetch({source, input: {…, write_pages: true}}).

Two smaller corrections ride along, both about what a mandated Step 8.5 smoke test proves. The verify_mode documentation now states that http_fetch (any method) and adapter_query are suppressed — previously unstated, so an author could believe a verify run had exercised an external call. And the succeeded row no longer implies a green run proves one.

Contract-test changes

tests/plugin-contract/run.ts pins several regions of the generated skill verbatim, because keyword checks are defeated by paraphrase — a sentence added beside a rule can reverse it while every substring check stays green. Three pins break against the new bytes and are re-pinned:

  • AUTOMATION_SMOKE_TEST_REGION — the verify_mode bullet changed, and the region's exclusive end-anchor The tool enqueues no longer exists; the polling paragraph now opens The tool polls until. The anchor moved with it and the region covers the same span.
  • AUTOMATION_SUCCEEDED_RESULT_ROW — re-pinned to the new row.

No existing pin was widened or weakened; AUTOMATION_VERIFY_CARVE_OUT is unchanged and its placement check is exactly as strong as before.

This change also introduces three rails that nothing here reached, so they are pinned alongside — the same reason Rule 2b was added last sync. All three are bounded-region equality rather than substring containment, because containment proves adjacency, not exclusivity: a contradicting sentence added beside a pinned string leaves every includes green while the surrounding text says the opposite.

  • Rule 2c — the whole partial row, matching how its sibling succeeded row is already pinned; and the failed/killed row from its opener through its cause list. The update_agent full-replacement mechanics after the Patch the source via hand-off stay outside the pin deliberately, since they drift for unrelated reasons; the comment says so.
  • Rule 4 — the complete Reads/refresh cell, plus a shape check that extracts every brains.fetch(...) call and requires each to carry write_pages: true. Calls whose parentheses never close are refused outright rather than assumed correct, so an unbalanced paren inside a query string cannot produce a runaway slice that inherits a flag from elsewhere in the file.

These are pinned here rather than left to upstream on purpose. Upstream pins catch an upstream regression; they say nothing about a coordinated edit in this repo — artifact plus refreshed digest plus version bump clears both the digest loop and generated-artifact-guard.sh, which names that hole in its own LIMIT section. Every pin is mutation-tested with the digest refreshed: reverting a rail, appending a contradiction beside one, and every flag-less call spelling tried — including one that smuggles the flag’s text inside a quoted argument — fail on their own named assertion, while an edit to unpinned prose still passes. The fetch check does not search for the flag at all: the skill must contain exactly one brains.fetch call and it must sit inside the equality-pinned cell, so the flag is pinned transitively and a second call of any shape reds the build.

Worth a careful look: these are sentences authoring agents execute on user machines, so what matters is whether each is true of the server at 96e3f1dbc, not whether the suite goes green. Each was checked against the verify-mode gate, the http_fetch short-circuit and the open-world read dispositions.

Known residuals (upstream generator copy — deliberately not edited here)

  • The verify_mode bullet names http_fetch and adapter_query as suppressed, which reads as exhaustive. fetch_from_integration is suppressed and unvalidated too, while the same skill files brains.fetch under "Reads/refresh".
  • The succeeded row's "nothing was written or sent" understates external compute — automation_llm_complete and recommend_recipes stay live and reach a model provider — and its "the validated writes really ran" overstates a status that means only exit 0 with empty stderr.
  • The suppression case the rows call expected has no terminating path: "no fix spent", but Step 9 stays barred until succeeded, and a rerun is deterministic.
  • "Board rows and board metadata … stay fully validated" holds for the nine named board tools; dashboards, comments, forms, ACLs, uploads, links and board skills are suppressed unvalidated. Step 5.5 still says egress happens from the "stage VPC".

All need catalog fixes in ssvlabs/brains and are tracked there. Note the constraint on any of them: the injected automation block is 13,993 tokens against a 14,000 budget, so naming another tool costs a cut elsewhere.

Ticket: BRNS-DIST-017

…bump to 2.9.4

Regenerate brains-automation/SKILL.md and generated/capability-catalog.json from
the ssvlabs/brains generator at 96e3f1dbca47ab433c1c5e4fdbd7a1a4793a7132, the
commit production serves.

Three corrections are prose an authoring agent executes:

  * the integration read shape becomes
    brains.fetch({source, input: {…, write_pages: true}}) — an explicit input is
    forwarded verbatim, so without the flag the call fetches and persists
    nothing;
  * the verify_mode bullet now states that http_fetch (any method) and
    adapter_query are suppressed, so a smoke test is not evidence an external
    call works;
  * the succeeded result row no longer implies a green verify run proves an
    external call, alongside the existing nothing-landed caveat.

Update the three contract-test regions the new bytes break — the smoke-test
region and its end anchor, which moved with the polling paragraph, and the
succeeded result row — re-pinned verbatim and each checked against the server's
verify-mode gate at that commit. No pin was widened.

Pin the three rails this change introduces, which nothing local reached: the
Reads/refresh cell, the partial row, and the failed row from its opener through
its cause list. Each is a bounded slice compared whole, because a containment
check proves the approved text is present rather than that it is the whole rule
— a sentence appended beside it reverses the rule while the pinned text
survives. The flag-less fetch shape is banned by shape: call sites are matched
by pattern so a space before the paren cannot hide one, and a call whose parens
never balance is refused on its own rather than tested for the flag, which
would otherwise let it inherit a flag from text further down the file.

Upstream pins these rails too, which catches an upstream regression but not a
coordinated edit of artifact, digest and version here — the hole the artifact
guard names in its own limit section, and the reason Rule 2b exists.

BRNS-DIST-017
… over-approximation

.subtask/ is worker scaffolding that was untracked and unignored, so a git add -A
in this public repo would stage it.

The flag-less brains.fetch ban also flags the request arm, where the shim sets
write_pages itself and there is no input to carry it. No such call exists today,
so the ban does not fire; the comment records why the over-approximation is
deliberate and what to do if it ever reds on correct bytes.

BRNS-DIST-017

@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: 076a949

Comment thread tests/plugin-contract/run.ts Outdated
Comment thread plugins/brains/generated/capability-catalog.json
The flag-less ban ended in a raw substring search over each call's span, which
cannot tell an object key from characters inside a quoted argument. A second,
genuinely flag-less call written as
`brains.fetch({source, input: {q: "note: write_pages: true is set elsewhere"}})`
therefore passed — a fifth spelling past a check already hardened lexically
three times.

Replace the predicate with an identity invariant rather than refine it again:
the skill must contain exactly one brains.fetch call, and that call must live
inside the Reads/refresh cell, which is already pinned byte-exact. The flag is
then pinned transitively and no substring remains to smuggle. Nothing searches
for write_pages: true any more.

This widens the fail-loud trade: any second brains.fetch call now reds the
build, a legitimate one included. The comment records that, and says to pin a
new call the way the read cell is pinned rather than relax the count.

BRNS-DIST-017

@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: a299bb9

@olegshmuelov
olegshmuelov merged commit d1dcc0a into main Aug 26, 2026
5 checks passed
@olegshmuelov
olegshmuelov deleted the chore/sync-catalog-2026-08-25 branch August 26, 2026 08:50
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