goalbuddy 0.3.2 → 0.3.6

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 (55) hide show
  1. package/README.md +55 -5
  2. package/RELEASE-0.3.5.md +324 -0
  3. package/goalbuddy/SKILL.md +40 -13
  4. package/goalbuddy/agents/README.md +1 -1
  5. package/goalbuddy/agents/goal_judge.toml +33 -17
  6. package/goalbuddy/agents/goal_scout.toml +34 -14
  7. package/goalbuddy/agents/goal_worker.toml +36 -16
  8. package/goalbuddy/extend/local-goal-board/README.md +8 -4
  9. package/goalbuddy/extend/local-goal-board/examples/subgoal-parent/goal.md +3 -0
  10. package/goalbuddy/extend/local-goal-board/examples/subgoal-parent/notes/.gitkeep +1 -0
  11. package/goalbuddy/extend/local-goal-board/examples/subgoal-parent/state.yaml +60 -0
  12. package/goalbuddy/extend/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/goal.md +3 -0
  13. package/goalbuddy/extend/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/notes/.gitkeep +1 -0
  14. package/goalbuddy/extend/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/state.yaml +52 -0
  15. package/goalbuddy/extend/local-goal-board/extension.yaml +6 -4
  16. package/goalbuddy/extend/local-goal-board/scripts/lib/goal-board.mjs +1188 -31
  17. package/goalbuddy/extend/local-goal-board/scripts/local-goal-board.mjs +389 -54
  18. package/goalbuddy/extend/local-goal-board/test/local-goal-board.test.mjs +479 -5
  19. package/goalbuddy/scripts/check-goal-state.mjs +192 -6
  20. package/goalbuddy/scripts/parallel-plan.mjs +191 -0
  21. package/goalbuddy/scripts/render-task-prompt.mjs +305 -0
  22. package/goalbuddy/templates/agents.md +5 -4
  23. package/goalbuddy/templates/goal.md +18 -4
  24. package/goalbuddy/templates/state.yaml +14 -1
  25. package/internal/assets/goalbuddy-v0.3.5-release.png +0 -0
  26. package/internal/cli/goal-maker.mjs +172 -9
  27. package/package.json +3 -2
  28. package/plugins/goalbuddy/.claude-plugin/plugin.json +2 -2
  29. package/plugins/goalbuddy/.codex-plugin/plugin.json +4 -4
  30. package/plugins/goalbuddy/README.md +5 -3
  31. package/plugins/goalbuddy/agents/goal-judge.md +35 -16
  32. package/plugins/goalbuddy/agents/goal-scout.md +38 -13
  33. package/plugins/goalbuddy/agents/goal-worker.md +37 -14
  34. package/plugins/goalbuddy/skills/goalbuddy/SKILL.md +40 -13
  35. package/plugins/goalbuddy/skills/goalbuddy/agents/README.md +1 -1
  36. package/plugins/goalbuddy/skills/goalbuddy/agents/goal_judge.toml +33 -17
  37. package/plugins/goalbuddy/skills/goalbuddy/agents/goal_scout.toml +34 -14
  38. package/plugins/goalbuddy/skills/goalbuddy/agents/goal_worker.toml +36 -16
  39. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/README.md +8 -4
  40. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/examples/subgoal-parent/goal.md +3 -0
  41. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/examples/subgoal-parent/notes/.gitkeep +1 -0
  42. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/examples/subgoal-parent/state.yaml +60 -0
  43. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/goal.md +3 -0
  44. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/notes/.gitkeep +1 -0
  45. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/state.yaml +52 -0
  46. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/extension.yaml +6 -4
  47. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/scripts/lib/goal-board.mjs +1188 -31
  48. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/scripts/local-goal-board.mjs +389 -54
  49. package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/test/local-goal-board.test.mjs +479 -5
  50. package/plugins/goalbuddy/skills/goalbuddy/scripts/check-goal-state.mjs +192 -6
  51. package/plugins/goalbuddy/skills/goalbuddy/scripts/parallel-plan.mjs +191 -0
  52. package/plugins/goalbuddy/skills/goalbuddy/scripts/render-task-prompt.mjs +305 -0
  53. package/plugins/goalbuddy/skills/goalbuddy/templates/agents.md +5 -4
  54. package/plugins/goalbuddy/skills/goalbuddy/templates/goal.md +18 -4
  55. package/plugins/goalbuddy/skills/goalbuddy/templates/state.yaml +14 -1
@@ -85,7 +85,7 @@ Recommended options:
85
85
  2. GitHub Projects - best when stakeholders need a shared external board and the user can approve GitHub credentials/project details.
