@magic-spells/constellation 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/constellation/decision/DECISION-FEATURE-RELEASE-TYPES.md +50 -0
  2. package/constellation/decision/DECISION-NATIVE-DECISION-TYPE.md +58 -0
  3. package/constellation/doc/DOC-CARD-TYPES.md +6 -3
  4. package/constellation/doc/DOC-FILE-FORMAT.md +1 -1
  5. package/constellation/doc/DOC-LINT-CODES.md +1 -1
  6. package/constellation/doc/DOC-MCP-UPGRADES.md +4 -3
  7. package/constellation/file/FILE-HANDLES.md +1 -1
  8. package/constellation/file/FILE-TYPES.md +1 -1
  9. package/constellation/file/FILE-VALIDATE.md +1 -1
  10. package/dist/core/handles.d.ts +1 -1
  11. package/dist/core/handles.js +4 -1
  12. package/dist/core/handles.js.map +1 -1
  13. package/dist/core/indexer.js +1 -1
  14. package/dist/core/types.d.ts +1 -1
  15. package/dist/core/types.js +3 -2
  16. package/dist/core/types.js.map +1 -1
  17. package/dist/mcp/server.js +12 -3
  18. package/dist/mcp/server.js.map +1 -1
  19. package/examples/constellation/decision/DECISION-NO-HARD-DELETE.md +31 -0
  20. package/examples/constellation/feature/FEATURE-AUTO-ASSIGNMENT.md +24 -0
  21. package/examples/constellation/release/RELEASE-V1-1-0.md +14 -0
  22. package/package.json +1 -1
  23. package/schemas/decision.json +14 -0
  24. package/schemas/doc.json +1 -1
  25. package/schemas/feature.json +19 -0
  26. package/schemas/plan.json +1 -1
  27. package/schemas/release.json +14 -0
  28. package/skill/SKILL.md +28 -2
  29. package/skill/methodology.md +4 -1
  30. package/skill/types/decision.md +59 -0
  31. package/skill/types/doc.md +2 -2
  32. package/skill/types/feature.md +53 -0
  33. package/skill/types/plan.md +1 -1
  34. package/skill/types/release.md +37 -0
  35. package/viewer/dist/assets/{arc-ByV7p1fN.js → arc-DcXsmPgw.js} +1 -1
  36. package/viewer/dist/assets/architecture-7EHR7CIX-CXZxmtF5.js +1 -0
  37. package/viewer/dist/assets/{architectureDiagram-3BPJPVTR-CMawC2nt.js → architectureDiagram-3BPJPVTR-Cfq3OC2M.js} +1 -1
  38. package/viewer/dist/assets/{blockDiagram-GPEHLZMM-Bp0MKYXV.js → blockDiagram-GPEHLZMM-CPuRJqEW.js} +1 -1
  39. package/viewer/dist/assets/{c4Diagram-AAUBKEIU-BLCX9gmN.js → c4Diagram-AAUBKEIU-CcVcItWo.js} +1 -1
  40. package/viewer/dist/assets/channel-DjvAjJNc.js +1 -0
  41. package/viewer/dist/assets/{chunk-2J33WTMH-C6iOidst.js → chunk-2J33WTMH-C_N821rH.js} +1 -1
  42. package/viewer/dist/assets/{chunk-3OPIFGDE-B9xItVw4.js → chunk-3OPIFGDE-C5c2MY1i.js} +1 -1
  43. package/viewer/dist/assets/{chunk-4BX2VUAB-Bl0HWb9B.js → chunk-4BX2VUAB-BjYatXZ-.js} +1 -1
  44. package/viewer/dist/assets/{chunk-55IACEB6-BYilo1WJ.js → chunk-55IACEB6-A3JXj2W_.js} +1 -1
  45. package/viewer/dist/assets/{chunk-5ZQYHXKU-DOCnP8P8.js → chunk-5ZQYHXKU-zDiW1Z3e.js} +1 -1
  46. package/viewer/dist/assets/{chunk-727SXJPM-D9YKAzha.js → chunk-727SXJPM-CI3VBaXr.js} +1 -1
  47. package/viewer/dist/assets/{chunk-AQP2D5EJ-B1KE4h_b.js → chunk-AQP2D5EJ-DHpkJ1wF.js} +1 -1
  48. package/viewer/dist/assets/{chunk-BSJP7CBP-DA3pfXCw.js → chunk-BSJP7CBP-DXx1-_Zs.js} +1 -1
  49. package/viewer/dist/assets/{chunk-CSCIHK7Q-Bv0Fa0Zn.js → chunk-CSCIHK7Q-DQOe6SQo.js} +1 -1
  50. package/viewer/dist/assets/{chunk-FMBD7UC4-k-EzzpU2.js → chunk-FMBD7UC4-DSvwBCfP.js} +1 -1
  51. package/viewer/dist/assets/{chunk-KSCS5N6A-CUTkv0jR.js → chunk-KSCS5N6A-C3haQOao.js} +1 -1
  52. package/viewer/dist/assets/{chunk-L5ZTLDWV-C_SwE6oB.js → chunk-L5ZTLDWV-DyHfVaRK.js} +1 -1
  53. package/viewer/dist/assets/{chunk-LZXEDZCA-DtwqVIDt.js → chunk-LZXEDZCA-CtMQqok_.js} +2 -2
  54. package/viewer/dist/assets/{chunk-ND2GUHAM-JJiAqLG2.js → chunk-ND2GUHAM-Cfp2zN_i.js} +1 -1
  55. package/viewer/dist/assets/{chunk-NZK2D7GU-BQ8Dn7FA.js → chunk-NZK2D7GU-Cn753oIP.js} +1 -1
  56. package/viewer/dist/assets/{chunk-O5CBEL6O-BRpqOJ1I.js → chunk-O5CBEL6O-BO32_B2k.js} +1 -1
  57. package/viewer/dist/assets/chunk-QZHKN3VN-uc4X3bta.js +1 -0
  58. package/viewer/dist/assets/chunk-WU5MYG2G-D-wARmLR.js +1 -0
  59. package/viewer/dist/assets/{chunk-XPW4576I-C1NcqPJd.js → chunk-XPW4576I-DQFQAfwD.js} +1 -1
  60. package/viewer/dist/assets/classDiagram-4FO5ZUOK-CosoTts2.js +1 -0
  61. package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-CosoTts2.js +1 -0
  62. package/viewer/dist/assets/{cose-bilkent-S5V4N54A-BsJFb39B.js → cose-bilkent-S5V4N54A-Ibe8V5Cm.js} +1 -1
  63. package/viewer/dist/assets/{dagre-BM42HDAG-CRPovG4Q.js → dagre-BM42HDAG-BlOzR9WP.js} +1 -1
  64. package/viewer/dist/assets/{diagram-2AECGRRQ-D6GCKn1u.js → diagram-2AECGRRQ-l8omQVTU.js} +1 -1
  65. package/viewer/dist/assets/{diagram-5GNKFQAL-CoHqKdf3.js → diagram-5GNKFQAL-_rHQzAtO.js} +1 -1
  66. package/viewer/dist/assets/{diagram-KO2AKTUF-BEkMb40X.js → diagram-KO2AKTUF-DCLRVRMY.js} +1 -1
  67. package/viewer/dist/assets/{diagram-LMA3HP47-B6mfW9S2.js → diagram-LMA3HP47-14HnEIqk.js} +1 -1
  68. package/viewer/dist/assets/{diagram-OG6HWLK6-OBBkuJvR.js → diagram-OG6HWLK6-CVKNCbkR.js} +1 -1
  69. package/viewer/dist/assets/{dist-C4BxOpXa.js → dist-BcVVfWxM.js} +1 -1
  70. package/viewer/dist/assets/{erDiagram-TEJ5UH35-C2i3TB2-.js → erDiagram-TEJ5UH35-CNjpEfJD.js} +1 -1
  71. package/viewer/dist/assets/eventmodeling-FCH6USID-Dv27utnc.js +1 -0
  72. package/viewer/dist/assets/{flowDiagram-I6XJVG4X-SreJFib5.js → flowDiagram-I6XJVG4X-Bvekb5gu.js} +1 -1
  73. package/viewer/dist/assets/{ganttDiagram-6RSMTGT7-DO7GLSdw.js → ganttDiagram-6RSMTGT7-2TpeWF0N.js} +1 -1
  74. package/viewer/dist/assets/{gitGraph-WXDBUCRP-Cgwn_Q5_.js → gitGraph-WXDBUCRP-CPfybYvf.js} +1 -1
  75. package/viewer/dist/assets/{gitGraphDiagram-PVQCEYII-DLwaMyDa.js → gitGraphDiagram-PVQCEYII-BWZNJ9lY.js} +1 -1
  76. package/viewer/dist/assets/index-BEJYsfzU.css +2 -0
  77. package/viewer/dist/assets/{index-COz6c_JS.js → index-Cqx2pndu.js} +3 -3
  78. package/viewer/dist/assets/{info-J43DQDTF-Ci-BiM87.js → info-J43DQDTF-CxgngY4X.js} +1 -1
  79. package/viewer/dist/assets/{infoDiagram-5YYISTIA-Bip5dlKM.js → infoDiagram-5YYISTIA-CARF_viY.js} +1 -1
  80. package/viewer/dist/assets/{ishikawaDiagram-YF4QCWOH-VXV_9uEH.js → ishikawaDiagram-YF4QCWOH-DcxZvtur.js} +1 -1
  81. package/viewer/dist/assets/{journeyDiagram-JHISSGLW-DQz-8gAS.js → journeyDiagram-JHISSGLW-Wu7zolY5.js} +1 -1
  82. package/viewer/dist/assets/{kanban-definition-UN3LZRKU-BTWpEcf0.js → kanban-definition-UN3LZRKU--LMKLf5s.js} +1 -1
  83. package/viewer/dist/assets/{line-BnRWAabF.js → line-DH7DV7uw.js} +1 -1
  84. package/viewer/dist/assets/{linear-BR6v_8SI.js → linear-C6xJ2LrZ.js} +1 -1
  85. package/viewer/dist/assets/{mermaid-parser.core-CSsnrQhR.js → mermaid-parser.core-DkqLwTDu.js} +2 -2
  86. package/viewer/dist/assets/{mermaid.core-I1kLnpG2.js → mermaid.core-H-eI9axh.js} +3 -3
  87. package/viewer/dist/assets/{mindmap-definition-RKZ34NQL-Cq66Ilr1.js → mindmap-definition-RKZ34NQL-xjt8VE8m.js} +1 -1
  88. package/viewer/dist/assets/{packet-YPE3B663-BjSCEGVd.js → packet-YPE3B663-BX0W_wIa.js} +1 -1
  89. package/viewer/dist/assets/{pie-LRSECV5Y-Di72yxoZ.js → pie-LRSECV5Y-B8cD_uBh.js} +1 -1
  90. package/viewer/dist/assets/{pieDiagram-4H26LBE5-TmsfKHOO.js → pieDiagram-4H26LBE5-DpM-20zS.js} +1 -1
  91. package/viewer/dist/assets/{quadrantDiagram-W4KKPZXB-Dp9iSvCk.js → quadrantDiagram-W4KKPZXB-CLS4_FQ4.js} +1 -1
  92. package/viewer/dist/assets/{radar-GUYGQ44K-CZeWC3Jm.js → radar-GUYGQ44K-CQKcm4b5.js} +1 -1
  93. package/viewer/dist/assets/{requirementDiagram-4Y6WPE33-lbTbiw59.js → requirementDiagram-4Y6WPE33-ESLvOyQ5.js} +1 -1
  94. package/viewer/dist/assets/{sankeyDiagram-5OEKKPKP-DqmoGDJk.js → sankeyDiagram-5OEKKPKP-BT6w9JdP.js} +1 -1
  95. package/viewer/dist/assets/{sequenceDiagram-3UESZ5HK-B6_EiWF6.js → sequenceDiagram-3UESZ5HK-DJNAaEbv.js} +1 -1
  96. package/viewer/dist/assets/{src-Dz3SjXJY.js → src-ituc2uBy.js} +1 -1
  97. package/viewer/dist/assets/{stateDiagram-AJRCARHV-Z6QRASCx.js → stateDiagram-AJRCARHV-Bw7VoMlA.js} +1 -1
  98. package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-DZdCGd2U.js +1 -0
  99. package/viewer/dist/assets/{timeline-definition-PNZ67QCA-XuUZAYAP.js → timeline-definition-PNZ67QCA-Ddr17PAT.js} +1 -1
  100. package/viewer/dist/assets/{treeView-BLDUP644-DuGsPB97.js → treeView-BLDUP644-mqjp8QBZ.js} +1 -1
  101. package/viewer/dist/assets/{treemap-LRROVOQU-CSJx8IZ0.js → treemap-LRROVOQU-BeaxV5lr.js} +1 -1
  102. package/viewer/dist/assets/{vennDiagram-CIIHVFJN-BnebDryc.js → vennDiagram-CIIHVFJN-ySQYfWol.js} +1 -1
  103. package/viewer/dist/assets/{wardley-L42UT6IY-DqqoXPSq.js → wardley-L42UT6IY-BvtBpxdo.js} +1 -1
  104. package/viewer/dist/assets/{wardleyDiagram-YWT4CUSO-Bchy871K.js → wardleyDiagram-YWT4CUSO-DRZFQiXX.js} +1 -1
  105. package/viewer/dist/assets/{xychartDiagram-2RQKCTM6-Bl_zzGZm.js → xychartDiagram-2RQKCTM6-kXPrRy2n.js} +1 -1
  106. package/viewer/dist/index.html +2 -2
  107. package/viewer/dist/assets/architecture-7EHR7CIX-FCXXAu3O.js +0 -1
  108. package/viewer/dist/assets/channel-GJMBi5UK.js +0 -1
  109. package/viewer/dist/assets/chunk-QZHKN3VN-DA8qsAVF.js +0 -1
  110. package/viewer/dist/assets/chunk-WU5MYG2G-Dp8LMm21.js +0 -1
  111. package/viewer/dist/assets/classDiagram-4FO5ZUOK-wnkp0LBB.js +0 -1
  112. package/viewer/dist/assets/classDiagram-v2-Q7XG4LA2-wnkp0LBB.js +0 -1
  113. package/viewer/dist/assets/eventmodeling-FCH6USID-CCZDiBK0.js +0 -1
  114. package/viewer/dist/assets/index-Bqs39Itl.css +0 -2
  115. package/viewer/dist/assets/stateDiagram-v2-BHNVJYJU-BePyUY0u.js +0 -1
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: FEATURE and RELEASE are native card types
3
+ status: built
4
+ connections:
5
+ - DOC-CARD-TYPES
6
+ - FILE-TYPES
7
+ - DECISION-NATIVE-DECISION-TYPE
8
+ ---
9
+
10
+ # FEATURE and RELEASE are native card types
11
+
12
+ ## Context
13
+
14
+ Constellation modeled the *initial* build well — PLAN cards and phases, work
15
+ marked `status: planned` — but had no primitive for how projects actually grow
16
+ afterwards: feature branches that ship in release versions. `planned` marks
17
+ individual cards, yet nothing groups a coherent slice of work; and a version's
18
+ intent (theme, upgrade notes) had no home that isn't a changelog.
19
+
20
+ ## Decision
21
+
22
+ Add two types (the 19th and 20th). **FEATURE** — a coherent unit of future
23
+ work, connected to every card it adds or touches; fields `release` (handle of
24
+ the RELEASE it targets — structured ref, auto-connects) and `branch`
25
+ (informational). **RELEASE** — a version milestone; field `version`. Status
26
+ carries each card's arc: a FEATURE goes `planned → building → built` as its
27
+ branch merges; a RELEASE goes `planned → built` as it ships.
28
+
29
+ Two guardrails hold the philosophy:
30
+
31
+ - **FEATURE is not a ticket tracker.** Work that is one card's status flip
32
+ needs no FEATURE card; the backlog stays a `status` query.
33
+ - **RELEASE is not a changelog.** What shipped is git's job ([[DOC-CHANGE-TRACKING]]);
34
+ the card holds only what git can't say — theme, intent, migration notes.
35
+
36
+ ## Alternatives
37
+
38
+ - **Scoped PLAN cards per feature** — rejected: plans are living summaries, not
39
+ units of work with an arc; and retrieval by type ("show open features") needs
40
+ a prefix.
41
+ - **External trackers only (issues/boards)** — rejected: the plan is the
42
+ agent-facing memory; work the graph can't see can't be traversed, assembled,
43
+ or drift-checked.
44
+
45
+ ## Consequences
46
+
47
+ - The iteration loop is now first-class: feature branch ↔ FEATURE card,
48
+ release version ↔ RELEASE card, wired by `release:`.
49
+ - A shipped FEATURE card stays, like a DECISION card
50
+ ([[DECISION-NATIVE-DECISION-TYPE]]) — provenance of why the system grew.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: DECISION is a native card type
3
+ status: built
4
+ connections:
5
+ - DOC-CARD-TYPES
6
+ - DOC-MCP-UPGRADES
7
+ - FILE-TYPES
8
+ ---
9
+
10
+ # DECISION is a native card type
11
+
12
+ Reverses the earlier call in [[DOC-MCP-UPGRADES]] ("decided AGAINST a dedicated
13
+ `DECISION` card type"). This card is itself the first native decision card — the
14
+ new type records the *why*; [[DOC-CARD-TYPES]] records the *what*.
15
+
16
+ ## Context
17
+
18
+ The original reasoning was that co-location beats a separate filing system:
19
+ decisions live as `append_note(kind: decision)` on the cards they concern, or as
20
+ a DOC card (`kind: decision`) when bigger. Field use broke that model two ways:
21
+
22
+ - **Volume.** Real projects accumulated 30+ `DOC-…` decision cards, burying the
23
+ actual documentation (guides, rules) in `doc/` and making "every decision" a
24
+ kind-filter query instead of a folder and a type.
25
+ - **Fan-out.** A decision routinely shapes *several* cards, so there is no single
26
+ card to co-locate a note on. The graph already had the right primitive —
27
+ connections — but no node type for the decision itself.
28
+
29
+ The skill also already mandated one-file-per-decision ("Decisions (ADRs) get one
30
+ DOC card each"), so the "separate filing system" existed either way; it was just
31
+ typed as documentation.
32
+
33
+ ## Decision
34
+
35
+ Add `DECISION-` / `decision/` as the 18th type. A DECISION card is an ADR — the
36
+ choice, the why, the alternatives rejected — **connected to every card it
37
+ shaped**. One structured field, `supersedes` (an earlier DECISION handle; must
38
+ resolve, and connects the two). Superseded decisions are kept, never deleted.
39
+
40
+ `append_note(kind: decision)` stays: it remains the right home for a choice local
41
+ to a single card. Promote a note to a DECISION card when the choice touches more
42
+ than one card or the rejected alternatives are worth recording.
43
+
44
+ ## Alternatives
45
+
46
+ - **Status quo (DOC `kind: decision`)** — rejected: pollutes `doc/`, invisible in
47
+ the type system, and retrieval (viewer nav, `list_cards`, `describe_type`)
48
+ can't treat decisions as first-class.
49
+ - **Notes only, no decision cards** — rejected: cross-cutting decisions have no
50
+ co-location target; splitting one rationale across N notes drifts.
51
+
52
+ ## Consequences
53
+
54
+ - `doc/` is documentation again: suggested DOC kinds shrink to guide / rule / meta.
55
+ - Adding the type touched the usual four places ([[DOC-CARD-TYPES]]) plus the
56
+ three agent-guidance copies and the viewer palette.
57
+ - Existing plans with `DOC-…` decision cards can migrate one card at a time with
58
+ `rename_card` (e.g. `DOC-DECISION-X` → `DECISION-X`); nothing forces it.
@@ -1,12 +1,12 @@
1
1
  ---
2
- name: The 17 card types
2
+ name: The 20 card types
3
3
  kind: reference
4
4
  status: built
5
5
  ---
6
6
 
7
- # The 17 card types
7
+ # The 20 card types
8
8
 
9
- The prefix before the first dash determines a card's type and must be one of these 17. Folder
9
+ The prefix before the first dash determines a card's type and must be one of these 20. Folder
10
10
  placement matches the type (a misfiled card warns W001, not errors — the prefix is
11
11
  authoritative). Defined in [[FILE-TYPES]] (`TYPE_NAMES`) and [[FILE-HANDLES]] (`TYPE_FOLDERS`).
12
12
 
@@ -17,6 +17,7 @@ authoritative). Defined in [[FILE-TYPES]] (`TYPE_NAMES`) and [[FILE-HANDLES]] (`
17
17
  | DATATYPE | `DATATYPE-` | `datatype/` | Data type schemas (interfaces, Zod, etc.) |
18
18
  | ROLE | `ROLE-` | `role/` | User roles / permission groups |
19
19
  | DOC | `DOC-` | `doc/` | Documentation cards |
20
+ | DECISION | `DECISION-` | `decision/` | Architecture decision records — the why + rejected alternatives |
20
21
  | FILE | `FILE-` | `file/` | Source file references (require `path`) |
21
22
  | TEST | `TEST-` | `test/` | Test specs |
22
23
  | EXTERNAL | `EXTERNAL-` | `external/` | External services / integrations |
@@ -29,6 +30,8 @@ authoritative). Defined in [[FILE-TYPES]] (`TYPE_NAMES`) and [[FILE-HANDLES]] (`
29
30
  | DIAGRAM | `DIAGRAM-` | `diagram/` | Architecture diagrams |
30
31
  | AGENT | `AGENT-` | `agent/` | AI agent instructions / policies |
31
32
  | PLAN | `PLAN-` | `plan/` | Plan documents (`plan.md` = PLAN-PROJECT) |
33
+ | FEATURE | `FEATURE-` | `feature/` | Future work units — the iteration primitive |
34
+ | RELEASE | `RELEASE-` | `release/` | Version milestones — theme + upgrade notes, never a changelog |
32
35
 
33
36
  **Adding or renaming a type touches four places that must agree:** `TYPE_NAMES`
34
37
  ([[FILE-TYPES]]) + `TYPE_FOLDERS` ([[FILE-HANDLES]]); `schemas/<folder>.json`;
@@ -17,7 +17,7 @@ normative format; the JSON Schemas in `schemas/` define per-type frontmatter and
17
17
  The filename IS the handle: `api/API-TICKETS.md` defines the card `API-TICKETS`. There is no
18
18
  `handle:` or `type:` field — the path already says it. Handle grammar:
19
19
  `^[A-Z][A-Z0-9]*-[A-Z0-9][A-Z0-9-]*$` (3–135 chars; uppercase, digits, dashes). The prefix
20
- before the first dash is the type and must be one of the 17 canonical prefixes (see
20
+ before the first dash is the type and must be one of the 20 canonical prefixes (see
21
21
  [[DOC-CARD-TYPES]]). `plan.md` at the root is the one special file — the card `PLAN-PROJECT`.
22
22
 
23
23
  ## Frontmatter
@@ -15,7 +15,7 @@ Structural codes come from [[FILE-INDEXER]]; schema codes (W002/W003) from [[FIL
15
15
  | Code | Rule |
16
16
  |---|---|
17
17
  | E001 | Filename is not a valid handle |
18
- | E002 | Handle prefix is not one of the 17 canonical prefixes |
18
+ | E002 | Handle prefix is not one of the 20 canonical prefixes |
19
19
  | E003 | Duplicate handle (two files resolve to the same handle) |
20
20
  | E004 | `connections` entry is not a handle-shaped string |
21
21
  | E005 | `connections` or frontmatter-field target resolves to no card |
@@ -46,9 +46,10 @@ call. `assemble` fuses both into a fan-out-ready work package.
46
46
  change flag; the drift verdict stays live and unstored ([[DOC-CHANGE-TRACKING]], [[FILE-SYNC]]).
47
47
  - **Code attach is same-repo** — cards never bind across repos; reach a sibling's code via the
48
48
  `repo` selector ([[DOC-CONNECTED-REPOS]]).
49
- - **Decided AGAINST a dedicated `DECISION` card type** — decisions live as data on the cards
50
- they concern: an `append_note(kind: decision)`, a DOC card (`kind: decision`, like this one),
51
- or a DIAGRAM. Co-location beats a separate filing system you have to remember to open.
49
+ - **Decided AGAINST a dedicated `DECISION` card type** — *superseded by
50
+ [[DECISION-NATIVE-DECISION-TYPE]]*: real projects accumulated dozens of DOC decision cards,
51
+ and cross-cutting decisions have no single card to co-locate a note on. Card-local choices
52
+ still live as `append_note(kind: decision)` on the card they concern.
52
53
  - **Memory must be retrievable to be memory** — `search` indexes note text alongside bodies,
53
54
  and `list_notes` gives the cross-card view (every gotcha / every decision in one call). A
54
55
  note that full-text search can't find would silently defeat the point of appending it.
@@ -3,7 +3,7 @@ name: handles.ts
3
3
  status: built
4
4
  path: src/core/handles.ts
5
5
  language: typescript
6
- summary: Handle grammar, the 17 canonical prefixes, and the type↔folder map
6
+ summary: Handle grammar, the 20 canonical prefixes, and the type↔folder map
7
7
  ---
8
8
 
9
9
  Defines the handle regex (`^[A-Z][A-Z0-9]*-[A-Z0-9][A-Z0-9-]*$`), `isHandleShaped` / `isKnownHandle` / `typeForHandle`, and `TYPE_FOLDERS` — the authority for which prefix is which type and where its cards live.
@@ -3,7 +3,7 @@ name: types.ts
3
3
  status: built
4
4
  path: src/core/types.ts
5
5
  language: typescript
6
- summary: Core domain types + TYPE_NAMES (the 17 types)
6
+ summary: Core domain types + TYPE_NAMES (the 20 types)
7
7
  ---
8
8
 
9
9
  `Card`, `Connection`, `PlanIndex`, `Issue`, `CardRefs`, `ConnectedRepo`, and `TYPE_NAMES`. One of the four places a type addition must touch.
@@ -8,4 +8,4 @@ connections:
8
8
  - FILE-TYPES
9
9
  ---
10
10
 
11
- Validates each card's frontmatter against `schemas/`. Derives the W003 base allow-list from `card.json`'s properties (not a hardcoded list), so cross-type metadata fields are blessed on all 17 types. Ajv ships CJS — loaded via createRequire.
11
+ Validates each card's frontmatter against `schemas/`. Derives the W003 base allow-list from `card.json`'s properties (not a hardcoded list), so cross-type metadata fields are blessed on all 20 types. Ajv ships CJS — loaded via createRequire.
@@ -7,7 +7,7 @@ export declare const HANDLE_MAX_LENGTH = 135;
7
7
  export declare const TYPE_FOLDERS: Record<TypeName, string>;
8
8
  /** True when the string matches the handle grammar (prefix may be unknown). */
9
9
  export declare function isHandleShaped(value: string): boolean;
10
- /** Type for a handle's prefix, or null when the prefix is not one of the 17. */
10
+ /** Type for a handle's prefix, or null when the prefix is not one of the 20. */
11
11
  export declare function typeForHandle(handle: string): TypeName | null;
12
12
  /** Shaped AND carries a known prefix — the test used for reference extraction. */
13
13
  export declare function isKnownHandle(value: string): boolean;
@@ -10,6 +10,7 @@ export const TYPE_FOLDERS = {
10
10
  DATATYPE: 'datatype',
11
11
  ROLE: 'role',
12
12
  DOC: 'doc',
13
+ DECISION: 'decision',
13
14
  FILE: 'file',
14
15
  TEST: 'test',
15
16
  EXTERNAL: 'external',
@@ -22,6 +23,8 @@ export const TYPE_FOLDERS = {
22
23
  DIAGRAM: 'diagram',
23
24
  AGENT: 'agent',
24
25
  PLAN: 'plan',
26
+ FEATURE: 'feature',
27
+ RELEASE: 'release',
25
28
  };
26
29
  const TYPE_SET = new Set(TYPE_NAMES);
27
30
  /** True when the string matches the handle grammar (prefix may be unknown). */
@@ -30,7 +33,7 @@ export function isHandleShaped(value) {
30
33
  value.length <= HANDLE_MAX_LENGTH &&
31
34
  HANDLE_PATTERN.test(value));
32
35
  }
33
- /** Type for a handle's prefix, or null when the prefix is not one of the 17. */
36
+ /** Type for a handle's prefix, or null when the prefix is not one of the 20. */
34
37
  export function typeForHandle(handle) {
35
38
  const dash = handle.indexOf('-');
36
39
  if (dash <= 0)
@@ -1 +1 @@
1
- {"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAEvD,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CACL,KAAK,CAAC,MAAM,IAAI,iBAAiB;QACjC,KAAK,CAAC,MAAM,IAAI,iBAAiB;QACjC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAEvD,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAA6B;IACpD,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,UAAU,CAAC,CAAC;AAE7C,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,CACL,KAAK,CAAC,MAAM,IAAI,iBAAiB;QACjC,KAAK,CAAC,MAAM,IAAI,iBAAiB;QACjC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC"}
@@ -57,7 +57,7 @@ function readCard(relPath, filePath, raw, issues) {
57
57
  issues.push({
58
58
  severity: 'error',
59
59
  code: 'E002',
60
- message: `Unknown handle prefix: ${handle.split('-')[0]}- (expected one of the 17 canonical prefixes)`,
60
+ message: `Unknown handle prefix: ${handle.split('-')[0]}- (expected one of the 20 canonical prefixes)`,
61
61
  file: relPath,
62
62
  });
63
63
  return null;
@@ -1,4 +1,4 @@
1
- export declare const TYPE_NAMES: readonly ["API", "DB", "DATATYPE", "ROLE", "DOC", "FILE", "TEST", "EXTERNAL", "EVENT", "COMPONENT", "PAGE", "JOB", "FLOW", "STATE", "DIAGRAM", "AGENT", "PLAN"];
1
+ export declare const TYPE_NAMES: readonly ["API", "DB", "DATATYPE", "ROLE", "DOC", "DECISION", "FILE", "TEST", "EXTERNAL", "EVENT", "COMPONENT", "PAGE", "JOB", "FLOW", "STATE", "DIAGRAM", "AGENT", "PLAN", "FEATURE", "RELEASE"];
2
2
  export type TypeName = (typeof TYPE_NAMES)[number];
3
3
  export interface CardRefs {
4
4
  /** Handles listed in the frontmatter `connections` key. */
@@ -1,5 +1,6 @@
1
1
  export const TYPE_NAMES = [
2
- 'API', 'DB', 'DATATYPE', 'ROLE', 'DOC', 'FILE', 'TEST', 'EXTERNAL', 'EVENT',
3
- 'COMPONENT', 'PAGE', 'JOB', 'FLOW', 'STATE', 'DIAGRAM', 'AGENT', 'PLAN',
2
+ 'API', 'DB', 'DATATYPE', 'ROLE', 'DOC', 'DECISION', 'FILE', 'TEST', 'EXTERNAL',
3
+ 'EVENT', 'COMPONENT', 'PAGE', 'JOB', 'FLOW', 'STATE', 'DIAGRAM', 'AGENT', 'PLAN',
4
+ 'FEATURE', 'RELEASE',
4
5
  ];
5
6
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;IAC3E,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAC/D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;IAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;IAChF,SAAS,EAAE,SAAS;CACZ,CAAC"}
@@ -55,12 +55,15 @@ whole card — make the honest update the easy one: append_note adds an append-o
55
55
  replaces a single ## section in place. Reach for these to record a correction the moment you
56
56
  learn it, so cards stay true instead of drifting. Notes are retrievable memory: search
57
57
  matches note text, and list_notes lists them across cards by kind — every gotcha or decision
58
- in one call. To rename a handle, use rename_card: it moves the file and rewrites every
58
+ in one call. A decision note is for a choice local to that one card; a decision that shaped
59
+ SEVERAL cards gets its own DECISION card, connected to every card it shaped (the successor
60
+ of a replaced decision points at it via supersedes — never delete decision history). To
61
+ rename a handle, use rename_card: it moves the file and rewrites every
59
62
  reference plan-wide (connections, frontmatter values, [[links]], mermaid node IDs) as whole
60
63
  tokens — never delete-and-recreate to rename.
61
64
 
62
65
  describe_type is the type reference, served by this server: call it with no args for the
63
- catalog of all 17 card types, or with a type (e.g. describe_type PAGE) for that type's
66
+ catalog of all 20 card types, or with a type (e.g. describe_type PAGE) for that type's
64
67
  frontmatter schema + a golden example. Consult it before authoring a type you haven't used
65
68
  this session — you don't need the authoring skill loaded to get the fields right.
66
69
 
@@ -96,6 +99,12 @@ the affected neighborhood (get_card / traverse / search, connected: "full"), the
96
99
  update the cards so they describe the desired END STATE (work that isn't built yet is
97
100
  status: planned), wiring every connection between the affected cards. Show that set of card
98
101
  changes as the proposal; on approval, bring the CODE up to match via the sync loop above.
102
+ Past the initial build, model iteration explicitly: a coherent slice of future work is a
103
+ FEATURE card connected to every card it adds or touches (intent/scope/acceptance in the
104
+ body, branch: while in flight, status planned → building → built as it merges), optionally
105
+ targeting a RELEASE card (a version milestone; features point at it via release:). A RELEASE
106
+ body is theme + upgrade notes, NEVER a changelog — what shipped is git's job. Neither is a
107
+ ticket tracker: work that is one card's status flip needs no FEATURE card.
99
108
  FINISH by reconciling — re-read the touched cards against the code, run check_integrity so
100
109
  no affected card is left an orphan and every connection is set, bump status (planned →
101
110
  building → built → verified), commit, and set_sync_point. In plan mode the write tools are
@@ -807,7 +816,7 @@ export function buildServer(options = {}) {
807
816
  }));
808
817
  server.registerTool('describe_type', {
809
818
  annotations: { readOnlyHint: true },
810
- description: 'The card-type reference, served straight from this package. Call with no args for the catalog — all 17 types with their prefix, folder, and one-line purpose. Call with a type for everything needed to author one: the frontmatter JSON Schema (fields, which are required, descriptions) plus the golden example and authoring guidance. Use it before writing a card of a type you have not authored this session — it is the contract create_card/create_cards/update_card validate against (W002/W003), so you do not need the authoring skill loaded to get the fields right.',
819
+ description: 'The card-type reference, served straight from this package. Call with no args for the catalog — all 20 types with their prefix, folder, and one-line purpose. Call with a type for everything needed to author one: the frontmatter JSON Schema (fields, which are required, descriptions) plus the golden example and authoring guidance. Use it before writing a card of a type you have not authored this session — it is the contract create_card/create_cards/update_card validate against (W002/W003), so you do not need the authoring skill loaded to get the fields right.',
811
820
  inputSchema: {
812
821
  type: typeSchema.optional().describe('omit for the full catalog'),
813
822
  },