planr 1.10.0-alpha.9 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.claude-plugin/plugin.json +11 -0
  2. package/CHANGELOG.md +20 -0
  3. package/README.md +27 -245
  4. package/docs/board.md +44 -0
  5. package/docs/cli.md +100 -0
  6. package/docs/concepts.md +133 -0
  7. package/docs/contract.md +150 -0
  8. package/docs/plugins/bb.md +49 -0
  9. package/docs/plugins/claude-code.md +84 -0
  10. package/docs/plugins/codex.md +77 -0
  11. package/docs/quickstart.md +307 -0
  12. package/docs/setup.md +103 -0
  13. package/package.json +21 -68
  14. package/plugin.json +12 -0
  15. package/skills/planr/SKILL.md +64 -0
  16. package/skills/planr/assets/board/fonts/LICENSE-mona-sans.txt +93 -0
  17. package/skills/planr/assets/board/fonts/LICENSE-monaspace.txt +93 -0
  18. package/skills/planr/assets/board/fonts/MonaSans-Variable.woff2 +0 -0
  19. package/skills/planr/assets/board/fonts/MonaspaceNeon-400.woff2 +0 -0
  20. package/skills/planr/assets/board/fonts/MonaspaceNeon-500.woff2 +0 -0
  21. package/skills/planr/assets/board/fonts/MonaspaceNeon-600.woff2 +0 -0
  22. package/skills/planr/assets/board/template.html +788 -0
  23. package/skills/planr/assets/templates/goal.md +13 -0
  24. package/skills/planr/assets/templates/hook.sh +4 -0
  25. package/skills/planr/assets/templates/in-repo.config.json +6 -0
  26. package/skills/planr/assets/templates/planr.config.json +6 -0
  27. package/skills/planr/assets/templates/tasks-README.md +14 -0
  28. package/skills/planr/references/format.md +88 -0
  29. package/skills/planr/references/work-a-goal.md +62 -0
  30. package/skills/planr/scripts/lib/board.mjs +39 -0
  31. package/skills/planr/scripts/lib/graph.mjs +345 -0
  32. package/skills/planr/scripts/lib/runs.mjs +127 -0
  33. package/skills/planr/scripts/lib/version.mjs +11 -0
  34. package/skills/planr/scripts/planr.mjs +386 -0
  35. package/docs/ARCHITECTURE.md +0 -136
  36. package/docs/RELEASE.md +0 -275
  37. package/docs/SWITCHLOOM_COMPATIBILITY.md +0 -14
  38. package/docs/contracts/BROWSER_HARNESS_ADAPTER_V1.md +0 -75
  39. package/docs/contracts/EVAL_CONTRACT_V1.md +0 -2072
  40. package/docs/contracts/EVIDENCE_ADAPTER_PROTOCOL_V1.md +0 -98
  41. package/docs/contracts/EVIDENCE_CONTRACT_V1.md +0 -382
  42. package/docs/contracts/GROK_INTEGRATION_V1.md +0 -139
  43. package/docs/contracts/LINUX_RELEASE_PORTABILITY.json +0 -9
  44. package/docs/contracts/PI_INTEGRATION_V1.md +0 -164
  45. package/docs/contracts/V1_1_DIFFERENTIATION_CONTRACT.md +0 -177
  46. package/docs/contracts/fixtures/evidence/v1/examples/coverage-verdict.json +0 -66
  47. package/docs/contracts/fixtures/evidence/v1/examples/evidence-attempt.json +0 -39
  48. package/docs/contracts/fixtures/evidence/v1/examples/evidence-policy.json +0 -108
  49. package/docs/contracts/fixtures/evidence/v1/examples/evidence-receipt.json +0 -93
  50. package/docs/contracts/fixtures/evidence/v1/examples/evidence-waiver.json +0 -31
  51. package/docs/contracts/fixtures/evidence/v1/examples/proof-obligation.json +0 -55
  52. package/docs/contracts/fixtures/evidence/v1/examples/proof-preset.json +0 -19
  53. package/docs/contracts/fixtures/evidence/v1/examples/untrusted-evidence-proposal.json +0 -20
  54. package/docs/contracts/fixtures/evidence/v1/examples/verification-capability-instance.json +0 -39
  55. package/docs/contracts/fixtures/evidence/v1/examples/verification-capability-manifest.json +0 -52
  56. package/docs/contracts/fixtures/evidence/v1/negative/aborted-zero-exit-attempt.json +0 -39
  57. package/docs/contracts/fixtures/evidence/v1/negative/adapter-registration-missing-execution-contract.json +0 -88
  58. package/docs/contracts/fixtures/evidence/v1/negative/available-empty-probe-capability.json +0 -27
  59. package/docs/contracts/fixtures/evidence/v1/negative/blocked-coverage-with-stale-reason.json +0 -27
  60. package/docs/contracts/fixtures/evidence/v1/negative/empty-trust-bindings-receipt.json +0 -72
  61. package/docs/contracts/fixtures/evidence/v1/negative/failed-zero-exit-attempt.json +0 -39
  62. package/docs/contracts/fixtures/evidence/v1/negative/forged-trusted-receipt.json +0 -35
  63. package/docs/contracts/fixtures/evidence/v1/negative/inconclusive-clean-exit-attempt.json +0 -39
  64. package/docs/contracts/fixtures/evidence/v1/negative/inconclusive-coverage-with-blocked-reason.json +0 -27
  65. package/docs/contracts/fixtures/evidence/v1/negative/minimal-policy-missing-owned-inputs.json +0 -5
  66. package/docs/contracts/fixtures/evidence/v1/negative/mismatched-probe-execution-id-capability.json +0 -42
  67. package/docs/contracts/fixtures/evidence/v1/negative/passed-empty-attempt.json +0 -22
  68. package/docs/contracts/fixtures/evidence/v1/negative/policy-default-preset-unregistered.json +0 -102
  69. package/docs/contracts/fixtures/evidence/v1/negative/policy-weakening-without-waiver.json +0 -102
  70. package/docs/contracts/fixtures/evidence/v1/negative/process-probe-missing-output-limits.json +0 -49
  71. package/docs/contracts/fixtures/evidence/v1/negative/satisfied-empty-coverage-verdict.json +0 -14
  72. package/docs/contracts/fixtures/evidence/v1/negative/skipped-zero-exit-attempt.json +0 -39
  73. package/docs/contracts/fixtures/evidence/v1/negative/stale-coverage-with-inconclusive-reason.json +0 -27
  74. package/docs/contracts/fixtures/evidence/v1/negative/timed-out-zero-exit-attempt.json +0 -39
  75. package/docs/contracts/fixtures/evidence/v1/negative/unavailable-zero-exit-attempt.json +0 -39
  76. package/docs/contracts/fixtures/evidence/v1/negative/unbound-waiver.json +0 -21
  77. package/docs/contracts/fixtures/evidence/v1/negative/unsatisfied-coverage-without-gap.json +0 -63
  78. package/docs/contracts/fixtures/evidence/v1/negative/waived-coverage-forbidden-gap-reason.json +0 -28
  79. package/docs/contracts/fixtures/evidence/v1/negative/waived-coverage-missing-waiver-id.json +0 -27
  80. package/docs/contracts/fixtures/evidence/v1/schemas/evidence-contract-v1.schema.json +0 -2685
  81. package/docs/contracts/schemas/com.planr.web.dom_state.v1.schema.json +0 -30
  82. package/docs/documentation/CONTRACT.md +0 -164
  83. package/docs/documentation/COVERAGE.md +0 -98
  84. package/docs/documentation/INFORMATION_ARCHITECTURE.md +0 -151
  85. package/docs/fixtures/mcp-contract.json +0 -153
  86. package/npm/bin/native-launcher.js +0 -67
  87. package/npm/bin/planr-browser-harness-adapter.js +0 -8
  88. package/npm/bin/planr.js +0 -8
  89. package/npm/native/darwin-arm64/planr +0 -0
  90. package/npm/native/darwin-arm64/planr-browser-harness-adapter +0 -0
  91. package/npm/native/darwin-arm64/planr-host-capability-validator +0 -0
  92. package/npm/native/darwin-x86_64/planr +0 -0
  93. package/npm/native/darwin-x86_64/planr-browser-harness-adapter +0 -0
  94. package/npm/native/darwin-x86_64/planr-host-capability-validator +0 -0
  95. package/npm/native/linux-arm64/planr +0 -0
  96. package/npm/native/linux-arm64/planr-browser-harness-adapter +0 -0
  97. package/npm/native/linux-arm64/planr-host-capability-validator +0 -0
  98. package/npm/native/linux-x86_64/planr +0 -0
  99. package/npm/native/linux-x86_64/planr-browser-harness-adapter +0 -0
  100. package/npm/native/linux-x86_64/planr-host-capability-validator +0 -0
  101. package/plugins/planr/.claude-plugin/plugin.json +0 -11
  102. package/plugins/planr/.codex-plugin/plugin.json +0 -25
  103. package/plugins/planr/agents/pi/planr-reviewer.md +0 -20
  104. package/plugins/planr/agents/pi/planr-worker.md +0 -35
  105. package/plugins/planr/agents/planr-reviewer.md +0 -21
  106. package/plugins/planr/agents/planr-worker.md +0 -40
  107. package/plugins/planr/skills/planr/SKILL.md +0 -60
  108. package/plugins/planr/skills/planr-goal/SKILL.md +0 -52
  109. package/plugins/planr/skills/planr-loop/SKILL.md +0 -126
  110. package/plugins/planr/skills/planr-loop/agents/planr-reviewer.md +0 -21
  111. package/plugins/planr/skills/planr-loop/agents/planr-worker.md +0 -36
  112. package/plugins/planr/skills/planr-loop/references/host-dispatch.md +0 -52
  113. package/plugins/planr/skills/planr-loop/references/recovery-and-verification.md +0 -26
  114. package/plugins/planr/skills/planr-plan/SKILL.md +0 -86
  115. package/plugins/planr/skills/planr-review/SKILL.md +0 -55
  116. package/plugins/planr/skills/planr-status/SKILL.md +0 -52
  117. package/plugins/planr/skills/planr-summary/SKILL.md +0 -30
  118. package/plugins/planr/skills/planr-task-graph/SKILL.md +0 -67
  119. package/plugins/planr/skills/planr-verify-web/SKILL.md +0 -62
  120. package/plugins/planr/skills/planr-work/SKILL.md +0 -93
  121. package/scripts/host-capability-experiment.mjs +0 -2481
  122. package/scripts/host-capability-runtime/v1/schemas/host-capability-expected-manifest.schema.json +0 -377
  123. package/scripts/host-capability-runtime/v1/schemas/host-capability-observed-raw.schema.json +0 -439
  124. package/scripts/host-capability-runtime/v1/schemas/host-capability-provenance.schema.json +0 -178
  125. package/scripts/planr-host-capability-validator +0 -57
  126. /package/{LICENSE.md → LICENSE} +0 -0
@@ -1,164 +0,0 @@
1
- # Pi Integration Contract v1
2
-
3
- Status: frozen for implementation
4
-
5
- Frozen: 2026-07-27
6
-
7
- Upstream source probes:
8
-
9
- - `earendil-works/pi` `main` commit
10
- `a597371bda2af70372d1323d550483b5f4a0ae36` (2026-07-27).
11
- - Pi release `v0.82.1` commit
12
- `b4f293684bba718d59cc1157679bcf6157b3a7f5` (2026-07-27).
13
- - `nicobailon/pi-subagents` `main` commit `73fb2fc` (2026-07-27).
14
-
15
- The Pi repository currently publishes release tags ahead of the fetched
16
- `main` version line, so this contract records both: `main` is the requested
17
- source probe, while `v0.82.1` is the latest released runtime/API baseline.
18
-
19
- This contract is the implementation boundary for first-class Pi support.
20
- It follows Pi's native extension model instead of treating every coding agent
21
- as an MCP host. Pi core deliberately ships without MCP, subagents, plan mode,
22
- or permission popups. It natively discovers Agent Skills and can run their CLI
23
- workflows through its built-in `bash` tool.
24
-
25
- ## Frozen artifact and discovery policy
26
-
27
- `planr install pi` owns exactly the repository paths in the executable
28
- contract below. Workflow files are copied byte-for-byte from the canonical
29
- `plugins/planr/skills` sources. Pi-specific role bodies exist only because
30
- `pi-subagents` frontmatter is not interchangeable with Claude/Cursor role
31
- frontmatter: it uses `thinking`, explicit tool/skill inheritance controls, and
32
- project agents under `.pi/agents/**/*.md`.
33
-
34
- Pi loads `.pi/skills/` only after the repository is trusted. Interactive Pi
35
- asks for trust; non-interactive `-p`, JSON, and RPC runs ignore untrusted
36
- project resources by default. A headless operator who has deliberately chosen
37
- to trust the repository passes `--approve` for that run. Planr never writes
38
- Pi's user trust store or `.pi/settings.json`.
39
-
40
- `pi-subagents` is optional. When installed, it discovers both Planr roles.
41
- Without it, the role files are inert and the same Planr skills remain usable
42
- in the parent Pi session or separate Pi processes.
43
-
44
- ```json
45
- {
46
- "contract_version": 1,
47
- "pi_main_revision": "a597371bda2af70372d1323d550483b5f4a0ae36",
48
- "pi_release": {
49
- "tag": "v0.82.1",
50
- "revision": "b4f293684bba718d59cc1157679bcf6157b3a7f5"
51
- },
52
- "pi_subagents_revision": "73fb2fc",
53
- "artifacts": [
54
- {"target": ".pi/agents/planr-reviewer.md", "source": "plugins/planr/agents/pi/planr-reviewer.md", "kind": "agent"},
55
- {"target": ".pi/agents/planr-worker.md", "source": "plugins/planr/agents/pi/planr-worker.md", "kind": "agent"},
56
- {"target": ".pi/skills/planr-goal/SKILL.md", "source": "plugins/planr/skills/planr-goal/SKILL.md", "kind": "skill"},
57
- {"target": ".pi/skills/planr-loop/SKILL.md", "source": "plugins/planr/skills/planr-loop/SKILL.md", "kind": "skill"},
58
- {"target": ".pi/skills/planr-loop/agents/planr-reviewer.md", "source": "plugins/planr/skills/planr-loop/agents/planr-reviewer.md", "kind": "skill_asset"},
59
- {"target": ".pi/skills/planr-loop/agents/planr-worker.md", "source": "plugins/planr/skills/planr-loop/agents/planr-worker.md", "kind": "skill_asset"},
60
- {"target": ".pi/skills/planr-loop/references/host-dispatch.md", "source": "plugins/planr/skills/planr-loop/references/host-dispatch.md", "kind": "skill_asset"},
61
- {"target": ".pi/skills/planr-loop/references/recovery-and-verification.md", "source": "plugins/planr/skills/planr-loop/references/recovery-and-verification.md", "kind": "skill_asset"},
62
- {"target": ".pi/skills/planr-plan/SKILL.md", "source": "plugins/planr/skills/planr-plan/SKILL.md", "kind": "skill"},
63
- {"target": ".pi/skills/planr-review/SKILL.md", "source": "plugins/planr/skills/planr-review/SKILL.md", "kind": "skill"},
64
- {"target": ".pi/skills/planr-status/SKILL.md", "source": "plugins/planr/skills/planr-status/SKILL.md", "kind": "skill"},
65
- {"target": ".pi/skills/planr-summary/SKILL.md", "source": "plugins/planr/skills/planr-summary/SKILL.md", "kind": "skill"},
66
- {"target": ".pi/skills/planr-task-graph/SKILL.md", "source": "plugins/planr/skills/planr-task-graph/SKILL.md", "kind": "skill"},
67
- {"target": ".pi/skills/planr-verify-web/SKILL.md", "source": "plugins/planr/skills/planr-verify-web/SKILL.md", "kind": "skill"},
68
- {"target": ".pi/skills/planr-work/SKILL.md", "source": "plugins/planr/skills/planr-work/SKILL.md", "kind": "skill"},
69
- {"target": ".pi/skills/planr/SKILL.md", "source": "plugins/planr/skills/planr/SKILL.md", "kind": "skill"}
70
- ],
71
- "mcp": {"supported": false, "artifacts": []},
72
- "extensions": {"emitted": false, "artifacts": []},
73
- "hooks": {"supported": false, "artifacts": []},
74
- "settings": {"emitted": false, "artifacts": []},
75
- "trust": {
76
- "project_resources_require_trust": true,
77
- "interactive": "Pi prompts the operator",
78
- "headless": "pass --approve only after choosing to trust the repository"
79
- },
80
- "observed_client": {
81
- "environment": "PI_CODING_AGENT",
82
- "accepted_value": "true",
83
- "stored_value": "pi",
84
- "advisory_only": true
85
- },
86
- "client_all_includes_pi": false,
87
- "headless": {
88
- "command": "pi --approve --model <provider/model> --thinking <level> -p \"<prompt>\""
89
- }
90
- }
91
- ```
92
-
93
- ## Pi role contract
94
-
95
- Both role files use `pi-subagents` project-agent frontmatter:
96
-
97
- - `name` is exactly `planr-worker` or `planr-reviewer`;
98
- - `systemPromptMode: replace`;
99
- - `inheritProjectContext: true`;
100
- - `inheritSkills: false`;
101
- - `skills` names exactly `planr-work` or `planr-review`;
102
- - the worker tool allowlist includes read/search, `bash`, `edit`, and `write`;
103
- - the reviewer tool allowlist includes read/search and mutation-capable `bash`,
104
- but omits the `edit` and `write` tools;
105
- - the reviewer declares `acceptanceRole: read-only` and
106
- `completionGuard: false`, so pi-subagents treats the bash-enabled validator
107
- as non-implementation work without changing its tool access;
108
- - no role pins `model`, `thinking`, `fallbackModels`, provider credentials, or
109
- extensions.
110
-
111
- Model and thinking selection remain external host policy. Operators can use
112
- Pi or `pi-subagents` settings/overrides, while Planr records only requested and
113
- observed evidence.
114
-
115
- ## Merge and overwrite policy
116
-
117
- - Missing target: write the canonical packaged source.
118
- - Existing identical content: unchanged.
119
- - Existing different content: preserve without `--force`; replace only that
120
- target with `--force`.
121
- - `--no-mcp` and `--no-hooks` are accepted for install-command parity but
122
- change no Pi path because the v1 artifact set contains neither.
123
- - Dry-run enumerates the same paths the corresponding write reconciles.
124
- - `project init --client pi` provisions the same skills and roles without
125
- writing any other Pi artifact.
126
- - `--client all` remains the legacy Codex, Claude Code, and Cursor expansion.
127
-
128
- ## Runtime observation boundary
129
-
130
- Pi documents that commands launched by its built-in tools receive
131
- `PI_CODING_AGENT=true`. Planr accepts only that exact value as advisory
132
- `runs.observed_client=pi`. Other values and other ambient `PI_*` variables are
133
- ignored. The marker is not authentication, authorization, proof of model,
134
- proof of `pi-subagents`, or worker identity.
135
-
136
- Pi has no Planr hook in v1. Run `planr prime` manually after startup or
137
- compaction when a fresh state block is useful. Agent Skills remain the primary
138
- entry point: `/skill:planr` explicitly loads the router, while natural-language
139
- requests may trigger Pi's skill discovery.
140
-
141
- ## Security and CI boundary
142
-
143
- Planr installation must not read or write:
144
-
145
- - `~/.pi`, Pi auth files, provider keys, OAuth tokens, sessions, transcripts,
146
- prompts, responses, model catalogs, package caches, or trust decisions;
147
- - `.pi/settings.json`, `.pi/extensions/`, `.pi/prompts/`, or an MCP config;
148
- - global `pi install`, `pi config`, package enablement, or user settings.
149
-
150
- Release and CI workflows do not install/invoke Pi, `pi-subagents`, a provider,
151
- or a live model. Deterministic tests parse the frozen contract, compile/write
152
- assets into disposable repositories, and validate CLI/docs output.
153
-
154
- ## Sources
155
-
156
- - `packages/coding-agent/README.md` at Pi `v0.82.1`: project trust, skills,
157
- extensions, packages, philosophy, CLI, and `PI_CODING_AGENT`.
158
- - `packages/coding-agent/docs/skills.md` at Pi `v0.82.1`.
159
- - `nicobailon/pi-subagents` README at `73fb2fc`: project agent discovery,
160
- prompt assembly, frontmatter, and model overrides.
161
- - `nicobailon/pi-subagents` `test/unit/agent-frontmatter.test.ts` and
162
- `test/unit/path-resolution.test.ts` at `73fb2fc`.
163
- - https://github.com/earendil-works/pi
164
- - https://github.com/nicobailon/pi-subagents
@@ -1,177 +0,0 @@
1
- # V1.1 Differentiation Contract
2
-
3
- Generated: 2026-06-09
4
-
5
- ## Purpose
6
-
7
- This contract defines the Planr-owned V1.1 acceptance baseline. It turns the remaining product gaps into implementation-ready requirements without relying on external product names, copied command vocabulary, or hidden context.
8
-
9
- V1.1 is complete only when Planr can prove these capabilities from its own CLI, MCP, HTTP, durable FeatureRun/ReviewGate state, docs, tests, and real consumer usage.
10
-
11
- ## Product Outcome
12
-
13
- Planr V1.1 must feel like one coherent product:
14
-
15
- ```text
16
- idea -> product plan -> build plan -> map -> pick -> work -> log -> review -> recover -> close
17
- ```
18
-
19
- The map remains the source of truth for execution state. Markdown plans remain the source of rich product and implementation context. Review and recovery must be evidence-backed, not optimistic.
20
-
21
- ## Capability Requirements
22
-
23
- ### Graph Intelligence
24
-
25
- - REQ-V11-GRAPH-001: `planr map lane --critical` must compute a real critical path across blocking graph edges, not just sort open items by priority.
26
- - REQ-V11-GRAPH-002: `planr map pressure` must report transitive downstream impact, direct blockers, and why each item matters.
27
- - REQ-V11-GRAPH-003: Map reads must detect and report cycles with enough edge detail for a user or agent to repair the graph.
28
- - REQ-V11-GRAPH-004: Unlock and lookahead views must explain what becomes ready after closure, what remains blocked, and which blockers are still active.
29
- - REQ-V11-GRAPH-005: Mutation previews must share one effect engine for close, cancel, insert, replan, and dependency rewires.
30
- - REQ-V11-GRAPH-006: CLI, MCP, HTTP, and JSON responses must use the same graph-analysis results.
31
-
32
- Acceptance:
33
-
34
- - A branched fixture with deep dependencies returns the mathematically longest open blocking path.
35
- - A transitive bottleneck ranks above a shallow item that only blocks one direct child.
36
- - A cyclic graph is refused or diagnosed before readiness or critical-path output becomes misleading.
37
-
38
- ### Automatic Pick Recall
39
-
40
- - REQ-V11-RECALL-001: `planr pick` and `planr_pick_item` must return a compact task-start package.
41
- - REQ-V11-RECALL-002: The package must include ranked relevant project contexts, upstream logs or handoffs, linked plan references, active blockers or unlocks, ReviewGate history, and deeper-read commands.
42
- - REQ-V11-RECALL-003: Recall ranking must search item title, description, linked plan metadata, contexts, logs, and review summaries.
43
- - REQ-V11-RECALL-004: Pick recall must be size-bounded and avoid source file content, prompt transcripts, secret-looking values, and large artifacts by default.
44
- - REQ-V11-RECALL-005: Possible file conflicts must be surfaced from recent logs, artifacts, and active picked/running work when enough path evidence exists.
45
-
46
- Acceptance:
47
-
48
- - A task with relevant historical decisions receives those decisions without the user running a separate search.
49
- - Irrelevant contexts are omitted or ranked below relevant ones.
50
- - The response remains compact enough for an agent handoff and includes deeper-read commands for full detail.
51
-
52
- ### Recovery Automation
53
-
54
- - REQ-V11-RECOVERY-001: Planr must provide a sweeper command and API that inspect interrupted work without silently mutating by default.
55
- - REQ-V11-RECOVERY-002: Timeouts must be stored on items and evaluated consistently for CLI, MCP, and HTTP flows.
56
- - REQ-V11-RECOVERY-003: Retry policy must support max attempts, retry count, fixed or exponential delay, and clear terminal state when retries are exhausted.
57
- - REQ-V11-RECOVERY-004: Stale picks must be reclaimable only through explicit recovery action or a documented sweeper mode.
58
- - REQ-V11-RECOVERY-005: Item preconditions and postconditions must be visible in pick, trace, review, and close-preview outputs.
59
- - REQ-V11-RECOVERY-006: Close preview must show unsatisfied conditions, missing evidence, open reviews, open child work, and approval blockers in one gate report.
60
-
61
- Acceptance:
62
-
63
- - An interrupted picked item is diagnosed, optionally released, and then picked by a later worker without duplicate ownership.
64
- - A failed retryable item returns to ready only after the documented delay.
65
- - A postcondition appears in review and close-preview output before the item closes.
66
-
67
- ### Durable FeatureRun Review Gates
68
-
69
- - REQ-V11-REVIEW-001: FeatureRun settlement must create or reuse durable ReviewGates according to materiality and structured escalation policy.
70
- - REQ-V11-REVIEW-002: ReviewGate attempts must record independent reviewer identity, verdict, findings, and immutable attempt history.
71
- - REQ-V11-REVIEW-003: When Git evidence is available, review evidence must show scoped file changes or a clear explanation of missing diff context.
72
- - REQ-V11-REVIEW-004: Findings must pause settlement, remain durable on the gate, and return the same gate to pending re-review only after explicit resolution.
73
- - REQ-V11-REVIEW-005: Final product review must use exactly one accepted independent plan-scoped ReviewGate and project consistently through CLI, MCP, HTTP, audit, status, package, and trace surfaces.
74
-
75
- Acceptance:
76
-
77
- - A reviewer can lease a ReviewGate, inspect scoped evidence, and record either acceptance or durable findings.
78
- - A maker can resolve named findings and the same gate becomes available for independent re-review.
79
- - An accepted final ReviewGate makes the canonical plan audit clause pass without creating review/fix map items.
80
-
81
- ### Scoped Git And PR Review
82
-
83
- - REQ-V11-GIT-001: Planr must detect the current Git worktree and record branch, commit, dirty state, and changed-file scope in review evidence.
84
- - REQ-V11-GIT-002: Review flows must distinguish agent-owned evidence from unrelated dirty files.
85
- - REQ-V11-GIT-003: Item logs and artifacts must be able to reference changed files and line-level findings without storing full source contents by default.
86
- - REQ-V11-GIT-004: Optional PR URL review may be implemented when a provider can be queried safely; otherwise V1.1 must clearly document local-only behavior and future PR support.
87
- - REQ-V11-GIT-005: Review output must tie findings to item id, file path, optional line, evidence source, and next action.
88
-
89
- Acceptance:
90
-
91
- - A dirty worktree with unrelated files does not let an agent claim broad ownership.
92
- - ReviewGate attempts show which evidence was considered and which files were excluded.
93
- - Durable findings and file/line annotations survive package projection.
94
-
95
- ### Distribution And Client Setup
96
-
97
- - REQ-V11-DIST-001: README and install docs must make GitHub Release curl installation the normal user path.
98
- - REQ-V11-DIST-002: Homebrew instructions must be present as soon as a tap or formula path exists; until then docs must state the release condition clearly.
99
- - REQ-V11-DIST-003: Cargo and source build instructions must be maintainer/developer paths, not the primary user install story.
100
- - REQ-V11-DIST-004: `planr install` or equivalent setup commands must cover Codex, Claude Code, Cursor, and generic MCP without editing global configuration unexpectedly.
101
- - REQ-V11-DIST-005: `planr prompt` or an equivalent command must expose ready-to-use CLI, MCP, and HTTP instructions.
102
- - REQ-V11-DIST-006: Release artifacts must have checksums and documented verification steps.
103
-
104
- Acceptance:
105
-
106
- - A fresh machine can install from release assets using only documented commands.
107
- - A project can configure each supported client from Planr docs or CLI output.
108
- - Package dry-runs show only intentional files.
109
-
110
- ### Templates And Review Packages
111
-
112
- - REQ-V11-TEMPLATE-001: Export/import must support map items, links, plans, contexts, logs, durable ReviewGate projections, and metadata.
113
- - REQ-V11-TEMPLATE-002: Templates must include package requirements metadata, Planr version, creation timestamp, source project name, and optional tags.
114
- - REQ-V11-TEMPLATE-003: Import must preview what will be created or skipped before mutating existing projects.
115
- - REQ-V11-TEMPLATE-004: Review packages must preserve ReviewGate attempts, findings, annotations, and file references.
116
- - REQ-V11-TEMPLATE-005: Encrypted local bundle sharing may be implemented without hosted infrastructure; if not implemented in V1.1, docs must capture the accepted local-first format and explicit future scope.
117
-
118
- Acceptance:
119
-
120
- - A proven decomposition can be exported, imported into a fresh project, and picked without losing dependencies.
121
- - Review annotations survive package export/import.
122
- - Imports are idempotent or explain conflicts before mutation.
123
-
124
- ### Documentation And Public Copy
125
-
126
- - REQ-V11-DOCS-001: README, CLI reference, MCP contract, operating model, task graph model, install docs, testing docs, and spec files must match implemented V1.1 behavior.
127
- - REQ-V11-DOCS-002: `docs/planr-spec.zip` must be regenerated after spec changes.
128
- - REQ-V11-DOCS-003: Docs must use Planr vocabulary: plan, map, item, pick, log, review, context, recovery, package.
129
- - REQ-V11-DOCS-004: Repo-visible docs and public copy must not mention local comparison products or imply Planr is a fork of another task graph or review tool.
130
- - REQ-V11-DOCS-005: New commands and APIs must have examples and JSON contract notes where agents rely on them.
131
-
132
- Acceptance:
133
-
134
- - Docs, fixtures, CLI help, MCP tools, and tests do not drift.
135
- - A forbidden-reference scrub over public repo paths returns no matches for comparison-product names.
136
-
137
- ## End-To-End Verification Contract
138
-
139
- V1.1 final verification must run from the current worktree and a fresh consumer project at `~/projects/planr-test`.
140
-
141
- Required repository checks:
142
-
143
- - `cargo fmt --check`
144
- - `cargo clippy --all-targets -- -D warnings`
145
- - `cargo test`
146
- - `scripts/build-release.sh`
147
- - checksum verification for release assets and packaged files
148
- - `npm pack --dry-run` when the npm wrapper remains present
149
- - `scripts/ci-local.sh`
150
- - MCP stdio contract smoke
151
- - HTTP/SSE smoke
152
- - durable ReviewGate cross-surface smoke
153
- - forbidden-reference scrub over public repo paths
154
-
155
- Required consumer checks in `~/projects/planr-test`:
156
-
157
- - install or invoke the built Planr binary without relying on source-tree paths except for the selected test binary
158
- - initialize a project
159
- - create a product plan or build plan
160
- - build map items
161
- - pick one item
162
- - log files, commands, and tests
163
- - request review
164
- - annotate or ingest review feedback
165
- - close review and target item according to gate rules
166
- - export and import a package/template
167
- - run documented examples that are meant to work for users
168
-
169
- The final V1.1 review must treat missing, stale, narrow, or indirect evidence as incomplete.
170
-
171
- ## Out Of Scope For V1.1 Unless Explicitly Added
172
-
173
- - Hosted accounts, billing, hosted sync, or team permission models.
174
- - Uploading private plans, source files, prompts, responses, or review content to a hosted service by default.
175
- - Full project-management SaaS workflows unrelated to coding-agent execution.
176
- - Silent global agent-client configuration edits.
177
- - Claiming PR-provider support that was not verified with a real provider or documented local capability boundary.
@@ -1,66 +0,0 @@
1
- {
2
- "id": "cverdict-api-health-v1",
3
- "schema_version": "evidence.contract.v1",
4
- "scope": {
5
- "kind": "criterion",
6
- "id": "criterion-api-health",
7
- "plan_id": "pln-example",
8
- "item_id": "item-example"
9
- },
10
- "evaluated_at": "2026-07-28T12:00:08Z",
11
- "status": "satisfied",
12
- "observation_coverage": [
13
- {
14
- "requirement_id": "obs-http-200",
15
- "status": "covered",
16
- "covering_receipt_ids": ["erec-planr-api-health-v1"],
17
- "covered_observation_ids": ["obs-http-200"]
18
- }
19
- ],
20
- "validation_details": {
21
- "trust": {
22
- "status": "passed",
23
- "checked_at": "2026-07-28T12:00:08Z",
24
- "receipt_ids": ["erec-planr-api-health-v1"],
25
- "gap_reasons": []
26
- },
27
- "freshness": {
28
- "status": "passed",
29
- "checked_at": "2026-07-28T12:00:08Z",
30
- "receipt_ids": ["erec-planr-api-health-v1"],
31
- "gap_reasons": []
32
- },
33
- "target": {
34
- "status": "passed",
35
- "checked_at": "2026-07-28T12:00:08Z",
36
- "receipt_ids": ["erec-planr-api-health-v1"],
37
- "gap_reasons": []
38
- },
39
- "schema": {
40
- "status": "passed",
41
- "checked_at": "2026-07-28T12:00:08Z",
42
- "receipt_ids": ["erec-planr-api-health-v1"],
43
- "gap_reasons": []
44
- },
45
- "provenance": {
46
- "status": "passed",
47
- "checked_at": "2026-07-28T12:00:08Z",
48
- "receipt_ids": ["erec-planr-api-health-v1"],
49
- "gap_reasons": []
50
- },
51
- "fixture": {
52
- "status": "passed",
53
- "checked_at": "2026-07-28T12:00:08Z",
54
- "receipt_ids": ["erec-planr-api-health-v1"],
55
- "gap_reasons": []
56
- },
57
- "completion": {
58
- "status": "passed",
59
- "checked_at": "2026-07-28T12:00:08Z",
60
- "receipt_ids": ["erec-planr-api-health-v1"],
61
- "gap_reasons": []
62
- }
63
- },
64
- "suggested_next_action": "none",
65
- "actionable_now": false
66
- }
@@ -1,39 +0,0 @@
1
- {
2
- "id": "eatt-planr-api-health-v1",
3
- "schema_version": "evidence.contract.v1",
4
- "criterion_id": "criterion-api-health",
5
- "obligation_id": "pob-planr-api-health-v1",
6
- "capability_instance_id": "vcinst-planr-http-process-v1",
7
- "started_at": "2026-07-28T12:00:05Z",
8
- "ended_at": "2026-07-28T12:00:06Z",
9
- "status": "passed",
10
- "resolved_command": {
11
- "kind": "command",
12
- "command": ["curl", "-fsS", "http://127.0.0.1:4173/health"],
13
- "cwd": "$PLANR_REPOSITORY_ROOT"
14
- },
15
- "exit": {
16
- "exit_code": 0,
17
- "signal": null,
18
- "error": null
19
- },
20
- "retry_lineage": {
21
- "attempt_number": 1,
22
- "max_attempts": 1,
23
- "previous_attempt_ids": []
24
- },
25
- "stdout_digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
26
- "stderr_digest": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
27
- "raw_result": {
28
- "kind": "artifact",
29
- "artifact_id": "artifact-http-response",
30
- "digest": "sha256:8888888888888888888888888888888888888888888888888888888888888888"
31
- },
32
- "artifacts": [],
33
- "output_bounds": {
34
- "stdout_bytes": 16,
35
- "stderr_bytes": 0,
36
- "stdout_truncated": false,
37
- "stderr_truncated": false
38
- }
39
- }
@@ -1,108 +0,0 @@
1
- {
2
- "id": "epolicy-default-v1",
3
- "schema_version": "evidence.contract.v1",
4
- "policy_digest": "sha256:4dc9ebefae0d8334a19d958a456d5633d615025e7643f999dfda6d4c30bfc613",
5
- "defaults": {
6
- "preset_id": "preset-http-health",
7
- "binding": true,
8
- "assurance_level": "standard"
9
- },
10
- "named_presets": [
11
- {
12
- "id": "preset-http-health",
13
- "schema_version": "evidence.contract.v1",
14
- "namespace": "planr.api",
15
- "observations": [
16
- {
17
- "id": "obs-http-200",
18
- "type": "planr.api.http.response",
19
- "subject": "GET /health",
20
- "expected": {
21
- "status": 200
22
- },
23
- "target": {
24
- "kind": "local_service",
25
- "uri": "http://127.0.0.1:4173/health"
26
- }
27
- }
28
- ]
29
- }
30
- ],
31
- "observation_schema_registrations": [
32
- {
33
- "type": "planr.api.http.response",
34
- "schema_ref": "planr.api.http.response@v1",
35
- "schema_digest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
36
- "owning_namespace": "planr.api"
37
- }
38
- ],
39
- "adapter_registrations": [
40
- {
41
- "manifest_id": "vcap-planr-http-process-v1",
42
- "manifest_path": "docs/contracts/fixtures/evidence/v1/examples/verification-capability-manifest.json",
43
- "manifest_digest": "sha256:6666666666666666666666666666666666666666666666666666666666666666",
44
- "observation_types": ["planr.api.http.response"],
45
- "payload_schemas": [
46
- {
47
- "type": "planr.api.http.response",
48
- "schema_ref": "planr.api.http.response@v1",
49
- "schema_digest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
50
- }
51
- ],
52
- "provenance_path": "planr_observed_execution",
53
- "execution_contract": {
54
- "kind": "process",
55
- "executable": "curl",
56
- "args": ["--fail", "--silent", "http://127.0.0.1:4173/health"],
57
- "working_directory": ".",
58
- "timeout_ms": 10000,
59
- "stdout_limit_bytes": 1048576,
60
- "stderr_limit_bytes": 1048576,
61
- "payload_schema": {
62
- "type": "planr.api.http.response",
63
- "schema_ref": "planr.api.http.response@v1",
64
- "schema_digest": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
65
- }
66
- }
67
- }
68
- ],
69
- "extension_namespaces": ["planr.api"],
70
- "trust_policy": {
71
- "accepted_provenance": ["planr_observed_execution"],
72
- "min_receipt_status": "trusted",
73
- "allow_user_attestation": false
74
- },
75
- "freshness_policy": {
76
- "max_age_seconds": 3600,
77
- "invalidate_on": [
78
- "source_change",
79
- "target_change",
80
- "policy_change",
81
- "adapter_schema_change",
82
- "configuration_change"
83
- ]
84
- },
85
- "fixture_policy": {
86
- "fixtures_allowed": false,
87
- "mocks_allowed": false,
88
- "disclosure_required": true
89
- },
90
- "completion_policy": {
91
- "require_satisfied_or_waived": true,
92
- "allow_inconclusive_completion": false,
93
- "require_review_evidence": true
94
- },
95
- "layering_policy": {
96
- "mode": "monotonic_strengthening",
97
- "weakening_requires_waiver": true,
98
- "layers": [
99
- {
100
- "scope": {
101
- "kind": "plan",
102
- "id": "pln-example"
103
- },
104
- "policy_digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
105
- }
106
- ]
107
- }
108
- }
@@ -1,93 +0,0 @@
1
- {
2
- "id": "erec-planr-api-health-v1",
3
- "schema_version": "evidence.contract.v1",
4
- "criterion_id": "criterion-api-health",
5
- "obligation_id": "pob-planr-api-health-v1",
6
- "receipt_status": "trusted",
7
- "source": {
8
- "revision": "0123456789abcdef0123456789abcdef01234567",
9
- "tree_digest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
10
- "dirty": false
11
- },
12
- "target": {
13
- "kind": "local_service",
14
- "uri": "http://127.0.0.1:4173/health",
15
- "digest": "sha256:4444444444444444444444444444444444444444444444444444444444444444"
16
- },
17
- "environment": {
18
- "kind": "local",
19
- "id": "dev-shell",
20
- "digest": "sha256:5555555555555555555555555555555555555555555555555555555555555555"
21
- },
22
- "vantage_point": {
23
- "kind": "localhost",
24
- "identity": "127.0.0.1"
25
- },
26
- "capability": {
27
- "manifest_id": "vcap-planr-http-process-v1",
28
- "manifest_digest": "sha256:6666666666666666666666666666666666666666666666666666666666666666",
29
- "instance_id": "vcinst-planr-http-process-v1",
30
- "instance_digest": "sha256:7777777777777777777777777777777777777777777777777777777777777777"
31
- },
32
- "provenance": {
33
- "source": "planr_observed_execution",
34
- "assigned_by": "planr",
35
- "execution_id": "exec-20260728-api-health",
36
- "tool_call_id": null
37
- },
38
- "observations": [
39
- {
40
- "requirement_id": "obs-http-200",
41
- "type": "planr.api.http.response",
42
- "outcome": "passed",
43
- "predicate": {
44
- "status": 200,
45
- "json_path": "$.status",
46
- "equals": "ok"
47
- },
48
- "actual": {
49
- "status": 200,
50
- "json": {
51
- "status": "ok"
52
- }
53
- }
54
- }
55
- ],
56
- "attempt_ids": [
57
- "eatt-planr-api-health-v1"
58
- ],
59
- "retry_history": [],
60
- "artifacts": [
61
- {
62
- "id": "artifact-http-response",
63
- "kind": "stdout",
64
- "digest": "sha256:8888888888888888888888888888888888888888888888888888888888888888"
65
- }
66
- ],
67
- "raw_result": {
68
- "kind": "artifact",
69
- "artifact_id": "artifact-http-response",
70
- "digest": "sha256:8888888888888888888888888888888888888888888888888888888888888888"
71
- },
72
- "config_digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
73
- "fixture_disclosure": {
74
- "fixtures_used": false,
75
- "mocks_used": false
76
- },
77
- "permissions": {
78
- "network": "localhost_only",
79
- "filesystem": "read_workspace"
80
- },
81
- "sandbox": {
82
- "mode": "bounded_process",
83
- "limits": {
84
- "timeout_ms": 10000,
85
- "stdout_bytes": 1048576,
86
- "stderr_bytes": 1048576
87
- }
88
- },
89
- "proof_gaps": [],
90
- "started_at": "2026-07-28T12:00:05Z",
91
- "ended_at": "2026-07-28T12:00:06Z",
92
- "receipt_digest": "sha256:6ea111943fdafe268a5bbe85b0fecaab75890dbcb9b2e2dfb966f3c6916e348f"
93
- }