feat(eval): declare every boundary, and move the command core to just #853
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!853
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/xu59-just-boundaries"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Stacked on #847, which is the placeholder doc this implements. Base is
aos/claude/xu59-eval-board, notmain. Merge that first, or retarget.The command core
All 30 verbs are just recipes, mapped one to one with bodies unchanged. Verified programmatically: the recipe set and the old
commands:set are equal, no additions, no drops.Multi-step verbs still route through the helper, renamed
scripts/ward-command.shtoscripts/task.sh, so they keep stampingSIRENS_ECHO_RUNNERand installing a missing commit hook on the way past. Recipes naming their tool directly still do neither. That is the split the old manifest already had, preserved rather than redesigned, so no dataset silently loses its provenance stamp..ward/test-skips.allowmoves toscripts/test-skips.allow. CI callsjustinstead ofward exec, andjustis already in the CI image at/usr/local/bin/just(docker/dev-base/install-common.sh:165), so this does not need an image change.What could not move, and why
.ward/ward.yamlsurvives, carrying only its catalog block. Two upstream validators pin it:agentic_os/pre_commit/check_catalog_block.pysetsCONFIG_PATH = Path(".ward/ward.yaml")and fails with "Every coilysiren/* repo needs .ward/ward.yaml"catalog-trifectarequires README, AGENTS, and FEATURES to each carry a link resolving to itBoth are authored in agentic-os, so per the authoring-vs-rollout rule this repo cannot fix them. The file stays until they learn a new location. I have filed that upstream and linked it below.
What I deliberately did not touch
The runtime ward surface.
ward-execjob kinds,WardCommandRunner, theX-Ward-*proxy headers, and thewrap ward mcpguardfile grammar are product behaviour, not the dev command surface. Retiring those would be a large behaviour change nobody asked for.Run records under
evaluations/. They keep theirward execwording. They are historical provenance per #836 and rewriting them would be editing evidence.The boundaries
eval/boundaries.yamldeclares 28 boundaries, so 56 paired cases.agent/content-classes.yaml, and 9 reply checks fromturnstages.gowith grounding expanded to its four distinct refusal reasonsjust boundaries-checkverifies every origin path exists, every derived fragment is still present in it, no id repeats, and no boundary is missing an arm. It reports the 6 prose clauses as undriftable rather than passing silently, which is the honest state and the first real follow-up.Six boundaries carry a
seednaming the breaching record and issue they absorb, so the absorb path agreed on #846 lives in the data rather than in a plan.56 cases is the same order as the reference board's 78, so roughly the same 40 minutes of grading. That only holds because the bot dimension collapses, which is #836's requirement and a feasibility constraint at once.
One real prompt change
Regenerating the snapshots changed one comment line inside the composed prompt, the generator attribution naming
justinstead ofward. Small, but it is a prompt edit and this epic exists because prompt edits used to ship unannounced.Verification
build,policy-check,vet,test,test-skips, andpre-commitall pass.just boundaries-checkreports 28 declared, 22 derived, 6 prose.Follow-up
Giving the 6 prose clauses a machine-readable declaration is the next task, and is what makes the board fully derived.
🤖 Generated with Claude Code
Second commit: the prose clauses now declare themselves, and two of them turned out to implement nothing. Lucia (AI Engineer seat), 2026-08-15.
What a declaration is
A skill ships a
boundaries.yamlsidecar naming each clause, its heading, and a digest of the prose beneath it. The digest covers one section and normalizes whitespace, so a reflow is not a change and any rewording is.just boundaries-updateaccepts a deliberate edit, and a check never does.Sidecar rather than the frontmatter I proposed to Kai. Both policy skills sit exactly on their size cap, 80 lines and 3987 of 4000 chars, so frontmatter did not fit. It is the better shape regardless:
skillpackcomposesSKILL.mdplusreferences/*.mdonly, so a.yamlsibling cannot reach the prompt by construction rather than by measurement. BothSKILL.mdfiles are byte-identical to the previous commit, and a test fails if a declaration ever lands in one.The finding
Two of the six have no prompt text behind them at all:
prose-boundary-brevity- #175 holds the doctrine decision, #843 the measurementprose-self-description-source- #251 holds the permission decision, #844 the measurementI could have written a plausible origin for each and had a clean 28-for-28. That would have hidden the exact thing #846 exists to surface, so
implementationis nowderived,clause, ornone, andnonerequiresblocked_bynaming the issue that owns the decision.Honest count: 22 derived, 4 clause, 2 implemented by nothing.
Why Go
The checker parses YAML, extracts markdown sections and hashes them, which is past what bash and yq should carry. It has tests, including one asserting the tracked declaration is clean rather than only a fixture, and one that fails if a declaration reaches a prompt-bearing file. It runs in the gate and in CI beside
policy-check, and the existing gate-CI parity guard was extended so the two cannot drift apart.Full gate green.
Correction to this pull request's framing, not its code. Lucia (AI Engineer seat), 2026-08-15.
The body says
.ward/ward.yamlsurvives because upstream validators pin it. That is true today and reads as permanent. It is transitional.coilysiren/inbox#365 ruled the file leaves repos entirely.coilyco-flight-deck/ward#1660 carries the last live key,catalog.dependsOn, and retirescheck_catalog_blockwith it. So the file this pull request leaves behind holding only a catalog block is the last thing standing before it goes, not a correctly-scoped survivor.No code change needed here. The sequencing is right: the file has to stay until ward stops reading the key at launch, and this pull request does not touch that key. Only the framing was wrong, and a later reader should not take the retained file as the end state.
Tracked at ward#1660, which now carries a full fleet sweep.