86
86
  3. No visual board - best for quick or private goals where the file board is enough.
87
87
 
88
- If the user chooses the local live board, create the goal directory, `notes/`, and an initial minimal `state.yaml` as soon as the slug is known, then run `npx goalbuddy board docs/goals/<slug>` and open the printed local URL in the AI coding agent's in-app browser (the Codex in-app Browser, the Claude Code preview, or the user's regular browser). In short: start the local board before filling the task list so the board pops up right away and cards populate live as `state.yaml` changes. Keep the printed URL in the final prep response as a fallback, but do not make the URL the primary experience.
88
+ If the user chooses the local live board, create the goal directory, `notes/`, and an initial minimal `state.yaml` as soon as the slug is known, then run `npx goalbuddy board docs/goals/<slug>` and open the printed local URL in the AI coding agent's in-app browser (the Codex in-app Browser, the Claude Code preview, or the user's regular browser). The default local hub is `http://goalbuddy.localhost:41737/`, and board URLs normally look like `http://goalbuddy.localhost:41737/<slug>/`. In short: start the local board before filling the task list so the board pops up right away and cards populate live as `state.yaml` changes. Include the printed board URL in the final prep response as an actual clickable Markdown link, for example `[Open GoalBuddy board](http://goalbuddy.localhost:41737/<slug>/)`. Do not put the board URL only in a code block, quote, HTML comment, or prose that the UI cannot click.
89
89
 
90
90
  If the user chooses GitHub Projects, ask for approval and the required project target before any live write. Create or sync the GitHub Project at the same early point as the local board: after the goal root and skeleton `state.yaml` exist, before the detailed task list is finished, then sync again as tasks populate. Run a dry-run sync first when possible. Missing GitHub credentials or project details should not block local board creation or goal prep; record the missing requirement in `visual_board.github_projects` and seed a PM setup task.
91
91
 
@@ -203,15 +203,31 @@ Planning, Scout findings, Judge decisions, and a queued Worker task are not term
203
203
  For execution goals, the default run is continuous:
204
204
 
205
205
  ```text
206
- Discover enough evidence, choose a safe implementation slice, implement it, verify it, audit it, then immediately choose and execute the next safe slice until the full original outcome is complete.
206
+ Discover enough evidence, choose the largest reversible local work package, implement it, verify it, review only at risk or phase boundaries, then immediately choose and execute the next work package until the full original outcome is complete.
207
207
  ```
208
208
 
209
209
  If the first `/goal` run reaches a Judge decision that names a safe Worker task with `allowed_files`, `verify`, and `stop_if`, the PM should activate that Worker and continue in the same run unless a stop condition applies.
210
210
 
211
- After a verified Worker slice and audit, do not mark the thread goal complete merely because that slice passed. A slice audit is a checkpoint. For broad automation or product goals, continue by reopening or advancing the board to the next safe Worker task until the full owner outcome is complete.
211
+ After a verified Worker package, do not mark the thread goal complete merely because that package passed. For broad automation or product goals, continue by reopening or advancing the board to the next safe Worker package until the full owner outcome is complete.
212
212
 
213
213
  Missing owner input, credentials, production access, destructive-operation permission, or policy decisions are blockers for specific tasks, not stopping conditions for the whole goal. When a slice hits one of those blockers, mark that exact task blocked with a receipt, create a safe follow-up or workaround task, and keep doing local, non-destructive work that advances the full outcome.
214
214
 
215
+ ## Slice Sizing Policy
216
+
217
+ A good task is the largest safe useful slice.
218
+
219
+ Small is not the goal. Useful is the goal.
220
+
221
+ Safe does not mean small. Safe means bounded, explicit, verified, and reversible.
222
+
223
+ A good Worker task usually produces a working screen, a working API path, a working data pipeline step, a working backend vertical slice, a real bug fix, or a milestone review. A bad Worker task is one more tiny helper, projection function, contract file, read-only proof, or doc note unless that tiny task is truly blocking progress.
224
+
225
+ Judge picks the largest safe useful next slice. Worker completes the whole assigned slice. Judge reviews the whole slice.
226
+
227
+ After two tiny tasks in a row, PM or Judge should reorient the board. If a demo milestone is complete, the next task should move toward the next real milestone.
228
+
229
+ Tiny tasks are allowed when the failure is isolated, the risk is high, the scope is unknown, or the tiny task unlocks a larger slice. Tiny tasks are bad when they keep happening, do not change behavior, only add wrappers/contracts/proof files, or avoid the real milestone.
230
+
215
231
  ## When To Use
216
232
 
217
233
  Use this skill for goals that are broad, multi-hour, ambiguous, high-risk, already planned, already stale, already red, or likely to need Scout/Judge/Worker delegation.
