@orkestrel/scaffold 0.0.76 → 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.
- package/dist/agents/skills/orkestrel-dispatch/scripts/bench.js +204 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/brief.js +102 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/cite.js +95 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/helpers.js +207 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/launch.js +108 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/login.js +114 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/result.js +108 -0
- package/dist/agents/skills/orkestrel-dispatch/scripts/sweep.js +156 -0
- package/dist/agents/skills/orkestrel-harden/scripts/discovery.js +196 -0
- package/dist/agents/skills/orkestrel-publish/scripts/compare.js +206 -0
- package/dist/agents/skills/orkestrel-publish/scripts/pins.js +93 -0
- package/dist/agents/skills/orkestrel-publish/scripts/wave.js +458 -0
- package/dist/agents/skills/orkestrel-publish/scripts/window.js +188 -0
- package/dist/agents/skills/orkestrel-scout/scripts/map.js +300 -0
- package/dist/agents/templates/brief.md +55 -0
- package/dist/bin/main.js +4 -2
- package/dist/bin/main.js.map +1 -1
- package/dist/host/AGENTS.md +77 -135
- package/dist/host/agents/orchestration.md +147 -927
- package/dist/host/agents/skills/enterprise-bootstrap/SKILL.md +2 -2
- package/dist/host/agents/skills/enterprise-bootstrap/references/inspection.md +1 -1
- package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +6 -13
- package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/fleet.md +5 -7
- package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +11 -22
- package/dist/host/agents/skills/{orkestrel-build-application → orkestrel-build}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/orkestrel-debrief/SKILL.md +8 -16
- package/dist/host/agents/skills/orkestrel-debrief/references/instruction-audit.md +3 -3
- package/dist/host/agents/skills/orkestrel-debrief/references/retention.md +13 -13
- package/dist/host/agents/skills/orkestrel-dispatch/SKILL.md +61 -0
- package/dist/host/agents/skills/orkestrel-dispatch/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-dispatch/references/bench.md +25 -0
- package/dist/host/agents/skills/orkestrel-dispatch/references/launch.md +32 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/bench.ts +259 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/brief.ts +110 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/cite.ts +115 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/helpers.ts +239 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/launch.ts +124 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/login.ts +123 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/result.ts +129 -0
- package/dist/host/agents/skills/orkestrel-dispatch/scripts/sweep.ts +157 -0
- package/dist/host/agents/skills/orkestrel-falsify/SKILL.md +42 -193
- package/dist/host/agents/skills/orkestrel-falsify/references/brief.md +38 -108
- package/dist/host/agents/skills/orkestrel-falsify/references/reconcile.md +35 -134
- package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +10 -14
- package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/hardening.md +3 -4
- package/dist/host/agents/skills/orkestrel-harden/scripts/discovery.ts +228 -0
- package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +15 -23
- package/dist/host/agents/skills/orkestrel-journey/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/captures.md +1 -1
- package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/SKILL.md +25 -33
- package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/agents/openai.yaml +1 -1
- package/dist/host/agents/skills/{orkestrel-polish-surface → orkestrel-polish}/references/capture-harness.md +3 -3
- package/dist/host/agents/skills/orkestrel-publish/SKILL.md +33 -20
- package/dist/host/agents/skills/orkestrel-publish/references/release.md +39 -0
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +22 -21
- package/dist/host/agents/skills/orkestrel-publish/references/window.md +27 -14
- package/dist/host/agents/skills/orkestrel-publish/scripts/compare.ts +220 -0
- package/dist/host/agents/skills/orkestrel-publish/scripts/pins.ts +114 -0
- package/dist/host/agents/skills/orkestrel-publish/scripts/wave.ts +629 -0
- package/dist/host/agents/skills/orkestrel-publish/scripts/window.ts +242 -0
- package/dist/host/agents/skills/orkestrel-scout/SKILL.md +28 -0
- package/dist/host/agents/skills/orkestrel-scout/agents/openai.yaml +4 -0
- package/dist/host/agents/skills/orkestrel-scout/scripts/map.ts +352 -0
- package/dist/host/agents/templates/brief.md +21 -142
- package/dist/host/agents/transports/claude-cli.md +21 -0
- package/dist/host/agents/transports/codex.md +38 -159
- package/dist/host/agents/transports/cursor.md +16 -65
- package/dist/host/claude/AGENTS.md +38 -0
- package/dist/host/claude/agents/analyst.md +14 -53
- package/dist/host/claude/agents/astra.md +26 -0
- package/dist/host/claude/agents/builder.md +14 -30
- package/dist/host/claude/agents/checker.md +13 -57
- package/dist/host/claude/agents/distiller.md +11 -26
- package/dist/host/claude/agents/grok.md +12 -35
- package/dist/host/claude/agents/opus.md +14 -30
- package/dist/host/claude/agents/planner.md +10 -44
- package/dist/host/claude/agents/researcher.md +11 -30
- package/dist/host/claude/agents/reviewer.md +11 -95
- package/dist/host/claude/agents/scout.md +9 -23
- package/dist/host/claude/agents/verifier.md +15 -33
- package/dist/host/claude/rules/documentation.md +8 -2
- package/dist/host/claude/rules/portability.md +7 -1
- package/dist/host/claude/rules/quality.md +36 -96
- package/dist/host/claude/rules/styles.md +3 -0
- package/dist/host/claude/rules/tests.md +6 -3
- package/dist/host/claude/rules/workspace.md +19 -15
- package/dist/host/claude/rules/writing.md +57 -108
- package/dist/host/claude/settings.json +5 -3
- package/dist/host/claude/skills/enterprise-bootstrap/SKILL.md +1 -1
- package/dist/host/claude/skills/{orkestrel-align-packages → orkestrel-align}/SKILL.md +2 -2
- package/dist/host/claude/skills/{orkestrel-build-application → orkestrel-build}/SKILL.md +2 -2
- package/dist/host/claude/skills/orkestrel-dispatch/SKILL.md +11 -0
- package/dist/host/claude/skills/orkestrel-falsify/SKILL.md +2 -1
- package/dist/host/claude/skills/{orkestrel-harden-package → orkestrel-harden}/SKILL.md +2 -2
- package/dist/host/claude/skills/{orkestrel-prove-journey → orkestrel-journey}/SKILL.md +2 -2
- package/dist/host/claude/skills/orkestrel-polish/SKILL.md +12 -0
- package/dist/host/claude/skills/orkestrel-scout/SKILL.md +11 -0
- package/dist/host/codex/agents/analyst.toml +15 -32
- package/dist/host/codex/agents/astra.toml +25 -0
- package/dist/host/codex/agents/builder.toml +13 -20
- package/dist/host/codex/agents/checker.toml +13 -27
- package/dist/host/codex/agents/distiller.toml +9 -22
- package/dist/host/codex/agents/grok.toml +11 -30
- package/dist/host/codex/agents/opus.toml +14 -22
- package/dist/host/codex/agents/orkestrel.toml +1 -1
- package/dist/host/codex/agents/planner.toml +11 -28
- package/dist/host/codex/agents/researcher.toml +10 -22
- package/dist/host/codex/agents/reviewer.toml +11 -27
- package/dist/host/codex/agents/scout.toml +11 -17
- package/dist/host/codex/agents/verifier.toml +16 -12
- package/dist/host/codex/config.toml +20 -23
- package/dist/host/cursor/mcp.json +0 -4
- package/dist/host/cursor/rules/orchestration.mdc +12 -20
- package/dist/host/dotfiles/mcp.json +0 -4
- package/dist/host/dotfiles/oxlintrc.json +7 -0
- package/dist/host/guides/probe.md +9 -9
- package/dist/host/guides/scaffold.md +117 -71
- package/dist/host/guides/test.md +1 -1
- package/dist/host/manifest.json +322 -185
- package/dist/host/scripts/codex.sh +2 -2
- package/dist/host/tests/config.test.ts +68 -46
- package/dist/host/tests/policy.test.ts +1 -5
- package/dist/host/tests/setupPolicy.ts +179 -4
- package/dist/src/core/index.cjs +255 -84
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +94 -29
- package/dist/src/core/index.d.ts +94 -29
- package/dist/src/core/index.js +253 -85
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +55 -9
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +29 -4
- package/dist/src/server/index.d.ts +29 -4
- package/dist/src/server/index.js +56 -11
- package/dist/src/server/index.js.map +1 -1
- package/package.json +15 -11
- package/dist/host/CLAUDE.md +0 -61
- package/dist/host/agents/skills/orkestrel-prove-journey/agents/openai.yaml +0 -4
- package/dist/host/agents/transports/claude.md +0 -49
- package/dist/host/claude/agents/application.md +0 -36
- package/dist/host/claude/agents/sol.md +0 -61
- package/dist/host/claude/skills/orkestrel-polish-surface/SKILL.md +0 -12
- package/dist/host/codex/agents/application.toml +0 -25
- package/dist/host/codex/agents/sol.toml +0 -19
- /package/dist/host/agents/skills/{orkestrel-align-packages → orkestrel-align}/references/integration.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/centralization.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/contract.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-harden-package → orkestrel-harden}/references/research.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/decide.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/layer.md +0 -0
- /package/dist/host/agents/skills/{orkestrel-prove-journey → orkestrel-journey}/references/statechart.md +0 -0
- /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:
|
|
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
|
-
|
|
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
|
-
##
|
|
11
|
+
## Run a round only when
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
135
|
-
comparable; a round that invents its own cannot be read against the last one.
|
|
20
|
+
## Write the claims
|
|
136
21
|
|
|
137
|
-
|
|
22
|
+
Write `tmp/units/<unit>-claims.md` and point every lane at it. Read `references/brief.md` for the claim form.
|
|
138
23
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
167
|
-
leaves empty, so a `FAIL` driven only by a finding outside the claims still names both.
|
|
50
|
+
## Reconcile and rule
|
|
168
51
|
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
61
|
+
## Write the verdict
|
|
177
62
|
|
|
178
|
-
|
|
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
|
-
##
|
|
65
|
+
## After three rounds at one seam
|
|
182
66
|
|
|
183
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
5
|
+
## Rows
|
|
7
6
|
|
|
8
|
-
|
|
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
|
-
**
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
##
|
|
32
|
+
## Claims that find defects
|
|
44
33
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
68
|
-
|
|
69
|
-
-
|
|
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.
|