@codyswann/lisa 3.4.0 → 3.4.1

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 (84) hide show
  1. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +31 -0
  2. package/all/copy-overwrite/scripts/lisa-work-item.mjs +24 -2
  3. package/dist/codex/scripts/block-no-verify.sh +53 -4
  4. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.js +9 -8
  6. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  7. package/package.json +1 -1
  8. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  9. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  10. package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +1 -1
  11. package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +1 -1
  12. package/plugins/lisa/hooks/block-no-verify.agy.sh +53 -4
  13. package/plugins/lisa/hooks/block-no-verify.sh +31 -0
  14. package/plugins/lisa/rules/eager/tracked-work.md +1 -1
  15. package/plugins/lisa/rules/reference/tracked-work.md +4 -2
  16. package/plugins/lisa/skills/lisa-implement/SKILL.md +1 -1
  17. package/plugins/lisa/skills/lisa-track/SKILL.md +1 -1
  18. package/plugins/lisa-agy/hooks/block-no-verify.agy.sh +53 -4
  19. package/plugins/lisa-agy/plugin.json +1 -1
  20. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +1 -1
  21. package/plugins/lisa-agy/skills/lisa-track/SKILL.md +1 -1
  22. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  25. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-copilot/hooks/block-no-verify.sh +31 -0
  29. package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
  30. package/plugins/lisa-copilot/rules/reference/tracked-work.md +4 -2
  31. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +1 -1
  32. package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +1 -1
  33. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cursor/hooks/block-no-verify.sh +31 -0
  35. package/plugins/lisa-cursor/rules/tracked-work-reference.mdc +4 -2
  36. package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
  37. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +1 -1
  38. package/plugins/lisa-cursor/skills/lisa-track/SKILL.md +1 -1
  39. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-expo-agy/plugin.json +1 -1
  42. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  47. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  52. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  57. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  62. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails-agy/plugin.json +1 -1
  67. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  72. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  77. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/src/base/hooks/block-no-verify.agy.sh +53 -4
  80. package/plugins/src/base/hooks/block-no-verify.sh +31 -0
  81. package/plugins/src/base/rules/eager/tracked-work.md +1 -1
  82. package/plugins/src/base/rules/reference/tracked-work.md +4 -2
  83. package/plugins/src/base/skills/lisa-implement/SKILL.md +1 -1
  84. package/plugins/src/base/skills/lisa-track/SKILL.md +1 -1
@@ -186,6 +186,37 @@ for i, token in enumerate(normalized_tokens):
186
186
  spec = token.split("=", 1)[1]
187
187
  if spec.split("=", 1)[0].strip().lower() == "core.hookspath":
188
188
  sys.exit(1)
189
+ # git accepts `--config-env <name>=<envvar>` as TWO tokens as well as one,
190
+ # and guarding only the `=` spelling was worse than missing the separate
191
+ # form outright: the trailing `core.hooksPath=.husky` then fell through to
192
+ # the allowlist above, which reads `.husky` as a PATH and permits it. But
193
+ # here it is an ENVIRONMENT VARIABLE NAME, and `env '.husky=/dev/null' git
194
+ # --config-env core.hooksPath=.husky` really does resolve hooksPath to
195
+ # /dev/null. The allowlist was being used as the bypass.
196
+ #
197
+ # Checked at the `--config-env` token, which the loop reaches first, so the
198
+ # refusal happens before the value token can be mistaken for a path.
199
+ if lowered == "--config-env" and i + 1 < len(normalized_tokens):
200
+ spec = normalized_tokens[i + 1]
201
+ if spec.split("=", 1)[0].strip().strip("'\"").lower() == "core.hookspath":
202
+ sys.exit(1)
203
+ # `GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=core.hooksPath
204
+ # GIT_CONFIG_VALUE_0=/dev/null git commit` sets command-scope config the
205
+ # same way `-c core.hooksPath=...` does — env-var-style assignments ahead of
206
+ # the invocation instead of a flag — so it disables every hook just as
207
+ # completely while matching none of the token shapes above. Upstream missed
208
+ # this until a downstream fork hardened its own copy against it, which is
209
+ # the one direction a guard must never be caught in.
210
+ #
211
+ # The index is matched as `\d+` rather than pinned to 0: git accepts any
212
+ # index below GIT_CONFIG_COUNT, so a single-index check is evaded by typing
213
+ # a 1. Refused outright, like --config-env=, because the path lives in a
214
+ # separate GIT_CONFIG_VALUE_<n> token that can be exported earlier,
215
+ # reordered, or left out entirely — there is nothing here to allowlist
216
+ # against.
217
+ key_match = re.match(r"git_config_key_\d+=(.*)$", lowered, re.DOTALL)
218
+ if key_match and key_match.group(1).strip().strip("'\"") == "core.hookspath":
219
+ sys.exit(1)
189
220
 
