Briefs and skill: summary/wait verify, call budgets, range dump, Forgejo contributions

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-01 15:09:08 +02:00
commit 506680c262
3 changed files with 57 additions and 22 deletions

View file

@ -531,8 +531,10 @@ and reconciles the target doc with the Body.
Scripts that agents share live in this repo under `tools/`. `tools/INDEX.md`
lists each script, its consumer and the brief that names it; briefs name the
exact script they want and agents do not browse. Contributions come by branch
and pull request, never a push to main. A script that verdicts depend on gets
a Soul pass before merge. A script whose brief no longer names it is pruned.
and Forgejo pull request (this repo lives on Yggdrasil's Forgejo), never a push
to main. A script that verdicts depend on gets a Soul pass before merge, and
`bash tools/test-tools.sh` passes first. The summary and wait modes of
`tools/stopgap/ygg-verify.sh` and `tools/mutation-table.sh` are such scripts. A script whose brief no longer names it is pruned.
Scripts that know a project's layout stay in that project.
## Git and tooling rules (scars)

View file

@ -98,7 +98,8 @@ path>. Do not map cuts, do not write code, do not commit; the root agent
commits.
Rehydrate (recipes: target in force, rulings in force, open questions and
follow-ups). Read enough of the Body to enumerate the persistent kinds.
follow-ups). Read enough of the Body to enumerate the persistent kinds. Orient
and probe through scripts, one call per question, output at most 150 lines.
Give one table, a row per persistent kind:
- Identity: what names it. Is the namespace stated? Is the name injective? Can
@ -127,7 +128,8 @@ prose map at <path>, edit body facts and rationale. Also edit the model page
whenever a probe changes a row's identity, lifecycle or authority. Imagination
wrote that page in 0b, and a model a cut contradicts is stale steering text.
Do not commit; the root agent commits. Do not change code in any repo. Scratch probes in
<scratchpad> are fine.
<scratchpad> are fine. Orient and probe through scripts: one call per question,
output at most 150 lines. Budget 40-80 calls and about 250k context.
Rehydrate (recipes: target in force, rulings in force, open questions and
follow-ups, specs with no report, one cut's record for <cuts that constrain
@ -258,7 +260,15 @@ one head (SKILL.md, step 3); keep it fitting:
- **Verify once, at the end.** Not after every edit. A full mutation sweep and
a batchmode compile per edit is most of a long run's spend and proves nothing
the final sweep will not.
the final sweep will not. One job carries the build, the scoped tests and the
mutation run, so the queue and the compile are paid once.
- **Orient in one script.** One Bash call prints git status, the base and the
spec's anchor ranges (`sed -n`) for every file the spec names. Independent
reads, views and greps go in one parallel message.
- **Bound every observation.** No command prints more than about 150 lines.
Logs go to a file; read `tail -n 60` or `grep -n -m`, and read windows of a
file, never the whole of anything over about 300 lines. Reading a file twice
is a smell: write what you need to keep to a scratch notes file.
- **Read the spec by id, not the map.** The cut_spec is bounded and holds only
this cut; a worker that reads 900 lines of map to find 60 has spent its
budget before it starts.
@ -278,13 +288,16 @@ one head (SKILL.md, step 3); keep it fitting:
Long jobs: wait for them and finish, and never end your turn before your
report. Each turn end reaches Self as a notification and costs a read of its
whole context. Start the job as one background shell whose command exits only
when the job does. Then wait in the foreground, one call at a time, each at
most 270 s so that your cache stays warm: `timeout 270 bash -c 'until [ -e
<done-file> ]; do sleep 60; done'`, then read the result or call again. A call
whole context. Start the job as one background shell (run_in_background) with
`SUMMARY=<scratchpad>/<job>.log` in front of `tools/stopgap/ygg-verify.sh`, a
fresh log path per job. Then wait in the foreground, one call at a time:
`tools/stopgap/ygg-verify.sh wait <scratchpad>/<job>.log` blocks for at most
270 s, so your cache stays warm, and prints the bounded summary when the job is
done. If it prints `RUNNING <n>s` (exit 99), call it again. Exit 98 means the
launcher is gone with no verdict: rerun the job, do not guess its outcome. A call
longer than 5 minutes rewrites your whole context. Never run a second watcher
on the same job, never use a timer shorter than 60 s, and send no interim
message.
on the same job, never use a timer shorter than 60 s in a loop of your own, and
send no interim message.
Mutation tools run on schemata or copies and never edit the tree. A Soul
probe that mutates by hand works on a scratch copy: the stopgap's container
or a throwaway clone, never the working tree.
@ -310,7 +323,10 @@ Commits:
- Say in the message which commits don't build.
Verification: <exact builds, tests, captures, negative greps>.
- Verify through `tools/stopgap/ygg-verify.sh`; read its output tail, and open the full log only at a named failing test, with `grep -n -A 40`.
- Verify through `tools/stopgap/ygg-verify.sh` with `SUMMARY=<log>` (above):
read the summary, and open the full log only at a named failing test, with
`grep -n -A 40`. Hand mutants go in one list to `tools/mutation-table.sh`,
one job for all of them.
- Revert incidental asset churn.
Budget: if the cut can't land coherently, stop at a pushed, building commit
@ -335,8 +351,8 @@ revised spec first. Its fields:
- landed_names, undone, and promises: each thing you claim the cut now
guarantees, labelled, for Soul to measure
Report to Self, and nothing else: the cut_report id and receipt, then any raw
verification output too long for an evidence line, pasted, not summarised. No
Report to Self, and nothing else: the cut_report id and receipt, and, for
output too long for an evidence line, the scratch path that holds it. No
narrative of the pass, no restating the brief or the report.
```
@ -352,11 +368,15 @@ Admit one verdict and its findings, and nothing else.
afterwards.
- Do not run <expensive runtime> unless told.
- Long jobs: wait for them and finish, and never end your turn before your
report. Run the job as one background shell whose command exits only when the
job does, and wait in the foreground in calls of at most 270 s (`timeout 270
bash -c 'until [ -e <done-file> ]; do sleep 60; done'`). No second watcher,
no timer under 60 s, and no interim message: each turn end is a paid wake of
Self.
report. Run the job as one background shell with `SUMMARY=<scratchpad>/<job>.log`
in front of `tools/stopgap/ygg-verify.sh` (a fresh log path per job), and wait
in the foreground with `tools/stopgap/ygg-verify.sh wait <that log>`: it blocks
at most 270 s and prints the bounded summary when the job is done, or `RUNNING
<n>s` (exit 99) and you call it again. Exit 98 means no verdict: rerun, do not
guess. No second watcher, no timer under 60 s in a loop of your own, and no
interim message: each turn end is a paid wake of Self.
- Bound every observation: no command prints more than about 150 lines, logs go
to files, and you read windows of them.
Scope: <cut_report id>. Rehydrate (recipes: target in force, rulings in force,
one cut's record for <cut>), then view the report (its range and its promises), the cut_spec it
@ -401,7 +421,10 @@ specifically:
mutation run where you can, since that job pays for the build anyway. Batch
probes into one job script rather than one job each. Run the mutation tool
in parallel (`--jobs 3`), and skip by name any test that a follow-up records
as flaky, so that its flakes cannot count a surviving mutant as killed
as flaky, so that its flakes cannot count a surviving mutant as killed.
Dump the range once (`git diff <base>..<head> > <scratchpad>/range.diff` plus
`--stat`) and grep that file instead of re-running `git show` per file. Hand
mutants go in one list to `tools/mutation-table.sh`, never one job each.
Before recommending a mechanism as the fix direction, check that it was not
already built and deleted. Run `git log -S '<distinctive identifier>'` and
@ -448,7 +471,8 @@ the campaign's mind and the prose map and target doc; don't edit those, and
admit nothing. Rehydrate (recipes: rulings in force, open questions and
follow-ups) to check memory against the mind.
Surfaces: <memory dirs and files>.
Surfaces: <memory dirs and files>. Budget at most 25 calls: inventory the
surfaces in one script, then make the edits.
Candidates for durable memory: <ruling ids, scars>. Check each against its
owner first, the mind included, and don't duplicate what the owner records. A
@ -474,7 +498,8 @@ what was missing and what it would have prevented.
```
You are Eyes. Read only. Write findings to <scratchpad>/<name>.md and return a
short summary. You read the campaign's mind with query and view only, through
short summary. Budget at most 40 calls: transcripts by script, never whole
reads, and fetches batched in parallel. You read the campaign's mind with query and view only, through
the Rehydrate block (recipes: <as needed>); you never admit.
Sources:

View file

@ -2,6 +2,14 @@
Record each change to the skill together with the evidence that motivated it.
## 2026-10-01: verify summaries, a wait mode and a kill table
Campaign `eureka-substrate`, cut `tool-calling-s5` (map `references/tool-calling-cut.md`, sections 3 and 5). Operator go: "go with 2 and 3; we're spending tokens to save tokens."
Evidence: Hands spent 3,852 observation calls (poll, read log, monitor, stop) on 1,443 launches, 2.7 per job, and Soul 1,800 on 813, 2.2 per job; eight ad-hoc harnesses (`runmut.sh`, `mutrun.sh`, `strykrun.sh` and others) were reinvented across agents.
What changed. `ygg-verify.sh` gains `SUMMARY=<log>` (full log to a file, bounded summary out: verdict, counts per framework, `ZERO TESTS RAN`, failing tests, failure sections and tail for a red job, and a `MISMATCH` line when the exit is 0 but the log shows failures) and `wait <log>` (blocks at most 270 s, returns the summary once, `RUNNING` exit 99, exit 98 for a launcher that died or never started). `tools/mutation-table.sh` runs a list of hand mutants in one job and returns a kill table with the killing test per mutant; it aborts on a red or zero-test baseline and never counts a build error as a kill. `tools/testparse.sh` is the one parser both read, with fixtures under `tools/fixtures` and `tools/test-tools.sh`. Briefs now name them, add orient-in-one-script and bounded-observation rules for Hands and Soul, call budgets for Imagination (40-80), Eyes (40) and Life (25), the range-dump rule for Soul, one job for build, tests and mutation, and the scratch-path form of the Hands report. Contribution text says Forgejo pull request.
## 2026-10-01: the skill follows the mind's correctness core
Campaign `eureka-substrate`, cut `skill-recipes`, after the Huginn admission-rule and `eureka-state` client cuts (cut `ops-mind-upgrade`). Evidence: a census of the live mind found 6 findings that could not be closed and 39 resolutions that could not be withdrawn, from key locals over the bound.