Files
rune/scripts/admit_wave_d49_capability_everywhere.py
T
Nick d31359f3a5
CI Pipeline / best-practices (push) Successful in 15s
CI Pipeline / documentation (push) Successful in 16s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 25s
CI Pipeline / type-check (push) Canceled after 6s
Auto-version and Release / release (push) Canceled after 29s
CI Pipeline / unit-tests (push) Canceled after 30s
CI Pipeline / gitea-offline (push) Canceled after 13s
CI Pipeline / go-surface (push) Canceled after 30s
CI Pipeline / lint (push) Canceled after 30s
CI Pipeline / canary (push) Canceled after 31s
deploy / deploy (push) Canceled after 20s
feat(runecore): D49 capability in every pane + native git tool family (red-first)
The owner's ruling — 'i want that ability to be in every pane' —
supersedes the mode-gated toolset: ToolsetFor now exposes the full
suite (read + write families) in CHAT, PLAN and TASK alike, and
ExecuteGatedTool's write-refusal-by-mode retires; the dispatch-gate
seam stays (future policies hook there) with the typed refusal kept
for genuinely-unavailable tools. The wire tool descriptions state the
write availability — the model asked for shell access because the wire
showed read-only; the wire is fixed, not the model. The consent card
remains the work-promotion mechanism (organization), never a
permission gate; the real safety layer is the scaffolding authority +
contract gates at mutation doors.

Native git family (gittools.go): git_status, git_diff (unstaged+
staged, names and patch forms), git_log, git_branch, git_add,
git_commit — stdlib git subprocess in DefaultRepoRoot() (RUNE_REPO_ROOT
override), porcelain parsed honestly (-z, tab records), typed JSON
results. git_add/git_commit refuse the landing-law banned paths
(check_landing.py rule 4 SWEEP_RACE_BANNED_PATHS + 20MB ceiling);
git_commit runs the repository's own pre-commit hook in a real
checkout.

Contract: ADMIT-wave-d49-capability-everywhere (mode/toolset tests
re-pinned to CHAT=full-suite, red-first evidence against the pre-wave
toolset; go test -race green, vet/gofmt clean).
2026-10-22 20:46:48 +01:00

151 lines
6.8 KiB
Python

