@codyswann/lisa 2.323.1 → 2.324.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 (102) hide show
  1. package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +71 -0
  2. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +102 -0
  3. package/all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh +220 -0
  4. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +562 -0
  5. package/all/copy-overwrite/scripts/lisa-work-item.mjs +77 -5
  6. package/all/merge/.claude/settings.json +19 -4
  7. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  8. package/dist/core/upstream-evidence-manifest.js +25 -11
  9. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  10. package/dist/standards/git-state.d.ts.map +1 -1
  11. package/dist/standards/git-state.js +10 -1
  12. package/dist/standards/git-state.js.map +1 -1
  13. package/dist/strategies/package-lisa.d.ts.map +1 -1
  14. package/dist/strategies/package-lisa.js +67 -2
  15. package/dist/strategies/package-lisa.js.map +1 -1
  16. package/package.json +1 -1
  17. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +24 -0
  20. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/session-start.sh +17 -0
  21. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +37 -0
  22. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/toolchain.mjs +7 -3
  23. package/plugins/lisa/rules/eager/tracked-work.md +1 -1
  24. package/plugins/lisa/rules/reference/tracked-work.md +1 -1
  25. package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +24 -0
  26. package/plugins/lisa/skills/lisa-setup-remote-env/assets/session-start.sh +17 -0
  27. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +37 -0
  28. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/toolchain.mjs +7 -3
  29. package/plugins/lisa-agy/plugin.json +1 -1
  30. package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +24 -0
  31. package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/session-start.sh +17 -0
  32. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +37 -0
  33. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/toolchain.mjs +7 -3
  34. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  37. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
  41. package/plugins/lisa-copilot/rules/reference/tracked-work.md +1 -1
  42. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +24 -0
  43. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/session-start.sh +17 -0
  44. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +37 -0
  45. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/toolchain.mjs +7 -3
  46. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-cursor/rules/tracked-work-reference.mdc +1 -1
  48. package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
  49. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +24 -0
  50. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/session-start.sh +17 -0
  51. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +37 -0
  52. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/toolchain.mjs +7 -3
  53. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo-agy/plugin.json +1 -1
  56. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  66. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  70. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  71. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  75. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  76. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  80. package/plugins/lisa-rails-agy/plugin.json +1 -1
  81. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  85. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  86. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  90. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  91. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  93. package/plugins/src/base/rules/eager/tracked-work.md +1 -1
  94. package/plugins/src/base/rules/reference/tracked-work.md +1 -1
  95. package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +24 -0
  96. package/plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh +17 -0
  97. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +37 -0
  98. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs +7 -3
  99. package/scripts/build-plugins.sh +32 -0
  100. package/scripts/generate-upstream-evidence-manifest.mjs +50 -11
  101. package/scripts/lisa-enforcement-fallback.sh +71 -0
  102. package/scripts/lisa-remote-env/session-start.sh +17 -0
@@ -45,6 +45,29 @@ class TrackingError extends Error {}
45
45
  * @param {string} noun What the reference names.
46
46
  * @returns {string} A message naming the actual fault.
47
47
  */
