@codyswann/lisa 3.3.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 (121) 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 +33 -12
  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 +4 -2
  11. package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/SKILL.md +7 -0
  12. package/plugins/lisa/.codex-plugin/skills/lisa-review-local/SKILL.md +27 -0
  13. package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/SKILL.md +1 -0
  14. package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +1 -1
  15. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
  16. package/plugins/lisa/hooks/block-no-verify.agy.sh +53 -4
  17. package/plugins/lisa/hooks/block-no-verify.sh +31 -0
  18. package/plugins/lisa/rules/eager/design-source-of-truth.md +38 -0
  19. package/plugins/lisa/rules/eager/tracked-work.md +1 -1
  20. package/plugins/lisa/rules/reference/design-source-of-truth.md +195 -0
  21. package/plugins/lisa/rules/reference/tracked-work.md +4 -2
  22. package/plugins/lisa/scripts/design-source-gate.mjs +530 -0
  23. package/plugins/lisa/skills/lisa-implement/SKILL.md +4 -2
  24. package/plugins/lisa/skills/lisa-quality-review/SKILL.md +7 -0
  25. package/plugins/lisa/skills/lisa-review-local/SKILL.md +27 -0
  26. package/plugins/lisa/skills/lisa-tdd-implementation/SKILL.md +1 -0
  27. package/plugins/lisa/skills/lisa-track/SKILL.md +1 -1
  28. package/plugins/lisa/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
  29. package/plugins/lisa-agy/hooks/block-no-verify.agy.sh +53 -4
  30. package/plugins/lisa-agy/plugin.json +1 -1
  31. package/plugins/lisa-agy/scripts/design-source-gate.mjs +530 -0
  32. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +4 -2
  33. package/plugins/lisa-agy/skills/lisa-quality-review/SKILL.md +7 -0
  34. package/plugins/lisa-agy/skills/lisa-review-local/SKILL.md +27 -0
  35. package/plugins/lisa-agy/skills/lisa-tdd-implementation/SKILL.md +1 -0
  36. package/plugins/lisa-agy/skills/lisa-track/SKILL.md +1 -1
  37. package/plugins/lisa-agy/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
  38. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  41. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-copilot/hooks/block-no-verify.sh +31 -0
  45. package/plugins/lisa-copilot/rules/eager/design-source-of-truth.md +38 -0
  46. package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
  47. package/plugins/lisa-copilot/rules/reference/design-source-of-truth.md +195 -0
  48. package/plugins/lisa-copilot/rules/reference/tracked-work.md +4 -2
  49. package/plugins/lisa-copilot/scripts/design-source-gate.mjs +530 -0
  50. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +4 -2
  51. package/plugins/lisa-copilot/skills/lisa-quality-review/SKILL.md +7 -0
  52. package/plugins/lisa-copilot/skills/lisa-review-local/SKILL.md +27 -0
  53. package/plugins/lisa-copilot/skills/lisa-tdd-implementation/SKILL.md +1 -0
  54. package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +1 -1
  55. package/plugins/lisa-copilot/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
  56. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-cursor/hooks/block-no-verify.sh +31 -0
  58. package/plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc +200 -0
  59. package/plugins/lisa-cursor/rules/design-source-of-truth.mdc +43 -0
  60. package/plugins/lisa-cursor/rules/tracked-work-reference.mdc +4 -2
  61. package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
  62. package/plugins/lisa-cursor/scripts/design-source-gate.mjs +530 -0
  63. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +4 -2
  64. package/plugins/lisa-cursor/skills/lisa-quality-review/SKILL.md +7 -0
  65. package/plugins/lisa-cursor/skills/lisa-review-local/SKILL.md +27 -0
  66. package/plugins/lisa-cursor/skills/lisa-tdd-implementation/SKILL.md +1 -0
  67. package/plugins/lisa-cursor/skills/lisa-track/SKILL.md +1 -1
  68. package/plugins/lisa-cursor/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
  69. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-expo-agy/plugin.json +1 -1
  72. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  77. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  82. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  87. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  92. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-rails-agy/plugin.json +1 -1
  97. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  102. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  106. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  107. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  109. package/plugins/src/base/hooks/block-no-verify.agy.sh +53 -4
  110. package/plugins/src/base/hooks/block-no-verify.sh +31 -0
  111. package/plugins/src/base/rules/eager/design-source-of-truth.md +38 -0
  112. package/plugins/src/base/rules/eager/tracked-work.md +1 -1
  113. package/plugins/src/base/rules/reference/design-source-of-truth.md +195 -0
  114. package/plugins/src/base/rules/reference/tracked-work.md +4 -2
  115. package/plugins/src/base/scripts/design-source-gate.mjs +530 -0
  116. package/plugins/src/base/skills/lisa-implement/SKILL.md +4 -2
  117. package/plugins/src/base/skills/lisa-quality-review/SKILL.md +7 -0
  118. package/plugins/src/base/skills/lisa-review-local/SKILL.md +27 -0
  119. package/plugins/src/base/skills/lisa-tdd-implementation/SKILL.md +1 -0
  120. package/plugins/src/base/skills/lisa-track/SKILL.md +1 -1
  121. package/plugins/src/base/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
