@orkestrel/scaffold 0.0.77 → 0.0.78

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.
Files changed (157) hide show
  1. package/dist/agents/skills/orkestrel-dispatch/scripts/bench.js +204 -0
  2. package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +102 -0
  3. package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +95 -0
  4. package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +207 -0
  5. package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +108 -0
  6. package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +114 -0
  7. package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +108 -0
  8. package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +156 -0
  9. package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +196 -0
  10. package/dist/agents/skills/orkestrel-publish/scripts/compare.js +206 -0
  11. package/dist/agents/skills/orkestrel-publish/scripts/pins.js +93 -0
  12. package/dist/agents/skills/orkestrel-publish/scripts/wave.js +458 -0
  13. package/dist/agents/skills/orkestrel-publish/scripts/window.js +188 -0
  14. package/dist/agents/skills/orkestrel-scout/scripts/map.js +300 -0
  15. package/dist/agents/templates/brief.md +55 -0
  16. package/dist/bin/main.js +4 -2
  17. package/dist/bin/main.js.map +1 -1
  18. package/dist/host/AGENTS.md +77 -135
  19. package/dist/host/agents/orchestration.md +147 -998
  20. package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +2 -2
  21. package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
  22. package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +6 -13
  23. package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/agents/openai.yaml +1 -1
  24. package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/fleet.md +5 -7
  25. package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +11 -22
  26. package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/agents/openai.yaml +1 -1
  27. package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +8 -16
  28. package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
  29. package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +13 -13
  30. package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +61 -0
  31. package/dist/host/agents/skills/orkestrel-dispatch/agents/openai.yaml +4 -0
  32. package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +25 -0
  33. package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +32 -0
  34. package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +259 -0
  35. package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +110 -0
  36. package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +115 -0
  37. package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +239 -0
  38. package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +124 -0
  39. package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +123 -0
  40. package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +129 -0
  41. package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +157 -0
  42. package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +42 -193
  43. package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +38 -108
  44. package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +35 -134
  45. package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +10 -14
  46. package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/agents/openai.yaml +1 -1
  47. package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/hardening.md +3 -4
  48. package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +228 -0
  49. package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +15 -23
  50. package/dist/host/agents/skills/orkestrel-journey/agents/openai.yaml +4 -0
  51. package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/captures.md +1 -1
  52. package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/SKILL.md +25 -33
  53. package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/agents/openai.yaml +1 -1
  54. package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/references/capture-harness.md +3 -3
  55. package/dist/host/agents/skills/orkestrel-publish/SKILL.md +33 -20
  56. package/dist/host/agents/skills/orkestrel-publish/references/release.md +39 -0
  57. package/dist/host/agents/skills/orkestrel-publish/references/wave.md +22 -21
  58. package/dist/host/agents/skills/orkestrel-publish/references/window.md +27 -14
  59. package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +220 -0
  60. package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +114 -0
  61. package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +629 -0
  62. package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +242 -0
  63. package/dist/host/agents/skills/orkestrel-scout/SKILL.md +28 -0
  64. package/dist/host/agents/skills/orkestrel-scout/agents/openai.yaml +4 -0
  65. package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +352 -0
  66. package/dist/host/agents/templates/brief.md +21 -142
  67. package/dist/host/agents/transports/claude-cli.md +21 -0
  68. package/dist/host/agents/transports/codex.md +38 -159
  69. package/dist/host/agents/transports/cursor.md +16 -65
  70. package/dist/host/claude/AGENTS.md +38 -0
  71. package/dist/host/claude/agents/analyst.md +14 -53
  72. package/dist/host/claude/agents/astra.md +26 -0
  73. package/dist/host/claude/agents/builder.md +14 -30
  74. package/dist/host/claude/agents/checker.md +13 -57
  75. package/dist/host/claude/agents/distiller.md +11 -26
  76. package/dist/host/claude/agents/grok.md +12 -35
  77. package/dist/host/claude/agents/opus.md +14 -30
  78. package/dist/host/claude/agents/planner.md +10 -44
  79. package/dist/host/claude/agents/researcher.md +11 -30
  80. package/dist/host/claude/agents/reviewer.md +11 -95
  81. package/dist/host/claude/agents/scout.md +9 -23
  82. package/dist/host/claude/agents/verifier.md +15 -33
  83. package/dist/host/claude/rules/documentation.md +8 -2
  84. package/dist/host/claude/rules/portability.md +7 -1
  85. package/dist/host/claude/rules/quality.md +36 -96
  86. package/dist/host/claude/rules/styles.md +3 -0
  87. package/dist/host/claude/rules/tests.md +6 -3
  88. package/dist/host/claude/rules/workspace.md +19 -15
  89. package/dist/host/claude/rules/writing.md +57 -108
  90. package/dist/host/claude/settings.json +5 -3
  91. package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +1 -1
  92. package/dist/host/claude/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +2 -2
  93. package/dist/host/claude/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +2 -2
  94. package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +11 -0
  95. package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +2 -1
  96. package/dist/host/claude/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +2 -2
  97. package/dist/host/claude/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +2 -2
  98. package/dist/host/claude/skills/orkestrel-polish/SKILL.md +12 -0
  99. package/dist/host/claude/skills/orkestrel-scout/SKILL.md +11 -0
  100. package/dist/host/codex/agents/analyst.toml +14 -31
  101. package/dist/host/codex/agents/astra.toml +25 -0
  102. package/dist/host/codex/agents/builder.toml +13 -20
  103. package/dist/host/codex/agents/checker.toml +13 -27
  104. package/dist/host/codex/agents/distiller.toml +9 -22
  105. package/dist/host/codex/agents/grok.toml +11 -30
  106. package/dist/host/codex/agents/opus.toml +14 -22
  107. package/dist/host/codex/agents/orkestrel.toml +1 -1
  108. package/dist/host/codex/agents/planner.toml +11 -28
  109. package/dist/host/codex/agents/researcher.toml +10 -22
  110. package/dist/host/codex/agents/reviewer.toml +11 -27
  111. package/dist/host/codex/agents/scout.toml +11 -17
  112. package/dist/host/codex/agents/verifier.toml +16 -12
  113. package/dist/host/codex/config.toml +18 -21
  114. package/dist/host/cursor/mcp.json +0 -4
  115. package/dist/host/cursor/rules/orchestration.mdc +12 -20
  116. package/dist/host/dotfiles/mcp.json +0 -4
  117. package/dist/host/dotfiles/oxlintrc.json +7 -0
  118. package/dist/host/guides/probe.md +9 -9
  119. package/dist/host/guides/scaffold.md +117 -71
  120. package/dist/host/guides/test.md +1 -1
  121. package/dist/host/manifest.json +321 -184
  122. package/dist/host/scripts/codex.sh +0 -0
  123. package/dist/host/scripts/cursor.sh +0 -0
  124. package/dist/host/scripts/deps.sh +0 -0
  125. package/dist/host/scripts/ollama.sh +0 -0
  126. package/dist/host/tests/config.test.ts +68 -46
  127. package/dist/host/tests/policy.test.ts +1 -5
  128. package/dist/host/tests/setupPolicy.ts +179 -4
  129. package/dist/src/core/index.cjs +255 -84
  130. package/dist/src/core/index.cjs.map +1 -1
  131. package/dist/src/core/index.d.cts +94 -29
  132. package/dist/src/core/index.d.ts +94 -29
  133. package/dist/src/core/index.js +253 -85
  134. package/dist/src/core/index.js.map +1 -1
  135. package/dist/src/server/index.cjs +55 -9
  136. package/dist/src/server/index.cjs.map +1 -1
  137. package/dist/src/server/index.d.cts +29 -4
  138. package/dist/src/server/index.d.ts +29 -4
  139. package/dist/src/server/index.js +56 -11
  140. package/dist/src/server/index.js.map +1 -1
  141. package/package.json +15 -11
  142. package/dist/host/CLAUDE.md +0 -61
  143. package/dist/host/agents/skills/orkestrel-prove-journey/agents/openai.yaml +0 -4
  144. package/dist/host/agents/transports/claude.md +0 -49
  145. package/dist/host/claude/agents/application.md +0 -36
  146. package/dist/host/claude/agents/sol.md +0 -61
  147. package/dist/host/claude/skills/orkestrel-polish-surface/SKILL.md +0 -12
  148. package/dist/host/codex/agents/application.toml +0 -25
  149. package/dist/host/codex/agents/sol.toml +0 -19
  150. /package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/integration.md +0 -0
  151. /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/centralization.md +0 -0
  152. /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/contract.md +0 -0
  153. /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/research.md +0 -0
  154. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/decide.md +0 -0
  155. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/layer.md +0 -0
  156. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/statechart.md +0 -0
  157. /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/styles.md +0 -0