48
+ export class TrackerUnreachableError extends TrackingError {}
49
+
50
+ /**
51
+ * Turn a failed `gh` invocation into the right kind of refusal.
52
+ *
53
+ * The distinction is the whole point: a missing binary or a refused credential
54
+ * means the tracker could not be ASKED, while a "no" from the tracker is an
55
+ * answer. Absence of evidence is not evidence of absence, and only the first
56
+ * kind may be degraded — treating them alike would either strand finished work
57
+ * or wave through an item that genuinely is not committable.
58
+ * @param {{status: number|null, error?: Error, stderr?: string}} result Spawn result.
59
+ * @param {string} ref Work item reference.
60
+ * @returns {Error} The error to throw.
61
+ */
62
+ export function githubFailure(result, ref) {
63
+ const reason = githubFailureReason(result, ref, "GitHub issue");
64
+ const unreachable =
65
+ result.error?.code === "ENOENT" || /cannot authenticate/.test(reason);
66
+ return unreachable
67
+ ? new TrackerUnreachableError(reason)
68
+ : new TrackingError(reason);
69
+ }
70
+
48
71
  export function githubFailureReason(result, ref, noun) {
49
72
  if (result.error?.code === "ENOENT") {
50
73
  return (
@@ -577,8 +600,7 @@ function githubIssue(ref, contract) {
577
600
  allowFailure: true,
578
601
  }
579
602
  );
580
- if (result.status !== 0)
581
- throw new TrackingError(githubFailureReason(result, ref, "GitHub issue"));
603
+ if (result.status !== 0) throw githubFailure(result, ref);
582
604
  const issue = safeJson(result.stdout, `GitHub issue ${ref}`);
583
605
  if (String(issue.number) !== number)
584
606
  throw new TrackingError(`GitHub returned the wrong issue for ${ref}`);
@@ -814,10 +836,48 @@ function linearIssue(ref, contract) {
814
836
  return issue;
815
837
  }
816
838
 
839
+ /**
840
+ * Ask the tracker whether this work item may be committed against.
841
+ *
842
+ * When the tracker cannot be REACHED, the live checks are reported as skipped
843
+ * rather than enforced or silently dropped. Everything checkable without a
844
+ * network — the trailer is present, well formed, and matches this branch's
845
+ * binding — has already run by the time this is called, and the semantic
846
+ * checks it cannot do here are re-run in CI by a REQUIRED status check
847
+ * ("Work-Item Traceability"), with credentials, before anything can merge.
848
+ *
849
+ * So the guarantee is not lost; it moves to a gate that cannot be bypassed.
850
+ * That is the whole justification, and it holds only while that check stays
851
+ * required — if it is ever made optional, this degradation becomes a hole.
852
+ *
853
+ * The alternative was worse in both directions. Refusing outright strands
854
+ * finished, green work on any surface without a GitHub credential — a cloud
855
+ * container, for one — and the agent's only remaining move is a bypass that
856
+ * skips the offline checks too. Enforcing nothing hides the difference between
857
+ * "could not ask" and "the tracker said no".
858
+ * @param {string} ref Work item reference.
859
+ * @param {object} [contract] Tracker contract.
860
+ * @returns {object|undefined} The live item, or undefined when unreachable.
861
+ */
817
862
  function validateLive(ref, contract = trackerContract()) {
818
- if (contract.provider === "github") return githubIssue(ref, contract);
819
- if (contract.provider === "jira") return jiraIssue(ref, contract);
820
- return linearIssue(ref, contract);
863
+ try {
864
+ if (contract.provider === "github") return githubIssue(ref, contract);
865
+ if (contract.provider === "jira") return jiraIssue(ref, contract);
866
+ return linearIssue(ref, contract);
867
+ } catch (error) {
868
+ if (!(error instanceof TrackerUnreachableError)) throw error;
869
+ // Loud on stderr, never silent: a degradation nobody sees is the failure
870
+ // mode this exists to avoid, not a milder version of it.
871
+ console.error(
872
+ `\n⚠️ Work-item live validation SKIPPED for ${ref}.\n` +
873
+ `${error.message}\n\n` +
874
+ `The offline checks still ran: the trailer is present, well formed and ` +
875
+ `bound to this branch.\nWhat could not be checked here — that the item ` +
876
+ `is open, claimed and a leaf — is re-run\nwith credentials by the ` +
877
+ `required "Work-Item Traceability" check before this can merge.\n`
878
+ );
879
+ return undefined;
880
+ }
821
881
  }
822
882
 
823
883
  function textContainsBacklink(value, prUrl) {
@@ -836,6 +896,18 @@ function assertBacklink(
836
896
  contract,
837
897
  issue = validateLive(ref, contract)
838
898
  ) {
899
+ // The PR check never degrades, because it IS the re-check the local hooks
900
+ // degrade in favour of. A required status check that passes when it could
901
+ // not reach the tracker would make the whole arrangement circular: local
902
+ // defers to CI, CI defers to nothing.
903
+ if (!issue) {
904
+ throw new TrackingError(
905
+ `cannot verify ${ref} against the tracker, and this check is the one ` +
906
+ `that must.\nLocal hooks may skip live validation when the tracker ` +
907
+ `is unreachable; this check may not,\nbecause it is what they defer ` +
908
+ `to. Fix the tracker credential for this run.`
909
+ );
910
+ }
839
911
  if (contract.provider === "github") {
840
912
  const native = (issue.closedByPullRequestsReferences ?? []).some(
841
913
  pr => pr.url === prUrl
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "attribution": {
3
- "commit": "🤖 Generated with Claude Code\n\nCo-Authored-By: Claude",
4
- "pr": "🤖 Generated with Claude Code"
3
+ "commit": "\ud83e\udd16 Generated with Claude Code\n\nCo-Authored-By: Claude",
4
+ "pr": "\ud83e\udd16 Generated with Claude Code"
5
5
  },
6
6
  "enabledPlugins": {
7
7
  "lisa@lisa": true,
@@ -33,7 +33,22 @@
33
33
  "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
34
34
  },
35
35
  "permissions": {
36
- "deny": ["Read(./.entire/metadata/**)"]
36
+ "deny": [
37
+ "Read(./.entire/metadata/**)"
38
+ ]
37
39
  },
38
- "plansDirectory": "./plans"
40
+ "plansDirectory": "./plans",
41
+ "hooks": {
42
+ "PreToolUse": [
43
+ {
44
+ "matcher": "Bash",
45
+ "hooks": [
46
+ {
47
+ "type": "command",
48
+ "command": "bash \"$CLAUDE_PROJECT_DIR\"/scripts/lisa-enforcement-fallback.sh"
49
+ }
50
+ ]
51
+ }
52
+ ]
53
+ }
39
54
  }
@@ -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,CAgnEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAwjNjE,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,CA0nEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAikNjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -3,7 +3,11 @@
3
3
  export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
4
4
  "all/copy-contents/.gitattributes": "9d3831007e681186a3673e1037ef3fc82980cab2fc04e27c0868e562912c9e9f",
5
5
  "all/copy-contents/gitignore": "2dbf7fd2f2020fc7824c432342002d9ca3ebb57b2872e761b14e942b23479a11",
6
- "all/copy-overwrite/scripts/lisa-work-item.mjs": "96a87c131606b3edd43e52485e68f8ffbf5c528cb4beb7a1185263519a9632ce",
6
+ "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
7
+ "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "aa95a84f9f9224914947a09b858535aa8bd052199ff64cb53768cf78fb69b687",
8
+ "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": "3b5f074f3ab5708030af507eea962389f3b067c5dbdc76580bd9e44d3ac6c603",
9
+ "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "062c69eea85157f1e941ec3626d8912aa9f182af6ccdbe19687588a6074db5ce",
10
+ "all/copy-overwrite/scripts/lisa-work-item.mjs": "6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
7
11
  "all/create-only/.claude/rules/PROJECT_RULES.md": "6e1c7923ad2a15356babc60c97e7f97be728d790af285b6a7cd7d1b4d39cd97f",
8
12
  "all/create-only/.lisaignore": "3c9827e7e98daa46510b5357cd6dd9406da1821e64cc46d2eea9f311cd6d06b9",
9
13
  "all/create-only/scripts/remote-agent-aws-setup.sh": "7677908a345891810d2104ba8b2fd1a8318bb29c408fb5ce0110d57beef9b556",
@@ -12,7 +16,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
12
16
  "all/github-rulesets/base.json": "58b9606f185cdca8b17218829aac333b7d8c08f0f2b4f86d7e360f7be1de4787",
13
17
  "all/github-rulesets/prevent-delete.json": "e4fb26390a8bfee34b27be5b369f376a1a9a00b797fd8d3ce51cb71facb826a4",
14
18
  "all/github-rulesets/protect-tags.json": "387f824e3ea58a803223e42e08326504a39e6a7a0c650a0bbfdfb4653854b722",
15
- "all/merge/.claude/settings.json": "1d4a4d33d4a5f26a33560df21f9ad9ba97511c15a1c952dd2fe941679a0f1f9e",
19
+ "all/merge/.claude/settings.json": "4d41a745030e5f33eb4d4fe1f1b12268680f104ea55a30c4d9f55a6e22ad6fca",
16
20
  "cdk/copy-overwrite/.github/workflows/.keep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
17
21
  "cdk/copy-overwrite/eslint.cdk.ts": "074fe7a638ed95210339a9215abf75fa52bb10e678f2fd58523ff8a9d32ea4b6",
18
22
  "cdk/copy-overwrite/eslint.config.ts": "f1917ade3f1170ac8027110b44499732b9d9d3a2d42f256e37cd09930970298c",
@@ -339,7 +343,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
339
343
  "plugins/src/base/rules/eager/settled-decisions.md": "f5339c81b8d29f628830e6147314cbb941b9d9e6d87c3834d8fe7adc4b46ef4c",
340
344
  "plugins/src/base/rules/eager/stale-state-claims.md": "faf5057f5910237b8d5048dbcccb73e0cd03762a8eefbeae43b5d0153104a85a",
341
345
  "plugins/src/base/rules/eager/tool-access-gate.md": "a5413a43ec353f768586e0a1cde3836db025cb5d8b80821020602995e71aa296",
342
- "plugins/src/base/rules/eager/tracked-work.md": "ab784db4efee993e28dd2b9c8696f19ee049222890b0cae977bff5435f698aff",
346
+ "plugins/src/base/rules/eager/tracked-work.md": "ae5177a3ce321007dfc03f44974f25110aed578bcdf2283d5c5f12c838f82673",
343
347
  "plugins/src/base/rules/eager/upstream-to-lisa.md": "eb8b37e789423dba78e3a77951db087c4d3f56a88478b63107ec6b9ddbf23b13",
344
348
  "plugins/src/base/rules/eager/usage-accounting.md": "b93fa782d61911579b25363e465bb1f4e9b7e4edb54465a346d52f74dffe5a97",
345
349
  "plugins/src/base/rules/eager/verification.md": "43f154f65e8ee1fa4fb33039f154855b569ab338902c86a8812e66715895cf7b",
@@ -377,7 +381,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
377
381
  "plugins/src/base/rules/reference/settled-decisions.md": "6c84f309a1f765eba1648d6ace836387bd96b924f245c16cf3629f501ef6bb18",
378
382
  "plugins/src/base/rules/reference/stale-state-claims.md": "6329e1a7629f9a12f10454c767842aecee4964df8b7bb4aebda9dde3c0959c2a",
379
383
  "plugins/src/base/rules/reference/tool-access-gate.md": "70fcd6cd92dc003a40886b1bef02540e6401f5b70ba97308d42bbbddc0206eab",
380
- "plugins/src/base/rules/reference/tracked-work.md": "cc956e7a61d8f65bfc4e0e3bc4c3da1b5a9e541683aa17dc1850979d04abac24",
384
+ "plugins/src/base/rules/reference/tracked-work.md": "85fb31a5d7aad44d04592bb7feea7ad02808eeeb6950639ad452fcec1bc3c86b",
381
385
  "plugins/src/base/rules/reference/upstream-to-lisa.md": "dcf07f8eba66aaf1d132bfaeff73cbf7576279822893235a3c3f8cbc4a4a3323",
382
386
  "plugins/src/base/rules/reference/usage-accounting.md": "d2a24f8f176dbd900beb6e396fc669008b0be0c9033fac5c1c1ecc19002bd7c2",
383
387
  "plugins/src/base/rules/reference/verification.md": "0a4424d79fae5ce028d08b98523a01f51cbe07c1bcc0a094048d7a25adc075d8",
@@ -559,11 +563,11 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
559
563
  "plugins/src/base/skills/lisa-setup-linear/SKILL.md": "ec76f832a6df6f58b163f7f5ba6826ed2fcbddc91e44a8372e874858e4d0c518",
560
564
  "plugins/src/base/skills/lisa-setup-notion/SKILL.md": "f5a1e9290789fd1c33675168d30461fb24a11c98a433ef777c1f536bc2f905ef",
561
565
  "plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md": "80fbf157f9c562c033886c25a99b37356602edd9e61cd2d492f339769ddcf97e",
562
- "plugins/src/base/skills/lisa-setup-remote-env/SKILL.md": "5627c45a4ce7d0f0d122791f699b6dd2841602adf873678c693ad08a48eab401",
563
- "plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh": "6e3871ec2f8d56b8ebb85376ebdd3956f3ed8fa4f7b278c2ed90ca9b8845897c",
566
+ "plugins/src/base/skills/lisa-setup-remote-env/SKILL.md": "821f9f7db39259c3aef24dc369c7cdcfb55a85d61742b32ac2a961e1b3e263a4",
567
+ "plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh": "cb63d08b14ab7aa2d405e6770e0cf7db5d6588ae1dcb924ea6224b026fcff496",
564
568
  "plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh": "c04afb1cf8e14a2713645228e679fa7772559488330a240ec0297cae6afd03e2",
565
- "plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs": "68339117f7d2fe1fdb9f05c8039ffe719f24da7cf700bc3c940bfccbf82cded2",
566
- "plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs": "ff66d33ba41a068d09be18f81ac68988238c2afa1d4e3733ae906b73eea74324",
569
+ "plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs": "1f451881342364d086640b59914a3b07286a3734caa63f01efe64531d3bde7e4",
570
+ "plugins/src/base/skills/lisa-setup-remote-env/scripts/toolchain.mjs": "8822af39d0251a2e4fb0eac9157ba9e63ea813d914240ca0cacacd6cb7cbb5bb",
567
571
  "plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs": "82bc2a27a0a5afb2ff413a88365c619fd7f0eaada5de3ccabf2000938f0607a4",
568
572
  "plugins/src/base/skills/lisa-setup-sonar/SKILL.md": "53fbd8acce4b5e47e88195a7b90d5be424fa6ef7ad872f52c50467c690664c3b",
569
573
  "plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md": "031acb01195ae59010a65335da98d46a1d6080e749823d6f6d157938d9e96648",
@@ -949,7 +953,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
949
953
  "rails/deletions.json": "eeadf9a2b1677913199a235091a8d6190477f3e2a5fd598d62cf658cb59a8099",
950
954
  "rails/github-rulesets/quality-checks.json": "0ec1c366589edbaa6b8f45f940cef3ada5ed7b1a956d98d3fa6034b0f78fbc7c",
951
955
  "rails/merge/.claude/settings.json": "9c49f8c7c453f8749c90def3e22d412c3345c533d24b30dc7745ffa052ad6fa1",
952
- "scripts/build-plugins.sh": "d26321ea10bc3ed8cf096f900622cb4cf7a37117fabf9730f0fe5c9d949582fc",
956
+ "scripts/build-plugins.sh": "b57413e6e003be102e82e0a8a6b44a137f5d0aeed8da4c1f4f99919a0d7e8b04",
953
957
  "scripts/check-duplicate-versions.mjs": "84d97e94eb834522848ddce951bb54ae9da1e4be252e2c51fed0c01c4f4d6b72",
954
958
  "scripts/check-learnings-budget.ts": "007430c2d6938efcc79ccbfd5717ebe2c7cf66b4de9a21a3e67b8db7f3600349",
955
959
  "scripts/check-plugins-sync.sh": "3a99cbff0e8ec5e7c944690eae003a6d51b51c85436d77bd37faea4d553728af",
@@ -971,7 +975,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
971
975
  "scripts/generate-codex-plugin-artifacts.mjs": "1d1a362afb8dba408741a3eed9fe583296f6bcb048608979f73f359cd609c03d",
972
976
  "scripts/generate-copilot-plugin-artifacts.mjs": "70d283eed7cb7c1351d13cf0497f06dec175562c5918921c404393a76f11278f",
973
977
  "scripts/generate-cursor-plugin-artifacts.mjs": "d8806197a723f0c2b50a8155ffc5b6f0abc30c68dc2385cb80b0dd066d061231",
974
- "scripts/generate-upstream-evidence-manifest.mjs": "3fda910de51aa51def6c7cee276c471cc50cb7cb72478bee5495341d67409a97",
978
+ "scripts/generate-upstream-evidence-manifest.mjs": "de1eb5adaa6252b4abe5859933bff0ab2a52e19cc5a3fc5a41018fbb57b766d1",
975
979
  "scripts/github-status-check.sh": "876914c369c5bd58f4a5f3c41d0c1264c6923f329a644f90640d15b434a0fbd1",
976
980
  "scripts/install-claude-plugins.sh": "ed60ed3afc25175b81439330dbf26ff639f55fabec54223df4c7266805c84f22",
977
981
  "scripts/internal-agy-skill-policy.json": "c2ce87d2eeebfdc9f24d6486425c010cf9289376f8a459f4767ca22d2bf8670d",
@@ -985,11 +989,12 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
985
989
  "scripts/lib/reusable-workflow-contract.d.mts": "791f01b55dd7a6b5d9a5f4cb9c44167caa146c2fc3c31a2ae4c2d8a350adc2f1",
986
990
  "scripts/lib/reusable-workflow-contract.mjs": "134ee2a327290f066f1eb318b5ed53c711557c3e10ed462c00ff5c97cfb20863",
987
991
  "scripts/lisa-commit-and-pr-local.sh": "605409c3ce6ec38ad3275604291a1ceae98f7807a605654263bc14f811c03903",
992
+ "scripts/lisa-enforcement-fallback.sh": "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
988
993
  "scripts/lisa-github-environments.sh": "0a76e92f108519abaf3e29991299ec3b0db20ea533e69e6d2a53d802dba9c370",
989
994
  "scripts/lisa-github-repo-settings.sh": "4afbccdfb08c62ba13afee42ec8561a28facf87c61f6f4b80000115328364d54",
990
995
  "scripts/lisa-github-repo-setup.sh": "dc2f1c9d718aa34ba57161120d9319b5f78fe6b0b496d8e3c77226a08795aa36",
991
996
  "scripts/lisa-github-rulesets.sh": "920a43ba268421b6fe55096062bd85850468bee9389f6006ad7c671010e7cccb",
992
- "scripts/lisa-remote-env/session-start.sh": "6e3871ec2f8d56b8ebb85376ebdd3956f3ed8fa4f7b278c2ed90ca9b8845897c",
997
+ "scripts/lisa-remote-env/session-start.sh": "cb63d08b14ab7aa2d405e6770e0cf7db5d6588ae1dcb924ea6224b026fcff496",
993
998
  "scripts/lisa-remote-env/setup.sh": "c04afb1cf8e14a2713645228e679fa7772559488330a240ec0297cae6afd03e2",
994
999
  "scripts/lisa-update-local.sh": "c811f9e10dbcb38499a9791c1ae9051460b347051d04a1d2046925bab9a53c96",
995
1000
  "scripts/lisa-work-item.mjs": "51081847e980f314a764c2e50a7a121b1ced9ef4b980f33898057de4c7b852e6",
@@ -1229,6 +1234,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
1229
1234
  "README.md": true,
1230
1235
  "all/copy-contents/.gitattributes": true,
1231
1236
  "all/copy-contents/gitignore": true,
1237
+ "all/copy-overwrite/scripts/lisa-enforcement-fallback.sh": true,
1238
+ "all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": true,
1239
+ "all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": true,
1240
+ "all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": true,
1232
1241
  "all/copy-overwrite/scripts/lisa-work-item.mjs": true,
1233
1242
  "all/create-only/.claude/rules/PROJECT_RULES.md": true,
1234
1243
  "all/create-only/.lisaignore": true,
@@ -6543,6 +6552,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
6543
6552
  "scripts/lib/reusable-workflow-contract.d.mts": true,
6544
6553
  "scripts/lib/reusable-workflow-contract.mjs": true,
6545
6554
  "scripts/lisa-commit-and-pr-local.sh": true,
6555
+ "scripts/lisa-enforcement-fallback.sh": true,
6546
6556
  "scripts/lisa-github-environments.sh": true,
6547
6557
  "scripts/lisa-github-repo-settings.sh": true,
6548
6558
  "scripts/lisa-github-repo-setup.sh": true,
@@ -7174,7 +7184,9 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7174
7184
  "tests/unit/hooks/enforce-verification-gate-preserve.test.ts": true,
7175
7185
  "tests/unit/hooks/enforce-verification-gate-v1.test.ts": true,
7176
7186
  "tests/unit/hooks/enforce-verification-gate-v2.test.ts": true,
7187
+ "tests/unit/hooks/enforcement-fallback.test.ts": true,
7177
7188
  "tests/unit/hooks/enforcement-gates-e2e.test.ts": true,
7189
+ "tests/unit/hooks/host-enforcement-fallback.test.ts": true,
7178
7190
  "tests/unit/hooks/inject-rules.test.ts": true,
7179
7191
  "tests/unit/hooks/install-pkgs-worktree-node-modules.test.ts": true,
7180
7192
  "tests/unit/hooks/lint-on-edit.test.ts": true,
@@ -7253,6 +7265,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7253
7265
  "tests/unit/scripts/upstream-evidence-manifest.test.ts": true,
7254
7266
  "tests/unit/scripts/verification-coverage.test.ts": true,
7255
7267
  "tests/unit/scripts/work-item-github-failure-diagnosis.test.ts": true,
7268
+ "tests/unit/scripts/work-item-tracker-unreachable.test.ts": true,
7256
7269
  "tests/unit/secrets/automation-workflow.test.ts": true,
7257
7270
  "tests/unit/secrets/bootstrap-key-naming.test.ts": true,
7258
7271
  "tests/unit/secrets/doctor-secrets.test.ts": true,
@@ -7261,6 +7274,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7261
7274
  "tests/unit/secrets/remote-env-bindir-path.test.ts": true,
7262
7275
  "tests/unit/secrets/remote-env-installed-copy.test.ts": true,
7263
7276
  "tests/unit/secrets/remote-env-phases.test.ts": true,
7277
+ "tests/unit/secrets/remote-env-session-start-hook.test.ts": true,
7264
7278
  "tests/unit/secrets/remote-env-setup-field.test.ts": true,
7265
7279
  "tests/unit/secrets/remote-env-skill-resolution.test.ts": true,
7266
7280
  "tests/unit/secrets/remote-env-toolchain.test.ts": true,