@@ -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,CAsxEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA28NjE,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",
@@ -361,6 +361,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
361
361
  "plugins/src/base/rules/eager/dependency-internalization-kit.md": "9e2cc78afffc477c14718390ed88c42f781911c51fb7c13dada497f9e956b1a3",
362
362
  "plugins/src/base/rules/eager/dependency-trust-classes.md": "43a0932a7b8d4fd075b66bfe778025d808a13d9aa61ae793e9eb2fc8a555a381",
363
363
  "plugins/src/base/rules/eager/derived-branch-plan.md": "aa88be9f1a6de7a843222585bcc1c593b993e7d5900c8a33a9f38ef8a99d25b4",
364
+ "plugins/src/base/rules/eager/design-source-of-truth.md": "d85886aa5832f7952bc0768871a335f33a4899ce598bb1a114feb5f300cbc7f2",
364
365
  "plugins/src/base/rules/eager/do-it-now.md": "de0c1565fa7b8a99a7f5d15af1118c3e5eb942a0d893bbb672533149fb82688e",
365
366
  "plugins/src/base/rules/eager/documentation-source-paths.md": "3a7c2a6264654a3cc44dd326441ba211a39c1c267033cc189c1c635adb84b52b",
366
367
  "plugins/src/base/rules/eager/empirical-inquiry.md": "67aa64ba3ecc4f3cd761111d2562662e0a2acf7892703b14ec83f7f7b073e670",
@@ -390,7 +391,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
390
391
  "plugins/src/base/rules/eager/settled-decisions.md": "f5339c81b8d29f628830e6147314cbb941b9d9e6d87c3834d8fe7adc4b46ef4c",
391
392
  "plugins/src/base/rules/eager/stale-state-claims.md": "faf5057f5910237b8d5048dbcccb73e0cd03762a8eefbeae43b5d0153104a85a",
392
393
  "plugins/src/base/rules/eager/tool-access-gate.md": "a5413a43ec353f768586e0a1cde3836db025cb5d8b80821020602995e71aa296",
393
- "plugins/src/base/rules/eager/tracked-work.md": "ae5177a3ce321007dfc03f44974f25110aed578bcdf2283d5c5f12c838f82673",
394
+ "plugins/src/base/rules/eager/tracked-work.md": "24f04b4610eff1519d818741c6bd5ad6464a0833ef24ecb8bf6ceb35dced9a4b",
394
395
  "plugins/src/base/rules/eager/upstream-to-lisa.md": "eb8b37e789423dba78e3a77951db087c4d3f56a88478b63107ec6b9ddbf23b13",
395
396
  "plugins/src/base/rules/eager/usage-accounting.md": "b93fa782d61911579b25363e465bb1f4e9b7e4edb54465a346d52f74dffe5a97",
396
397
  "plugins/src/base/rules/eager/verification.md": "a6cc1d50c5b91080171490edce4d375f136a14790dcbb247ca8b736ad8f55cfd",
@@ -410,6 +411,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
410
411
  "plugins/src/base/rules/reference/dependency-internalization-kit.md": "8c8e9bddbe2165905c3919ae9dd3d131b557cf9c7eb370393dfa85827076c73b",
411
412
  "plugins/src/base/rules/reference/dependency-trust-classes.md": "82216b80d4807e0ad302d04924032cc6a7a95b26f72ea853e378572a5c31821c",
412
413
  "plugins/src/base/rules/reference/derived-branch-plan.md": "672983b5171bf6e377f3d17927fd75e45208ffa6500718c07df1d449ca00f7d0",
414
+ "plugins/src/base/rules/reference/design-source-of-truth.md": "38f477cb0703627ac5daf561a9a1c42bd41be6d20113aba22f30d5e47d573dcf",
413
415
  "plugins/src/base/rules/reference/do-it-now.md": "46fdcc335e115d0f387af398789f443ef8dd3ab17de5f7d95120c31f913a8fce",
414
416
  "plugins/src/base/rules/reference/documentation-source-paths.md": "555155889c9cf279865b9d8fc554bdd461c96a3ec76a5001dfeb361a71056999",
415
417
  "plugins/src/base/rules/reference/empirical-inquiry.md": "8cb166ab9eff4eb30287822a4d7843f76884d70d683d7c61d6a7ffd4ff9f7159",
@@ -439,7 +441,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
439
441
  "plugins/src/base/rules/reference/settled-decisions.md": "6c84f309a1f765eba1648d6ace836387bd96b924f245c16cf3629f501ef6bb18",
440
442
  "plugins/src/base/rules/reference/stale-state-claims.md": "6329e1a7629f9a12f10454c767842aecee4964df8b7bb4aebda9dde3c0959c2a",
441
443
  "plugins/src/base/rules/reference/tool-access-gate.md": "70fcd6cd92dc003a40886b1bef02540e6401f5b70ba97308d42bbbddc0206eab",
442
- "plugins/src/base/rules/reference/tracked-work.md": "85fb31a5d7aad44d04592bb7feea7ad02808eeeb6950639ad452fcec1bc3c86b",
444
+ "plugins/src/base/rules/reference/tracked-work.md": "cc50ea131756d7e9d6d0fdbd35231894fc7d789d68c1dc0e551ae2103845db20",
443
445
  "plugins/src/base/rules/reference/upstream-to-lisa.md": "dcf07f8eba66aaf1d132bfaeff73cbf7576279822893235a3c3f8cbc4a4a3323",
444
446
  "plugins/src/base/rules/reference/usage-accounting.md": "79c00ed4a97c40de72cfccef16b6846ba668fc564354507907876489c038ab75",
445
447
  "plugins/src/base/rules/reference/verification.md": "9ae8db87b37c7700687fabd1b8632b3cddd0f1f1e4b04384c604f88f160056ed",
@@ -453,6 +455,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
453
455
  "plugins/src/base/scripts/automation-status-report.mjs": "520f77645c5b7cab3f69848fb5cf19e8b1d802cd1f8ce6a35aa36a0bf6a0d146",
454
456
  "plugins/src/base/scripts/automation-status-run-history.mjs": "a07f0d1af412f0d2747a9cbe82fa0edbeb8cc8dd4bdf4c51526e779090f08208",
455
457
  "plugins/src/base/scripts/cross-pollinate.mjs": "e9a536389d2581370f6c470b8a070aaae96660646efc528a7ff7fb25d324a903",
458
+ "plugins/src/base/scripts/design-source-gate.mjs": "2c8121404ac6dd71f74a3080561aa6daecb4f719fdd1360622511d35186bc13f",
456
459
  "plugins/src/base/scripts/doctor-report.mjs": "f183e62848ac539da56a525fe2105fc6251a49e555a01dd1bba10d9227b1a6bf",
457
460
  "plugins/src/base/scripts/install-remote-agent-aws.mjs": "5ef1c323d7cbfda8976f6fb0c24f7a8e5f5757475fd1d71c6e5bec91023cebe3",
458
461
  "plugins/src/base/scripts/plugin-sync-explain.mjs": "8592c7359ee6cdb35995a882c8bb27e7b9c404074067fd272c70013e44e04b71",
@@ -510,7 +513,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
510
513
  "plugins/src/base/skills/lisa-github-write-issue/SKILL.md": "f2f9991be42b0fd98f5c3f414d96e8756485c7b56aceb20d7db7f87255cc88e6",
511
514
  "plugins/src/base/skills/lisa-github-write-prd/SKILL.md": "262f8a1bcfad4c5dd4456cfaaf1b71abf9697a0da588966e58ff491acd3c17e8",
512
515
  "plugins/src/base/skills/lisa-health/SKILL.md": "dfdb08a863e78bff42671793dcec29cfae0654db18ebf66a4aa77aeb56ddb775",
513
- "plugins/src/base/skills/lisa-implement/SKILL.md": "7654a80b950e7c970af002bdd1acf5c48fcf449d06b6693ed47e5d6a9a2cfa9d",
516
+ "plugins/src/base/skills/lisa-implement/SKILL.md": "4f25d131a3fb6168a2bbfa9085e048f6662d6ef30f2d9d91b46884d72c427b6f",
514
517
  "plugins/src/base/skills/lisa-improve-code-complexity/SKILL.md": "24ab5b193b409db6ee6bee981a1c0a48d08991782d7846116ad01658c8bc1ae8",
515
518
  "plugins/src/base/skills/lisa-improve-harness/SKILL.md": "98ad4b896785ac51826969a0ff077ef11c51353f2a2e03444c8b38e6c0363d05",
516
519
  "plugins/src/base/skills/lisa-improve-max-lines-per-function/SKILL.md": "95c875950c9848fdaf520a18b9bbb264e33d7347be10170add768e01d9cd8e52",
@@ -589,7 +592,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
589
592
  "plugins/src/base/skills/lisa-qa-clear/SKILL.md": "2a4bbe2501b159eceea289584e50bcceffae2fee5210420d6be3b403dae6d079",
590
593
  "plugins/src/base/skills/lisa-qa-fail/SKILL.md": "cf4bc2b6e3e31a7fabfba5fb9ed1218eb564b0d94113a317267371de7a2708fb",
591
594
  "plugins/src/base/skills/lisa-qa-queue/SKILL.md": "1d5f009f60004bf75b5d79bca370096ce40e1d41d585dc8afd4389f21bba84ae",
592
- "plugins/src/base/skills/lisa-quality-review/SKILL.md": "17ba45f4c4b7877c0b0c9a3c1cc1cb9e18c642ead74ff7263698d8034d3241da",
595
+ "plugins/src/base/skills/lisa-quality-review/SKILL.md": "520437da40257686203468f39b61fbecb2f5c534faaaa488734e828f74c04825",
593
596
  "plugins/src/base/skills/lisa-queue-status/SKILL.md": "87c6d34d0511d4afd812d1af3fee80fa3b7aa47db8449760b12f2699fedc1d78",
594
597
  "plugins/src/base/skills/lisa-remote-dispatch/SKILL.md": "f3c48120a206d01db45f849ca5b61690d572abc16bc36d559a4cacc8f9422c06",
595
598
  "plugins/src/base/skills/lisa-remote-dispatch/scripts/dispatch.mjs": "475963ed64d9e72a6cbd6cbb61c8b57a419f2e1805e3ddfa76066047c590deeb",
@@ -597,7 +600,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
597
600
  "plugins/src/base/skills/lisa-reproduce-bug/SKILL.md": "4d460993fac6021219ca23eee29b1b9afa7c37479dddc662b2fcfaca510edd68",
598
601
  "plugins/src/base/skills/lisa-research/SKILL.md": "9e2e7f3d02a18d9bb34f0b9e8c43d6b9b454d0f81987390839d40a84331b20f7",
599
602
  "plugins/src/base/skills/lisa-review-implementation/SKILL.md": "42134253cca50e384f36eaa085c0a1e6b8772e9f3e912a8d1231f1cd69199858",
600
- "plugins/src/base/skills/lisa-review-local/SKILL.md": "66defe83565ab3633a13e69ce394de64f17f2c2bddbf046bc12c8bbd0ca57f5c",
603
+ "plugins/src/base/skills/lisa-review-local/SKILL.md": "348c4cae5a189e9afa9950899a5bd88674db8265d63a99b5b7a1b616e970e885",
601
604
  "plugins/src/base/skills/lisa-rework-triage/SKILL.md": "56a5549a1430ea791e5edb71144c0741f09970933fe3f7b54a76e3218b9b9042",
602
605
  "plugins/src/base/skills/lisa-root-cause-analysis/SKILL.md": "3fa14217ca36b238ebb8203d18f10eaaf98a3647f949cdada6cb9f56ddf9ed50",
603
606
  "plugins/src/base/skills/lisa-secrets-access/SKILL.md": "042c8ac3e4f299bc8e4f7210253c207c8d2e68b9ed90f6767652390975fd419a",
@@ -648,11 +651,11 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
648
651
  "plugins/src/base/skills/lisa-sync-down/SKILL.md": "c32e6a4e3115ca32b7d335e90d0a73b243c6c631a2d192568423be0cb5944e84",
649
652
  "plugins/src/base/skills/lisa-task-decomposition/SKILL.md": "eb78838e1f121a7a619a841333b1adfce124dad8881853d14107512ead09d30f",
650
653
  "plugins/src/base/skills/lisa-task-triage/SKILL.md": "c6e11b6d195560e6bd7b51fede65c155567c35208801a700a26d95679b03484e",
651
- "plugins/src/base/skills/lisa-tdd-implementation/SKILL.md": "366bcf52a538d4f2ac440dd2e9e6f7cf324450fd3cd03652127ab8c20f584fa9",
654
+ "plugins/src/base/skills/lisa-tdd-implementation/SKILL.md": "8684a31f1982ec3bcf9803ef028bf2aa7a24cefd324ca40b2ac09d07287ecacd",
652
655
  "plugins/src/base/skills/lisa-tear-down-automations/SKILL.md": "3f8215b691ce60a6efd63547b99b4d87760fe99d285f6fe153aaadd451e83731",
653
656
  "plugins/src/base/skills/lisa-test-strategy/SKILL.md": "8976e0056b65475fe69f4ed02c8d0d3ae898fd9ab5ff28bf632981a3293c9f6e",
654
657
  "plugins/src/base/skills/lisa-ticket-triage/SKILL.md": "9d29652fb897568a60da35956f452627a81e57032bbcc3c673ae20dfc8a419f5",
655
- "plugins/src/base/skills/lisa-track/SKILL.md": "35a3fd978c71d40f62849f903ae0291f8b3140354e53ba498ada4ffe4cd586f3",
658
+ "plugins/src/base/skills/lisa-track/SKILL.md": "ff516917ef9387e96758db74372831fd9b9d28991e2a23461cf8661893f2d3b0",
656
659
  "plugins/src/base/skills/lisa-tracker-add-journey/SKILL.md": "a3da2e0350bcdebcdcc05f2d7931af868382638d3a28d09d4718f2f458d4be0a",
657
660
  "plugins/src/base/skills/lisa-tracker-build-intake/SKILL.md": "df50fb88f29eadc66c250e1d7f841472df43ba865930fbbc0bea36bba3380ec3",
