lazycodex-ai 5.1.6 → 5.1.8

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 (71) hide show
  1. package/dist/cli/index.js +49 -45
  2. package/dist/cli/run/runnable-agent-resolver.d.ts +3 -0
  3. package/dist/cli-node/index.js +49 -45
  4. package/package.json +1 -1
  5. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  6. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +13 -3
  7. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  8. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  9. package/packages/omo-codex/plugin/components/bootstrap/test/download.test.ts +0 -16
  10. package/packages/omo-codex/plugin/components/bootstrap/test/environment.test.ts +3 -0
  11. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  14. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  16. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  18. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +0 -27
  21. package/packages/omo-codex/plugin/components/rules/README.md +0 -1
  22. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +1 -1
  23. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +1 -1
  24. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
  25. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  26. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/ultrawork/test/directive-source.test.ts +0 -6
  34. package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -15
  35. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  38. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +16 -0
  40. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  61. package/packages/omo-codex/plugin/package-lock.json +12 -12
  62. package/packages/omo-codex/plugin/package.json +1 -1
  63. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  64. package/packages/omo-codex/plugin/skills/debugging/SKILL.md +1 -1
  65. package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +8 -0
  66. package/packages/omo-codex/plugin/test/AGENTS.md +11 -0
  67. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +0 -50
  68. package/packages/omo-codex/scripts/install-dist/install-local.mjs +15 -5
  69. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  70. package/packages/shared-skills/skills/debugging/SKILL.md +1 -1
  71. package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +8 -0
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.6",
3
+ "version": "5.1.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "5.1.6",
9
+ "version": "5.1.8",
10
10
  "workspaces": [
11
11
  "components/comment-checker",
12
12
  "components/git-bash",
@@ -95,7 +95,7 @@
95
95
  },
