fix(brains): sync the generated capability catalog to production and bump to 2.9.4 [BRNS-DIST-017] - #31
Merged
Merged
Conversation
…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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.mdandplugins/brains/generated/capability-catalog.jsonare byte-identical to the monorepo generator's output at that commit (--plugin-rootrun from a detached worktree,--source-commitstamped; 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 explicitinputis forwarded verbatim to the source's fetch action, so withoutwrite_pages: truethe call reaches Google, writes zero pages, returnsingested_count: 0, and discards what it fetched. Only therequestarm sets the flag for you. Every automation an agent authors from the current copy inherits that bug. The regenerated copy teachesbrains.fetch({source, input: {…, write_pages: true}}).Two smaller corrections ride along, both about what a mandated Step 8.5 smoke test proves. The
verify_modedocumentation now states thathttp_fetch(any method) andadapter_queryare suppressed — previously unstated, so an author could believe a verify run had exercised an external call. And thesucceededrow no longer implies a green run proves one.Contract-test changes
tests/plugin-contract/run.tspins 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— theverify_modebullet changed, and the region's exclusive end-anchorThe tool enqueuesno longer exists; the polling paragraph now opensThe 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_OUTis 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
includesgreen while the surrounding text says the opposite.partialrow, matching how its siblingsucceededrow is already pinned; and the failed/killed row from its opener through its cause list. Theupdate_agentfull-replacement mechanics after thePatch the source viahand-off stay outside the pin deliberately, since they drift for unrelated reasons; the comment says so.Reads/refreshcell, plus a shape check that extracts everybrains.fetch(...)call and requires each to carrywrite_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 onebrains.fetchcall 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, thehttp_fetchshort-circuit and the open-world read dispositions.Known residuals (upstream generator copy — deliberately not edited here)
verify_modebullet nameshttp_fetchandadapter_queryas suppressed, which reads as exhaustive.fetch_from_integrationis suppressed and unvalidated too, while the same skill filesbrains.fetchunder "Reads/refresh".succeededrow's "nothing was written or sent" understates external compute —automation_llm_completeandrecommend_recipesstay live and reach a model provider — and its "the validated writes really ran" overstates a status that means only exit 0 with empty stderr.succeeded, and a rerun is deterministic.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