658
661
  "plugins/src/base/skills/lisa-tracker-claim/SKILL.md": "481922dba26c4e62ae36193a2e1565860aecf7e344bf5c37b3a0759f42676846",
@@ -660,7 +663,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
660
663
  "plugins/src/base/skills/lisa-tracker-evidence/SKILL.md": "5d844840266dcec7f7e909951de0ac7fb8c4de9b2db405427d61c1be6646a511",
661
664
  "plugins/src/base/skills/lisa-tracker-journey/SKILL.md": "65fe727adfdbcc22141ad009e89cd7d91195600377c5357d552d50ed98ecf66b",
662
665
  "plugins/src/base/skills/lisa-tracker-read/SKILL.md": "2a1047a723193ce999c0d4dc4d205a49f231c724fd812581c78fdef9e8f58b30",
663
- "plugins/src/base/skills/lisa-tracker-source-artifacts/SKILL.md": "dd61d236391e4c2624c1063fb109ef01fbd5fcb9608620cd3c07c8bf6794d0ac",
666
+ "plugins/src/base/skills/lisa-tracker-source-artifacts/SKILL.md": "32d411ae12378c3446d798f60d006b9f9ec0bdf82b86a5f60287766a96541fb3",
664
667
  "plugins/src/base/skills/lisa-tracker-sync/SKILL.md": "fc3951ef79a250cabec5892423de14bfa3cc3b0ebadcfdfbabdec257f67b382a",
665
668
  "plugins/src/base/skills/lisa-tracker-validate/SKILL.md": "1527ee91ae0db42c2551ce579ab25e4daf9e7290df5ad3e77c618c4fd1ed8b16",
666
669
  "plugins/src/base/skills/lisa-tracker-verify/SKILL.md": "552685eb08a76100df64c33f84d2c5f78867f4074e9fa1aa34fa9f905e06da1a",
@@ -2143,6 +2146,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2143
2146
  "plugins/lisa-agy/scripts/automation-status-report.mjs": true,
2144
2147
  "plugins/lisa-agy/scripts/automation-status-run-history.mjs": true,
2145
2148
  "plugins/lisa-agy/scripts/cross-pollinate.mjs": true,
2149
+ "plugins/lisa-agy/scripts/design-source-gate.mjs": true,
2146
2150
  "plugins/lisa-agy/scripts/doctor-report.mjs": true,
2147
2151
  "plugins/lisa-agy/scripts/install-remote-agent-aws.mjs": true,
2148
2152
  "plugins/lisa-agy/scripts/plugin-sync-explain.mjs": true,
@@ -2508,6 +2512,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2508
2512
  "plugins/lisa-copilot/rules/eager/dependency-internalization-kit.md": true,
2509
2513
  "plugins/lisa-copilot/rules/eager/dependency-trust-classes.md": true,
2510
2514
  "plugins/lisa-copilot/rules/eager/derived-branch-plan.md": true,
2515
+ "plugins/lisa-copilot/rules/eager/design-source-of-truth.md": true,
2511
2516
  "plugins/lisa-copilot/rules/eager/do-it-now.md": true,
2512
2517
  "plugins/lisa-copilot/rules/eager/documentation-source-paths.md": true,
2513
2518
  "plugins/lisa-copilot/rules/eager/empirical-inquiry.md": true,
@@ -2557,6 +2562,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2557
2562
  "plugins/lisa-copilot/rules/reference/dependency-internalization-kit.md": true,
2558
2563
  "plugins/lisa-copilot/rules/reference/dependency-trust-classes.md": true,
2559
2564
  "plugins/lisa-copilot/rules/reference/derived-branch-plan.md": true,
2565
+ "plugins/lisa-copilot/rules/reference/design-source-of-truth.md": true,
2560
2566
  "plugins/lisa-copilot/rules/reference/do-it-now.md": true,
2561
2567
  "plugins/lisa-copilot/rules/reference/documentation-source-paths.md": true,
2562
2568
  "plugins/lisa-copilot/rules/reference/empirical-inquiry.md": true,
@@ -2600,6 +2606,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2600
2606
  "plugins/lisa-copilot/scripts/automation-status-report.mjs": true,
2601
2607
  "plugins/lisa-copilot/scripts/automation-status-run-history.mjs": true,
2602
2608
  "plugins/lisa-copilot/scripts/cross-pollinate.mjs": true,
2609
+ "plugins/lisa-copilot/scripts/design-source-gate.mjs": true,
2603
2610
  "plugins/lisa-copilot/scripts/doctor-report.mjs": true,
2604
2611
  "plugins/lisa-copilot/scripts/install-remote-agent-aws.mjs": true,
2605
2612
  "plugins/lisa-copilot/scripts/plugin-sync-explain.mjs": true,
@@ -2965,6 +2972,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
2965
2972
  "plugins/lisa-cursor/rules/dependency-trust-classes.mdc": true,
2966
2973
  "plugins/lisa-cursor/rules/derived-branch-plan-reference.mdc": true,
2967
2974
  "plugins/lisa-cursor/rules/derived-branch-plan.mdc": true,
2975
+ "plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc": true,
2976
+ "plugins/lisa-cursor/rules/design-source-of-truth.mdc": true,
2968
2977
  "plugins/lisa-cursor/rules/do-it-now-reference.mdc": true,
2969
2978
  "plugins/lisa-cursor/rules/do-it-now.mdc": true,
2970
2979
  "plugins/lisa-cursor/rules/documentation-source-paths-reference.mdc": true,
@@ -3043,6 +3052,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
3043
3052
  "plugins/lisa-cursor/scripts/automation-status-report.mjs": true,
3044
3053
  "plugins/lisa-cursor/scripts/automation-status-run-history.mjs": true,
3045
3054
  "plugins/lisa-cursor/scripts/cross-pollinate.mjs": true,
3055
+ "plugins/lisa-cursor/scripts/design-source-gate.mjs": true,
3046
3056
  "plugins/lisa-cursor/scripts/doctor-report.mjs": true,
3047
3057
  "plugins/lisa-cursor/scripts/install-remote-agent-aws.mjs": true,
3048
3058
  "plugins/lisa-cursor/scripts/plugin-sync-explain.mjs": true,
@@ -5484,6 +5494,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5484
5494
  "plugins/lisa/rules/eager/dependency-internalization-kit.md": true,
5485
5495
  "plugins/lisa/rules/eager/dependency-trust-classes.md": true,
5486
5496
  "plugins/lisa/rules/eager/derived-branch-plan.md": true,
5497
+ "plugins/lisa/rules/eager/design-source-of-truth.md": true,
5487
5498
  "plugins/lisa/rules/eager/do-it-now.md": true,
5488
5499
  "plugins/lisa/rules/eager/documentation-source-paths.md": true,
5489
5500
  "plugins/lisa/rules/eager/empirical-inquiry.md": true,
@@ -5533,6 +5544,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5533
5544
  "plugins/lisa/rules/reference/dependency-internalization-kit.md": true,
5534
5545
  "plugins/lisa/rules/reference/dependency-trust-classes.md": true,
5535
5546
  "plugins/lisa/rules/reference/derived-branch-plan.md": true,
5547
+ "plugins/lisa/rules/reference/design-source-of-truth.md": true,
5536
5548
  "plugins/lisa/rules/reference/do-it-now.md": true,
5537
5549
  "plugins/lisa/rules/reference/documentation-source-paths.md": true,
5538
5550
  "plugins/lisa/rules/reference/empirical-inquiry.md": true,
@@ -5576,6 +5588,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
5576
5588
  "plugins/lisa/scripts/automation-status-report.mjs": true,
5577
5589
  "plugins/lisa/scripts/automation-status-run-history.mjs": true,
5578
5590
  "plugins/lisa/scripts/cross-pollinate.mjs": true,