96
96
  "components/comment-checker": {
97
97
  "name": "@code-yeongyu/codex-comment-checker",
98
- "version": "5.1.6",
98
+ "version": "5.1.8",
99
99
  "license": "MIT",
100
100
  "bin": {
101
101
  "omo-comment-checker": "dist/cli.js"
@@ -117,7 +117,7 @@
117
117
  },
118
118
  "components/git-bash": {
119
119
  "name": "@sisyphuslabs/codex-git-bash-hook",
120
- "version": "5.1.6",
120
+ "version": "5.1.8",
121
121
  "bin": {
122
122
  "omo-git-bash-hook": "dist/cli.js"
123
123
  },
@@ -131,7 +131,7 @@
131
131
  },
132
132
  "components/lazycodex-executor-verify": {
133
133
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
134
- "version": "5.1.6",
134
+ "version": "5.1.8",
135
135
  "license": "MIT",
136
136
  "bin": {
137
137
  "lazycodex-executor-verify": "dist/cli.js"
@@ -149,7 +149,7 @@
149
149
  },
150
150
  "components/lsp": {
151
151
  "name": "@code-yeongyu/codex-lsp",
152
- "version": "5.1.6",
152
+ "version": "5.1.8",
153
153
  "license": "MIT",
154
154
  "dependencies": {
155
155
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
@@ -171,7 +171,7 @@
171
171
  },
172
172
  "components/rules": {
173
173
  "name": "@code-yeongyu/codex-rules",
174
- "version": "5.1.6",
174
+ "version": "5.1.8",
175
175
  "license": "MIT",
176
176
  "dependencies": {
177
177
  "picomatch": "^4.0.7"
@@ -194,7 +194,7 @@
194
194
  },
195
195
  "components/teammode": {
196
196
  "name": "@sisyphuslabs/codex-teammode",
197
- "version": "5.1.6",
197
+ "version": "5.1.8",
198
198
  "devDependencies": {
199
199
  "@types/node": "^26.6.2",
200
200
  "@vitest/coverage-v8": "5.0.1",
@@ -208,7 +208,7 @@
208
208
  },
209
209
  "components/telemetry": {
210
210
  "name": "@code-yeongyu/codex-telemetry",
211
- "version": "5.1.6",
211
+ "version": "5.1.8",
212
212
  "license": "MIT",
213
213
  "bin": {
214
214
  "omo-telemetry": "dist/cli.js"
@@ -227,7 +227,7 @@
227
227
  },
228
228
  "components/ultrawork": {
229
229
  "name": "@code-yeongyu/codex-ultrawork",
230
- "version": "5.1.6",
230
+ "version": "5.1.8",
231
231
  "license": "MIT",
232
232
  "bin": {
233
233
  "omo-ultrawork": "dist/cli.js"
@@ -246,7 +246,7 @@
246
246
  },
247
247
  "components/ulw-execute-continuation": {
248
248
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
249
- "version": "5.1.6",
249
+ "version": "5.1.8",
250
250
  "license": "MIT",
251
251
  "bin": {
252
252
  "omo-ulw-execute-continuation": "dist/cli.js"
@@ -264,7 +264,7 @@
264
264
  },
265
265
  "components/ulw-loop": {
266
266
  "name": "@code-yeongyu/codex-ulw-loop",
267
- "version": "5.1.6",
267
+ "version": "5.1.8",
268
268
  "license": "MIT",
269
269
  "bin": {
270
270
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.6",
3
+ "version": "5.1.8",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-09-30T18:48:33.732Z"
8
+ "stagedAtUtc": "2026-10-01T14:48:25.418Z"
9
9
  }
@@ -73,7 +73,7 @@ Each phase has exactly one reference. Read it as you enter the phase — not in
73
73
  | 4 | **Oracle Triple** — after 2 consecutive failed rounds, spawn three Oracles with orthogonal framings and synthesize | [references/methodology/04-oracle-triple.md](references/methodology/04-oracle-triple.md) |
74
74
  | 5 | **User decision escalation** — only when evidence exhausted and the call has policy implications | [references/methodology/05-escalate.md](references/methodology/05-escalate.md) |
75
75
  | 6 | **Root cause confirmation** — confirmed only when toggling the suspected cause toggles the bug | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
76
- | 7 | **TDD fix** — red test first, minimal green, no scope expansion | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
76
+ | 7 | **Fix locked by a failing proof** — reuse the owner test that already fails or add one regression that fails on the pre-fix code, minimal green, no scope expansion | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
77
77
  | 8 | **Manual QA** — actually use the system (tmux for CLI, Playwright for browser, real curl for API, real repro for binary) | [references/methodology/08-qa.md](references/methodology/08-qa.md) |
78
78
  | 9 | **Cleanup** — walk the journal, revert every artifact, verify `git diff` shows only fix + test | [references/methodology/09-cleanup.md](references/methodology/09-cleanup.md) |
79
79
  | 10 | **Final verification** — four evidence gates before declaring done | [references/methodology/09-cleanup.md](references/methodology/09-cleanup.md) |
@@ -51,6 +51,14 @@ The "mechanism" field is the acid test. If you can't write the causal chain from
51
51
 
52
52
  Red, green, refactor. No shortcuts.
53
53
 
54
+ ### 0. Look for the owner test first
55
+
56
+ Before writing a reproduction test, find the test that already owns this contract at the strongest boundary. Run it on the pre-fix code:
57
+
58
+ - **It already fails for this bug.** It is the red proof. Record its failure and skip step 1.
59
+ - **It passes but covers the path.** Extend it with the failing case (a table row, a fixture case) instead of adding a parallel test.
60
+ - **No owner exists.** Write the new reproduction test in step 1, and apply the repository's test-authoring gate if it has one.
61
+
54
62
  ### 1. Red — the reproduction as a test
55
63
 
56
64
  Write a test that fails *specifically because of this bug*. Requirements:
@@ -41,6 +41,17 @@
41
41
  - Hooks must fail closed/silent on malformed input; migration must not mutate user-owned settings or change bytes on repeat runs.
42
42
  - Never assert prompt/skill prose wording — machine-consumed fields and shipped-copy equality only.
43
43
 
44
+ ## TEST AUTHORING GATE
45
+
46
+ Before adding or changing a suite here, answer all four. A missing answer means do not add it yet:
47
+
48
+ 1. What observable contract over the generated or installed artifact does it protect?
49
+ 2. What credible regression in the build, sync, or install makes it fail?
50
+ 3. Why does an existing suite not already catch it? Extend the family's owner suite or shared fixture instead of adding a near-duplicate.
51
+ 4. Does it need a seam no shipped artifact needs? If yes, check the real artifact instead.
52
+
53
+ Reject the following unless the case independently guards a manifest, hook, migration, install, or cross-platform contract (and say which one): copied inventories, exact string greps over sources, replays of a shared fixture through a wrapper, and assertions that restate a manifest field. A retained suite that fails on the base is a product bug to fix, never a suite to delete. The full list is `.omo/rules/test-discipline.md` `## AUTHORING GATE` in the OmO repository.
54
+
44
55
  ## COMMANDS
45
56
 
46
57
  - `npm test` (from `plugin/`, after `npm run build`)
@@ -340,56 +340,6 @@ function smokeImportComponent(component, event) {
340
340
  }
341
341
  }
342
342
 
343
- function writeFakeLspDaemonCli(path) {
344
- writeFileSync(
345
- path,
346
- [
347
- "#!/usr/bin/env node",
348
- 'import { createHash } from "node:crypto";',
349
- 'import { appendFileSync, mkdirSync, readdirSync, unlinkSync } from "node:fs";',
350
- 'import { tmpdir } from "node:os";',
351
- 'import { dirname, join } from "node:path";',
352
- 'import { createServer } from "node:net";',
353
- "",
354
- "appendFileSync(process.env.FAKE_LSP_DAEMON_LOG, `${JSON.stringify(process.argv.slice(2))}\\n`);",
355
- "const baseDir = process.env.OMO_LSP_DAEMON_DIR;",
356
- 'const versionDirName = readdirSync(baseDir).find((entry) => entry.startsWith("v")) ?? "v0";',
357
- "const version = versionDirName.slice(1);",
358
- "const dir = join(baseDir, versionDirName);",
359
- 'const naturalSocket = join(dir, "daemon.sock");',
360
- 'const digest = createHash("sha256").update(dir).digest("hex").slice(0, 16);',
361
- "const socketPath = process.platform === \"win32\"",
362
- "\t? `\\\\\\\\.\\\\pipe\\\\omo-lsp-${version}-${digest}`",
363
- "\t: naturalSocket.length < 100 ? naturalSocket : join(tmpdir(), `omo-lsp-${version}-${digest}.sock`);",
364
- "if (process.platform !== \"win32\") {",
365
- "\tmkdirSync(dirname(socketPath), { recursive: true });",
366
- "\ttry { unlinkSync(socketPath); } catch {}",
367
- "}",
368
- "const server = createServer((socket) => {",
369
- '\tlet raw = "";',
370
- '\tsocket.setEncoding("utf8");',
371
- '\tsocket.on("data", (chunk) => {',
372
- "\t\traw += chunk;",
373
- '\t\tif (!raw.includes("\\n")) return;',
374
- "\t\tconst request = JSON.parse(raw.trim());",
375
- "\t\tconst response = {",
376
- '\t\t\tjsonrpc: "2.0",',
377
- "\t\t\tid: request.id,",
378
- "\t\t\tresult: {",
379
- '\t\t\t\tcontent: [{ type: "text", text: "error[fake] (1) at 1:1: Missing fake symbol." }],',
380
- "\t\t\t},",
381
- "\t\t};",
382
- '\t\tsocket.end(`${JSON.stringify(response)}\\n`);',
383
- "\t\tserver.close(() => process.exit(0));",
384
- "\t});",
385
- "});",
386
- "server.listen(socketPath);",
387
- "setTimeout(() => process.exit(1), 10000).unref();",
388
- "",
389
- ].join("\n"),
390
- );
391
- }
392
-
393
343
  async function stopTestDaemons(daemonRoot) {
394
344
  if (!existsSync(daemonRoot)) return;
395
345
  for (const versionDir of readdirSync(daemonRoot)) {
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // omo-codex-install:926babe1233096485f8e4db8e616e5deaa07ce9e732fdb0477b03390f4f15efa:4d5d406ea49f40877a220f86f4699fafaf2529a5afcea4e30abccfe48760df2c
2
+ // omo-codex-install:a1f96096cef4f8615e30953c86b15240f13309b354e404cf5f0ee3eb8c12905c:e5e0ce072c9aecb36bb20f87b647831eb69af1120a97e6d8f9751489afcb2166
3
3
  var __esm = (fn, res, err) => () => {
4
4
  if (fn)
5
5
  try {
@@ -9984,7 +9984,7 @@ var package_default;
9984
9984
  var init_package = __esm(() => {
9985
9985
  package_default = {
9986
9986
  name: "@oh-my-opencode/omo-codex",
9987
- version: "5.1.6",
9987
+ version: "5.1.8",
9988
9988
  type: "module",
9989
9989
  private: true,
9990
9990
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -12529,6 +12529,12 @@ ${featureName} = true
12529
12529
  }
12530
12530
  return replaceOrInsertSetting(config, section, featureName, "true");
12531
12531
  }
12532
+ function removeFeature(config, featureName) {
12533
+ const section = findTomlSection(config, "features");
12534
+ if (section !== null)
12535
+ return removeSetting(config, section, featureName);
12536
+ return removeRootSetting(config, `features.${featureName}`);
12537
+ }
12532
12538
 
12533
12539
  // packages/omo-codex/src/install/codex-config-marketplaces.ts
12534
12540
  var SISYPHUS_LEGACY_MARKETPLACES = ["lazycodex", "code-yeongyu-codex-plugins"];
@@ -13121,6 +13127,7 @@ async function updateCodexConfig(input) {
13121
13127
  config = ensureFeatureEnabled(config, "plugins");
13122
13128
  config = ensureFeatureEnabled(config, "plugin_hooks");
13123
13129
  config = ensureFeatureEnabled(config, "multi_agent");
13130
+ config = removeFeature(config, "child_agents_md");
13124
13131
  config = removeUnsupportedCodexMultiAgentModeConfig(config);
13125
13132
  config = ensureCodexReasoningConfig(config, applyReasoningOverride(await readCodexModelCatalog(input.repoRoot), input.reasoning));
13126
13133
  config = ensureCodexMultiAgentV2Config(config, {
@@ -19442,7 +19449,8 @@ var OmoMemoryRecallSchema = object({
19442
19449
  event_caps: OmoMemoryRecallEventCapsSchema.default({ tool_args: 400, result_head: 600, assistant: 1500, prompt: 4000 }),
19443
19450
  sidecar_max_tokens: number2().int().positive().default(48000),
19444
19451
  max_concurrent_wakes: number2().int().positive().default(2),
19445
- tool_budget: number2().int().positive().default(8)
19452
+ tool_budget: number2().int().positive().default(8),
19453
+ query_expansion: boolean2().default(false)
19446
19454
  }).strict();
19447
19455
  var OmoMemoryNudgeSchema = object({
19448
19456
  enabled: boolean2().default(true),
@@ -19503,7 +19511,8 @@ var OmoMemoryRecallLayerSchema = object({
19503
19511
  event_caps: OmoMemoryRecallEventCapsLayerSchema.optional(),
19504
19512
  sidecar_max_tokens: number2().int().positive().optional(),
19505
19513
  max_concurrent_wakes: number2().int().positive().optional(),
19506
- tool_budget: number2().int().positive().optional()
19514
+ tool_budget: number2().int().positive().optional(),
19515
+ query_expansion: boolean2().optional()
19507
19516
  }).strict();
19508
19517
  var OmoMemoryNudgeLayerSchema = object({
19509
19518
  enabled: boolean2().optional(),
@@ -19580,7 +19589,8 @@ var OmoMemorySettingsSchema = object({
19580
19589
  event_caps: { tool_args: 400, result_head: 600, assistant: 1500, prompt: 4000 },
19581
19590
  sidecar_max_tokens: 48000,
19582
19591
  max_concurrent_wakes: 2,
19583
- tool_budget: 8
19592
+ tool_budget: 8,
19593
+ query_expansion: false
19584
19594
  }),
19585
19595
  compile_warn_tokens: number2().int().positive().default(30000),
19586
19596
  agents: record(string2(), OmoMemoryAgentOverridesSchema).default({})
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-09-30T18:48:33.732Z"
8
+ "stagedAtUtc": "2026-10-01T14:48:25.418Z"
9
9
  }
@@ -73,7 +73,7 @@ Each phase has exactly one reference. Read it as you enter the phase — not in
73
73
  | 4 | **Oracle Triple** — after 2 consecutive failed rounds, spawn three Oracles with orthogonal framings and synthesize | [references/methodology/04-oracle-triple.md](references/methodology/04-oracle-triple.md) |
74
74
  | 5 | **User decision escalation** — only when evidence exhausted and the call has policy implications | [references/methodology/05-escalate.md](references/methodology/05-escalate.md) |
75
75
  | 6 | **Root cause confirmation** — confirmed only when toggling the suspected cause toggles the bug | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
76
- | 7 | **TDD fix** — red test first, minimal green, no scope expansion | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
76
+ | 7 | **Fix locked by a failing proof** — reuse the owner test that already fails or add one regression that fails on the pre-fix code, minimal green, no scope expansion | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
77
77
  | 8 | **Manual QA** — actually use the system (tmux for CLI, Playwright for browser, real curl for API, real repro for binary) | [references/methodology/08-qa.md](references/methodology/08-qa.md) |
78
78
  | 9 | **Cleanup** — walk the journal, revert every artifact, verify `git diff` shows only fix + test | [references/methodology/09-cleanup.md](references/methodology/09-cleanup.md) |
79
79
  | 10 | **Final verification** — four evidence gates before declaring done | [references/methodology/09-cleanup.md](references/methodology/09-cleanup.md) |
@@ -51,6 +51,14 @@ The "mechanism" field is the acid test. If you can't write the causal chain from
51
51
 
52
52
  Red, green, refactor. No shortcuts.
53
53
 
54
+ ### 0. Look for the owner test first
55
+
56
+ Before writing a reproduction test, find the test that already owns this contract at the strongest boundary. Run it on the pre-fix code:
57
+
58
+ - **It already fails for this bug.** It is the red proof. Record its failure and skip step 1.
59
+ - **It passes but covers the path.** Extend it with the failing case (a table row, a fixture case) instead of adding a parallel test.
60
+ - **No owner exists.** Write the new reproduction test in step 1, and apply the repository's test-authoring gate if it has one.
61
+
54
62
  ### 1. Red — the reproduction as a test
55
63
 
56
64
  Write a test that fails *specifically because of this bug*. Requirements: