@hecer/yoke 1.11.0 → 1.13.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.
- package/.claude-plugin/plugin.json +13 -13
- package/.codex-plugin/plugin.json +7 -7
- package/CHANGELOG.md +435 -398
- package/README.md +943 -915
- package/TODOS.md +5 -5
- package/agents/docs.toml +6 -6
- package/agents/implementer.toml +6 -6
- package/agents/reviewer.toml +6 -6
- package/agents/security.toml +6 -6
- package/bench/README.md +86 -86
- package/bench/RESULTS.md +35 -35
- package/bench/output-compaction.mjs +65 -65
- package/bench/result-schema.mjs +12 -12
- package/bench/results/claude-2026-07-27T18-03-26.json +50 -50
- package/bench/results/codex-unavailable-1785175418318.json +15 -15
- package/bench/results/gemini-2026-07-27T18-03-44.json +46 -46
- package/bench/run-matrix.mjs +26 -26
- package/bench/run.mjs +106 -106
- package/canon/AGENTS.md +30 -30
- package/canon/context/DECISIONS.md +4 -4
- package/canon/context/GLOSSARY.md +11 -11
- package/canon/context/KNOWLEDGE.md +4 -4
- package/canon/context/PROJECT.md +15 -15
- package/canon/loop/loop-spec.md +65 -65
- package/canon/loop/prd.schema.md +41 -41
- package/canon/manifest.yaml +59 -59
- package/canon/policy/gates.md +7 -7
- package/canon/policy/roles.md +9 -9
- package/canon/skills/ATTRIBUTION.md +99 -99
- package/canon/skills/authoring-prd/SKILL.md +57 -57
- package/canon/skills/brainstorming/SKILL.md +164 -164
- package/canon/skills/codebase-design/DEEPENING.md +15 -15
- package/canon/skills/codebase-design/DESIGN-IT-TWICE.md +12 -12
- package/canon/skills/codebase-design/SKILL.md +39 -39
- package/canon/skills/dispatching-parallel-agents/SKILL.md +182 -182
- package/canon/skills/document-release/SKILL.md +302 -302
- package/canon/skills/domain-modeling/ADR-FORMAT.md +19 -19
- package/canon/skills/domain-modeling/CONTEXT-FORMAT.md +39 -39
- package/canon/skills/domain-modeling/SKILL.md +35 -35
- package/canon/skills/executing-plans/SKILL.md +70 -70
- package/canon/skills/finishing-a-development-branch/SKILL.md +200 -200
- package/canon/skills/health/SKILL.md +177 -177
- package/canon/skills/maintaining-context/SKILL.md +34 -34
- package/canon/skills/minimal-code/SKILL.md +21 -21
- package/canon/skills/no-ai-slop/SKILL.md +103 -103
- package/canon/skills/no-ai-slop/eval.md +43 -43
- package/canon/skills/plan-ceo-review/SKILL.md +541 -541
- package/canon/skills/plan-eng-review/SKILL.md +362 -362
- package/canon/skills/receiving-code-review/SKILL.md +213 -213
- package/canon/skills/requesting-code-review/SKILL.md +105 -105
- package/canon/skills/resolving-merge-conflicts/SKILL.md +18 -18
- package/canon/skills/retro/SKILL.md +397 -397
- package/canon/skills/review/SKILL.md +246 -246
- package/canon/skills/ship/SKILL.md +691 -691
- package/canon/skills/subagent-driven-development/SKILL.md +277 -277
- package/canon/skills/systematic-debugging/SKILL.md +296 -296
- package/canon/skills/tdd/SKILL.md +371 -371
- package/canon/skills/unslop-ui/SKILL.md +34 -34
- package/canon/skills/using-git-worktrees/SKILL.md +218 -218
- package/canon/skills/verification-before-completion/SKILL.md +139 -139
- package/canon/skills/visual-verification/SKILL.md +54 -54
- package/canon/skills/workflow/SKILL.md +22 -22
- package/canon/skills/writing-for-agents/SKILL-MECHANICS.md +27 -27
- package/canon/skills/writing-for-agents/SKILL.md +42 -42
- package/canon/skills/writing-plans/SKILL.md +152 -152
- package/canon/skills/writing-skills/SKILL.md +655 -655
- package/canon/skills/yoke-retrofit/SKILL.md +26 -26
- package/canon/skills/yoke-workflow/SKILL.md +20 -20
- package/canon/tools/codex-rtk-hook.mjs +35 -35
- package/canon/tools/gemini-rtk-hook.mjs +25 -25
- package/canon/tools/graphify.md +3 -3
- package/canon/tools/playwright-mcp.md +3 -3
- package/canon/tools/qwen-rtk-hook.mjs +25 -0
- package/canon/tools/rtk.md +7 -7
- package/canon/tools/serena.md +6 -6
- package/dist/agents/catalog.js +7 -0
- package/dist/agents/contracts.js +3 -1
- package/dist/agents/host.js +5 -1
- package/dist/agents/process-streams.js +62 -0
- package/dist/agents/process.js +43 -3
- package/dist/agents/providers.js +61 -6
- package/dist/agents/telemetry.js +133 -37
- package/dist/canon/manifest.js +2 -1
- package/dist/change/inbox.js +1 -1
- package/dist/cli.js +30 -24
- package/dist/dashboard/page.js +122 -122
- package/dist/dashboard/panels.js +91 -91
- package/dist/goals/command.js +3 -2
- package/dist/loop/claims.js +2 -1
- package/dist/loop/decision.js +3 -2
- package/dist/loop/parallel-command.js +4 -2
- package/dist/loop/prd.js +2 -1
- package/dist/loop/reporter.js +1 -0
- package/dist/loop/run-command.js +31 -10
- package/dist/prd/command.js +19 -19
- package/dist/quality/candidate-comparison.js +6 -1
- package/dist/quality/command.js +17 -2
- package/dist/quality/types.js +6 -1
- package/dist/retrofit/apply.js +95 -2
- package/dist/retrofit/config.js +9 -1
- package/dist/retrofit/detect.js +8 -0
- package/dist/retrofit/plan.js +6 -0
- package/dist/retrofit/planners/claude.js +14 -14
- package/dist/retrofit/planners/kilo.js +44 -0
- package/dist/retrofit/planners/opencode.js +44 -0
- package/dist/retrofit/planners/pi.js +24 -0
- package/dist/retrofit/planners/qwen.js +3 -3
- package/dist/retrofit/preserve.js +2 -2
- package/dist/retrofit/qwen-settings.js +17 -0
- package/dist/retrofit/skill-actions.js +4 -1
- package/dist/retrofit/tools.js +8 -0
- package/dist/review/command.js +3 -2
- package/dist/review/verdict.js +1 -1
- package/dist/routing/capability.js +2 -2
- package/dist/routing/planning.js +2 -0
- package/dist/routing/registry.js +3 -1
- package/dist/routing/router.js +7 -3
- package/dist/setup/command.js +35 -11
- package/dist/setup/model-presets.js +48 -0
- package/docs/CAPABILITY-ROUTING.md +51 -51
- package/docs/DASHBOARD-EVOLUTION.md +33 -33
- package/docs/HARNESSES.md +81 -0
- package/docs/MIGRATING-TO-1.0.md +33 -33
- package/docs/MIGRATING-TO-1.1.md +27 -27
- package/docs/MIGRATING-TO-1.4.md +70 -70
- package/docs/PRODUCT-DIRECTION-2026-09-05.md +210 -210
- package/docs/PUBLISHING.md +114 -114
- package/docs/QWEN-MODEL-SUPPORT.md +142 -0
- package/docs/VERIFIED-PROJECTS-VALIDATION.md +29 -29
- package/docs/VERIFIED-PROJECTS.md +167 -167
- package/docs/superpowers/plans/2026-06-28-baustein-e-context-layer.md +981 -981
- package/docs/superpowers/plans/2026-06-29-baustein-f-routing.md +258 -258
- package/docs/superpowers/plans/2026-06-29-baustein-g-loop-observability.md +1006 -1006
- package/docs/superpowers/plans/2026-06-29-baustein-h-loop-robustness.md +374 -374
- package/docs/superpowers/plans/2026-06-30-baustein-i-visual-design-verification.md +450 -450
- package/docs/superpowers/plans/2026-07-02-baustein-k-zero-to-100-bootstrap.md +1024 -1024
- package/docs/superpowers/plans/2026-07-02-baustein-m-flow-smoke-proofs.md +574 -574
- package/docs/superpowers/plans/2026-08-13-gauntlet-quality-loop.md +537 -537
- package/docs/superpowers/plans/2026-08-16-artifact-backed-output-compaction.md +329 -329
- package/docs/superpowers/plans/2026-09-05-verified-projects.md +83 -83
- package/docs/superpowers/specs/2026-06-28-baustein-e-context-layer-design.md +146 -146
- package/docs/superpowers/specs/2026-06-29-baustein-f-routing-design.md +106 -106
- package/docs/superpowers/specs/2026-06-29-baustein-g-loop-observability-design.md +186 -186
- package/docs/superpowers/specs/2026-06-29-baustein-h-loop-robustness-design.md +113 -113
- package/docs/superpowers/specs/2026-06-30-baustein-i-visual-design-verification-design.md +98 -98
- package/docs/superpowers/specs/2026-07-02-baustein-k-zero-to-100-bootstrap-design.md +200 -200
- package/docs/superpowers/specs/2026-07-02-baustein-m-flow-smoke-proofs-design.md +155 -155
- package/docs/superpowers/specs/2026-08-13-gauntlet-quality-loop-design.md +422 -422
- package/docs/superpowers/specs/2026-08-16-artifact-backed-output-compaction-design.md +166 -166
- package/gemini-extension.json +6 -6
- package/hooks/hooks.json +19 -19
- package/package.json +91 -87
- package/dist/dashboard/discovery.js +0 -73
- package/docs/community-outreach-2026-08-20.md +0 -85
- package/docs/launch-copy-2026-08-21.md +0 -193
|
@@ -1,167 +1,167 @@
|
|
|
1
|
-
# Verified projects, goals and measured execution
|
|
2
|
-
|
|
3
|
-
Available in Yoke 1.7.0. These additions do not require a cloud account or replace your provider CLI. Model availability, reasoning controls, structured output and telemetry depend on the selected provider; unknown usage is never a measured zero. Live authenticated provider comparison and calibrated time/cost benchmarks remain separate validation work.
|
|
4
|
-
|
|
5
|
-
## Check an existing project
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
yoke check .
|
|
9
|
-
yoke check . --json
|
|
10
|
-
yoke check . --requirement="Guest checkout completes"
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Checks run without retrofit. Exit codes: `0` passed, `1` failed, `2` unverified or unavailable. A free-text requirement stays unverified until you map its behavior to an executable acceptance contract. Passing a project suite does not establish arbitrary product correctness.
|
|
14
|
-
|
|
15
|
-
Create `.yoke/acceptance.yaml` with tests that inspect application behavior:
|
|
16
|
-
|
|
17
|
-
```yaml
|
|
18
|
-
version: 1
|
|
19
|
-
protected:
|
|
20
|
-
- tests/acceptance/checkout.test.mjs
|
|
21
|
-
- tests/acceptance/helpers.mjs
|
|
22
|
-
criteria:
|
|
23
|
-
- id: guest-checkout
|
|
24
|
-
text: A guest can complete checkout and receives one order confirmation.
|
|
25
|
-
commands:
|
|
26
|
-
- node --test tests/acceptance/checkout.test.mjs
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
List every local test helper, fixture and configuration file whose modification could weaken this contract. Paths must resolve inside the project. `yoke check . --protect` pins the manifest, listed files and existing package manifests/lockfiles outside the worker checkout. Autonomous goals require explicit protected test infrastructure and establish this pin automatically. Protection is change detection within the local execution model, not an OS security boundary against a hostile process using your account. Review the contract before running a goal.
|
|
30
|
-
|
|
31
|
-
After intentionally editing protected tests, use `yoke check . --protect --refresh` to approve the new baseline. Ordinary checks and retries never refresh it. Source, acceptance and configuration identity are checked before and after verification; changed inputs invalidate evidence. Gitlinks/submodule directories currently fail closed because recursive identity is not implemented. Evidence is stored in `.yoke/checks/<id>.json`; it describes that checked snapshot and is not a permanent success certificate.
|
|
32
|
-
|
|
33
|
-
## Durable goals across providers
|
|
34
|
-
|
|
35
|
-
```sh
|
|
36
|
-
yoke goal set . --objective="Finish guest checkout" --attempts=3 --minutes=30
|
|
37
|
-
yoke goal run . --runner=codex
|
|
38
|
-
yoke goal resume . --runner=claude --model=<installed-model-id>
|
|
39
|
-
yoke goal resume . --runner=gemini --model=<installed-model-id>
|
|
40
|
-
yoke goal status .
|
|
41
|
-
yoke goal handoff .
|
|
42
|
-
yoke goal pause .
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Goals keep objective, attempts, failure context and check IDs in `.yoke/goal.json`. They share the story-loop lock. Each implementation attempt is followed by independent executable acceptance. A completed goal is checked again on a later run. Failed work stays in the project; goal execution itself does not commit or publish it. Goal handoff is readable context for native agent goal facilities; Yoke does not invent or call an undocumented native goal API.
|
|
46
|
-
|
|
47
|
-
`--minutes` limits cumulative agent execution time. Verification is measured separately and commands retain their verification timeout. `--tokens=N` is a checkpoint budget: it prevents another attempt when measured consumption is exhausted or unknown, but cannot promise a hard token cap within a single provider call. An interrupted attempt is persisted before dispatch; recovery accounts for it conservatively and reconciles recorded provider processes before continuing. Unknown process ownership blocks execution. Pause takes effect at an attempt boundary; it does not instantly kill an in-flight agent.
|
|
48
|
-
|
|
49
|
-
Explicitly extend total budgets without deleting history:
|
|
50
|
-
|
|
51
|
-
```sh
|
|
52
|
-
yoke goal budget . --attempts=5 --minutes=60
|
|
53
|
-
yoke goal budget . --tokens=200000
|
|
54
|
-
# Only if you deliberately want to remove the checkpoint token limit:
|
|
55
|
-
yoke goal budget . --clear-token-budget
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Unknown historical token usage cannot be made known by increasing its limit. Inspect interrupted work and keep that limitation visible.
|
|
59
|
-
|
|
60
|
-
## Recover an isolated story
|
|
61
|
-
|
|
62
|
-
Failed or paused isolated story worktrees are retained. Resume the same story with:
|
|
63
|
-
|
|
64
|
-
```sh
|
|
65
|
-
yoke loop run . --isolate --resume-worktree --parallel=1 --candidates=1
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Yoke validates the registered worktree, repository, original target commit and PRD digest. Changed target/PRD state is refused; inspect retained edits and reconcile deliberately. This flag is for serial isolated recovery; parallel workers retain their existing coordinator lifecycle. `yoke loop cleanup` remains an explicit cleanup operation; inspect its removal flags before discarding unfinished work. Existing projects should rerun retrofit to add ignore entries for checks, events and goals.
|
|
69
|
-
|
|
70
|
-
## Spend fewer model calls
|
|
71
|
-
|
|
72
|
-
Add explicit project rules to `.yoke/config.yaml`:
|
|
73
|
-
|
|
74
|
-
```yaml
|
|
75
|
-
routing:
|
|
76
|
-
enabled: true
|
|
77
|
-
strategy: cost
|
|
78
|
-
maxCandidates: 2
|
|
79
|
-
workers:
|
|
80
|
-
- id: fast
|
|
81
|
-
agent: claude
|
|
82
|
-
model: <your-fast-model-id>
|
|
83
|
-
costTier: low
|
|
84
|
-
capabilities: [docs, tests]
|
|
85
|
-
- id: strong
|
|
86
|
-
agent: codex
|
|
87
|
-
model: <your-strong-model-id>
|
|
88
|
-
costTier: high
|
|
89
|
-
capabilities: [implementation]
|
|
90
|
-
rules:
|
|
91
|
-
- area: docs
|
|
92
|
-
worker: fast
|
|
93
|
-
escalateTo: strong
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
The first matching rule bypasses the routing controller. Its optional area and story ID selectors both have to match when supplied. Independent gate failure escalates the next attempt, including after loop restart; an unavailable or unknown worker falls back to the parent. Without an explicit escalation target the parent handles the failed rule. Other stories retain adaptive routing. Gate-driven routing observations are local and bounded when read. These are measured outcomes, not guarantees that a named inexpensive model can handle every task.
|
|
97
|
-
|
|
98
|
-
For deterministic operations, configure exact executable arguments:
|
|
99
|
-
|
|
100
|
-
```yaml
|
|
101
|
-
actions:
|
|
102
|
-
- storyId: regenerate-types
|
|
103
|
-
file: node
|
|
104
|
-
args: [scripts/generate-types.mjs]
|
|
105
|
-
timeoutMs: 60000
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
Actions use no model, run without a shell, have bounded output/time and still pass the ordinary story gates before commit. They currently require serial execution with one candidate. On Windows use an executable such as `node` and its script path; shell-only `.cmd` wrappers are not automatically enabled. Commands are project-authored configuration, never free-form model-generated commands. Projects consisting entirely of configured actions do not need a model CLI unless they enable a model-based review or planning workflow.
|
|
109
|
-
|
|
110
|
-
Implementation/review prompts now select task-relevant project context deterministically within a 6,000-character budget. A stable project/glossary prefix precedes ranked historical references with source paths and content hashes. Excerpts point back to complete files. This does not claim a fixed token count or guaranteed provider cache hit. Mandatory verification always reruns; no broad result cache or selective-test bypass was introduced.
|
|
111
|
-
|
|
112
|
-
## Parallelism and time estimates
|
|
113
|
-
|
|
114
|
-
Stories can declare relative file/directory scopes:
|
|
115
|
-
|
|
116
|
-
```yaml
|
|
117
|
-
- id: api-types
|
|
118
|
-
title: Update API types
|
|
119
|
-
priority: 1
|
|
120
|
-
area: api
|
|
121
|
-
writes: [src/api, tests/api]
|
|
122
|
-
needs: []
|
|
123
|
-
acceptance: ["Replace with executable structured criteria in strict projects"]
|
|
124
|
-
passes: false
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
Overlapping declared scopes cannot run simultaneously, including while integration is pending. Dependencies, areas, explicit priorities and concurrency limits also apply. Equal-priority work that unlocks a longer dependency chain is scheduled first. Declarations are advisory scheduling input, not filesystem write enforcement; absent declarations preserve previous behavior. Final integrated gates remain mandatory.
|
|
128
|
-
|
|
129
|
-
Versioned local events record status, phase duration, attempts and available usage. Retention is bounded to 1,000 events. Estimates combine historical and current durations, preserve failed-attempt cost and expose sample counts and empirical ranges. Schedule estimates simulate dependency, scope and concurrency constraints. Predictions and later errors are attached to completed attempt events so accuracy can be evaluated. Ranges describe observed data; they are not calibrated probabilities or exact deadlines. No history means no justified time estimate.
|
|
130
|
-
|
|
131
|
-
## Local project dashboard
|
|
132
|
-
|
|
133
|
-
### Execution defaults in 1.8.0
|
|
134
|
-
|
|
135
|
-
New setups enable routing, `loop.parallel: auto` and `loop.isolate: true`. Existing explicit settings remain authoritative. At execution time, automatic routing uses configured profiles; without profiles it keeps the selected parent. Explicit `--routing` without profiles still reports a configuration error. Routing rules bypass the controller and can escalate following failed independent gates, including across worktrees and restarts. Routing now also runs asynchronously inside parallel workers. An explicit task provider affinity takes precedence over routing.
|
|
136
|
-
|
|
137
|
-
Automatic parallelism allows at most three Yoke workers when every pending task declares nonempty write scopes. Dependencies and overlapping scopes still constrain dispatch. Unknown scopes, configured tool actions and worktree recovery select serial execution. Use `--parallel=N`, `--parallel=auto`, `--no-routing` or `--no-isolate` to override defaults. Serial worktrees retain failed work and require deliberate recovery; the default does not discard an existing recovery tree. Quality repair budgets and opt-in competing candidates retain their existing policies.
|
|
138
|
-
|
|
139
|
-
Integration retains an execution slot until its candidate lands. Yoke loop runners disable native delegation so it cannot multiply the default worker budget: Codex disables multi_agent; Claude disallows Agent, Task, TeamCreate and SendMessage; Gemini uses a separate temporary system-settings copy that disables experimental agents and its always-on investigator/help overrides. Existing Gemini system policy and system-default paths are preserved; unreadable or malformed policy blocks launch. Original settings are never overwritten. The temporary copy is removed on normal exit; forced process termination may leave a private temporary directory. Explicit competing candidate counts remain a separate opt-in workload.
|
|
140
|
-
|
|
141
|
-
### Dashboard views
|
|
142
|
-
|
|
143
|
-
- **Now:** reported task and worker activity, requested provider/model, elapsed worker time, phase, integration, blockers, status age, backlog and empirical remaining-time ranges. The view refreshes every five seconds while visible and not being operated with keyboard focus. A stale status is marked rather than asserted to be live.
|
|
144
|
-
- **Usage & time:** last 24 hours, 7/30/90/365 days or custom dates, grouped by UTC day, Monday-based week or month. Displays reported input/output and cache categories, cost coverage, consumption charts, per-model time buckets, per-task usage and summed phase/call durations. The overview also compares projects for the same period.
|
|
145
|
-
- **Results:** recorded acceptances, ended attempts, explicitly successful outcomes, repair phases, rule-driven escalations and recorded tokens/time per acceptance. Saved acceptance evidence and goal attempts remain available; their timestamps may fall outside the statistics period.
|
|
146
|
-
|
|
147
|
-
The short activity list still retains at most 1,000 events. Compact measurements now also persist under `.yoke/history/YYYY-MM-DD/` independently of that retention and across runs. They contain identifiers, model/provider evidence and measurements, not prompts or full status snapshots. Runtime history is excluded from Yoke commits and added to new project ignore rules. Available reviewer, quality critic and repair usage is recorded separately; absent usage is counted as unknown. Recent and archived records are deduplicated by event ID.
|
|
148
|
-
|
|
149
|
-
Dates and buckets use UTC. The custom end date is inclusive; the API uses an exclusive upper timestamp. Usage belongs to the time the provider reports it, and durations to their end time. Tokens per elapsed minute divide recorded input/output by the full selected interval. Tokens per call minute use summed reported call duration, which can overlap across workers. Neither is measured generation speed. Cache categories are shown separately without adding them to input again.
|
|
150
|
-
|
|
151
|
-
Historical activity that was never recorded or already expired cannot be reconstructed. Queue/human waiting time that lacks measurements remains unknown; phase and attempt durations are summed worker time, not automatically elapsed project time. Queries allow at most 366 days and bounded reads (8 MiB per shard, 32 MiB overall, 50,000 records); skipped, malformed or oversized history is reported as incomplete. History currently requires local disk retention rather than automatic monthly compaction. Unknown model identity is never replaced by a requested model, and missing charges are not estimated from token counts.
|
|
152
|
-
|
|
153
|
-
```sh
|
|
154
|
-
yoke projects add /path/to/project
|
|
155
|
-
yoke projects list
|
|
156
|
-
yoke dashboard .
|
|
157
|
-
yoke dashboard --no-register --port=4100
|
|
158
|
-
yoke projects remove <opaque-project-id>
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
Open the printed loopback URL. The dashboard displays project goals, backlog, worker/status data, evidence, blockers, events, usage availability and schedule ranges. It can request a goal pause through the same service as the CLI. Start, resume and budget changes remain explicit CLI operations. Removing registration only removes the registry reference.
|
|
162
|
-
|
|
163
|
-
The HTTP service binds to `127.0.0.1`, validates Host/Origin, requires a per-session token for pause, sends a restrictive CSP and renders project strings as text. It does not serve arbitrary local files or allow remote registration. Missing/corrupt/oversized project data is shown as unavailable. Shared project registration and protected acceptance live under `YOKE_STATE_DIR` or `~/.yoke/state`; existing routing history retains its `YOKE_REGISTRY_DIR` location. The dashboard is local, not a hosted multi-user service.
|
|
164
|
-
|
|
165
|
-
## Remaining validation and product work
|
|
166
|
-
|
|
167
|
-
Live Codex/Claude/Gemini comparisons, measured competitive development-time/cost studies and estimate calibration require representative real projects and authenticated runs. Equal adapter contracts do not imply equal model capability. Cloud/team access, automatic selective test reuse, web-based start/resume controls and commercial rollout are not included in this local foundation. The complete saved direction is in [PRODUCT-DIRECTION-2026-09-05.md](PRODUCT-DIRECTION-2026-09-05.md).
|
|
1
|
+
# Verified projects, goals and measured execution
|
|
2
|
+
|
|
3
|
+
Available in Yoke 1.7.0. These additions do not require a cloud account or replace your provider CLI. Model availability, reasoning controls, structured output and telemetry depend on the selected provider; unknown usage is never a measured zero. Live authenticated provider comparison and calibrated time/cost benchmarks remain separate validation work.
|
|
4
|
+
|
|
5
|
+
## Check an existing project
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
yoke check .
|
|
9
|
+
yoke check . --json
|
|
10
|
+
yoke check . --requirement="Guest checkout completes"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Checks run without retrofit. Exit codes: `0` passed, `1` failed, `2` unverified or unavailable. A free-text requirement stays unverified until you map its behavior to an executable acceptance contract. Passing a project suite does not establish arbitrary product correctness.
|
|
14
|
+
|
|
15
|
+
Create `.yoke/acceptance.yaml` with tests that inspect application behavior:
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
version: 1
|
|
19
|
+
protected:
|
|
20
|
+
- tests/acceptance/checkout.test.mjs
|
|
21
|
+
- tests/acceptance/helpers.mjs
|
|
22
|
+
criteria:
|
|
23
|
+
- id: guest-checkout
|
|
24
|
+
text: A guest can complete checkout and receives one order confirmation.
|
|
25
|
+
commands:
|
|
26
|
+
- node --test tests/acceptance/checkout.test.mjs
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
List every local test helper, fixture and configuration file whose modification could weaken this contract. Paths must resolve inside the project. `yoke check . --protect` pins the manifest, listed files and existing package manifests/lockfiles outside the worker checkout. Autonomous goals require explicit protected test infrastructure and establish this pin automatically. Protection is change detection within the local execution model, not an OS security boundary against a hostile process using your account. Review the contract before running a goal.
|
|
30
|
+
|
|
31
|
+
After intentionally editing protected tests, use `yoke check . --protect --refresh` to approve the new baseline. Ordinary checks and retries never refresh it. Source, acceptance and configuration identity are checked before and after verification; changed inputs invalidate evidence. Gitlinks/submodule directories currently fail closed because recursive identity is not implemented. Evidence is stored in `.yoke/checks/<id>.json`; it describes that checked snapshot and is not a permanent success certificate.
|
|
32
|
+
|
|
33
|
+
## Durable goals across providers
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
yoke goal set . --objective="Finish guest checkout" --attempts=3 --minutes=30
|
|
37
|
+
yoke goal run . --runner=codex
|
|
38
|
+
yoke goal resume . --runner=claude --model=<installed-model-id>
|
|
39
|
+
yoke goal resume . --runner=gemini --model=<installed-model-id>
|
|
40
|
+
yoke goal status .
|
|
41
|
+
yoke goal handoff .
|
|
42
|
+
yoke goal pause .
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Goals keep objective, attempts, failure context and check IDs in `.yoke/goal.json`. They share the story-loop lock. Each implementation attempt is followed by independent executable acceptance. A completed goal is checked again on a later run. Failed work stays in the project; goal execution itself does not commit or publish it. Goal handoff is readable context for native agent goal facilities; Yoke does not invent or call an undocumented native goal API.
|
|
46
|
+
|
|
47
|
+
`--minutes` limits cumulative agent execution time. Verification is measured separately and commands retain their verification timeout. `--tokens=N` is a checkpoint budget: it prevents another attempt when measured consumption is exhausted or unknown, but cannot promise a hard token cap within a single provider call. An interrupted attempt is persisted before dispatch; recovery accounts for it conservatively and reconciles recorded provider processes before continuing. Unknown process ownership blocks execution. Pause takes effect at an attempt boundary; it does not instantly kill an in-flight agent.
|
|
48
|
+
|
|
49
|
+
Explicitly extend total budgets without deleting history:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
yoke goal budget . --attempts=5 --minutes=60
|
|
53
|
+
yoke goal budget . --tokens=200000
|
|
54
|
+
# Only if you deliberately want to remove the checkpoint token limit:
|
|
55
|
+
yoke goal budget . --clear-token-budget
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Unknown historical token usage cannot be made known by increasing its limit. Inspect interrupted work and keep that limitation visible.
|
|
59
|
+
|
|
60
|
+
## Recover an isolated story
|
|
61
|
+
|
|
62
|
+
Failed or paused isolated story worktrees are retained. Resume the same story with:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
yoke loop run . --isolate --resume-worktree --parallel=1 --candidates=1
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Yoke validates the registered worktree, repository, original target commit and PRD digest. Changed target/PRD state is refused; inspect retained edits and reconcile deliberately. This flag is for serial isolated recovery; parallel workers retain their existing coordinator lifecycle. `yoke loop cleanup` remains an explicit cleanup operation; inspect its removal flags before discarding unfinished work. Existing projects should rerun retrofit to add ignore entries for checks, events and goals.
|
|
69
|
+
|
|
70
|
+
## Spend fewer model calls
|
|
71
|
+
|
|
72
|
+
Add explicit project rules to `.yoke/config.yaml`:
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
routing:
|
|
76
|
+
enabled: true
|
|
77
|
+
strategy: cost
|
|
78
|
+
maxCandidates: 2
|
|
79
|
+
workers:
|
|
80
|
+
- id: fast
|
|
81
|
+
agent: claude
|
|
82
|
+
model: <your-fast-model-id>
|
|
83
|
+
costTier: low
|
|
84
|
+
capabilities: [docs, tests]
|
|
85
|
+
- id: strong
|
|
86
|
+
agent: codex
|
|
87
|
+
model: <your-strong-model-id>
|
|
88
|
+
costTier: high
|
|
89
|
+
capabilities: [implementation]
|
|
90
|
+
rules:
|
|
91
|
+
- area: docs
|
|
92
|
+
worker: fast
|
|
93
|
+
escalateTo: strong
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The first matching rule bypasses the routing controller. Its optional area and story ID selectors both have to match when supplied. Independent gate failure escalates the next attempt, including after loop restart; an unavailable or unknown worker falls back to the parent. Without an explicit escalation target the parent handles the failed rule. Other stories retain adaptive routing. Gate-driven routing observations are local and bounded when read. These are measured outcomes, not guarantees that a named inexpensive model can handle every task.
|
|
97
|
+
|
|
98
|
+
For deterministic operations, configure exact executable arguments:
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
actions:
|
|
102
|
+
- storyId: regenerate-types
|
|
103
|
+
file: node
|
|
104
|
+
args: [scripts/generate-types.mjs]
|
|
105
|
+
timeoutMs: 60000
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Actions use no model, run without a shell, have bounded output/time and still pass the ordinary story gates before commit. They currently require serial execution with one candidate. On Windows use an executable such as `node` and its script path; shell-only `.cmd` wrappers are not automatically enabled. Commands are project-authored configuration, never free-form model-generated commands. Projects consisting entirely of configured actions do not need a model CLI unless they enable a model-based review or planning workflow.
|
|
109
|
+
|
|
110
|
+
Implementation/review prompts now select task-relevant project context deterministically within a 6,000-character budget. A stable project/glossary prefix precedes ranked historical references with source paths and content hashes. Excerpts point back to complete files. This does not claim a fixed token count or guaranteed provider cache hit. Mandatory verification always reruns; no broad result cache or selective-test bypass was introduced.
|
|
111
|
+
|
|
112
|
+
## Parallelism and time estimates
|
|
113
|
+
|
|
114
|
+
Stories can declare relative file/directory scopes:
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
- id: api-types
|
|
118
|
+
title: Update API types
|
|
119
|
+
priority: 1
|
|
120
|
+
area: api
|
|
121
|
+
writes: [src/api, tests/api]
|
|
122
|
+
needs: []
|
|
123
|
+
acceptance: ["Replace with executable structured criteria in strict projects"]
|
|
124
|
+
passes: false
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Overlapping declared scopes cannot run simultaneously, including while integration is pending. Dependencies, areas, explicit priorities and concurrency limits also apply. Equal-priority work that unlocks a longer dependency chain is scheduled first. Declarations are advisory scheduling input, not filesystem write enforcement; absent declarations preserve previous behavior. Final integrated gates remain mandatory.
|
|
128
|
+
|
|
129
|
+
Versioned local events record status, phase duration, attempts and available usage. Retention is bounded to 1,000 events. Estimates combine historical and current durations, preserve failed-attempt cost and expose sample counts and empirical ranges. Schedule estimates simulate dependency, scope and concurrency constraints. Predictions and later errors are attached to completed attempt events so accuracy can be evaluated. Ranges describe observed data; they are not calibrated probabilities or exact deadlines. No history means no justified time estimate.
|
|
130
|
+
|
|
131
|
+
## Local project dashboard
|
|
132
|
+
|
|
133
|
+
### Execution defaults in 1.8.0
|
|
134
|
+
|
|
135
|
+
New setups enable routing, `loop.parallel: auto` and `loop.isolate: true`. Existing explicit settings remain authoritative. At execution time, automatic routing uses configured profiles; without profiles it keeps the selected parent. Explicit `--routing` without profiles still reports a configuration error. Routing rules bypass the controller and can escalate following failed independent gates, including across worktrees and restarts. Routing now also runs asynchronously inside parallel workers. An explicit task provider affinity takes precedence over routing.
|
|
136
|
+
|
|
137
|
+
Automatic parallelism allows at most three Yoke workers when every pending task declares nonempty write scopes. Dependencies and overlapping scopes still constrain dispatch. Unknown scopes, configured tool actions and worktree recovery select serial execution. Use `--parallel=N`, `--parallel=auto`, `--no-routing` or `--no-isolate` to override defaults. Serial worktrees retain failed work and require deliberate recovery; the default does not discard an existing recovery tree. Quality repair budgets and opt-in competing candidates retain their existing policies.
|
|
138
|
+
|
|
139
|
+
Integration retains an execution slot until its candidate lands. Yoke loop runners disable native delegation so it cannot multiply the default worker budget: Codex disables multi_agent; Claude disallows Agent, Task, TeamCreate and SendMessage; Gemini uses a separate temporary system-settings copy that disables experimental agents and its always-on investigator/help overrides. Existing Gemini system policy and system-default paths are preserved; unreadable or malformed policy blocks launch. Original settings are never overwritten. The temporary copy is removed on normal exit; forced process termination may leave a private temporary directory. Explicit competing candidate counts remain a separate opt-in workload.
|
|
140
|
+
|
|
141
|
+
### Dashboard views
|
|
142
|
+
|
|
143
|
+
- **Now:** reported task and worker activity, requested provider/model, elapsed worker time, phase, integration, blockers, status age, backlog and empirical remaining-time ranges. The view refreshes every five seconds while visible and not being operated with keyboard focus. A stale status is marked rather than asserted to be live.
|
|
144
|
+
- **Usage & time:** last 24 hours, 7/30/90/365 days or custom dates, grouped by UTC day, Monday-based week or month. Displays reported input/output and cache categories, cost coverage, consumption charts, per-model time buckets, per-task usage and summed phase/call durations. The overview also compares projects for the same period.
|
|
145
|
+
- **Results:** recorded acceptances, ended attempts, explicitly successful outcomes, repair phases, rule-driven escalations and recorded tokens/time per acceptance. Saved acceptance evidence and goal attempts remain available; their timestamps may fall outside the statistics period.
|
|
146
|
+
|
|
147
|
+
The short activity list still retains at most 1,000 events. Compact measurements now also persist under `.yoke/history/YYYY-MM-DD/` independently of that retention and across runs. They contain identifiers, model/provider evidence and measurements, not prompts or full status snapshots. Runtime history is excluded from Yoke commits and added to new project ignore rules. Available reviewer, quality critic and repair usage is recorded separately; absent usage is counted as unknown. Recent and archived records are deduplicated by event ID.
|
|
148
|
+
|
|
149
|
+
Dates and buckets use UTC. The custom end date is inclusive; the API uses an exclusive upper timestamp. Usage belongs to the time the provider reports it, and durations to their end time. Tokens per elapsed minute divide recorded input/output by the full selected interval. Tokens per call minute use summed reported call duration, which can overlap across workers. Neither is measured generation speed. Cache categories are shown separately without adding them to input again.
|
|
150
|
+
|
|
151
|
+
Historical activity that was never recorded or already expired cannot be reconstructed. Queue/human waiting time that lacks measurements remains unknown; phase and attempt durations are summed worker time, not automatically elapsed project time. Queries allow at most 366 days and bounded reads (8 MiB per shard, 32 MiB overall, 50,000 records); skipped, malformed or oversized history is reported as incomplete. History currently requires local disk retention rather than automatic monthly compaction. Unknown model identity is never replaced by a requested model, and missing charges are not estimated from token counts.
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
yoke projects add /path/to/project
|
|
155
|
+
yoke projects list
|
|
156
|
+
yoke dashboard .
|
|
157
|
+
yoke dashboard --no-register --port=4100
|
|
158
|
+
yoke projects remove <opaque-project-id>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Open the printed loopback URL. The dashboard displays project goals, backlog, worker/status data, evidence, blockers, events, usage availability and schedule ranges. It can request a goal pause through the same service as the CLI. Start, resume and budget changes remain explicit CLI operations. Removing registration only removes the registry reference.
|
|
162
|
+
|
|
163
|
+
The HTTP service binds to `127.0.0.1`, validates Host/Origin, requires a per-session token for pause, sends a restrictive CSP and renders project strings as text. It does not serve arbitrary local files or allow remote registration. Missing/corrupt/oversized project data is shown as unavailable. Shared project registration and protected acceptance live under `YOKE_STATE_DIR` or `~/.yoke/state`; existing routing history retains its `YOKE_REGISTRY_DIR` location. The dashboard is local, not a hosted multi-user service.
|
|
164
|
+
|
|
165
|
+
## Remaining validation and product work
|
|
166
|
+
|
|
167
|
+
Live Codex/Claude/Gemini comparisons, measured competitive development-time/cost studies and estimate calibration require representative real projects and authenticated runs. Equal adapter contracts do not imply equal model capability. Cloud/team access, automatic selective test reuse, web-based start/resume controls and commercial rollout are not included in this local foundation. The complete saved direction is in [PRODUCT-DIRECTION-2026-09-05.md](PRODUCT-DIRECTION-2026-09-05.md).
|