@sugar-crash-studios/vibe-forge 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 (201) hide show
  1. package/.claude/commands/clear-attention.md +63 -0
  2. package/.claude/commands/compact-context.md +52 -0
  3. package/.claude/commands/configure-vcs.md +102 -0
  4. package/.claude/commands/forge.md +171 -0
  5. package/.claude/commands/need-help.md +77 -0
  6. package/.claude/commands/update-status.md +64 -0
  7. package/.claude/commands/worker-loop.md +106 -0
  8. package/.claude/hooks/worker-loop.js +198 -0
  9. package/.claude/scripts/setup-worker-loop.sh +45 -0
  10. package/.claude/settings.local.json +46 -0
  11. package/LICENSE +21 -0
  12. package/README.md +238 -0
  13. package/agents/aegis/personality.md +294 -0
  14. package/agents/anvil/personality.md +276 -0
  15. package/agents/architect/personality.md +258 -0
  16. package/agents/crucible/personality.md +360 -0
  17. package/agents/ember/personality.md +291 -0
  18. package/agents/forge-master/capabilities.md +144 -0
  19. package/agents/forge-master/context-template.md +128 -0
  20. package/agents/forge-master/personality.md +138 -0
  21. package/agents/furnace/personality.md +340 -0
  22. package/agents/herald/personality.md +247 -0
  23. package/agents/loki/personality.md +108 -0
  24. package/agents/oracle/personality.md +283 -0
  25. package/agents/pixel/personality.md +113 -0
  26. package/agents/planning-hub/personality.md +320 -0
  27. package/agents/scribe/personality.md +251 -0
  28. package/agents/temper/personality.md +218 -0
  29. package/bin/cli.js +375 -0
  30. package/bin/dashboard/api/agents.js +333 -0
  31. package/bin/dashboard/api/dispatch.js +483 -0
  32. package/bin/dashboard/api/tasks.js +416 -0
  33. package/bin/dashboard/frontend/index.html +13 -0
  34. package/bin/dashboard/frontend/package.json +16 -0
  35. package/bin/dashboard/frontend/src/App.svelte +222 -0
  36. package/bin/dashboard/frontend/src/app.css +1777 -0
  37. package/bin/dashboard/frontend/src/lib/components/AgentCard.svelte +60 -0
  38. package/bin/dashboard/frontend/src/lib/components/AgentsPanel.svelte +57 -0
  39. package/bin/dashboard/frontend/src/lib/components/DispatchModal.svelte +180 -0
  40. package/bin/dashboard/frontend/src/lib/components/Footer.svelte +33 -0
  41. package/bin/dashboard/frontend/src/lib/components/Header.svelte +84 -0
  42. package/bin/dashboard/frontend/src/lib/components/IssueCard.svelte +33 -0
  43. package/bin/dashboard/frontend/src/lib/components/IssuesPanel.svelte +73 -0
  44. package/bin/dashboard/frontend/src/lib/components/KeyboardShortcutsModal.svelte +108 -0
  45. package/bin/dashboard/frontend/src/lib/components/MobileTabs.svelte +52 -0
  46. package/bin/dashboard/frontend/src/lib/components/NotificationCard.svelte +60 -0
  47. package/bin/dashboard/frontend/src/lib/components/NotificationsPanel.svelte +44 -0
  48. package/bin/dashboard/frontend/src/lib/components/TaskCard.svelte +63 -0
  49. package/bin/dashboard/frontend/src/lib/components/TasksPanel.svelte +82 -0
  50. package/bin/dashboard/frontend/src/lib/components/Toast.svelte +45 -0
  51. package/bin/dashboard/frontend/src/lib/stores/agents.js +34 -0
  52. package/bin/dashboard/frontend/src/lib/stores/issues.js +54 -0
  53. package/bin/dashboard/frontend/src/lib/stores/notifications.js +48 -0
  54. package/bin/dashboard/frontend/src/lib/stores/tasks.js +63 -0
  55. package/bin/dashboard/frontend/src/lib/stores/theme.js +33 -0
  56. package/bin/dashboard/frontend/src/lib/stores/toast.js +35 -0
  57. package/bin/dashboard/frontend/src/lib/stores/ui.js +25 -0
  58. package/bin/dashboard/frontend/src/lib/stores/voice.js +275 -0
  59. package/bin/dashboard/frontend/src/lib/stores/websocket.js +295 -0
  60. package/bin/dashboard/frontend/src/lib/utils/api.js +101 -0
  61. package/bin/dashboard/frontend/src/lib/utils/formatters.js +54 -0
  62. package/bin/dashboard/frontend/src/main.js +9 -0
  63. package/bin/dashboard/frontend/svelte.config.js +5 -0
  64. package/bin/dashboard/frontend/vite.config.js +20 -0
  65. package/bin/dashboard/public/assets/index-DnfVj9Ce.css +1 -0
  66. package/bin/dashboard/public/assets/index-Ze5h0kXQ.js +2 -0
  67. package/bin/dashboard/public/index.html +14 -0
  68. package/bin/dashboard/server.js +566 -0
  69. package/bin/forge-daemon.sh +463 -0
  70. package/bin/forge-setup.sh +645 -0
  71. package/bin/forge-spawn.sh +164 -0
  72. package/bin/forge.cmd +83 -0
  73. package/bin/forge.sh +533 -0
  74. package/bin/lib/agents.sh +177 -0
  75. package/bin/lib/colors.sh +44 -0
  76. package/bin/lib/config.sh +347 -0
  77. package/bin/lib/constants.sh +241 -0
  78. package/bin/lib/daemon/display.sh +128 -0
  79. package/bin/lib/daemon/notifications.sh +263 -0
  80. package/bin/lib/daemon/routing.sh +77 -0
  81. package/bin/lib/daemon/state.sh +115 -0
  82. package/bin/lib/daemon/sync.sh +95 -0
  83. package/bin/lib/database.sh +310 -0
  84. package/bin/lib/heimdall-setup.js +113 -0
  85. package/bin/lib/heimdall.js +265 -0
  86. package/bin/lib/json.sh +264 -0
  87. package/bin/lib/terminal.js +451 -0
  88. package/bin/lib/util.sh +126 -0
  89. package/bin/lib/vcs.js +349 -0
  90. package/config/agent-manifest.yaml +203 -0
  91. package/config/agents.json +168 -0
  92. package/config/task-template.md +159 -0
  93. package/config/task-types.yaml +106 -0
  94. package/context/agent-status/aegis.json +7 -0
  95. package/context/agent-status/anvil.json +7 -0
  96. package/context/agent-status/architect.json +7 -0
  97. package/context/agent-status/crucible.json +7 -0
  98. package/context/agent-status/ember.json +7 -0
  99. package/context/agent-status/furnace.json +7 -0
  100. package/context/agent-status/loki.json +7 -0
  101. package/context/agent-status/oracle.json +7 -0
  102. package/context/agent-status/pixel.json +7 -0
  103. package/context/agent-status/planning-hub.json +7 -0
  104. package/context/agent-status/scribe.json +7 -0
  105. package/context/agent-status/temper.json +7 -0
  106. package/context/feature-brainstorm.md +426 -0
  107. package/context/forge-state.yaml +19 -0
  108. package/context/modern-conventions.md +129 -0
  109. package/context/project-context-template.md +122 -0
  110. package/context/project-context.md +122 -0
  111. package/docs/TODO.md +150 -0
  112. package/docs/agents.md +409 -0
  113. package/docs/architecture/decisions/ADR-001-daemon-modularization.md +122 -0
  114. package/docs/architecture/vibe-lab-integration.md +684 -0
  115. package/docs/architecture.md +194 -0
  116. package/docs/bmad-gap-analysis-2026-03-31.md +444 -0
  117. package/docs/cleanup-workflow.md +329 -0
  118. package/docs/commands.md +451 -0
  119. package/docs/dashboard-mockup.html +989 -0
  120. package/docs/getting-started.md +261 -0
  121. package/docs/integration/forge-ownership-policy.md +112 -0
  122. package/docs/npm-publishing.md +132 -0
  123. package/docs/roadmap-2026.md +519 -0
  124. package/docs/security.md +144 -0
  125. package/docs/wireframes/dashboard-mvp.md +1164 -0
  126. package/docs/workflows/README.md +32 -0
  127. package/docs/workflows/azure-devops.md +108 -0
  128. package/docs/workflows/bitbucket.md +104 -0
  129. package/docs/workflows/git-only.md +130 -0
  130. package/docs/workflows/gitea.md +168 -0
  131. package/docs/workflows/github.md +103 -0
  132. package/docs/workflows/gitlab.md +105 -0
  133. package/docs/workflows.md +454 -0
  134. package/package.json +73 -0
  135. package/tasks/completed/ARCH-001-duplicate-agent-config.md +121 -0
  136. package/tasks/completed/ARCH-002-mixed-bash-node-implementation.md +88 -0
  137. package/tasks/completed/ARCH-003-worker-loop-hook-duplication.md +77 -0
  138. package/tasks/completed/ARCH-009-test-organization.md +78 -0
  139. package/tasks/completed/ARCH-011-jq-vs-nodejs-json.md +94 -0
  140. package/tasks/completed/ARCH-012-tmp-files-in-root.md +71 -0
  141. package/tasks/completed/ARCH-013-exit-code-constants.md +65 -0
  142. package/tasks/completed/ARCH-014-sed-incompatibility.md +96 -0
  143. package/tasks/completed/ARCH-015-docs-todo-tracking.md +83 -0
  144. package/tasks/completed/BUG-dash-001-tasks-filter-error.md +31 -0
  145. package/tasks/completed/BUG-dash-002-agents-unknown.md +41 -0
  146. package/tasks/completed/CLEAN-001.md +38 -0
  147. package/tasks/completed/CLEAN-002.md +43 -0
  148. package/tasks/completed/CLEAN-003.md +47 -0
  149. package/tasks/completed/CLEAN-004.md +56 -0
  150. package/tasks/completed/CLEAN-005.md +75 -0
  151. package/tasks/completed/CLEAN-006.md +47 -0
  152. package/tasks/completed/CLEAN-007.md +34 -0
  153. package/tasks/completed/CLEAN-008.md +49 -0
  154. package/tasks/completed/CLEAN-012.md +58 -0
  155. package/tasks/completed/CLEAN-013.md +45 -0
  156. package/tasks/completed/FEATURE-001a-dashboard-wireframes.md +162 -0
  157. package/tasks/completed/IMPL-007a-daemon-notifications-module.md +82 -0
  158. package/tasks/completed/IMPL-007b-daemon-sync-module.md +71 -0
  159. package/tasks/completed/IMPL-007c-daemon-state-module.md +80 -0
  160. package/tasks/completed/IMPL-007d-daemon-routing-module.md +77 -0
  161. package/tasks/completed/IMPL-007e-daemon-display-module.md +77 -0
  162. package/tasks/completed/IMPL-007f-daemon-integration.md +124 -0
  163. package/tasks/completed/PLAT-1-heimdall.md +420 -0
  164. package/tasks/completed/SEC-001-sql-injection-fix.md +58 -0
  165. package/tasks/completed/SEC-002-notification-injection-fix.md +45 -0
  166. package/tasks/completed/SEC-003-eval-injection-fix.md +54 -0
  167. package/tasks/completed/SEC-004-pid-race-condition-fix.md +49 -0
  168. package/tasks/completed/SEC-005-worker-loop-path-fix.md +51 -0
  169. package/tasks/completed/SEC-006-eval-agent-names.md +55 -0
  170. package/tasks/completed/SEC-007-spawn-escaping.md +67 -0
  171. package/tasks/completed/TASK-DASH-001-server-infrastructure.md +185 -0
  172. package/tasks/completed/TASK-anvil-001-dashboard-frontend.md +133 -0
  173. package/tasks/completed/review-bmad-aegis.md +89 -0
  174. package/tasks/completed/review-bmad-anvil.md +80 -0
  175. package/tasks/completed/review-bmad-crucible.md +81 -0
  176. package/tasks/completed/review-bmad-ember.md +90 -0
  177. package/tasks/completed/review-bmad-furnace.md +79 -0
  178. package/tasks/completed/review-bmad-pixel.md +82 -0
  179. package/tasks/completed/review-bmad-scribe.md +92 -0
  180. package/tasks/completed/review-bmad-sentinel.md +83 -0
  181. package/tasks/pending/ARCH-004-git-bash-detection-duplication.md +72 -0
  182. package/tasks/pending/ARCH-005-missing-src-directory.md +95 -0
  183. package/tasks/pending/ARCH-006-task-template-location.md +64 -0
  184. package/tasks/pending/ARCH-008-forge-master-vs-hub.md +81 -0
  185. package/tasks/pending/ARCH-010-missing-index-files.md +84 -0
  186. package/tasks/pending/CLEAN-009.md +31 -0
  187. package/tasks/pending/CLEAN-010.md +30 -0
  188. package/tasks/pending/CLEAN-011.md +30 -0
  189. package/tasks/pending/CLEAN-014.md +32 -0
  190. package/tasks/pending/DESIGN-dash-001-layout-review.md +45 -0
  191. package/tasks/pending/FEATURE-001-dashboard-mvp.md +268 -0
  192. package/tasks/review/ARCH-007-daemon-monolith.md +162 -0
  193. package/tasks/review/bmad-review-aegis.md +349 -0
  194. package/tasks/review/bmad-review-anvil.md +259 -0
  195. package/tasks/review/bmad-review-crucible.md +277 -0
  196. package/tasks/review/bmad-review-ember.md +307 -0
  197. package/tasks/review/bmad-review-furnace.md +285 -0
  198. package/tasks/review/bmad-review-pixel.md +329 -0
  199. package/tasks/review/bmad-review-scribe.md +361 -0
  200. package/tasks/review/bmad-review-sentinel.md +242 -0
  201. package/tasks/review/task-001.md +78 -0
@@ -0,0 +1,519 @@
1
+ # Vibe Forge Integration Roadmap — 2026
2
+
3
+ **Generated:** 2026-03-31
4
+ **Based on:** BMAD gap analysis (9 agent reports), Claude Code source patterns, vibe-lab exploration
5
+ **Current version:** Vibe Forge 0.4.0
6
+
7
+ ---
8
+
9
+ ## How to Read This
10
+
11
+ Work is organized into **parallel workstreams** — groups of tasks that have no dependencies on each other and can run simultaneously — and **sequential chains** where earlier items unlock later ones.
12
+
13
+ **Priority tiers:**
14
+ - **Tier 0:** Security fixes — do these before any other work
15
+ - **Tier 1:** High-value, low-risk improvements — do these next sprint
16
+ - **Tier 2:** Framework maturity — do these over the following 2-3 sprints
17
+ - **Tier 3:** Strategic expansion — larger initiatives, plan carefully
18
+
19
+ **Effort legend:** `XS` (<2h) | `S` (half-day) | `M` (1-2 days) | `L` (3-5 days) | `XL` (1+ week)
20
+
21
+ ---
22
+
23
+ ## Tier 0: Security (Do First, Can Parallelize)
24
+
25
+ These are independent of each other and should all be done before any feature work. A compromised CI pipeline or RCE vector outweighs any feature benefit.
26
+
27
+ ### T0-1: Fix `design` Alias Collision `[XS]`
28
+ **Source:** CRIT-3
29
+ **Location:** `config/agents.json`
30
+ Both `architect` and `pixel` claim `"design"`. Pixel silently wins. `forge spawn design` spawns the wrong agent.
31
+
32
+ **Fix:** Remove `"design"` from `architect.aliases`. Architect has `"arch"` already.
33
+
34
+ **Parallel with:** T0-2, T0-3
35
+
36
+ ---
37
+
38
+ ### T0-2: Eliminate `eval` of Node-Generated Shell Code `[M]`
39
+ **Source:** CRIT-2 (Sentinel, Aegis)
40
+ **Location:** `bin/lib/config.sh:142`
41
+
42
+ `load_agents_from_json()` runs Node.js, captures its stdout (shell assignments), then `eval`s it. Any bug in `escapeForShell()` or a compromised `agents.json` is RCE.
43
+
44
+ **Fix:** During `forge init` (or on first config load), write a static `agents.env` file with validated variable assignments. Source that file instead of eval-ing dynamically. Node.js only runs to rebuild the file when `agents.json` changes (compare mtime).
45
+
46
+ **Parallel with:** T0-1, T0-3
47
+
48
+ ---
49
+
50
+ ### T0-3: Add Pre-commit Hook Infrastructure `[S]`
51
+ **Source:** CRIT-4 (Crucible)
52
+ **Why now:** Prevents any code from entering main without basic gates. Low effort, high protection.
53
+
54
+ **Fix:** Add a minimal `.husky/pre-commit` that runs:
55
+ 1. `node --check bin/cli.js` (syntax only — already in CI)
56
+ 2. `npm test` if tests exist and pass in <30s
57
+ 3. `shellcheck bin/*.sh` for any modified shell files
58
+
59
+ **Parallel with:** T0-1, T0-2
60
+
61
+ ---
62
+
63
+ ## Tier 1: High-Value Quick Wins
64
+
65
+ These are largely independent. All can be worked in parallel once Tier 0 is done.
66
+
67
+ ### Workstream A: Quality Enforcement
68
+
69
+ #### T1-A1: Numbered Acceptance Criteria Enforcement `[S]`
70
+ **Source:** Crucible, task-template.md rewrite (done)
71
+ The task template now has numbered ACs. Next: Sentinel's review checklist should explicitly verify each numbered AC passes before approving.
72
+
73
+ Add to Sentinel's personality: "When reviewing, enumerate each AC 1..N and confirm YES/NO/PARTIAL with evidence. A PR cannot be approved unless all ACs are YES."
74
+
75
+ #### T1-A2: Definition of Done Gate in Task Flow `[M]`
76
+ **Source:** CRIT-4 (Crucible)
77
+ Tasks move to `review/` with the DoD checklist in the template. Sentinel should be instructed to reject PRs where `ready_for_review: false` in the completion YAML or where DoD checkboxes are unchecked.
78
+
79
+ Update Sentinel personality + add forge-daemon verification step: scan task file for `ready_for_review: false` before notifying review queue.
80
+
81
+ #### T1-A3: HALT Conditions in All Agent Personalities `[M]`
82
+ **Source:** Furnace, Sentinel
83
+ Agents must know when to stop and escalate rather than improvise or self-approve.
84
+
85
+ Add to every worker agent personality (Anvil, Furnace, Crucible, Ember, Aegis, Pixel, Scribe):
86
+ ```
87
+ **When to STOP and write to tasks/attention/:**
88
+ - Required package not in project (get approval before adding)
89
+ - 3 consecutive test failures on the same test
90
+ - Acceptance criteria are ambiguous or contradictory
91
+ - Schema or migration would affect live data
92
+ - Security concern (escalate to Aegis)
93
+ - Your confidence is low — stopping is correct
94
+ ```
95
+
96
+ ---
97
+
98
+ ### Workstream B: Developer Experience
99
+
100
+ #### T1-B1: Fix README — Remove Non-Existent Agents `[XS]`
101
+ **Source:** Pixel (HIGH-9)
102
+ README references Sage, Oracle, and Quartermaster which do not exist in `agents.json`. Creates confusion for new users trying to spawn these agents.
103
+
104
+ **Fix:** Audit README against `agents.json` canonical names. Remove all references to agents that don't exist. Update examples to use real aliases.
105
+
106
+ #### T1-B2: Alias Collision Detection in CI `[S]`
107
+ **Source:** forge doctor (done)
108
+ `forge doctor` now detects alias collisions at runtime. Next: add the same check to CI so it catches regressions.
109
+
110
+ Add a `node -e "..."` step to `.github/workflows/ci.yml` that reads `agents.json` and exits 1 if any alias maps to two different canonical agents.
111
+
112
+ #### T1-B3: `forge init` Validates `agents.json` on Setup `[XS]`
113
+ **Source:** Ember
114
+ `forge init` should run the alias collision check before completing setup. If collisions exist, warn loudly and offer to fix them.
115
+
116
+ #### T1-B4: Session Anti-Pattern Guards in Hub Personality `[S]`
117
+ **Source:** Sentinel
118
+ Planning Hub must not lie about task completion or stop sessions prematurely. Add explicit prohibitions to Hub personality:
119
+
120
+ - "Never mark a task complete without reading the completion YAML in the task file."
121
+ - "Never end your session without checking for pending tasks."
122
+ - "If a task is in `in-progress/` with no recent activity, flag it to the user."
123
+
124
+ ---
125
+
126
+ ### Workstream C: Task System Improvements
127
+
128
+ #### T1-C1: Epic/Story Hierarchy Directory Structure `[M]`
129
+ **Source:** HIGH-1, BMAD comparison
130
+ BMAD's epic → story → task tree is its most powerful planning tool. Vibe Forge has tasks but no hierarchy above them.
131
+
132
+ **Fix:** Create `specs/epics/` directory with an epic template. Update task-template to reference parent epic via `specs/epics/{EPIC_ID}.md`. Hub should create epics first, then decompose them into tasks. No need to replicate all of BMAD's planning phases — just the hierarchy.
133
+
134
+ Epic template fields: `id`, `title`, `goal`, `success_metrics`, `stories[]`, `status`.
135
+
136
+ #### T1-C2: `forge-state.yaml` Sprint Summary `[M]`
137
+ **Source:** HIGH-4 (missing sprint-status.yaml equivalent)
138
+ BMAD's `sprint-status.yaml` gives a single-file answer to "what is the team working on right now?" Vibe Forge's `forge-state.yaml` exists but is often empty.
139
+
140
+ **Fix:** Hub should update `context/forge-state.yaml` on startup and after completing each task batch:
141
+ ```yaml
142
+ sprint: null
143
+ last_updated: 2026-03-31T12:00:00Z
144
+ active_tasks:
145
+ - id: task-042
146
+ title: "Add login form"
147
+ assigned_to: anvil
148
+ status: in-progress
149
+ pending_count: 7
150
+ completed_today: 3
151
+ blocked: []
152
+ ```
153
+
154
+ #### T1-C3: `tasks/attention/` Escalation Routing `[S]`
155
+ **Source:** Furnace
156
+ The `attention/` directory exists in the task template but there are no instructions for what happens to files placed there. Hub should monitor it and surface items to the user on startup.
157
+
158
+ Add to Hub's startup behavior: check `tasks/attention/` and display any files with a summary. These are agent escalations that require human input.
159
+
160
+ ---
161
+
162
+ ### Workstream D: Daemon & Infrastructure
163
+
164
+ #### T1-D1: Fix Daemon Cross-Platform Date Parsing `[S]`
165
+ **Source:** Ember (BUG-daemon-001)
166
+ Daemon uses `date -d` which is GNU/Linux only. macOS uses `date -j -f`. This silently breaks all time-based features on macOS.
167
+
168
+ **Fix:** Use Node.js `new Date(str)` for all date operations in daemon scripts instead of shell `date` command. Or add a platform detection branch.
169
+
170
+ #### T1-D2: Fix `stat` Portability in Daemon `[XS]`
171
+ **Source:** Ember (BUG-daemon-002)
172
+ Daemon uses `stat -c '%Y'` (Linux) vs `stat -f '%m'` (macOS) for file modification times.
173
+
174
+ **Fix:** Same as above — move file mtime operations to Node.js `fs.statSync(f).mtimeMs`.
175
+
176
+ #### T1-D3: Wire Up `db_record_status_history()` `[S]`
177
+ **Source:** Ember
178
+ `db_record_status_history()` exists in the daemon but is never called. The `status_history` table is always empty. This means the dashboard's history features show no data.
179
+
180
+ **Fix:** Call `db_record_status_history()` whenever a task moves between directories. The daemon's file watcher should be the trigger point.
181
+
182
+ ---
183
+
184
+ ## Tier 2: Framework Maturity
185
+
186
+ These are larger features. Some have dependencies. Do in the order shown within each workstream.
187
+
188
+ ### Workstream E: Planning & Requirements Phase
189
+
190
+ These items are sequential — each builds on the last.
191
+
192
+ #### T2-E1: Context Directory Bootstrap `[S]`
193
+ **Dependency:** None (prerequisite for E2, E3)
194
+ Ensure `context/` directory exists with documented files:
195
+ - `project-context.md` — what this project is, who the users are, tech stack
196
+ - `architecture.md` — key decisions, patterns, guardrails
197
+ - `agent-overrides/` — per-agent customization files (see T2-E3)
198
+
199
+ `forge init` should create these with prompts for key fields.
200
+
201
+ #### T2-E2: Hub Planning Mode `[L]`
202
+ **Dependency:** T1-C1 (epic hierarchy)
203
+ **Source:** HIGH-1, BMAD Phase 1-3
204
+
205
+ Hub currently jumps straight to task assignment. Add a "planning mode" that Hub enters at project start (or when `specs/epics/` is empty):
206
+
207
+ 1. **Discovery:** Ask the user to describe the goal in plain language
208
+ 2. **Decomposition:** Break into epics, each with a clear success metric
209
+ 3. **Tasking:** Decompose each epic into tasks, assign types and agent targets
210
+ 4. **Commit:** Write epic files and task files, then hand off to workers
211
+
212
+ This is the single biggest gap vs BMAD. Hub is a great executor — it needs to also be a planner.
213
+
214
+ #### T2-E3: Per-Project Agent Customization `[M]`
215
+ **Dependency:** T2-E1
216
+ **Source:** HIGH-7, BMAD `.customize.yaml`
217
+
218
+ BMAD agents read a `.customize.yaml` that overrides their behavior for the specific project (tech stack, conventions, forbidden patterns). Vibe Forge agents receive only their personality file — no per-project tuning.
219
+
220
+ **Fix:** Hub reads `context/agent-overrides/<agent>.md` and appends it to the agent's system prompt when spawning. Each override file is a short markdown of project-specific rules.
221
+
222
+ ---
223
+
224
+ ### Workstream F: Token & Session Management
225
+
226
+ #### T2-F1: Token Budget Warnings `[M]`
227
+ **Source:** HIGH-3 (Sentinel)
228
+ No agent knows how much context it has consumed or when it's approaching its limit. This leads to silent context truncation and degraded quality near session end.
229
+
230
+ **Fix:** Add to daemon: when an agent's session log shows >100k tokens (estimate from task file sizes and conversation length), emit a notification to `tasks/attention/` with a suggestion to `/compact` or start a new session.
231
+
232
+ Longer term: workers should self-monitor. Add to worker personality: "If you notice your responses becoming repetitive or forgetting earlier decisions, immediately use /compact-context before continuing."
233
+
234
+ #### T2-F2: Session Handoff Protocol `[M]`
235
+ **Dependency:** T2-F1
236
+ **Source:** HIGH-3
237
+
238
+ When a worker hits context limits mid-task, it should write a handoff file before ending:
239
+ ```yaml
240
+ # tasks/handoffs/task-042-handoff.md
241
+ task_id: task-042
242
+ agent: anvil
243
+ handoff_reason: context_limit
244
+ completed_subtasks: [1.1, 1.2]
245
+ remaining_subtasks: [1.3, 2.1]
246
+ last_state: "login form markup done, need to wire submit handler"
247
+ context_dump: |
248
+ Key files touched: src/components/Login.tsx
249
+ Pattern used: React Hook Form with Zod validation
250
+ Next: add onSubmit handler calling POST /api/auth/login
251
+ ```
252
+
253
+ Next agent picks up the handoff instead of starting from scratch.
254
+
255
+ ---
256
+
257
+ ### Workstream G: Dashboard & Observability
258
+
259
+ #### T2-G1: Fix Dashboard Bugs `[M]`
260
+ **Source:** Pixel (BUG-dash-001, BUG-dash-002)
261
+
262
+ Known bugs in the Svelte dashboard:
263
+ - BUG-dash-001: Task counts don't update in real time — WebSocket events not triggering reactive updates
264
+ - BUG-dash-002: "Completed" column shows all-time tasks, not just current session
265
+
266
+ Fix both before adding any new dashboard features.
267
+
268
+ #### T2-G2: Agent Activity Feed `[M]`
269
+ **Dependency:** T1-D3 (status history wired up)
270
+ **Source:** Pixel
271
+
272
+ Add a live activity feed to the dashboard: a chronological stream of agent events (task started, task completed, escalation filed, error). Sourced from `status_history` table (once T1-D3 is fixed).
273
+
274
+ This replaces the need to `tail` log files to understand what the forge is doing.
275
+
276
+ #### T2-G3: In-Session Agent Menu `[M]`
277
+ **Source:** HIGH-5 (Sentinel)
278
+ Hub has no way to show "which agents are currently active" during a session. Add a `/agents` command to Hub that lists all agents with their current task assignment and status (idle, working, blocked).
279
+
280
+ ---
281
+
282
+ ### Workstream H: Architecture Cleanup
283
+
284
+ #### T2-H1: Consolidate forge-master / planning-hub `[M]`
285
+ **Source:** Sentinel
286
+ There are references to both "forge-master" and "planning-hub" in personality files and docs. They are the same role. Standardize on one name throughout. Recommended: keep "planning-hub" since it's the canonical agent name in `agents.json`.
287
+
288
+ #### T2-H2: Daemon Dependency Resolution `[L]`
289
+ **Source:** Furnace (HIGH-2)
290
+ The daemon routes tasks to agents based on `type` field only. Tasks with `blocked_by: [task-041]` are not checked for blockers before assignment — a blocked task can be dispatched before its dependency completes.
291
+
292
+ **Fix:** When selecting a task from `tasks/pending/`, daemon should:
293
+ 1. Check `blocked_by` list in frontmatter
294
+ 2. Verify each blocking task is in `tasks/completed/` or `tasks/merged/`
295
+ 3. Only dispatch if all blockers are resolved
296
+
297
+ ---
298
+
299
+ ## Tier 3: Strategic Expansion
300
+
301
+ Large initiatives. Plan before building. Some depend on Tier 2 completion.
302
+
303
+ ### T3-1: Vibe Lab Integration `[XL]`
304
+ **Dependency:** T2-F2 (session handoff protocol), T2-G2 (activity feed)
305
+
306
+ This is the highest-leverage strategic opportunity. Vibe Lab is a mature Python pipeline (Sentinel service, 9 specialized agents, SQLite pipeline.db, dashboard, MCP server) that handles the CI/CD and release pipeline. Vibe Forge is the development session layer. They are complementary.
307
+
308
+ **Integration opportunities:**
309
+
310
+ **A. Planning Hub as Vibe Lab Story Creator**
311
+ Hub's planning mode (T2-E2) should be able to write stories directly to vibe-lab's sprint-status.yaml via MCP. Instead of creating local task files, Hub creates vibe-lab stories that the Sentinel service picks up and dispatches automatically.
312
+
313
+ ```
314
+ Hub: "Okay, I've decomposed this epic into 5 stories. Creating them in vibe-lab now."
315
+ Hub: mcp__vibe-lab__create_story(project_path="...", id="STORY-042", ...)
316
+ ```
317
+
318
+ **B. Forge Daemon Reads vibe-lab Pipeline State**
319
+ Forge daemon currently only knows about local `tasks/` directories. When vibe-lab is present, it should also expose vibe-lab story status in the dashboard — showing the full pipeline from "story in backlog" through "released."
320
+
321
+ **C. Vibe-lab Agents Spawned via Forge**
322
+ Vibe Lab uses `claude -p` subprocesses for its agents. Forge's `spawn` command (which handles terminal, tab color, personality) could become the launcher for vibe-lab agents, giving them the same session management and visual identity that forge agents have.
323
+
324
+ **D. Shared Observer**
325
+ A single observer MCP server that both systems publish events to, enabling cross-system dashboarding. Vibe Lab already has its MCP server (`mcp__vibe-lab__*`). Forge adds its events to the same sink.
326
+
327
+ **Recommended starting point:** Integration A (Hub as story creator) is highest impact, lowest risk. Start there. Read vibe-lab's `_vibe-chain/templates/` to understand the story format, then add MCP calls to Hub.
328
+
329
+ ---
330
+
331
+ ### T3-2: BMAD Planning Phase Port `[XL]`
332
+ **Dependency:** T2-E2 (Hub planning mode)
333
+
334
+ Once Hub has a planning mode (T2-E2), extend it to implement the full BMAD analysis phase:
335
+ - Analyst agent: extract requirements from user input
336
+ - Product Manager agent: write PRDs with acceptance criteria
337
+ - Architect agent: produce architecture decision records
338
+
339
+ This would close the largest single gap vs BMAD. It's a significant undertaking — treat it as a separate project with its own epic.
340
+
341
+ ---
342
+
343
+ ### T3-3: Adversarial Review Agent `[L]`
344
+ **Source:** Crucible (BMAD's "adversarial" CodeRabbit pattern)
345
+
346
+ Add a review agent configured to find problems, not rubber-stamp work. Unlike Sentinel (which checks compliance), this agent actively attempts to break the implementation:
347
+ - Write tests designed to fail
348
+ - Look for edge cases the agent missed
349
+ - Check for security anti-patterns beyond the DoD checklist
350
+ - Report findings even if all ACs technically pass
351
+
352
+ This is the pattern behind BMAD's high code quality reputation.
353
+
354
+ ---
355
+
356
+ ### T3-4: Multi-Developer Support `[XL]`
357
+ **Source:** HIGH-6 (Sentinel)
358
+
359
+ Currently, Vibe Forge assumes a single developer running a single forge. Multiple developers sharing a project would have:
360
+ - Racing task assignments (two agents pick the same task)
361
+ - No coordination on which developer's instance is authoritative
362
+ - Dashboard only shows one developer's daemon state
363
+
364
+ This requires distributed locking (file-based or SQLite WAL), developer identity in task frontmatter, and daemon discovery across machines.
365
+
366
+ ---
367
+
368
+ ## Parallel vs Sequential Summary
369
+
370
+ ```
371
+ Tier 0 (all parallel):
372
+ T0-1: alias collision fix
373
+ T0-2: eliminate eval
374
+ T0-3: pre-commit hooks
375
+
376
+ Tier 1 (parallel workstreams, sequential within):
377
+ Workstream A (quality): T1-A1 → T1-A2 → T1-A3
378
+ Workstream B (DX): T1-B1, T1-B2, T1-B3, T1-B4 (all parallel)
379
+ Workstream C (tasks): T1-C1 → T1-C3, T1-C2 (independent)
380
+ Workstream D (daemon): T1-D1, T1-D2 (parallel), then T1-D3
381
+
382
+ Tier 2 (parallel workstreams, sequential within):
383
+ Workstream E (planning): T2-E1 → T2-E2 → T2-E3
384
+ Workstream F (tokens): T2-F1 → T2-F2
385
+ Workstream G (dashboard): T2-G1 → T2-G2, T2-G3 (independent)
386
+ Workstream H (arch): T2-H1 (independent), T2-H2 (independent)
387
+
388
+ Tier 3 (after Tier 2 gates):
389
+ T3-1: vibe-lab integration (start after T2-F2)
390
+ T3-2: BMAD planning phase (start after T2-E2)
391
+ T3-3: adversarial review (independent)
392
+ T3-4: multi-dev support (independent, large)
393
+ ```
394
+
395
+ ---
396
+
397
+ ## Priority Matrix
398
+
399
+ | ID | Title | Tier | Effort | Parallel With |
400
+ |----|-------|------|--------|---------------|
401
+ | T0-1 | Fix design alias collision | 0 | XS | T0-2, T0-3 |
402
+ | T0-2 | Eliminate eval in config.sh | 0 | M | T0-1, T0-3 |
403
+ | T0-3 | Add pre-commit hooks | 0 | S | T0-1, T0-2 |
404
+ | T1-B1 | Fix README (remove phantom agents) | 1 | XS | All T1 |
405
+ | T1-B2 | Alias collision check in CI | 1 | S | All T1 |
406
+ | T1-B3 | forge init validates agents.json | 1 | XS | All T1 |
407
+ | T1-D1 | Fix daemon date parsing (macOS) | 1 | S | T1-D2 |
408
+ | T1-D2 | Fix stat portability in daemon | 1 | XS | T1-D1 |
409
+ | T1-A1 | Numbered AC enforcement in Sentinel | 1 | S | T1-B*, T1-D* |
410
+ | T1-C3 | attention/ escalation routing | 1 | S | All T1 |
411
+ | T1-B4 | Session anti-pattern guards (Hub) | 1 | S | All T1 |
412
+ | T1-A2 | DoD gate in task flow | 1 | M | After T1-A1 |
413
+ | T1-A3 | HALT conditions in all personalities | 1 | M | All T1 |
414
+ | T1-C1 | Epic/story hierarchy | 1 | M | T1-C2 |
415
+ | T1-C2 | forge-state.yaml sprint summary | 1 | M | T1-C1 |
416
+ | T1-D3 | Wire db_record_status_history | 1 | S | After T1-D1, T1-D2 |
417
+ | T2-G1 | Fix dashboard bugs | 2 | M | T2-H1, T2-F1 |
418
+ | T2-H1 | Consolidate forge-master/hub naming | 2 | S | T2-G1 |
419
+ | T2-F1 | Token budget warnings | 2 | M | T2-G1, T2-H1 |
420
+ | T2-E1 | Context directory bootstrap | 2 | S | T2-F1, T2-G1 |
421
+ | T2-F2 | Session handoff protocol | 2 | M | After T2-F1 |
422
+ | T2-G2 | Agent activity feed | 2 | M | After T1-D3, T2-G1 |
423
+ | T2-E2 | Hub planning mode | 2 | L | After T2-E1 |
424
+ | T2-E3 | Per-project agent customization | 2 | M | After T2-E1 |
425
+ | T2-G3 | In-session agent menu | 2 | M | T2-G2 |
426
+ | T2-H2 | Daemon dependency resolution | 2 | L | T2-E2 |
427
+ | T3-3 | Adversarial review agent | 3 | L | Independent |
428
+ | T3-1 | Vibe Lab integration | 3 | XL | After T2-F2 |
429
+ | T3-2 | BMAD planning phase port | 3 | XL | After T2-E2 |
430
+ | T3-4 | Multi-developer support | 3 | XL | Independent |
431
+
432
+ ---
433
+
434
+ ## Vibe Lab Integration Detail
435
+
436
+ Vibe Lab (`G:\dev\vibe-lab`) is a production-grade Python pipeline at **v0.20.0**:
437
+
438
+ ### What vibe-lab is
439
+ - **Sentinel service** (Python, Windows NSSM service) — event-driven filesystem watcher, spawns Dispatcher, manages subagent processes deterministically in Python (no LLM PID management), logs to SQLite
440
+ - **10 specialized agents**: Story Factory, Dispatcher, Dev, Arch Review, UX Review, Code Review, Code Review Verifier, Test Runner, Release Manager, Docs
441
+ - **SQLite pipeline.db** — agent runs, token costs, cycle time, story metrics (100+ tests, 18 pytest files)
442
+ - **Hub REST API** on accserver (`https://vibe-dash.local.cogg.haus`) — stories, costs, dispatch, events
443
+ - **Svelte dashboard** with Kanban board (7 columns), story drawer, cost panel, agent activity
444
+ - **Two MCP servers**: local Sentinel MCP (`mcp__vibe-lab__*`, Python FastMCP) + remote Hub MCP (`mcp__vibe-hub__*`, Node.js)
445
+ - **18+ handoff types** with strict YAML frontmatter schema, validation, and deduplication
446
+ - **Per-story git worktrees** for true parallel execution without merge conflicts
447
+
448
+ ### What vibe-lab has that vibe-forge doesn't
449
+ - Deterministic Python process management (SubagentManager — no LLM tracking PIDs)
450
+ - Token tracking and cost aggregation per agent type and per story
451
+ - Story cycle time metrics and full pipeline observability
452
+ - Per-story git worktrees (parallel execution)
453
+ - Formal handoff validation with schema enforcement and deduplication
454
+ - Severity-ranked code review with a dedicated verification pass agent
455
+ - Graceful shutdown, orphan detection, revision-needed back-routing
456
+ - Full CI/CD release pipeline with changelog, semver, and deploy steps
457
+
458
+ ### What vibe-forge has that vibe-lab doesn't
459
+ - Agent personalities (character-driven, UX-rich sessions with icons and tab colors)
460
+ - `--dangerously-skip-permissions` managed startup (no repeated prompts)
461
+ - Windows terminal integration (new window/tab spawning with color)
462
+ - Ralph Loop (Stop hook worker loop) for persistent worker sessions
463
+ - `forge doctor` diagnostics
464
+ - Planning Hub as orchestrator persona
465
+ - Task templates with formal DoD checklists
466
+
467
+ ### The integration thesis
468
+ Vibe Lab owns the **pipeline** (story lifecycle, review, release, CI/CD). Vibe Forge owns the **sessions** (personality, startup UX, worker loop, human-facing monitoring). They are complementary layers — Forge is where humans and agents interact; vibe-lab is where automated execution runs. Wire them so data flows between them; don't merge them.
469
+
470
+ ### Near-term integration (start here): Hub as Story Creator
471
+ When Hub decomposes an epic into stories, it calls `mcp__vibe-lab__create_story` to register them directly in the vibe-lab pipeline:
472
+
473
+ ```
474
+ Hub: "Decomposing epic into 3 stories. Registering in vibe-lab..."
475
+ Hub calls: mcp__vibe-lab__create_story(
476
+ project_path="G:/dev/vibe-lab",
477
+ id="STORY-042",
478
+ title="Add OAuth login",
479
+ status="ready-for-dev"
480
+ )
481
+ ```
482
+
483
+ Stories created by Hub flow through the full vibe-lab review/release chain automatically. This requires Hub's planning mode (T2-E2) to exist first.
484
+
485
+ ### Mid-term integration: Forge Dashboard shows Pipeline State
486
+ Add a panel to the forge Svelte dashboard that reads vibe-lab status via MCP:
487
+
488
+ ```javascript
489
+ const stories = await mcp.call('mcp__vibe-lab__list_stories', {
490
+ project_path: 'G:/dev/vibe-lab'
491
+ });
492
+ const sentinel = await mcp.call('mcp__vibe-lab__sentinel_status', {
493
+ project_path: 'G:/dev/vibe-lab'
494
+ });
495
+ ```
496
+
497
+ One dashboard showing both "what forge workers are doing" and "where the pipeline is."
498
+
499
+ ### Long-term integration: forge spawn targets vibe-lab Agents
500
+ `forge spawn` currently targets agents in `config/agents.json`. Extend to also spawn vibe-lab agents by reading `_vibe-chain/agents/agent-N-*.md` — they'd get the same tab-color and terminal treatment as forge agents.
501
+
502
+ ### MCP tools available right now
503
+ Both MCP servers are already registered in vibe-lab's `.mcp.json` and discoverable in any Claude Code session there:
504
+
505
+ **Sentinel MCP (local pipeline.db):**
506
+ - `mcp__vibe-lab__list_stories(project_path)` — all stories with status
507
+ - `mcp__vibe-lab__create_story(project_path, id, title, status)` — create story
508
+ - `mcp__vibe-lab__update_story_status(project_path, story_id, status)` — transition
509
+ - `mcp__vibe-lab__list_pending_handoffs(project_path)` — what's waiting
510
+ - `mcp__vibe-lab__sentinel_status(project_path)` — is sentinel running
511
+ - `mcp__vibe-lab__get_agent_stats(project_path)` — token/cost by agent
512
+ - `mcp__vibe-lab__get_pipeline_events(project_path, limit)` — event timeline
513
+
514
+ **Hub MCP (remote accserver DB):**
515
+ - `mcp__vibe-hub__get_stories(project_id, status)` — filtered story list
516
+ - `mcp__vibe-hub__add_issue(title, description, priority)` — file a bug
517
+ - `mcp__vibe-hub__add_dispatch(instruction, priority)` — trigger work
518
+ - `mcp__vibe-hub__get_costs(project_id)` — token spend breakdown
519
+ - `mcp__vibe-hub__get_active_agents(project_id)` — what's running now
@@ -0,0 +1,144 @@
1
+ # Vibe Forge Security Documentation
2
+
3
+ This document explains security considerations and intentional design decisions in Vibe Forge.
4
+
5
+ ## The `--dangerously-skip-permissions` Flag
6
+
7
+ ### What It Does
8
+
9
+ When starting agents, Vibe Forge uses Claude Code's `--dangerously-skip-permissions` flag:
10
+
11
+ ```bash
12
+ claude --dangerously-skip-permissions --system-prompt "$system_prompt" "startup"
13
+ ```
14
+
15
+ This flag disables Claude Code's permission prompts for file operations, command execution, and other actions that would normally require user confirmation.
16
+
17
+ ### Why We Use It
18
+
19
+ Vibe Forge is designed for **terminal-native vibe coding** - a workflow where you launch multiple AI agents that work autonomously on your codebase. The typical workflow involves:
20
+
21
+ 1. Starting a Planning Hub that coordinates work
22
+ 2. Spawning worker agents (frontend, backend, testing, etc.) in separate terminals
23
+ 3. Agents working autonomously on assigned tasks
24
+ 4. Human review at defined checkpoints
25
+
26
+ With permission prompts enabled, each agent would constantly interrupt for confirmation, breaking the autonomous workflow that makes Vibe Forge effective.
27
+
28
+ ### Security Mitigations
29
+
30
+ We implement several security measures to offset the risks:
31
+
32
+ #### 1. Agent Whitelist Validation
33
+
34
+ All agent names go through strict whitelist validation before execution:
35
+
36
+ ```bash
37
+ # bin/lib/constants.sh
38
+ VALID_AGENTS=("anvil" "furnace" "crucible" ...)
39
+
40
+ # bin/lib/agents.sh
41
+ resolve_agent() {
42
+ local canonical="${AGENT_ALIASES[$normalized]:-}"
43
+ if [[ -n "$canonical" ]]; then
44
+ echo "$canonical"
45
+ return 0
46
+ fi
47
+ return 1 # Reject unknown agents
48
+ }
49
+ ```
50
+
51
+ This prevents command injection through agent names.
52
+
53
+ #### 2. Path Traversal Protection
54
+
55
+ Personality file paths are validated to ensure they remain within the expected directory:
56
+
57
+ ```bash
58
+ get_agent_personality_path() {
59
+ local real_path=$(cd "$(dirname "$personality_path")" && pwd)/$(basename "$personality_path")
60
+ local agents_dir=$(cd "$forge_root/agents" && pwd)
61
+
62
+ if [[ "$real_path" != "$agents_dir"/* ]]; then
63
+ echo "Security error: Path traversal detected" >&2
64
+ return 1
65
+ fi
66
+ }
67
+ ```
68
+
69
+ #### 3. Safe JSON Parsing
70
+
71
+ We use Node.js for JSON parsing instead of `grep`/`cut` which could be vulnerable to injection:
72
+
73
+ ```bash
74
+ json_get_string() {
75
+ node -e "
76
+ const fs = require('fs');
77
+ const data = JSON.parse(fs.readFileSync('$file', 'utf8'));
78
+ if (data['$key'] !== undefined) console.log(String(data['$key']));
79
+ "
80
+ }
81
+ ```
82
+
83
+ #### 4. Daemon Security
84
+
85
+ The background daemon includes multiple protections:
86
+
87
+ - **Symlink protection**: Skips symlinks to prevent symlink attacks
88
+ - **Path validation**: Verifies destinations are within FORGE_ROOT
89
+ - **Atomic operations**: Uses temp files + move for safe writes
90
+ - **Lock files**: Prevents multiple daemon instances
91
+ - **Log rotation**: Bounded log growth prevents disk exhaustion
92
+
93
+ ### Risks to Be Aware Of
94
+
95
+ Even with mitigations, understand these risks:
96
+
97
+ 1. **AI agents can modify any file** in your project without confirmation
98
+ 2. **AI agents can execute any command** without confirmation
99
+ 3. **Malicious prompts** could potentially be injected if context files are compromised
100
+ 4. **Network access** is unrestricted - agents could make API calls
101
+
102
+ ### Recommendations
103
+
104
+ 1. **Use in development environments only** - Don't run on production systems
105
+ 2. **Use with version control** - Git makes it easy to review and revert changes
106
+ 3. **Review at checkpoints** - Check agent work during task transitions
107
+ 4. **Understand the personality files** - They define agent behavior
108
+ 5. **Keep project context secure** - Don't include secrets in context files
109
+ 6. **Run in isolated environments** - Consider containers for sensitive projects
110
+
111
+ ### Alternative: Manual Approval Mode
112
+
113
+ If you prefer permission prompts, you can modify the agent startup in `bin/forge.sh`:
114
+
115
+ ```bash
116
+ # Change this:
117
+ claude --dangerously-skip-permissions --system-prompt "$system_prompt" "startup"
118
+
119
+ # To this (removes the flag):
120
+ claude --system-prompt "$system_prompt" "startup"
121
+ ```
122
+
123
+ Note: This will significantly impact the autonomous workflow.
124
+
125
+ ## Reporting Security Issues
126
+
127
+ If you discover a security vulnerability in Vibe Forge:
128
+
129
+ 1. **Do not open a public issue**
130
+ 2. Email security concerns to the maintainers
131
+ 3. Include steps to reproduce
132
+ 4. Allow time for a fix before public disclosure
133
+
134
+ ## Security Checklist for Contributors
135
+
136
+ When contributing to Vibe Forge:
137
+
138
+ - [ ] Never pass user input directly to shell commands
139
+ - [ ] Always validate agent names against the whitelist
140
+ - [ ] Use safe JSON parsing (Node.js, not grep/cut)
141
+ - [ ] Validate file paths don't traverse outside expected directories
142
+ - [ ] Use atomic file operations where race conditions are possible
143
+ - [ ] Add tests for security-sensitive functions
144
+ - [ ] Document any new security considerations