653 Commits
Author SHA1 Message Date
Nick 6b3ed6b721 feat(runecore): D57 runtime dominion — runtime-env layer, tool-executor deployment, model-refusal authority (Gitea #2590/#2591)
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Canceled after 0s
CI Pipeline / lint (push) Canceling
Auto-version and Release / release (push) Canceled after 29s
issue-convergence / converge (push) Successful in 2s
Owner's top-priority wave: runtime awareness of the user's filesystem
and dominion on tool call usage. Boot-time filesystem probe served on
/v1/status as runtime_env (awareness, never gating); tool-executor
deployed to ~/.local/share/rune/bin via ensure_core.py and
build_paired.sh with one resolution door; deterministic literal-phrase
refusal classifier verifies model capability claims against the actual
suite, corrects false claims with a retry turn naming the real tools,
and journals capability.refusal_correction; model_authority facts on
/v1/status; the dominion check asserts no gate exists between
chat-pane tool calls and filesystem ops.

Contract: ADMIT-wave-d57-runtime-dominion. go test -race -short green;
vet/gofmt clean.
2026-10-25 21:45:37 +00:00
Nick 65d3ffd3e0 chore(scripts): admission dispatch for the second-pass verification wave (Gitea #2596)
Auto-version and Release / release (push) Failing after 34s
CI Pipeline / lint (push) Failing after 45s
CI Pipeline / go-surface (push) Failing after 22s
CI Pipeline / rust-surface (push) Failing after 10s
CI Pipeline / unit-tests (push) Failing after 1m8s
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / documentation (push) Successful in 3s
CI Pipeline / canary (push) Failing after 59s
CI Pipeline / gitea-offline (push) Successful in 14s
CI Pipeline / type-check (push) Failing after 42s
issue-convergence / converge (push) Successful in 1s
deploy / deploy (push) Failing after 16s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Failing after 6s
classify + activate + admit of the adversarial re-verification of the
10 remaining general-34 facades at the cache-catch standard; evidence
refs name the serving-path catch (goal fail-loud save) and the three
mutation-gap pins.
2026-10-25 18:06:52 +00:00
Nick a35fb1de01 research: wiring-inventory triage — 87 witness live-pure modules into four piles; the honest rebase remainder is 30 modules / 22.6k lines (#2586 inventory)
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Canceled after 0s
Auto-version and Release / release (push) Canceled after 28s
CI Pipeline / lint (push) Canceled after 25s
issue-convergence / converge (push) Successful in 2s
2026-10-25 16:28:32 +00:00
Nick 408bbb11a4 feat(governor): WAVE D56 — the provider-aware dispatch governor + the live tok/s readout (ADMIT-wave-d56-governor; Gitea #2580 + #2581, owner doctrine 2026-10-24: cloud-first routing, no consent gates on cloud, routing scope = factory lane assignment): (1) TELEMETRY — runecore.Governor samples live tok/s per provider from the engine's REAL turns (provider output-token accounting wired on every wire: ollama eval_count, [OI] completion_tokens, anthropic output_tokens, gemini candidatesTokenCount; honest token-estimate fallback when the wire carries none; a zero-token turn is never a sample); rolling per-provider samples + (provider,lanes) EMA saturation curve persisted via the hot-state pattern (~/.rune/hot/provider_throughput.json, atomic temp+rename, survives restarts); (2) SATURATION MODEL — lane cap = the highest lanes bucket whose marginal tok/s gain clears the floor (RUNE_GOVERNOR_CAP_FLOOR, default 5); no curve = honest cap 1, never invented headroom; (3) CONNECTION-HEALTH (#2581) — the core polls the registry's enabled providers on a 60s cadence (reachable/authenticated/tok/s/error_rate/last_error); the route refuses unreachable, never-probed-alive and 429-throttled providers (a throttle is worse than not spawning) while day-one pre-probe routing passes through; (4) LANE POOLS + CLOUD-FIRST — Route() orders cloud rows ahead of local (the servedByLocalBinding law), least-loaded within a tier, lane pools tracked via Acquire/ReleaseLane; (5) CLASSIFIER INTEGRATION — dispatch-classifier LoadCapacity reads the same hot file; PARALLEL verdicts become throughput-aware ('governor: N lanes free at current tok/s'), the thin pipe states '0 lanes free ... serialize, no fan-out benefit', unknown capacity stays honest; registry/lock semantics byte-unchanged (locks untouched, asserted); (6) INFO BAR READOUT — /v1/status gains the governor section; both bridge seams (serve + library) carry it; the info bar renders ' · 38 tok/s' after the context readout and NOTHING when nothing was measured (the bar never guesses); the sub-agents section shows the governor's own state row (lanes in use/cap, measured tok/s or '—'); red-first tests: governor laws (samples/persist/cap/cloud-first/health/thin-pipe/lanes), classifier capacity laws, bridge both-seam propagation, hermetic fake-serve info-bar proof '(13%) · 38 tok/s'; go test -race -short green on rune-core, dispatch-classifier, tui; vet/gofmt clean; deployed build_paired → ~/.local/share/rune/bin/rune-tui + rune-core rebuilt, core restarted — /v1/status serving the governor section live 2026-10-25 01:21:55 +00:00
Nick 4a1e994d43 feat(openai-compat-transport): REBASE-COMPLETION wave 1/11 — fail-loud Go delegation wired into the serving path (Gitea #2587): eval.go ops surface (to_openai_messages/from_openai_response/is_cloud_pinned/chat/cloud_transport_for) added to the Go engine beside its 83-case truth replay (still exact-equal); every seam in src/rune/openai_compat_transport.py now resolves through the Go binary (whole chat turn incl. usage accumulation), Python oracle bodies kept as RUNE_OPENAI_COMPAT_TRANSPORT_ENGINE=python escape/oracle, RUNE_OPENAI_COMPAT_TRANSPORT_BIN override, typed RuntimeError on missing binary (no silent fallback — house shape model_routing.reconcile_tools_support); red-first parity battery (20 tests) against the oracle body caught ONE real drift — Go dropped the DeepSeek reasoning_content→thinking mapping (fixed byte-identical); mutation of the oracle flips the battery; oracle suite pinned to the Python bodies via autouse escape fixture (the dichotomy); integrated receipt verification/integrated/openai-compat-transport-integrated.json; admission contract ADMIT-wave-rebase-completion minted (rule-5 gate)
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
Auto-version and Release / release (push) Canceled after 26s
CI Pipeline / lint (push) Canceling
deploy / deploy (push) Canceled after 1s
2026-10-24 19:47:04 +01:00
Nick a46a0bb02a feat(tui): WAVE D55 — the D49 consent=promotion follow-through + the D53/D54 coherence pass (ADMIT-wave-d55-coherence): (1) the write/edit permission-gate special-casing leaves the approvals layer (IsWriteTool names the pane-wide capability family; a pending WRITE card never face-blocks the composer — the A2 typed-refusal law holds only for genuinely gated tools; the write card reads as WORK promotion, never permission; the consent bridge's wording audited, already D49-correct); (2) every style site resolves through the themes tokens (the confirm gold trio becomes RoleConfirm{Border,BG,Text} shared by approvals+consent; chat body/activity/gauge/border families move into the Tone() table, vivid+calm; the sub-floor ghost literal #78788A finally follows the D54 token lift; gauge-empty lifted off a ~1.5:1 literal); contrast floors assert every role AND tone in BOTH modes; the motion law's three invariants assert in one place; (3) THE STREAMING BACKSTOP SURVIVES THE CMD RETURN — chatDispatch's cancel rode a defer in the tea.Cmd closure that returns immediately, killing the 30-minute backstop and every real streamed dispatch with 'context canceled' (the D55 PTY-proof catch; red-first); (4) the 110-column live-core long-answer PTY proof harness (opt-in RUNE_LIVE_PTY_PROOF=1), the domain-registry full-coverage rows the registry run exposed, and the race build-tag gate for the documented full-race PTY flake (Gitea #2549 follow-through; #2568/#2571 coherence) 2026-10-24 17:39:32 +01:00
Nick 0de6f1bba4 fix(release): tag_repair CLI --namespace flag — workflow argv form (#2582)
Auto-label / auto-label (pull_request) Successful in 1s
Local-Model First-Pass Review (#131) / first-pass-review (pull_request) Successful in 20s
Spec gate (headless) / spec-gate (pull_request) Successful in 20s
CI Pipeline / documentation (pull_request) Successful in 10s
CI Pipeline / best-practices (pull_request) Successful in 10s
CI Pipeline / rust-surface (pull_request) Failing after 25s
CI Pipeline / gitea-offline (pull_request) Successful in 28s
CI Pipeline / go-surface (pull_request) Failing after 42s
CI Pipeline / lint (pull_request) Failing after 55s
CI Pipeline / type-check (pull_request) Failing after 57s
CI Pipeline / canary (pull_request) Failing after 3m13s
CI Pipeline / unit-tests (pull_request) Failing after 30m37s
CI Pipeline / required-checks (pull_request) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Failing after 5s
CI Pipeline / lint (push) Canceled after 0s
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
Auto-version and Release / release (push) Canceled after 17s
deploy / deploy (push) Canceled after 16s
2026-10-24 15:23:08 +01:00
conductor 9c5ea0aeb2 Merge pull request 'Plain-English release bodies: what changed + what to try on every pushed version (#2582 fix branch)' (#2583) from feat/2582-release-reporting into master
Auto-version and Release / release (push) Failing after 20s
CI Pipeline / best-practices (push) Successful in 17s
CI Pipeline / rust-surface (push) Failing after 30s
CI Pipeline / documentation (push) Successful in 14s
CI Pipeline / gitea-offline (push) Successful in 31s
CI Pipeline / go-surface (push) Failing after 53s
CI Pipeline / lint (push) Failing after 1m7s
CI Pipeline / type-check (push) Failing after 1m3s
CI Pipeline / canary (push) Failing after 3m23s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Canceled after 11m37s
CI Pipeline / unit-tests (push) Canceled after 12m10s
2026-10-24 15:11:36 +01:00
Nick f18b6cc363 feat(changelog): committed CI-checkable changelog — deterministic regen gate (#2582)
CI Pipeline / lint (push) Canceled after 0s
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Skipped
Local-Model First-Pass Review (#131) / first-pass-review (pull_request) Successful in 28s
CI Pipeline / rust-surface (pull_request) Failing after 25s
Spec gate (headless) / spec-gate (pull_request) Successful in 36s
CI Pipeline / best-practices (pull_request) Successful in 9s
CI Pipeline / documentation (pull_request) Successful in 8s
Auto-label / auto-label (pull_request) Successful in 1s
CI Pipeline / go-surface (pull_request) Failing after 48s
CI Pipeline / gitea-offline (pull_request) Successful in 19s
CI Pipeline / lint (pull_request) Failing after 59s
CI Pipeline / type-check (pull_request) Failing after 46s
CI Pipeline / canary (pull_request) Failing after 3m37s
CI Pipeline / unit-tests (pull_request) Failing after 37m50s
CI Pipeline / required-checks (pull_request) Failing after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Failing after 5s
Auto-version and Release / release (pull_request) Canceled after 0s
The changelog = a generated artifact, not a kept doc: CHANGELOG.md
composes from the MAIN v* tag namespace (one section per version: What is
new / What you could try / What verifies it) byte-deterministically; CI
lint runs "changelog --check" (byte-compare vs regeneration — a release
that skips its sync turns the gate red); auto-version syncs it after
every release with a chore(changelog) commit (the convergence classifier
ranks it "other" = earns no version, no recursion). Tests red-first
(deterministic composition, dedupe); the go battery + the generated
file are current as of v0.346.0.
2026-10-24 12:44:18 +01:00
Nick 01da5b0999 feat(release): plain-English version reads — namespace-aware tags, what-to-try narrative (#2582)
deploy / deploy (push) Skipped
CI Pipeline / best-practices (push) Successful in 12s
CI Pipeline / documentation (push) Successful in 13s
CI Pipeline / rust-surface (push) Failing after 19s
CI Pipeline / gitea-offline (push) Successful in 20s
CI Pipeline / go-surface (push) Failing after 39s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 47s
CI Pipeline / lint (push) Canceled after 51s
CI Pipeline / unit-tests (push) Canceled after 51s
CI Pipeline / type-check (push) Canceled after 52s
contract:ADMIT-release-reporting — the version-push reader page now
carries a plain-English body: What is new grouped fixed/new/improved,
What you could try derived from touched surfaces, How it was verified.
latest_release_tag namespaces (main v* vs tui-v*) so the TUI build tag
never blanks a release note; the workflow feeds one namespace-resolved
PREV_TAG to every range consumer; the Go narrative carries the try list
and the workflow rewires its callers. Tests red-first (python namespace
law, go try-section law) + retroactive v0.346.0 body rebuild follows.
2026-10-24 11:59:11 +01:00
Nick c8b12cc496 feat(tool-executor): the LOCAL TOOL EXECUTION GO DELEGATION — LocalToolRuntime's executor becomes a fail-loud delegation facade over src/go/tool-executor: the four read-only ops (read_file, list_directory, glob_files, grep_files) resolve through the Go binary by default with the JSON envelope preserved exactly; run_command stays behind the approval door (mutating — never silently executed); the Python bodies stay as oracle/escape hatch (RUNE_TOOL_EXECUTOR_ENGINE=python, RUNE_TOOL_EXECUTOR_BIN override, typed RuntimeError on missing binary, no Python deletion). Red-first parity battery caught four real Go↔Python divergences (trailing-newline line numbering, windowing context markers + offset-relative numbering, absolute grep paths, oracle error texts) before landing — all fixed byte-identical; scripted-executor test fixtures pin the python escape hatch (Gitea #2575 wave B, red-first)
CI Pipeline / documentation (push) Successful in 12s
CI Pipeline / best-practices (push) Successful in 13s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / lint (push) Canceled after 16s
CI Pipeline / go-surface (push) Canceled after 16s
CI Pipeline / rust-surface (push) Canceled after 16s
CI Pipeline / gitea-offline (push) Canceled after 2s
CI Pipeline / unit-tests (push) Canceled after 17s
CI Pipeline / canary (push) Canceled after 17s
CI Pipeline / type-check (push) Canceled after 3s
deploy / deploy (push) Canceled after 2s
Auto-version and Release / release (push) Canceled after 18s
2026-10-24 07:11:06 +01:00
Nick e39ea6ac36 feat(reconcile-tools): the CAPABILITY-FLOOR DRIFT RECONCILIATION GO PORT — reconcile_tools_support (the R2 I-R2-022 truth_drift seam) gains a Go engine surface (src/go/model_routing ReconcileToolsSupport + 'eval reconcile'), closing wave 181's full-switchover blocker: a provider supports_tools claim contradicting CAPABILITY_FLOOR surfaces as unverified drift, never silently flipping eligibility, non-floor models are never invented a floor verdict; the Python body stays as oracle/escape hatch (RUNE_MODEL_ROUTING_ENGINE=python, no Python deletion) and the function becomes a fail-loud delegation facade (typed RuntimeError on missing engine binary); red-first battery caught the drift marker's 'true/false' vs oracle 'True/False' before landing — port fixed byte-identical (Gitea #2574 wave A, red-first)
CI Pipeline / documentation (push) Successful in 20s
CI Pipeline / best-practices (push) Successful in 21s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 2s
CI Pipeline / gitea-offline (push) Canceled after 4s
CI Pipeline / lint (push) Canceled after 25s
CI Pipeline / unit-tests (push) Canceled after 25s
CI Pipeline / rust-surface (push) Canceled after 24s
CI Pipeline / go-surface (push) Canceled after 26s
CI Pipeline / canary (push) Canceled after 26s
Auto-version and Release / release (push) Canceled after 28s
deploy / deploy (push) Canceled after 6s
2026-10-24 05:26:14 +01:00
Nick 1bbd48fbe5 feat(streaming): the STREAMING ROOT-CAUSE WAVE — a turn never sits inside one blocking call again (Gitea #2556, owner verdict: the 330s→480s→6x480s lineage patched the symptom)
CI Pipeline / best-practices (push) Successful in 14s
CI Pipeline / documentation (push) Successful in 13s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Canceled after 0s
CI Pipeline / lint (push) Canceled after 21s
CI Pipeline / unit-tests (push) Canceled after 21s
CI Pipeline / rust-surface (push) Canceled after 21s
CI Pipeline / gitea-offline (push) Canceled after 7s
Auto-version and Release / release (push) Canceled after 21s
CI Pipeline / go-surface (push) Canceled after 21s
CI Pipeline / canary (push) Canceled after 22s
CI Pipeline / type-check (push) Canceled after 8s
- Ollama wire: stream=true /api/chat, NDJSON chunks parsed incrementally
  (content/thinking/tool_calls), the final reply carries the assembled
  answer — the engine's bounded tool loop runs over streamed replies
  (StreamChatClient, loop semantics unchanged)
- Cloud wires: streaming parity — [OI]-compat SSE, anthropic SSE events,
  gemini streamGenerateContent (alt=sse); a provider that answers plain
  JSON despite stream=true falls back honestly to the assembled decode
- Core /v1/chat/completions: stream=true relays the model's bytes as
  NDJSON content chunks (flushed per chunk); a non-streaming leg still
  answers the full content in one chunk (the classic framing); errors
  before the first byte answer the honest envelope
- Entry proxy: the dispatch client carries NO whole-call timeout (the
  core governs streamed deadlines); chunk-relay pass-through proven
  incremental; the generic proxy client keeps the whole-turn fallback
- TUI: CompleteStream parses the chunk framing, the lane dispatcher
  forwards deltas to the sink, the chatpane renders the answer AS IT
  ARRIVES (one progressive bubble the durable final append adopts —
  never a duplicate; a failed dispatch retires it)
- DEADLINE REPLACEMENT: the flat whole-turn budgets retire on streamed
  paths — the INTER-CHUNK IDLE TIMEOUT (120s default,
  RUNE_STREAM_IDLE_TIMEOUT configurable) is the honest dead-model
  guardian with a 30-minute backstop; ErrStreamIdle is typed; the
  budget constants remain for non-streaming fallback paths
- red-first: ollama/cloud SSE hermetic doubles, slow-model completes /
  dead-model trips-idle simulations, live-chunk relay proofs (core,
  entry), progressive-render bubble laws, stream dispatch laws

admission: ADMIT-wave-streaming-deadline-root
2026-10-24 03:48:49 +01:00
Nick 0498b00c02 feat(tui-motion-law): the MOTION LAW — motionAllowed gate freezes the activity wave, the chat pane's never-animate law is written and asserted append-only (D54 item 1, Gitea #2571, red-first)
- the gate sits on the wave render path in activity.go (around
  waveOffset/snakeWord): closed = frame-frozen strip, the rest idle
  already takes (A5) extended to active states; wired down the face
  chain lanes->rail->promote->tasks and driven from the shell's
  syncActivity (reduced motion closes it)
- chatpane: the written never-animate law (no motion in the reading
  pane; stream append is append-only, never reflows completed blocks)
  asserted by TestAppendNeverReflowsCompletedBlocks on the full
  renderLines stream, styled and plain
- one-animating-region-per-frame documented at the face chain's
  Update loop (Init/heartbeat in cmd/rune-tui/main.go)
- admission door: scripts/admit_wave_d54_nd_presentation.py, contract
  ADMIT-wave-d54-nd-presentation minted (Rule-5)
- go test -race -short ./... in tui/ green; D52's rainbow test
  updated for the gate's default-open constructor
2026-10-23 19:12:48 +01:00
Nick 4d7144eb61 admit: wave-d52-seedleak-animation contract — the Rule-5 door for the D52 wave (Gitea #2566, #2567) 2026-10-23 13:38:57 +01:00
Nick f81385fce9 feat(tui-workblock): work blocks carry the spawning chat msg_id — dim-family ↩ reference in the block header (D50 residual 1, #2560, red-first)
The work-stream records now link back to the chat demand that spawned
the work: DeriveWorkBlocks keys the origin on the oldest role=user
record the conversation wire carries for the task, using the msg_ids
the core already journals (D51: newMsgID exists core-side — no new
generation; the runecore write-side origin ref is deferred, engine.go
off-limits while the D49 agent works there). The reference renders as
'↩ <msg_id>' on the work block header, inside the clip budget — the
tasks pane's rune-counted width math carries no ANSI, so the dim tone
degrades to the plain marker here (honest degradation, documented).
No demand row on the wire renders nothing — never a fabricated ref.

Admission: ADMIT-wave-d50-residuals (scripts/admit_wave_d50_residuals.py,
EXISTING_PROJECT_CHANGE, building).
2026-10-23 02:07:05 +01:00
Nick d31359f3a5 feat(runecore): D49 capability in every pane + native git tool family (red-first)
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
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
Nick 76f7b535a1 feat(dispatch-classifier): the DISPATCH CLASSIFIER — solo vs parallel vs queue decided, never specified (red-first)
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 10s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / unit-tests (push) Canceled after 11s
CI Pipeline / go-surface (push) Canceled after 11s
CI Pipeline / rust-surface (push) Canceled after 11s
CI Pipeline / best-practices (push) Canceled after 10s
Auto-version and Release / release (push) Canceled after 30s
CI Pipeline / lint (push) Canceled after 19s
deploy / deploy (push) Canceled after 33s
Stdlib-only Go module deciding each wave's lane so the owner stops
specifying: hot-state registry ~/.rune/hot/dispatch_registry.json
(lock/unlock/show, 4h STALE + --prune), classify with the one
data-driven keyword->surface map, prefix-overlap queue-behind (owner
-> PRIORITY-QUEUE with landing-boundary yield), owner-origin solo
latency, disjoint-surface parallel split suggestion, --apply lock take
atomic and fail-loud on locked/stale/changed; scripts/dispatch_check.sh
wraps the pre-spawn discipline. go test -race green, vet + gofmt clean.
Contract ADMIT-wave-dispatch-classifier.
2026-10-22 18:32:53 +01:00
Nick 57eab7c419 fix(verification): landed head builds fresh — the 36-RED root closed (G30.3)
The build-integrity sweep (the one build law imported by BOTH gates —
unified_check's go_suite/src_go_suite and check_landing's rule 3) ran
'go build -o /dev/null ./...' with VCS stamping enabled. On the landed
sha's git-archive EXPORT — where the landing gate verifies build
health — there is no VCS identity, and a stray host .git (this host
carries an empty /tmp/.git sweep-race artifact) makes every
main-package module die with 'error obtaining VCS status: exit status
128'. Red measured on HEAD's export: 97/100 modules false-RED in 0.9s,
drowning the real build signal — the mass false-RED class behind the
36 backfilled 2026-10-18 manifests' build legs.

Fix 1 — BUILD_CMD gains -buildvcs=false: the sweep measures
compilability, not VCS metadata. Green measured on the same export:
100/100 modules build in 21.5s.

Fix 2 — the paired-Rust freshness law: cgo modules link gitignored
prebuilt staticlibs (src/rust/<crate>/target/release/lib*.a). The
existing retry rebuilt them only when MISSING (linker 'cannot find');
a STALE .a — older than the crate's sources — made the sweep
'successfully' verify the head against yesterday's build. The sweep
now scans each module's cgo LDFLAGS for linked crates and rebuilds
any missing-or-stale staticlib BEFORE the Go build, so a green sweep
is always a green on the current head. Verified: a source touched
newer than the .a flips staticlib_is_stale, cargo rebuild fires, the
.a refreshes, the module builds rc=0, staleness clears.

Real-tree sweep stays green (100/100, 19.9s); no crate rebuilds fire
when artifacts are fresh.
2026-10-22 12:23:26 +01:00
Nick 5bc78f00d4 fix(housekeeping): orphan-cleaner age-guard inversion closed red-first (T23)
The guard reported '0 orphans' while two hot-looping leaked serves were
alive (the 2026-10-18/19 incident; both died only to direct PID + parent
kills). Three keep-shapes produced that verdict, all fixed:

- living-parent inversion: a parent that is ALIVE but WEDGED
  (hot-looping) read as 'the owner's TUI owns this serve' — the guard's
  only liveness signal was a non-systemd cmdline. parent_is_dead now
  samples the parent's CPU time across a 0.3s window (>~30% of a core
  = wedged, never going to reap or tear down) and treats it as dead.
- zombie-parent class: a stat state Z/X parent (zombie leader — the
  TUI's main loop gone, threads may still spin) is now explicitly
  dead, not just via the empty-cmdline side effect.
- age guard: the 'newest serve is never killed' protection now applies
  ONLY while a live session exists (some candidate has a living owner
  parent). With no live session every non-owned candidate is a leak,
  newest included — the incident's two loopers were both hand-killed
  for exactly this. A mid-spawn session is protected by the ownership
  check (its TUI parent is alive), not the age guard.

Also the hot/test leak class: leaked /tmp/*/rune-tui test binaries
(exe-named rune-tui under /tmp) whose spawner died (zombie / systemd
--user subreaper) are now a second candidate class — a full TUI
rendering into a dead pty survived every previous run.

Red-first: scripts/test_cleanup_orphan_rune.sh spawns four fake ELF
serves (zombie-leader parent, wedged hot-looping parent, healthy
parent, newest zombie-parented) plus a leaked /tmp rune-tui, and runs
the cleaner dry-run through its scan seams (RUNE_TUI_LIB_GLOB /
RUNE_TUI_TEST_GLOB) so real host serves cannot perturb the verdicts.
Against the old guard it reproduces the incident verbatim ('0 orphans'
with both hot-loopers kept as 'living parent'); against the fix it is
green across three consecutive runs (phase 1: wedged/zombie orphans +
leaked test TUI named, owned + newest kept; phase 2: no live session →
every non-owned candidate an orphan).
2026-10-22 12:02:57 +01:00
Nick ba63d15a6f admit: wave-presentation contract — the owner-spec'd presentation wave (activity pane, answer presentation, selection, scrollback)
CI Pipeline / best-practices (push) Successful in 13s
CI Pipeline / documentation (push) Successful in 13s
CI Pipeline / rust-surface (push) Failing after 24s
Auto-version and Release / release (push) Successful in 25s
CI Pipeline / gitea-offline (push) Successful in 32s
CI Pipeline / go-surface (push) Failing after 48s
CI Pipeline / lint (push) Failing after 1m5s
CI Pipeline / type-check (push) Failing after 1m0s
CI Pipeline / canary (push) Failing after 3m34s
deploy / deploy (push) Failing after 15m31s
CI Pipeline / unit-tests (push) Failing after 39m33s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Failing after 5s
2026-10-22 10:05:06 +01:00
Nick 586dc3b9c4 fix(spawn-door): canonical subagent-protocol-guard in the MANAGED set + tightened lexical pass (adversarial-escape Door 5, red-first)
The spawn guard was unversioned (no canonical copy, absent from
install_mimo_hook.py MANAGED — the drift-undetected rot that killed
builder-bridge pre-T22) and lexically porous. Canonical copy now lives
in config/mimo-hooks/ and is hash-drift-checked like its siblings;
installed copy synced.

Tightened classification (classifyBrief, exported for direct testing):
- a build brief needs the admission marker AND a target surface (repo
  path or project name, judged outside the admission boilerplate) —
  marker-only briefs are refused with typed reasons
  BUILD_BRIEF_NO_ADMISSION / BUILD_BRIEF_NO_TARGET;
- build markers match on word boundaries (a 'report' mention is no
  longer build-shaped via substring 'port');
- the research exemption requires an explicit leading 'research:'
  prefix — self-declared 'research artifacts to ...' briefs are no
  longer exempt.
2026-10-22 09:09:23 +01:00
Nick f3092dbdaa fix(git-door): construction-contract gate on the staged tree + pathless remediation exit closed (adversarial-escape Door 4, red-first)
rule 5 in check_landing.py --staged-only: a staged MUTATING path
(non-test, non-docs source) must be covered by an OPEN
construction contract or the pre-commit hook refuses, naming the
contract ids checked and the admit_wave_* admission door. The only
escape hatch is scripts/admit_wave_*.py itself.

check_mutation's remediation exit no longer grants remediation to
PATHLESS commands while a scope violation is unresolved — a command
that resolves no repo paths (git add -A && git commit) cannot prove
it targets only the offending paths; it is refused as
SCOPE_VIOLATION_UNRESOLVED with a typed note.

Admission: contract ADMIT-2026-10-22T04:38:23Z-7d445e-wave-
adversarial-escape-highs (phase building, scope covers scripts/,
config/mimo-hooks/, src/rune/construction_authority.py, tests/).
2026-10-22 06:55:36 +01:00
Nick d824b8f43c builder-bridge: retarget hook + CLI from stale issue161-harness anchor to the rune repo — BRIDGE/PY_CANDIDATES to rune paths, stdin JSON op surface with authority contract_id, hook parity managed set completes scaffolding-guard; install synced hash-verified 2026-10-21 19:10:55 +01:00
Nick 8b3665f468 fix(memory): restore scripts/dedupe_policy.py — the absent gate module behind memory_store.py's default add path
The checkout was missing the dedupe+supersede gate (retirement-map row 24,
parity/memory-ops.json): 'No module named dedupe_policy' on every default
add; only --no-dedupe worked. Module restored with the 2026-08-13 policy
(created/duplicate/supersede + receipts ledger), pinned red-first by
tests/test_dedupe_policy.py (6 tests incl. consumer-contract + one-record
law); live CLI add now returns receipted decisions.
2026-10-21 19:10:55 +01:00
Nick 8faf66a76a ci: permanent e2e proof rig (scratch runner + scratch repo, dry-run mode, teardown-safe EXIT trap) + workflow contract extended to tui-release/maintenance with red-first SIGPIPE-pipe and GITEA_REF_NAME-fallback guards 2026-10-21 18:20:23 +01:00
Nick 598e5c48ad feat(runecore): native tool calls on the three cloud wires
Implement ToolChatClient (SupportsTools + ChatWithTools) on the
[OI]-compat, anthropic, and gemini clients so cloud models act through
the D45 mode-gated tool suite instead of degrading to toolless:
- [OI]-compat: tools array rides the request; tool_calls parse with
  JSON-string arguments; assistant tool_calls + role 'tool' replay
- anthropic: tools param with input_schema; tool_use blocks parse to
  ToolCalls; continuation as user tool_result blocks with tool_use_id
- gemini: functionDeclarations under tools; functionCall parts parse
  to ToolCalls; continuation as user functionResponse parts keyed by
  function name
Mode gating stays identical to the local path (ExecuteGatedTool re-reads
the mode per dispatch); the engine's bounded loop and cap-out are
reused untouched. Red-first httptest doubles per wire (request shape +
plain answer / tool call / continuation), hermetic; the live leg stays
RUNE_CLOUD_PARITY_LIVE=1-gated.
2026-10-21 18:20:23 +01:00
Nick 874a6ef324 vitality: phase-2 Python-suite audit — 13 panic-only tests converted to field/validator-pinned behavior proofs (outbox 5, events-schema 8), each red-first with a recorded mutation proof; zero deletions 2026-10-21 18:07:03 +01:00
Nick a5026031cb retirement: row 6 trust-and-sovereignty integrated — persona_gate.decide + stage_guards kernels delegate to Go engines (fail-loud, RUNE_*_ENGINE=python escape hatch); row 5 file-change-safety recorded no-Python-oracle; no Python deletion 2026-10-21 18:07:03 +01:00
Nick 296fc3d52a fix(store): ghost snapshot purge — 83MB legacy snapshot removed from history, banned-path guard
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 11s
deploy / deploy (push) Canceled after 2s
CI Pipeline / rust-surface (push) Canceled after 16s
Auto-version and Release / release (push) Canceled after 25s
CI Pipeline / unit-tests (push) Canceled after 23s
CI Pipeline / lint (push) Canceled after 24s
CI Pipeline / go-surface (push) Canceled after 21s
CI Pipeline / canary (push) Canceled after 19s
- history purge via git-filter-repo (path store/scaffold/legacy-current-migration-snapshot.json, --invert-paths); force-push to gitea under wave-ghost-purge standing approval; branch protection restored after
- rollback: backups/rune-pre-ghost-purge-2026-10-21.bundle (+ /tmp safety bundle of pre-purge state)
- .gitignore entry: the on-disk working copy stays, never committable
- check_landing.py SWEEP_RACE_BANNED_PATHS gains the path — pre-commit hook mechanically refuses staging (proven: force-add → RED refusal)
- merge/rebase/cherry-pick simulation from a wave base: no re-entry
2026-10-21 13:50:19 +01:00
Nick a0cb876755 chore: sync churn (D46 wave files landed in dcb55367-lineage; residuals) 2026-10-21 00:45:10 +01:00
Nick 2f05865ddc chore: sync churn (D45 wave context wiring in flight) 2026-10-20 18:44:57 +01:00
Nick 1a68db3552 feat(vitality): audit report + conversions (trust width fix, real-input tests, bounded-width pins) + scaffold status line wave files 2026-10-20 10:34:30 +01:00
Nick 45928ac768 feat(vitality): the ceremony audit — every conversion proven by mutation
Audit: 981 tui + 75 rune-core tests classified (mutant-proven /
red-first-proven / regression-pinned / invariant-pinned /
candidate-ceremony). Conversions: 2 panic-only tests → mutation-proven
bounded-width pins; 7 synthetic-spelling key sites → real input (the
'down'-types-d class eliminated); 1 vacuous assertion → real
cursor-walk proof. Zero deletions (nothing dead enough to kill).

The sweep EARNED its keep immediately: the converted trust test
caught a real width-overflow bug (56-rune strips in a 1x1 face) —
fixed (floor-clamped strips AND inner lines), re-proven
red/green. Full report: reports/test-vitality-audit-2026-10-19.md

closes #2510
2026-10-20 10:34:30 +01:00
Nick 8c5a4e42e0 perf(verify): Go checkup — the 600s strikes were ONE hung boot-smoke test, not parallelism
Measured diagnosis: tui/cmd/rune-tui eats 600 of 694 Go-check seconds
— the boot smoke test hangs in an unbounded terminal read past its own
deadlines (pre-existing on HEAD, repro'd on clean checkout). Race
detector measured innocent (1.6x, not 2-10x); Go's built-in test cache
already IS the content-keyed cache; all three sharding options
rejected on the numbers.

Landed instead: boundary_corpus_go scoped from the full tui suite to
its sole corpus consumer (70-84s → 0.1s, verified end-to-end GREEN);
explicit race-command timeout; honest 'not sharded' manifest notes
with measured reasons. The boot-smoke watchdog fix is named for its
own bounded repair wave (fix sketched in the receipt).

closes #2508
2026-10-20 03:35:18 +01:00
Nick c9789d1121 chore: sync churn 2026-10-20 01:15:27 +01:00
Nick 992be81553 feat(verify): sharded landing checkup — python_suite 1087s→275s (4x) + evidence hole filled with an honest finding (36 backfilled manifests ALL RED — real landed-tree breakage, G30.3 named as the blocker) + the legacy snapshot untracked AGAIN (the re-appearing ghost — every wave's base branch re-introduces it; needs a one-time history purge, queued) 2026-10-19 23:39:08 +01:00
Nick 697a7fae4b chore: wave churn 2026-10-19 23:11:31 +01:00
Nick 946bb89e64 chore: journal churn + untrack the legacy snapshot (sweep-race class) 2026-10-19 18:56:00 +01:00
Nick 9ff08d25bd feat(queue): discharge — the waiting line's other half
At each task-turn boundary the lane takes the OLDEST pending entry and
dispatches it through the normal task-create path (send_task, channel
task); the queue file updates atomically, rows re-number, the pane
follows on its next poll. selectNextQueueEntry is the D36
'Rune intelligently decides' seam (phase 1 = FIFO oldest-first);
failed dispatches re-queue at the FRONT (order-preserving, never
silently dropped) with a typed journal event. Race-proofed (one
critical section, dispatch outside the lock, settle path for
fast tasks) — six consecutive -race suite runs green; live proof:
two queued demands drained FIFO through a real rune serve.

closes #2501
2026-10-19 18:56:00 +01:00
Nick 2583361273 feat(housekeeping): Go core supervised by default (RUNE_CORE=python fallback, kill-restart proven live) + /tmp rune-tui-lib GC (reference-safety liveness, 2.5GB reclaimed, dry-run default) 2026-10-19 18:44:45 +01:00
Nick 9591e8a0eb feat(scaffolding): the construction authority is LIVE in rune — the mutation boundary
Every mutating tool call (subagent or main session) is scope-checked
against the active construction contract through the installed hook:
in-scope edits allowed, out-of-scope blocked naming the contract; the
durable lock fails closed across fresh processes (ACTIVE/UNREADABLE
both stop, ABSENT allows ordinary work); shell escapes (clobber/tee/
--output/touch) caught; supervisory acts refused; violations recorded
and self-clear on remediation. 67/67 drills + authority tests green;
hook installed hash-verified; activation front door ported (the one
design decision per the map) with the introduce-verb fix for rune's
Rust-core delegation.

closes #2499
2026-10-19 12:32:48 +01:00
Nick b22f21fdd8 chore(scaffolding): retroactive admission backfill — 7 contracts minted and closed (verbatim receipts, declared exemptions, sweep GREEN) + untrack the 83MB legacy snapshot (sweep-race class) 2026-10-19 12:01:57 +01:00
Nick df088fbe30 feat: THE CONVERGENCE LANDING — six waves, one tree
- GO CORE TURN ENGINE (src/go/rune-core): per-channel single-flight,
  channel-keyed context, K25 tail+snapshot store (D40 seam), live
  Ollama with the thinking split, PTY parity proven with Python
  stopped + the owner's 27B live with thinking surfaced
- FULL-WIDTH SHARED BOX (D36): spans both panes, focus-signage
  placeholder, drafts survive focus round-trips, PTY-proven 110+140
- MODEL SPLIT (D37): pane-aware /model, per-pane record fields,
  status line; letter-stealing round 2 fixed (j/k type)
- APPROVAL CARD (T5): gold y/n through /v1/approvals/resolve, stale
  revalidation, chained asks, PTY-proven both legs
- PROVIDERS P1: 18 providers both languages, three-artifact drift
  gate, provider step in first-run (real names, no 'local' hardcode)
- SCROLLBACK: /history depth persisted, ctrl+up/down + pgup/pgdn,
  dim ↑N indicator, deeper-page fetch, PTY-proven on real history
- RETIREMENT rows 4+10 advanced: tool-executor dispatch wired
  (49/49+48/48), Go mode-gate door built, work-manager CLI parity
2026-10-19 00:02:18 +01:00
Nick 9c20de0029 feat: D38 ledger surface in the task pane (OPEN TASKS section, oldest-first, true count, poll-tick refresh; PTY-proven 53 tasks live) + persona chain-audit research (15K tokens/turn measured, three-way inventory, 6 owner decisions isolated) 2026-10-18 19:53:13 +01:00
Nick fb06beb86b feat+fix: thinking surfacing end-to-end (hf.co local-pin fix red-first, <think> start-anchored split, reasoning_content mapping — live-proven on the 27B) + sweep-race structural guard (landing-gate rule 4 + pre-commit hook, red-first) + float-render drift repair (frozen corpus regenerated from the live oracle) + orphan-process cleanup 2026-10-18 19:06:17 +01:00
Nick 6d70cefe59 feat: WASM wave 3 (memory_scoring in-process, 82/82 frozen-oracle parity, no-FS-by-construction) + D36 task-queue surface (/v1/task-queue GET/enqueue — instant-if-free delegates, busy queues durably; tui/taskqueue render) + ghost-text research (latency measured on-gpu, eviction hazard documented) 2026-10-18 18:01:19 +01:00
Nick 5fdfda7004 fix(substrate)+research+history: go_build_sweep builds paired-Rust staticlibs on demand (fresh-checkout HEAD-RED incident closed — cgo modules linked gitignored artifacts) + consent-bridge/orchestrator/50-scale research rounds + re-rendered portrayals + input history carry-over (old-TUI file, 200-cap, atomic) 2026-10-18 17:59:09 +01:00
Nick f41b31d19d fix(maintenance): drift issues close on resolution — the reconciliation's converged branch now auto-closes open drift issues with an honest comment (gap: #2489 sat open 4h after repair; filed-but-never-closed) 2026-10-18 13:20:24 +01:00
Nick b7345f000f feat(runtime): tools-live build — two-door mode bypass closed, T1-T4 landed
CRITICAL: chat-originated tool dispatch (Python local_tool_runtime.py)
had ZERO mode awareness — a chat write_file in CHAT mode executed
ungated (the Go serve surface gated but the chat path never touched
it). Closed: mode authorization at request intake in local_tool_
runtime, authorize seam in tool_protocol dispatch, approve() resume
door gated, hatch-exposure filtered. Typed ModeRefusal feeds the model
as tool-error data; failure breaker trips on repeat.

T1: ONE mode matrix artifact (schemas/mode/v1/mode_matrix.json) read
by BOTH Go (embed, byte-identical, 16-case battery) and Python
(mode_gate.py, per-dispatch read 0.011ms, RUNE_MODE env wins).
T2: model only SEES mode-allowed tools at capability selection.
T3: per-dispatch mode re-check (mid-loop switch pinned).
T4: tool events persist as channel-scoped role=tool conversation
records — results land in the chat lane through the bridge poll.

Main-session verify: mode dispatch gate + tool authority suites green
own runs. 31/31 + 3438/0 new-mode-gating failures.
2026-10-18 02:52:08 +01:00