"""Admission dispatch for wave D49 — capability everywhere (owner doctrine).
The owner's D49 ruling (verbatim, 2026-10-22): "ive asked rune if she
can alter her code she said she needs shell access, and the ability to
read and write i want that ability to be in every pane, but when
something gets to become work it gets promoted into the task pane. she
also needs tools to be able to connect to git projects. and make that
native." Doctrine: capability is INHERENT in every pane — the write
family (write_file, edit_file, run_command) and the new native git
family ride the wire in CHAT/PLAN/TASK alike; the consent card remains
the work-promotion mechanism (organization, not permission); the real
safety layer is the scaffolding authority + contract gates at mutation
doors. Build: (1) ToolsetFor exposes the full suite in every mode; (2)
ExecuteGatedTool's write-refusal-by-mode retires, the dispatch-gate
seam and the genuinely-unavailable refusal stay; (3) the wire tool
descriptions state the write availability (the model asked for shell
access because the wire showed read-only — fix the wire); (4) a native
git family (git_status, git_diff, git_log, git_branch, git_commit,
git_add) shelling out to git in the repo root (DefaultRepoRoot seam),
porcelain-parsed honestly, typed JSON results, landing-law banned-path
refusals on git_add/git_commit; (5) the mode/toolset tests re-pinned
to CHAT=full-suite, red-first throughout.
approval_ref 'user:D49 owner ruling 2026-10-22 (capability in every
pane; native git tools)'.
"""
import json
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
from rune import construction_activation as cact # noqa: E402
from rune import construction_admission as cadm # noqa: E402
from rune import construction_mode as cmode # noqa: E402
from rune import scaffold as sc # noqa: E402
ROOT = os.path.join(os.path.dirname(__file__), "..")
OBJECTIVE = (
"Build the owner's D49 doctrine — capability in every pane: (1) "
"make ToolsetFor expose the full tool suite (read family + write "
"family) in every mode so CHAT and PLAN carry write_file, "
"edit_file and run_command like TASK does; (2) retire "
"ExecuteGatedTool's write-refusal-by-mode so writes execute in any "
"mode while keeping the dispatch-gate seam and the typed refusal "
"for genuinely-unavailable tools; (3) state the write availability "
"in the tool descriptions the wire carries so the model knows its "
"shell and file abilities without asking; (4) add a native git "
"tool family — git_status, git_diff, git_log, git_branch, "
"git_commit, git_add — implemented by shelling out to git in the "
"repo root through the DefaultRepoRoot seam, parsing porcelain "
"output honestly, returning typed JSON, and refusing banned "
"landing-law paths on git_add and git_commit; (5) re-pin the "
"mode/toolset tests to the new doctrine (CHAT carries the full "
"suite) red-first and keep the runecore package -race green"
)
AFFECTED = [
"src/go/rune-core/",
"scripts/admit_wave_d49_capability_everywhere.py",
]
def main() -> int:
store = os.path.join(ROOT, "store", "scaffold")
scaffold = sc.Scaffold(store, "rune")
md = cmode.classify_mode(
OBJECTIVE,
target_project="rune",
project_exists=True,
affected_surface=AFFECTED,
)
print("classified mode:", md.mode)
need = {
"need_id": "need-wave-d49-capability-everywhere",
"objective": OBJECTIVE,
"origin": "worker",
"project": "rune",
"task_ref": "wave-d49-capability-everywhere",
"affected_surface": AFFECTED,
"evidence_refs": [
"owner ruling D49 2026-10-22 (verbatim in session notes): "
"capability in every pane, work promotes to the task pane, "
"native git tools",
"src/go/rune-core/internal/runecore/tools.go (the "
"mode-gated toolset this wave supersedes)",
"commit b35078bb (task channel inherits TASK semantics)",
"scripts/check_landing.py rule 4 SWEEP_RACE_BANNED_PATHS "
"(the landing-law banned-path set git_add/git_commit "
"refuse)",
"scripts/admit_wave_presentation.py (the admission "
"pattern)",
],
}
act = cact.activate(md, need=need, scaffold=scaffold,
builder="wave-d49-capability-everywhere")
print("activated:", act.get("activated"), act.get("mode"))
env = cadm.admit(
act,
objective=OBJECTIVE,
builder="wave-d49-capability-everywhere",
affected_surface=AFFECTED,
evidence_refs=need["evidence_refs"],
origin="worker",
task_ref="wave-d49-capability-everywhere",
expected_new_entities=[
"src/go/rune-core/internal/runecore (ToolsetFor full "
"suite in every mode; ExecuteGatedTool write-refusal "
"retired with the dispatch-gate seam kept; wire tool "
"descriptions state write availability)",
"src/go/rune-core/internal/runecore/gittools.go (the "
"native git family: git_status, git_diff, git_log, "
"git_branch, git_commit, git_add — stdlib git subprocess "
"in the repo root, porcelain parsed honestly, typed JSON "
"results, landing-law banned-path refusals)",
"tests: red-first re-pins of the mode/toolset suites to "
"CHAT=full-suite + per-tool git fixture tests, -race "
"green",
],
expected_runtime_effects=[
"every pane's model sees and can execute the write family "
"and the git family; work-shaped activity still promotes "
"to the tasks pane via the consent card (organization, "
"not permission)",
"the model can connect to git projects natively: status, "
"diff, log, branch, add and commit as first-class typed "
"tool results",
"the landing-law banned paths never enter a git tool "
"staged tree or commit",
],
verification_obligations=[
"go test -race green for the whole runecore package "
"(including the cloud wires); go vet + gofmt clean",
"red-first evidence: the re-pinned suites fail against "
"the pre-wave toolset before the implementation lands",
"commit(s) name this contract; pre-commit staged gate "
"green via this open contract",
],
approval_ref="user:D49 owner ruling 2026-10-22 (capability in "
"every pane; native git tools)",
contract_id="ADMIT-wave-d49-capability-everywhere",
project_store=store,
project_id="rune",
)
print(json.dumps(env, indent=2, default=str)[:2400])
if __name__ == "__main__":
raise SystemExit(main())