@@ -0,0 +1,157 @@
1
+ // Campaign artifact sweep. Run from the checkout root with Node's type stripping:
2
+ // node .agents/skills/orkestrel-dispatch/scripts/sweep.ts --report
3
+ // node .agents/skills/orkestrel-dispatch/scripts/sweep.ts --tmp [--older-than MINUTES]
4
+ // node .agents/skills/orkestrel-dispatch/scripts/sweep.ts --unit UNIT [--delete]
5
+ // --report lists leftovers under tmp/ and .orkestrel/ by age and deletes nothing.
6
+ // --tmp deletes launch files older than the threshold (default 60 minutes), removes emptied
7
+ // directories, and refuses while any launch file changed in the last 2 minutes.
8
+ // --unit lists one accepted unit's files under the launch directories (the brief, report, claims,
9
+ // journal, errors, status, pid, and last-message files whose name is UNIT followed by `-` or `.`), and
10
+ // --delete removes them, refusing while one changed in the last 2 minutes.
11
+ // Exit 0 on success, 2 when a deletion is refused, 64 on usage.
12
+ import { existsSync, readdirSync, rmSync } from 'node:fs'
13
+ import { basename, join } from 'node:path'
14
+ import { listFiles, readMissingFlags, readOption } from './helpers.ts'
15
+
16
+ const LAUNCH_DIRECTORIES = [
17
+ 'tmp/units',
18
+ 'tmp/cursor',
19
+ 'tmp/codex',
20
+ 'tmp/claude',
21
+ 'tmp/probes',
22
+ 'tmp/type',
23
+ 'tmp/captures',
24
+ ]
25
+ const RECENT_MS = 2 * 60_000
26
+
27
+ // A launch directory holds nothing a walk skips, so every file beneath it counts.
28
+ const NOTHING_SKIPPED: ReadonlySet<string> = new Set()
29
+
30
+ function formatDay(modified: number): string {
31
+ return new Date(modified).toISOString().slice(0, 10)
32
+ }
33
+
34
+ function reportDirectory(directory: string): string | undefined {
35
+ if (!existsSync(directory)) return undefined
36
+ const files = listFiles(directory, NOTHING_SKIPPED)
37
+ if (files.length === 0) return undefined
38
+ const oldest = files.reduce((low, file) => Math.min(low, file.modified), Number.POSITIVE_INFINITY)
39
+ return `sweep: ${directory} holds ${files.length} file(s), oldest ${formatDay(oldest)}`
40
+ }
41
+
42
+ function listCampaignDirectories(): readonly string[] {
43
+ if (!existsSync('.orkestrel')) return []
44
+ return readdirSync('.orkestrel', { withFileTypes: true })
45
+ .filter((entry) => entry.isDirectory())
46
+ .map((entry) => join('.orkestrel', entry.name))
47
+ }
48
+
49
+ function reportCampaignFiles(): string | undefined {
50
+ if (!existsSync('.orkestrel')) return undefined
51
+ const files = readdirSync('.orkestrel', { withFileTypes: true }).filter((entry) => entry.isFile())
52
+ if (files.length === 0) return undefined
53
+ return `sweep: .orkestrel holds ${files.length} ecosystem file(s): ${files.map((entry) => entry.name).join(', ')}`
54
+ }
55
+
56
+ function removeEmptyDirectories(directory: string): void {
57
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
58
+ if (!entry.isDirectory()) continue
59
+ const path = join(directory, entry.name)
60
+ removeEmptyDirectories(path)
61
+ if (readdirSync(path).length === 0) rmSync(path, { recursive: true })
62
+ }
63
+ }
64
+
65
+ function readThreshold(argv: readonly string[]): number | undefined {
66
+ if (!argv.includes('--older-than')) return 60
67
+ const value = Number(readOption(argv, '--older-than'))
68
+ return Number.isFinite(value) && value > 0 ? value : undefined
69
+ }
70
+
71
+ function runReport(): number {
72
+ for (const directory of [...LAUNCH_DIRECTORIES, ...listCampaignDirectories()]) {
73
+ const line = reportDirectory(directory)
74
+ if (line !== undefined) console.log(line)
75
+ }
76
+ const files = reportCampaignFiles()
77
+ if (files !== undefined) console.log(files)
78
+ return 0
79
+ }
80
+
81
+ function runSweep(thresholdMinutes: number): number {
82
+ const now = Date.now()
83
+ const present = LAUNCH_DIRECTORIES.filter((directory) => existsSync(directory))
84
+ const files = present.flatMap((directory) => listFiles(directory, NOTHING_SKIPPED))
85
+ if (files.some((file) => now - file.modified < RECENT_MS)) {
86
+ console.error('sweep: a launch file changed within the last 2 minutes; refusing to delete')
87
+ return 2
88
+ }
89
+ const cutoff = now - thresholdMinutes * 60_000
90
+ for (const file of files) {
91
+ if (file.modified > cutoff) continue
92
+ rmSync(file.path, { force: true })
93
+ console.log(`sweep: deleted ${file.path}`)
94
+ }
95
+ for (const directory of present) removeEmptyDirectories(directory)
96
+ return 0
97
+ }
98
+
99
+ function listUnitFiles(unit: string): ReadonlyArray<{ path: string; modified: number }> {
100
+ return LAUNCH_DIRECTORIES.filter((directory) => existsSync(directory))
101
+ .flatMap((directory) => listFiles(directory, NOTHING_SKIPPED))
102
+ .filter((file) => {
103
+ const name = basename(file.path)
104
+ return name.startsWith(unit) && /^[-.]/u.test(name.slice(unit.length))
105
+ })
106
+ }
107
+
108
+ function runUnit(unit: string | undefined, remove: boolean): number {
109
+ if (unit === undefined || !/^[A-Za-z0-9._][A-Za-z0-9._-]*$/u.test(unit)) {
110
+ console.error('usage: sweep.ts --unit UNIT [--delete]')
111
+ return 64
112
+ }
113
+ const files = listUnitFiles(unit)
114
+ if (remove && files.some((file) => Date.now() - file.modified < RECENT_MS)) {
115
+ console.error(`sweep: a file of ${unit} changed within the last 2 minutes; refusing to delete`)
116
+ return 2
117
+ }
118
+ for (const file of files) {
119
+ if (remove) rmSync(file.path, { force: true })
120
+ console.log(`sweep: ${remove ? 'deleted' : 'found'} ${file.path}`)
121
+ }
122
+ console.log(`sweep: ${files.length} file(s) for ${unit}`)
123
+ return 0
124
+ }
125
+
126
+ function main(argv: readonly string[]): number {
127
+ if (!existsSync('.git')) {
128
+ console.error('sweep: run from the repository root')
129
+ return 64
130
+ }
131
+ const missing = readMissingFlags(argv, ['--unit', '--older-than'])
132
+ if (missing.length > 0) {
133
+ console.error(`sweep: ${missing.join(', ')} given with no value`)
134
+ return 64
135
+ }
136
+ const modes = ['--report', '--tmp', '--unit'].filter((flag) => argv.includes(flag))
137
+ if (modes.length > 1) {
138
+ console.error(
139
+ 'usage: sweep.ts names one mode: --report | --tmp [--older-than MINUTES] | --unit UNIT [--delete]',
140
+ )
141
+ return 64
142
+ }
143
+ if (argv.includes('--tmp')) {
144
+ const threshold = readThreshold(argv)
145
+ if (threshold === undefined) {
146
+ console.error('usage: sweep.ts --tmp [--older-than MINUTES]; MINUTES is a positive number')
147
+ return 64
148
+ }
149
+ return runSweep(threshold)
150
+ }
151
+ if (argv.includes('--unit')) return runUnit(readOption(argv, '--unit'), argv.includes('--delete'))
152
+ if (argv.length === 0 || argv.includes('--report')) return runReport()
153
+ console.error('usage: sweep.ts --report | --tmp [--older-than MINUTES] | --unit UNIT [--delete]')
154
+ return 64
155
+ }
156
+
157
+ process.exitCode = main(process.argv.slice(2))
@@ -1,218 +1,67 @@
1
1
  ---
2
2
  name: orkestrel-falsify
3
- description: Run an adversarial audit round against work that already looks finished — write the subject as numbered falsifiable claims, dispatch independent auditors instructed to break them rather than confirm them, reconcile their evidence, and rule. Use before accepting a fix round, before a version bump or publication, when green gates are the only evidence a change works, when a defect has recurred across rounds, or whenever a review would otherwise read a diff and agree with it.
3
+ description: >-
4
+ Run one adversarial audit round against finished work: write the subject as numbered falsifiable claims, dispatch independent auditors instructed to break them, reconcile their evidence, and rule. Use when the size gate in `.agents/orchestration.md` names a review, before a fix round is accepted, before a version bump or publication, or when a defect has recurred across rounds. Do not use it for a small change, a mechanical rename, or a round with no added or repaired claim to attack.
4
5
  ---
5
6
 
6
7
  # Falsify
7
8
 
8
- Green gates prove a suite ran. They prove nothing about the claim the work makes. This skill is for
9
- the moment when everything passes and the work is still not known to be right.
9
+ One round. It ends with a ruling, and a second round needs an added or repaired claim.
10
10
 
11
- ## Load authority
11
+ ## Run a round only when
12
12
 
13
- 1. `AGENTS.md`.
14
- 2. `.claude/rules/quality.md`, especially **Falsification** — the laws governing auditor behaviour.
15
- This skill prescribes the round; that section prescribes the conduct inside it. Do not restate it.
16
- 3. The governing guide/spec for the subject.
17
- 4. `references/brief.md` before writing a brief; `references/reconcile.md` before ruling.
18
-
19
- ## When a round is warranted
20
-
21
- Run one when the work is finished and the evidence is weak in a specific way:
22
-
23
- - gates are green and nothing has attacked the claim;
24
- - a fix round is about to be accepted, especially one whose author reported success;
13
+ - the size gate names a review (medium: one pass; large: one round on the integrated result);
14
+ - a fix round is about to be accepted and the fix departed from the reviewer's prescription;
25
15
  - a version is about to be bumped, packed, or published;
