Skip to content

docs: resequence the roadmap around soundness before ergonomics - #1

Merged
nikicat merged 1 commit into
mainfrom
worktree-plan-resequence
Jul 27, 2026
Merged

docs: resequence the roadmap around soundness before ergonomics#1
nikicat merged 1 commit into
mainfrom
worktree-plan-resequence

Conversation

@nikicat

@nikicat nikicat commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Re-prioritizes the roadmap. The queue becomes bugs → finish M3 → M5 → M6, with blessing's B3/B4 deferred behind the core.

Why

M5 and M6 are the two ways the boundary is currently unsound:

  • M5 — enforcement fails open the moment the daemon dies, which makes every other guarantee conditional on a process staying alive.
  • M6exe is mm->exe_file, so LD_PRELOAD hijacks any static allow. Every static allow is a confused-deputy grant.

No ergonomic win is worth having on top of either, so blessing waits. B3 costs nothing to postpone — it relaxes the mint gate, and B1+B2 already ship a usable bless. B4 defers by its own logic: a blanket "uncordoned" class is a skeleton key, and widening the grant surface before M5/M6 close those holes gets the order backwards.

Changes

  • STATUS.md — "What's left" restructured into First (bugs, then M3) / Next (the must-haves) / Deferred.
  • PLAN-rule-model.md — new "Order of work" block; M5 loses "orthogonal, already parked"; milestone headings carry their status.
  • PLAN-bless.md — B3 and B4 marked deferred, with the reasoning.
  • DESIGN.md — two drift fixes: §16 still claimed B1 only (B2 shipped 2026-07-27), and §15.11 phasing had no M6 at all despite it being the largest known hole.

M2 and M4 stop being scheduled on their own — M6 pulls in the parts it needs (M2's unsandboxed predicate is M6 enforcement point 3; M4's learning machinery is how code sets get built), and the remainder is opportunistic.

Also promotes the root-writable /tmp self-test probe out of the carried-over notes. It is a live local escalation — a planted symlink gets root to truncate /etc/cordon/policy.toml, after which the daemon fails to compile and the boundary is off entirely — so it is item 1 in the queue, not a rough edge.

Docs only; no code touched.

🤖 Generated with Claude Code

The queue is now bugs -> finish M3 -> M5 -> M6. M5 and M6 are the two ways
the boundary is currently unsound -- it stops enforcing when the daemon dies,
and a static allow is hijackable by LD_PRELOAD -- so they become the
must-haves, and blessing's B3/B4 defer behind them. B3 costs nothing to
postpone: it *relaxes* the mint gate, and B1+B2 already ship a usable bless.
B4 defers by its own logic, since a blanket "uncordoned" class widens the
grant surface exactly where M5/M6 have not yet closed it.

M2 and M4 stop being scheduled on their own: M6 pulls in the parts it needs
(M2's `unsandboxed` predicate is M6 enforcement point 3, M4's learning
machinery is how code sets get built), and the remainder is opportunistic.

Also promotes the root-writable /tmp self-test probe out of the carried-over
notes -- it is a live local escalation that can switch the boundary off, not
a rough edge -- and closes two doc drifts: DESIGN 16 still claimed B1 only,
and DESIGN 15.11 had no M6 at all despite it being the largest known hole.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@nikicat
nikicat marked this pull request as ready for review July 27, 2026 22:12
@nikicat
nikicat merged commit 49a801a into main Jul 27, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant