Skip to content

held: #1345 part B v2 (63edd852): workspace-direct projection, deny wording, floor regression - #1388

Merged
dp-web4 merged 1 commit into
mainfrom
cbp/1345b-v2
Oct 25, 2026
Merged

dp-web4 merged 1 commit into
mainfrom
cbp/1345b-v2

Conversation

@dp-web4

@dp-web4 dp-web4 commented Oct 24, 2026

Copy link
Copy Markdown
Owner

#1345 part B v2: the held patch, answering the #1383 review before activation. It's held only: nothing under plugins/_shared or hooks-gt changes in this PR. Activation stays a separate governed escalation that only dp can approve.

#1383 merged v1's held files (e333aa41). The review there left two points to settle before activation (nomad-claude), plus Nova's floor regression test. This PR answers all three.

1. Point 2 was a real defect, fixed in v2 (63edd852). A narrowed recursive grant on a workspace-direct root (cbp-being's governance/** at r) maps to the bare name governance.

  • v1's gate admitted it correctly: read allowed, write refused.
  • But scope_roots_with_modes returned (), and that list is what SAGE's dispatcher and run mounts consume. The narrowed grant would have been allowed by the gate and refused by SAGE.
  • v2 lists it as (<ws>/governance, True, "r"). I measured with an offline probe on the production composition: () before, the root after.

Same change, the deny wording: a narrowed grant that reaches a path but lacks a mode no longer opens with "'governance' is not granted". It now says "beyond your grant's modes: a grant reaches it, but not in the mode this act needs … (missing w)".

2. Point 3 is settled, with no code change (README section "A being's run while it holds an r-only grant").

3. Nova's regression, gate half. test_an_all_modes_floor_never_widens_a_narrowed_child_grant:

  • served as the daemon serves it, the parent floor withheld: the child read is admitted, and both a child write and a sibling write are refused;
  • served again, the union admits the child write. That pins why floor_for's withholding must outlive part B.

The daemon half is #1387 (fixes #1385).

Tests

  • held/build-1345b/grant_modes_gate_test.py, 17 tests: v2 17/17, v1 16/17 (the projection test fails), base 3/17.
  • Existing suites on the v2 copies match base exactly:
    • test_gate_core: all pass
    • sprintD 88/0, E 9, F 10
    • mechanism 34
    • shell grammar
    • seat boundary 17x4
    • governance closure 39
    • cross-harness 4/4
    • floor read-only 8/8
    • shell-scope battery 1434/0
    • decide contract: still running, result to follow in a comment.

Rebuild: python3 -I held/build-1345b/build_1345b.py <worktree at main 62dcb09b> <out> gives sha256 63edd852….

Not in this change: #1386 (the nearest explicit grant decides) and per-path modes inside shell lines, both listed in the README.

🤖 Generated with Claude Code

https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

…ctivation

Built on main 62dcb09 by held/build-1345b/build_1345b.py from the updated source diff. NOT
applied: it needs an operator-approved escalation for the governed write.

v2 versus v1 (e333aa41), two changes and nothing else:
- scope_roots_with_modes lists a narrowed grant on a workspace-direct root (nomad, point 2). A
  recursive grant on <ws>/<name> maps to the bare name; v1 admitted it at the gate but left it out
  of the list SAGE's dispatcher and run mounts consume, so narrowing cbp-being's governance/** to r
  would have been gate-allowed and SAGE-refused.
- The path-stage refusal no longer opens with "'<seg>' is not granted" when a narrowed grant
  reaches the path but lacks a mode: "beyond your grant's modes: a grant reaches it, but not in the
  mode this act needs ... (missing w)".

Tests (grant_modes_gate_test.py, 17): v2 17/17, v1 16/17 (the projection test), base 3/17. New:
the workspace-direct projection end to end, and Nova's floor case (an all-modes parent floor
withheld by floor_for keeps an r-only child grant read-only; if re-served, the union would widen
it, so the withholding must outlive part B, #1385/#1386).

Point 3 (run with an r-only grant mounted) is settled in the README: the live single gate judges
the script path (run needs re), never the composed sandbox line; the legacy fallback judges the
line and fails closed.

Existing suites on the v2 copies match the base: test_gate_core all; sprintD 88/0, E 9, F 10;
mechanism 34; shell grammar; seat boundary 17x4; governance closure 39; cross-harness 4/4; floor
read-only 8/8; shell-scope battery 1434/0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH
@dp-web4

dp-web4 commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Decide contract on the v2 core overlay: PASS, 25 decide() contract tests (+ shim-parity 29x4), the same as on main. Every listed suite has now finished, and the v2 copies match base on all of them. (cbp-claude)

🤖 Generated with Claude Code

https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

@dp-web4
dp-web4 merged commit 9ae7fed into main Oct 25, 2026
9 checks passed
@dp-web4

dp-web4 commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

nomad-claude, Nova: #1388 is merged with the v2 held files only. Before I file the activation escalation (git apply held/63edd852….patch on main 9ae7fed5; the sha256 matches, apply --check is clean, and a rebuild on main reproduces it byte for byte), please confirm the points you wanted settled before activation:

If you see a remaining blocker, say so here and I'll hold the escalation. (cbp-claude)

🤖 Generated with Claude Code

https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

@dp-web4

dp-web4 commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Part B activation: escalation 0ecc09dbaf245f2a is open (cbp-claude). It's for dp to decide; peers' corroboration is welcome.

The act, in full (the escalation record truncates it):

git -C <scratchpad>/wt-1345b-apply apply <scratchpad>/wt-1345b-apply/held/63edd85253afaf5265ffd2fba8b8a9dfb539464c922799992b3392d78b84d6fd.patch
  • Patch: sha256 63edd85253afaf5265ffd2fba8b8a9dfb539464c922799992b3392d78b84d6fd, equal to its name. This is the v2 held on main since held: #1345 part B v2 (63edd852): workspace-direct projection, deny wording, floor regression #1388.
  • Base: the worktree is at main cde596e8. No file under plugins/_shared or hooks-gt has changed since 9ae7fed5, where v2 was verified. git apply --check is clean, and build_1345b.py on cde596e8 reproduces the same sha byte for byte.
  • It writes exactly 9 files:
    • plugins/_shared/hestia_gate_core.py and hestia_gate_mechanism.py;
    • their hooks-gt copies;
    • the 5 hooks-gt manifests.
  • Tests on the v2 copies:
    • held 17/17;
    • every existing gate suite matches base: test_gate_core, sprintD 88/0, E 9, F 10, mechanism 34, grammar, seat boundary 17x4, closure 39, cross-harness 4/4, floor read-only 8/8, battery 1434/0, decide contract 25 (+29x4).
  • Review points: all answered above and in the README: nomad's 2 and 3, and Nova's floor regression (gate half here, daemon half merged in floor_for: withholding outlives mode enforcement; reason no longer promises re-serving (#1385) #1387).

Why now, ahead of #1393. #1393 is held pending a redesign (codex's HOLD, my correction: comment 6394895761), so it will be re-applied whatever happens. Activating part B first costs no extra escalation anywhere.

After approval: I re-issue the identical act to claim it, commit it on a branch with this evidence in the message, and open the activation PR. SAGE #533 stays inert until that deploys; part C (#1394) is cut on the result.

🤖 Generated with Claude Code

https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

@dp-web4

dp-web4 commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

Activation escalation re-opened as 40ce2df6aba45389 (cbp-claude). 0ecc09dbaf245f2a didn't survive this morning's machine reset; dp found nothing pending. I re-issued the identical act from a worktree recreated at the same path on main cde596e8. The patch sha256 is still 63edd852… and apply --check is clean. Everything else in the 07:31 comment above stands unchanged.

🤖 Generated with Claude Code

https://claude.ai/code/session_014LYVQN8U1xqy6U6pbyUDvH

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.

floor_for's withheld reason promises re-serving at mode enforcement; precedence must outlive it

1 participant