@codyswann/lisa 2.291.0 → 2.293.0

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 (82) hide show
  1. package/all/copy-overwrite/scripts/lisa-work-item.mjs +64 -3
  2. package/all/merge/.claude/settings.json +1 -1
  3. package/cdk/merge/.claude/settings.json +1 -1
  4. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.js +16 -13
  6. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  7. package/dist/opencode/plugin-templates/parity-safety-net.sh +340 -35
  8. package/expo/merge/.claude/settings.json +1 -1
  9. package/harper-fabric/merge/.claude/settings.json +1 -1
  10. package/nestjs/merge/.claude/settings.json +1 -1
  11. package/package.json +1 -1
  12. package/phaser/merge/.claude/settings.json +1 -1
  13. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  15. package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +1 -1
  16. package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/SKILL.md +46 -5
  17. package/plugins/lisa/hooks/parity-safety-net.sh +340 -35
  18. package/plugins/lisa/skills/lisa-implement/SKILL.md +1 -1
  19. package/plugins/lisa/skills/lisa-parity-safety-net-rules/SKILL.md +46 -5
  20. package/plugins/lisa-agy/hooks/parity-safety-net.sh +340 -35
  21. package/plugins/lisa-agy/plugin.json +1 -1
  22. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +1 -1
  23. package/plugins/lisa-agy/skills/lisa-parity-safety-net-rules/SKILL.md +46 -5
  24. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  27. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +340 -35
  31. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +1 -1
  32. package/plugins/lisa-copilot/skills/lisa-parity-safety-net-rules/SKILL.md +46 -5
  33. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +340 -35
  35. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +1 -1
  36. package/plugins/lisa-cursor/skills/lisa-parity-safety-net-rules/SKILL.md +46 -5
  37. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-expo-agy/plugin.json +1 -1
  40. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  45. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  50. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  55. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  60. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails-agy/plugin.json +1 -1
  65. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  70. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  75. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/src/base/hooks/parity-safety-net.sh +340 -35
  78. package/plugins/src/base/skills/lisa-implement/SKILL.md +1 -1
  79. package/plugins/src/base/skills/lisa-parity-safety-net-rules/SKILL.md +46 -5
  80. package/rails/merge/.claude/settings.json +1 -1
  81. package/scripts/install-claude-plugins.sh +9 -6
  82. package/typescript/merge/.claude/settings.json +1 -1
@@ -76,6 +76,26 @@ function currentBranch() {
76
76
  return git(["branch", "--show-current"]);
77
77
  }
78
78
 