5591
+ "plugins/lisa/scripts/design-source-gate.mjs": true,
5579
5592
  "plugins/lisa/scripts/doctor-report.mjs": true,
5580
5593
  "plugins/lisa/scripts/install-remote-agent-aws.mjs": true,
5581
5594
  "plugins/lisa/scripts/plugin-sync-explain.mjs": true,
@@ -6107,6 +6120,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6107
6120
  "plugins/src/base/rules/eager/dependency-internalization-kit.md": true,
6108
6121
  "plugins/src/base/rules/eager/dependency-trust-classes.md": true,
6109
6122
  "plugins/src/base/rules/eager/derived-branch-plan.md": true,
6123
+ "plugins/src/base/rules/eager/design-source-of-truth.md": true,
6110
6124
  "plugins/src/base/rules/eager/do-it-now.md": true,
6111
6125
  "plugins/src/base/rules/eager/documentation-source-paths.md": true,
6112
6126
  "plugins/src/base/rules/eager/empirical-inquiry.md": true,
@@ -6156,6 +6170,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6156
6170
  "plugins/src/base/rules/reference/dependency-internalization-kit.md": true,
6157
6171
  "plugins/src/base/rules/reference/dependency-trust-classes.md": true,
6158
6172
  "plugins/src/base/rules/reference/derived-branch-plan.md": true,
6173
+ "plugins/src/base/rules/reference/design-source-of-truth.md": true,
6159
6174
  "plugins/src/base/rules/reference/do-it-now.md": true,
6160
6175
  "plugins/src/base/rules/reference/documentation-source-paths.md": true,
6161
6176
  "plugins/src/base/rules/reference/empirical-inquiry.md": true,
@@ -6199,6 +6214,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6199
6214
  "plugins/src/base/scripts/automation-status-report.mjs": true,
6200
6215
  "plugins/src/base/scripts/automation-status-run-history.mjs": true,
6201
6216
  "plugins/src/base/scripts/cross-pollinate.mjs": true,
6217
+ "plugins/src/base/scripts/design-source-gate.mjs": true,
6202
6218
  "plugins/src/base/scripts/doctor-report.mjs": true,
6203
6219
  "plugins/src/base/scripts/install-remote-agent-aws.mjs": true,
6204
6220
  "plugins/src/base/scripts/plugin-sync-explain.mjs": true,
@@ -7440,6 +7456,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7440
7456
  "tests/unit/codex/agent-installer.test.ts": true,
7441
7457
  "tests/unit/codex/agent-transformer.test.ts": true,
7442
7458
  "tests/unit/codex/agents-md-installer.test.ts": true,
7459
+ "tests/unit/codex/block-no-verify-codex.test.ts": true,
7443
7460
  "tests/unit/codex/block-suppress-directives.test.ts": true,
7444
7461
  "tests/unit/codex/build-byte-stable.test.ts": true,
7445
7462
  "tests/unit/codex/codex-edit-hooks.test.ts": true,
@@ -7786,6 +7803,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7786
7803
  "tests/unit/strategies/dependency-ownership-parity.test.ts": true,
7787
7804
  "tests/unit/strategies/dependency-trust-classes-rule-pair.test.ts": true,
7788
7805
  "tests/unit/strategies/derived-branch-plan-contract.test.ts": true,
7806
+ "tests/unit/strategies/design-source-gate-fixtures.ts": true,
7807
+ "tests/unit/strategies/design-source-gate-verdict.test.ts": true,
7808
+ "tests/unit/strategies/design-source-gate.test.ts": true,
7809
+ "tests/unit/strategies/design-source-of-truth-rule.test.ts": true,
7789
7810
  "tests/unit/strategies/distributed-content-round2-contract.test.ts": true,
7790
7811
  "tests/unit/strategies/doctor-automation-readiness.test.ts": true,
7791
7812
  "tests/unit/strategies/doctor-config-readiness.test.ts": true,