@orkestrel/scaffold 0.0.48 → 0.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/bin/main.js +427 -97
- package/dist/bin/main.js.map +1 -1
- package/dist/host/agents/orchestration.md +35 -3
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +4 -0
- package/dist/host/claude/agents/orkestrel.md +44 -44
- package/dist/host/claude/rules/quality.md +4 -1
- package/dist/host/claude/rules/tests.md +6 -2
- package/dist/host/guides/scaffold.md +478 -161
- package/dist/host/manifest.json +217 -109
- package/dist/host/scripts/codex.sh +0 -0
- package/dist/host/scripts/cursor.sh +0 -0
- package/dist/host/scripts/deps.sh +0 -0
- package/dist/host/scripts/ollama.sh +0 -0
- package/dist/host/tests/config.test.ts +129 -6
- package/dist/src/core/index.cjs +1315 -82
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +265 -44
- package/dist/src/core/index.d.ts +265 -44
- package/dist/src/core/index.js +1308 -83
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +816 -152
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +723 -391
- package/dist/src/server/index.d.ts +723 -391
- package/dist/src/server/index.js +812 -156
- package/dist/src/server/index.js.map +1 -1
- package/package.json +10 -9
|
@@ -211,6 +211,13 @@ Every role honours this floor. No dispatch may widen it.
|
|
|
211
211
|
same class of defect through a new door, the search is following the frame rather than the
|
|
212
212
|
defect. Bound the scope, then fan out independent lenses over disjoint slices in one pass.
|
|
213
213
|
Parallelism is worth more here for the framing it breaks than for the wall-clock it saves.
|
|
214
|
+
- When the recurring class has a direction — each fix relocates it along one stream: a dependency
|
|
215
|
+
chain, a data path, a call chain — the source sits elsewhere on that stream, and deepening the
|
|
216
|
+
current station cannot reach it. Switch from depth to breadth: fan probes over the stream's
|
|
217
|
+
stations in parallel, blind and clean-contexted, as far up and down as the stream runs, to locate
|
|
218
|
+
the source. Then plan downstream from the source with the sweep's map of how far the defect
|
|
219
|
+
reaches, so the remaining work carries a measured bound instead of an open count of rounds. The
|
|
220
|
+
seam budget in `.claude/rules/quality.md` § Rounds and verdicts states when this fires.
|
|
214
221
|
- The subjective and objective lanes are the adversarial pass's FLOOR, not its shape. Where a
|
|
215
222
|
subject has more seams than that pass can attack, fan out one lens per seam over disjoint slices,
|
|
216
223
|
keep every lens blind and
|
|
@@ -523,7 +530,8 @@ right to stop.
|
|
|
523
530
|
is a guess. A claim about a search names the scope the search covered: a search bounded to one
|
|
524
531
|
directory proves something about that directory and nothing about the rest of the tree, and a
|
|
525
532
|
filtered set proves something about the filter's membership rule and nothing about the population
|
|
526
|
-
it was drawn from.
|
|
533
|
+
it was drawn from. Where several artifacts state the fact, check it against the code rather than
|
|
534
|
+
against the other copies: agreement proves one copy was taken from another.
|
|
527
535
|
- Take every measurement under the conditions the unit will run in, or have the unit take it. A
|
|
528
536
|
number measured in your environment and asserted as a criterion is unreachable when the
|
|
529
537
|
executor's sandbox denies what yours permitted, and no edit to the owned files can close it.
|
|
@@ -546,7 +554,10 @@ right to stop.
|
|
|
546
554
|
first criterion the unit cannot close and stops it there, so an unreachable criterion placed ahead
|
|
547
555
|
of a typecheck or a lint criterion skips that gate entirely and the unit ships a defect its own
|
|
548
556
|
brief would have caught. Put the cheap non-timing gates first, and never let a whole-suite result
|
|
549
|
-
gate a scoped one.
|
|
557
|
+
gate a scoped one. Cheap-first has one exception: where the change edits a file the repository
|
|
558
|
+
vendors or otherwise digests, the regeneration step precedes every gate that reads the generated
|
|
559
|
+
artifact. A parity or inventory gate ordered ahead of it cannot pass, because the edit restaled the
|
|
560
|
+
digest that gate reads, and the unit stops on a criterion its own work already satisfied.
|
|
550
561
|
- Ask what the change will do to the facts you just measured. A criterion fixed to a measured set is
|
|
551
562
|
unreachable if the change alters that set, and a file marked off-limits is wrong if the change
|
|
552
563
|
writes to it. Measure the state the unit will finish in, not only the state it starts from.
|
|
@@ -578,6 +589,17 @@ right to stop.
|
|
|
578
589
|
Ask of every criterion: what asserts the state this change ends? Own every answer, or strike the
|
|
579
590
|
criterion. Grant a behaviour and the tests that pin it together; grant a constant and every fixture
|
|
580
591
|
and expectation derived from it together.
|
|
592
|
+
- Find that set by running the suite, not by searching for the assertion's shape. A search returns
|
|
593
|
+
the assertions that look right and cannot say which ones the change actually reaches: a fixture
|
|
594
|
+
that never builds the directory the new code reads is a match the change cannot touch, and a
|
|
595
|
+
fixture that reaches it through a path the search never named is a miss. Both errors appear in one
|
|
596
|
+
grep. Where the change is already written somewhere — a scratch copy, an earlier unit, a probe —
|
|
597
|
+
run the suite against it and read the failures. Where it is not, name the search's bound in the
|
|
598
|
+
brief so the unit re-derives the set instead of trusting it.
|
|
599
|
+
- Scope a unit that changes a mechanism to own the prose describing that mechanism: the comment
|
|
600
|
+
beside the code it edits, and the guide passage stating the behaviour it moves. Where a brief
|
|
601
|
+
scopes that prose out so writers do not share a file, name the carrier that takes it and dispatch
|
|
602
|
+
that carrier before the change ships.
|
|
581
603
|
|
|
582
604
|
### Carry every finding
|
|
583
605
|
|
|
@@ -609,6 +631,11 @@ command that outlives the turn that started it. Every law here binds all of them
|
|
|
609
631
|
- Write a multi-step chain to a script file and run the file. A chain composed inside one shell
|
|
610
632
|
argument cannot be read back, corrected, or re-run, and the record of what actually ran is the
|
|
611
633
|
argument text in a transcript rather than a file on disk.
|
|
634
|
+
- Never edit a script file while a shell is executing it. `bash` reads a script incrementally from a
|
|
635
|
+
byte offset rather than loading it, so an edit that shifts line numbers moves the text under that
|
|
636
|
+
offset and the shell resumes mid-construct. The run dies on a syntax error in a line the script
|
|
637
|
+
does not contain, which reads as a defect in the work rather than as the edit that caused it. Copy
|
|
638
|
+
the file, edit the copy, and launch the copy for the next run.
|
|
612
639
|
- On a Windows host this binds every program-carrying command, not only long ones. Heredocs,
|
|
613
640
|
`node -e`, `node -p`, `&&` chaining, and any argument carrying `${...}` trip the Git Bash
|
|
614
641
|
approval classifier and turn an unattended run into a manual approval prompt. Write the program
|
|
@@ -874,7 +901,12 @@ once per round with one procedure, publish each layer in one window, and only th
|
|
|
874
901
|
so the step-local reading reports nothing moved while the manifest surface did. A re-pinned
|
|
875
902
|
runtime range is published surface: without the bump a consumer installs duplicate copies of the
|
|
876
903
|
moved dependency.
|
|
877
|
-
- A dist built before the version bump is the release artifact
|
|
904
|
+
- A dist built before the version bump is the release artifact wherever the bump edits no emitted
|
|
905
|
+
byte. Check that per package rather than assuming it: a package that imports its own
|
|
906
|
+
`package.json` version into published code emits that version, so its pre-bump dist is stale the
|
|
907
|
+
moment the version moves. Rebuild after the bump there, and pack from the rebuilt tree. Because
|
|
908
|
+
`npm publish --ignore-scripts` skips `prepack`, that rebuild is the operator's step, not the
|
|
909
|
+
publish's.
|
|
878
910
|
- Refresh the registry evidence between layers and derive each round's pins from it. A pin can only
|
|
879
911
|
name a version the registry already serves, so a dependency shipping in the same window keeps the
|
|
880
912
|
resolvable previous pin and takes its dev-only re-pin after the window closes.
|
|
@@ -32,6 +32,10 @@ A round also needs something new to attack. When the previous round's claims all
|
|
|
32
32
|
been added or repaired since, and the only motive is that an auditor could still imagine an attack,
|
|
33
33
|
there is no subject — closing is the correct action and the next subject is the deliverable.
|
|
34
34
|
|
|
35
|
+
When the same class has recurred along one seam to the budget in `.claude/rules/quality.md`
|
|
36
|
+
§ Rounds and verdicts, the next move is that law's strategy switch — the breadth sweep of the
|
|
37
|
+
stream, the ruling, or the dropped moving-target claim — rather than another successor round.
|
|
38
|
+
|
|
35
39
|
## Write the brief
|
|
36
40
|
|
|
37
41
|
The brief is the instrument. A weak brief produces a confirming review no matter which auditor reads
|
|
@@ -36,54 +36,54 @@ so network-controlled descriptions never enter agent instruction context.
|
|
|
36
36
|
|
|
37
37
|
| Package | Version | Layer | Runtime dependencies |
|
|
38
38
|
| ----------------------- | -------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
39
|
-
| `@orkestrel/abort` | `0.0.
|
|
40
|
-
| `@orkestrel/agent` | `0.0.
|
|
41
|
-
| `@orkestrel/brief` | `0.0.
|
|
42
|
-
| `@orkestrel/browser` | `0.0.
|
|
43
|
-
| `@orkestrel/budget` | `0.0.
|
|
44
|
-
| `@orkestrel/console` | `0.0.
|
|
39
|
+
| `@orkestrel/abort` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
40
|
+
| `@orkestrel/agent` | `0.0.17` | L5 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
|
|
41
|
+
| `@orkestrel/brief` | `0.0.4` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/interpret` `^0.0.10`, `@orkestrel/reason` `^0.0.7` |
|
|
42
|
+
| `@orkestrel/browser` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/html` `^0.0.4`, `@orkestrel/websocket` `^0.0.9` |
|
|
43
|
+
| `@orkestrel/budget` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
44
|
+
| `@orkestrel/console` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
|
|
45
45
|
| `@orkestrel/contract` | `0.0.13` | L0 | |
|
|
46
|
-
| `@orkestrel/csv` | `0.0.
|
|
47
|
-
| `@orkestrel/database` | `0.0.
|
|
48
|
-
| `@orkestrel/emitter` | `0.0.
|
|
49
|
-
| `@orkestrel/form` | `0.0.
|
|
50
|
-
| `@orkestrel/guide` | `0.0.
|
|
51
|
-
| `@orkestrel/html` | `0.0.
|
|
52
|
-
| `@orkestrel/indexeddb` | `0.0.
|
|
53
|
-
| `@orkestrel/interpret` | `0.0.
|
|
54
|
-
| `@orkestrel/markdown` | `0.0.
|
|
55
|
-
| `@orkestrel/mcp` | `0.0.
|
|
56
|
-
| `@orkestrel/middleware` | `0.0.
|
|
57
|
-
| `@orkestrel/msg` | `0.0.
|
|
58
|
-
| `@orkestrel/ndjson` | `0.0.
|
|
59
|
-
| `@orkestrel/ollama` | `0.0.
|
|
46
|
+
| `@orkestrel/csv` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
47
|
+
| `@orkestrel/database` | `0.0.12` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/indexeddb` `^0.0.9`, `@orkestrel/sqlite` `^0.0.9` |
|
|
48
|
+
| `@orkestrel/emitter` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
49
|
+
| `@orkestrel/form` | `0.0.3` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
|
|
50
|
+
| `@orkestrel/guide` | `0.0.13` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/markdown` `^0.0.10` |
|
|
51
|
+
| `@orkestrel/html` | `0.0.5` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
52
|
+
| `@orkestrel/indexeddb` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
53
|
+
| `@orkestrel/interpret` | `0.0.11` | L3 | `@orkestrel/reason` `^0.0.8`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/template` `^0.0.5` |
|
|
54
|
+
| `@orkestrel/markdown` | `0.0.10` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/html` `^0.0.5` |
|
|
55
|
+
| `@orkestrel/mcp` | `0.0.21` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/process` `^0.0.6`, `@orkestrel/sse` `^0.0.5`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/websocket` `^0.0.9` |
|
|
56
|
+
| `@orkestrel/middleware` | `0.0.17` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/timeout` `^0.0.7` |
|
|
57
|
+
| `@orkestrel/msg` | `0.0.8` | L0 | |
|
|
58
|
+
| `@orkestrel/ndjson` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
59
|
+
| `@orkestrel/ollama` | `0.0.11` | L6 | `@orkestrel/agent` `^0.0.17`, `@orkestrel/budget` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/ndjson` `^0.0.8`, `@orkestrel/timeout` `^0.0.8`, `@orkestrel/tool` `^0.0.12` |
|
|
60
60
|
| `@orkestrel/pool` | `0.0.8` | L2 | `@orkestrel/emitter` `^0.0.7` |
|
|
61
|
-
| `@orkestrel/probe` | `0.0.
|
|
62
|
-
| `@orkestrel/process` | `0.0.
|
|
63
|
-
| `@orkestrel/program` | `0.0.
|
|
64
|
-
| `@orkestrel/qualifier` | `0.0.
|
|
65
|
-
| `@orkestrel/queue` | `0.0.
|
|
66
|
-
| `@orkestrel/rater` | `0.0.
|
|
67
|
-
| `@orkestrel/reason` | `0.0.
|
|
68
|
-
| `@orkestrel/relation` | `0.0.
|
|
69
|
-
| `@orkestrel/router` | `0.0.
|
|
70
|
-
| `@orkestrel/scaffold` | `0.0.
|
|
71
|
-
| `@orkestrel/sea` | `0.0.
|
|
72
|
-
| `@orkestrel/server` | `0.0.
|
|
73
|
-
| `@orkestrel/sqlite` | `0.0.
|
|
61
|
+
| `@orkestrel/probe` | `0.0.3` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/mcp` `^0.0.21`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7`, `@orkestrel/tool` `^0.0.11` |
|
|
62
|
+
| `@orkestrel/process` | `0.0.6` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
|
|
63
|
+
| `@orkestrel/program` | `0.0.10` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/qualifier` `^0.0.11`, `@orkestrel/rater` `^0.0.11`, `@orkestrel/reason` `^0.0.7` |
|
|
64
|
+
| `@orkestrel/qualifier` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/reason` `^0.0.7` |
|
|
65
|
+
| `@orkestrel/queue` | `0.0.10` | L3 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/timeout` `^0.0.7` |
|
|
66
|
+
| `@orkestrel/rater` | `0.0.12` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/reason` `^0.0.8` |
|
|
67
|
+
| `@orkestrel/reason` | `0.0.8` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
|
|
68
|
+
| `@orkestrel/relation` | `0.0.10` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
|
|
69
|
+
| `@orkestrel/router` | `0.0.11` | L2 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7` |
|
|
70
|
+
| `@orkestrel/scaffold` | `0.0.49` | L3 | `@orkestrel/console` `^0.0.9`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/markdown` `^0.0.9`, `@orkestrel/process` `^0.0.6`, `@orkestrel/template` `^0.0.4` |
|
|
71
|
+
| `@orkestrel/sea` | `0.0.11` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/process` `^0.0.6` |
|
|
72
|
+
| `@orkestrel/server` | `0.0.15` | L3 | `@orkestrel/abort` `^0.0.8`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/router` `^0.0.11`, `@orkestrel/timeout` `^0.0.8` |
|
|
73
|
+
| `@orkestrel/sqlite` | `0.0.9` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
74
74
|
| `@orkestrel/sse` | `0.0.5` | L0 | |
|
|
75
75
|
| `@orkestrel/supervisor` | `0.0.1` | L5 | `@orkestrel/contract` `^0.0.11`, `@orkestrel/database` `^0.0.9`, `@orkestrel/emitter` `^0.0.6`, `@orkestrel/workflow` `^0.0.12` |
|
|
76
|
-
| `@orkestrel/table` | `0.0.
|
|
77
|
-
| `@orkestrel/template` | `0.0.
|
|
78
|
-
| `@orkestrel/terminal` | `0.0.
|
|
79
|
-
| `@orkestrel/test` | `0.0.
|
|
80
|
-
| `@orkestrel/timeout` | `0.0.
|
|
81
|
-
| `@orkestrel/tool` | `0.0.
|
|
82
|
-
| `@orkestrel/toolbox` | `0.0.
|
|
83
|
-
| `@orkestrel/websocket` | `0.0.
|
|
84
|
-
| `@orkestrel/worker` | `0.0.
|
|
85
|
-
| `@orkestrel/workflow` | `0.0.
|
|
86
|
-
| `@orkestrel/workspace` | `0.0.
|
|
76
|
+
| `@orkestrel/table` | `0.0.3` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
|
|
77
|
+
| `@orkestrel/template` | `0.0.5` | L2 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/emitter` `^0.0.8` |
|
|
78
|
+
| `@orkestrel/terminal` | `0.0.12` | L3 | `@orkestrel/console` `^0.0.10`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8`, `@orkestrel/form` `^0.0.3`, `@orkestrel/sse` `^0.0.5` |
|
|
79
|
+
| `@orkestrel/test` | `0.0.11` | L0 | |
|
|
80
|
+
| `@orkestrel/timeout` | `0.0.8` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
81
|
+
| `@orkestrel/tool` | `0.0.12` | L1 | `@orkestrel/contract` `^0.0.13` |
|
|
82
|
+
| `@orkestrel/toolbox` | `0.0.8` | L6 | `@orkestrel/agent` `^0.0.17`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/form` `^0.0.2`, `@orkestrel/relation` `^0.0.9`, `@orkestrel/server` `^0.0.14`, `@orkestrel/terminal` `^0.0.11`, `@orkestrel/tool` `^0.0.11`, `@orkestrel/workflow` `^0.0.14`, `@orkestrel/workspace` `^0.0.5` |
|
|
83
|
+
| `@orkestrel/websocket` | `0.0.10` | L2 | `@orkestrel/emitter` `^0.0.8` |
|
|
84
|
+
| `@orkestrel/worker` | `0.0.9` | L4 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/pool` `^0.0.8`, `@orkestrel/queue` `^0.0.10` |
|
|
85
|
+
| `@orkestrel/workflow` | `0.0.14` | L4 | `@orkestrel/abort` `^0.0.7`, `@orkestrel/budget` `^0.0.7`, `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.11`, `@orkestrel/emitter` `^0.0.7`, `@orkestrel/queue` `^0.0.10`, `@orkestrel/timeout` `^0.0.7` |
|
|
86
|
+
| `@orkestrel/workspace` | `0.0.6` | L3 | `@orkestrel/contract` `^0.0.13`, `@orkestrel/database` `^0.0.12`, `@orkestrel/emitter` `^0.0.8` |
|
|
87
87
|
|
|
88
88
|
<!-- /orkestrel:catalog -->
|
|
89
89
|
|
|
@@ -83,7 +83,10 @@ A review that reads a diff finds what the diff shows. A review that tries to bre
|
|
|
83
83
|
- A fix that adopts the auditor's prescription verbatim may close with a mutation probe in place of a fresh audit round: disable the load-bearing line, watch the adopted pin fail, restore it, and commit the pin as the regression guard. A fix that departs from the prescription gets the cross-engine round.
|
|
84
84
|
- Let reachability bound the fix. A defect reachable through the package's own shipped code or a documented extension seam falsifies its claim and is repaired now.
|
|
85
85
|
- Document the obligation instead when a defect is reachable only through a hypothetical foreign implementation of a contract this package publishes. State it on the interface that owns it and prove the documentation. Do not build coordination machinery against a requirement nobody wrote down. Attacks are unlimited; reachable ones are not, and only the reachable set is a work list.
|
|
86
|
-
- **Three rounds at one seam is the budget.** Repeated rounds against one seam are evidence about the design, not evidence of diligence. At the third round the
|
|
86
|
+
- **Three rounds at one seam is the budget, and reaching it switches the search strategy rather than stopping the work.** Repeated rounds against one seam are evidence about the design, not evidence of diligence. At the third round, name what the audit is trying to accomplish, then pick the successor strategy from what the recurrence shows.
|
|
87
|
+
- Recurrence with a direction — each fix relocates the class along one stream, or the evidence points up a dependency chain — ends the depth search. Run one breadth round that probes the stream's stations in parallel to locate the source, in the shape `.agents/orchestration.md` § Context and decomposition prescribes, then plan the downstream work from the source and size it by the sweep's map.
|
|
88
|
+
- Recurrence with no direction makes the seam itself the question. The next unit is a ruling — on the threat model, the mechanism, or the boundary — taken with the same adversarial pass a design gets, not a fourth repair.
|
|
89
|
+
- A subject that reprices itself on every edit — a count, a census, a total over prose — has no closing condition and is not a seam. Drop the claim, or recast it as the property the tally stood in for.
|
|
87
90
|
- Write the round count down in the capability/defect matrix row that owns the seam, when the seam opens, so it is a fact rather than a feeling. A seam that has consumed more rounds than the rest of the matrix combined has already answered the question.
|
|
88
91
|
- State the ruling that ends a seam as the invariant the code will obey, the constraint bounding it against over-correction, and the interface where a consumer meets the obligation. A ruling that names only the defect it replaces produces the opposite defect next round.
|
|
89
92
|
- Give every behavioural audit the means to run its attacks. An auditor that cannot execute cannot falsify a behavioural claim: it returns derivations, and a derivation reads exactly like a verdict while being a different thing — it will confirm a claim one probe would break. Treat a report with no executed evidence as a review of the source, and label it as such.
|
|
@@ -227,9 +227,13 @@ Import `createScratch` from `@orkestrel/test/server` when a proof needs real fil
|
|
|
227
227
|
```ts
|
|
228
228
|
interface ScratchInterface {
|
|
229
229
|
readonly path: string
|
|
230
|
-
write(target: string, text: string):
|
|
230
|
+
write(target: string, text: string): string
|
|
231
231
|
read(target: string): string | undefined
|
|
232
|
-
|
|
232
|
+
has(target: string): boolean
|
|
233
|
+
names(target?: string): readonly string[]
|
|
234
|
+
ensure(target: string): string
|
|
235
|
+
link(target: string, source: string): string
|
|
236
|
+
remove(target: string): void
|
|
233
237
|
destroy(): void
|
|
234
238
|
}
|
|
235
239
|
```
|