79
+ /**
80
+ * Branch an in-progress rebase is rewriting, or empty when no rebase is in
81
+ * progress. During a rebase HEAD is detached, but git records the branch being
82
+ * rebased in `<rebase-state-dir>/head-name` (issue #1956) — resolved via
83
+ * `git rev-parse --git-path` so linked worktrees find their private state dir.
84
+ */
85
+ function rebaseBranch() {
86
+ for (const stateDir of ["rebase-merge", "rebase-apply"]) {
87
+ const file = resolve(
88
+ git(["rev-parse", "--git-path", `${stateDir}/head-name`])
89
+ );
90
+ if (!existsSync(file)) continue;
91
+ const headName = readFileSync(file, "utf8").trim();
92
+ if (headName.startsWith("refs/heads/")) {
93
+ return headName.slice("refs/heads/".length);
94
+ }
95
+ }
96
+ return "";
97
+ }
98
+
79
99
  function deepMerge(base, override) {
80
100
  if (Array.isArray(base) || Array.isArray(override)) return override;
81
101
  if (
@@ -301,7 +321,11 @@ function readState(optional = true) {
301
321
  }
302
322
 
303
323
  function assertStateBranch(state) {
304
- const branch = currentBranch();
324
+ // Mid-rebase HEAD is detached, but the binding must validate against the
325
+ // branch the rebase is rewriting (its head-name) so rebase picks and
326
+ // `git rebase --continue` commits are not wedged (issue #1956). A detached
327
+ // HEAD with NO rebase in progress still fails closed below.
328
+ const branch = currentBranch() || rebaseBranch();
305
329
  if (!branch)
306
330
  throw new TrackingError(
307
331
  "Cannot use a work-item binding from detached HEAD"
@@ -888,15 +912,52 @@ function validateCommits(commits) {
888
912
  };
889
913
  }
890
914
 
915
+ /**
916
+ * Fully qualified remote default-branch ref (e.g. refs/remotes/origin/main),
917
+ * or undefined when it cannot be resolved offline. Reads the LOCAL
918
+ * `refs/remotes/<remote>/HEAD` symref only — never the network. Resolution
919
+ * failure means the exclusion is skipped (fail-safe strict, issue #1956).
920
+ * Security: only the remote DEFAULT branch is ever excluded — never
921
+ * `--remotes=<remote>`, whose ref set includes the branch being (force-)pushed
922
+ * and would let a pusher exempt arbitrary commits.
923
+ */
924
+ function remoteDefaultRef(remote) {
925
+ const symref = run(
926
+ "git",
927
+ ["symbolic-ref", "--quiet", `refs/remotes/${remote}/HEAD`],
928
+ { allowFailure: true }
929
+ );
930
+ if (symref.status !== 0) return undefined;
931
+ const target = symref.stdout.trim();
932
+ if (!target.startsWith(`refs/remotes/${remote}/`)) return undefined;
933
+ const exists = run("git", ["rev-parse", "-q", "--verify", target], {
934
+ allowFailure: true,
935
+ });
936
+ return exists.status === 0 ? target : undefined;
937
+ }
938
+
891
939
  function parsePushLines(input, remote) {
892
940
  const commits = [];
941
+ // Commits already reachable from the remote default branch are the base's
942
+ // history (a merge-sync brings them along); excluding them keeps validation
943
+ // scoped to branch-authored commits (issue #1956).
944
+ const defaultRef = remoteDefaultRef(remote);
893
945
  for (const line of input.trim().split(/\r?\n/).filter(Boolean)) {
894
946
  const [, localOid, , remoteOid] = line.trim().split(/\s+/);
895
947
  if (!localOid || ZERO_OID.test(localOid)) continue;
896
948
  const args =
897
949
  remoteOid && !ZERO_OID.test(remoteOid)
898
- ? ["rev-list", `${remoteOid}..${localOid}`]
899
- : ["rev-list", localOid, "--not", `--remotes=${remote}`];
950
+ ? [
951
+ "rev-list",
952
+ `${remoteOid}..${localOid}`,
953
+ ...(defaultRef ? ["--not", defaultRef] : []),
954
+ ]
955
+ : // New-branch lane: `--remotes=<remote>` is safe HERE because the branch
956
+ // being pushed has no remote-tracking ref yet — the exclusion set can
957
+ // only contain refs that already passed validation on earlier pushes.
958
+ // The existing-branch lane above must NOT use it (its tracking ref is
959
+ // pusher-controlled); it excludes only the remote default branch.
960
+ ["rev-list", localOid, "--not", `--remotes=${remote}`];
900
961
  commits.push(...git(args).split("\n").filter(Boolean));
901
962
  }
902
963
  if (commits.length === 0 && input.trim() === "") {
@@ -5,7 +5,7 @@
5
5
  },
6
6
  "enabledPlugins": {
7
7
  "lisa@lisa": true,
8
- "safety-net@cc-marketplace": true,
8
+ "safety-net@cc-marketplace": false,
9
9
  "code-simplifier@claude-plugins-official": true,
10
10
  "code-review@claude-plugins-official": true,
11
11
  "coderabbit@claude-plugins-official": true,
@@ -5,7 +5,7 @@
5
5
  },
6
6
  "enabledPlugins": {
7
7
  "typescript-lsp@claude-plugins-official": true,
8
- "safety-net@cc-marketplace": true,
8
+ "safety-net@cc-marketplace": false,
9
9
  "code-simplifier@claude-plugins-official": true,
10
10
  "code-review@claude-plugins-official": true,
11
11
  "coderabbit@claude-plugins-official": true,
@@ -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,CA4hEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAsvMjE,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,CA4hEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAyvMjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -2,7 +2,7 @@
2
2
  /** Generated by scripts/generate-upstream-evidence-manifest.mjs. Do not edit. */
3
3
  export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
4
4
  "all/copy-contents/gitignore": "06b56376465d5421db55d0b04958bbc79fdbf33b42f0559fe5ef6875ced1160f",
5
- "all/copy-overwrite/scripts/lisa-work-item.mjs": "4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
5
+ "all/copy-overwrite/scripts/lisa-work-item.mjs": "e41e9534988ce69a836664437a78f3a3f3dc7ebbe396c86cdab0ea63fb7c19da",
6
6
  "all/create-only/.claude/rules/PROJECT_RULES.md": "6e1c7923ad2a15356babc60c97e7f97be728d790af285b6a7cd7d1b4d39cd97f",
7
7
  "all/create-only/.lisaignore": "3c9827e7e98daa46510b5357cd6dd9406da1821e64cc46d2eea9f311cd6d06b9",
8
8
  "all/create-only/scripts/remote-agent-aws-setup.sh": "7677908a345891810d2104ba8b2fd1a8318bb29c408fb5ce0110d57beef9b556",
@@ -11,7 +11,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
11
11
  "all/github-rulesets/base.json": "58b9606f185cdca8b17218829aac333b7d8c08f0f2b4f86d7e360f7be1de4787",
12
12
  "all/github-rulesets/prevent-delete.json": "e4fb26390a8bfee34b27be5b369f376a1a9a00b797fd8d3ce51cb71facb826a4",
13
13
  "all/github-rulesets/protect-tags.json": "387f824e3ea58a803223e42e08326504a39e6a7a0c650a0bbfdfb4653854b722",
14
- "all/merge/.claude/settings.json": "f53702d4a1af4f3bd45082ca8bd9645591f77e1743025bf617cd6b7a699a064b",
14
+ "all/merge/.claude/settings.json": "1d4a4d33d4a5f26a33560df21f9ad9ba97511c15a1c952dd2fe941679a0f1f9e",
15
15
  "cdk/copy-overwrite/.github/workflows/.keep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
16
16
  "cdk/copy-overwrite/eslint.cdk.ts": "074fe7a638ed95210339a9215abf75fa52bb10e678f2fd58523ff8a9d32ea4b6",
17
17
  "cdk/copy-overwrite/eslint.config.ts": "f1917ade3f1170ac8027110b44499732b9d9d3a2d42f256e37cd09930970298c",
@@ -29,7 +29,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
29
29
  "cdk/create-only/vitest.config.local.ts": "476738b351114a0efbcd3ae4ce1cf016307b55ee41ed8e87c35e28e4639d98f5",
30
30
  "cdk/create-only/vitest.thresholds.json": "ce04fe30ad6139f734dbc56d92a801c11cfd86a0d9e49c06c1c2d0a137beeffd",
31
31
  "cdk/deletions.json": "b1d07e463f52deaa5f9958060de40d369f4f256b898563efb83911abf39a62a5",
32
- "cdk/merge/.claude/settings.json": "d590b3d3c1cd639fa6316f75e1a7fe477acbe27705b3e41e950cf13fa618f175",
32
+ "cdk/merge/.claude/settings.json": "6f938fdc9c808ee4dda9d605815788dda384197065aac6793c7549d8811a6224",
33
33
  "cdk/merge/.oxlintrc.json": "e74885a33fdb7b5d565e13ebd781a3dd2fd02409a2a059deed851645630a6985",
34
34
  "cdk/package-lisa/package.lisa.json": "8ab146a3323f970c3a8aafb8d78d17e8b2c121bf24e2a7d4ba07a75485176869",
35
35
  "eslint-plugin-code-organization/README.md": "7943820d0b301041f764d4b33adc3c8afbd5bf08f800989390233e78962a51de",
@@ -90,7 +90,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
90
90
  "expo/create-only/tsconfig.local.json": "dad4b4a00c890ce8c30db87ad3f8e92e2273e31c2c2a6436d0ab327b47f72758",
91
91
  "expo/deletions.json": "ddf6330d4f5d961c55e908efcc5d71c4c78410525018b096702b9a53906b946e",
92
92
  "expo/github-rulesets/playwright.json": "b57ccd12f768a1466a9681528858e59764bd0efedcbcb3a96c2fb40719bbd579",
93
- "expo/merge/.claude/settings.json": "38afc4841039f05be92303cfd7ed36b600d4af5af2fd07335542b5ceeda29147",
93
+ "expo/merge/.claude/settings.json": "e97b33d7ad86b71abba94ab957d725e34c3cafca455e92fba0b29ebabc3b73d1",
94
94
  "expo/merge/.oxlintrc.json": "2a0ea2191abd5b377aed4b525a4a97d3eefb1d9e41c845c02ee0daac75df6b1f",
95
95
  "expo/package-lisa/package.lisa.json": "bd2a5220b83c55f777c24fccf07f58bb277b526edc31a472232a8f34a8cfedd2",
96
96
  "harper-fabric/copy-contents/.prettierignore": "478c782f4c5611187e21584dfd5522e37fc636c5eb03394fea3db45321c6712c",
@@ -111,7 +111,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
111
111
  "harper-fabric/create-only/.zap/baseline.conf": "68aae4b1b9b5b7253b5aeb792d72b58f64e5eda1dcf8f3062bd9d77494a5a22f",
112
112
  "harper-fabric/create-only/scripts/zap-baseline.sh": "da139276b637080f9877362ce6f9667c1ffd57c9d18ec851999ce4328f309577",
113
113
  "harper-fabric/deletions.json": "383e5a6e1f8c77376b7e20f936543418204a1c632212d1fd393962e03cf40c52",
114
- "harper-fabric/merge/.claude/settings.json": "f376c8083e1ec7595c99b23c737cf643906b05792581425790e274400f925977",
114
+ "harper-fabric/merge/.claude/settings.json": "278c48f1af3a6aa23b7f5dcf55aa0d2737baf809942b1d4ef6831cdfc144581a",
115
115
  "harper-fabric/merge/.oxlintrc.json": "43bd2a48954e15fbd1fe89b1a4f7b84cf93706d7de7b84ec120d63906bfde31b",
116
116
  "harper-fabric/package-lisa/package.lisa.json": "4672b147ff12d0af80516b9c824aa9419b05da1308531d978ea285ae4e3c2b23",
117
117
  "nestjs/copy-overwrite/eslint.config.ts": "b44532acdaa1deaab29dcc2171a615242fb26565f538bdb38d8e33dd5a15cd01",
@@ -154,7 +154,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
154
154
  "nestjs/create-only/vitest.config.local.ts": "476738b351114a0efbcd3ae4ce1cf016307b55ee41ed8e87c35e28e4639d98f5",
155
155
  "nestjs/create-only/vitest.thresholds.json": "ce04fe30ad6139f734dbc56d92a801c11cfd86a0d9e49c06c1c2d0a137beeffd",
156
156
  "nestjs/deletions.json": "037a64f96b76670326bc61921f4484e864e02c09786adabbd1cfdf886183cad5",
157
- "nestjs/merge/.claude/settings.json": "4f9d9440fd208520c4be96edde19e84160f25e3bba3ac9505d95b7653ad34666",
157
+ "nestjs/merge/.claude/settings.json": "d0ce50361a1f3868d15728646e66b9e1cdb8373688eb22459adbdb176e342aca",
158
158
  "nestjs/merge/.oxlintrc.json": "3743a1e2bcfc879f5250f35206f413b10815f34e20b1d0afce67824579813b5d",
159
159
  "nestjs/package-lisa/package.lisa.json": "2ef6fdb6751fcbfbb09d834104159111e4efef0938eca2c11e44539805c005e6",
160
160
  "npm-package/create-only/.github/workflows/publish-to-npm.yml": "c21af3c31626abfe4dcbfdd42917f7e01753045a1ba6eba87b014e7f8c18db10",
@@ -183,7 +183,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
183
183
  "phaser/create-only/tsconfig.local.json": "aec26141fe80709ab19fbfb5dda945e59f8f9d718d5cfcb023ad48f0eead88f5",
184
184
  "phaser/create-only/wiki/lisa-wiki.config.json": "d4e92ffad7f4f3a9ebae39f7e4bd2c4f5df21039767558193c562077084b0db6",
185
185
  "phaser/deletions.json": "383e5a6e1f8c77376b7e20f936543418204a1c632212d1fd393962e03cf40c52",
186
- "phaser/merge/.claude/settings.json": "13336547df466d2aa4600aaf025d813c0189709776c8ed16de4f30e80be1ca63",
186
+ "phaser/merge/.claude/settings.json": "296b8d5e3c197cd4526a99454aee1dc7f5ce9a25a729a957f392b71be3e8cfb6",
187
187
  "phaser/merge/.oxlintrc.json": "4ac4bca00bef4b32810f3759a914ab2b8148e6fad3e329417a497e36df9e810c",
188
188
  "phaser/package-lisa/package.lisa.json": "2e01b1ec402f6804a54402e22d02d63f1aa96d3f698e171885b0fff6eb25b271",
189
189
  "plugins/src/base/agents/architecture-specialist.md": "5bbe86bd3a7661021f7c8e9c5396fa4c0f3b8a77606e7be868fb9a0e117d424d",
@@ -294,7 +294,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
294
294
  "plugins/src/base/hooks/install-pkgs.sh": "e9a13faba849a277410dde911ab102ee6f88ef915b33571bb1d4eef904172db5",
295
295
  "plugins/src/base/hooks/parity-safety-net-heredoc.py": "c5301958ed8ca29b0de7b8521d299cdbc8c1c402df8d8fada6b5f173b6cf5dbe",
296
296
  "plugins/src/base/hooks/parity-safety-net.agy.sh": "ce9bd2b4566ad9147e4ace56434cffbbe87edb4ccbb57549ab3fd9f4c671ced4",
297
- "plugins/src/base/hooks/parity-safety-net.sh": "388cf8847581d96a1ff8ea98290a33a5f96d67cdd502ea807a0b8d88efe90e19",
297
+ "plugins/src/base/hooks/parity-safety-net.sh": "b83c5043a0f29b2d8851258acfe6906aab7922cd80f486e25220e55f26a8c0a5",
298
298
  "plugins/src/base/hooks/setup-jira-cli.sh": "a675f6b17ce7f0d6b9fb7daeba6d2bc59bcb48ef79b034076ea73b2b1e72ee09",
299
299
  "plugins/src/base/hooks/shell-write-nudge.sh": "69839af423f8792b1e52c71097316c3264425553031627c0a2f9409a9d5becd0",
300
300
  "plugins/src/base/hooks/threshold-ratchet-compare.mjs": "8bc4b379d7057b2fecf9cb35820c39efad0a65df7df49073786f996cc2a74810",
@@ -426,7 +426,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
426
426
  "plugins/src/base/skills/lisa-github-write-issue/SKILL.md": "ee54b3d14cc5dd3a68a8c36590102dd02f49334c9493ad52fa8c7f35157073b1",
427
427
  "plugins/src/base/skills/lisa-github-write-prd/SKILL.md": "bc919c52e2f42129d41a3f40279d2def99486ec58bed2dab51ca7166b427a947",
428
428
  "plugins/src/base/skills/lisa-health/SKILL.md": "dfdb08a863e78bff42671793dcec29cfae0654db18ebf66a4aa77aeb56ddb775",
429
- "plugins/src/base/skills/lisa-implement/SKILL.md": "6271b8c4dd34efb630020a63e03d8df813d4faccb81517dfb3637ef2433d968d",
429
+ "plugins/src/base/skills/lisa-implement/SKILL.md": "cb3a0587907321301e6662480af0d333aee4a3e0d29e9bdc851c225be2c220d7",
430
430
  "plugins/src/base/skills/lisa-improve-code-complexity/SKILL.md": "24ab5b193b409db6ee6bee981a1c0a48d08991782d7846116ad01658c8bc1ae8",
431
431
  "plugins/src/base/skills/lisa-improve-harness/SKILL.md": "bafda5d2f9b86c48cd16bf0015528fdf5891675221d662fdc533aaad66aad669",
432
432
  "plugins/src/base/skills/lisa-improve-max-lines-per-function/SKILL.md": "95c875950c9848fdaf520a18b9bbb264e33d7347be10170add768e01d9cd8e52",
@@ -480,7 +480,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
480
480
  "plugins/src/base/skills/lisa-parity-code-review/SKILL.md": "5805254747c4ed9081fd514236f06e078be86d41694bf74b480bf7592cd58c1f",
481
481
  "plugins/src/base/skills/lisa-parity-code-simplifier/SKILL.md": "c721ae772e73abff633c43d93267066afac188e911a77322fbb102db673849d7",
482
482
  "plugins/src/base/skills/lisa-parity-coderabbit/SKILL.md": "ae882837d43741293d1b639c4516331fa6124fa1f5da234a74ecb31c5d7e52cd",
483
- "plugins/src/base/skills/lisa-parity-safety-net-rules/SKILL.md": "7126b7dbda7205922a7825eba47164954267ff65ef9f414182aab51889b9a7d8",
483
+ "plugins/src/base/skills/lisa-parity-safety-net-rules/SKILL.md": "2515b016f3a1c80163aaf097c3f530e884e59e2070d072a6cb5c7b9d2658c946",
484
484
  "plugins/src/base/skills/lisa-parity-sentry-sdk-setup/SKILL.md": "ed52b0273f6b535d26d561c80ae6c0bedb84c67fcf4321f688c05fe3ee3af575",
485
485
  "plugins/src/base/skills/lisa-parity-sentry-seer/SKILL.md": "f44216fa7c8f0c3c3371c65ff73bbeadd1717579502a5603f16b3b33291cab7a",
486
486
  "plugins/src/base/skills/lisa-parity-skill-creator/SKILL.md": "616e0493f75fe92c18137548d7c86a91a9b04d9844ca76fa3f14156e3e7814e5",
@@ -909,7 +909,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
909
909
  "rails/create-only/spec/spec_helper.rb": "4308dcddf2ee1b65986ff206a0feac62c8e3a1cae842b115fd2945b7563ed9cd",
910
910
  "rails/deletions.json": "eeadf9a2b1677913199a235091a8d6190477f3e2a5fd598d62cf658cb59a8099",
911
911
  "rails/github-rulesets/quality-checks.json": "ea42f2bb938881bc6ec129e7300a2b824313951031d4720f46e944c4dfe1a9da",
912
- "rails/merge/.claude/settings.json": "37a06617452435eec44afdd430c0375d14ad59458ddd48bf6c1115315748acb5",
912
+ "rails/merge/.claude/settings.json": "9c49f8c7c453f8749c90def3e22d412c3345c533d24b30dc7745ffa052ad6fa1",
913
913
  "scripts/build-plugins.sh": "d26321ea10bc3ed8cf096f900622cb4cf7a37117fabf9730f0fe5c9d949582fc",
914
914
  "scripts/check-duplicate-versions.mjs": "84d97e94eb834522848ddce951bb54ae9da1e4be252e2c51fed0c01c4f4d6b72",
915
915
  "scripts/check-learnings-budget.ts": "007430c2d6938efcc79ccbfd5717ebe2c7cf66b4de9a21a3e67b8db7f3600349",
@@ -933,7 +933,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
933
933
  "scripts/generate-cursor-plugin-artifacts.mjs": "d8806197a723f0c2b50a8155ffc5b6f0abc30c68dc2385cb80b0dd066d061231",
934
934
  "scripts/generate-upstream-evidence-manifest.mjs": "3fda910de51aa51def6c7cee276c471cc50cb7cb72478bee5495341d67409a97",
935
935
  "scripts/github-status-check.sh": "876914c369c5bd58f4a5f3c41d0c1264c6923f329a644f90640d15b434a0fbd1",
936
- "scripts/install-claude-plugins.sh": "2fcee140e86bcc213a6959b4b0eae533cc102c91948d47fe87e62cb29f795ed1",
936
+ "scripts/install-claude-plugins.sh": "5f4bedb983900dc17f8843f73876fc7c445909eb12792b3330728ff03842f50b",
937
937
  "scripts/internal-agy-skill-policy.json": "c2ce87d2eeebfdc9f24d6486425c010cf9289376f8a459f4767ca22d2bf8670d",
938
938
  "scripts/internal-codex-skill-policy.json": "d7191650d8a12727549b67df61dbfa61e16cfb9cc31e461cd98d253ceab1612a",
939
939
  "scripts/internal-copilot-runtime-probe.json": "06809c5a470ebd0588512ca42776c2079eae46a862b910e4cd7e893ab51c1214",
@@ -1033,7 +1033,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1033
1033
  "typescript/create-only/vitest.thresholds.json": "ce04fe30ad6139f734dbc56d92a801c11cfd86a0d9e49c06c1c2d0a137beeffd",
1034
1034
  "typescript/deletions.json": "fe5f44b7a02148eacc429782e948b1c4aee302d1d56524cc16adec5489bbc308",
1035
1035
  "typescript/github-rulesets/quality-checks.json": "89b9e09267cdb65865728d0e873de9c1225b8ca796e67f06fa8b72ccf6d4515e",
1036
- "typescript/merge/.claude/settings.json": "bad82c215aca3102e1fd41cce7205b59029c74cfce0f416ce0a95177fc2b0c54",
1036
+ "typescript/merge/.claude/settings.json": "834e6456cae81f45073bbbb08bf731fef043efb30cae2658cb4a59f17e66d165",
1037
1037
  "typescript/merge/.oxlintrc.json": "4debc093acfd263eb81ae15894073ebf098513204f45f40b83fb8fa5353fa1f8",
1038
1038
  "typescript/package-lisa/package.lisa.json": "7e99286c549c79b1c02c07a4313dcfe5b41b4ebb80a6fbbb8741dd74dc5f454d",
1039
1039
  "ui/README.md": "deeb35e767ea5dd2883268835ea3ad21cbad9fa63ec8d8ff5e200f0e2a7d2751",
@@ -6648,6 +6648,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6648
6648
  "tests/fixtures/wiki-safety/redaction-source.md": true,
6649
6649
  "tests/helpers/__fixtures__/wiki-status-fixture.ts": true,
6650
6650
  "tests/helpers/readiness-workflow-fixtures.ts": true,
6651
+ "tests/helpers/safety-net-guard-fixtures.ts": true,
6652
+ "tests/helpers/safety-net-guard-harness.ts": true,
6651
6653
  "tests/helpers/test-utils.ts": true,
6652
6654
  "tests/helpers/verification-gate-fixtures.ts": true,
6653
6655
  "tests/helpers/verification-gate-harness.ts": true,
@@ -6853,6 +6855,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6853
6855
  "tests/unit/hooks/inject-rules.test.ts": true,
6854
6856
  "tests/unit/hooks/install-pkgs-worktree-node-modules.test.ts": true,
6855
6857
  "tests/unit/hooks/lint-on-edit.test.ts": true,
6858
+ "tests/unit/hooks/parity-safety-net-guards.test.ts": true,
6856
6859
  "tests/unit/hooks/parity-safety-net-heredoc.test.ts": true,
6857
6860
  "tests/unit/hooks/parity-safety-net.test.ts": true,
6858
6861
  "tests/unit/hooks/post-checkout.test.ts": true,