goalbuddy 0.3.6 → 0.3.8
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.
- package/CHANGELOG.md +61 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +27 -10
- package/{RELEASE-0.3.5.md → docs/releases/0.3.5.md} +4 -4
- package/docs/releases/0.3.7.md +129 -0
- package/docs/releases/0.3.8.md +40 -0
- package/docs/releases/README.md +83 -0
- package/goalbuddy/SKILL.md +21 -10
- package/goalbuddy/scripts/check-goal-state.mjs +53 -0
- package/goalbuddy/scripts/render-task-prompt.mjs +39 -4
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/README.md +7 -9
- package/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/state.yaml +5 -5
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/examples/subgoal-parent/state.yaml +3 -3
- package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/state.yaml +3 -3
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/scripts/lib/goal-board.mjs +17 -13
- package/goalbuddy/{extend → surfaces}/local-goal-board/scripts/local-goal-board.mjs +27 -6
- package/{plugins/goalbuddy/skills/goalbuddy/extend → goalbuddy/surfaces}/local-goal-board/test/local-goal-board.test.mjs +63 -12
- package/goalbuddy/templates/goal.md +9 -0
- package/goalbuddy/templates/state.yaml +7 -6
- package/internal/assets/goalbuddy-v0.3.7-release.png +0 -0
- package/internal/cli/goal-maker.mjs +177 -717
- package/package.json +7 -8
- package/plugins/goalbuddy/.claude-plugin/plugin.json +3 -4
- package/plugins/goalbuddy/.codex-plugin/plugin.json +5 -6
- package/plugins/goalbuddy/README.md +4 -3
- package/plugins/goalbuddy/skills/goalbuddy/SKILL.md +21 -10
- package/plugins/goalbuddy/skills/goalbuddy/scripts/check-goal-state.mjs +53 -0
- package/plugins/goalbuddy/skills/goalbuddy/scripts/render-task-prompt.mjs +39 -4
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/README.md +7 -9
- package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/state.yaml +5 -5
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/examples/subgoal-parent/state.yaml +3 -3
- package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/state.yaml +3 -3
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/scripts/lib/goal-board.mjs +2 -2
- package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/scripts/local-goal-board.mjs +27 -6
- package/{goalbuddy/extend → plugins/goalbuddy/skills/goalbuddy/surfaces}/local-goal-board/test/local-goal-board.test.mjs +35 -8
- package/plugins/goalbuddy/skills/goalbuddy/templates/goal.md +9 -0
- package/plugins/goalbuddy/skills/goalbuddy/templates/state.yaml +7 -6
- package/examples/extend-catalog-workflow/goal.md +0 -53
- package/examples/extend-catalog-workflow/notes/T001-extension-model-map.md +0 -47
- package/examples/extend-catalog-workflow/notes/T002-architecture-decision.md +0 -48
- package/examples/extend-catalog-workflow/notes/T003-implementation-summary.md +0 -43
- package/examples/extend-catalog-workflow/notes/T004-root-extend-folder.md +0 -24
- package/examples/extend-catalog-workflow/notes/T005-layout-cleanup.md +0 -46
- package/examples/extend-catalog-workflow/notes/T006-catalog-location.md +0 -50
- package/examples/extend-catalog-workflow/notes/T999-completion-audit.md +0 -36
- package/examples/extend-catalog-workflow/state.yaml +0 -327
- package/examples/github-pr-workflow-extension/pr-handoff.md +0 -46
- package/examples/improve-goal-maker/goal.md +0 -51
- package/examples/improve-goal-maker/notes/T001-repo-map.md +0 -59
- package/examples/improve-goal-maker/notes/T002-risk-map.md +0 -37
- package/examples/improve-goal-maker/state.yaml +0 -224
- package/goalbuddy/extend/github-projects/README.md +0 -105
- package/goalbuddy/extend/github-projects/examples/goal-board-sync/state.yaml +0 -63
- package/goalbuddy/extend/github-projects/extension.yaml +0 -43
- package/goalbuddy/extend/github-projects/scripts/lib/github-projects.mjs +0 -728
- package/goalbuddy/extend/github-projects/scripts/lib/goal-state.mjs +0 -362
- package/goalbuddy/extend/github-projects/scripts/sync-github-project.mjs +0 -193
- package/goalbuddy/extend/github-projects/test/github-projects.test.mjs +0 -267
- package/goalbuddy/extend/local-goal-board/extension.yaml +0 -39
- package/internal/assets/extend-release.png +0 -0
- package/internal/assets/extend-release.svg +0 -83
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/README.md +0 -105
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/examples/goal-board-sync/state.yaml +0 -63
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/extension.yaml +0 -43
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/scripts/lib/github-projects.mjs +0 -728
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/scripts/lib/goal-state.mjs +0 -362
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/scripts/sync-github-project.mjs +0 -193
- package/plugins/goalbuddy/skills/goalbuddy/extend/github-projects/test/github-projects.test.mjs +0 -267
- package/plugins/goalbuddy/skills/goalbuddy/extend/local-goal-board/extension.yaml +0 -39
- /package/goalbuddy/{extend → surfaces}/local-goal-board/assets/goalbuddy-mark.png +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/notes/T001-scout.md +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/goal.md +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/notes/.gitkeep +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/goal.md +0 -0
- /package/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/notes/.gitkeep +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/assets/goalbuddy-mark.png +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/sample-goal/notes/T001-scout.md +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/goal.md +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/notes/.gitkeep +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/goal.md +0 -0
- /package/plugins/goalbuddy/skills/goalbuddy/{extend → surfaces}/local-goal-board/examples/subgoal-parent/subgoals/T004-board-view/notes/.gitkeep +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.8 — Board Hub Guardrails (2026-05-29)
|
|
4
|
+
|
|
5
|
+
- **Clarified multi-board hub recovery.** Unregistered board URLs now explain that a `/slug/` 404 does not mean the `41737` process is stale; agents should verify `/api/boards` and register the new goal on the same hub before stopping any process. Release checks now include the local board surface tests.
|
|
6
|
+
- **Prefer the largest safe useful slice.** GoalBuddy now teaches Judge to pick whole useful slices, Worker to complete the assigned slice, and PM to reorient boards when tasks are safe-looking but outcome-light. `goalbuddy prompt` and the state checker emit non-fatal micro-slicing warnings without breaking old boards.
|
|
7
|
+
- **Hardened Codex plugin-only installs.** Codex install/update now use the native plugin path, refresh the bundled Scout/Judge/Worker agents, and leave stale personal `~/.codex/skills/goalbuddy` / `goal-maker` folders out of the expected clean state.
|
|
8
|
+
- **Fixed Codex doctor for plugin-only installs.** `goalbuddy doctor --target codex --goal-ready` now validates the plugin cache, bundled `$goal-prep` skill, enabled plugin config, and GoalBuddy agents instead of failing only because standalone personal skill folders are absent. The report also distinguishes native OpenAI-gated Codex `/goal` from GoalBuddy `$goal-prep` and local boards.
|
|
9
|
+
- **Made mutating command help safe.** `goalbuddy plugin install --help` and `goalbuddy update --help` print help without installing, updating, or touching global Codex/Claude files.
|
|
10
|
+
|
|
11
|
+
## 0.3.5 — Subgoals, Parallel Agents, and Dark Mode (2026-05-12)
|
|
12
|
+
|
|
13
|
+
- **Subgoals for bounded branching work.** Parent tasks can link to depth-1 child `state.yaml` boards under `subgoals/`, the checker validates child shape and containment, and the local board renders the child board inside the parent task detail.
|
|
14
|
+
- **Parallel-agent-ready boards.** `goalbuddy parallel-plan` reports safe read-only Scout/Judge handoffs and Worker handoffs only when write scopes are known and disjoint. It does not mutate state or spawn agents.
|
|
15
|
+
- **Dark mode and a sharper live board.** The local board now has readable dark mode, global viewer settings, compact mode, completed-task collapse, a site-aligned header, GitHub stars, and active-card motion with reduced-motion handling.
|
|
16
|
+
- **Multi-board local hub navigation.** Multiple local boards share one readable `goalbuddy.localhost` hub with an in-header board selector, and parent boards stream updates when linked child subgoal state changes.
|
|
17
|
+
- **More durable execution plumbing.** Scout/Judge/Worker contracts are stricter, `goalbuddy prompt` emits compact task prompts, Worker write-scope checks fail closed for ambiguous overlap, and source/plugin tests cover the new branching and parallel-safety surfaces.
|
|
18
|
+
|
|
19
|
+
## 0.3.2 — Harden Codex plugin cache updates (2026-05-11)
|
|
20
|
+
|
|
21
|
+
- **Fixed Codex plugin updates when stale preserved-extension folders exist.** The updater now ignores non-version cache directories like `.goalbuddy-preserved-extend-*` while selecting the active plugin skill, so a leftover temporary folder cannot make `npx goalbuddy update` fail with `Unsupported version`.
|
|
22
|
+
- **Stopped leaving empty preserved-extension folders during plugin reinstalls.** The updater only creates the temporary preservation directory when there is a custom extension to copy.
|
|
23
|
+
|
|
24
|
+
## 0.3.1 — Fix duplicate /goal-prep slash entry (2026-05-11)
|
|
25
|
+
|
|
26
|
+
- **Fixed duplicate `/goal-prep` in the Claude Code slash menu.** Previous installs shipped both a `name: goal-prep` skill and a `commands/goal-prep.md` slash command, so Claude Code listed `/goal-prep` twice with different descriptions. The skill is now the single canonical surface for `/goal-prep`. Existing installs with `~/.claude/commands/goal-prep.md` are migrated automatically: `npx goalbuddy` (and `install` / `update`) removes the legacy file. `goalbuddy doctor --target claude` reports `legacy_command_present` and fails until the legacy file is gone.
|
|
27
|
+
|
|
28
|
+
## 0.3.0 — Claude Code and Codex targets
|
|
29
|
+
|
|
30
|
+
GoalBuddy now installs into both **Codex** and **Claude Code** with a single `npx goalbuddy` run. The shared skill payload and `/goal` workflow are unchanged — this release adds a Claude Code target alongside the existing Codex one and reframes the project as "a /goal operating system for Codex and Claude Code."
|
|
31
|
+
|
|
32
|
+
### Highlights
|
|
33
|
+
|
|
34
|
+
- **One command installs both targets.** `npx goalbuddy` installs and enables the native Codex plugin in `~/.codex/`, then installs the GoalBuddy skill, three Scout/Judge/Worker subagents, and the `/goal-prep` slash command into `~/.claude/`.
|
|
35
|
+
- **Target-specific installs remain available.** Use `npx goalbuddy --target codex` or `npx goalbuddy --target claude` when you only want one side.
|
|
36
|
+
- **Claude Code plugin scaffold** at `plugins/goalbuddy/.claude-plugin/plugin.json` with markdown subagents (`agents/goal-scout.md`, `agents/goal-judge.md`, `agents/goal-worker.md`) and a `/goal-prep` command (`commands/goal-prep.md`).
|
|
37
|
+
- **`$goal-prep` (Codex) and `/goal-prep` (Claude Code)** are documented as sibling entry points throughout the skill, README, site, and CLI.
|
|
38
|
+
- **Reframed README, site, plugin docs, package.json, and SKILL.md** to position the workflow as "a /goal operating system for Codex and Claude Code."
|
|
39
|
+
- **CLI is target-aware.** New flags: `--target codex|claude`, `--claude-home <path>`. Existing `--codex-home` and `CODEX_HOME` continue to work unchanged.
|
|
40
|
+
- **Update supports both targets.** `goalbuddy update` refreshes the Codex plugin and Claude Code skill/agents/command together unless `--target` narrows it.
|
|
41
|
+
- **Doctor checks both targets.** Default is Codex; `goalbuddy doctor --target claude` runs the Claude Code skill/agent/command check.
|
|
42
|
+
|
|
43
|
+
### Compatibility
|
|
44
|
+
|
|
45
|
+
- `npx goalbuddy` with no flag now prepares Codex and Claude Code together. Existing Codex-only automation can keep using `--target codex` or `--codex-home`.
|
|
46
|
+
- `npx goal-maker` continues to work as a temporary alias and prints the new command.
|
|
47
|
+
- The shared `goalbuddy/SKILL.md` payload is unchanged in shape; the framing is now bilingual.
|
|
48
|
+
|
|
49
|
+
### Tests
|
|
50
|
+
|
|
51
|
+
- All 46 tests pass.
|
|
52
|
+
- Help-text and version-arithmetic tests updated for the bilingual usage and the 0.3.0 bump.
|
|
53
|
+
|
|
54
|
+
### Adding Or Updating Both
|
|
55
|
+
|
|
56
|
+
Install or refresh both supported agent environments:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx goalbuddy
|
|
60
|
+
npx goalbuddy update
|
|
61
|
+
```
|
package/CONTRIBUTING.md
CHANGED
|
@@ -39,11 +39,11 @@ Before opening a PR, verify the npm package contents:
|
|
|
39
39
|
npm pack --dry-run
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
The package should include `README.md`, `internal/assets/`, `package.json`, `internal/cli/`, the canonical `goalbuddy/` skill directory, and `plugins/goalbuddy/` (with both `.codex-plugin/` and `.claude-plugin/` manifests). The temporary `$goal-maker` compatibility skill is generated by the installer; do not add a second tracked skill payload.
|
|
42
|
+
The package should include `README.md`, `CHANGELOG.md`, `docs/releases/`, `internal/assets/`, `package.json`, `internal/cli/`, the canonical `goalbuddy/` skill directory, and `plugins/goalbuddy/` (with both `.codex-plugin/` and `.claude-plugin/` manifests). The temporary `$goal-maker` compatibility skill is generated by the installer; do not add a second tracked skill payload.
|
|
43
43
|
|
|
44
44
|
## Releases
|
|
45
45
|
|
|
46
|
-
GoalBuddy publishes from GitHub Actions with npm trusted publishing. See [
|
|
46
|
+
GoalBuddy publishes from GitHub Actions with npm trusted publishing. See [docs/releases](docs/releases/README.md) before creating a release.
|
|
47
47
|
|
|
48
48
|
## Contribution Guidelines
|
|
49
49
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<a href="https://goalbuddy.dev">
|
|
5
|
-
<img src="internal/assets/goalbuddy-
|
|
5
|
+
<img src="internal/assets/goalbuddy-readme-hero.png" alt="GoalBuddy local board and agent workflow." width="100%">
|
|
6
6
|
</a>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
<a href="https://goalbuddy.dev"><img alt="goalbuddy.dev" src="https://img.shields.io/badge/site-goalbuddy.dev-684cff?style=flat-square"></a>
|
|
17
17
|
</p>
|
|
18
18
|
|
|
19
|
-
GoalBuddy helps Codex and Claude Code stay oriented during long coding tasks
|
|
19
|
+
GoalBuddy helps Codex and Claude Code stay oriented during long coding tasks by giving native `/goal` a finish line, a live work surface, and a proof loop.
|
|
20
20
|
|
|
21
|
-
It gives `/goal` a small local workspace: a charter, a board, notes, receipts, and a clear next task. The work stays in your repo, so a run can pause, resume, verify, and keep going without re-inventing the plan every turn.
|
|
21
|
+
It gives `/goal` a small local workspace: a charter, a goal oracle, a board, notes, receipts, and a clear next task. The work stays in your repo, so a run can pause, resume, verify, and keep going without re-inventing the plan every turn.
|
|
22
22
|
|
|
23
23
|
## Start Here
|
|
24
24
|
|
|
@@ -63,6 +63,14 @@ To verify a Codex install:
|
|
|
63
63
|
npx goalbuddy doctor --target codex --goal-ready
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
+
To remove GoalBuddy-owned Codex runtime surfaces:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx goalbuddy reset --target codex
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Native `codex plugin remove goalbuddy@goalbuddy` only removes the native plugin surface. GoalBuddy also owns the `goal_*.toml` agent files it installed, its Codex plugin cache, its marketplace entry, and old personal skill folders from earlier installs. Use `goalbuddy reset --target codex` when you want those GoalBuddy-owned files removed too.
|
|
73
|
+
|
|
66
74
|
## What It Creates
|
|
67
75
|
|
|
68
76
|
```text
|
|
@@ -70,6 +78,7 @@ docs/goals/<your-goal>/
|
|
|
70
78
|
goal.md
|
|
71
79
|
state.yaml
|
|
72
80
|
notes/
|
|
81
|
+
.goalbuddy-board/ # generated local board files
|
|
73
82
|
subgoals/ # optional depth-1 child boards
|
|
74
83
|
```
|
|
75
84
|
|
|
@@ -84,16 +93,22 @@ docs/goals/<your-goal>/
|
|
|
84
93
|
## How It Thinks
|
|
85
94
|
|
|
86
95
|
```text
|
|
87
|
-
|
|
96
|
+
Intent -> Oracle -> Surface -> Loop -> Proof
|
|
88
97
|
```
|
|
89
98
|
|
|
99
|
+
The oracle is the observable signal that says whether the original owner outcome is actually true: a test suite, browser walkthrough, demo transcript, generated artifact, benchmark, source-backed answer, release check, or final human decision.
|
|
100
|
+
|
|
101
|
+
No oracle, no serious goal.
|
|
102
|
+
|
|
103
|
+
The local board is the default work surface. It is not an extension marketplace; it is the built-in view of the `state.yaml` truth.
|
|
104
|
+
|
|
90
105
|
Scout maps the repo.
|
|
91
106
|
|
|
92
107
|
Judge chooses the largest safe useful slice.
|
|
93
108
|
|
|
94
109
|
Worker completes the whole assigned slice and leaves a receipt.
|
|
95
110
|
|
|
96
|
-
`/goal` keeps the loop honest until the
|
|
111
|
+
`/goal` keeps the loop honest until a final Judge/PM audit maps receipts and verification back to the oracle and records the full outcome complete.
|
|
97
112
|
|
|
98
113
|
## Slice Sizing
|
|
99
114
|
|
|
@@ -101,7 +116,7 @@ Safe does not mean small. Safe means bounded, explicit, verified, and reversible
|
|
|
101
116
|
|
|
102
117
|
GoalBuddy should not optimize for tiny safe tasks. It should optimize for the largest safe useful slice: a working screen, working API path, data pipeline step, backend vertical slice, real bug fix, or milestone review. The board warns when it sees safe-looking work that keeps adding helpers, contracts, proof files, or doc notes without moving the outcome.
|
|
103
118
|
|
|
104
|
-
##
|
|
119
|
+
## Goalmaxxed
|
|
105
120
|
|
|
106
121
|
GoalBuddy keeps the model small:
|
|
107
122
|
|
|
@@ -115,7 +130,7 @@ Use subgoals for bounded child work that belongs to a parent task. Use multiple
|
|
|
115
130
|
|
|
116
131
|
## Execution Quality
|
|
117
132
|
|
|
118
|
-
GoalBuddy can prepare safe parallel work; it does not run a parallel org chart.
|
|
133
|
+
GoalBuddy can prepare safe parallel work; it does not run a parallel org chart or install arbitrary extension packs.
|
|
119
134
|
|
|
120
135
|
Use `goalbuddy prompt docs/goals/<slug>` to render a compact prompt for the active task without dumping the whole state file. The prompt includes a mandatory `required_spawn_agent_type`; Codex PMs should use that exact GoalBuddy agent (`goal_scout`, `goal_worker`, or `goal_judge`) instead of a generic role agent. Use `goalbuddy parallel-plan docs/goals/<slug>` to inspect read-only or disjoint write-scope work that can be handed to native Codex or Claude Code agent flows. The command reports recommendations only; it does not mutate state or spawn agents.
|
|
121
136
|
|
|
@@ -131,11 +146,13 @@ That updates both Codex and Claude Code.
|
|
|
131
146
|
|
|
132
147
|
## Live Boards
|
|
133
148
|
|
|
134
|
-
GoalBuddy
|
|
149
|
+
GoalBuddy opens a local board while the work is running, so you can see the plan, active task, receipts, subgoals, and verification status without digging through the chat.
|
|
135
150
|
|
|
136
151
|
Multiple local boards reuse one readable `goalbuddy.localhost` hub with an in-header board switcher. When sharing a board in chat or docs, use a real Markdown link such as `[Open GoalBuddy board](http://goalbuddy.localhost:41737/<slug>/)` so the URL is clickable. The viewer also supports dark mode, compact mode, completed-task collapse, active-work motion, and reduced-motion handling.
|
|
137
152
|
|
|
138
|
-
|
|
153
|
+
Custom external integrations should be built as ordinary repo work with a concrete implementation plan, not installed from a GoalBuddy catalog.
|
|
154
|
+
|
|
155
|
+
See [GoalBuddy 0.3.8: Board Hub Guardrails](docs/releases/0.3.8.md) for the latest release notes.
|
|
139
156
|
|
|
140
157
|
<p align="center">
|
|
141
158
|
<img src="internal/assets/goalbuddy-live-board.jpg" alt="GoalBuddy local live board open next to Codex while Scout, Judge, and Worker tasks populate." width="100%">
|
|
@@ -155,7 +172,7 @@ GoalBuddy is MIT licensed and published on npm.
|
|
|
155
172
|
|
|
156
173
|
The implementation lives in this repo, but the happy path is intentionally tiny: install it, run Goal Prep, then let `/goal` work from the generated files.
|
|
157
174
|
|
|
158
|
-
For release process details, see [
|
|
175
|
+
For release process details, see [docs/releases](docs/releases/README.md).
|
|
159
176
|
|
|
160
177
|
## Star History
|
|
161
178
|
|
|
@@ -256,8 +256,8 @@ The board renderer also fails closed on invalid child paths, so a malformed subg
|
|
|
256
256
|
Run the bundled parent/child board:
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
|
-
node goalbuddy/
|
|
260
|
-
--goal goalbuddy/
|
|
259
|
+
node goalbuddy/surfaces/local-goal-board/scripts/local-goal-board.mjs \
|
|
260
|
+
--goal goalbuddy/surfaces/local-goal-board/examples/subgoal-parent
|
|
261
261
|
```
|
|
262
262
|
|
|
263
263
|
Then try:
|
|
@@ -265,8 +265,8 @@ Then try:
|
|
|
265
265
|
- switch to dark mode from the gear menu
|
|
266
266
|
- open task `T004` to see the embedded child board
|
|
267
267
|
- launch another board and use the header selector
|
|
268
|
-
- run `goalbuddy parallel-plan goalbuddy/
|
|
269
|
-
- run `goalbuddy prompt goalbuddy/
|
|
268
|
+
- run `goalbuddy parallel-plan goalbuddy/surfaces/local-goal-board/examples/subgoal-parent`
|
|
269
|
+
- run `goalbuddy prompt goalbuddy/surfaces/local-goal-board/examples/subgoal-parent`
|
|
270
270
|
|
|
271
271
|
## Tests
|
|
272
272
|
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# GoalBuddy 0.3.7: Goalmaxxed
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
Release date: 2026-05-19
|
|
6
|
+
|
|
7
|
+
Goalmaxxed is the release where GoalBuddy stops trying to become a workflow catalog and commits to one sharper job:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Give /goal enough pressure that it keeps working until the original outcome is actually true.
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This release is heavily inspired by the Codex maxxing playbook: keep the goal visible, preserve context in local files, use subagents deliberately, demand evidence, and resist the temptation to declare victory because a plausible slice finished.
|
|
14
|
+
|
|
15
|
+
Update with:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx goalbuddy update
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## The Headline
|
|
22
|
+
|
|
23
|
+
GoalBuddy now centers the native `/goal` loop around five small ideas:
|
|
24
|
+
|
|
25
|
+
- **Intent**: capture what the owner actually wants.
|
|
26
|
+
- **Oracle**: define the observable signal that proves the outcome is real.
|
|
27
|
+
- **Surface**: keep one local board visible while the run moves.
|
|
28
|
+
- **Loop**: Scout maps facts, Judge chooses the largest safe useful slice, Worker completes the whole slice.
|
|
29
|
+
- **Proof**: final completion requires receipts mapped back to the oracle.
|
|
30
|
+
|
|
31
|
+
That is the product. Everything else got judged against that loop.
|
|
32
|
+
|
|
33
|
+
## Goal Pressure
|
|
34
|
+
|
|
35
|
+
GoalBuddy now treats the goal oracle as first-class state. A serious goal needs an observable signal before the board can pretend it knows what done means:
|
|
36
|
+
|
|
37
|
+
- a passing test suite
|
|
38
|
+
- a browser walkthrough
|
|
39
|
+
- a demo transcript
|
|
40
|
+
- a generated artifact
|
|
41
|
+
- a benchmark
|
|
42
|
+
- a source-backed answer
|
|
43
|
+
- a release check
|
|
44
|
+
- a final human decision
|
|
45
|
+
|
|
46
|
+
No oracle, no serious goal.
|
|
47
|
+
|
|
48
|
+
The checker also rejects weak final completion. A goal should not be marked done just because the active task ended. Done means a final Judge or PM audit records that the receipts and verification satisfy the oracle.
|
|
49
|
+
|
|
50
|
+
## Larger Useful Slices
|
|
51
|
+
|
|
52
|
+
This release sharpens the slice policy:
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Safe does not mean small. Safe means bounded, explicit, verified, and reversible.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
GoalBuddy now pushes Judge and Worker toward the largest safe useful slice: a working screen, working API path, backend vertical slice, real bug fix, data pipeline step, or milestone review.
|
|
59
|
+
|
|
60
|
+
The board warns when it sees micro-slicing: helper files, contracts, proof notes, or tiny prep tasks that are safe but do not move the owner outcome.
|
|
61
|
+
|
|
62
|
+
## Built-In Local Board
|
|
63
|
+
|
|
64
|
+
The local board is now a core surface, not an extension.
|
|
65
|
+
|
|
66
|
+
The bundled surface lives at:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
goalbuddy/surfaces/local-goal-board/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
It remains the default way to watch a GoalBuddy run: active task, blocked state, receipts, verification status, subgoals, and board switching all point back to the same `state.yaml` truth.
|
|
73
|
+
|
|
74
|
+
## No Extension Catalog
|
|
75
|
+
|
|
76
|
+
GoalBuddy no longer ships a public extension catalog.
|
|
77
|
+
|
|
78
|
+
The old catalog made the product look bigger while making the core loop blurrier. Goalmaxxed chooses the smaller invariant:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
GoalBuddy prepares and pressures /goal runs. Custom integrations are ordinary repo work.
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
If a team wants a GitHub, Linear, Slack, or release integration, they should prepare a concrete implementation plan in their repo and build it as normal software. GoalBuddy should not install arbitrary workflow packs as a side channel.
|
|
85
|
+
|
|
86
|
+
## Simpler Public Surface
|
|
87
|
+
|
|
88
|
+
The public copy now says what GoalBuddy actually does:
|
|
89
|
+
|
|
90
|
+
- prepares `/goal`
|
|
91
|
+
- writes `goal.md` and `state.yaml`
|
|
92
|
+
- creates a goal oracle
|
|
93
|
+
- opens a local board
|
|
94
|
+
- keeps Scout/Judge/Worker handoffs receipt-shaped
|
|
95
|
+
- prevents early completion
|
|
96
|
+
- leaves custom integrations outside the core
|
|
97
|
+
|
|
98
|
+
The Codex and Claude Code plugin manifests are aligned with the package description, and the test suite now checks that the Claude manifest stays in sync.
|
|
99
|
+
|
|
100
|
+
## Release Boundaries
|
|
101
|
+
|
|
102
|
+
This release intentionally does not add:
|
|
103
|
+
|
|
104
|
+
- an extension marketplace
|
|
105
|
+
- automatic parallel-agent spawning
|
|
106
|
+
- hosted board state
|
|
107
|
+
- automatic receipt application
|
|
108
|
+
- UI controls that mutate board state
|
|
109
|
+
- a replacement for native `/goal`
|
|
110
|
+
|
|
111
|
+
GoalBuddy stays local, file-backed, and boring in the parts that should be boring.
|
|
112
|
+
|
|
113
|
+
## Package Notes
|
|
114
|
+
|
|
115
|
+
This release updates:
|
|
116
|
+
|
|
117
|
+
- npm package version: `0.3.7`
|
|
118
|
+
- Codex plugin version: `0.3.7`
|
|
119
|
+
- Claude Code plugin version: `0.3.7`
|
|
120
|
+
- package contents to include `goalbuddy/surfaces/`
|
|
121
|
+
- mirrored GoalBuddy skill files under `plugins/goalbuddy/skills/goalbuddy/`
|
|
122
|
+
|
|
123
|
+
Before publishing, verify:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm run check
|
|
127
|
+
npm run pack:dry-run
|
|
128
|
+
node internal/cli/check-publish-version.mjs
|
|
129
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# GoalBuddy 0.3.8: Board Hub Guardrails
|
|
2
|
+
|
|
3
|
+
Release date: 2026-05-29
|
|
4
|
+
|
|
5
|
+
This patch release fixes a confusing local-board failure mode.
|
|
6
|
+
|
|
7
|
+
GoalBuddy already supports multiple local boards on one shared hub:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
http://goalbuddy.localhost:41737/<slug>/
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The problem was the unregistered-path error. If an agent opened a new board URL before registering that goal with the hub, the server returned a bare 404. That made it too easy to infer that the process on `41737` was stale, even when it was a healthy multi-board hub for another goal.
|
|
14
|
+
|
|
15
|
+
## What Changed
|
|
16
|
+
|
|
17
|
+
- Unregistered board paths now return an explicit diagnostic explaining that a `/slug/` 404 does not mean the hub is stale.
|
|
18
|
+
- The diagnostic points agents to `http://127.0.0.1:41737/api/boards` and tells them to rerun `npx goalbuddy board <goal-dir>` to register the goal on the same port.
|
|
19
|
+
- `$goal-prep` / `/goal-prep` now says to stop a process on `41737` only when `/api/boards` proves the listener is not a current GoalBuddy multi-board hub.
|
|
20
|
+
- `npm run check` now includes the local board surface tests and syntax checks.
|
|
21
|
+
|
|
22
|
+
## Release Boundaries
|
|
23
|
+
|
|
24
|
+
This release does not change the board state model. `state.yaml` remains the source of truth, the local board remains a viewer over repo files, and multiple boards still share the same local hub.
|
|
25
|
+
|
|
26
|
+
## Package Notes
|
|
27
|
+
|
|
28
|
+
This release updates:
|
|
29
|
+
|
|
30
|
+
- npm package version: `0.3.8`
|
|
31
|
+
- Codex plugin version: `0.3.8`
|
|
32
|
+
- Claude Code plugin version: `0.3.8`
|
|
33
|
+
- release checks to cover `goalbuddy/surfaces/local-goal-board/`
|
|
34
|
+
|
|
35
|
+
Before publishing, verify:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm run check
|
|
39
|
+
npm run publish:check
|
|
40
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Release Process
|
|
2
|
+
|
|
3
|
+
Historical release notes live next to this process doc:
|
|
4
|
+
|
|
5
|
+
- [0.3.8: Board Hub Guardrails](0.3.8.md)
|
|
6
|
+
- [0.3.7: Goalmaxxed](0.3.7.md)
|
|
7
|
+
- [0.3.5: Subgoals, Parallel Agents, and Dark Mode](0.3.5.md)
|
|
8
|
+
|
|
9
|
+
GoalBuddy publishes the `goalbuddy` npm package from GitHub Actions using npm trusted publishing. This avoids long-lived npm write tokens and lets npm generate provenance for future releases.
|
|
10
|
+
|
|
11
|
+
## One-Time npm Setup
|
|
12
|
+
|
|
13
|
+
Configure this on npmjs.com for the `goalbuddy` package:
|
|
14
|
+
|
|
15
|
+
- Publisher: GitHub Actions
|
|
16
|
+
- GitHub owner/user: `tolibear`
|
|
17
|
+
- Repository: `goalbuddy`
|
|
18
|
+
- Workflow filename: `npm-publish.yml`
|
|
19
|
+
- Package: `goalbuddy`
|
|
20
|
+
|
|
21
|
+
The workflow path in this repo is:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
.github/workflows/npm-publish.yml
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or configure the same trust relationship from the npm CLI:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx --yes npm@11.13.0 trust github goalbuddy \
|
|
31
|
+
--repo tolibear/goalbuddy \
|
|
32
|
+
--file npm-publish.yml \
|
|
33
|
+
--yes
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This command requires npm owner authentication and may print an `EOTP` browser/OTP URL. Complete that npm authentication step, then rerun the same command if needed. The `npx --yes npm@11.13.0 trust ...` form is intentional; using `npx -p npm@latest npm trust ...` can resolve to an older global npm binary that does not expose the `trust` command.
|
|
37
|
+
|
|
38
|
+
After the trusted publisher works, use npm package settings to require 2FA and disallow tokens for publishing. Keep `goal-maker` published during the migration window.
|
|
39
|
+
|
|
40
|
+
Starting in `0.3.0`, the installer is target-aware: `npx goalbuddy` installs into both `~/.codex/` and `~/.claude/`, and `goalbuddy update` refreshes both by default. Use `--target codex` or `--target claude` to narrow a command. Both targets share the same `goalbuddy/` skill payload and are exercised by the test suite under `internal/test/`.
|
|
41
|
+
|
|
42
|
+
## Release Flow
|
|
43
|
+
|
|
44
|
+
1. Update `package.json` version.
|
|
45
|
+
2. Run local checks:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm run check
|
|
49
|
+
npm run pack:dry-run
|
|
50
|
+
node internal/cli/check-publish-version.mjs
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
3. Commit and push the version change.
|
|
54
|
+
4. Create and publish a GitHub release whose tag matches the package version, for example `v0.2.11`.
|
|
55
|
+
5. Confirm the GitHub Actions workflow `Publish npm package` completed.
|
|
56
|
+
6. Verify npm:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm view goalbuddy name version dist-tags repository bin --json
|
|
60
|
+
npx goalbuddy --help
|
|
61
|
+
npx goalbuddy doctor --target codex
|
|
62
|
+
npx goalbuddy doctor --target claude
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Provenance Expectations
|
|
66
|
+
|
|
67
|
+
npm trusted publishing requires a GitHub-hosted runner, Node `22.14.0` or newer, npm `11.5.1` or newer, and `id-token: write` workflow permission. The release workflow uses Node 24 and grants the OIDC permission required by npm.
|
|
68
|
+
|
|
69
|
+
When publishing through trusted publishing from this public repo to the public `goalbuddy` package, npm should generate provenance automatically. The workflow intentionally runs `npm publish` without `NODE_AUTH_TOKEN`; npm exchanges the GitHub OIDC identity for a short-lived publish credential.
|
|
70
|
+
|
|
71
|
+
## Compatibility Package
|
|
72
|
+
|
|
73
|
+
Do not unpublish `goal-maker`. During the 60-90 day compatibility window, `npx goal-maker` should continue to work and point users to:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npx goalbuddy
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
After the compatibility window:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm deprecate goal-maker "Renamed to goalbuddy. Use: npx goalbuddy"
|
|
83
|
+
```
|
package/goalbuddy/SKILL.md
CHANGED
|
@@ -12,9 +12,17 @@ GoalBuddy is for autonomous, long-running Codex or Claude Code work where the PM
|
|
|
12
12
|
The loop is:
|
|
13
13
|
|
|
14
14
|
```text
|
|
15
|
-
raw user intent -> intake compiler ->
|
|
15
|
+
raw user intent -> intake compiler -> goal oracle -> local work surface -> one active task -> receipt -> proof loop -> repeat
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
+
GoalBuddy's core invariant is:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
Intent -> Oracle -> Surface -> Loop -> Proof
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
No oracle, no serious goal. A goal oracle is the observable signal that tells the PM whether the original owner outcome is actually true yet. It may be a test suite, browser walkthrough, demo transcript, generated artifact, benchmark, source-backed answer, release check, or final human decision. Weak proof creates weak goals, so record the oracle before shaping tasks and keep testing against it until final completion.
|
|
25
|
+
|
|
18
26
|
## Invocation Boundary
|
|
19
27
|
|
|
20
28
|
There are two different modes:
|
|
@@ -31,7 +39,7 @@ Allowed `$goal-prep` actions:
|
|
|
31
39
|
- run the bundled GoalBuddy update checker and mention a newer version if one is available;
|
|
32
40
|
- ask diagnostic intake questions and wait when required;
|
|
33
41
|
- create or repair only `docs/goals/<slug>/goal.md`, `docs/goals/<slug>/state.yaml`, `docs/goals/<slug>/notes/`, and the generated `.goalbuddy-board/` visual board artifact;
|
|
34
|
-
- create and open the
|
|
42
|
+
- create and open the built-in local GoalBuddy board surface for the goal unless the user opts out;
|
|
35
43
|
- optionally run the GoalBuddy board checker against that `state.yaml`;
|
|
36
44
|
- verify GoalBuddy agent availability, if this can be done without touching implementation work, and record `installed`, `bundled_not_installed`, `missing`, or `unknown` truthfully;
|
|
37
45
|
- print exactly `/goal Follow docs/goals/<slug>/goal.md.`;
|
|
@@ -69,25 +77,27 @@ Extract:
|
|
|
69
77
|
- authority: `requested | approved | inferred | needs_approval | blocked`;
|
|
70
78
|
- proof type: `test | demo | artifact | metric | review | source_backed_answer | decision`;
|
|
71
79
|
- completion proof: the observable signal for full outcome completion;
|
|
80
|
+
- goal oracle: the live check, walkthrough, artifact, metric, or decision that will keep pressure on the goal and prevent early completion;
|
|
72
81
|
- likely misfire: how `/goal` could succeed at the wrong thing;
|
|
73
82
|
- blind spots: important risks, choices, or success dimensions the user may not have named yet;
|
|
74
83
|
- existing plan facts: user-provided steps, files, constraints, or sequencing that must be preserved but still validated.
|
|
75
84
|
|
|
76
|
-
|
|
85
|
+
Use the local GoalBuddy board as the default work surface for broad GoalBuddy runs. Ask only when the user has not already implied they want the default local surface, the goal is unusually quick/private, or board setup would materially distract from the requested prep:
|
|
77
86
|
|
|
78
87
|
```text
|
|
79
|
-
Do you want
|
|
88
|
+
Do you want the local GoalBuddy board for this goal?
|
|
80
89
|
```
|
|
81
90
|
|
|
82
91
|
Recommended options:
|
|
83
92
|
|
|
84
93
|
1. Local live board (Recommended) - starts immediately, requires no credentials, and lets the user watch tasks populate inside Codex or Claude Code.
|
|
85
|
-
2.
|
|
86
|
-
3. No visual board - best for quick or private goals where the file board is enough.
|
|
94
|
+
2. No visual board - best for quick or private goals where the file board is enough.
|
|
87
95
|
|
|
88
96
|
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
97
|
|
|
90
|
-
If
|
|
98
|
+
If `http://goalbuddy.localhost:41737/<slug>/` returns 404, do not assume the existing process is stale and do not stop it. First check `http://127.0.0.1:41737/api/boards`. If that endpoint returns board JSON, the port is the shared multi-board hub; rerun `npx goalbuddy board docs/goals/<slug>` with the absolute goal path if needed so the new goal registers on the same port. Only stop a specific process on 41737 when `/api/boards` is missing, returns 404, or otherwise proves the listener is not a current GoalBuddy multi-board hub.
|
|
99
|
+
|
|
100
|
+
If the user wants an external board, GitHub sync, Slack digest, Linear handoff, or any other custom integration, do not install a GoalBuddy catalog item. Treat it as normal implementation work: create a concrete task that designs and verifies that integration inside the target repo or asks the operator for the required credentials and scope.
|
|
91
101
|
|
|
92
102
|
Ask before board creation when the request is vague, strategic, improvement-oriented, or open-ended and the user has not explicitly said to use defaults. Ask one guided question at a time with 2-3 options and a recommended default, then wait. Continue the diagnostic intake until the user's answers are sufficient to choose the board shape. Do not create or repair `docs/goals/<slug>/` until the diagnostic intake is complete or the user explicitly accepts defaults.
|
|
93
103
|
|
|
@@ -134,7 +144,7 @@ Stop after each question. Do not create files, repair an existing board, run che
|
|
|
134
144
|
|
|
135
145
|
Minimum diagnostic ladder for vague, strategic, or improvement-oriented goals:
|
|
136
146
|
|
|
137
|
-
1.
|
|
147
|
+
1. Goal surface: use the local live board by default, or ask "Do you want the local GoalBuddy board for this goal?" when board handling is unresolved.
|
|
138
148
|
2. Intent target: what kind of improvement or outcome matters most?
|
|
139
149
|
3. Success proof: what evidence would convince the user this worked?
|
|
140
150
|
4. Scope and non-goals: what should remain untouched or explicitly out of scope?
|
|
@@ -173,7 +183,7 @@ Do:
|
|
|
173
183
|
- classify the goal as `specific`, `open_ended`, `existing_plan`, `recovery`, or `audit`;
|
|
174
184
|
- create or repair `docs/goals/<slug>/`;
|
|
175
185
|
- create `goal.md`, `state.yaml`, and `notes/`;
|
|
176
|
-
-
|
|
186
|
+
- start the local board immediately and open it in the AI coding agent's in-app browser (Codex in-app Browser, Claude Code preview, or the user's regular browser) before filling the task list, unless the user opts out;
|
|
177
187
|
- seed a role-tagged task board that matches the input shape;
|
|
178
188
|
- make the first active task safe;
|
|
179
189
|
- verify Scout, Worker, and Judge agent availability or record an explicit truthful state;
|
|
@@ -234,7 +244,7 @@ Use this skill for goals that are broad, multi-hour, ambiguous, high-risk, alrea
|
|
|
234
244
|
|
|
235
245
|
For a one-change task, do not create a GoalBuddy board.
|
|
236
246
|
|
|
237
|
-
Scout and Judge tasks may identify optional
|
|
247
|
+
Scout and Judge tasks may identify optional publishing, reporting, integration, plugin, or channel opportunities as improvement candidates. Treat those as normal board tasks with concrete implementation plans. `state.yaml` remains board truth.
|
|
238
248
|
|
|
239
249
|
## The Four Primitives
|
|
240
250
|
|
|
@@ -274,6 +284,7 @@ The charter answers:
|
|
|
274
284
|
What did the user originally ask for?
|
|
275
285
|
What are we trying to improve?
|
|
276
286
|
What input shape did the intake identify?
|
|
287
|
+
What is the goal oracle?
|
|
277
288
|
What constraints are non-negotiable?
|
|
278
289
|
Is this goal specific, open-ended, existing-plan, recovery, or audit?
|
|
279
290
|
What likely misfire must the PM avoid?
|
|
@@ -53,6 +53,38 @@ function nestedScalar(section, key) {
|
|
|
53
53
|
return null;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
function pathScalar(path, key) {
|
|
57
|
+
const lines = text.split(/\r?\n/);
|
|
58
|
+
let depth = 0;
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
if (!line.trim()) continue;
|
|
61
|
+
const indent = line.match(/^ */)[0].length;
|
|
62
|
+
if (indent < depth * 2) depth = Math.floor(indent / 2);
|
|
63
|
+
|
|
64
|
+
if (depth < path.length && indent === depth * 2 && new RegExp(`^\\s{${indent}}${path[depth]}:\\s*$`).test(line)) {
|
|
65
|
+
depth += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (depth === path.length && indent === depth * 2) {
|
|
70
|
+
const match = line.match(new RegExp(`^\\s{${indent}}${key}:\\s*(.*?)\\s*$`));
|
|
71
|
+
if (match) return clean(match[1]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function isWeakProof(value) {
|
|
78
|
+
if (value === null || value === undefined) return true;
|
|
79
|
+
const normalized = String(value).trim().toLowerCase();
|
|
80
|
+
return normalized === ""
|
|
81
|
+
|| normalized === "unknown"
|
|
82
|
+
|| normalized === "tbd"
|
|
83
|
+
|| normalized === "todo"
|
|
84
|
+
|| normalized === "none"
|
|
85
|
+
|| /^<.*>$/.test(normalized);
|
|
86
|
+
}
|
|
87
|
+
|
|
56
88
|
function sectionText(section) {
|
|
57
89
|
const lines = text.split(/\r?\n/);
|
|
58
90
|
const start = lines.findIndex((line) => new RegExp(`^${section}:\\s*$`).test(line));
|
|
@@ -225,6 +257,11 @@ const allowedAgentStatuses = new Set(["installed", "bundled_not_installed", "mis
|
|
|
225
257
|
const continuousUntilFullOutcome = nestedScalar("rules", "continuous_until_full_outcome") === true;
|
|
226
258
|
const missingInputOrCredentialsDoNotStopGoal =
|
|
227
259
|
nestedScalar("rules", "missing_input_or_credentials_do_not_stop_goal") === true;
|
|
260
|
+
const goalPressureRequiresOracle = nestedScalar("rules", "goal_pressure_requires_oracle") !== false;
|
|
261
|
+
const noCompletionOnWeakProof = nestedScalar("rules", "no_completion_on_weak_proof") !== false;
|
|
262
|
+
const completionProof = pathScalar(["goal", "intake"], "completion_proof");
|
|
263
|
+
const oracleSignal = pathScalar(["goal", "oracle"], "signal");
|
|
264
|
+
const oracleFinalProof = pathScalar(["goal", "oracle"], "final_proof");
|
|
228
265
|
const legacySignals = [
|
|
229
266
|
/^gate:\s*$/m,
|
|
230
267
|
/^artifact_policy:\s*$/m,
|
|
@@ -244,6 +281,19 @@ if (!["active", "blocked", "done"].includes(goalStatus)) {
|
|
|
244
281
|
errors.push(`goal.status must be active, blocked, or done; got ${goalStatus || "<missing>"}`);
|
|
245
282
|
}
|
|
246
283
|
|
|
284
|
+
if (goalPressureRequiresOracle) {
|
|
285
|
+
if (isWeakProof(oracleSignal)) {
|
|
286
|
+
warnings.push("goal.oracle.signal is missing or placeholder-like; weak oracles make /goal finish too early.");
|
|
287
|
+
}
|
|
288
|
+
if (isWeakProof(oracleFinalProof)) {
|
|
289
|
+
warnings.push("goal.oracle.final_proof is missing or placeholder-like; final completion needs receipt-backed proof.");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (isWeakProof(completionProof)) {
|
|
294
|
+
warnings.push("goal.intake.completion_proof is missing or placeholder-like; record the observable signal that proves the full original outcome.");
|
|
295
|
+
}
|
|
296
|
+
|
|
247
297
|
function agentStatusWarning(agent, status) {
|
|
248
298
|
const agentLabel = agent[0].toUpperCase() + agent.slice(1);
|
|
249
299
|
if (status === "bundled_not_installed") {
|
|
@@ -532,6 +582,9 @@ function escapeRegExp(value) {
|
|
|
532
582
|
}
|
|
533
583
|
|
|
534
584
|
if (goalStatus === "done") {
|
|
585
|
+
if (noCompletionOnWeakProof && (isWeakProof(completionProof) || isWeakProof(oracleSignal) || isWeakProof(oracleFinalProof))) {
|
|
586
|
+
errors.push("done goals require concrete completion proof, goal.oracle.signal, and goal.oracle.final_proof; weak proof cannot close a goal");
|
|
587
|
+
}
|
|
535
588
|
const finalAudit = tasks.some((task) => {
|
|
536
589
|
if (!["judge", "pm"].includes(task.type) || task.status !== "done") return false;
|
|
537
590
|
if (!task.receipt.present || task.receipt.value === null) return false;
|