26
- - the same defect class has now appeared in more than one round;
27
- - a self-declared "sound, unchanged, no fix needed" verdict is load-bearing.
28
-
29
- Do not run one for a typo, a mechanical rename, or work whose failure would be immediately visible.
30
-
31
- A round also needs something new to attack. When the previous round's claims all held, nothing has
32
- been added or repaired since, and the only motive is that an auditor could still imagine an attack,
33
- there is no subject — closing is the correct action and the next subject is the deliverable.
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
-
39
- ## Write the brief
40
-
41
- The brief is the instrument. A weak brief produces a confirming review no matter which auditor reads
42
- it. Follow `references/brief.md`. What this skill adds beyond the conduct law:
43
-
44
- - Every re-run is a **successor**, not a restatement. It carries what the previous round closed so
45
- nothing is re-reported, and it adds claims that attack **the previous round's own rulings**.
46
- - The brief names what the round **decides**. An auditor that does not know the stakes calibrates to
47
- politeness.
48
- - Unknowns are named as unknowns, with how the auditor reports back on them.
49
-
50
- The claim form itself is the Falsification law's — read it there. The **verdict shape** in
51
- § "Verdict shape" is this skill's, because `.agents/orchestration.md` assigns it here; everything
52
- else about auditor conduct is the law's.
53
-
54
- ## Evidence, by subject type
55
-
56
- The brief supplies the evidence its subject actually has. Requiring a diff for a subject that has no
57
- diff is a rule the brief cannot satisfy.
58
-
59
- | subject | required evidence |
60
- | --------------------------------------- | ------------------------------------------------------------------------------------- |
61
- | a code change | the actual diff and the actual status output; omitting either is a dispatch deviation |
62
- | a rendered or externally driven surface | the capture portfolio as primary, source as corroboration |
63
- | a policy, design, or process proposal | the proposal, the canon it must satisfy, and the record of what motivated it |
64
-
65
- **A subject can occupy more than one row; supply every row it occupies.** A ruling whose fixes
66
- already landed as edits is both a proposal and a code change, and withholding the diff on the grounds
67
- that the subject is "a proposal" leaves the auditor unable to check whether a fix changed anything
68
- nobody claimed.
69
-
70
- ## Run the round
71
-
72
- - **Verify every authority the brief references exists in the tree the auditor is rooted in.** A
73
- brief that points at a rule file, section, or guide the executor cannot find delivers nothing while
74
- looking like authority — and it fails silently, because an auditor does not report a heading it
75
- never saw. Check before dispatch; propagate the missing file rather than restating its contents in
76
- the brief. This is the reason restatement felt necessary, and it is the wrong cure. Where the
77
- executor's tree carries a superseded vendored copy of an authority, take the stale-authority
78
- branch in `references/brief.md` § "What not to put in a brief".
79
- - Run the **adversarial pass** on one identical brief: a subjective lane and an objective
80
- lane, each a fresh subagent with a clean context, blind to each other. Reconcile them yourself.
81
- `.agents/orchestration.md` owns lane definitions, engine assignment, and what happens when an
82
- engine is dark; do not restate them here.
83
- - `.agents/orchestration.md` § Execution loop owns which lanes a round runs and the deviation a
84
- short round records; § Engine assignment owns the substitution.
85
- - **Pair every finder with an independent refuter when the round fans out past the subjective and
86
- objective lanes.** The
87
- refuter receives one slice's findings, never that finder's work, and is briefed to BREAK them
88
- rather than to re-audit the subject. It reproduces each stated vector itself and defaults to
89
- refuted when uncertain.
90
- - Refute on any of these grounds, and name which: the vector does not reproduce; the behaviour is
91
- correct and documented; it is unreachable through the public API or a documented seam; it asks
92
- for new capability rather than naming a defect; it restates a finding an earlier round
93
- repaired; or its diagnosis is wrong — then CONFIRM with the correction.
94
- - Only a survivor earns a fix unit. An unrefuted finding is a hypothesis. The scope grounds,
95
- unreachable and new capability, are what keep a round from drifting into a redesign.
96
- - **Give every auditor the means to run its attacks.** A lens that can only read returns derivations,
97
- and a derivation reads exactly like a verdict — it will confirm a claim that one probe would break.
98
- - **Tell each auditor exactly where a probe may live, and verify that place works before you say it.**
99
- A test runner resolves only what its own configuration includes: a probe written outside every
100
- configured project is not discovered at all, and the run reports no test files rather than a result.
101
- Where the repository provides a probe project, use it and name that project in the brief;
102
- `.claude/rules/tests.md` governs what may live there. Where it does not, the reliable form is a file
103
- inside the canonical mirrored suite, run by explicit path. Either way the probe is deleted before the
104
- auditor returns, and promoted into a permanent test when it proves something worth keeping. Give each
105
- concurrent auditor a distinct filename that already satisfies the repository's test naming
106
- convention; never invent a prefix to dodge collisions, and never let two auditors claim one path. A
107
- probe left in the mirrored suite is discovered and fails a run nobody else caused.
108
- - **Run auditors concurrently only when their writes cannot collide.** A lens that can execute
109
- still writes probes; give each a distinct path and forbid whole-project runs, or serialize the
110
- round. **This binds
111
- the orchestrator too:** a tree-wide gate run while a round is live sees the auditors' in-flight probes
112
- and reports a failure nobody caused. Wait for the round, or scope the command to paths no auditor
113
- owns. Never delete another executor's working file to make your own command pass.
114
- - **Tell a lane when its own engine wrote the half it is auditing, and tell it to attack that half
115
- harder.** A fix round reviewed by the engine that wrote it is the case the round exists to avoid,
116
- and where the pass cannot avoid it, naming it is what recovers the round. A clean pass on its own
117
- engine's work is the least valuable result a lane can return.
118
- - Supply the evidence the subject type requires, per § "Evidence, by subject type".
119
- - Auditors edit no source and spawn nothing. Read-only describes the SUBJECT, never the lane's
120
- tools.
121
- - **Derive a lane's executable actions from its tool allowlist and its sandbox, and read both before
122
- writing its brief.** A lane with no write tool cannot create a probe; a lane with no shell runs
123
- none; a read-only filesystem does not forbid a nonmutating command. Naming an action the lane
124
- cannot take stops the unit on arrival over a detail the allowlist and the sandbox already settled.
125
- - Where an attack needs a tool the lane lacks or a write its sandbox refuses, run the probe
126
- yourself, record its control and its output, and supply that record as the lane's evidence before
127
- ruling on the claim. The Orchestrator produces, the lane rules. Never widen a lane's tools to fit
128
- a brief.
129
- - Blind reports are **immutable**. Nothing an auditor returns is edited, merged, or revised — by
130
- anyone, including the auditor — once it has been returned.
16
+ - the same defect class appeared in more than one round.
131
17
 
