trybeacon 0.1.49 → 0.1.50

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 (101) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +12 -12
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/server/app/_global-error.html +1 -1
  7. package/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/api/context/feature/route.js +1 -1
  24. package/.next/server/app/api/entities/route.js +1 -1
  25. package/.next/server/app/api/map/start/route.js +1 -1
  26. package/.next/server/app/docs/page.js +1 -1
  27. package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/docs.html +1 -1
  29. package/.next/server/app/docs.rsc +2 -2
  30. package/.next/server/app/docs.segments/_full.segment.rsc +2 -2
  31. package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
  32. package/.next/server/app/docs.segments/_index.segment.rsc +1 -1
  33. package/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
  34. package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +2 -2
  35. package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
  36. package/.next/server/app/feedback/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/feedback.html +1 -1
  38. package/.next/server/app/feedback.rsc +1 -1
  39. package/.next/server/app/feedback.segments/_full.segment.rsc +1 -1
  40. package/.next/server/app/feedback.segments/_head.segment.rsc +1 -1
  41. package/.next/server/app/feedback.segments/_index.segment.rsc +1 -1
  42. package/.next/server/app/feedback.segments/_tree.segment.rsc +1 -1
  43. package/.next/server/app/feedback.segments/feedback/__PAGE__.segment.rsc +1 -1
  44. package/.next/server/app/feedback.segments/feedback.segment.rsc +1 -1
  45. package/.next/server/app/help/page.js +1 -1
  46. package/.next/server/app/help/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/help.html +1 -1
  48. package/.next/server/app/help.rsc +3 -3
  49. package/.next/server/app/help.segments/_full.segment.rsc +3 -3
  50. package/.next/server/app/help.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/help.segments/_index.segment.rsc +1 -1
  52. package/.next/server/app/help.segments/_tree.segment.rsc +1 -1
  53. package/.next/server/app/help.segments/help/__PAGE__.segment.rsc +10 -12
  54. package/.next/server/app/help.segments/help.segment.rsc +1 -1
  55. package/.next/server/app/index.html +1 -1
  56. package/.next/server/app/index.rsc +1 -1
  57. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  58. package/.next/server/app/index.segments/_full.segment.rsc +1 -1
  59. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  61. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  62. package/.next/server/app/map/page.js +2 -2
  63. package/.next/server/app/map/page.js.nft.json +1 -1
  64. package/.next/server/app/map/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/plan/page.js +2 -2
  67. package/.next/server/app/plan/page.js.nft.json +1 -1
  68. package/.next/server/app/plan/page_client-reference-manifest.js +1 -1
  69. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  70. package/.next/server/app-paths-manifest.json +12 -12
  71. package/.next/server/chunks/1130.js +1 -1
  72. package/.next/server/chunks/3622.js +1 -1
  73. package/.next/server/chunks/9773.js +1 -0
  74. package/.next/server/middleware-build-manifest.js +1 -1
  75. package/.next/server/pages/404.html +1 -1
  76. package/.next/server/pages/500.html +1 -1
  77. package/.next/server/server-reference-manifest.js +1 -1
  78. package/.next/server/server-reference-manifest.json +1 -1
  79. package/.next/static/chunks/1487-13f43d25413ae041.js +1 -0
  80. package/.next/static/chunks/app/docs/page-ae19d2e91ec24771.js +1 -0
  81. package/.next/static/chunks/app/map/page-5074176a5e746ffb.js +1 -0
  82. package/.next/static/chunks/app/plan/page-3c4c1fc03275299f.js +1 -0
  83. package/.next/trace +39 -39
  84. package/.next/trace-build +1 -1
  85. package/dist/bin/doctor.js +16 -6
  86. package/dist/bin/hook.js +16 -6
  87. package/dist/bin/mcp.js +47 -37
  88. package/dist/bin/plan.js +22 -12
  89. package/dist/bin/prompt.js +1 -1
  90. package/dist/bin/uninstall.js +16 -6
  91. package/dist/lib/assets.js +16 -6
  92. package/dist/lib/codex-install.js +16 -6
  93. package/dist/lib/global-install.js +16 -6
  94. package/package.json +1 -1
  95. package/.next/server/chunks/7331.js +0 -1
  96. package/.next/static/chunks/7323-480fb88e9d24f9e9.js +0 -1
  97. package/.next/static/chunks/app/docs/page-0c841cb9a7aa2f9a.js +0 -1
  98. package/.next/static/chunks/app/map/page-66d71744ae3363d7.js +0 -1
  99. package/.next/static/chunks/app/plan/page-e7d16fa2a3713a92.js +0 -1
  100. /package/.next/static/{qeqVD-yeoYO_3C0pw9kHg → J1AU9kp6Vs1x9YOBkXMiR}/_buildManifest.js +0 -0
  101. /package/.next/static/{qeqVD-yeoYO_3C0pw9kHg → J1AU9kp6Vs1x9YOBkXMiR}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":28440334,"timestamp":173139511,"id":14,"parentId":1,"tags":{},"startTime":1781573958524,"traceId":"63ef3eb53f233cfc"},{"name":"run-typescript","duration":12434254,"timestamp":201582356,"id":4126,"parentId":1,"tags":{},"startTime":1781573986967,"traceId":"63ef3eb53f233cfc"},{"name":"static-check","duration":713209,"timestamp":214103113,"id":4129,"parentId":1,"tags":{},"startTime":1781573999488,"traceId":"63ef3eb53f233cfc"},{"name":"static-generation","duration":4631988,"timestamp":215436526,"id":4283,"parentId":1,"tags":{},"startTime":1781574000822,"traceId":"63ef3eb53f233cfc"},{"name":"collect-build-traces","duration":13341573,"timestamp":214819506,"id":4280,"parentId":1,"tags":{},"startTime":1781574000204,"traceId":"63ef3eb53f233cfc"},{"name":"telemetry-flush","duration":60,"timestamp":228164787,"id":4292,"parentId":1,"tags":{},"startTime":1781574013550,"traceId":"63ef3eb53f233cfc"},{"name":"next-build","duration":55402341,"timestamp":172762516,"id":1,"tags":{"buildMode":"default","version":"16.2.7","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1781573958147,"traceId":"63ef3eb53f233cfc"}]
1
+ [{"name":"run-webpack","duration":28943484,"timestamp":118901747,"id":14,"parentId":1,"tags":{},"startTime":1781631967154,"traceId":"6259803428af983d"},{"name":"run-typescript","duration":12690485,"timestamp":147847841,"id":4126,"parentId":1,"tags":{},"startTime":1781631996101,"traceId":"6259803428af983d"},{"name":"static-check","duration":667088,"timestamp":160586710,"id":4129,"parentId":1,"tags":{},"startTime":1781632008839,"traceId":"6259803428af983d"},{"name":"static-generation","duration":4218534,"timestamp":161797331,"id":4283,"parentId":1,"tags":{},"startTime":1781632010050,"traceId":"6259803428af983d"},{"name":"collect-build-traces","duration":11837205,"timestamp":161256828,"id":4280,"parentId":1,"tags":{},"startTime":1781632009510,"traceId":"6259803428af983d"},{"name":"telemetry-flush","duration":58,"timestamp":173097636,"id":4292,"parentId":1,"tags":{},"startTime":1781632021350,"traceId":"6259803428af983d"},{"name":"next-build","duration":54308800,"timestamp":118788903,"id":1,"tags":{"buildMode":"default","version":"16.2.7","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1781631967042,"traceId":"6259803428af983d"}]
@@ -71,7 +71,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
71
71
 
72
72
  ## What gets preserved vs replaced
73
73
 
74
- The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_describe_feature\` or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
74
+ The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
75
75
 
76
76
  The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
77
77
 
@@ -175,13 +175,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
175
175
 
176
176
  EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
177
177
 
178
- When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_start_feature\`, \`beacon_add_subtasks\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_describe_feature\` / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
178
+ When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
179
179
 
180
- REUSE before you create. Call \`beacon_map\` to see the features + categories that already exist. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category \u2014 so don't re-create work that's already on the board, and reuse an existing category rather than a near-synonym. \`category\` is the ONLY domain field. \`front\` (in \`beacon_start_feature\`) nests a feature UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
180
+ ### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
181
+
182
+ To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
183
+ - \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
184
+ - \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
185
+ - \`{ action: "subtasks" }\` adds child tasks under a card.
186
+ - \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
187
+
188
+ A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
189
+
190
+ REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
181
191
 
182
192
  When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
183
193
 
184
- A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_start_feature\` (when the user says they're starting on a bug), \`beacon_add_subtasks\` items (a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
194
+ A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
185
195
 
186
196
  ### 2b. Presenting a plan in plan mode (ExitPlanMode)
187
197
 
@@ -199,11 +209,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
199
209
 
200
210
  ### 3. At the end, register the work \u2014 in ONE call
201
211
 
202
- Call \`beacon_describe_feature\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
212
+ Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
203
213
 
204
214
  Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
205
215
 
206
- Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_describe_feature\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
216
+ Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
207
217
 
208
218
  If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
209
219
 
package/dist/bin/hook.js CHANGED
@@ -71,7 +71,7 @@ Beacon was already initialized in this repo (\`/beacon-init\` ran at some point)
71
71
 
72
72
  ## What gets preserved vs replaced
73
73
 
74
- The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_describe_feature\` or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
74
+ The \`beacon_init_persist\` tool **replaces only init-derived nodes** (\`source=INIT\`). A curated architecture node (created by \`beacon_feature\` action:done or by hand) whose title matches a component in your refreshed analysis is **merged in place** \u2014 your fresh \`domain\`/\`role\`/\`plain\`/\`layer\`/\`files\` land on it, but it keeps its source, position, status, and bug flags, and no duplicate INIT node is created. Curated nodes your analysis does NOT mention survive untouched, as do hand-edited tables, custom positions, notes, and draft feature plans. So you can re-run this freely.
75
75
 
76
76
  The one caveat: if the user manually edited an INIT-source node on the canvas (e.g., renamed it, rewrote its role), that edit IS overwritten when you re-persist \u2014 and a renamed node no longer title-matches, so it survives as its own card. If the user mentions hand-curated INIT nodes, ask whether they want those carried into the new analysis verbatim.
77
77
 
@@ -175,13 +175,23 @@ When listing endpoints, give each \`uses: [{ table, access }]\` so the endpoint\
175
175
 
176
176
  EVERY feature MUST carry \`category\` (e.g. AUTH | SEARCH | DATA | INTEL | BILLING | \u2026; \`cluster\` is accepted as an alias) and \`priority\` (0 = P0 critical, 1 = P1 high, 2 = P2 medium, 3 = P3 low). Beacon REJECTS a plan whose features omit either \u2014 \`beacon_propose_plan\` returns the list of what's missing, and an ExitPlanMode \`\`\`beacon block is denied \u2014 so set both on every feature instead of relying on defaults.
177
177
 
178
- When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_start_feature\`, \`beacon_add_subtasks\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_describe_feature\` / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
178
+ When the workspace HAS A FRONTEND (Beacon knows \u2014 the agent set \`hasFrontend\` at init, or frontend files were detected), every feature must ALSO carry \`layer\`: \`"frontend" | "backend" | "fullstack"\` \u2014 which side of the stack the work lands on. Plans omitting it are REJECTED the same way category/priority are. It works on every surface that creates roadmap cards (\`beacon_propose_plan\`, the \`\`\`beacon block, \`beacon_feature\` \u2014 sub-tasks default to the parent's layer) and on architecture components (\`beacon_feature\` action:done / \`beacon_init_persist\`). In a pure-backend repo, never set it \u2014 the boards don't show it there.
179
179
 
180
- REUSE before you create. Call \`beacon_map\` to see the features + categories that already exist. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category \u2014 so don't re-create work that's already on the board, and reuse an existing category rather than a near-synonym. \`category\` is the ONLY domain field. \`front\` (in \`beacon_start_feature\`) nests a feature UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
180
+ ### Adding a card directly \u2014 \`beacon_feature\` (no review gate)
181
+
182
+ To put a card on the board WITHOUT the plan-review flow, call \`beacon_feature\` \u2014 ONE tool for a feature's whole lifecycle:
183
+ - \`{ action: "add" }\` creates a card in a SINGLE call. It defaults to \`status: "backlog"\` (a PENDING item you're NOT working on yet); pass \`status: "active"\` to start it IN_PROGRESS now. A title that matches an existing card returns \`exists\` (reuse it) \u2014 \`add\` never activates or demotes a card already on the board.
184
+ - \`{ action: "start" }\` marks an existing card IN_PROGRESS (create-or-flag).
185
+ - \`{ action: "subtasks" }\` adds child tasks under a card.
186
+ - \`{ action: "done" }\` completes feature(s) and registers the files/architecture touched.
187
+
188
+ A NEW card REQUIRES \`category\` + \`priority\` (and \`layer\` where the workspace has a frontend). Use \`beacon_propose_plan\` / \`beacon_present_plan\` only when you want the user to REVIEW before the card lands.
189
+
190
+ REUSE before you create. Call \`beacon_map\` FIRST \u2014 it lists every card with its \`category\`, \`priority\`, \`layer\` and \`status\`, so you reuse an existing category (don't invent a near-synonym) and spot duplicates WITHOUT calling \`beacon_entities\`. Beacon HARD-BLOCKS a feature that duplicates an existing one (it returns the existing feature to use instead) and one created without a category. \`category\` is the ONLY domain field. \`front\` (in \`beacon_feature\`) nests a card UNDER an existing parent feature \u2014 it is NOT a domain tag; a \`front\` that matches no real feature is rejected.
181
191
 
182
192
  When listing features, give each \`dependsOn: ["Other feature title", \u2026]\` for any feature that must ship after another in the same plan. Beacon draws these as "depends on" links so the roadmap shows the dependency chain instead of loose, disconnected cards.
183
193
 
184
- A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_start_feature\` (when the user says they're starting on a bug), \`beacon_add_subtasks\` items (a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
194
+ A roadmap item that is a BUG to fix (not a feature to build) should carry \`kind: "BUG"\` \u2014 it renders as a typed bug card. This works everywhere roadmap cards are created: \`beacon_propose_plan\` features, the \`\`\`beacon block, \`beacon_feature\` (add/start when the user is working on a bug; or \`subtasks\` items for a bug discovered mid-work), and \`beacon_init_persist\` roadmap items. Default is FEATURE.
185
195
 
186
196
  ### 2b. Presenting a plan in plan mode (ExitPlanMode)
187
197
 
@@ -199,11 +209,11 @@ Beacon extracts it deterministically and **strips the block from the prose** (it
199
209
 
200
210
  ### 3. At the end, register the work \u2014 in ONE call
201
211
 
202
- Call \`beacon_describe_feature\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
212
+ Call \`beacon_feature({ action: "done" })\` **ONCE** with a \`features\` array \u2014 one entry per feature the plan created \u2014 each with the files you touched and a short markdown description. This flips each one to **Done** \u2014 including its sub-tasks (the cascade completes every PENDING/IN_PROGRESS child; a sub-task you did NOT finish must be set BLOCKED or CANCELLED before registering, so it survives visibly) \u2014 and keeps \`beacon_context_for_feature\` accurate for the next session.
203
213
 
204
214
  Key each entry by its node \`id\`: the ids are handed back to you when the plan is approved (in the approval message / additionalContext), so you don't fuzzy-match titles or pay a disambiguation round-trip. If you don't have an id, \`title\` still works.
205
215
 
206
- Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_describe_feature\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
216
+ Register them all in that single batched call. If a plan added five features, that's ONE \`beacon_feature({ action: "done" })\` call with five entries \u2014 NOT five calls, and NOT just an umbrella ("Harden auth"), which leaves the individual features stuck on **Pending**.
207
217
 
208
218
  If the feature added or materially changed a REAL architectural component (a subsystem \u2014 NOT a file), also pass \`architecture: [{ title, domain, role, \u2026 }]\` so the Architecture map stays accurate. It upserts curated components by title; never list files as components. If you found a bug or something worth investigating in a component's code, add \`bugs: [{ note }]\` to its architecture entry \u2014 it renders as a bug flag on the node (attributed to the agent); identical open flags are not duplicated. Only flag what you actually saw in the code.
209
219