@codyswann/lisa 2.328.3 → 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 (111) hide show
  1. package/dist/core/upstream-evidence-manifest.js +10 -10
  2. package/dist/sync/lifecycle-defaults.d.ts +12 -3
  3. package/dist/sync/lifecycle-defaults.d.ts.map +1 -1
  4. package/dist/sync/lifecycle-defaults.js +13 -4
  5. package/dist/sync/lifecycle-defaults.js.map +1 -1
  6. package/package.json +1 -1
  7. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  8. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  9. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +8 -8
  10. package/plugins/lisa/.codex-plugin/skills/lisa-linear-claim/SKILL.md +5 -4
  11. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +19 -19
  12. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  13. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +2 -2
  14. package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +2 -2
  15. package/plugins/lisa/agents/linear-agent.md +2 -2
  16. package/plugins/lisa/agents/linear-build-intake.md +13 -13
  17. package/plugins/lisa/rules/reference/config-resolution.md +5 -3
  18. package/plugins/lisa/scripts/queue-contract-resolution.mjs +20 -8
  19. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +8 -8
  20. package/plugins/lisa/skills/lisa-linear-claim/SKILL.md +6 -5
  21. package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +19 -19
  22. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  23. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +2 -2
  24. package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +2 -2
  25. package/plugins/lisa-agy/agents/linear-agent.md +2 -2
  26. package/plugins/lisa-agy/agents/linear-build-intake.md +13 -13
  27. package/plugins/lisa-agy/plugin.json +1 -1
  28. package/plugins/lisa-agy/scripts/queue-contract-resolution.mjs +20 -8
  29. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +8 -8
  30. package/plugins/lisa-agy/skills/lisa-linear-claim/SKILL.md +6 -5
  31. package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +19 -19
  32. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  33. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +2 -2
  34. package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +2 -2
  35. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  38. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-copilot/agents/linear-agent.agent.md +2 -2
  42. package/plugins/lisa-copilot/agents/linear-build-intake.agent.md +13 -13
  43. package/plugins/lisa-copilot/rules/reference/config-resolution.md +5 -3
  44. package/plugins/lisa-copilot/scripts/queue-contract-resolution.mjs +20 -8
  45. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +8 -8
  46. package/plugins/lisa-copilot/skills/lisa-linear-claim/SKILL.md +6 -5
  47. package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +19 -19
  48. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  49. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +2 -2
  50. package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +2 -2
  51. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-cursor/agents/linear-agent.md +2 -2
  53. package/plugins/lisa-cursor/agents/linear-build-intake.md +13 -13
  54. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +5 -3
  55. package/plugins/lisa-cursor/scripts/queue-contract-resolution.mjs +20 -8
  56. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +8 -8
  57. package/plugins/lisa-cursor/skills/lisa-linear-claim/SKILL.md +6 -5
  58. package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +19 -19
  59. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  60. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +2 -2
  61. package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +2 -2
  62. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-expo-agy/plugin.json +1 -1
  65. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  70. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  75. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  80. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  84. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  85. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  89. package/plugins/lisa-rails-agy/plugin.json +1 -1
  90. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  94. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  95. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  99. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  100. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  102. package/plugins/src/base/agents/linear-agent.md +2 -2
  103. package/plugins/src/base/agents/linear-build-intake.md +13 -13
  104. package/plugins/src/base/rules/reference/config-resolution.md +5 -3
  105. package/plugins/src/base/scripts/queue-contract-resolution.mjs +20 -8
  106. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +8 -8
  107. package/plugins/src/base/skills/lisa-linear-claim/SKILL.md +6 -5
  108. package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +19 -19
  109. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +5 -5
  110. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +2 -2
  111. package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +2 -2
@@ -207,8 +207,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
207
207
  "plugins/src/base/agents/learner.md": "50582e72b11eeb6b085845f2e32c31a6dcedd0439ca566bb1cca228dd1a45fee",
208
208
  "plugins/src/base/agents/learning-judge.md": "28618c3e20a0f790e4d254a9c8118645774233f19e3042b3cfeddf4ffbaf783a",
209
209
  "plugins/src/base/agents/learnings-synthesizer.md": "186ea8a1baa66443eb73dcefb93aa8a767e3d600618de6359a09a0413f1f52c0",
210
- "plugins/src/base/agents/linear-agent.md": "b44ae47e345e611c75abc5e15999d8e06b2f3c253f49fcc82540fc2e0f4aca23",
211
- "plugins/src/base/agents/linear-build-intake.md": "9dc3bce24b62938f7f2895fa1b23fa5d2403cf281cb68c2dad956198c216b62a",
210
+ "plugins/src/base/agents/linear-agent.md": "d55664da47505d702d9bbbb96f9f98930d871acc5fc2972d35e1ae143f2dbde7",
211
+ "plugins/src/base/agents/linear-build-intake.md": "1dbc43b74857a1f6d99394a206a510d95c0875946fa6f4d94f90706cbd29e7b4",
212
212
  "plugins/src/base/agents/linear-prd-intake.md": "28c4ee9f2ebbb4f089dd54bb4633063b48ea8099327a0bf2923825d83c3fe07c",
213
213
  "plugins/src/base/agents/notion-prd-intake.md": "53df0fba395b10b17bafe1a82c8c2706e4ec029d2aee8f3a2e7d5afe38d9be98",
214
214
  "plugins/src/base/agents/performance-specialist.md": "39c088eaf9347410988a82310e3a151034cbac28a756b1c7b28bb4c1c32a6a5d",
@@ -357,7 +357,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
357
357
  "plugins/src/base/rules/reference/claim-archaeology.md": "fff025d47848c768d5b2c7047de744b7151eb2e44148d2df058c87310859457b",
358
358
  "plugins/src/base/rules/reference/claim-evidence-mapping.md": "49a3bbf4e8a9a8ca9e13eeafa672517d077060cfeb5d9710881ec9f5c3f3ec75",
359
359
  "plugins/src/base/rules/reference/coding-philosophy.md": "fed8381f16a5d6793a49d84d5813d62125808cb2f4981a558b119cf63e2586d9",
360
- "plugins/src/base/rules/reference/config-resolution.md": "b3741243e7df42c6c5bfbee5b7c5d36a24ce9cfac861f595d02a180fdb9f7f87",
360
+ "plugins/src/base/rules/reference/config-resolution.md": "76fae921ab507361ef91e6f9ee2e4ec8122062be6cfe8a7632ef216ea36d1702",
361
361
  "plugins/src/base/rules/reference/convergent-review.md": "788a9d4dc2af7a928c3ccbb4d53a92856bb3544941ce512cfe38068d6b35850d",
362
362
  "plugins/src/base/rules/reference/dependency-decision-records.md": "84f9fb8fa0a606307e828ec355ccbf2258beeeb88795dd113abe9bb2c37db39f",
363
363
  "plugins/src/base/rules/reference/dependency-internalization-kit.md": "8c8e9bddbe2165905c3919ae9dd3d131b557cf9c7eb370393dfa85827076c73b",
@@ -402,7 +402,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
402
402
  "plugins/src/base/scripts/install-remote-agent-aws.mjs": "5ef1c323d7cbfda8976f6fb0c24f7a8e5f5757475fd1d71c6e5bec91023cebe3",
403
403
  "plugins/src/base/scripts/plugin-sync-explain.mjs": "8592c7359ee6cdb35995a882c8bb27e7b9c404074067fd272c70013e44e04b71",
404
404
  "plugins/src/base/scripts/project-ideation-idempotency-harness.mjs": "81b6eb911cf5cf6d1913cacf65b6ae298732e0a4e92529aed6767cdf79ab2ec0",
405
- "plugins/src/base/scripts/queue-contract-resolution.mjs": "a3949db1058a97f6c20280b1dfcbd3e246385fb3b15c642f90f13bd7df1e4aa7",
405
+ "plugins/src/base/scripts/queue-contract-resolution.mjs": "189f1d0be562c442b5db07efdb87783e964c08016e2761ae58da252bd17ba20b",
406
406
  "plugins/src/base/scripts/queue-health-classification.mjs": "07fd596da5792d8bd29f2d51584c59011d3d06256eae601b27a3c72730b42333",
407
407
  "plugins/src/base/scripts/queue-status-build-readers.mjs": "1e05181dc8fbe2a4f0c04ce73fdfe1c3a7fc1777cb66e95d7e9a593559c8ca27",
408
408
  "plugins/src/base/scripts/queue-status-prd-readers.mjs": "32b4366fc292062c869793aeaf5b006ff400df5da09ee510f862e15d59a77770",
@@ -484,18 +484,18 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
484
484
  "plugins/src/base/skills/lisa-learnings-audit/SKILL.md": "0f56daf610cab90a2127cebf83a5bbe05cdcba0f692ebfae8fcf3da153826316",
485
485
  "plugins/src/base/skills/lisa-linear-access/SKILL.md": "aa1f4505696e869f173bd4d335b216365ab5238aaa001654547dd2e3c99fe287",
486
486
  "plugins/src/base/skills/lisa-linear-add-journey/SKILL.md": "0a9f2bd0e19fbaa4794537e436c22748c7621644253a91923d84bc77ca43f793",
487
- "plugins/src/base/skills/lisa-linear-build-intake/SKILL.md": "56d46a8812ba9e6aabc56fc12c5f96f1112ca5c9920b9e7a48b84c284c4c82c4",
488
- "plugins/src/base/skills/lisa-linear-claim/SKILL.md": "9bf4de0693d62c8be493f1e6d9eff88e89aa6707a55b4df9cb14e651e7217e7c",
487
+ "plugins/src/base/skills/lisa-linear-build-intake/SKILL.md": "b93b449a1d4b7ff4eb659e0f11e12b612cb6f44d78e53b64c2e8af6c78d4e4c7",
488
+ "plugins/src/base/skills/lisa-linear-claim/SKILL.md": "d3fee9a0435e93402be53769313f971c77b847521826fbaee0d19a0bdbc34b93",
489
489
  "plugins/src/base/skills/lisa-linear-create/SKILL.md": "4c769499b3db0fbf60e2f5fe1116ea3536012a9af5f78ee4858508090e340322",
490
490
  "plugins/src/base/skills/lisa-linear-evidence/SKILL.md": "4d1d98927388275e8f2e52dd38b5faf0bc19aef2bd456c8abfb74c009d46fcfc",
491
491
  "plugins/src/base/skills/lisa-linear-journey/SKILL.md": "6f189eba5d96f8537883277de1d2d6c87d08226e90df5dd73f16852b0a46224e",
492
492
  "plugins/src/base/skills/lisa-linear-prd-intake/SKILL.md": "8a2d577e16b3762093fd2a217a544896676ef00b4fc9d72903ae03853134eb3b",
493
493
  "plugins/src/base/skills/lisa-linear-read-issue/SKILL.md": "a6b8241648ba4b7b9f1196a37e9924ffaccc5461f3ac2ee8ae283c58559e9717",
494
- "plugins/src/base/skills/lisa-linear-sync/SKILL.md": "4414647943e6675d7e8da5d26fd673af212c9aba226f0cff6b679abb52410477",
494
+ "plugins/src/base/skills/lisa-linear-sync/SKILL.md": "2bafb2dffbc3bdc3765e784bb809ced6cbb7545cf213d816242804ac46fafef9",
495
495
  "plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md": "e811825c562fe5b406ae1364a809d1fb6793c0ad4c2d384c48f4e2cc1d9fe760",
496
- "plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md": "25f1a6b136a8643841fc3a4fef33927cacfbc7a14d32aa829851a3d03f2f5f31",
496
+ "plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md": "ea49dd181a43adb566e29848bb7ac98087dd0dd1c46d9edeac524a8f6e18677e",
497
497
  "plugins/src/base/skills/lisa-linear-verify/SKILL.md": "d11a58bd7c2b773a973fe8f8ad19a2621f038327ee2d8afa3039bd72885f5e97",
498
- "plugins/src/base/skills/lisa-linear-write-issue/SKILL.md": "c44f582de0be4d264dc110e79eaff34b309b059f9bfd9bcd622b0604749a2b9c",
498
+ "plugins/src/base/skills/lisa-linear-write-issue/SKILL.md": "16535e9e081f5ffb872530879c859ad08d2569e2c788df47762771922f7746a0",
499
499
  "plugins/src/base/skills/lisa-linear-write-prd/SKILL.md": "ad4289b5530d65d3b61b27da54db8cd7f8e9133f97326d8961f853f364c5b457",
500
500
  "plugins/src/base/skills/lisa-monitor/SKILL.md": "e441767176da88484b8034df9589cb33240d5d895339ee96926917a52a103423",
501
501
  "plugins/src/base/skills/lisa-nightly-add-test-coverage/SKILL.md": "1e8d7c9519e107ca21aaa9438515b4d51fac4cd25f2a0f80bdb4e037ac89856c",
@@ -565,7 +565,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
565
565
  "plugins/src/base/skills/lisa-setup-github/SKILL.md": "75435e81130abd21c678d302b7a220da95a19868d122ca93168278628b200666",
566
566
  "plugins/src/base/skills/lisa-setup-jira/SKILL.md": "261acaeb2923cc9238f468dcf986a0e1323a67e1e51d175b2c1b700dacab2fb8",
567
567
  "plugins/src/base/skills/lisa-setup-kane/SKILL.md": "fe50024a4f896af01716f2435f57227b1f8de61803e80bf3e3c3247ec179b103",
568
- "plugins/src/base/skills/lisa-setup-linear/SKILL.md": "857a6323e8f2b4ddae3fddeeb700332822117dbf2326ea3c21fcd69442f012ef",
568
+ "plugins/src/base/skills/lisa-setup-linear/SKILL.md": "02efe0eb8867632e62cf3415df4c41854029fa121250816e531fd83082ee9304",
569
569
  "plugins/src/base/skills/lisa-setup-local-env/SKILL.md": "4d4b8c92e3616256f5f689fbe433f09c31d39c623508bc4ec0d8c1770caddf22",
570
570
  "plugins/src/base/skills/lisa-setup-local-env/scripts/local-env.mjs": "bff68aa66d6d4cd7cb9d0e39be691c6daa232edb097f8a601815432a32cca6a6",
571
571
  "plugins/src/base/skills/lisa-setup-notion/SKILL.md": "f5a1e9290789fd1c33675168d30461fb24a11c98a433ef777c1f536bc2f905ef",
@@ -45,10 +45,19 @@ export declare const BUILD_LABEL_DEFAULTS: {
45
45
  * is a one-key override.
46
46
  *
47
47
  * A stock Linear team ships `Todo`, `In Progress`, `In Review` and `Done` but
48
- * NOT `Blocked`, `On Dev` or `On Stg`. `lisa-setup-linear` resolves each role
49
- * and offers to create what is missing; it never invents a name silently. The
50
- * env rungs must be typed `started`, never `completed` — see the
48
+ * NOT `Ready`, `Blocked`, `On Dev` or `On Stg`. `lisa-setup-linear` resolves
49
+ * each role and offers to create what is missing; it never invents a name
50
+ * silently. The env rungs must be typed `started`, never `completed` — see the
51
51
  * `config-resolution` rule.
52
+ *
53
+ * **`ready` must be a DEDICATED state, never the tracker's default.** `Todo` is
54
+ * where Linear puts a brand-new issue, so mapping `ready` to it inverts the
55
+ * gate — the lane stops meaning "a human flipped this to build-ready" and
56
+ * starts meaning "nobody has touched this", making every untouched backlog item
57
+ * claimable. Measured on the first team migrated: 20 issues in the lane, only 8
58
+ * ever explicitly marked ready. JIRA avoids this because `jira.workflow.ready`
59
+ * is `Ready` while a fresh ticket lands in the project default; this mirrors
60
+ * that. Do not "simplify" it back to `Todo`.
52
61
  */
53
62
  export declare const LINEAR_WORKFLOW_DEFAULTS: JsonValue;
54
63
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-defaults.d.ts","sourceRoot":"","sources":["../../src/sync/lifecycle-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;CAUvB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAMtC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAShC,CAAC"}
1
+ {"version":3,"file":"lifecycle-defaults.d.ts","sourceRoot":"","sources":["../../src/sync/lifecycle-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;CAUvB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAMtC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAShC,CAAC"}
@@ -44,13 +44,22 @@ export const BUILD_LABEL_DEFAULTS = {
44
44
  * is a one-key override.
45
45
  *
46
46
  * A stock Linear team ships `Todo`, `In Progress`, `In Review` and `Done` but
47
- * NOT `Blocked`, `On Dev` or `On Stg`. `lisa-setup-linear` resolves each role
48
- * and offers to create what is missing; it never invents a name silently. The
49
- * env rungs must be typed `started`, never `completed` — see the
47
+ * NOT `Ready`, `Blocked`, `On Dev` or `On Stg`. `lisa-setup-linear` resolves
48
+ * each role and offers to create what is missing; it never invents a name
49
+ * silently. The env rungs must be typed `started`, never `completed` — see the
50
50
  * `config-resolution` rule.
51
+ *
52
+ * **`ready` must be a DEDICATED state, never the tracker's default.** `Todo` is
53
+ * where Linear puts a brand-new issue, so mapping `ready` to it inverts the
54
+ * gate — the lane stops meaning "a human flipped this to build-ready" and
55
+ * starts meaning "nobody has touched this", making every untouched backlog item
56
+ * claimable. Measured on the first team migrated: 20 issues in the lane, only 8
57
+ * ever explicitly marked ready. JIRA avoids this because `jira.workflow.ready`
58
+ * is `Ready` while a fresh ticket lands in the project default; this mirrors
59
+ * that. Do not "simplify" it back to `Todo`.
51
60
  */
52
61
  export const LINEAR_WORKFLOW_DEFAULTS = {
53
- ready: "Todo",
62
+ ready: "Ready",
54
63
  claimed: "In Progress",
55
64
  review: "In Review",
56
65
  blocked: "Blocked",
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-defaults.js","sourceRoot":"","sources":["../../src/sync/lifecycle-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,cAAc;IACrB,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,cAAc;IAC5B,IAAI,EAAE;QACJ,GAAG,EAAE,eAAe;QACpB,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,aAAa;KAC1B;CACO,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAc;IACjD,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE;CAC/D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,qBAAqB;CAChC,CAAC"}
1
+ {"version":3,"file":"lifecycle-defaults.js","sourceRoot":"","sources":["../../src/sync/lifecycle-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,cAAc;IACrB,OAAO,EAAE,oBAAoB;IAC7B,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,cAAc;IAC5B,IAAI,EAAE;QACJ,GAAG,EAAE,eAAe;QACpB,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,aAAa;KAC1B;CACO,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAc;IACjD,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE;CAC/D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,eAAe;IAC1B,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,qBAAqB;CAChC,CAAC"}
package/package.json CHANGED
@@ -115,7 +115,7 @@
115
115
  "brace-expansion": ">=5.0.9"
116
116
  },
117
117
  "name": "@codyswann/lisa",
118
- "version": "2.328.3",
118
+ "version": "2.328.4",
119
119
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
120
120
  "main": "dist/index.js",
121
121
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.328.3",
3
+ "version": "2.328.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": "2.328.3",
3
+ "version": "2.328.4",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -30,7 +30,7 @@ read_role() {
30
30
  echo "${local_v:-${global_v:-$default}}"
31
31
  }
32
32
 
33
- READY=$(read_role ready "Todo")
33
+ READY=$(read_role ready "Ready")
34
34
  CLAIMED=$(read_role claimed "In Progress")
35
35
  REVIEW=$(read_role review "In Review")
36
36
  BLOCKED=$(read_role blocked "Blocked")
@@ -68,7 +68,7 @@ else
68
68
  fi
69
69
  ```
70
70
 
71
- In prose below, the role names refer to the resolved **states**: e.g. "the `ready` state" means whatever `linear.workflow.ready` resolves to (default: `Todo`).
71
+ In prose below, the role names refer to the resolved **states**: e.g. "the `ready` state" means whatever `linear.workflow.ready` resolves to (default: `Ready`).
72
72
 
73
73
  ## Why native states, not labels
74
74
 
@@ -110,7 +110,7 @@ ready → claimed → review → done(env-keyed) (downstream)
110
110
  (human/PM) (us claim) (us PR ready) (us build done)
111
111
  ```
112
112
 
113
- (Defaults: `Todo` / `In Progress` / `In Review` / `On Dev`/`On Stg`/`Done`.)
113
+ (Defaults: `Ready` / `In Progress` / `In Review` / `On Dev`/`On Stg`/`Done`.)
114
114
 
115
115
  This skill ONLY transitions `$READY → $CLAIMED` on claim, and `$CLAIMED → $DONE` on completion. It never touches the terminal production `done`, `$REVIEW` (owned by the lifecycle / `lisa-linear-evidence`), or `$BLOCKED` (owned by the pre-flight gate).
116
116
 
@@ -152,7 +152,7 @@ A Linear team can oversee multiple repos (`frontend` / `backend` / `infrastructu
152
152
 
153
153
  #### 3a. Leaf-only claim gate (skip / safe-block containers)
154
154
 
155
- Build intake claims **only independently implementable leaf work units**. This enforces the claim-time arm of the vendor-neutral `leaf-only-lifecycle` rule: a parent/container that still sits in the build-ready state (e.g. moved to `$READY` before this rule existed, or hand-moved on a Project-grouped parent Issue) is **never claimed** — intake skips it or safe-blocks it with a clear lifecycle-repair message. It is the claim-time complement to the write-time labeling in `lisa-linear-write-issue` and the validate-time S15 gate in `lisa-linear-validate-issue`; all three cite the same rule so the classification never drifts. **Never silently implement a container.**
155
+ Build intake claims **only independently implementable leaf work units**. This enforces the claim-time arm of the vendor-neutral `leaf-only-lifecycle` rule: a parent/container that still sits in the build-ready state (e.g. moved to `$READY` before this rule existed, or hand-moved on a Project-grouped parent Issue) is **never claimed** — intake skips it or safe-blocks it with a clear lifecycle-repair message. It is the claim-time complement to the write-time state assignment in `lisa-linear-write-issue` and the validate-time S15 gate in `lisa-linear-validate-issue`; all three cite the same rule so the classification never drifts. **Never silently implement a container.**
156
156
 
157
157
  Run this gate **before** the claim transition, starting with the oldest/highest-priority ready candidate. Do NOT transition, comment "Claimed", or dispatch the lifecycle for an Issue that fails the gate.
158
158
 
@@ -197,11 +197,11 @@ This gate never blocks a legitimate flat Task/Bug: those have no open children a
197
197
 
198
198
  **Rejection detection runs first — before the transition below.** Per the vendor-neutral `rejection-detection` rule (cite the slug; do not restate its classification table), classify this Issue at the **top of 3b, BEFORE** the `$READY → $CLAIMED` transition — afterwards the current-lane signal is gone. Read the Issue's history via `lisa-linear-access operation: history id: <ISSUE-ID>`, keyed on **workflow-state** history, and classify it `rejection-reclaim | forward-only | never-left-ready | unknown` (a `rejection-reclaim` is a move back into `$READY` from a later lane). State names come from `.lisa.config.json`, never hardcoded.
199
199
 
200
- > Reading state history is strictly simpler than the label history this used to key on: `IssueHistory` inlines `fromState.name` / `toState.name` on each node, so the transition is read directly with no label-ID resolution against `list-issue-labels` and no reconstruction from `addedLabelIds`/`removedLabelIds` deltas. That reconstruction was lossy — the deltas carry no prior/next full set — which is one more reason the build lane moved to states. A failing/absent history yields `unknown` and the claim proceeds — detection never blocks the build. Issues carrying a learning marker (`[lisa-learning-drop]` / `[lisa-learning-pr]` / `[lisa-learning-upstream-handoff]`) or the `learning:needs-triage` label are never rejection triggers (no learning-about-learning). Carry the classification into the relabel and lifecycle below.
200
+ > Reading state history is strictly simpler than the label history this used to key on: `IssueHistory` inlines `fromState.name` / `toState.name` on each node, so the transition is read directly with no label-ID resolution against `list-issue-labels` and no reconstruction from `addedLabelIds`/`removedLabelIds` deltas. That reconstruction was lossy — the deltas carry no prior/next full set — which is one more reason the build lane moved to states. A failing/absent history yields `unknown` and the claim proceeds — detection never blocks the build. Issues carrying a learning marker (`[lisa-learning-drop]` / `[lisa-learning-pr]` / `[lisa-learning-upstream-handoff]`) or the `learning:needs-triage` label are never rejection triggers (no learning-about-learning). Carry the classification into the transition and lifecycle below.
201
201
 
202
202
  **On `rejection-reclaim`, reflect before re-implementing** (per `rejection-detection`): read the rejection evidence through the access layer — the Issue comments posted after the backward transition (the QA rejection comment) via `lisa-linear-access operation: list-comments` and the review threads on the rejected PR — assemble ONE candidate learning (rule, why, provenance linking the rejection comment + rejected PR, evidence links, scope hint, triggering issue, fingerprint `sll4-sha1(rule\ntriggering_issue)[:12]`), and route it to the `lisa-persist-learning` skill. If that skill is absent, record the candidate via `lisa-linear-access operation: save-comment` as a comment carrying a **visible prose line plus** the marker (a bare marker renders as an empty bubble) — `Recorded a candidate learning from this rejection (queued for the judgment gate): <one-line candidate rule>.` then `<!-- [lisa-rejection-candidate] key=<issue>-<transition-ts> -->` — and proceed. Dedupe on `<issue>-<backward-transition-timestamp>` — a second re-claim produces no duplicate. Unreadable/absent evidence → no candidate, still implement.
203
203
 
204
- **Claim-time archaeology runs second — after rejection detection, still before the relabel below.** Classify this Issue per the vendor-neutral `claim-archaeology` rule, with the rejection classification above as its input. All shared semantics — ancestry signals, classification, learning-loop exclusion, cost budget, candidate derivation, marker dedupe, and the never-block degrade — live in that one slug; change them there, never here. Linear wiring only: the native relations are already in the read bundle; text-similarity searches run through `lisa-linear-access operation: list-issues` filtered to recently-closed Issues; the fallback candidate comment is posted via `lisa-linear-access operation: save-comment`.
204
+ **Claim-time archaeology runs second — after rejection detection, still before the transition below.** Classify this Issue per the vendor-neutral `claim-archaeology` rule, with the rejection classification above as its input. All shared semantics — ancestry signals, classification, learning-loop exclusion, cost budget, candidate derivation, marker dedupe, and the never-block degrade — live in that one slug; change them there, never here. Linear wiring only: the native relations are already in the read bundle; text-similarity searches run through `lisa-linear-access operation: list-issues` filtered to recently-closed Issues; the fallback candidate comment is posted via `lisa-linear-access operation: save-comment`.
205
205
 
206
206
  Transition the Issue via `lisa-linear-access operation: save-issue` by setting `stateId` to the `$CLAIMED` state. Resolve state IDs via `list-workflow-states`; a missing `$CLAIMED` state is a setup defect (see the pre-flight check) — never create one here.
207
207
 
@@ -355,9 +355,9 @@ Total PRs opened: <n>
355
355
 
356
356
  ## Adoption (one-time per team)
357
357
 
358
- Before this skill can run against a Linear team, the team must have the build-queue workflow states. Run `/lisa:setup:linear`, which resolves each role and offers to create what is missing — a stock Linear team ships `Todo`, `In Progress`, `In Review` and `Done` but **not** `Blocked`, `On Dev` or `On Stg`.
358
+ Before this skill can run against a Linear team, the team must have the build-queue workflow states. Run `/lisa:setup:linear`, which resolves each role and offers to create what is missing — a stock Linear team ships `Todo`, `In Progress`, `In Review` and `Done` but **not** `Ready`, `Blocked`, `On Dev` or `On Stg`.
359
359
 
360
- 1. Ensure states exist for every role in `linear.workflow` (defaults `Todo`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`). Override any role name in config rather than renaming to match.
360
+ 1. Ensure states exist for every role in `linear.workflow` (defaults `Ready`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`). Note `ready` is a DEDICATED state, not Linear's default `Todo` — mapping it to the default would make every untouched backlog item claimable. Override any role name in config rather than renaming to match.
361
361
  2. Move Issues to `$READY` when they are ready for development.
362
362
  3. Reserve `$CLAIMED`, `$REVIEW`, `$DONE` for Lisa — humans should not set them manually except to recover from an error.
363
363
  4. Remove the team's `merge → Done` git automation. It is a second writer that jumps an Issue to terminal on a `dev` merge, skipping the env rungs; `/lisa:setup:linear` detects and offers to delete it.
@@ -8,11 +8,12 @@ allowed-tools: ["Bash", "Skill", "Read"]
8
8
 
9
9
  Claim exactly one canonical Linear identifier such as `ENG-123`. All Linear access goes through `lisa-linear-access`. This is the reusable direct-session counterpart of `lisa-linear-build-intake` Phase 3b.
10
10
 
11
- 1. Resolve merged `linear.workspace`, `linear.teamKey`, and Linear build-label roles from local-over-global config. Require the identifier's team key to equal the configured team. Resolve ready and claimed roles from config (defaults `Todo` and `In Progress`); do not hardcode lifecycle decisions.
11
+ 1. Resolve merged `linear.workspace`, `linear.teamKey`, and the Linear build-lifecycle roles from local-over-global config. Require the identifier's team key to equal the configured team. Resolve ready and claimed roles from `linear.workflow` (defaults `Ready` and `In Progress`); do not hardcode lifecycle decisions.
12
12
  2. Invoke `lisa-linear-read-issue <identifier>` immediately before mutation. Reject a completed/canceled issue, active blocker, `repo:<other>` issue, any issue with open sub-Issues, or an Epic per `repo-scope-split` and `leaf-only-lifecycle`.
13
- 3. Inspect live build labels/workflow state:
13
+ 3. Inspect the Issue's live workflow **state**:
14
14
  - Already claimed, review, environment-done, or another configured later non-terminal role -> preserve it and set `claim_outcome: reused`.
15
- - Ready or no build lifecycle label -> invoke `lisa-linear-access operation: save-issue`, remove ready when present, and add claimed (resolve label IDs with `list-issue-labels`, creating claimed only when missing). This is the idempotency lock.
15
+ - In the configured `ready` state -> invoke `lisa-linear-access operation: save-issue` setting `stateId` to the `claimed` state (resolve state IDs with `list-workflow-states`; a missing state is a setup defect, never created here). This is the idempotency lock.
16
+ - In any OTHER non-terminal state -> reject. An Issue that is not in the `ready` state has not been sanctioned for build, and absence of a lifecycle marker is no longer evidence of readiness: since the lane moved to states, every Issue always has one, so "no lifecycle label" is not a state this can observe.
16
17
  - Terminal/completed -> reject; never regress completed work.
17
18
  4. If and only if the Issue is unassigned, resolve the authenticated viewer and set its `assigneeId` through `lisa-linear-access operation: save-issue`. Leave an existing assignee untouched.
18
19
  5. Post this stable comment once through `lisa-linear-access operation: save-comment`, deduped against all existing comments:
@@ -21,7 +22,7 @@ Claim exactly one canonical Linear identifier such as `ENG-123`. All Linear acce
21
22
  [lisa-tracker-claim] Claimed by Lisa. Starting implementation.
22
23
  ```
23
24
 
24
- 6. Invoke `lisa-linear-read-issue <identifier>` again. Success requires a non-terminal, current-repo leaf in claimed or a later non-terminal role. A failed relabel or failed verification is a hard failure and must not authorize a binding.
25
+ 6. Invoke `lisa-linear-read-issue <identifier>` again. Success requires a non-terminal, current-repo leaf in claimed or a later non-terminal role. A failed state transition or failed verification is a hard failure and must not authorize a binding.
25
26
  7. Return `tracker_provider: linear`, canonical `work_item_ref: <IDENTIFIER>`, `claim_outcome: claimed|reused`, assignee outcome, and the post-write status evidence.
26
27
 
27
28
  Never create an Issue here. Never bypass `lisa-linear-access`.
@@ -18,10 +18,10 @@ Callers (planning skills, lifecycle skills) invoke this skill at:
18
18
 
19
19
  | Milestone | What to post |
20
20
  |-----------|--------------|
21
- | Plan created | Plan contents (sections + ordered tasks) as a comment, suggest transition `Backlog → Todo` (label: `Todo`) |
22
- | Implementation in progress | Branch URL + first commit, suggest transition `Todo → In Progress` (label: `In Progress`) |
23
- | PR ready for review | PR URL + summary, the implementation handoff comment, suggest transition `In Progress → In Review` (label: `In Review`) |
24
- | PR merged | Merge SHA + deploy environment (if known), suggest transition `In Review → Done` (label: `Done`), **then run Phase 4b — mandatory when the merge target is a non-terminal env branch** |
21
+ | Plan created | Plan contents (sections + ordered tasks) as a comment, suggest transition `Backlog → Ready` (state: `Ready`) |
22
+ | Implementation in progress | Branch URL + first commit, suggest transition `Ready → In Progress` (state: `In Progress`) |
23
+ | PR ready for review | PR URL + summary, the implementation handoff comment, suggest transition `In Progress → In Review` (state: `In Review`) |
24
+ | PR merged | Merge SHA + deploy environment (if known), suggest transition `In Review → Done` (state: `Done`), **then run Phase 4b — mandatory when the merge target is a non-terminal env branch** |
25
25
 
26
26
  This skill **suggests** transitions and applies them to the native Linear `state` field when the caller asks — the build queue is keyed off states, so the state IS the lane. Without `--update-state` it only suggests; an unasked-for transition remains a human / triage decision.
27
27
 
@@ -60,7 +60,7 @@ Sections:
60
60
 
61
61
  Tasks: 7 ordered items.
62
62
 
63
- Next: implementation begins. Suggested status: **Todo** (label: `Todo`).
63
+ Next: implementation begins. Suggested state: **Ready**.
64
64
  ```
65
65
 
66
66
  ## Phase 3 — Post Comment
@@ -77,20 +77,20 @@ When `$ARGUMENTS` includes `pr_url=<url>` for `pr-ready` or `pr-merged`, ensure
77
77
 
78
78
  The PR branch/title/body identifier is the PR -> Linear side. This phase is the required Linear -> PR side.
79
79
 
80
- ## Phase 4 — Update Status Label (when caller requests)
80
+ ## Phase 4 — Update Workflow State (when caller requests)
81
81
 
82
82
  If the caller passes `--update-state`, set the Issue's `stateId` via `lisa-linear-access operation: save-issue`:
83
83
 
84
- - `plan-created` → add `Todo`
85
- - `implementation-in-progress` → remove `Todo`, add `In Progress`
86
- - `pr-ready` → remove `In Progress`, add `In Review`
87
- - `pr-merged` → remove `In Review`, add `Done`
84
+ - `plan-created` → set state `Ready`
85
+ - `implementation-in-progress` → set state `In Progress`
86
+ - `pr-ready` → set state `In Review`
87
+ - `pr-merged` → set state `Done`
88
88
 
89
- If the requested label doesn't exist on the team, create it via `lisa-linear-access operation: create-issue-label`.
89
+ If the requested STATE doesn't exist on the team, that is a setup defect — report it and point at `/lisa:setup:linear`. Never create a workflow state here: a state carries a `type` and a board position, and guessing either puts the Issue somewhere no human sanctioned.
90
90
 
91
- No single-lane verification is needed: an Issue holds exactly one workflow state by construction, so the two-labels-at-once corruption the old label lane could produce is unrepresentable.
91
+ No single-lane verification is needed: an Issue holds exactly one workflow state by construction, so the two-lanes-at-once corruption the old label-driven lane could produce is unrepresentable. (It was not hypothetical — 16 issues carried two `status:*` labels at the time of the migration.)
92
92
 
93
- Without `--update-state`, this skill posts the comment only and does NOT touch labels.
93
+ Without `--update-state`, this skill posts the comment only and does NOT touch the Issue's state.
94
94
 
95
95
  ## Phase 4b — Reconcile Native Auto-Close (Linear-specific)
96
96
 
@@ -113,26 +113,26 @@ When the caller passes `--rollup`, this skill **derives a parent/container's wor
113
113
 
114
114
  **Evaluate the required children over the env ladder `in-progress < dev < staging < production` (the ordered keys of the Linear env-keyed `done` map, e.g. `On Dev < On Stg < Done`) and take the first match** (canonical roles from `config-resolution`; the Linear state map is `Blocked`, `In Progress`, `In Review`, env-keyed `done`):
115
115
 
116
- | If among the required child leaves… | Derived parent role | Linear label |
116
+ | If among the required child leaves… | Derived parent role | Linear state |
117
117
  |---|---|---|
118
118
  | any child carries `Blocked` | `blocked` | `Blocked` |
119
- | else **every** required child has shipped to some env (each at a `done`-map label, e.g. `On Dev`/`On Stg`/`Done`) | `done[min-env]` | the **least-advanced** env label among them (all `On Stg` → `On Stg`; mixed dev+staging → `On Dev`; all production → `Done`) |
119
+ | else **every** required child has shipped to some env (each at a `done`-map state, e.g. `On Dev`/`On Stg`/`Done`) | `done[min-env]` | the **least-advanced** env state among them (all `On Stg` → `On Stg`; mixed dev+staging → `On Dev`; all production → `Done`) |
120
120
  | else any child has **started** (`In Progress` / `In Review`, or shipped to an env while a sibling has not) | `claimed` | `In Progress` |
121
- | else (children exist, none started) | — | unchanged — parent keeps its non-ready container label |
121
+ | else (children exist, none started) | — | unchanged — parent keeps its non-ready container state |
122
122
 
123
123
  - **Blocked dominates** — one blocked child surfaces `Blocked` on the parent even while siblings progress.
124
124
  - **Least-advanced env wins** — the parent reaches an env only when every required child has reached at least that env; it never sits ahead of its laggard child. Native completion (moving the workflow `state` to Done) fires only when the resolved env is the production `Done`, never at `On Dev`/`On Stg`.
125
125
  - **"Required" children only** — won't-do / optional (e.g. `Canceled`) children do not hold the parent open.
126
126
  - **Recursive** — a Project reaches an env only when its Issues have themselves rolled up to at least that env. Evaluate bottom-up.
127
- - **Never set the parent to `Todo`** — `ready` is leaf-only. Rollup only moves the parent between non-ready container labels.
127
+ - **Never roll a parent into the `ready` state** — `ready` is leaf-only. Rollup only moves the parent between non-ready container states.
128
128
 
129
- **Single-environment collapse (this repo).** The env rungs resolve via the env-keyed `done` logic in `config-resolution`. In this repo `deploy.branches` declares only `production: main`, so `done` collapses to the single `Done` state, the only env rung is production, and the lifecycle is `Todo → In Progress → In Review → Done` with **no** dev/staging promotion hops; the rollup never resolves a dev or staging `done`. Multi-environment projects keep the env-keyed map and roll a parent up to the intermediate env states (`On Dev`/`On Stg`).
129
+ **Single-environment collapse (this repo).** The env rungs resolve via the env-keyed `done` logic in `config-resolution`. In this repo `deploy.branches` declares only `production: main`, so `done` collapses to the single `Done` state, the only env rung is production, and the lifecycle is `Ready → In Progress → In Review → Done` with **no** dev/staging promotion hops; the rollup never resolves a dev or staging `done`. Multi-environment projects keep the env-keyed map and roll a parent up to the intermediate env states (`On Dev`/`On Stg`).
130
130
 
131
131
  **Apply the derived state** via `lisa-linear-access operation: save-issue` (Project or Issue), setting the parent's `stateId` to the derived role. Post an idempotent rollup comment naming the derived state and the child tally. Because the terminal `done` state is itself typed `completed`, a parent rolled to terminal is natively closed by the same write — there is no second closure step. **Safe default:** if the derived terminal cannot be resolved (ambiguous required-set or unresolvable env `done`), do not guess — post the derived suggestion as a comment and leave the parent's state untouched.
132
132
 
133
133
  ## Rules
134
134
 
135
- - Never auto-transition the native Linear `state` only the label, and only when the caller explicitly asks (`--update-state`, or `--rollup` for parent derivation per the `leaf-only-lifecycle` rule).
135
+ - Never transition the Issue's workflow `state` unless the caller explicitly asks (`--update-state`, or `--rollup` for parent derivation per the `leaf-only-lifecycle` rule). Without a flag this skill only SUGGESTS a transition in its comment. The state is the lifecycle lane now, so an unrequested write here would move the item in the build queue.
136
136
  - Rollup derives a *parent's* workflow state from its children and never rolls a parent into the human-owned ready lane (never `$READY`). It cites the `leaf-only-lifecycle` rule by slug rather than restating the state machine.
137
137
  - Never post empty or minimal comments — if a milestone has no meaningful content, skip the post.
138
138
  - Do not delete prior milestone comments. They are the audit trail.
@@ -61,12 +61,12 @@ authenticated_surface: true # → requires Sign-in Required
61
61
  artifacts_attached: true # → requires Source Precedence section
62
62
  relations: [{ id: "ENG-99", type: "blocked_by" }] # known issue relations (may be empty)
63
63
  remote_links: [{ url: "https://github.com/...", title: "PR #42" }]
64
- build_ready: true # caller asserts the build-ready role (the `Todo` state) is/would be set — see S15
64
+ build_ready: true # caller asserts the build-ready role (the `Ready` state) is/would be set — see S15
65
65
  child_refs: ["ENG-601", "ENG-602"] # known child work (sub-issues / project-member issues / blocked_by parentage) — see S15
66
66
  prd_source: "https://notion.so/..." # set when the Issue was generated from a PRD — requires the Source Requirement section, see S16
67
67
  ```
68
68
 
69
- If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (label set contains `Todo`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item — then run gates.
69
+ If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (the Issue's state is the configured `ready` state) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item — then run gates.
70
70
 
71
71
  ## Gates
72
72
 
@@ -235,9 +235,9 @@ This gate depends on S11. It is `N/A` for containers — a **Project** (the Epic
235
235
 
236
236
  #### S15 — Leaf-only build-ready
237
237
 
238
- Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only a leaf work unit may carry the build-ready role.** This is the symmetric write-side guard for the Linear validator — a stale or hand-applied `Todo` label on a container is a lifecycle error and must FAIL here, regardless of how the item was produced. (Mirrors the "Build-ready label is leaf-only" rule that `lisa-linear-write-issue` applies at write time.)
238
+ Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only a leaf work unit may carry the build-ready role.** This is the symmetric write-side guard for the Linear validator — a container sitting in the configured `ready` state is a lifecycle error and must FAIL here, regardless of how the item was produced. (Mirrors the "build-ready is leaf-only" rule that `lisa-linear-write-issue` applies at write time.)
239
239
 
240
- **When the gate applies.** Run S15 whenever the item is build-ready — i.e. `build_ready = true`, or the spec/live labels include `Todo`. If the item is not build-ready, S15 is `N/A` (nothing claims a non-ready item, so the invariant is vacuous).
240
+ **When the gate applies.** Run S15 whenever the item is build-ready — i.e. `build_ready = true`, or the item's live state is the configured `ready` state. If the item is not build-ready, S15 is `N/A` (nothing claims a non-ready item, so the invariant is vacuous).
241
241
 
242
242
  **Resolve container vs. leaf — structural first, then nominal.** Per `leaf-only-lifecycle` the classification is structural: an item is a **container** if it has child work, whatever its declared type; otherwise the **issue type** decides. Determine child work from (in order) `child_refs`, native sub-issues, project-member issues (an Epic is modeled as a Linear Project), and `blocked_by` / parent references — the same hierarchy resolution `lisa-linear-read-issue` uses. When validating a live identifier, query sub-issues / project members alongside the item fetch.
243
243
 
@@ -362,7 +362,7 @@ system, and never invent or ask for credentials inline.
362
362
 
363
363
  ## Execution
364
364
 
365
- 1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (label set contains `Todo`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item. Otherwise parse the YAML spec.
365
+ 1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (the Issue's state is the configured `ready` state) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item. Otherwise parse the YAML spec.
366
366
  2. Resolve team ID via `lisa-linear-access operation: list-teams({query: <teamKey>})` if any feasibility gate will run.
367
367
  3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
368
368
  4. Unless the caller passed `--spec-only` (dry-run), run every Feasibility gate. Collect results.
@@ -31,7 +31,7 @@ Linear's data model maps Epic / Story / Sub-task to **different entity types**.
31
31
  | `Bug` | **Issue** | `lisa-linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
32
32
  | `Spike` | **Issue** | `lisa-linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
33
33
 
34
- The build lifecycle uses native **workflow states** (`Todo`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new Issue is created in the team's default backlog/unstarted state unless `build_ready` promotes it (below).
34
+ The build lifecycle uses native **workflow states** (`Ready`, `In Progress`, `In Review`, `Blocked`, `On Dev`, `On Stg`, `Done`), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new **leaf** work unit is created in the configured `ready` state by default; `build_ready: false` leaves it in the team's default backlog state instead, and a container is never put in `ready` at all (see the Build-ready control input below).
35
35
 
36
36
  ## Phase 1 — Resolve Intent
37
37
 
@@ -227,7 +227,7 @@ If the item modifies an existing user-facing surface, a `lisa-product-walkthroug
227
227
 
228
228
  Before create/update, verify each field is populated where applicable:
229
229
 
230
- - **Workflow state**: set the resolved `ready` state (`linear.workflow.ready`, default `Todo`) on a new **leaf** work unit (Bug / Task / Sub-task / Improvement with no child work) per `leaf-only-lifecycle`, **unless `build_ready: false`** (see the Build-ready control input below). A container (Epic Project / Story with sub-issues / Spike) is never put in the build-ready state.
230
+ - **Workflow state**: set the resolved `ready` state (`linear.workflow.ready`, default `Ready`) on a new **leaf** work unit (Bug / Task / Sub-task / Improvement with no child work) per `leaf-only-lifecycle`, **unless `build_ready: false`** (see the Build-ready control input below). A container (Epic Project / Story with sub-issues / Spike) is never put in the build-ready state.
231
231
  - **Labels**: taxonomy only — `type:<Kind>`, `repo:<name>`, `component:<name>`, and the `prd-intake-feedback` sentinel. Lifecycle is **not** a label on Linear; do not add `status:*` labels.
232
232
  - **Native priority field**: 0–4 per Linear's scale; explicit, not "unset".
233
233
  - **Native estimate**: per Linear's team-configured estimate scale (often 0–8 Fibonacci); skip for Epic / Spike.
@@ -167,14 +167,14 @@ read_state() { # $1=role path (e.g. ready, done.dev) $2=default
167
167
 
168
168
  Enumerate the team's states with `lisa-linear-access operation: list-workflow-states` (each carries `id`, `name`, `type`, `position`). For each role, resolve in this order — the same cascade `lisa-setup-jira` uses, with one extra rung Linear affords that JIRA does not:
169
169
 
170
- 1. **Exact name match** → resolved, nothing to do.
170
+ 1. **Exact name match** → resolved, nothing to do. For `ready`, additionally refuse to resolve onto the team's DEFAULT state (`Todo` on a stock team): that inverts the gate from "a human flipped this" to "nobody has touched this" and makes every untouched backlog item claimable. Offer to create a dedicated state instead.
171
171
  2. **A plausible existing state of the right `type`** (`ready` → `unstarted`, `claimed`/`review` → `started`, `blocked` → `started` or `unstarted`, terminal `done` → `completed`) → present the team's state list via `AskUserQuestion` and let the user pick which state means this role. Record the choice as a config override in Step 4.
172
172
  3. **Nothing plausible** → offer to **create** the state via `lisa-linear-access operation: create-workflow-state` (name, `type`, `position`, colour), showing the exact name and type first. Linear's API permits this where JIRA's workflow editing is admin-gated — which is why this rung exists here and not there.
173
173
  4. **User declines creation** → stop and say which role is unresolvable and that the lifecycle cannot run without it. Never silently fall back to a state whose meaning differs, and never invent a name in config that does not exist in the team.
174
174
 
175
175
  | Role | Default state | `type` | Ships with a stock team? |
176
176
  |------|---------------|--------|--------------------------|
177
- | `ready` | `Todo` | `unstarted` | yes |
177
+ | `ready` | `Ready` | `unstarted` | **no — must be created or mapped** |
178
178
  | `claimed` | `In Progress` | `started` | yes |
179
179
  | `review` | `In Review` | `started` | yes |
180
180
  | `blocked` | `Blocked` | `unstarted` | **no — must be created or mapped** |
@@ -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