v0.3.0 milestone¶
Status: active architecture milestone; no WRITE capability is authorized.
Immutable production baseline¶
v0.2.2 is the immutable published READ platform. Its tag, artifacts, public contract, acceptance evidence, and release interpretation must not change.
- Auditor: 41 READ tools, 0 WRITE tools.
- Engineer: 0 tools.
- Active WRITE capabilities: 0.
- WRITE endpoint allow-list entries: 0.
- Production mutation transport reachability: 0.
v0.2.3 is reserved for READ-platform bug fixes and security hotfixes. Feature development targets v0.3.0.
v0.3.0 objective¶
Make the Tier 1 safety architecture implementation-ready while keeping every mutation path unreachable. A first capability may enter v0.3.0 only after a separate owner approval names its tool, capability, exact endpoint and method, typed field scope, disposable lab, rollback semantics, and acceptance plan.
Architecture sprint deliverables¶
- A closed Recovery Contract model with deterministic, domain-separated bindings for capability, endpoint, method, target, fingerprint, intent, snapshot, confirmation, idempotency, rollback version, expiry, and state.
- A complete state machine with atomic compare-and-set persistence, target reservations, integrity checks, restart reconciliation, and no blind retry.
- Exact policy primitives whose production instance is empty.
- Value-free audit event and durable transition metadata.
- Adversarial/fault tests covering replay, stale state, corruption, crashes, ambiguous outcomes, concurrency, rollback conflicts, and isolation.
- A complete writable-endpoint risk inventory and first-capability study.
- A disposable integration-lab plan.
Subsystem review¶
| Subsystem | Baseline weakness/debt | v0.3.0 direction |
|---|---|---|
| Capabilities | WRITE enum placeholders exist but are intentionally unsupported | Keep build/profile sets unchanged; future activation requires an exact rule plus profile approval |
| Tool registration | Empty register_all_write() is safe but has no future manifest |
Retain isolation; design a capability-specific registration record only with the approved first tool |
| Endpoints | WriteEndpoints is empty; broad upstream CRUD routes combine safe and unsafe fields |
Keep empty; future rule names one endpoint, method, response, field projection, and API version |
| Transport | Tier 0 write client lacks typed body/status/outcome semantics | Do not extend until a capability is approved; future executor sends once and distinguishes proven failure from ambiguity |
| Recovery | Tier 0 OPEN/COMMITTED in-memory model cannot survive crashes |
New isolated Tier 1 package supplies digest-bound records, state machine, protected artifacts and atomic durable store |
| Audit | Tier 0 decorator is value-minimized but not transition-atomic | Tier 1 store records state metadata atomically; separate event model excludes values/messages |
| OpenAPI | Endpoint existence is not safe-operation evidence | Pin source discovery and compare exact disposable-lab OpenAPI plus behavior before proposal |
| MCP surface | READ public contract is stable | No Tier 1 import or tool; future schema exposes IDs/digests and typed intent, never authoritative contract state |
| Tests | Tier 0 happy-path mocks overstate readiness | Add exhaustive state, binding, persistence, corruption, isolation and fault tests before transport work |
| Package layout | Dormant Tier 0 and future safety logic could become coupled | New pfsense_mcp.tier1 depends inward on pure types and remains absent from bootstrap imports |
Candidate recommendation¶
The preferred first study is a firewall-alias description-only PATCH, not a generic alias update. The fallback study is a system-tunable description-only PATCH. Neither is authorized. See the complete risk matrix.
Owner decisions still required¶
Resolved since this milestone was first written, kept here only as a
correction so this section doesn't misstate already-closed decisions:
the protected-artifact encryption/key-provider design (ADR-009/010,
implemented), the confirmation and reconciliation authorities
(ADR-012/013, implemented), rate/blast-radius containment
(ADR-015, mechanism implemented; numeric defaults remain provisional
pending lab evidence), the sealed executor interface (ADR-014,
implemented), and disposable-lab research authorization for the alias
candidate specifically (ADR-016, accepted — research only, not
production activation).
Still genuinely open:
- The anti-rollback anchor's concrete backend (TPM2 vs. remote witness) —
ADR-011, pending confirmation of production host TPM availability. The backend-agnostic protocol and store wiring are already implemented. - Select or reject the first candidate and its exact field projection —
ADR-016authorizes researching the alias candidate in a disposable lab, not selecting or implementing it. - Approve an upstream least-privilege identity and disposable lab environment for a live lab run (the offline harness itself is implemented and tested; running it against a real VM is separately gated).
- Approve the capability, endpoint/method allow-list entry, tool schema, production construction, and live acceptance as separate gates — none of the above authorizes any of these.
Proposed v0.3.0 acceptance criteria¶
- The v0.2.2 READ contract remains unchanged and all READ gates pass.
- Auditor remains 41 READ / 0 WRITE until a separately approved activation.
- Engineer remains 0 until activation approval.
- Every Recovery Contract binding and legal/illegal transition is tested.
- Store corruption, stale versions, duplicate operations, target conflicts, restart states, and ambiguous outcomes fail closed without transport calls.
- Protected values never enter logs, errors, schemas, fixtures, reports, or distribution artifacts.
- A selected capability passes disposable-lab prepare/execute/verify/rollback and crash reconciliation before any production profile can expose it.