132
- ## Verdict shape
18
+ Do not run one for a small change, a rename, or work whose failure the touched test already shows. Do not re-run a round whose claims all held when nothing was added or repaired since. A fix that adopted the prescription verbatim closes with a mutation probe instead of a round.
133
19
 
134
- Every auditor in every round returns exactly this, and nothing else. One shape makes rounds
135
- comparable; a round that invents its own cannot be read against the last one.
20
+ ## Write the claims
136
21
 
137
- 1. **Numbered verdicts**, one per claim, in the brief's order. Exactly one of these values:
22
+ Write `tmp/units/<unit>-claims.md` and point every lane at it. Read `references/brief.md` for the claim form.
138
23
 
139
- | value | meaning | evidence |
140
- | --------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
141
- | `CONFIRMED` | attacked and it held | as the Falsification law requires |
142
- | `BROKEN` | falsified | as the Falsification law requires — note it says _input, **state, or interleaving**_, so a concurrency claim is falsified by an interleaving, not by an input |
143
- | `UNRESOLVED` | cannot be decided from the evidence available | what would settle it; a claim whose only evidence is the writer's own report takes this value |
144
- | `NOT-EVIDENCED` | a claim about a rendered or externally driven surface the supplied capture cannot show | which capture is missing |
24
+ - State the subject as numbered falsifiable claims: properties a concrete input, state, or interleaving could show false. Never "review this diff".
25
+ - Derive claims from adverse conditions: cancellation, restart, concurrency, partial failure, hostile input, resource exhaustion, orderings the happy path never reaches.
26
+ - Limit claims to the public contract and the risky seams. A claim about a comment or a name is not a claim.
27
+ - Supply the evidence the subject type requires: a code change carries the actual diff and `git status --porcelain`; a rendered surface carries its capture portfolio with source as corroboration; a proposal carries the proposal, the canon it must satisfy, and its motivation.
28
+ - Name where a lane may run a probe (`tmp/probes/` through the `probe` project) and that it deletes the probe before returning.
29
+ - Name the stakes: what this round decides.
30
+ - A successor brief carries what the previous round closed and adds claims against that round's rulings.
145
31
 
146
- `CONFIRMED` and `BROKEN` defer; only `UNRESOLVED` and `NOT-EVIDENCED` are this skill's, because
147
- the law does not name them. `BROKEN` and `UNRESOLVED` are **separate**: a claim nobody could
148
- decide has not been falsified, and it cannot supply the fields falsification requires.
149
- `NOT-EVIDENCED` is the auditing lanes' own token; it is kept, not re-invented.
32
+ ## Dispatch the lanes
150
33
 
151
- 2. **Findings fitting no claim**, if any, each substantiated to the same standard as `BROKEN`.
34
+ - Medium: one lane, on an engine that did not write the work (`reviewer` for Astra-written work, `analyst` for Opus-written work). Large: the objective lane and the subjective lane, same claims file, each in a clean context, neither shown the other's answer before reconciliation. Add `checker` when criteria are mechanical.
35
+ - Tell a lane when its own engine wrote the half it audits.
36
+ - Give a lane the evidence a read-only allowlist cannot produce: run the probe yourself, record its control and output, and hand it over.
37
+ - Auditors edit no source and spawn nothing. Their reports are immutable after they return.
152
38
 
153
- 3. **Attacked and held**: the claims this round attacked and could not break, each with the attack
154
- that failed, and the adjacent behaviour that looks like the defect and is correct. This is where
155
- the next round reads what has already been tried, so a claim listed here without its attack is
156
- worth nothing to it. A claim's own `CONFIRMED` line already carries the evidence that convinced
157
- the auditor, so list here only the attacks no verdict line carries and the adjacent behaviour.
39
+ ## Verdict shape
40
+
41
+ Every lane returns exactly this:
158
42
 
159
- 4. **One terminal line**, and only one:
43
+ 1. Numbered verdicts in claim order, one value each: `CONFIRMED` (attacked and held, with the attack), `BROKEN` (the failing input, state, or interleaving plus the smallest correct fix), `UNRESOLVED` (what would settle it; a claim whose only evidence is the writer's report), `NOT-EVIDENCED` (the capture that is missing).
44
+ 2. Findings outside the claims, each substantiated to the `BROKEN` standard.
45
+ 3. Attacked and held: attacks no verdict line carries, and the adjacent behavior that looks like the defect and is correct.
46
+ 4. One terminal line: `VERDICT: PASS` or `VERDICT: FAIL <claim numbers>; outside the claims: <finding ids or none>`. `PASS` needs every claim `CONFIRMED` and no substantiated outside finding.
160
47
 
161
- ```text
162
- VERDICT: PASS
163
- VERDICT: FAIL <claim numbers>; outside the claims: <finding ids>
164
- ```
48
+ Before confirming a claim about a proof, the lane names the mutation that would make the proof fail and states whether the assertions distinguish it. No process diary.
165
49
 
166
- The claim numbers are every claim that is not `CONFIRMED`. Write `none` in a slot the round
167
- leaves empty, so a `FAIL` driven only by a finding outside the claims still names both.
50
+ ## Reconcile and rule
168
51
 
169
- **`PASS` requires all of this**: every claim `CONFIRMED`, nothing `UNRESOLVED`, nothing
170
- `NOT-EVIDENCED`, and no substantiated finding outside the claims. A single substantiated finding
171
- forces `FAIL` however the numbered claims landed — otherwise a round can report a real
172
- defect and still emit the word that authorises the release.
52
+ Read `references/reconcile.md`.
173
53
 
174
- No process diary. No summary of what was read.
54
+ - Reproduce every `BROKEN` and every outside finding yourself before acting on it.
55
+ - Run `node .agents/skills/orkestrel-dispatch/scripts/cite.ts <verdict>` and discard a verdict whose citation does not resolve, then sample that lane's other citations.
56
+ - Treat lane disagreement as answers to different questions; find each question.
57
+ - Drop, on the record, any finding no lane substantiates.
58
+ - Bound every accepted finding: what is not broken and what over-correcting would break. Put each bound in the fix brief.
59
+ - An all-confirmed round puts the claims on trial: if none could have been falsified by evidence the round had, sharpen them for one successor round; if they could have been, the pass stands and the audit ends.
175
60
 
176
- ## When a round comes back all-confirmed
61
+ ## Write the verdict
177
62
 
178
- The Falsification law governs this: the brief goes on trial, not the subject. Apply it, and if the
179
- claims turn out to have been descriptive, the successor brief is where the sharper ones go.
63
+ Write `.orkestrel/<package>/<unit>-audit-verdict.md` with the lanes that ran, their engines, the per-claim rulings, the findings carried into fix units, and any lane the round did not run with the reason. Delete the claims file and the verdict when the seam closes.
180
64
 
181
- ## Reconcile and rule
65
+ ## After three rounds at one seam
182
66
 
183
- Follow `references/reconcile.md`. The obligations that are not delegable:
184
-
185
- - **Reproduce every sharp finding yourself** before acting on it. An auditor's finding is a
186
- hypothesis until the orchestrator has run it.
187
- - **Build before you pack.** `npm pack` runs no build, so it ships whatever `dist/` is on disk. An
188
- auditor who packs an artifact to inspect it is reading the last build, not the current source, and
189
- will report deleted exports as still shipping. Run the package's build first, and say in the brief
190
- that the tarball was built from the commit under audit.
191
- - **Check the subject before acting on a finding, not only the reasoning.** A brief that names attack
192
- vectors teaches the lane those vectors matter, and a lane can hand back the brief's own questions as
193
- the subject's claims — demanding coverage for a property the subject never documented. Grep the
194
- subject for the claim the finding rests on. Where it is not there, the finding is against the brief.
195
- - **A disagreement between auditors is rarely a tie to average.** It is usually correct answers
196
- to different questions. Find the question each one answered.
197
- - **Bound every finding**: state what is _not_ broken, and why the adjacent behaviour that looks the
198
- same is correct. An audit that reports everything is as useless as one that reports nothing.
199
- - **Bound the fix before briefing it.** Establish what over-correcting would break, and include that
200
- in the fix brief as a constraint.
201
- - Drop, on the record, any finding neither auditor can substantiate.
202
-
203
- ## Accept, or run it again
204
-
205
- The threshold is **a `PASS` terminal line on a brief whose claims cover what the subject owns** —
206
- every numbered claim `CONFIRMED` on evidence, nothing `UNRESOLVED`, nothing `NOT-EVIDENCED`, no
207
- substantiated finding beside them. Never green gates, which prove only that a suite ran.
208
-
209
- A round that finds something is a success, not a delay. The alternative is a consumer finding it
210
- after publication, when the version number is already spent. But an unsubstantiated attack is not a
211
- finding, and the supply of imaginable ones never runs out: a round is not re-run because an auditor
212
- can still think of one. A substantiated finding against something no claim names is real and forces
213
- `FAIL`; an unsubstantiated one is a claim for the successor brief. The escalation law in
214
- `.claude/rules/quality.md` governs a subject that keeps producing findings at the same seam — after
215
- enough of them the ruling owed is on the design, not on the next defect.
216
-
217
- When a fix round follows, its auditor must be an engine that did not write it, and the next round's
218
- brief is the successor of this one.
67
+ Stop the depth search. Name what the audit is for, dispatch one blind lens per station of the stream the defect moves along, locate the source, and plan from the source. A subject that reprices on every edit (a count, a census) is not a seam; drop the claim.
@@ -1,124 +1,54 @@
1
1
  # Writing the claims brief
2
2
 
3
- The brief decides the round. An auditor reads it faithfully, so a claim too vague to attack
4
- returns a confirmation that proves nothing. Write every claim sharply enough to be broken.
3
+ Write every claim sharply enough to be broken. A claim too vague to attack returns a confirmation that proves nothing.
5
4
 
6
- ## Anatomy
5
+ ## Rows
7
6
 
8
- **Subject.** The whole chain, not the last commit. A fix round's defect usually lives in what an
9
- earlier round assumed, so an audit scoped to the newest diff cannot see it. State the tip, the
10
- branch, and the chain of rounds with one line each on what each claimed to close.
7
+ Give every claims brief these rows.
11
8
 
12
- **What the round decides.** Say it plainly — "this decides whether the package is bumped and
13
- consumed downstream", "this decides whether the fix is accepted". An auditor that does not know the
14
- stakes calibrates to politeness, and politeness confirms.
9
+ - **Subject.** The whole chain, not the last commit: the tip, the branch, and one line per prior round on what it claimed to close.
10
+ - **What the round decides.** One sentence, such as "this decides whether the package is bumped and consumed downstream" or "this decides whether the fix is accepted".
11
+ - **Already established.** What the Orchestrator verified directly, so no lane re-derives it or re-reports it. State that the Orchestrator verified each item itself.
12
+ - **Review evidence.** The actual diff and the actual `git status --porcelain` output, by path. For a rendered or externally driven surface, the capture; source is corroboration.
13
+ - **Numbered falsifiable claims.** Written to `tmp/units/<unit>-claims.md`, one file both lanes read. Each claim names a property a concrete input, state, or interleaving could show false. Assign a primary lane where the lanes differ in strength; no lane skips a claim. The claim set is the round's scope: cover what the subject owns, then hold it closed. An attack against something no claim names enters the verdict only when substantiated to the `BROKEN` standard; otherwise it is a claim for the successor brief.
14
+ - **Unknowns.** What the Orchestrator does not know that the round needs, and how the lane reports on it.
15
+ - **The threshold.** State that a finding is worth more than a clean pass: the alternative is a consumer finding it after publication.
15
16
 
16
- **Already established — do not re-run.** List what the orchestrator has already verified, so effort
17
- goes somewhere new and settled findings are not re-reported as fresh. State that these were verified
18
- by the orchestrator directly rather than taken from a writer's report; an auditor that suspects the
19
- established list is hearsay will re-derive all of it.
17
+ ## The lane's brief
20
18
 
21
- **Review evidence.** The actual diff and the actual status output, by path. Omitting either is a
22
- dispatch deviation. For any claim about a rendered or externally driven surface, the capture is the
23
- evidence and source is corroboration.
19
+ - Give a lane every row of § Rows plus **Role and lane** (the role, its engine, which lane it holds) and **Output** (the verdict shape and its single terminal line from `SKILL.md` § Verdict shape).
20
+ - Omit the writer rows: owned, shared, and off-limits files; acceptance criteria stated as gate commands. Keep the sentence that the lane performs the assignment itself and spawns nothing.
21
+ - Never hand a lane with no shell a gate criterion; it can only rule on the writer's report.
24
22
 
25
- **Numbered falsifiable claims.** Write them to one file both lanes are pointed at,
26
- `tmp/audit/<unit>-audit-claims.md`, retained beside the round's verdict. One file is what makes
27
- "both lanes ran the same brief" checkable after the round, and each lane's own brief then carries
28
- only its role, its lane, its evidence slice, and its output shape. Each claim is a property some
29
- concrete input, state, or interleaving could show false. Assign the primary lane where auditors
30
- differ in strength, but do not let an auditor skip a claim because it assumes the other covers it
31
- better. The claim set is the round's
32
- scope: write it to cover what the subject owns, then hold it closed. An attack the round invents
33
- against something no claim names enters the verdict only when it is substantiated to the `BROKEN`
34
- standard; otherwise it is a claim for the successor brief, not a finding.
23
+ ## The successor brief
35
24
 
36
- **Unknowns, named as unknowns.** What the orchestrator does not know that the round needs, and how
37
- the auditor reports back on it. A brief that cannot be fully specified says so; the alternative is
38
- an executor inventing an answer and building on it silently.
25
+ A re-run takes a successor brief named per `.agents/orchestration.md` § Dispatch. It never restates the round from scratch and never edits the brief that ran.
39
26
 
40
- **The threshold.** State that a finding is worth more than a clean pass, and why: the alternative is
41
- a consumer finding it after publication, when the version is already spent.
27
+ - Add the successor round to the chain table.
28
+ - Move the closed findings into "already established".
29
+ - State what changed in the brief itself.
30
+ - Add a claim for each ruling the previous round made: an input refused rather than carried, a widening called deliberate, a site called sound and unchanged. Attack those first.
42
31
 
43
- ## The audit lane's brief
32
+ ## Claims that find defects
44
33
 
45
- An audit lane changes no source, so its brief carries fewer rows than a writing unit's. `SKILL.md`
46
- § "Run the round" fixes what a lane can execute; read it there before deciding which rows a lane
47
- can use. Give a lane every row § Anatomy names — the subject with the evidence
48
- § "Evidence, by subject type" requires of each row it occupies, what the round decides, already
49
- established, the numbered falsifiable claims, the unknowns, and the threshold — plus its own
50
- **Role and lane** row (the role, its engine, and which lane it holds) and **Output** row (the
51
- verdict shape and its single terminal line). Review evidence folds into the subject.
34
+ - "The containment has no remaining door." Require the lane to enumerate the surface itself, never a registry, table, or sweep the writer produced.
35
+ - "No refusal was widened into a regression." Require the broken legitimate caller pattern to be named.
36
+ - "The instruments bind." Attack the instrument's rule: name a change it would not catch.
37
+ - "No instrument is vacuous." Require a control that cannot produce its failing verdict; name a tautology a previous round shipped.
38
+ - "The guide is true." Ask whether a false universal was replaced by an unfalsifiable one.
39
+ - "The package is coherent as a whole. Would you ship this?"
40
+ - "The self-declared sound-and-unchanged verdicts are sound." Require the lane to attack the ones it judges most likely wrong.
52
41
 
53
- Omit the rows a writer needs and a lane cannot use: owned, shared, and off-limits files; the
54
- Execution line's writer form, keeping the sentence that the lane performs the assignment directly
55
- and spawns nothing; and acceptance criteria stated as gate commands. A lane that holds no shell
56
- cannot close a gate criterion, so a brief handing it one is asking for a ruling on the writer's
57
- report.
42
+ ## Sentences that change lane behavior
58
43
 
59
- ## The successor rule
44
+ - "CONFIRMED requires naming the attack you tried that failed."
45
+ - "A claim you cannot decide is UNRESOLVED, not CONFIRMED; say what would settle it."
46
+ - "Assume this chain has one more." Name the prior rounds and the defect a previous round believed closed.
47
+ - "Do not hedge toward an imagined consensus."
48
+ - Never write "an audit returning only confirmations has not tried"; a lane that manufactures a finding to satisfy the brief costs a fix unit and the credibility of the true findings beside it. Test the adequacy of an all-confirmed round afterwards, against the brief.
60
49
 
61
- A re-run takes a **successor brief** that carries the previous round forward. It never restates the
62
- round from scratch and never edits the brief that already ran; `.agents/orchestration.md`
63
- § "Every dispatch is a file before it is a launch" fixes the successor's name and its retention.
64
- Rewriting a brief from scratch loses the shape of what has already been attacked, and the round
65
- re-derives it at full cost.
50
+ ## Keep out of a brief
66
51
 
67
- A successor brief:
68
-
69
- - **carries the chain forward** with the new round added to the table;
70
- - **moves the closed findings into "already established"** so they are not re-reported;
71
- - **states what changed in the brief itself**, so a reader can see which claims are new;
72
- - **adds claims that attack the previous round's own rulings.**
73
-
74
- Attack the previous round's rulings first. A fix round makes _decisions_ — that some input is
75
- refused rather than carried, that some widening is deliberate, that some site is sound and needs no
76
- change. Those rulings are the freshest and least-examined surface in the package, and the engine
77
- that made them is least able to see their consequences. Write a claim for each one. Expect a
78
- repair to carry the next defect; a round that finds them is converging, not failing.
79
-
80
- ## Claims that repeatedly find things
81
-
82
- - **"The containment has no remaining door."** Require the auditor to enumerate the surface itself
83
- rather than trust any registry, table, or sweep the writer produced.
84
- - **"No refusal was widened into a regression."** Every hardening round risks over-correcting. Ask
85
- which legitimate caller pattern broke, and require it to be named.
86
- - **"The instruments bind."** Attack the instrument's _rule_, not its output: name a change it would
87
- not catch. An instrument nobody has tried to evade is not evidence.
88
- - **"No instrument is vacuous."** Ask for a control that cannot produce its failing verdict. If a
89
- previous round shipped one, say so and name it — a round told a tautology already shipped here
90
- looks harder than one told to check generally.
91
- - **"The guide is true."** Not plausible — true. Ask specifically whether a false universal has been
92
- replaced by an **unfalsifiable** one, which is worse, because it reads as rigour.
93
- - **"The package is coherent as a whole. Would you ship this?"** The only claim that catches
94
- accumulated damage no single diff shows.
95
- - **"The self-declared sound-and-unchanged verdicts are sound."** A writer's table saying a site
96
- needed no change is a claim like any other, made by the party least able to test it. Require the
97
- auditor to pick the ones it considers most likely wrong and actually attack them.
98
-
99
- ## Instructions that change auditor behaviour
100
-
101
- - _"CONFIRMED requires naming the attack you tried that failed."_ — the single most effective
102
- sentence, because it converts a confirmation from an opinion into a report of work done.
103
- - _"A claim you cannot decide is UNRESOLVED, not CONFIRMED — say what would settle it."_
104
- - _"Assume this chain has one more."_ — naming the prior rounds and which of them a defect the
105
- previous round believed closed provoked.
106
- - _"Do not hedge toward an imagined consensus."_ — when auditors run blind, each will otherwise
107
- soften toward what it guesses the other said.
108
-
109
- Do **not** write _"an audit returning only confirmations has not tried."_ It reads as pressure to
110
- produce a finding, and an auditor that manufactures one to satisfy the brief has corrupted the round
111
- in the more expensive direction — a false finding costs a fix unit, an argument, and the credibility
112
- of the true findings beside it. The adequacy of an all-confirmed round is tested afterwards, against
113
- the brief, by the orchestrator.
114
-
115
- ## What not to put in a brief
116
-
117
- - Laws already binding from `AGENTS.md` and the rule files. Reference them; restating invites drift
118
- between the copy and the original. Where the executor's tree carries a vendored copy of an
119
- authority the canon has since superseded, quote the landed text with its canonical path and mark
120
- the quotation as superseding the vendored copy, because a bare reference resolves to the stale
121
- copy the executor holds.
122
- - Any hint of what the other auditor is finding, or has found.
123
- - Your own hypothesis about where the defect is, beyond what the claims state. An auditor handed a
124
- suspect investigates the suspect and stops.
52
+ - A law already binding from `AGENTS.md` and the rule files: reference it. Where the executor's tree holds a vendored copy the canon has superseded, quote the landed text with its canonical path and mark the quotation as superseding the copy.
53
+ - Any hint of what the other lane is finding or has found.
54
+ - Your own hypothesis about where the defect is, beyond what the claims state.