@@ -267,7 +283,7 @@ What counts as enough for the current tranche?
267
283
  Avoid forever goals. A broad goal should define an execution tranche, for example:
268
284
 
269
285
  ```text
270
- Discover the highest-leverage local improvements, complete successive safe verified implementation slices, audit each slice against the original user outcome, and keep advancing until the full outcome is complete.
286
+ Discover the highest-leverage local improvements, complete successive safe verified work packages, review only at risk or phase boundaries, and keep advancing until the full outcome is complete.
271
287
  ```
272
288
 
273
289
  ## Board
@@ -390,8 +406,9 @@ Judge receipt:
390
406
  ```yaml
391
407
  receipt:
392
408
  result: done
393
- decision: "Do router coverage first; defer auth flake because it is not reproducible locally."
394
- next_allowed_task: T004
409
+ decision: "approved"
410
+ full_outcome_complete: false
411
+ rationale: "Router coverage is verified; continue with the next PM-selected work package."
395
412
  blocked_tasks:
396
413
  - T005
397
414
  ```
@@ -440,7 +457,7 @@ Blocked tasks do not necessarily block the goal. The PM should keep doing safe l
440
457
 
441
458
  - create a Scout task to improve evidence;
442
459
  - create a Judge task to resolve ambiguity;
443
- - create a Worker task for a smaller safe slice;
460
+ - create a Worker task for the largest reversible local work package that can proceed;
444
461
  - write or update a note for handoff;
445
462
  - update receipts and verification freshness.
446
463
 
@@ -471,9 +488,11 @@ After a task completes, immediately write its receipt and select the next active
471
488
 
472
489
  - a final audit proves the full original owner outcome is complete.
473
490
 
474
- Do not stop at "ready for implementation" when a safe Worker task exists. Activate the Worker, execute it, verify it, and then run the audit task.
491
+ Do not stop at "ready for implementation" when a safe Worker task exists. Activate the Worker, execute it, verify it, and keep going.
492
+
493
+ Do not stop after one verified work package when the broader owner outcome still has safe local follow-up work. Advance the board to the next work package unless a risk boundary or final audit is due.
475
494
 
476
- Do not stop after one verified implementation slice when the broader owner outcome still has safe local follow-up slices. Treat a slice audit as permission to advance the board, not as permission to finish, unless the audit explicitly proves the full original outcome is complete.
495
+ Do not create a Judge task after every Worker by default. Use Judge only for phase boundaries, high-risk changes, unclear scope, rejected verification, or final completion. Repeated same-shape work belongs in one Worker package.
477
496
 
478
497
  Do not stop because the current slice needs owner input, credentials, production access, destructive operations, or policy decisions. Mark that slice blocked, spawn or activate the smallest safe local task that can proceed around the blocker, and continue.
479
498
 
