@codyswann/lisa 3.31.2 → 3.31.4

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 (110) hide show
  1. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +1 -1
  2. package/all/copy-overwrite/scripts/lisa-gates.mjs +1 -1
  3. package/dist/cli/doctor-apply-freshness.js +1 -1
  4. package/dist/cli/doctor-worktree-hygiene.d.ts +1 -1
  5. package/dist/cli/doctor-worktree-hygiene.js +1 -1
  6. package/dist/core/apply-receipt.js +1 -1
  7. package/dist/core/guard-capabilities.d.ts +2 -2
  8. package/dist/core/guard-capabilities.js +2 -2
  9. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  10. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  11. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  12. package/dist/core/lisa-owned-provenance.js +3 -3
  13. package/dist/core/upstream-evidence-manifest.js +22 -22
  14. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  15. package/dist/migrations/ensure-lisa-postinstall.d.ts +1 -1
  16. package/dist/migrations/ensure-lisa-postinstall.js +1 -1
  17. package/dist/strategies/copy-overwrite.d.ts +1 -1
  18. package/dist/strategies/copy-overwrite.js +1 -1
  19. package/dist/utils/yaml.js +1 -1
  20. package/eslint-plugin-code-organization/README.md +1 -1
  21. package/expo/copy-overwrite/scripts/classify-maestro-failures.mjs +1 -1
  22. package/package.json +1 -1
  23. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa/.codex-plugin/skills/lisa-detect-tooling/SKILL.md +1 -1
  26. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
  27. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +1 -1
  28. package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
  29. package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +2 -2
  30. package/plugins/lisa/rules/reference/claim-time-guards.md +1 -1
  31. package/plugins/lisa/skills/lisa-detect-tooling/SKILL.md +1 -1
  32. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
  33. package/plugins/lisa/skills/lisa-secrets-access/SKILL.md +1 -1
  34. package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
  35. package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +2 -2
  36. package/plugins/lisa-agy/plugin.json +1 -1
  37. package/plugins/lisa-agy/skills/lisa-detect-tooling/SKILL.md +1 -1
  38. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
  39. package/plugins/lisa-agy/skills/lisa-secrets-access/SKILL.md +1 -1
  40. package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
  41. package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +2 -2
  42. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  45. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-copilot/rules/reference/claim-time-guards.md +1 -1
  49. package/plugins/lisa-copilot/skills/lisa-detect-tooling/SKILL.md +1 -1
  50. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
  51. package/plugins/lisa-copilot/skills/lisa-secrets-access/SKILL.md +1 -1
  52. package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
  53. package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +2 -2
  54. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-cursor/rules/claim-time-guards-reference.mdc +1 -1
  56. package/plugins/lisa-cursor/skills/lisa-detect-tooling/SKILL.md +1 -1
  57. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
  58. package/plugins/lisa-cursor/skills/lisa-secrets-access/SKILL.md +1 -1
  59. package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
  60. package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +2 -2
  61. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-expo-agy/plugin.json +1 -1
  64. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  74. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  79. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  84. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-rails-agy/plugin.json +1 -1
  89. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  94. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  99. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/src/base/rules/reference/claim-time-guards.md +1 -1
  102. package/plugins/src/base/skills/lisa-detect-tooling/SKILL.md +1 -1
  103. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +3 -3
  104. package/plugins/src/base/skills/lisa-secrets-access/SKILL.md +1 -1
  105. package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +2 -2
  106. package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +2 -2
  107. package/scripts/lisa-assert-eas-profile.mjs +1 -1
  108. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +7 -7
  109. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +4 -4
  110. package/typescript/copy-overwrite/scripts/nightly-e2e-suites.schema.json +1 -1
@@ -38,7 +38,7 @@ export declare const LISA_INVOCATION = "[ -n \"$CI\" ] || LISA_BOOTSTRAP=1 node
38
38
  * Any TypeScript/Node project (expo, nestjs, cdk, npm-package, plain typescript) with a
39
39
  * custom postinstall (`patch-package && ...`) that never invokes Lisa will not apply
40
40
  * template updates automatically on `bun install` / `npm install`. Evidence: frontend-v2
41
- * (expo) and propswap/frontend (typescript-only) both needed this chained invocation.
41
+ * (expo) and acmeorga/frontend (typescript-only) both needed this chained invocation.
42
42
  * This migration prepends the standard Lisa invocation so template updates apply
43
43
  * automatically on install. Rails-only projects are skipped (no Node postinstall).
44
44
  */
@@ -103,7 +103,7 @@ function hasNodePostinstallType(detectedTypes) {
103
103
  * Any TypeScript/Node project (expo, nestjs, cdk, npm-package, plain typescript) with a
104
104
  * custom postinstall (`patch-package && ...`) that never invokes Lisa will not apply
105
105
  * template updates automatically on `bun install` / `npm install`. Evidence: frontend-v2
106
- * (expo) and propswap/frontend (typescript-only) both needed this chained invocation.
106
+ * (expo) and acmeorga/frontend (typescript-only) both needed this chained invocation.
107
107
  * This migration prepends the standard Lisa invocation so template updates apply
108
108
  * automatically on install. Rails-only projects are skipped (no Node postinstall).
109
109
  */
@@ -37,7 +37,7 @@ export declare class CopyOverwriteStrategy implements ICopyStrategy {
37
37
  *
38
38
  * That refresh is unconditional only where Lisa can prove the installed copy
39
39
  * is behind. "Differs from mine" is not that proof — it is equally consistent
40
- * with the host being *ahead*, which is how `propswapllc/frontend` had a guard
40
+ * with the host being *ahead*, which is how `acmeorga/frontend` had a guard
41
41
  * they had hardened themselves silently replaced by a weaker upstream one. So
42
42
  * a Lisa-owned artifact is now classified before it is replaced, and anything
43
43
  * short of proof that it is stale leaves the host's copy alone with an
@@ -78,7 +78,7 @@ export class CopyOverwriteStrategy {
78
78
  *
79
79
  * That refresh is unconditional only where Lisa can prove the installed copy
80
80
  * is behind. "Differs from mine" is not that proof — it is equally consistent
81
- * with the host being *ahead*, which is how `propswapllc/frontend` had a guard
81
+ * with the host being *ahead*, which is how `acmeorga/frontend` had a guard
82
82
  * they had hardened themselves silently replaced by a weaker upstream one. So
83
83
  * a Lisa-owned artifact is now classified before it is replaced, and anything
84
84
  * short of proof that it is stale leaves the host's copy alone with an
@@ -10,7 +10,7 @@
10
10
  * instantiated — before any Lisa code runs — so the whole CLI is dead,
11
11
  * including `lisa doctor`. Lisa declares js-yaml `^4.3.1` for itself, but a
12
12
  * host project's `overrides`/`resolutions` collapse Lisa's nested copy onto
13
- * whatever the host pinned, which is exactly how geminisportsai/frontend-v2
13
+ * whatever the host pinned, which is exactly how acmeorgb/frontend-v2
14
14
  * ended up running Lisa against js-yaml 5 (CodySwannGT/lisa#2467).
15
15
  *
16
16
  * A namespace import links against any module shape, so the incompatibility
@@ -1,6 +1,6 @@
1
1
  # eslint-plugin-code-organization
2
2
 
3
- ESLint plugin to enforce code organization standards for the PropSwap frontend application.
3
+ ESLint plugin to enforce code organization standards for the AcmeOrgA frontend application.
4
4
 
5
5
  ## Rules
6
6
 
@@ -29,7 +29,7 @@
29
29
  * about the product. When the preamble fails, the flow reds having tested
30
30
  * nothing — and it reds on an assertion naming a preamble gate, not the
31
31
  * feature, so a reader scoring the run by flow name counts it as a product
32
- * regression. Upstreamed from TunnlAI/frontend, where proof runs 6
32
+ * regression. Upstreamed from AcmeOrgD/frontend, where proof runs 6
33
33
  * (31424664541) and 7 (31446155638) lost four flows each that way; run 6's
34
34
  * Android arm was written up as a possible product regression and every one of
35
35
  * those flows came back green in run 7 with no code addressing them.
package/package.json CHANGED
@@ -131,7 +131,7 @@
131
131
  "ws": ">=8.21.0"
132
132
  },
133
133
  "name": "@codyswann/lisa",
134
- "version": "3.31.2",
134
+ "version": "3.31.4",
135
135
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
136
136
  "main": "dist/index.js",
137
137
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -57,7 +57,7 @@ Discovery only works if "what does this run" can be answered from shell text wit
57
57
 
58
58
  **`$( )` restarts the quoting context.** In `"$(printf '%s' "$JSON" | node -e '…')"`, quotes inside the substitution pair among themselves. A flat scanner falls out of phase on the first one and starts reporting the payload's own string literals.
59
59
 
60
- Against Lisa and the three TunnlAI repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
60
+ Against Lisa and the three AcmeOrgD repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
61
61
 
62
62
  ## What it will not do
63
63
 
@@ -162,7 +162,7 @@ ends in between — turns exhausted, job timeout, or you concluding the work whi
162
162
  checks are still pending — the latch stays off and nothing restores it. The PR is
163
163
  left WORSE OFF THAN IF THIS SKILL HAD NEVER RUN: it has lost the mechanism that
164
164
  merges it while no agent is watching, and the run reports success. Measured on
165
- `gunnertech/frontend#282`, the latch went off 14s before the fix commit and the
165
+ `acmeorgc/frontend#282`, the latch went off 14s before the fix commit and the
166
166
  PR sat 26 minutes after going green, against ~3 minutes for PRs this skill never
167
167
  touched.
168
168
 
@@ -364,7 +364,7 @@ Ancestry proves your code is *in* the merged branch; it does **not** prove
364
364
  anything deployed. GitHub can **suppress the `on: push` event for a merge commit
365
365
  created by auto-merge or a bot token** (`GITHUB_TOKEN`), so the deploy workflow
366
366
  fires **zero** runs — no run, not even a `startup_failure` — while the ancestry
367
- check above stays green. Incident of record: TunnlAI/frontend **TUN-186** (PR #67)
367
+ check above stays green. Incident of record: AcmeOrgD/frontend **TUN-186** (PR #67)
368
368
  merged to `dev` via auto-merge; the merge commit `1b3f836` produced **no**
369
369
  `deploy.yml` run, and only the next human push `d1fe18c` (which carries `1b3f836`
370
370
  as an ancestor) actually shipped it. **Never report shipped on ancestry alone.**
@@ -423,7 +423,7 @@ of section 2 are diagnose-only).
423
423
 
424
424
  Linear's GitHub integration completes a linked Issue on merge to **any** branch
425
425
  — branch-name linkage alone triggers it, even when the PR body carries only the
426
- non-closing `Linear: <ID>` reference form (incident of record: TunnlAI backend
426
+ non-closing `Linear: <ID>` reference form (incident of record: AcmeOrgD backend
427
427
  PR #207 merged to `dev`; TUN-256 auto-completed and had to be manually
428
428
  reverted). Run this step **as soon as the PR reports `MERGED`**, before the
429
429
  deploy-run verification above can terminate the flow — a `blocked:deploy`
@@ -239,7 +239,7 @@ An org secret defaults to `--visibility private`. `all` reaches public repositor
239
239
  ```json
240
240
  "propagating": [
241
241
  "LINEAR_API_KEY",
242
- { "name": "NPM_TOKEN", "targets": ["TunnlAI", "TunnlAI/wiki"] }
242
+ { "name": "NPM_TOKEN", "targets": ["AcmeOrgD", "AcmeOrgD/wiki"] }
243
243
  ]
244
244
  ```
245
245
 
@@ -248,8 +248,8 @@ export function installAwsProfiles(bundle, options = {}) {
248
248
  // Refuse to write a profile name the operator already uses outside our block.
249
249
  //
250
250
  // AWS does not error on a duplicate `[profile x]` — it resolves one and
251
- // ignores the other. So writing `tunnl-dev` next to an operator's existing SSO
252
- // `tunnl-dev` would silently run some calls as the wrong identity, which is
251
+ // ignores the other. So writing `acmeorgd-dev` next to an operator's existing SSO
252
+ // `acmeorgd-dev` would silently run some calls as the wrong identity, which is
253
253
  // worse than either winning outright. Merging protects their sections from
254
254
  // being deleted; this protects them from being shadowed.
255
255
  //
@@ -51,7 +51,7 @@ Print instructions for the user:
51
51
 
52
52
  The user picks a stable identifier for this workspace. Two options:
53
53
 
54
- - **Workspace name** (human-readable, e.g., `Gemini Sports`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
54
+ - **Workspace name** (human-readable, e.g., `AcmeOrgB`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
55
55
  - **Workspace UUID** (returned by Notion's API). Stable but opaque.
56
56
 
57
57
  Default to the workspace name. After the user stores the token (Step 4), Step 5's `/users/me` call surfaces the actual `bot.workspace_name`; if it differs from what the user typed (capitalization, trailing whitespace), prompt to confirm.
@@ -60,7 +60,7 @@ Default to the workspace name. After the user stores the token (Step 4), Step 5'
60
60
  WORKSPACE=$(jq -r '.notion.workspaceId // empty' .lisa.config.json 2>/dev/null)
61
61
  if [ -z "$WORKSPACE" ]; then
62
62
  # Prompt the user — accept any non-empty string. They pick the slug; we just store it.
63
- read -p "Workspace identifier (any stable slug, e.g. 'gemini-sports'): " WORKSPACE
63
+ read -p "Workspace identifier (any stable slug, e.g. 'acme-org-b'): " WORKSPACE
64
64
  fi
65
65
  ```
66
66
 
@@ -1,6 +1,6 @@
1
1
  # Claim-Time Guards
2
2
 
3
- Two guards that run when build-intake claims a ready item. Both come from geminisportsai's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
3
+ Two guards that run when build-intake claims a ready item. Both come from acmeorgb's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
4
4
 
5
5
  It is a **single vendor-neutral contract** consumed by all three build-intake skills (`lisa-github-build-intake`, `lisa-jira-build-intake`, `lisa-linear-build-intake`). Each arm cites this slug in its claim step rather than growing its own copy, exactly as the arms cite `leaf-only-lifecycle`, `repo-scope-split`, `rejection-detection`, and `claim-archaeology`. One slug is what keeps a guard that fires on GitHub from being absent on Linear.
6
6
 
@@ -57,7 +57,7 @@ Discovery only works if "what does this run" can be answered from shell text wit
57
57
 
58
58
  **`$( )` restarts the quoting context.** In `"$(printf '%s' "$JSON" | node -e '…')"`, quotes inside the substitution pair among themselves. A flat scanner falls out of phase on the first one and starts reporting the payload's own string literals.
59
59
 
60
- Against Lisa and the three TunnlAI repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
60
+ Against Lisa and the three AcmeOrgD repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
61
61
 
62
62
  ## What it will not do
63
63
 
@@ -162,7 +162,7 @@ ends in between — turns exhausted, job timeout, or you concluding the work whi
162
162
  checks are still pending — the latch stays off and nothing restores it. The PR is
163
163
  left WORSE OFF THAN IF THIS SKILL HAD NEVER RUN: it has lost the mechanism that
164
164
  merges it while no agent is watching, and the run reports success. Measured on
165
- `gunnertech/frontend#282`, the latch went off 14s before the fix commit and the
165
+ `acmeorgc/frontend#282`, the latch went off 14s before the fix commit and the
166
166
  PR sat 26 minutes after going green, against ~3 minutes for PRs this skill never
167
167
  touched.
168
168
 
@@ -364,7 +364,7 @@ Ancestry proves your code is *in* the merged branch; it does **not** prove
364
364
  anything deployed. GitHub can **suppress the `on: push` event for a merge commit
365
365
  created by auto-merge or a bot token** (`GITHUB_TOKEN`), so the deploy workflow
366
366
  fires **zero** runs — no run, not even a `startup_failure` — while the ancestry
367
- check above stays green. Incident of record: TunnlAI/frontend **TUN-186** (PR #67)
367
+ check above stays green. Incident of record: AcmeOrgD/frontend **TUN-186** (PR #67)
368
368
  merged to `dev` via auto-merge; the merge commit `1b3f836` produced **no**
369
369
  `deploy.yml` run, and only the next human push `d1fe18c` (which carries `1b3f836`
370
370
  as an ancestor) actually shipped it. **Never report shipped on ancestry alone.**
@@ -423,7 +423,7 @@ of section 2 are diagnose-only).
423
423
 
424
424
  Linear's GitHub integration completes a linked Issue on merge to **any** branch
425
425
  — branch-name linkage alone triggers it, even when the PR body carries only the
426
- non-closing `Linear: <ID>` reference form (incident of record: TunnlAI backend
426
+ non-closing `Linear: <ID>` reference form (incident of record: AcmeOrgD backend
427
427
  PR #207 merged to `dev`; TUN-256 auto-completed and had to be manually
428
428
  reverted). Run this step **as soon as the PR reports `MERGED`**, before the
429
429
  deploy-run verification above can terminate the flow — a `blocked:deploy`
@@ -239,7 +239,7 @@ An org secret defaults to `--visibility private`. `all` reaches public repositor
239
239
  ```json
240
240
  "propagating": [
241
241
  "LINEAR_API_KEY",
242
- { "name": "NPM_TOKEN", "targets": ["TunnlAI", "TunnlAI/wiki"] }
242
+ { "name": "NPM_TOKEN", "targets": ["AcmeOrgD", "AcmeOrgD/wiki"] }
243
243
  ]
244
244
  ```
245
245
 
@@ -248,8 +248,8 @@ export function installAwsProfiles(bundle, options = {}) {
248
248
  // Refuse to write a profile name the operator already uses outside our block.
249
249
  //
250
250
  // AWS does not error on a duplicate `[profile x]` — it resolves one and
251
- // ignores the other. So writing `tunnl-dev` next to an operator's existing SSO
252
- // `tunnl-dev` would silently run some calls as the wrong identity, which is
251
+ // ignores the other. So writing `acmeorgd-dev` next to an operator's existing SSO
252
+ // `acmeorgd-dev` would silently run some calls as the wrong identity, which is
253
253
  // worse than either winning outright. Merging protects their sections from
254
254
  // being deleted; this protects them from being shadowed.
255
255
  //
@@ -51,7 +51,7 @@ Print instructions for the user:
51
51
 
52
52
  The user picks a stable identifier for this workspace. Two options:
53
53
 
54
- - **Workspace name** (human-readable, e.g., `Gemini Sports`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
54
+ - **Workspace name** (human-readable, e.g., `AcmeOrgB`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
55
55
  - **Workspace UUID** (returned by Notion's API). Stable but opaque.
56
56
 
57
57
  Default to the workspace name. After the user stores the token (Step 4), Step 5's `/users/me` call surfaces the actual `bot.workspace_name`; if it differs from what the user typed (capitalization, trailing whitespace), prompt to confirm.
@@ -60,7 +60,7 @@ Default to the workspace name. After the user stores the token (Step 4), Step 5'
60
60
  WORKSPACE=$(jq -r '.notion.workspaceId // empty' .lisa.config.json 2>/dev/null)
61
61
  if [ -z "$WORKSPACE" ]; then
62
62
  # Prompt the user — accept any non-empty string. They pick the slug; we just store it.
63
- read -p "Workspace identifier (any stable slug, e.g. 'gemini-sports'): " WORKSPACE
63
+ read -p "Workspace identifier (any stable slug, e.g. 'acme-org-b'): " WORKSPACE
64
64
  fi
65
65
  ```
66
66
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -57,7 +57,7 @@ Discovery only works if "what does this run" can be answered from shell text wit
57
57
 
58
58
  **`$( )` restarts the quoting context.** In `"$(printf '%s' "$JSON" | node -e '…')"`, quotes inside the substitution pair among themselves. A flat scanner falls out of phase on the first one and starts reporting the payload's own string literals.
59
59
 
60
- Against Lisa and the three TunnlAI repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
60
+ Against Lisa and the three AcmeOrgD repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
61
61
 
62
62
  ## What it will not do
63
63
 
@@ -162,7 +162,7 @@ ends in between — turns exhausted, job timeout, or you concluding the work whi
162
162
  checks are still pending — the latch stays off and nothing restores it. The PR is
163
163
  left WORSE OFF THAN IF THIS SKILL HAD NEVER RUN: it has lost the mechanism that
164
164
  merges it while no agent is watching, and the run reports success. Measured on
165
- `gunnertech/frontend#282`, the latch went off 14s before the fix commit and the
165
+ `acmeorgc/frontend#282`, the latch went off 14s before the fix commit and the
166
166
  PR sat 26 minutes after going green, against ~3 minutes for PRs this skill never
167
167
  touched.
168
168
 
@@ -364,7 +364,7 @@ Ancestry proves your code is *in* the merged branch; it does **not** prove
364
364
  anything deployed. GitHub can **suppress the `on: push` event for a merge commit
365
365
  created by auto-merge or a bot token** (`GITHUB_TOKEN`), so the deploy workflow
366
366
  fires **zero** runs — no run, not even a `startup_failure` — while the ancestry
367
- check above stays green. Incident of record: TunnlAI/frontend **TUN-186** (PR #67)
367
+ check above stays green. Incident of record: AcmeOrgD/frontend **TUN-186** (PR #67)
368
368
  merged to `dev` via auto-merge; the merge commit `1b3f836` produced **no**
369
369
  `deploy.yml` run, and only the next human push `d1fe18c` (which carries `1b3f836`
370
370
  as an ancestor) actually shipped it. **Never report shipped on ancestry alone.**
@@ -423,7 +423,7 @@ of section 2 are diagnose-only).
423
423
 
424
424
  Linear's GitHub integration completes a linked Issue on merge to **any** branch
425
425
  — branch-name linkage alone triggers it, even when the PR body carries only the
426
- non-closing `Linear: <ID>` reference form (incident of record: TunnlAI backend
426
+ non-closing `Linear: <ID>` reference form (incident of record: AcmeOrgD backend
427
427
  PR #207 merged to `dev`; TUN-256 auto-completed and had to be manually
428
428
  reverted). Run this step **as soon as the PR reports `MERGED`**, before the
429
429
  deploy-run verification above can terminate the flow — a `blocked:deploy`
@@ -239,7 +239,7 @@ An org secret defaults to `--visibility private`. `all` reaches public repositor
239
239
  ```json
240
240
  "propagating": [
241
241
  "LINEAR_API_KEY",
242
- { "name": "NPM_TOKEN", "targets": ["TunnlAI", "TunnlAI/wiki"] }
242
+ { "name": "NPM_TOKEN", "targets": ["AcmeOrgD", "AcmeOrgD/wiki"] }
243
243
  ]
244
244
  ```
245
245
 
@@ -248,8 +248,8 @@ export function installAwsProfiles(bundle, options = {}) {
248
248
  // Refuse to write a profile name the operator already uses outside our block.
249
249
  //
250
250
  // AWS does not error on a duplicate `[profile x]` — it resolves one and
251
- // ignores the other. So writing `tunnl-dev` next to an operator's existing SSO
252
- // `tunnl-dev` would silently run some calls as the wrong identity, which is
251
+ // ignores the other. So writing `acmeorgd-dev` next to an operator's existing SSO
252
+ // `acmeorgd-dev` would silently run some calls as the wrong identity, which is
253
253
  // worse than either winning outright. Merging protects their sections from
254
254
  // being deleted; this protects them from being shadowed.
255
255
  //
@@ -51,7 +51,7 @@ Print instructions for the user:
51
51
 
52
52
  The user picks a stable identifier for this workspace. Two options:
53
53
 
54
- - **Workspace name** (human-readable, e.g., `Gemini Sports`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
54
+ - **Workspace name** (human-readable, e.g., `AcmeOrgB`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
55
55
  - **Workspace UUID** (returned by Notion's API). Stable but opaque.
56
56
 
57
57
  Default to the workspace name. After the user stores the token (Step 4), Step 5's `/users/me` call surfaces the actual `bot.workspace_name`; if it differs from what the user typed (capitalization, trailing whitespace), prompt to confirm.
@@ -60,7 +60,7 @@ Default to the workspace name. After the user stores the token (Step 4), Step 5'
60
60
  WORKSPACE=$(jq -r '.notion.workspaceId // empty' .lisa.config.json 2>/dev/null)
61
61
  if [ -z "$WORKSPACE" ]; then
62
62
  # Prompt the user — accept any non-empty string. They pick the slug; we just store it.
63
- read -p "Workspace identifier (any stable slug, e.g. 'gemini-sports'): " WORKSPACE
63
+ read -p "Workspace identifier (any stable slug, e.g. 'acme-org-b'): " WORKSPACE
64
64
  fi
65
65
  ```
66
66
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  # Claim-Time Guards
2
2
 
3
- Two guards that run when build-intake claims a ready item. Both come from geminisportsai's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
3
+ Two guards that run when build-intake claims a ready item. Both come from acmeorgb's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
4
4
 
5
5
  It is a **single vendor-neutral contract** consumed by all three build-intake skills (`lisa-github-build-intake`, `lisa-jira-build-intake`, `lisa-linear-build-intake`). Each arm cites this slug in its claim step rather than growing its own copy, exactly as the arms cite `leaf-only-lifecycle`, `repo-scope-split`, `rejection-detection`, and `claim-archaeology`. One slug is what keeps a guard that fires on GitHub from being absent on Linear.
6
6
 
@@ -57,7 +57,7 @@ Discovery only works if "what does this run" can be answered from shell text wit
57
57
 
58
58
  **`$( )` restarts the quoting context.** In `"$(printf '%s' "$JSON" | node -e '…')"`, quotes inside the substitution pair among themselves. A flat scanner falls out of phase on the first one and starts reporting the payload's own string literals.
59
59
 
60
- Against Lisa and the three TunnlAI repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
60
+ Against Lisa and the three AcmeOrgD repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
61
61
 
62
62
  ## What it will not do
63
63
 
@@ -162,7 +162,7 @@ ends in between — turns exhausted, job timeout, or you concluding the work whi
162
162
  checks are still pending — the latch stays off and nothing restores it. The PR is
163
163
  left WORSE OFF THAN IF THIS SKILL HAD NEVER RUN: it has lost the mechanism that
164
164
  merges it while no agent is watching, and the run reports success. Measured on
165
- `gunnertech/frontend#282`, the latch went off 14s before the fix commit and the
165
+ `acmeorgc/frontend#282`, the latch went off 14s before the fix commit and the
166
166
  PR sat 26 minutes after going green, against ~3 minutes for PRs this skill never
167
167
  touched.
168
168
 
@@ -364,7 +364,7 @@ Ancestry proves your code is *in* the merged branch; it does **not** prove
364
364
  anything deployed. GitHub can **suppress the `on: push` event for a merge commit
365
365
  created by auto-merge or a bot token** (`GITHUB_TOKEN`), so the deploy workflow
366
366
  fires **zero** runs — no run, not even a `startup_failure` — while the ancestry
367
- check above stays green. Incident of record: TunnlAI/frontend **TUN-186** (PR #67)
367
+ check above stays green. Incident of record: AcmeOrgD/frontend **TUN-186** (PR #67)
368
368
  merged to `dev` via auto-merge; the merge commit `1b3f836` produced **no**
369
369
  `deploy.yml` run, and only the next human push `d1fe18c` (which carries `1b3f836`
370
370
  as an ancestor) actually shipped it. **Never report shipped on ancestry alone.**
@@ -423,7 +423,7 @@ of section 2 are diagnose-only).
423
423
 
424
424
  Linear's GitHub integration completes a linked Issue on merge to **any** branch
425
425
  — branch-name linkage alone triggers it, even when the PR body carries only the
426
- non-closing `Linear: <ID>` reference form (incident of record: TunnlAI backend
426
+ non-closing `Linear: <ID>` reference form (incident of record: AcmeOrgD backend
427
427
  PR #207 merged to `dev`; TUN-256 auto-completed and had to be manually
428
428
  reverted). Run this step **as soon as the PR reports `MERGED`**, before the
429
429
  deploy-run verification above can terminate the flow — a `blocked:deploy`
@@ -239,7 +239,7 @@ An org secret defaults to `--visibility private`. `all` reaches public repositor
239
239
  ```json
240
240
  "propagating": [
241
241
  "LINEAR_API_KEY",
242
- { "name": "NPM_TOKEN", "targets": ["TunnlAI", "TunnlAI/wiki"] }
242
+ { "name": "NPM_TOKEN", "targets": ["AcmeOrgD", "AcmeOrgD/wiki"] }
243
243
  ]
244
244
  ```
245
245
 
@@ -248,8 +248,8 @@ export function installAwsProfiles(bundle, options = {}) {
248
248
  // Refuse to write a profile name the operator already uses outside our block.
249
249
  //
250
250
  // AWS does not error on a duplicate `[profile x]` — it resolves one and
251
- // ignores the other. So writing `tunnl-dev` next to an operator's existing SSO
252
- // `tunnl-dev` would silently run some calls as the wrong identity, which is
251
+ // ignores the other. So writing `acmeorgd-dev` next to an operator's existing SSO
252
+ // `acmeorgd-dev` would silently run some calls as the wrong identity, which is
253
253
  // worse than either winning outright. Merging protects their sections from
254
254
  // being deleted; this protects them from being shadowed.
255
255
  //
@@ -51,7 +51,7 @@ Print instructions for the user:
51
51
 
52
52
  The user picks a stable identifier for this workspace. Two options:
53
53
 
54
- - **Workspace name** (human-readable, e.g., `Gemini Sports`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
54
+ - **Workspace name** (human-readable, e.g., `AcmeOrgB`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
55
55
  - **Workspace UUID** (returned by Notion's API). Stable but opaque.
56
56
 
57
57
  Default to the workspace name. After the user stores the token (Step 4), Step 5's `/users/me` call surfaces the actual `bot.workspace_name`; if it differs from what the user typed (capitalization, trailing whitespace), prompt to confirm.
@@ -60,7 +60,7 @@ Default to the workspace name. After the user stores the token (Step 4), Step 5'
60
60
  WORKSPACE=$(jq -r '.notion.workspaceId // empty' .lisa.config.json 2>/dev/null)
61
61
  if [ -z "$WORKSPACE" ]; then
62
62
  # Prompt the user — accept any non-empty string. They pick the slug; we just store it.
63
- read -p "Workspace identifier (any stable slug, e.g. 'gemini-sports'): " WORKSPACE
63
+ read -p "Workspace identifier (any stable slug, e.g. 'acme-org-b'): " WORKSPACE
64
64
  fi
65
65
  ```
66
66
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.31.2",
3
+ "version": "3.31.4",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -5,7 +5,7 @@ alwaysApply: false
5
5
 
6
6
  # Claim-Time Guards
7
7
 
8
- Two guards that run when build-intake claims a ready item. Both come from geminisportsai's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
8
+ Two guards that run when build-intake claims a ready item. Both come from acmeorgb's hand-rolled `sprint-loop` and both address failures actually observed there — an item built twice because it had already shipped, and a loop burning cycles re-attempting an item that was never going to succeed.
9
9
 
10
10
  It is a **single vendor-neutral contract** consumed by all three build-intake skills (`lisa-github-build-intake`, `lisa-jira-build-intake`, `lisa-linear-build-intake`). Each arm cites this slug in its claim step rather than growing its own copy, exactly as the arms cite `leaf-only-lifecycle`, `repo-scope-split`, `rejection-detection`, and `claim-archaeology`. One slug is what keeps a guard that fires on GitHub from being absent on Linear.
11
11
 
@@ -57,7 +57,7 @@ Discovery only works if "what does this run" can be answered from shell text wit
57
57
 
58
58
  **`$( )` restarts the quoting context.** In `"$(printf '%s' "$JSON" | node -e '…')"`, quotes inside the substitution pair among themselves. A flat scanner falls out of phase on the first one and starts reporting the payload's own string literals.
59
59
 
60
- Against Lisa and the three TunnlAI repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
60
+ Against Lisa and the three AcmeOrgD repositories, what survives is `gitleaks`, `jq`, `gtimeout` and `eas` — every one a real, undeclared invocation, with no false positives.
61
61
 
62
62
  ## What it will not do
63
63
 
@@ -162,7 +162,7 @@ ends in between — turns exhausted, job timeout, or you concluding the work whi
162
162
  checks are still pending — the latch stays off and nothing restores it. The PR is
163
163
  left WORSE OFF THAN IF THIS SKILL HAD NEVER RUN: it has lost the mechanism that
164
164
  merges it while no agent is watching, and the run reports success. Measured on
165
- `gunnertech/frontend#282`, the latch went off 14s before the fix commit and the
165
+ `acmeorgc/frontend#282`, the latch went off 14s before the fix commit and the
166
166
  PR sat 26 minutes after going green, against ~3 minutes for PRs this skill never
167
167
  touched.
168
168
 
@@ -364,7 +364,7 @@ Ancestry proves your code is *in* the merged branch; it does **not** prove
364
364
  anything deployed. GitHub can **suppress the `on: push` event for a merge commit
365
365
  created by auto-merge or a bot token** (`GITHUB_TOKEN`), so the deploy workflow
366
366
  fires **zero** runs — no run, not even a `startup_failure` — while the ancestry
367
- check above stays green. Incident of record: TunnlAI/frontend **TUN-186** (PR #67)
367
+ check above stays green. Incident of record: AcmeOrgD/frontend **TUN-186** (PR #67)
368
368
  merged to `dev` via auto-merge; the merge commit `1b3f836` produced **no**
369
369
  `deploy.yml` run, and only the next human push `d1fe18c` (which carries `1b3f836`
370
370
  as an ancestor) actually shipped it. **Never report shipped on ancestry alone.**
@@ -423,7 +423,7 @@ of section 2 are diagnose-only).
423
423
 
424
424
  Linear's GitHub integration completes a linked Issue on merge to **any** branch
425
425
  — branch-name linkage alone triggers it, even when the PR body carries only the
426
- non-closing `Linear: <ID>` reference form (incident of record: TunnlAI backend
426
+ non-closing `Linear: <ID>` reference form (incident of record: AcmeOrgD backend
427
427
  PR #207 merged to `dev`; TUN-256 auto-completed and had to be manually
428
428
  reverted). Run this step **as soon as the PR reports `MERGED`**, before the
429
429
  deploy-run verification above can terminate the flow — a `blocked:deploy`
@@ -239,7 +239,7 @@ An org secret defaults to `--visibility private`. `all` reaches public repositor
239
239
  ```json
240
240
  "propagating": [
241
241
  "LINEAR_API_KEY",
242
- { "name": "NPM_TOKEN", "targets": ["TunnlAI", "TunnlAI/wiki"] }
242
+ { "name": "NPM_TOKEN", "targets": ["AcmeOrgD", "AcmeOrgD/wiki"] }
243
243
  ]
244
244
  ```
245
245
 
@@ -248,8 +248,8 @@ export function installAwsProfiles(bundle, options = {}) {
248
248
  // Refuse to write a profile name the operator already uses outside our block.
249
249
  //
250
250
  // AWS does not error on a duplicate `[profile x]` — it resolves one and
251
- // ignores the other. So writing `tunnl-dev` next to an operator's existing SSO
252
- // `tunnl-dev` would silently run some calls as the wrong identity, which is
251
+ // ignores the other. So writing `acmeorgd-dev` next to an operator's existing SSO
252
+ // `acmeorgd-dev` would silently run some calls as the wrong identity, which is
253
253
  // worse than either winning outright. Merging protects their sections from
254
254
  // being deleted; this protects them from being shadowed.
255
255
  //
@@ -51,7 +51,7 @@ Print instructions for the user:
51
51
 
52
52
  The user picks a stable identifier for this workspace. Two options:
53
53
 
54
- - **Workspace name** (human-readable, e.g., `Gemini Sports`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
54
+ - **Workspace name** (human-readable, e.g., `AcmeOrgB`). Easy to recognize, can be ambiguous if a workspace is renamed in Notion. Recommended.
55
55
  - **Workspace UUID** (returned by Notion's API). Stable but opaque.
56
56
 
57
57
  Default to the workspace name. After the user stores the token (Step 4), Step 5's `/users/me` call surfaces the actual `bot.workspace_name`; if it differs from what the user typed (capitalization, trailing whitespace), prompt to confirm.
@@ -60,7 +60,7 @@ Default to the workspace name. After the user stores the token (Step 4), Step 5'
60
60
  WORKSPACE=$(jq -r '.notion.workspaceId // empty' .lisa.config.json 2>/dev/null)
61
61
  if [ -z "$WORKSPACE" ]; then
62
62
  # Prompt the user — accept any non-empty string. They pick the slug; we just store it.
63
- read -p "Workspace identifier (any stable slug, e.g. 'gemini-sports'): " WORKSPACE
63
+ read -p "Workspace identifier (any stable slug, e.g. 'acme-org-b'): " WORKSPACE
64
64
  fi
65
65
  ```
66
66