190
221
  sys.exit(0)
191
222
  PY
@@ -1376,7 +1376,28 @@ function validatePr(args) {
1376
1376
 
1377
1377
  function main() {
1378
1378
  const [command, ...args] = process.argv.slice(2);
1379
- if (command === "bind") return bind(args);
1379
+ // `link` and `bind` are the same operation under two names, and the reason is
1380
+ // the argument vector rather than the semantics.
1381
+ //
1382
+ // `bind` is a bash builtin that evaluates a string, so agent harnesses that
1383
+ // scan a command for string-evaluating programs match the bare token wherever
1384
+ // it lands — argv[0] or, as here, a subcommand three words in. Claude Code's
1385
+ // worktree isolation does precisely that, and it refused
1386
+ // `node scripts/lisa-work-item.mjs bind <ref>` outright: the one step Lisa
1387
+ // documents as mandatory before any durable work became impossible to run in
1388
+ // the isolated worktrees Lisa itself tells agents to use. Three agents hit it
1389
+ // in a single session, each independently rediscovering the same
1390
+ // carry-the-trailer-by-hand workaround.
1391
+ //
1392
+ // That guard belongs to the harness, is not Lisa's to narrow, and is doing
1393
+ // something legitimate — so the fix is to stop standing on its toes. `link`
1394
+ // is the spelling the docs teach and the one that works everywhere.
1395
+ //
1396
+ // `bind` is kept forever, not deprecated: it is written into host projects'
1397
+ // checked-in git hooks and CI, and those copies update on their own schedule.
1398
+ // Removing it to tidy up a name would break the very traceability gate this
1399
+ // file exists to enforce, in repositories that had done nothing wrong.
1400
+ if (command === "link" || command === "bind") return bind(args);
1380
1401
  if (command === "current")
1381
1402
  return console.log(JSON.stringify(readState(false), null, 2));
1382
1403
  if (command === "attach-branch") {
@@ -1403,7 +1424,8 @@ function main() {
1403
1424
  if (command === "validate-push") return validatePush(args);
1404
1425
  if (command === "validate-pr") return validatePr(args);
1405
1426
  throw new TrackingError(
1406
- "Usage: lisa-work-item.mjs bind|current|attach-branch|clear|prepare-commit-msg|validate-commit|validate-push|validate-pr"
1427
+ "Usage: lisa-work-item.mjs link|current|attach-branch|clear|prepare-commit-msg|validate-commit|validate-push|validate-pr" +
1428
+ "\n(`bind` is accepted as an alias for `link`, but some agent harnesses refuse the token `bind` in a command line.)"
1407
1429
  );
1408
1430
  }
1409
1431
 
@@ -85,16 +85,65 @@ def disables_verification(token):
85
85
  and NO_VERIFY.startswith(token)
86
86
  )
87
87
 
88
+ # The only relocations that keep a repo's own hooks in play. Anything else —
89
+ # including "" and /dev/null, which are simply the two most obvious members of
90
+ # the blocked set rather than special cases — is refused.
91
+ PERMITTED_HOOKS_PATHS = {".husky", ".githooks"}
92
+
93
+
94
+ def is_permitted_hooks_path(value):
95
+ """Whether a core.hooksPath value relocates hooks rather than disabling them.
96
+
97
+ Args:
98
+ value: The raw core.hooksPath value as it appeared on the command line.
99
+
100
+ Returns:
101
+ True if the path is an established in-repo hooks directory.
102
+ """
103
+ cleaned = value.strip().strip("'\"")
104
+ if cleaned.startswith("./"):
105
+ cleaned = cleaned[2:]
106
+ return cleaned.rstrip("/") in PERMITTED_HOOKS_PATHS
107
+
108
+
88
109
  for i, token in enumerate(normalized_tokens):
89
110
  if disables_verification(token):
90
111
  sys.exit(1)
91
112
  if token == "HUSKY=0" or token.startswith("HUSKY_SKIP_HOOKS="):
92
113
  sys.exit(1)
93
- if token.startswith("core.hooksPath="):
94
- value = token.split("=", 1)[1]
95
- if value in ("", "/dev/null"):
114
+ # Allowlist the destinations, do not denylist the disabling ones: hooks are
115
+ # disabled just as completely by any directory that happens to contain none
116
+ # (`-c core.hooksPath=/tmp/empty`), so the set that DISABLES hooks is
117
+ # unbounded while the set that legitimately relocates them is tiny. Matched
118
+ # case-insensitively because git config names are.
119
+ lowered = token.lower()
120
+ if lowered.startswith("core.hookspath="):
121
+ if not is_permitted_hooks_path(token.split("=", 1)[1]):
122
+ sys.exit(1)
123
+ if lowered == "core.hookspath" and i + 1 < len(normalized_tokens):
124
+ if not is_permitted_hooks_path(normalized_tokens[i + 1]):
125
+ sys.exit(1)
126
+ # `--config-env=core.hooksPath=SOMEVAR` reads the path out of the named env
127
+ # var, so it is not in the command at all and cannot be allowlisted.
128
+ if lowered.startswith("--config-env="):
129
+ spec = token.split("=", 1)[1]
130
+ if spec.split("=", 1)[0].strip().lower() == "core.hookspath":
131
+ sys.exit(1)
132
+ # git also accepts `--config-env <name>=<envvar>` as two tokens. Guarding
133
+ # only the `=` spelling let the trailing `core.hooksPath=.husky` fall
134
+ # through to the allowlist above, which reads `.husky` as a path — but here
135
+ # it names an ENVIRONMENT VARIABLE, which can hold /dev/null. Checked at the
136
+ # `--config-env` token, which the loop reaches first.
137
+ if lowered == "--config-env" and i + 1 < len(normalized_tokens):
138
+ spec = normalized_tokens[i + 1]
139
+ if spec.split("=", 1)[0].strip().strip("'\"").lower() == "core.hookspath":
96
140
  sys.exit(1)
97
- if token == "core.hooksPath" and i + 1 < len(normalized_tokens) and normalized_tokens[i + 1] in ("", "/dev/null"):
141
+ # `GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=core.hooksPath
142
+ # GIT_CONFIG_VALUE_0=/dev/null git ...` sets the same command-scope config
143
+ # via env-var-style assignments. The index is arbitrary below
144
+ # GIT_CONFIG_COUNT, so it is matched as `\d+` rather than pinned to 0.
145
+ key_match = re.match(r"git_config_key_\d+=(.*)$", lowered, re.DOTALL)
146
+ if key_match and key_match.group(1).strip().strip("'\"") == "core.hookspath":
98
147
  sys.exit(1)
99
148
 
100
149
  sys.exit(0)
@@ -1 +1 @@
1
- {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4xEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA49NjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
1
+ {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA4xEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA69NjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -8,12 +8,12 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
8
8
  "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "1bec5f3c284b3febdc471487ee6a23ffb72bd4e7b293f9e26b0188f32318c722",
9
9
  "all/copy-overwrite/scripts/lisa-floor-collisions.mjs": "3c7a0234b4f5609fce49e44711d2ec86af8cf7fb82b0831e4450e3347ecefe45",
10
10
  "all/copy-overwrite/scripts/lisa-hooks/block-instruction-file-edits.sh": "d47314b66d6ce85f77d6e058f861eede4462b2b0a33d54e82ff1c931167ec3f7",
11
- "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "031ef7a53fc49cb18665105b834b7b50ad6a43317e0821949809e877e0562ce4",
11
+ "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "dd1aea1b9fdd0da023bf704b331b350bc14620f4364afa5001c6690fcbc940cc",
12
12
  "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": "90601e31603c440d8f19d213d63bfef8d18596c60f88cb6e28c93d12453c5c0c",
13
13
  "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "d9ea58150aa27e7f0aa9a4ef155ed446d30bdfc932d01c64e2b8ca211aa0de7b",
14
14
  "all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh": "bf4132e49ba18e2f7e941520c299c15aeeacfd220e489f3d2eb8397f2048157b",
15
15
  "all/copy-overwrite/scripts/lisa-schema-validate.mjs": "9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
16
- "all/copy-overwrite/scripts/lisa-work-item.mjs": "e30016a49deff1c3cd3ae7951262aeb2ef3d472bce76bbbe2a177db6017c7cad",
16
+ "all/copy-overwrite/scripts/lisa-work-item.mjs": "fe064a2bd11200ed256fb36e203978f858fccbcaf40708496c066383345900ef",
17
17
  "all/copy-overwrite/scripts/schemas/lisa-command-envelope.v1.schema.json": "d153b7c2953a30f180e38f09e98240c63327f5196eeba9bdf545e5a1f125a879",
18
18
  "all/copy-overwrite/scripts/schemas/lisa-state-contract.v1.schema.json": "6b7afe4ffeba8aaa53871d8855172f7eacde05953b1321145218ec638ff5c1c4",
19
19
  "all/create-only/.agents/rules/README.md": "fd260fd9b2934d0d698a8098dfff07fedc071849d588e602d773666678c3d540",
@@ -324,8 +324,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
324
324
  "plugins/src/base/commands/wiki/install.md": "51392cf053c17edd549bfbaba5d19ce669dc79021aafa7cfa100324ad38de11f",
325
325
  "plugins/src/base/hooks/block-instruction-file-edits.agy.sh": "aa249cae53caeb3e0fb6d6af114e2756084f45a2896332fb063a9f20e4902125",
326
326
  "plugins/src/base/hooks/block-instruction-file-edits.sh": "d47314b66d6ce85f77d6e058f861eede4462b2b0a33d54e82ff1c931167ec3f7",
327
- "plugins/src/base/hooks/block-no-verify.agy.sh": "c549f1dadd6ac3fab72c0b670524445a08bee732a05b868954a438970d4d5bcc",
328
- "plugins/src/base/hooks/block-no-verify.sh": "031ef7a53fc49cb18665105b834b7b50ad6a43317e0821949809e877e0562ce4",
327
+ "plugins/src/base/hooks/block-no-verify.agy.sh": "81c51041f8cb47bf79692c485c4f42ac7ed0a5a830821dc514cb468bc7a06b83",
328
+ "plugins/src/base/hooks/block-no-verify.sh": "dd1aea1b9fdd0da023bf704b331b350bc14620f4364afa5001c6690fcbc940cc",
329
329
  "plugins/src/base/hooks/block-shell-json-parsing.agy.sh": "dc688efe382e7b8fe6f6c88bb0fde851527128cae778599559f23a93f1c9ec86",
330
330
  "plugins/src/base/hooks/block-shell-json-parsing.sh": "90601e31603c440d8f19d213d63bfef8d18596c60f88cb6e28c93d12453c5c0c",
331
331
  "plugins/src/base/hooks/cleanup-stale-worktrees.sh": "c9b2fcca1b34d6f636b5289ece11b254cbb8ee2c2bac5c2e426b6f4dcfa972f2",
@@ -391,7 +391,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
391
391
  "plugins/src/base/rules/eager/settled-decisions.md": "f5339c81b8d29f628830e6147314cbb941b9d9e6d87c3834d8fe7adc4b46ef4c",
392
392
  "plugins/src/base/rules/eager/stale-state-claims.md": "faf5057f5910237b8d5048dbcccb73e0cd03762a8eefbeae43b5d0153104a85a",
393
393
  "plugins/src/base/rules/eager/tool-access-gate.md": "a5413a43ec353f768586e0a1cde3836db025cb5d8b80821020602995e71aa296",
394
- "plugins/src/base/rules/eager/tracked-work.md": "ae5177a3ce321007dfc03f44974f25110aed578bcdf2283d5c5f12c838f82673",
394
+ "plugins/src/base/rules/eager/tracked-work.md": "24f04b4610eff1519d818741c6bd5ad6464a0833ef24ecb8bf6ceb35dced9a4b",
395
395
  "plugins/src/base/rules/eager/upstream-to-lisa.md": "eb8b37e789423dba78e3a77951db087c4d3f56a88478b63107ec6b9ddbf23b13",
396
396
  "plugins/src/base/rules/eager/usage-accounting.md": "b93fa782d61911579b25363e465bb1f4e9b7e4edb54465a346d52f74dffe5a97",
397
397
  "plugins/src/base/rules/eager/verification.md": "a6cc1d50c5b91080171490edce4d375f136a14790dcbb247ca8b736ad8f55cfd",
@@ -441,7 +441,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
441
441
  "plugins/src/base/rules/reference/settled-decisions.md": "6c84f309a1f765eba1648d6ace836387bd96b924f245c16cf3629f501ef6bb18",
442
442
  "plugins/src/base/rules/reference/stale-state-claims.md": "6329e1a7629f9a12f10454c767842aecee4964df8b7bb4aebda9dde3c0959c2a",
443
443
  "plugins/src/base/rules/reference/tool-access-gate.md": "70fcd6cd92dc003a40886b1bef02540e6401f5b70ba97308d42bbbddc0206eab",
444
- "plugins/src/base/rules/reference/tracked-work.md": "85fb31a5d7aad44d04592bb7feea7ad02808eeeb6950639ad452fcec1bc3c86b",
444
+ "plugins/src/base/rules/reference/tracked-work.md": "cc50ea131756d7e9d6d0fdbd35231894fc7d789d68c1dc0e551ae2103845db20",
445
445
  "plugins/src/base/rules/reference/upstream-to-lisa.md": "dcf07f8eba66aaf1d132bfaeff73cbf7576279822893235a3c3f8cbc4a4a3323",
446
446
  "plugins/src/base/rules/reference/usage-accounting.md": "79c00ed4a97c40de72cfccef16b6846ba668fc564354507907876489c038ab75",
447
447
  "plugins/src/base/rules/reference/verification.md": "9ae8db87b37c7700687fabd1b8632b3cddd0f1f1e4b04384c604f88f160056ed",
@@ -513,7 +513,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
513
513
  "plugins/src/base/skills/lisa-github-write-issue/SKILL.md": "f2f9991be42b0fd98f5c3f414d96e8756485c7b56aceb20d7db7f87255cc88e6",
514
514
  "plugins/src/base/skills/lisa-github-write-prd/SKILL.md": "262f8a1bcfad4c5dd4456cfaaf1b71abf9697a0da588966e58ff491acd3c17e8",
515
515
  "plugins/src/base/skills/lisa-health/SKILL.md": "dfdb08a863e78bff42671793dcec29cfae0654db18ebf66a4aa77aeb56ddb775",
516
- "plugins/src/base/skills/lisa-implement/SKILL.md": "c289fecaf5addcda87df5653eae6309001bd80bcbc0bc62cc1c9469c1842444e",
516
+ "plugins/src/base/skills/lisa-implement/SKILL.md": "4f25d131a3fb6168a2bbfa9085e048f6662d6ef30f2d9d91b46884d72c427b6f",
517
517
  "plugins/src/base/skills/lisa-improve-code-complexity/SKILL.md": "24ab5b193b409db6ee6bee981a1c0a48d08991782d7846116ad01658c8bc1ae8",
518
518
  "plugins/src/base/skills/lisa-improve-harness/SKILL.md": "98ad4b896785ac51826969a0ff077ef11c51353f2a2e03444c8b38e6c0363d05",
519
519
  "plugins/src/base/skills/lisa-improve-max-lines-per-function/SKILL.md": "95c875950c9848fdaf520a18b9bbb264e33d7347be10170add768e01d9cd8e52",
@@ -655,7 +655,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
655
655
  "plugins/src/base/skills/lisa-tear-down-automations/SKILL.md": "3f8215b691ce60a6efd63547b99b4d87760fe99d285f6fe153aaadd451e83731",
656
656
  "plugins/src/base/skills/lisa-test-strategy/SKILL.md": "8976e0056b65475fe69f4ed02c8d0d3ae898fd9ab5ff28bf632981a3293c9f6e",
657
657
  "plugins/src/base/skills/lisa-ticket-triage/SKILL.md": "9d29652fb897568a60da35956f452627a81e57032bbcc3c673ae20dfc8a419f5",
658
- "plugins/src/base/skills/lisa-track/SKILL.md": "35a3fd978c71d40f62849f903ae0291f8b3140354e53ba498ada4ffe4cd586f3",
658
+ "plugins/src/base/skills/lisa-track/SKILL.md": "ff516917ef9387e96758db74372831fd9b9d28991e2a23461cf8661893f2d3b0",
659
659
  "plugins/src/base/skills/lisa-tracker-add-journey/SKILL.md": "a3da2e0350bcdebcdcc05f2d7931af868382638d3a28d09d4718f2f458d4be0a",
660
660
  "plugins/src/base/skills/lisa-tracker-build-intake/SKILL.md": "df50fb88f29eadc66c250e1d7f841472df43ba865930fbbc0bea36bba3380ec3",
661
661
  "plugins/src/base/skills/lisa-tracker-claim/SKILL.md": "481922dba26c4e62ae36193a2e1565860aecf7e344bf5c37b3a0759f42676846",
@@ -7456,6 +7456,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7456
7456
  "tests/unit/codex/agent-installer.test.ts": true,
7457
7457
  "tests/unit/codex/agent-transformer.test.ts": true,
7458
7458
  "tests/unit/codex/agents-md-installer.test.ts": true,
7459
+ "tests/unit/codex/block-no-verify-codex.test.ts": true,
7459
7460
  "tests/unit/codex/block-suppress-directives.test.ts": true,
7460
7461
  "tests/unit/codex/build-byte-stable.test.ts": true,
7461
7462
  "tests/unit/codex/codex-edit-hooks.test.ts": true,