@@ -506,9 +525,9 @@ Non-`installed` states are warnings, not false failures, because the main `/goal
506
525
 
507
526
  | Agent | Thinking level | Write access | Use for |
508
527
  |---|---:|---:|---|
509
- | Scout | medium | no | source/spec/repo evidence mapping |
510
- | Worker | low | yes, bounded | one exact implementation or recovery task |
511
- | Judge | high | no | strategic review, ambiguity, scope, completion skepticism |
528
+ | Scout | low | no | targeted source/spec/repo evidence mapping |
529
+ | Worker | medium | yes, bounded | one coherent bounded useful slice |
530
+ | Judge | high | no | phase/risk/final review, ambiguity, scope, completion skepticism |
512
531
 
513
532
  A task's `assignee` determines the agent. The task card is the order. The receipt is the return format.
514
533
 
@@ -538,6 +557,14 @@ reasoning_hint: default # default | low | medium | high | xhigh
538
557
 
539
558
  Treat `reasoning_hint` as PM guidance. It does not override task scope, write permissions, stop conditions, or the one-active-task rule.
540
559
 
560
+ ## Execution Quality Commands
561
+
562
+ Use `goalbuddy prompt docs/goals/<slug>` to render a compact prompt for the active task. The prompt includes only task-specific material, safe agent metadata, continuation warnings, and the expected receipt shape. It should not include broad chat history or dump the whole state file.
563
+
564
+ When dispatching Codex subagents from a GoalBuddy prompt, the `required_spawn_agent_type` is mandatory. Use that exact `spawn_agent` `agent_type` (`goal_scout`, `goal_worker`, or `goal_judge`). Do not substitute generic `scout`, `worker`, or `judge` agents; if the required GoalBuddy agent is unavailable, stop spawning and continue as PM fallback or run `npx goalbuddy agents`/`npx goalbuddy install`. After one `wait_agent` timeout with no visible allowed-file changes, stop waiting, record the timeout, and recover deterministically instead of waiting forever.
565
+
566
+ Use `goalbuddy parallel-plan docs/goals/<slug>` when the user explicitly asks for parallel agent work. It is read-only: it recommends safe Scout/Judge handoffs and Worker handoffs only when write scopes are known and disjoint. It does not mutate `state.yaml`, create sub-goals, apply receipts, or spawn agents.
567
+
541
568
  ## Completion
542
569
 
543
570
  Never complete because work looks substantial.
@@ -546,7 +573,7 @@ Completion is a Judge or PM audit task. The goal is done only when a final done
546
573
 
547
574
  For execution goals, completion also requires implementation evidence. A final audit cannot call the goal done if the only completed work is planning, discovery, or task selection.
548
575
 
549
- For continuous execution goals, the final audit receipt must include `full_outcome_complete: true`. If the receipt only proves that the current slice or tranche is complete, keep the goal active and queue or activate the next safe Worker/Judge/PM task.
576
+ For continuous execution goals, the final audit receipt must include `full_outcome_complete: true`. If the receipt only proves that the current work package or tranche is complete, keep the goal active and queue or activate the next safe Worker/PM task. Add a Judge only when the next decision is a phase, risk, ambiguity, rejected verification, or final completion review.
550
577
 
551
578
  Queued or active Worker tasks block `goal.status: done`. If a Worker is no longer required, mark it blocked with a receipt explaining why, remove it during PM board maintenance, or replace it with the actual required Worker task before completion.
552
579
 
@@ -13,7 +13,7 @@ This directory contains skill metadata and bundled agent definitions for Codex a
13
13
  | Agent | Codex file | Claude Code file | Reasoning effort | Write scope |
14
14
  |---|---|---|---:|---|
15
15
  | Scout | `goal_scout.toml` | `goal-scout.md` | medium | read-only |
16
- | Worker | `goal_worker.toml` | `goal-worker.md` | low | workspace-write |
16
+ | Worker | `goal_worker.toml` | `goal-worker.md` | medium | workspace-write |
17
17
  | Judge | `goal_judge.toml` | `goal-judge.md` | high | read-only |
18
18
 
19
19
  ## Recommended Codex Config
@@ -1,5 +1,5 @@
1
1
  name = "goal_judge"
2
- description = "High-thinking strategic reviewer for GoalBuddy escalation: ambiguity, risky scope, source/product conflicts, safety/API/live decisions, and tranche completion."
2
+ description = "GoalBuddy Judge. Skeptical read-only gate for ambiguity, risky scope, phase transitions, completion, and parallel-safety decisions."
3
3
  model_reasoning_effort = "high"
4
4
  sandbox_mode = "read-only"
5
5
  nickname_candidates = ["Judge", "Reviewer", "Architect"]
@@ -7,23 +7,39 @@ nickname_candidates = ["Judge", "Reviewer", "Architect"]
7
7
  developer_instructions = """
8
8
  You are Judge for GoalBuddy.
9
9
 
10
- Thinking level: high.
11
- Mode: strategic reviewer and escalation authority.
10
+ Use Judge only for decisions that require judgment: contradictory sources, risky scope, dependency order, phase gates, live/API/security/persistence choices, completion, or whether work can safely branch into a depth-1 sub-goal. Routine checks belong to the checker.
12
11
 
13
- Think as a skeptical staff engineer and project-management systems designer. You decide and constrain; you do not broadly implement.
12
+ Hard contract:
13
+ - Read only. Do not edit, stage, install, or implement.
14
+ - Read state receipts before raw files. Then read only the inputs named in the Judge task.
15
+ - Be skeptical of progress. Lots of files, docs, or tests are not completion.
16
+ - A safe Worker package must include objective, allowed_files, verify commands, and stop_if, and should cover the largest reversible local work package at that boundary.
17
+ - Choose the largest safe useful slice: bounded, explicit, verified, reversible, and outcome-moving. Safety does not mean tiny.
18
+ - Judge a whole useful slice, not one helper at a time.
19
+ - Detect micro-slice loops. Reject another tiny helper when the board has enough scaffolding for a vertical slice.
20
+ - Select PM reorientation when recent receipts are mostly docs, contracts, wrappers, projections, or helpers with no user-visible or executable behavior change.
21
+ - Prefer milestone reviews over helper reviews.
22
+ - A safe child board must be depth 1, inside subgoals/, non-recursive, and linked from exactly one parent task.
23
+ - Parallel Worker work is safe only with provably disjoint allowed_files. Separate boards alone are not proof.
24
+ - Reject completion unless the full original outcome is mapped to receipts and current verification.
25
+ - Do not generate routine next tasks, choose the active task, or mutate state. The PM owns continuation after your review.
14
26
 
15
- Use when source, tests, product behavior, API/live strategy, dirty scope, giant-file risk, safety/auth/money/persistence semantics, task priority, or completion readiness is ambiguous.
27
+ Return exactly one parseable JSON receipt object:
16
28
 
17
- Do not approve based on lots of docs or lots of tests. Require coherent receipts and current verification.
18
-
19
- Return a compact Judge receipt for the PM to paste into state.yaml:
20
- - result
21
- - decision
22
- - evidence
23
- - next_allowed_task when work may continue
24
- - blocked_tasks when work should not proceed
25
- - completion decision when auditing a tranche
26
- - required board updates
27
-
28
- Do not broadly implement, select the active task, or mark the goal complete yourself.
29
+ {
30
+ "goalbuddy_receipt_v1": {
31
+ "result": "done | blocked",
32
+ "task_id": "<T###>",
33
+ "board_path": "<path to state.yaml>",
34
+ "decision": "approved | rejected | approve_subgoal | reject_subgoal | not_complete | complete",
35
+ "full_outcome_complete": false,
36
+ "rationale": "<=120 words>",
37
+ "evidence": [],
38
+ "subgoal_contract": null,
39
+ "parallel_safety": null,
40
+ "blocked_tasks": [],
41
+ "missing_evidence": [],
42
+ "required_board_updates": []
43
+ }
44
+ }
29
45
  """
@@ -1,26 +1,46 @@
1
1
  name = "goal_scout"
2
- description = "Read-only evidence mapper for one GoalBuddy task. Finds repo/source/spec evidence, verification commands, ambiguities, and candidate next tasks."
3
- model_reasoning_effort = "medium"
2
+ description = "GoalBuddy Scout. Read-only mapper for one active task. Produces a compact evidence receipt, not a plan, implementation, or next active task."
3
+ model_reasoning_effort = "low"
4
4
  sandbox_mode = "read-only"
5
5
  nickname_candidates = ["Scout", "Mapper", "Tracer"]
6
6
 
7
7
  developer_instructions = """
8
8
  You are Scout for GoalBuddy.
9
9
 
10
- Thinking level: medium.
11
- Mode: read-only evidence mapping.
10
+ Default effort: low. Use deeper analysis only when the task explicitly asks for conflict synthesis, full-doc reading, or architecture discovery.
12
11
 
13
- You are read-only. Do not edit files, stage files, run destructive commands, or claim implementation is complete.
12
+ Hard contract:
13
+ - Read only. Do not edit, stage, install, start long-running services, or spawn agents.
14
+ - Work only on the active Scout task the PM gives you.
15
+ - Prefer targeted inspection over broad dumps. Do not paste full files or long command output.
16
+ - Read receipts and named inputs first. Only expand to extra files when needed to answer the task.
17
+ - Return evidence, contradictions, and candidate facts. Do not choose the next active task and do not mark completion.
14
18
 
15
- Given one active Scout task, map repo/source/spec evidence, verification commands, health signals, improvement candidates, target files, tests, and unresolved ambiguity.
19
+ Parallel safety:
20
+ - Scout may run in parallel with other Scouts because it is read-only.
21
+ - If asked to work on a child board, inspect only that child board plus explicitly linked parent context.
22
+ - Never mutate parent or child state.
16
23
 
17
- Return a compact Scout receipt for the PM to paste into state.yaml:
18
- - result
19
- - summary
20
- - evidence paths
21
- - note path if findings are too large for the task card
22
- - spawned_tasks when useful
23
- - ambiguity requiring Judge
24
+ Budget:
25
+ - Max 12 shell commands unless the task explicitly allows more.
26
+ - Max 12 evidence items.
27
+ - Summary max 120 words.
28
+ - If findings are long, request a note file path from the PM instead of dumping content.
24
29
 
25
- Do not select the active task or mark the goal complete.
30
+ Return exactly one parseable JSON receipt object:
31
+
32
+ {
33
+ "goalbuddy_receipt_v1": {
34
+ "result": "done | blocked",
35
+ "task_id": "<T###>",
36
+ "board_path": "<path to state.yaml>",
37
+ "summary": "<=120 words>",
38
+ "evidence": [],
39
+ "facts": [],
40
+ "contradictions": [],
41
+ "ambiguity_requiring_judge": [],
42
+ "commands": [],
43
+ "note_needed": false
44
+ }
45
+ }
26
46
  """
@@ -1,28 +1,48 @@
1
1
  name = "goal_worker"
2
- description = "Low-thinking bounded implementer for exactly one GoalBuddy Worker task with allowed files, verification commands, and stop conditions."
3
- model_reasoning_effort = "low"
2
+ description = "GoalBuddy Worker. Bounded writer for one coherent reversible Worker work package. Edits only allowed_files, runs verify, returns receipt."
3
+ model_reasoning_effort = "medium"
4
4
  sandbox_mode = "workspace-write"
5
5
  nickname_candidates = ["Worker", "Patch", "Fixer"]
6
6
 
7
7
  developer_instructions = """
8
8
  You are Worker for GoalBuddy.
9
9
 
10
- Thinking level: low.
11
- Mode: one bounded writer.
10
+ Default effort: medium for implementation tasks. Use low only for tiny repair tasks or when the board explicitly sets reasoning_hint low.
12
11
 
13
- Execute exactly one active Worker task. Do not broaden scope.
12
+ Hard contract:
13
+ - Execute exactly one Worker task on exactly one board.
14
+ - Before editing, identify board_path, task_id, allowed_files, verify, and stop_if from the task. If any are missing, stop.
15
+ - Edit only files matching allowed_files. Do not edit GoalBuddy control files unless explicitly listed.
16
+ - Do not decide product strategy, architecture direction, live/API/deployment policy, or completion readiness.
17
+ - Do not spawn agents.
18
+ - Do not create child sub-goals unless the task explicitly allows it.
19
+ - Run the verify commands exactly as listed after edits. You may make at most two fix attempts.
20
+ - Stop immediately if required evidence is missing, a file outside allowed_files is needed, source/product/tests conflict, or verification still fails after two attempts.
21
+ - Do not request a Judge just because the package is done. The PM decides whether this is a phase, risk, ambiguity, rejected-verification, or final-completion boundary.
22
+ - Keep the diff coherent, bounded, and reversible. Do not shrink the assigned work below the largest safe useful slice.
23
+ - Complete the whole assigned slice. Do not stop after the first subcomponent if remaining subcomponents are inside allowed_files and verification is still feasible.
24
+ - If the task asks for a vertical slice, complete the vertical slice.
25
+ - Do not under-implement to avoid verification.
14
26
 
15
- You may edit only the task's allowed_files. You may update only explicitly named control files if the PM included them in scope. Do not decide product behavior, retained/excluded scope, API/live/deployment strategy, architecture direction, parity, or completion readiness.
27
+ Parallel safety:
28
+ - Do not assume parallel Worker safety.
29
+ - If another active Worker may touch the same files, stop and report a blocker.
30
+ - Work on a child board only when the task board_path points to that child state.yaml.
31
+ - Never mutate the parent board from a child Worker unless the parent board file is explicitly in allowed_files.
16
32
 
17
- Stop immediately if required evidence is missing, files outside scope are needed, source/tests/product conflict, verification fails twice, or the diff exceeds the task budget.
33
+ Return exactly one parseable JSON receipt object:
18
34
 
19
- Return a compact Worker receipt for the PM to paste into state.yaml:
20
- - result
21
- - changed_files
22
- - commands run with pass/fail
23
- - summary
24
- - remaining_blockers
25
- - needs_judge when strategy or ambiguity remains
26
-
27
- Do not select the next active task or mark the goal complete.
35
+ {
36
+ "goalbuddy_receipt_v1": {
37
+ "result": "done | blocked",
38
+ "task_id": "<T###>",
39
+ "board_path": "<path to state.yaml>",
40
+ "changed_files": [],
41
+ "commands": [],
42
+ "summary": "<=120 words>",
43
+ "remaining_blockers": [],
44
+ "verification_attempts": 1,
45
+ "stopped_because": null
46
+ }
47
+ }
28
48
  """
@@ -2,13 +2,14 @@
2
2
 
3
3
  Generate a small local GoalBuddy board for a goal directory and watch it update live while agents work.
4
4
 
5
- The extension keeps `state.yaml` authoritative. It writes static web app files into the goal directory and serves them from a local-only Node server. The browser subscribes to Server-Sent Events, so cards update as `state.yaml` or `notes/` changes without a manual reload.
5
+ The extension keeps `state.yaml` authoritative. It writes static web app files into the goal directory and serves them from a local-only Node server. The browser subscribes to Server-Sent Events, so cards update as `state.yaml`, `notes/`, or linked depth-1 sub-goal state changes without a manual reload.
6
6
 
7
7
  ## Use When
8
8
 
9
9
  - A human wants a local board view during a GoalBuddy run.
10
10
  - The team wants GitHub-Projects-like visibility without GitHub credentials.
11
11
  - A goal should expose in-progress, completed, and blocked cards from local files.
12
+ - A parent task should show a depth-1 child board without replacing the parent board.
12
13
 
13
14
  ## Generate And Serve
14
15
 
@@ -28,7 +29,7 @@ docs/goals/<slug>/.goalbuddy-board/
28
29
  app.js
29
30
  ```
30
31
 
31
- Then it starts a server on `127.0.0.1` and prints the local URL.
32
+ Then it starts or reuses the shared local board hub at `http://goalbuddy.localhost:41737/`. The server still binds to loopback, so no `/etc/hosts` setup is required. The printed board URL includes the goal slug, like `http://goalbuddy.localhost:41737/my-goal/`. When multiple goal boards are active, each board shows a switcher in the header so you can move between parent boards, child boards, and parallel runs without leaving the board view.
32
33
 
33
34
  ## Check Without A Long-Running Server
34
35
 
@@ -45,6 +46,8 @@ The server watches:
45
46
 
46
47
  - `docs/goals/<slug>/state.yaml`
47
48
  - `docs/goals/<slug>/notes/`
49
+ - linked `docs/goals/<slug>/subgoals/**/state.yaml`
50
+ - linked `docs/goals/<slug>/subgoals/**/notes/`
48
51
 
49
52
  When either changes, the server re-reads the goal board and pushes a fresh board payload to connected browsers over `/events`.
50
53
 
@@ -55,7 +58,7 @@ When either changes, the server re-reads the goal board and pushes a fresh board
55
58
  - `blocked` tasks appear under **Blocked**.
56
59
  - `done` tasks appear under **Completed**, the right-most column.
57
60
 
58
- Clicking a card opens a detail modal with the task objective, status, assignee, inputs, constraints, expected output, verify commands, allowed files, stop conditions, and receipt details. If a receipt points to a note, the modal includes that note content as plain text.
61
+ Clicking a card opens a detail modal with the task objective, status, assignee, inputs, constraints, expected output, verify commands, allowed files, stop conditions, and receipt details. If the task links a sub-goal, the modal includes a read-only child board. If a receipt points to a note, the modal includes that note content as plain text.
59
62
 
60
63
  ## Verification
61
64
 
@@ -70,6 +73,7 @@ node extend/local-goal-board/scripts/local-goal-board.mjs \
70
73
  ## Boundaries
71
74
 
72
75
  - `state.yaml` remains the source of truth.
73
- - The server binds to `127.0.0.1` by default.
76
+ - The server binds to `127.0.0.1:41737` by default, advertises `http://goalbuddy.localhost:41737/`, and reuses that URL as a multi-board hub with in-board header navigation.
77
+ - Sub-goals are file-rendered depth-1 child boards; the UI does not create, mutate, or recurse sub-goals.
74
78
  - The generated UI renders file content as text, not raw HTML.
75
79
  - No package dependencies are required.
@@ -0,0 +1,3 @@
1
+ # Subgoal Parent Board
2
+
3
+ Fixture for rendering a parent task with a linked depth-1 child board.
@@ -0,0 +1,60 @@
1
+ version: 2
2
+
3
+ goal:
4
+ title: "Subgoal Parent Board"
5
+ slug: "subgoal-parent-board"
6
+ kind: specific
7
+ tranche: "Render a parent task with an embedded child board."
8
+ status: active
9
+
10
+ agents:
11
+ scout: installed
12
+ worker: installed
13
+ judge: installed
14
+
15
+ active_task: T004
16
+
17
+ tasks:
18
+ - id: T001
19
+ type: scout
20
+ assignee: Scout
21
+ status: done
22
+ objective: "Map the sub-goal display requirements."
23
+ receipt:
24
+ result: done
25
+ summary: "Confirmed the child board should render only after opening the parent task."
26
+ evidence:
27
+ - docs/superpowers/specs/2026-05-11-goalbuddy-subgoals-design.md
28
+ - id: T004
29
+ type: worker
30
+ assignee: Worker
31
+ status: active
32
+ objective: "Build the sub-goal board view."
33
+ allowed_files:
34
+ - goalbuddy/extend/local-goal-board/scripts/lib/goal-board.mjs
35
+ - goalbuddy/extend/local-goal-board/test/local-goal-board.test.mjs
36
+ verify:
37
+ - node --test goalbuddy/extend/local-goal-board/test/local-goal-board.test.mjs
38
+ stop_if:
39
+ - "Need files outside allowed_files."
40
+ subgoal:
41
+ status: active
42
+ path: subgoals/T004-board-view/state.yaml
43
+ owner: Worker
44
+ created_from: T004
45
+ depth: 1
46
+ rollup_receipt: null
47
+ receipt: null
48
+ - id: T999
49
+ type: judge
50
+ assignee: Judge
51
+ status: queued
52
+ objective: "Audit the sub-goal rendering behavior."
53
+ receipt: null
54
+
55
+ checks:
56
+ dirty_fingerprint: unknown
57
+ last_verification:
58
+ result: unknown
59
+ task: null
60
+ commands: []
@@ -0,0 +1,3 @@
1
+ # T004 Board View Subgoal
2
+
3
+ Fixture child board linked from the parent board.
@@ -0,0 +1,52 @@
1
+ version: 2
2
+
3
+ goal:
4
+ title: "T004 Board View Subgoal"
5
+ slug: "t004-board-view-subgoal"
6
+ kind: specific
7
+ tranche: "Render the child board inside the parent task detail."
8
+ status: active
9
+
10
+ agents:
11
+ scout: installed
12
+ worker: installed
13
+ judge: installed
14
+
15
+ active_task: T002
16
+
17
+ tasks:
18
+ - id: T001
19
+ type: scout
20
+ assignee: Scout
21
+ status: done
22
+ objective: "Map the child board data needed by the modal."
23
+ receipt:
24
+ result: done
25
+ summary: "Child board payload needs normal columns and task details."
26
+ evidence:
27
+ - goalbuddy/extend/local-goal-board/scripts/lib/goal-board.mjs
28
+ - id: T002
29
+ type: worker
30
+ assignee: Worker
31
+ status: active
32
+ objective: "Render the read-only embedded child board."
33
+ allowed_files:
34
+ - goalbuddy/extend/local-goal-board/scripts/lib/goal-board.mjs
35
+ verify:
36
+ - node --test goalbuddy/extend/local-goal-board/test/local-goal-board.test.mjs
37
+ stop_if:
38
+ - "Need files outside allowed_files."
39
+ receipt: null
40
+ - id: T003
41
+ type: judge
42
+ assignee: Judge
43
+ status: queued
44
+ objective: "Audit the embedded child board rendering."
45
+ receipt: null
46
+
47
+ checks:
48
+ dirty_fingerprint: unknown
49
+ last_verification:
50
+ result: unknown
51
+ task: null
52
+ commands: []
@@ -1,14 +1,15 @@
1
1
  id: local-goal-board
2
2
  name: Local Goal Board
3
3
  kind: visualization
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  source_of_truth: local
6
- description: Generate and serve a minimal GoalBuddy-branded local Kanban board that updates live from a goal directory's state.yaml and notes.
7
- local_use_prompt: Run the bundled local board script for docs/goals/<slug>. It writes a tiny web app into docs/goals/<slug>/.goalbuddy-board and serves it on 127.0.0.1 with live SSE updates from state.yaml and notes. Use --once --json for generation checks and no long-running server.
6
+ description: Generate and serve a GoalBuddy-branded local Kanban board that updates live from a goal directory's state.yaml, notes, and linked depth-1 sub-goals.
7
+ local_use_prompt: Run the bundled local board script for docs/goals/<slug>. It writes a tiny web app into docs/goals/<slug>/.goalbuddy-board and serves it through the shared goalbuddy.localhost:41737 local board hub with live SSE updates from state.yaml, notes, and linked depth-1 sub-goals. Multiple active boards are available from the board header switcher. Use --once --json for generation checks and no long-running server.
8
8
  use_when:
9
9
  - A human wants to watch a GoalBuddy run in a local board UI.
10
10
  - The goal needs GitHub-Projects-like visibility without GitHub credentials.
11
11
  - state.yaml and notes should remain the source of truth while the browser updates live.
12
+ - A parent task links a depth-1 child board under subgoals/.
12
13
  activation: user_requested
13
14
  outputs:
14
15
  - Local GoalBuddy board web app
@@ -18,10 +19,11 @@ safe_by_default: true
18
19
  reads:
19
20
  - docs/goals/<slug>/state.yaml
20
21
  - docs/goals/<slug>/notes
22
+ - docs/goals/<slug>/subgoals
21
23
  writes:
22
24
  - docs/goals/<slug>/.goalbuddy-board
23
25
  side_effects:
24
- - Starts a local-only HTTP server when not run with --once.
26
+ - Starts or reuses the shared local-only HTTP board hub when not run with --once.
25
27
  agent_instructions:
26
28
  - Use the bundled local-goal-board script; do not build a static-only mockup.
27
29
  - Keep state.yaml authoritative; the app is only a viewer.