@codyswann/lisa 2.328.2 → 2.328.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 (127) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +15 -12
  3. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  4. package/dist/sync/lifecycle-defaults.d.ts +12 -3
  5. package/dist/sync/lifecycle-defaults.d.ts.map +1 -1
  6. package/dist/sync/lifecycle-defaults.js +13 -4
  7. package/dist/sync/lifecycle-defaults.js.map +1 -1
  8. package/dist/utils/usage-accounting.d.ts +42 -0
  9. package/dist/utils/usage-accounting.d.ts.map +1 -1
  10. package/dist/utils/usage-accounting.js +116 -3
  11. package/dist/utils/usage-accounting.js.map +1 -1
  12. package/package.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-linear-build-intake/SKILL.md +8 -8
  16. package/plugins/lisa/.codex-plugin/skills/lisa-linear-claim/SKILL.md +5 -4
  17. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +19 -19
  18. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  19. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +2 -2
  20. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +2 -2
  21. package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/SKILL.md +16 -2
  22. package/plugins/lisa/agents/linear-agent.md +2 -2
  23. package/plugins/lisa/agents/linear-build-intake.md +13 -13
  24. package/plugins/lisa/rules/reference/config-resolution.md +5 -3
  25. package/plugins/lisa/rules/reference/usage-accounting.md +37 -4
  26. package/plugins/lisa/scripts/queue-contract-resolution.mjs +20 -8
  27. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +8 -8
  28. package/plugins/lisa/skills/lisa-linear-claim/SKILL.md +6 -5
  29. package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +19 -19
  30. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  31. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +2 -2
  32. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +2 -2
  33. package/plugins/lisa/skills/lisa-usage-accounting/SKILL.md +16 -2
  34. package/plugins/lisa-agy/agents/linear-agent.md +2 -2
  35. package/plugins/lisa-agy/agents/linear-build-intake.md +13 -13
  36. package/plugins/lisa-agy/plugin.json +1 -1
  37. package/plugins/lisa-agy/scripts/queue-contract-resolution.mjs +20 -8
  38. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +8 -8
  39. package/plugins/lisa-agy/skills/lisa-linear-claim/SKILL.md +6 -5
  40. package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +19 -19
  41. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  42. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +2 -2
  43. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +2 -2
  44. package/plugins/lisa-agy/skills/lisa-usage-accounting/SKILL.md +16 -2
  45. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  48. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-copilot/agents/linear-agent.agent.md +2 -2
  52. package/plugins/lisa-copilot/agents/linear-build-intake.agent.md +13 -13
  53. package/plugins/lisa-copilot/rules/reference/config-resolution.md +5 -3
  54. package/plugins/lisa-copilot/rules/reference/usage-accounting.md +37 -4
  55. package/plugins/lisa-copilot/scripts/queue-contract-resolution.mjs +20 -8
  56. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +8 -8
  57. package/plugins/lisa-copilot/skills/lisa-linear-claim/SKILL.md +6 -5
  58. package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +19 -19
  59. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  60. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +2 -2
  61. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +2 -2
  62. package/plugins/lisa-copilot/skills/lisa-usage-accounting/SKILL.md +16 -2
  63. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-cursor/agents/linear-agent.md +2 -2
  65. package/plugins/lisa-cursor/agents/linear-build-intake.md +13 -13
  66. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +5 -3
  67. package/plugins/lisa-cursor/rules/usage-accounting-reference.mdc +37 -4
  68. package/plugins/lisa-cursor/scripts/queue-contract-resolution.mjs +20 -8
  69. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +8 -8
  70. package/plugins/lisa-cursor/skills/lisa-linear-claim/SKILL.md +6 -5
  71. package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +19 -19
  72. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  73. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +2 -2
  74. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +2 -2
  75. package/plugins/lisa-cursor/skills/lisa-usage-accounting/SKILL.md +16 -2
  76. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-expo-agy/plugin.json +1 -1
  79. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  84. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  89. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  94. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  99. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  103. package/plugins/lisa-rails-agy/plugin.json +1 -1
  104. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  108. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  109. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  112. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  113. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  114. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  116. package/plugins/src/base/agents/linear-agent.md +2 -2
  117. package/plugins/src/base/agents/linear-build-intake.md +13 -13
  118. package/plugins/src/base/rules/reference/config-resolution.md +5 -3
  119. package/plugins/src/base/rules/reference/usage-accounting.md +37 -4
  120. package/plugins/src/base/scripts/queue-contract-resolution.mjs +20 -8
  121. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +8 -8
  122. package/plugins/src/base/skills/lisa-linear-claim/SKILL.md +6 -5
  123. package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +19 -19
  124. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  125. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +2 -2
  126. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +2 -2
  127. package/plugins/src/base/skills/lisa-usage-accounting/SKILL.md +16 -2
@@ -154,12 +154,24 @@ The implementation path should use the shared utility layer (`parseLisaUsageSect
154
154
  `mergeLisaUsageEntries`, `createLisaUsageRollup`, `upsertLisaUsageSection`) rather than duplicating
155
155
  token parsing or markdown rendering in each caller.
156
156
 
157
- ### Step 4 — Persist and report
157
+ ### Step 4 — Persist, verify by read-back, and report
158
158
 
159
159
  1. If the rendered ledger body is byte-identical to the current managed surface, return `outcome:
160
160
  no-op`.
161
161
  2. Otherwise write the body or managed comment through the host adapter.
162
- 3. Return the exact writable surface used, direct entry ids, rolled-up child entry ids, totals, and
162
+ 3. **Read the written surface back from the host and parse it.** Run
163
+ `verifyLisaUsageSectionIntegrity(<stored body>, { entryIds: <ids just written> })`. A write is
164
+ successful only when that returns `ok: true`. The host's mutation result is not evidence — a
165
+ Linear `issueUpdate` returned `success: true` while silently discarding every entry token
166
+ (2026-08-04), which is the defect this step exists to catch.
167
+ 4. If verification fails on the body, retry the identical payload as a managed comment and verify
168
+ that surface the same way. Return `outcome: comment-fallback` with a warning naming the failed
169
+ surface and the issue codes.
170
+ 5. If verification fails on every surface, return `outcome: blocked` with the issue codes in
171
+ `error.message`. **Never leave a rollup token behind whose `direct_entry_ids` names entries that
172
+ cannot be parsed from the same surface** — restore the prior managed content rather than
173
+ reporting success over an unreadable ledger.
174
+ 6. Return the exact writable surface used, direct entry ids, rolled-up child entry ids, totals, and
163
175
  any fallback warning.
164
176
 
165
177
  If the host write fails, preserve the exact error text in `error.message`. Do not collapse write
@@ -179,4 +191,6 @@ failures into a generic "usage update failed."
179
191
  - Never skip rollup dedupe. Child totals are keyed by stable `entry_id`, not by child ref count.
180
192
  - Never silently drop to comments. Return `outcome: comment-fallback` so the caller can surface the
181
193
  writable surface that actually holds the ledger.
194
+ - Never report `updated` on the strength of a mutation's return value. Verification is read-back
195
+ and parse, on every surface, every write.
182
196
  - Never overwrite unrelated artifact body content. Rewrite only the managed usage section/comment.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.328.2",
3
+ "version": "2.328.4",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -47,7 +47,7 @@ Use the `linear-verify` skill to check the item against organizational standards
47
47
 
48
48
  **Gating behavior — this is the one place auto-transitioning is allowed:**
49
49
 
50
- Resolve build labels from `.lisa.config.json` `linear.workflow.*` (defaults: `Todo` / `In Progress` / `In Review`); resolve the `blocked` label from the same section (`linear.workflow.blocked`, default `Blocked`) and the `human_needed` marker label from the same section (`linear.labels.build.human_needed`, default `human-needed`).
50
+ Resolve build-lifecycle STATES from `.lisa.config.json` `linear.workflow.*` (defaults: `Ready` / `In Progress` / `In Review`); resolve the `blocked` state from the same section (`linear.workflow.blocked`, default `Blocked`) and the `human_needed` marker label from the same section (`linear.labels.build.human_needed`, default `human-needed`).
51
51
 
52
52
  If `linear-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the creator:
53
53
  1. **Best-effort autofill (before blocking).** Run `pre-flight-autofill` for every work item. Preserve a human bare configured key or `Confirmed: <env>`; automation writes `Inferred: <env> — evidence: <title|body|reproduction|hostname>`, `Assumption: <env> — remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces the annotation with the bare key or `Confirmed: <env>`. For a legacy bare value, use managed draft markers and current ticket content only; provider edit history is not required. A marker proves automation and requires re-annotation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Resolve one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname; exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. A reported bug environment is an example, not a restriction. Evidence supersedes only `Assumption:`. Normalize `prod` ↔ `production` only when exactly one is configured; no other aliases exist. Conflicts stop; never infer from arbitrary branch text, URL paths/query strings, or substrings. Write through `linear-write-issue`, never overwrite human prose, then re-run `linear-verify`.
@@ -112,7 +112,7 @@ Use the `linear-sync` skill to update the item at these milestones:
112
112
  Use the `linear-evidence` skill to:
113
113
  - Upload verification evidence to the GitHub PR
114
114
  - Post evidence summary as a Linear comment
115
- - Transition labels: remove the configured `claimed` label, add the configured `review` label (`linear.labels.build.{claimed,review}`)
115
+ - Transition the workflow state: move from the configured `claimed` state to the configured `review` state (`linear.workflow.{claimed,review}`)
116
116
 
117
117
  ### 8. Suggest Status Transition
118
118
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: linear-build-intake
3
- description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims Issues carrying the configured `ready` build label, dispatches each to the linear-agent build flow, relabels to the configured (env-aware) `done` label on success. Symmetric counterpart of jira-build-intake and github-build-intake. Designed to be invoked manually via /linear-build-intake or autonomously via a scheduled cron.
3
+ description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims Issues in the configured `ready` workflow state, dispatches each to the linear-agent build flow, transitions to the configured (env-aware) `done` state on success. Symmetric counterpart of jira-build-intake and github-build-intake. Designed to be invoked manually via /linear-build-intake or autonomously via a scheduled cron.
4
4
  skills:
5
5
  - linear-build-intake
6
6
  - linear-read-issue
@@ -15,21 +15,21 @@ skills:
15
15
 
16
16
  # Linear Build Intake Agent
17
17
 
18
- You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find Issues carrying the configured `ready` build label, dispatch each through the build flow, relabel successful builds to the configured (env-aware) `done` label — then report what happened.
18
+ You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find Issues in the configured `ready` workflow STATE, dispatch each through the build flow, transition successful builds to the configured (env-aware) `done` state — then report what happened.
19
19
 
20
- Build-lifecycle role names (`ready`, `claimed`, `review`, `blocked`, `done`) are resolved from `.lisa.config.json` `linear.workflow.*` by the `linear-build-intake` skill, and name native **workflow states**, not labels. Defaults: `Todo`, `In Progress`, `In Review`, `Blocked`, env-keyed `{ dev: "On Dev", staging: "On Stg", production: "Done" }`.
20
+ Build-lifecycle role names (`ready`, `claimed`, `review`, `blocked`, `done`) are resolved from `.lisa.config.json` `linear.workflow.*` by the `linear-build-intake` skill, and name native **workflow states**, not labels. Defaults: `Ready`, `In Progress`, `In Review`, `Blocked`, env-keyed `{ dev: "On Dev", staging: "On Stg", production: "Done" }`. `ready` is a DEDICATED state, never the team default (`Todo`) — mapping it to the default makes every untouched backlog item claimable.
21
21
 
22
22
  ## Confirmation policy
23
23
 
24
- Once you have a team key, RUN. Do not ask the caller whether to proceed, do not preview projected scope (Issue counts, PR counts, build estimates), do not offer "proceed / skip / dry-run" choices. The caller has already authorized the run by invoking you. The pre-flight configured `blocked` label outcome owned by `linear-agent` is a valid terminal state of the per-Issue lifecycle, not a failure mode — large queues and complex Issues are exactly what this skill is for. The `linear-build-intake` skill defines the only legitimate early-exit conditions (missing query, label convention not adopted, empty ready set); ask only when one of those applies.
24
+ Once you have a team key, RUN. Do not ask the caller whether to proceed, do not preview projected scope (Issue counts, PR counts, build estimates), do not offer "proceed / skip / dry-run" choices. The caller has already authorized the run by invoking you. The pre-flight configured `blocked` state outcome owned by `linear-agent` is a valid terminal state of the per-Issue lifecycle, not a failure mode — large queues and complex Issues are exactly what this skill is for. The `linear-build-intake` skill defines the only legitimate early-exit conditions (missing query, workflow states not adopted, empty ready set); ask only when one of those applies.
25
25
 
26
26
  ## Workflow
27
27
 
28
28
  ### 1. Receive the query
29
29
 
30
- The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear team key (e.g. `ENG`) or the literal token `linear` (which falls back to `linear.teamKey` in `.lisa.config.json`). You do not pick the team yourself. Lifecycle label names are read from `linear.workflow.*` and are not your concern at this layer.
30
+ The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear team key (e.g. `ENG`) or the literal token `linear` (which falls back to `linear.teamKey` in `.lisa.config.json`). You do not pick the team yourself. Lifecycle state names are read from `linear.workflow.*` and are not your concern at this layer.
31
31
 
32
- If no query is provided AND no `linear.teamKey` is configured, stop and ask. Never run intake against a default scope without explicit configuration — the side effects (label transitions, PRs opened, builds running) are too high to act without an explicit target.
32
+ If no query is provided AND no `linear.teamKey` is configured, stop and ask. Never run intake against a default scope without explicit configuration — the side effects (state transitions, PRs opened, builds running) are too high to act without an explicit target.
33
33
 
34
34
  ### 2. Run the intake skill
35
35
 
@@ -42,23 +42,23 @@ The skill runs the linear-agent workflow in-session per Issue — read full grap
42
42
  Pass the skill's summary block through to the caller verbatim. The caller needs the structured record:
43
43
 
44
44
  - Total processed
45
- - Per-Issue outcomes (configured `done` label → which PR; configured `blocked` label by verify → which gate; `Held` by triage → which ambiguities; Errors → reason)
45
+ - Per-Issue outcomes (configured `done` state → which PR; configured `blocked` state by verify → which gate; `Held` by triage → which ambiguities; Errors → reason)
46
46
  - PR count
47
47
 
48
- If the cycle errored before processing any Issues (e.g. label convention not adopted — the configured `ready` label doesn't exist on the team), surface the cause in plain language and stop. Do NOT attempt to invent labels.
48
+ If the cycle errored before processing any Issues (e.g. workflow states not adopted — the configured `ready` state doesn't exist on the team), surface the cause in plain language and stop. Do NOT attempt to invent states: a workflow state carries a `type` and a board position, and guessing either puts an Issue somewhere no human sanctioned. Point at `/lisa:setup:linear`.
49
49
 
50
50
  ### 4. Suggest next actions when warranted
51
51
 
52
- After a successful cycle, if any Issues ended at the configured `done` label, mention whether the vendor skill also performed terminal native completion. This skill does not own anything past `done`, except that `linear-build-intake` moves the native Issue state to Done / Completed when `done` is the true terminal value per `leaf-only-lifecycle`.
52
+ After a successful cycle, if any Issues ended at the configured `done` state, note which env rung they reached. Terminal closure needs no separate step now: only the production/final `done` state is typed `completed`, so reaching it IS the native closure, while the intermediate env rungs are typed `started` and correctly leave the Issue open.
53
53
 
54
- If any Issues ended at the configured `blocked` label (pre-flight verify failed) or `Held` (triage found ambiguities), point that out so the caller knows which Issues need human attention before they can be re-claimed. The blocked ones were transitioned by `linear-agent`'s gate logic — that is correct and expected.
54
+ If any Issues ended at the configured `blocked` state (pre-flight verify failed) or `Held` (triage found ambiguities), point that out so the caller knows which Issues need human attention before they can be re-claimed. The blocked ones were transitioned by `linear-agent`'s gate logic — that is correct and expected.
55
55
 
56
56
  ## Rules
57
57
 
58
58
  - **Never run a cycle without an explicit query or configured `linear.teamKey`.** Side effects too high to default.
59
- - **Never modify the lifecycle**: only the configured `ready → claimed → done` transitions and terminal-only native Issue completion. Never touch the configured `blocked` label (owned by `linear-agent`) or any other label. (Exception: the configured `review` label is set by `linear-evidence` mid-flow — that's not your concern.)
59
+ - **Never modify the lifecycle**: only the configured `ready → claimed → done` state transitions. Never move an Issue to the configured `blocked` state (owned by `linear-agent`) or to any state outside those three. (Exception: the configured `review` state is set by `linear-evidence` mid-flow — that's not your concern.)
60
60
  - **Never bypass `linear-agent` to do build work directly.** The intake skill dispatches; `linear-agent` builds. Skipping the dispatch produces broken work.
61
- - **Never invent labels.** Names live in `.lisa.config.json` `linear.workflow.*` (canonical) — the setup skill writes them. If a team hasn't adopted them yet, the skill exits with an adoption hint. Don't guess label names.
61
+ - **Never invent states.** Names live in `.lisa.config.json` `linear.workflow.*` (canonical) — the setup skill writes them. If a team hasn't adopted them yet, the skill exits with an adoption hint. Don't guess state names.
62
62
  - **Never start a second cycle while one is in flight against an overlapping team.** Serial execution. Scheduling layer (when added) is responsible for not double-firing.
63
63
  - **Stop and surface failures rather than retry-loop.** If `linear-agent` returns an unexpected response or an error, the skill records it under "Errors" — pass that through. Do not auto-retry.
64
- - **Pre-flight failures are not your problem to fix.** If an Issue fails `linear-verify` (missing Validation Journey, sign-in, etc.), `linear-agent` transitions it to the configured `blocked` label and reassigns to the creator. Surface the count and move on. Do NOT try to add the missing pieces from this agent.
64
+ - **Pre-flight failures are not your problem to fix.** If an Issue fails `linear-verify` (missing Validation Journey, sign-in, etc.), `linear-agent` transitions it to the configured `blocked` state and reassigns to the creator. Surface the count and move on. Do NOT try to add the missing pieces from this agent.
@@ -344,7 +344,7 @@ When `github.projects.v2` is present, later setup/doctor and writer preflight va
344
344
  |-------|---------------|-------|
345
345
  | `linear.workspace` | `tracker = "linear"`, `source = "linear"`, or any `linear-*` skill is invoked | Linear workspace slug (e.g. `acme`). |
346
346
  | `linear.teamKey` | `tracker = "linear"` | Linear team key (e.g. `ENG`). The team owns the destination Issues. For source mode, projects are workspace-scoped or team-scoped per the URL passed. |
347
- | `linear.workflow` | `tracker = "linear"` | Workflow **state** name per build lifecycle role — the Linear analogue of `jira.workflow`, not of `github.labels`. Defaults `{ ready: "Todo", claimed: "In Progress", review: "In Review", blocked: "Blocked", done: { dev: "On Dev", staging: "On Stg", production: "Done" } }`. Resolve and verify with `/lisa:setup:linear`. |
347
+ | `linear.workflow` | `tracker = "linear"` | Workflow **state** name per build lifecycle role — the Linear analogue of `jira.workflow`, not of `github.labels`. Defaults `{ ready: "Ready", claimed: "In Progress", review: "In Review", blocked: "Blocked", done: { dev: "On Dev", staging: "On Stg", production: "Done" } }`. **`ready` is a dedicated state, never the team's default** — see below. Resolve and verify with `/lisa:setup:linear`. |
348
348
  | `linear.labels` | `tracker = "linear"` or `source = "linear"` | **Markers and the PRD lane only.** `build.human_needed` (default `human-needed`) and the `prd.*` map. The build lifecycle does **not** live here — see `linear.workflow`. |
349
349
 
350
350
  ##### Why Linear uses states, not labels
@@ -429,7 +429,7 @@ Every lifecycle skill operates on a fixed set of **roles** (`ready`, `claimed`,
429
429
 
430
430
  | Role | What it means | JIRA default | Linear default | GitHub default |
431
431
  |---|---|---|---|---|
432
- | `ready` | Human signal "this is buildable; agent may claim" | `Ready` (status) | `Todo` (state) | `status:ready` (label) |
432
+ | `ready` | Human signal "this is buildable; agent may claim" | `Ready` (status) | `Ready` (state) | `status:ready` (label) |
433
433
  | `claimed` | Agent has picked the item up | `In Progress` (status) | `In Progress` (state) | `status:in-progress` (label) |
434
434
  | `review` | Optional post-build review hold, when a tracker/project still uses one | `Code Review` (status) | `In Review` (state) | no default review label |
435
435
  | `blocked` | Agent stopped on triage ambiguities or external blocker | `Blocked` (status) | `Blocked` (state) | `status:blocked` (label) |
@@ -439,7 +439,9 @@ Every lifecycle skill operates on a fixed set of **roles** (`ready`, `claimed`,
439
439
 
440
440
  `review` is optional. GitHub build intake skips it by default and moves successful builds directly from `claimed` to the configured `done` label. Linear and JIRA projects that still use a post-build review hold can configure `review`; projects that keep the ticket in `claimed` until terminal can omit it and lifecycle skills will skip the intermediate transition.
441
441
 
442
- **Linear state resolution is `type`-aware.** When a configured name is missing, a lifecycle skill may fall back to the team's states by `type` `ready` the lowest-position `unstarted`, `claimed` the lowest-position `started`, terminal `done` `completed` but only to *read*; it must never invent a state to write into. Missing states are a setup defect, repaired by `/lisa:setup:linear`, not papered over at runtime.
442
+ **`ready` must never resolve to the team's DEFAULT state.** `Todo` is where Linear puts a brand-new issue, so using it for `ready` inverts the gate: the lane stops meaning "a human flipped this to build-ready" and starts meaning "nobody has touched this". Measured on the first team migrated: 20 issues in the lane, only 8 ever explicitly marked ready. JIRA avoids this because `jira.workflow.ready` is a dedicated `Ready` status while a fresh ticket lands in the project default.
443
+
444
+ **Linear state resolution is `type`-aware.** When a configured name is missing, a lifecycle skill may fall back to the team's states by `type` — `claimed`/`review` → the lowest-position `started`, `blocked` → `started` or `unstarted`, terminal `done` → `completed` — but only to *read*. **`ready` has no fallback on purpose:** every candidate would be the team's default unstarted state, which is exactly the inversion described above. A missing `ready` state is reported, never guessed; it must never invent a state to write into. Missing states are a setup defect, repaired by `/lisa:setup:linear`, not papered over at runtime.
443
445
 
444
446
  `blocked` is what every vendor agent flips to when triage finds unresolved ambiguities or the build path is blocked by something the agent can't resolve. Different from `claimed` because it explicitly signals "human attention required."
445
447
 
@@ -75,14 +75,24 @@ cost rollups under the normal pricing and currency rules.
75
75
 
76
76
  ## Machine-readable tokens
77
77
 
78
- Every visible direct entry row contains the backward-compatible 17-field primary token:
78
+ Every visible direct entry row has a corresponding backward-compatible 17-field primary token:
79
79
 
80
80
  ```text
81
81
  <!-- lisa:usage-entry entry_id=<id> flow=<flow> run_id=<run-id> provider=<provider> model=<model> source=<source> input_tokens=<n|null> cached_input_tokens=<n|null> output_tokens=<n|null> reasoning_tokens=<n|null> total_tokens=<n|null> cost=<decimal|null> currency=<code|null> pricing_status=<status> pricing_source=<ref|null> artifact_ref=<ref> parent_artifact_ref=<ref-or-empty> -->
82
82
  ```
83
83
 
84
- The row immediately follows it with a correlated measured-subset extension. Writers serialize an
85
- omitted value as `null` instead of `undefined`:
84
+ **Entry tokens are never rendered inside a table row.** They occupy their own lines below the
85
+ visible table, and they correlate to their rows by `entry_id`, not by position. Hosts that
86
+ normalize markdown re-serialize a table from its parsed cell model and discard anything that is
87
+ not a cell: measured against Linear on 2026-08-04, an HTML comment trailing a table row is
88
+ destroyed on write while the same comment on its own line round-trips byte-identically. The
89
+ row-trailing layout therefore produced a ledger that reported a successful write, rendered
90
+ correctly for humans, and enumerated **zero** entries — with a surviving rollup token still naming
91
+ them. Parsing is position-agnostic and always has been, so sections written in the historical
92
+ row-trailing layout still enumerate, and migrate to the own-line layout on their next rewrite.
93
+
94
+ The primary token is immediately followed on the same line by a correlated measured-subset
95
+ extension. Writers serialize an omitted value as `null` instead of `undefined`:
86
96
 
87
97
  ```text
88
98
  <!-- lisa:usage-entry-measured-subset entry_id=<id> measured_subset_tokens=<n|null> -->
@@ -141,7 +151,9 @@ _Managed by Lisa. Regenerated on each usage update; do not edit by hand._
141
151
 
142
152
  | Flow | Model | Source | Tokens | Cost |
143
153
  |---|---|---|---:|---:|
144
- | ...human-readable rows ending with `lisa-usage-entry` tokens... |
154
+ | ...human-readable rows, cells only, no tokens... |
155
+
156
+ <!-- lisa:usage-entry ... --> <!-- lisa:usage-entry-measured-subset ... -->
145
157
 
146
158
  ### Rollup
147
159
 
@@ -154,8 +166,29 @@ _Managed by Lisa. Regenerated on each usage update; do not edit by hand._
154
166
  <!-- lisa:usage-rollup ... -->
155
167
  ```
156
168
 
169
+ Every machine-readable token sits on its own line, outside every table. One entry contributes one
170
+ token line; multiple entries contribute consecutive token lines in the same order as their visible
171
+ rows.
172
+
157
173
  Writers may add host-specific surrounding prose, but they must preserve the heading, the managed-note line, the direct-entry tokens, and the single rollup token.
158
174
 
175
+ ## Write verification
176
+
177
+ A write surface can accept a section, report success, and silently destroy part of it. **Verify
178
+ every managed write by reading the stored bytes back and parsing them — never by the mutation's
179
+ return value.** A write is successful only when the stored surface satisfies the rollup/entry
180
+ agreement invariant below. A caller that cannot verify a surface must fall back to one it can, or
181
+ fail loudly; it must never report success over an unreadable ledger.
182
+
183
+ - Every `entry_id` in the rollup's `direct_entry_ids` resolves to a parseable direct entry in the
184
+ same section.
185
+ - Every parseable direct entry in the section appears in the rollup's `direct_entry_ids`.
186
+ - Every entry the caller just wrote is parseable from the stored surface.
187
+
188
+ `verifyLisaUsageSectionIntegrity` in the shared utility layer implements exactly these checks and
189
+ returns structured issue codes (`missing-section`, `missing-entry-token`, `missing-rollup-token`,
190
+ `unrecorded-entry`). Callers run it against the read-back body, not against the payload they sent.
191
+
159
192
  ## Rollup and dedupe behavior
160
193
 
161
194
  Rollups aggregate descendant usage from native tracker hierarchy, documented generated-work references, and explicit `parent_artifact_ref` links. Within one artifact rollup: