planr 1.4.0 → 1.5.1
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/README.md +21 -61
- package/docs/ARCHITECTURE.md +4 -4
- package/docs/CLAUDE_CODE.md +2 -2
- package/docs/CLI_REFERENCE.md +6 -14
- package/docs/CODEX.md +6 -6
- package/docs/CURSOR.md +2 -2
- package/docs/EXAMPLE_WEBAPP.md +63 -97
- package/docs/GOALS.md +8 -25
- package/docs/INSTALL.md +3 -3
- package/docs/MCP_CONTRACT.md +6 -9
- package/docs/MODEL_ROUTING.md +20 -177
- package/docs/RELEASE.md +1 -1
- package/docs/ROUTING_BUNDLES.md +32 -0
- package/docs/SKILLS.md +35 -50
- package/docs/documentation/CONTRACT.md +164 -0
- package/docs/documentation/COVERAGE.md +91 -0
- package/docs/documentation/INFORMATION_ARCHITECTURE.md +147 -0
- package/docs/fixtures/mcp-contract.json +3 -11
- package/npm/native/darwin-arm64/planr +0 -0
- package/npm/native/darwin-x86_64/planr +0 -0
- package/npm/native/linux-arm64/planr +0 -0
- package/npm/native/linux-x86_64/planr +0 -0
- package/package.json +25 -14
- package/plugins/planr/.claude-plugin/plugin.json +1 -1
- package/plugins/planr/.codex-plugin/plugin.json +2 -2
- package/plugins/planr/skills/planr-loop/SKILL.md +1 -1
- package/docs/PRESET_COMPOSITION.md +0 -109
- package/docs/PRESET_EVALUATION.md +0 -118
- package/docs/PRESET_REGISTRY.md +0 -61
- package/evaluations/preset-suite-v1.toml +0 -127
- package/evaluations/sol-luna-codex-v1.toml +0 -42
- package/plugins/planr/skills/planr-loop/agents/planr-reviewer.toml +0 -23
- package/plugins/planr/skills/planr-loop/agents/planr-worker.toml +0 -21
- package/presets/bindings/claude-native.toml +0 -52
- package/presets/bindings/codex-openai.toml +0 -56
- package/presets/bindings/cursor-fable-grok.toml +0 -49
- package/presets/bindings/cursor-openai.toml +0 -49
- package/presets/bindings/mixed-host.toml +0 -64
- package/presets/policies/balanced.toml +0 -50
- package/presets/policies/low-usage.toml +0 -50
- package/presets/policies/max-quality.toml +0 -50
- package/presets/policies/read-only-audit.toml +0 -50
- package/website/README.md +0 -79
- package/website/_headers +0 -7
- package/website/alchemy-runtime.test.mjs +0 -21
- package/website/app.mjs +0 -216
- package/website/build-catalog.mjs +0 -135
- package/website/build-site.test.mjs +0 -69
- package/website/catalog-model.mjs +0 -185
- package/website/catalog-model.test.mjs +0 -124
- package/website/cloudflare-launcher.test.mjs +0 -38
- package/website/data/catalog.json +0 -307
- package/website/index.html +0 -122
- package/website/registry/manifest.toml +0 -48
- package/website/registry/report.md +0 -33
- package/website/registry/trusted-maintainers.toml +0 -6
- package/website/registry/verification.json +0 -7258
- package/website/serve.mjs +0 -41
- package/website/styles.css +0 -201
- package/website/test-fixtures/recommended.json +0 -72
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# Preset Composition
|
|
2
|
-
|
|
3
|
-
Planr composes two independent inputs:
|
|
4
|
-
|
|
5
|
-
- a provider-neutral Usage Policy v1 TOML file;
|
|
6
|
-
- a versioned host binding containing exact client/model/effort and dispatch capabilities.
|
|
7
|
-
|
|
8
|
-
Preview is the default:
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
planr agents preset apply ./policy.toml --binding ./codex-binding.toml --preview --json
|
|
12
|
-
planr agents preset apply ./policy.toml --binding ./codex-binding.toml --confirm --json
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
The equivalent MCP tool is `planr_preset_apply` with `policy`, `binding`, and optional `confirm` fields. Both surfaces call one application service and return the same compatibility, permission, verification-age, provenance, conflict, and artifact shapes.
|
|
16
|
-
|
|
17
|
-
## Built-in Catalog and Safe Packs
|
|
18
|
-
|
|
19
|
-
`planr agents preset list --json` (MCP: `planr_presets_list`) lists the four embedded policy presets, five host bindings, source checksums, and 20 declared safe pairs. Built-ins resolve by id or id plus `.toml`, so they work from any repository without copying package files first:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
planr agents preset apply balanced --binding codex-openai --preview --json
|
|
23
|
-
planr agents preset apply read-only-audit --binding mixed-host --confirm --json
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Policies: `balanced`, `low-usage`, `max-quality`, and `read-only-audit`. Bindings: `codex-openai`, `cursor-openai`, `cursor-fable-grok`, `claude-native`, and `mixed-host`. The exact inspectable sources ship under `presets/policies/` and `presets/bindings/` and are also compiled into the binary.
|
|
27
|
-
|
|
28
|
-
A response whose inputs came from the embedded catalog carries `pack.status = "safe"` and `pack.safe = true`. Explicit file inputs remain custom even when their internal ids match a built-in; they are allowed, carry `pack.status = "custom"`, and add a warning requiring review of compatibility, permission, and artifact diffs. This prevents copied or modified files from inheriting safe-pack status by name alone.
|
|
29
|
-
|
|
30
|
-
## Host Binding v1
|
|
31
|
-
|
|
32
|
-
Bindings use strict TOML: unknown fields fail parsing. Abstract role keys must cover every role in `policy.execution.roles`; bindings may add a driver profile without adding it to execution permissions.
|
|
33
|
-
|
|
34
|
-
```toml
|
|
35
|
-
schema_version = 1
|
|
36
|
-
id = "codex-team"
|
|
37
|
-
version = "1.0.0"
|
|
38
|
-
host = "codex"
|
|
39
|
-
driver_role = "driver"
|
|
40
|
-
default_role = "driver"
|
|
41
|
-
capability_evidence = ["codex-0.138-cross-tier-smoke"]
|
|
42
|
-
billing_assumptions = ["local subscription"]
|
|
43
|
-
known_limitations = ["effective model requires host evidence"]
|
|
44
|
-
|
|
45
|
-
[capabilities]
|
|
46
|
-
model_override = true
|
|
47
|
-
effort_override = true
|
|
48
|
-
fork_none = true
|
|
49
|
-
fork_all = true
|
|
50
|
-
max_partial_fork_turns = 4
|
|
51
|
-
|
|
52
|
-
[profiles.driver]
|
|
53
|
-
profile = "sol"
|
|
54
|
-
client = "codex"
|
|
55
|
-
model = "gpt-5.5"
|
|
56
|
-
effort = "xhigh"
|
|
57
|
-
|
|
58
|
-
[profiles.worker]
|
|
59
|
-
profile = "luna"
|
|
60
|
-
client = "codex"
|
|
61
|
-
model = "gpt-5.4-mini"
|
|
62
|
-
effort = "high"
|
|
63
|
-
skill = "planr-work"
|
|
64
|
-
# Omit for the deterministic `none` default.
|
|
65
|
-
fork_turns = { mode = "partial", turns = 2 }
|
|
66
|
-
|
|
67
|
-
[[routes]]
|
|
68
|
-
work_type = "code"
|
|
69
|
-
role = "worker"
|
|
70
|
-
fallback_roles = ["driver"]
|
|
71
|
-
|
|
72
|
-
[verification]
|
|
73
|
-
id = "verify-codex-team"
|
|
74
|
-
verified_at_unix = 1900000000
|
|
75
|
-
max_age_seconds = 2592000
|
|
76
|
-
|
|
77
|
-
[[artifacts]]
|
|
78
|
-
path = ".codex/agents/luna.toml"
|
|
79
|
-
kind = "codex_agent"
|
|
80
|
-
content = '''model = "gpt-5.4-mini"
|
|
81
|
-
model_reasoning_effort = "high"
|
|
82
|
-
'''
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
Codex cross-tier children never accept `fork_turns = { mode = "all" }`, because full history inheritance defeats the requested model/effort override. Omitted fork configuration defaults to `none`. A partial fork must be positive, at or below `max_partial_fork_turns`, and backed by non-empty `capability_evidence`. Secret-like values are forbidden in all binding metadata, including capability evidence, billing assumptions, limitations, profile metadata, routes, and artifact paths/kinds; composition rejects them with field-only diagnostics before producing dispatch/warning output or mutating the repository.
|
|
86
|
-
|
|
87
|
-
## Preview and Lock
|
|
88
|
-
|
|
89
|
-
The preview includes:
|
|
90
|
-
|
|
91
|
-
- composed abstract-role to registry-profile and dispatch-context mappings;
|
|
92
|
-
- compatibility errors and host/billing limitations;
|
|
93
|
-
- execution-permission additions relative to the active policy;
|
|
94
|
-
- verification id, age, maximum age, and fresh/stale state;
|
|
95
|
-
- source ids, versions, SHA-256 hashes, Planr version, and applied-at value;
|
|
96
|
-
- every target's kind, size, proposed/existing hash, `create`, `unchanged`, or `conflict` action, and deterministic old/proposed configuration. TOML is projected structurally so policy limits/transitions and registry routes/profiles/fallbacks are directly auditable; other text is line-projected. Secret-like keys and credential-shaped values are replaced with `[REDACTED]`.
|
|
97
|
-
|
|
98
|
-
Confirmed apply writes the previewed bytes and records `policy_applied`. The lock at `.planr/preset.lock.toml` contains source hashes and hashes for every generated non-lock artifact. Tests and reproducible packaging can pin `PLANR_PRESET_NOW_UNIX` and `PLANR_PRESET_APPLIED_AT`; ordinary operation records current time.
|
|
99
|
-
|
|
100
|
-
## Repository Boundary
|
|
101
|
-
|
|
102
|
-
Only these repository-relative targets are valid:
|
|
103
|
-
|
|
104
|
-
- `.planr/policy.toml`
|
|
105
|
-
- `.planr/agents.toml`
|
|
106
|
-
- `.planr/preset.lock.toml`
|
|
107
|
-
- files below `.codex/{agents,skills}/`, `.claude/{agents,skills}/`, or `.cursor/{agents,skills}/`
|
|
108
|
-
|
|
109
|
-
Planr rejects absolute paths, `.`/`..` traversal, non-normalized paths, symlink crossings, home/global targets, and repository `.codex/config.toml` before the first write. Existing different files are conflicts and are never overwritten; there is no force or privileged mode.
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# Preset Evaluation
|
|
2
|
-
|
|
3
|
-
Planr provides three explicit evidence levels over the same versioned fixture and lifecycle engine:
|
|
4
|
-
|
|
5
|
-
- the default offline policy simulation performs no external execution and can reach `verified` but never `recommended`;
|
|
6
|
-
- the opt-in live-host runner executes every task through a user-selected local adapter and evaluates Planr-owned workspace artifacts, but arbitrary-process route and cost claims cannot reach `recommended` without independent instrumentation.
|
|
7
|
-
- the instrumented live-host runner joins those artifacts to Ed25519-signed telemetry receipts and can reach `recommended` when trusted route, usage, and all other thresholds pass.
|
|
8
|
-
|
|
9
|
-
`evaluations/preset-suite-v1.toml` defines distinct inputs, artifact kinds, and candidate/task-bound output oracles for exploration, implementation, mechanical, browser, visual, security, and subagent workflows. Input and result artifacts are SHA-256 hashed.
|
|
10
|
-
|
|
11
|
-
```sh
|
|
12
|
-
planr agents preset evaluate
|
|
13
|
-
planr --json agents preset evaluate --at-unix 1783987200
|
|
14
|
-
planr agents preset evaluate --report-dir reports/preset-v1
|
|
15
|
-
planr agents preset evaluate \
|
|
16
|
-
--live-host-command /absolute/path/to/host-adapter \
|
|
17
|
-
--live-host-arg optional-argument \
|
|
18
|
-
--trusted-telemetry-signer production-collector \
|
|
19
|
-
--trusted-telemetry-collector /absolute/path/to/collector
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
Evaluation defaults to current wall-clock time, so evidence becomes `stale` after fixture expiry. `--at-unix` is the deterministic override for tests and reproducible exports. `--host` requires binding compatibility. The signer and collector flags are all-or-none and require live mode. MCP exposes the equivalent optional `at_unix`, `host`, `live_host_command`, `live_host_args`, `trusted_telemetry_signer`, and `trusted_telemetry_collector` inputs.
|
|
23
|
-
|
|
24
|
-
## Offline simulation
|
|
25
|
-
|
|
26
|
-
Offline artifacts say `evidence_scope = "policy_simulation"`, `task_executed = false`, `outcome_oracle_evaluated = false`, and `recommendation_eligible = false`. Projected tool, token, credit, and latency values carry `metrics_source = "estimated_projection"` and `metering_confidence = "estimated"`.
|
|
27
|
-
|
|
28
|
-
Binding configuration populates only requested and resolved route stages. Effective model, effort, and context-fork dimensions remain `unavailable`, so route coverage is zero and the recommendation list is empty. Offline `verified` means only that policy composition, transition simulation, and hashes are complete.
|
|
29
|
-
|
|
30
|
-
## Explicit live-host runner
|
|
31
|
-
|
|
32
|
-
`--live-host-command` must be an absolute executable path. Planr starts it once per candidate/task fixture, writes one JSON request to stdin, waits for process completion, measures elapsed time, and parses one JSON response from stdout. This is an explicit arbitrary-process boundary: only run a trusted adapter. No live process is started without the flag.
|
|
33
|
-
|
|
34
|
-
For each run, Planr creates a Planr-controlled temporary workspace containing `challenge.json`. The request contains schema/suite/candidate/policy/binding/task versions, task kind, input, input hash, required artifact kind, and absolute workspace/challenge/artifact paths. It deliberately does not expose the expected output or challenge contents. The adapter must read the challenge, write a strict schema-v1 artifact to `artifact_path`, hash those exact bytes, and bind its response back to that artifact:
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
{
|
|
38
|
-
"schema_version": 1,
|
|
39
|
-
"host_id": "example-host",
|
|
40
|
-
"host_version": "1.0.0",
|
|
41
|
-
"candidate_id": "balanced-codex-openai",
|
|
42
|
-
"task_id": "browser-report-smoke",
|
|
43
|
-
"input_sha256": "<request input hash>",
|
|
44
|
-
"artifact_kind": "browser_trace",
|
|
45
|
-
"artifact_sha256": "<SHA-256 of the artifact file>",
|
|
46
|
-
"output": "balanced-codex-openai:browser-report-smoke:browser-report-inspected",
|
|
47
|
-
"effective_model": "model-id",
|
|
48
|
-
"effective_effort": "high",
|
|
49
|
-
"effective_context_fork": { "mode": "none" },
|
|
50
|
-
"tool_calls": 1,
|
|
51
|
-
"tokens": 10,
|
|
52
|
-
"credits_micros": 100,
|
|
53
|
-
"retries": 1,
|
|
54
|
-
"availability_fallbacks": 1,
|
|
55
|
-
"quality_escalations": 1,
|
|
56
|
-
"corrections": 0,
|
|
57
|
-
"violations": 0
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
The artifact file is separate from stdout and has this strict shape:
|
|
62
|
-
|
|
63
|
-
```json
|
|
64
|
-
{
|
|
65
|
-
"schema_version": 1,
|
|
66
|
-
"candidate_id": "balanced-codex-openai",
|
|
67
|
-
"task_id": "browser-report-smoke",
|
|
68
|
-
"input_sha256": "<request input hash>",
|
|
69
|
-
"artifact_kind": "browser_trace",
|
|
70
|
-
"challenge_sha256": "<SHA-256 of Planr's challenge file>",
|
|
71
|
-
"output": "balanced-codex-openai:browser-report-smoke:browser-report-inspected"
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
Planr reads the artifact itself after the process exits, rejects missing, symlinked, oversized, malformed, or extra-field artifacts, computes its SHA-256 independently, verifies candidate/task/input/artifact and challenge binding, and finally evaluates the versioned task oracle. Neither a constant responder nor a request-aware mapper that only echoes dynamic request fields and public success labels writes this Planr-controlled artifact, so both have `task_executed = false`, `evidence_complete = false`, status `unverified`, and cannot recommend. A wholly failed live attempt also sets the report-level `reproducible_evidence = false`; merely attempting the adapter is never described as evaluated live evidence.
|
|
76
|
-
|
|
77
|
-
Production policy checks remain authoritative: tool-budget and write-capability checks are evaluated from the candidate policy, never adapter claims. A read-only candidate fails the implementation and mechanical write fixtures even if the adapter returns otherwise successful JSON.
|
|
78
|
-
|
|
79
|
-
The adapter reports effective route and usage values, but process exit does not make those claims trusted. Effective route fields are labeled `host_report` with `estimated` enforcement, so they do not increment `verified_route_runs`. Tool/token/credit metering is also `estimated`; only elapsed process latency is independently measured by Planr. Retry/fallback/escalation/correction/violation counts remain visible host reports. The process-adapter boundary therefore always sets `recommendation_eligible = false`, even when every workspace artifact passes.
|
|
80
|
-
|
|
81
|
-
## Independently signed telemetry
|
|
82
|
-
|
|
83
|
-
Recommendation-capable live evaluation uses a separately provisioned telemetry collector. The repository trust registry at `.planr/trusted-telemetry.toml` pins both an Ed25519 signer key and the SHA-256 of the collector executable; the evaluation invocation supplies only the registry signer id and the absolute collector path. A caller-selected public key, run id, or precomputed receipt bundle is not accepted. The registry shape is:
|
|
84
|
-
|
|
85
|
-
```toml
|
|
86
|
-
schema_version = 1
|
|
87
|
-
|
|
88
|
-
[[signers]]
|
|
89
|
-
id = "production-collector"
|
|
90
|
-
public_key_hex = "<64-hex-character-ed25519-public-key>"
|
|
91
|
-
collector_sha256 = "<64-hex-character-executable-sha256>"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Planr creates a fresh run UUID before evaluation and a fresh challenge nonce for every task. Only after the live adapter exits and Planr reads and hashes the workspace artifact does it invoke the hash-pinned collector. The collector receives a strict JSON identity request containing the Planr-owned run id, evaluation and suite identity, candidate/task/input/artifact identity, exact artifact SHA-256, and challenge nonce. It independently adds host route, usage, transition, correction, and violation measurements, then returns `{ "payload": ..., "signature_hex": "..." }`. The adapter never receives a signing key, and pre-run receipts cannot know the fresh run/challenge/artifact tuple.
|
|
95
|
-
|
|
96
|
-
Before invocation Planr verifies that the collector is a regular absolute-path file whose SHA-256 matches the selected registry entry, and it rechecks the digest for every task. It rejects the trust upgrade for a failed collector, malformed response, bad signature, wrong run/suite/time, wrong task/input/artifact/challenge binding, blank host identity, or host identity mismatch with the live adapter response. Missing or rejected receipts do not abort artifact evaluation: that result falls back to `host_reported`/`estimated`, gets zero verified route credit, and is recommendation-ineligible. Registry, signer, and collector configuration errors fail the evaluation before execution.
|
|
97
|
-
|
|
98
|
-
For a verified post-run receipt, Planr uses only signed route, usage, transition, correction, and violation values. Effective route dimensions carry `evidence = "telemetry_receipt"` and `enforcement = "verified"`; tool/token/credit dimensions and result `metering_confidence` are `trusted`; process latency remains Planr-observed. These results use `metrics_source = "trusted_telemetry"` and may satisfy recommendation gates.
|
|
99
|
-
|
|
100
|
-
## Lifecycle and thresholds
|
|
101
|
-
|
|
102
|
-
- `recommended`: every task artifact and oracle passes, every effective route and usage measurement has a valid signed telemetry receipt, and all thresholds pass;
|
|
103
|
-
- `verified`: offline simulation is complete, or every required live workspace artifact and outcome oracle passed but recommendation-grade instrumentation is unavailable or a threshold failed;
|
|
104
|
-
- `stale`: evaluation time is later than fixture expiry;
|
|
105
|
-
- `incompatible`: requested host is unsupported by the binding;
|
|
106
|
-
- `unverified`: required composition, transition, hash, live task execution, challenge-bound artifact, or outcome-oracle evidence is incomplete.
|
|
107
|
-
|
|
108
|
-
Only independently instrumented live task evidence can set `recommendation_evidence_complete = true`. Hashing simulator-authored JSON, process stdout, or an adapter-authored route/cost claim cannot promote it.
|
|
109
|
-
|
|
110
|
-
## Immutable output
|
|
111
|
-
|
|
112
|
-
`--report-dir` accepts only a normalized repository-relative directory and rejects absolute paths, traversal, non-directory components, and symlink crossings. It creates `verification.json` and `report.md` without overwrite; either existing target fails the command.
|
|
113
|
-
|
|
114
|
-
The report includes suite/Planr/configured-model provenance. Live results additionally include host id/version, Planr-read workspace artifact and oracle hashes, host route/usage evidence with explicit estimated or trusted provenance, observed process latency, corrections/transitions/violations, policy-capability checks, and result hashes.
|
|
115
|
-
|
|
116
|
-
## Sol/Luna Codex contract
|
|
117
|
-
|
|
118
|
-
`evaluations/sol-luna-codex-v1.toml` independently proves that cross-tier `fork_turns = "all"` is rejected, `none` preserves Luna parameters, missing effective evidence cannot route-verify, and process-evidenced effective model/effort/fork values can verify.
|
package/docs/PRESET_REGISTRY.md
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Preset Registry
|
|
2
|
-
|
|
3
|
-
Planr's registry is an optional distribution boundary, never a runtime dependency. Active projects keep using their repository-local `.planr/policy.toml`, `.planr/agents.toml`, and preset lock when the registry is unavailable. Previously imported packs remain available under `.planr/registry/cache/` for deterministic offline use.
|
|
4
|
-
|
|
5
|
-
## Trust and integrity
|
|
6
|
-
|
|
7
|
-
A schema-v1 registry manifest identifies a registry version and one or more versioned entries. Each entry declares:
|
|
8
|
-
|
|
9
|
-
- kind (`policy`, `host-binding`, or `pack`), lifecycle (`published`, `deprecated`, or `revoked`), and evaluation status;
|
|
10
|
-
- Planr version bounds and compatible hosts;
|
|
11
|
-
- verification and review timestamps, a verification artifact, and optional replacement/revocation metadata;
|
|
12
|
-
- for `verified` or `recommended` entries, the exact policy, binding, and evaluation-suite ids and versions covered by that evidence;
|
|
13
|
-
- the normalized path, declarative kind, byte length, and SHA-256 digest of every artifact;
|
|
14
|
-
- an optional Ed25519 signature.
|
|
15
|
-
|
|
16
|
-
Signatures do not establish their own trust. Planr verifies them only against keys provisioned separately in `.planr/registry/trusted-maintainers.toml` (or an explicitly selected trust store):
|
|
17
|
-
|
|
18
|
-
```toml
|
|
19
|
-
schema_version = 1
|
|
20
|
-
|
|
21
|
-
[[maintainers]]
|
|
22
|
-
id = "planr-maintainers"
|
|
23
|
-
public_key = "<64 hexadecimal Ed25519 public-key characters>"
|
|
24
|
-
revoked = false
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
An unsigned pack can be checksum-verified, but a manifest's `recommended` claim is demoted to `verified` unless a non-revoked pinned maintainer signature verifies. A trusted signature is necessary but not sufficient: Planr also re-runs canonical policy/binding composition and safe-artifact validation, binds the shipped bytes to the current built-in evaluation inputs, and validates the current suite/task provenance. Candidate metrics and threshold gates are derived again from the task results; result hashes, task-oracle coverage, the canonical Codex dispatch contract, trusted route/metering evidence, and the report recommendation record must all agree before `recommended` survives. A merely signed status label or stale suite therefore cannot promote an entry.
|
|
28
|
-
|
|
29
|
-
Invalid signatures, revoked entries/signers, incompatible Planr/host constraints, checksum/size mismatches, traversal, symlinks, binary or executable content, secret-like content, semantically invalid bindings, and malformed declarative artifacts fail closed. Every registry policy, including an `experimental` entry without evaluation metadata, uses the same public-distribution safety check: commands, hooks, environment grants, network/MCP access, secret references, and overwrite permission are rejected. Manifest ids, versions, hosts, references, reasons, paths, and signer metadata are screened field-by-field for secret-like values before they can reach diagnostics; public keys and signature bytes are shape-validated but deliberately not classified as secrets. Stale verification or deprecation remains visible and removes recommendation.
|
|
30
|
-
|
|
31
|
-
## Verification and offline import
|
|
32
|
-
|
|
33
|
-
Remote retrieval is deliberately outside the command. Downloading a manifest and its content is an explicit operator action; Planr then verifies local inputs:
|
|
34
|
-
|
|
35
|
-
```sh
|
|
36
|
-
planr agents preset registry verify registry.toml \
|
|
37
|
-
--entry balanced-codex \
|
|
38
|
-
--content-root ./download \
|
|
39
|
-
--host codex
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
`--host` may be omitted only for entries whose `compatible_hosts` list is empty. A constrained entry with no explicit host fails closed.
|
|
43
|
-
|
|
44
|
-
Import is preview-first. The preview lists exactly the manifest-declared files and deterministic cache target. `--confirm` copies only those verified files into a manifest-hash-addressed immutable directory and atomically stores both the original registry manifest and a cache receipt:
|
|
45
|
-
|
|
46
|
-
```sh
|
|
47
|
-
planr agents preset registry import registry.toml \
|
|
48
|
-
--entry balanced-codex \
|
|
49
|
-
--content-root ./download \
|
|
50
|
-
--host codex
|
|
51
|
-
|
|
52
|
-
planr agents preset registry import registry.toml \
|
|
53
|
-
--entry balanced-codex \
|
|
54
|
-
--content-root ./download \
|
|
55
|
-
--host codex \
|
|
56
|
-
--confirm
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
`planr agents preset registry list` requires no source manifest or network. The mutable receipt is inventory metadata, not a checksum or trust authority. Every read binds the cache path to the stored manifest hash, re-verifies the original manifest and maintainer signature against the repository trust store, compares receipt inventory with the manifest, and recomputes artifact sizes and hashes from the manifest. Coordinated edits to content and receipt therefore remain detectable. The command reports `current` or `stale` freshness from the review timestamp and marks malformed or tampered cache entries unusable. Extra source files are never imported.
|
|
60
|
-
|
|
61
|
-
The equivalent MCP tools are `planr_preset_registry_verify`, `planr_preset_registry_import`, and `planr_preset_registry_list`. MCP import also previews unless `confirm` is true.
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
schema_version = 1
|
|
2
|
-
id = "planr-preset-suite"
|
|
3
|
-
version = "1.8.0"
|
|
4
|
-
verified_at_unix = 1783987200
|
|
5
|
-
expires_at_unix = 1815523200
|
|
6
|
-
|
|
7
|
-
[thresholds]
|
|
8
|
-
minimum_runs = 7
|
|
9
|
-
minimum_quality_score_bps = 8500
|
|
10
|
-
minimum_reliability_bps = 9000
|
|
11
|
-
maximum_average_credits_micros = 1200000
|
|
12
|
-
maximum_p95_latency_ms = 5000
|
|
13
|
-
maximum_transition_contract_failures = 0
|
|
14
|
-
maximum_safety_stop_failures = 0
|
|
15
|
-
require_verified_routes = true
|
|
16
|
-
require_result_hashes = true
|
|
17
|
-
|
|
18
|
-
[[candidates]]
|
|
19
|
-
id = "balanced-codex-openai"
|
|
20
|
-
policy = "balanced"
|
|
21
|
-
binding = "codex-openai"
|
|
22
|
-
|
|
23
|
-
[[candidates]]
|
|
24
|
-
id = "low-usage-codex-openai"
|
|
25
|
-
policy = "low-usage"
|
|
26
|
-
binding = "codex-openai"
|
|
27
|
-
|
|
28
|
-
[[candidates]]
|
|
29
|
-
id = "max-quality-codex-openai"
|
|
30
|
-
policy = "max-quality"
|
|
31
|
-
binding = "codex-openai"
|
|
32
|
-
|
|
33
|
-
[[candidates]]
|
|
34
|
-
id = "read-only-audit-codex-openai"
|
|
35
|
-
policy = "read-only-audit"
|
|
36
|
-
binding = "codex-openai"
|
|
37
|
-
|
|
38
|
-
[[tasks]]
|
|
39
|
-
id = "explore-routing-boundaries"
|
|
40
|
-
version = "1.0.0"
|
|
41
|
-
kind = "exploration"
|
|
42
|
-
objective = "Inspect policy and host routing boundaries without mutation."
|
|
43
|
-
input = "inspect-routing-boundaries"
|
|
44
|
-
artifact_kind = "inspection_manifest"
|
|
45
|
-
expected_output = "routing-boundaries-inspected"
|
|
46
|
-
work_units = 8
|
|
47
|
-
transition = "retry"
|
|
48
|
-
requires_write = false
|
|
49
|
-
minimum_tool_budget = 1
|
|
50
|
-
|
|
51
|
-
[[tasks]]
|
|
52
|
-
id = "implement-bounded-policy-change"
|
|
53
|
-
version = "1.0.0"
|
|
54
|
-
kind = "implementation"
|
|
55
|
-
objective = "Implement a bounded policy change and preserve verification evidence."
|
|
56
|
-
input = "implement-bounded-policy-change"
|
|
57
|
-
artifact_kind = "patch_manifest"
|
|
58
|
-
expected_output = "bounded-policy-change-implemented"
|
|
59
|
-
work_units = 14
|
|
60
|
-
transition = "quality_escalation"
|
|
61
|
-
requires_write = true
|
|
62
|
-
minimum_tool_budget = 80
|
|
63
|
-
|
|
64
|
-
[[tasks]]
|
|
65
|
-
id = "mechanical-schema-rewrite"
|
|
66
|
-
version = "1.0.0"
|
|
67
|
-
kind = "mechanical"
|
|
68
|
-
objective = "Apply a deterministic schema rewrite across owned files."
|
|
69
|
-
input = "rewrite-owned-schema"
|
|
70
|
-
artifact_kind = "rewrite_manifest"
|
|
71
|
-
expected_output = "owned-schema-rewritten"
|
|
72
|
-
work_units = 11
|
|
73
|
-
transition = "availability_fallback"
|
|
74
|
-
requires_write = true
|
|
75
|
-
minimum_tool_budget = 80
|
|
76
|
-
|
|
77
|
-
[[tasks]]
|
|
78
|
-
id = "browser-report-smoke"
|
|
79
|
-
version = "1.0.0"
|
|
80
|
-
kind = "browser"
|
|
81
|
-
objective = "Render and inspect the generated human report in a browser surface."
|
|
82
|
-
input = "inspect-browser-report"
|
|
83
|
-
artifact_kind = "browser_trace"
|
|
84
|
-
expected_output = "browser-report-inspected"
|
|
85
|
-
work_units = 16
|
|
86
|
-
transition = "retry"
|
|
87
|
-
requires_write = false
|
|
88
|
-
minimum_tool_budget = 80
|
|
89
|
-
|
|
90
|
-
[[tasks]]
|
|
91
|
-
id = "visual-report-regression"
|
|
92
|
-
version = "1.0.0"
|
|
93
|
-
kind = "visual"
|
|
94
|
-
objective = "Compare the report table and status labels against the visual contract."
|
|
95
|
-
input = "compare-visual-report"
|
|
96
|
-
artifact_kind = "visual_diff"
|
|
97
|
-
expected_output = "visual-contract-matched"
|
|
98
|
-
work_units = 13
|
|
99
|
-
transition = "quality_escalation"
|
|
100
|
-
requires_write = false
|
|
101
|
-
minimum_tool_budget = 80
|
|
102
|
-
|
|
103
|
-
[[tasks]]
|
|
104
|
-
id = "security-safety-stop"
|
|
105
|
-
version = "1.0.0"
|
|
106
|
-
kind = "security"
|
|
107
|
-
objective = "Prove an unsafe operation resolves to an enforced safety stop."
|
|
108
|
-
input = "attempt-unsafe-operation"
|
|
109
|
-
artifact_kind = "safety_receipt"
|
|
110
|
-
expected_output = "unsafe-operation-stopped"
|
|
111
|
-
work_units = 9
|
|
112
|
-
transition = "safety_stop"
|
|
113
|
-
requires_write = false
|
|
114
|
-
minimum_tool_budget = 1
|
|
115
|
-
|
|
116
|
-
[[tasks]]
|
|
117
|
-
id = "subagent-sol-luna-dispatch"
|
|
118
|
-
version = "1.0.0"
|
|
119
|
-
kind = "subagent"
|
|
120
|
-
objective = "Verify Sol/Luna cross-tier dispatch and effective route evidence."
|
|
121
|
-
input = "dispatch-sol-luna-worker"
|
|
122
|
-
artifact_kind = "dispatch_trace"
|
|
123
|
-
expected_output = "sol-luna-dispatch-verified"
|
|
124
|
-
work_units = 12
|
|
125
|
-
transition = "availability_fallback"
|
|
126
|
-
requires_write = false
|
|
127
|
-
minimum_tool_budget = 1
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
schema_version = 1
|
|
2
|
-
id = "sol-luna-codex"
|
|
3
|
-
version = "1.0.0"
|
|
4
|
-
host = "codex"
|
|
5
|
-
driver_role = "driver"
|
|
6
|
-
default_role = "driver"
|
|
7
|
-
capability_evidence = ["fixture-codex-none-fork-contract-v1"]
|
|
8
|
-
billing_assumptions = ["deterministic evaluation fixture; no provider call"]
|
|
9
|
-
known_limitations = ["effective model and effort require host evidence"]
|
|
10
|
-
|
|
11
|
-
[capabilities]
|
|
12
|
-
model_override = true
|
|
13
|
-
effort_override = true
|
|
14
|
-
fork_none = true
|
|
15
|
-
fork_all = true
|
|
16
|
-
max_partial_fork_turns = 4
|
|
17
|
-
|
|
18
|
-
[profiles.driver]
|
|
19
|
-
profile = "sol"
|
|
20
|
-
client = "codex"
|
|
21
|
-
model = "gpt-5.5"
|
|
22
|
-
effort = "xhigh"
|
|
23
|
-
cost_tier = "premium"
|
|
24
|
-
|
|
25
|
-
[profiles.worker]
|
|
26
|
-
profile = "luna"
|
|
27
|
-
client = "codex"
|
|
28
|
-
model = "gpt-5.4-mini"
|
|
29
|
-
effort = "high"
|
|
30
|
-
cost_tier = "standard"
|
|
31
|
-
skill = "planr-work"
|
|
32
|
-
fork_turns = { mode = "none" }
|
|
33
|
-
|
|
34
|
-
[[routes]]
|
|
35
|
-
work_type = "code"
|
|
36
|
-
role = "worker"
|
|
37
|
-
fallback_roles = ["driver"]
|
|
38
|
-
|
|
39
|
-
[verification]
|
|
40
|
-
id = "fixture-sol-luna-v1"
|
|
41
|
-
verified_at_unix = 1783987200
|
|
42
|
-
max_age_seconds = 31536000
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# Copy to .codex/agents/planr-reviewer.toml (project) or ~/.codex/agents/ (user).
|
|
2
|
-
# Adjust the skill path to where the Planr skills are installed.
|
|
3
|
-
name = "planr_reviewer"
|
|
4
|
-
description = "Independent findings-first reviewer for one Planr item. Audits evidence and closes the review with a verdict."
|
|
5
|
-
sandbox_mode = "workspace-write"
|
|
6
|
-
|
|
7
|
-
# Deliberately no model override: the reviewer is the truth gate and inherits
|
|
8
|
-
# the driver session's model. Make workers cheap, not the verdict.
|
|
9
|
-
|
|
10
|
-
developer_instructions = """
|
|
11
|
-
Use the planr-review skill exactly as written for the single item id you are given.
|
|
12
|
-
You did not write this code; audit it like an owner. Inspect the actual diff and rerun the
|
|
13
|
-
logged verification commands instead of trusting the worker's summary.
|
|
14
|
-
Close the review with `planr review close <review-id> --verdict ... --reviewer <your-id>` and
|
|
15
|
-
always pass `--reviewer` explicitly (e.g. `checker-1`): shell exports do not survive between
|
|
16
|
-
tool calls, and a review closed under the default identity corrupts the independence audit.
|
|
17
|
-
Findings must be specific and actionable. Do not edit implementation files; your only writes
|
|
18
|
-
are planr review commands.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
[[skills.config]]
|
|
22
|
-
path = "~/.codex/skills/planr-review/SKILL.md"
|
|
23
|
-
enabled = true
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# Copy to .codex/agents/planr-worker.toml (project) or ~/.codex/agents/ (user).
|
|
2
|
-
# Adjust the skill path to where the Planr skills are installed.
|
|
3
|
-
name = "planr_worker"
|
|
4
|
-
description = "Implements exactly one picked Planr map item to evidence-backed completion, then requests review and stops."
|
|
5
|
-
|
|
6
|
-
# Cost tiering: the pick packet bounds the worker's scope, so it can run on a
|
|
7
|
-
# lower effort tier than the driver session. Verify the pin took effect after
|
|
8
|
-
# the first spawn (some Codex versions ignore custom agent files on spawn —
|
|
9
|
-
# openai/codex#26868); see docs/GOALS.md "Cost Tiering" for the smoke test.
|
|
10
|
-
model = "gpt-5.5"
|
|
11
|
-
model_reasoning_effort = "medium"
|
|
12
|
-
|
|
13
|
-
developer_instructions = """
|
|
14
|
-
Use the planr-work skill exactly as written for the single item id you are given.
|
|
15
|
-
Implement only that item. Log changed files and the real verification commands you ran.
|
|
16
|
-
Request review with `planr review request <item-id>` and stop. Never close reviews or items yourself.
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
[[skills.config]]
|
|
20
|
-
path = "~/.codex/skills/planr-work/SKILL.md"
|
|
21
|
-
enabled = true
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
schema_version = 1
|
|
2
|
-
id = "claude-native"
|
|
3
|
-
version = "1.0.0"
|
|
4
|
-
host = "claude-code"
|
|
5
|
-
driver_role = "driver"
|
|
6
|
-
default_role = "driver"
|
|
7
|
-
capability_evidence = ["builtin-claude-project-agent-contract"]
|
|
8
|
-
billing_assumptions = ["Planr records declared tiers; Claude Code remains billing authority"]
|
|
9
|
-
known_limitations = ["session environment may preempt the requested subagent model"]
|
|
10
|
-
|
|
11
|
-
[capabilities]
|
|
12
|
-
model_override = true
|
|
13
|
-
effort_override = true
|
|
14
|
-
fork_none = true
|
|
15
|
-
fork_all = false
|
|
16
|
-
|
|
17
|
-
[profiles.driver]
|
|
18
|
-
profile = "claude-native-driver"
|
|
19
|
-
client = "claude-code"
|
|
20
|
-
model = "opus"
|
|
21
|
-
effort = "high"
|
|
22
|
-
cost_tier = "premium"
|
|
23
|
-
|
|
24
|
-
[profiles.worker]
|
|
25
|
-
profile = "claude-native-worker"
|
|
26
|
-
client = "claude-code"
|
|
27
|
-
model = "sonnet"
|
|
28
|
-
effort = "medium"
|
|
29
|
-
cost_tier = "standard"
|
|
30
|
-
skill = "planr-work"
|
|
31
|
-
fork_turns = { mode = "none" }
|
|
32
|
-
|
|
33
|
-
[[routes]]
|
|
34
|
-
work_type = "code"
|
|
35
|
-
role = "worker"
|
|
36
|
-
fallback_roles = ["driver"]
|
|
37
|
-
|
|
38
|
-
[verification]
|
|
39
|
-
id = "builtin-claude-native-v1"
|
|
40
|
-
verified_at_unix = 1783987200
|
|
41
|
-
max_age_seconds = 31536000
|
|
42
|
-
|
|
43
|
-
[[artifacts]]
|
|
44
|
-
path = ".claude/agents/planr-preset-worker.md"
|
|
45
|
-
kind = "claude_agent"
|
|
46
|
-
content = '''---
|
|
47
|
-
name: planr-preset-worker
|
|
48
|
-
model: sonnet
|
|
49
|
-
effort: medium
|
|
50
|
-
---
|
|
51
|
-
Use the planr-work skill and preserve Planr evidence.
|
|
52
|
-
'''
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
schema_version = 1
|
|
2
|
-
id = "codex-openai"
|
|
3
|
-
version = "1.0.0"
|
|
4
|
-
host = "codex"
|
|
5
|
-
driver_role = "driver"
|
|
6
|
-
default_role = "driver"
|
|
7
|
-
capability_evidence = ["builtin-codex-none-fork-contract"]
|
|
8
|
-
billing_assumptions = ["Planr records declared tiers; Codex remains billing authority"]
|
|
9
|
-
known_limitations = ["effective model and effort require host-reported evidence"]
|
|
10
|
-
|
|
11
|
-
[capabilities]
|
|
12
|
-
model_override = true
|
|
13
|
-
effort_override = true
|
|
14
|
-
fork_none = true
|
|
15
|
-
fork_all = false
|
|
16
|
-
max_partial_fork_turns = 4
|
|
17
|
-
|
|
18
|
-
[profiles.driver]
|
|
19
|
-
profile = "codex-openai-driver"
|
|
20
|
-
client = "codex"
|
|
21
|
-
model = "gpt-5.5"
|
|
22
|
-
effort = "xhigh"
|
|
23
|
-
cost_tier = "premium"
|
|
24
|
-
|
|
25
|
-
[profiles.worker]
|
|
26
|
-
profile = "codex-openai-worker"
|
|
27
|
-
client = "codex"
|
|
28
|
-
model = "gpt-5.4-mini"
|
|
29
|
-
effort = "high"
|
|
30
|
-
cost_tier = "standard"
|
|
31
|
-
skill = "planr-work"
|
|
32
|
-
fork_turns = { mode = "none" }
|
|
33
|
-
|
|
34
|
-
[[routes]]
|
|
35
|
-
work_type = "code"
|
|
36
|
-
role = "worker"
|
|
37
|
-
fallback_roles = ["driver"]
|
|
38
|
-
|
|
39
|
-
[verification]
|
|
40
|
-
id = "builtin-codex-openai-v1"
|
|
41
|
-
verified_at_unix = 1783987200
|
|
42
|
-
max_age_seconds = 31536000
|
|
43
|
-
|
|
44
|
-
[[artifacts]]
|
|
45
|
-
path = ".codex/agents/planr-preset-worker.toml"
|
|
46
|
-
kind = "codex_agent"
|
|
47
|
-
content = '''name = "planr_preset_worker"
|
|
48
|
-
description = "Implements one picked Planr map item with evidence-backed handoff."
|
|
49
|
-
model = "gpt-5.4-mini"
|
|
50
|
-
model_reasoning_effort = "high"
|
|
51
|
-
sandbox_mode = "workspace-write"
|
|
52
|
-
|
|
53
|
-
developer_instructions = """
|
|
54
|
-
Use the planr-work skill for exactly one picked item. Preserve the task scope, record changed files and real verification commands, request review, and stop.
|
|
55
|
-
"""
|
|
56
|
-
'''
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
schema_version = 1
|
|
2
|
-
id = "cursor-fable-grok"
|
|
3
|
-
version = "1.0.0"
|
|
4
|
-
host = "cursor"
|
|
5
|
-
driver_role = "driver"
|
|
6
|
-
default_role = "driver"
|
|
7
|
-
capability_evidence = ["builtin-cursor-project-agent-contract"]
|
|
8
|
-
billing_assumptions = ["Planr records declared tiers; Cursor remains billing authority"]
|
|
9
|
-
known_limitations = ["workspace policy or Max Mode may override the requested model"]
|
|
10
|
-
|
|
11
|
-
[capabilities]
|
|
12
|
-
model_override = true
|
|
13
|
-
effort_override = false
|
|
14
|
-
fork_none = true
|
|
15
|
-
fork_all = false
|
|
16
|
-
|
|
17
|
-
[profiles.driver]
|
|
18
|
-
profile = "cursor-fable-driver"
|
|
19
|
-
client = "cursor"
|
|
20
|
-
model = "fable-5"
|
|
21
|
-
cost_tier = "premium"
|
|
22
|
-
|
|
23
|
-
[profiles.worker]
|
|
24
|
-
profile = "cursor-grok-worker"
|
|
25
|
-
client = "cursor"
|
|
26
|
-
model = "grok-code-fast-1"
|
|
27
|
-
cost_tier = "standard"
|
|
28
|
-
skill = "planr-work"
|
|
29
|
-
fork_turns = { mode = "none" }
|
|
30
|
-
|
|
31
|
-
[[routes]]
|
|
32
|
-
work_type = "code"
|
|
33
|
-
role = "worker"
|
|
34
|
-
fallback_roles = ["driver"]
|
|
35
|
-
|
|
36
|
-
[verification]
|
|
37
|
-
id = "builtin-cursor-fable-grok-v1"
|
|
38
|
-
verified_at_unix = 1783987200
|
|
39
|
-
max_age_seconds = 31536000
|
|
40
|
-
|
|
41
|
-
[[artifacts]]
|
|
42
|
-
path = ".cursor/agents/planr-preset-worker.md"
|
|
43
|
-
kind = "cursor_agent"
|
|
44
|
-
content = '''---
|
|
45
|
-
name: planr-preset-worker
|
|
46
|
-
model: grok-code-fast-1
|
|
47
|
-
---
|
|
48
|
-
Use the planr-work skill and preserve Planr evidence.
|
|
49
|
-
'''
|