diff --git a/.console/backlog.md b/.console/backlog.md index ab68dbb..cedebff 100644 --- a/.console/backlog.md +++ b/.console/backlog.md @@ -12,11 +12,5 @@ _(none — awaiting next directive)_ ## Done -- [x] Restore cmd_install as `console symlink` (was dead code) -- [x] Implement get_aider_command (launcher with profile/bin/model/auto_commits) -- [x] Restore spawn_update_clis_background with _UPDATE_LOG constant -- [x] Wire read_decision into run_summary (decision_basis, decision_confidence) -- [x] Wire queue.remove into console queue cancel (short-prefix resolution) -- [x] check_branch gains force param; --force-branch flag -- [x] any_backend_missing gates run_providers exit code -- [x] CxrpExecutionResult fully implemented (parse + summarize) +_Completed items archived._ + diff --git a/.console/log.md b/.console/log.md index ae939ce..9101366 100644 --- a/.console/log.md +++ b/.console/log.md @@ -1,107 +1,18 @@ # Log -## 2026-05-30 — status pane: per-model worker backend rows + split Backend Limits - -"Backend Limits → Worker Backends" showed only the subsection header on height squeeze: the single backend_caps section nested two sub-headers under its own title, and the virtual buffer keeps only a section's first sec_h lines on overflow, so the data rows fell off. Split into two flat sections (worker_backends, executor_lanes) so each keeps header + data independently. Also rendered claude_code per model (sonnet/opus/haiku) reading the controller's new backend_limit_kinds: a model_weekly limit marks only that model, session_5h/global_weekly mark all. Added a "… +N more" indicator when a section is truncated. 27 pane tests pass; custodian OK. - -## 2026-05-28 — Wire ContextGuard hooks into OperatorConsole - -OC previously carried no `.claude/` hooks, so developing OC itself ran without -anchor enforcement. Added the committed executor-shim pair -(`.claude/hooks/pre_tool_use.sh` + `stop.sh`) and `.claude/settings.json`, -mirroring TeamExecutor/CritiqueExecutor exactly — the shim delegates to -`cl hook ...`. OC resolves its anchor to PlatformManifest via RepoGraph -(verified). PlatformManifest's provision-machine.sh now lists OperatorConsole in -COMMITTED_HOOK_REPOS so the hook-health check verifies it. - -## 2026-05-27 — Redesign CL anchoring: resolve cl once, bake the path - -Replaced the runtime resolution dance (repeated in 3 wrapper builders + the rc -file) with a single Python resolver, `_resolve_cl_bin()`, and a -`_cl_anchor_prelude()` that bakes the resolved absolute `cl` path into each -generated wrapper. - -Why: `cl` lives at `$CL_HOME/bin/cl`, and CL_HOME is *machine state* (the local -clone path), so it can't live in a repo. Zellij panes are non-interactive, -non-login shells that source neither `~/.bashrc` nor `~/.claude/settings.json`, -so resolving `cl` *inside the pane* was unreliable (the earlier `source -~/.bashrc` and inline-python-reading-settings.json hacks). The `console` process -itself *does* inherit CL_HOME from the interactive shell that launched it — so -we resolve there, once, and bake the literal path in. Resolution order: -CL_HOME env → settings.json env.CL_HOME → `cl` on PATH. If none resolve, the -prelude is an inert comment (session launches unanchored, never errors). - -Verified with `env -i` (clean env, no CL_HOME — mimics a pane): baked path -anchors CL_ANCHOR correctly where `source ~/.bashrc` produced nothing. - -Custodian follow-up: documented CL_HOME in `.env.example` (E1) and trimmed the -comment + a redundant local import to keep bootstrap.py under the 500-line cap -(C29). - -## 2026-05-27 — Wire provision-machine.sh into setup.sh - -setup.sh now calls PlatformManifest/scripts/provision-machine.sh after the local bootstrap. Passes through --with-private and --force-hooks flags; --skip-provision keeps the old local-only behavior. - -## 2026-05-26 — Repair pre-existing watcher_pane tests - -Fixed 9 stale/regressed failures in tests/test_watcher_pane.py. - -- Banner-message tests (healthy/switchboard/gate/queue/info): STALE tests. The - banner copy was intentionally title-cased and reworded ("All Systems Nominal", - "SwitchBoard Offline", "Global Gate at Cap", "Queue Depth", "Stabilizing"). - Updated assertions to the current strings. -- test_exec_budget_reads_usage: STALE test — it never isolated _resource_gate(), - which reads the real on-disk OC config; gate values shadow the env caps the - test sets, so daily_cap came back as the config's value. Added a monkeypatch - stubbing _resource_gate -> {} so the env-override path is the one exercised. -- test_critical_sorts_before_warning_sorts_before_info: STALE premise — the - "just started" INFO banner is intentionally PINNED to the front of the cycle, - so a linear crit closing fence; regex now replaces only the -fenced region. All existing CLAUDE.md files migrated to add the closing fence. - -## 2026-05-21 — Add ContextLifecycle to platform group and git watcher - -Added contextlifecycle to platform.yaml group list. -Added "Cognition" group to git_watcher.py _GROUPS (between Executors and Contracts) -containing ContextLifecycle. Profile yaml was already on main. - -## 2026-05-19 — Update corerunner.yaml repo_root to CoreRunner/ - -Local directory renamed ExecutorRuntime/ → CoreRunner/. Updated profile path and GitHub repo remote URL. - -## 2026-05-19 — ADR 0006 Phase 5: rename ExecutorRuntime → CoreRunner in OperatorConsole - -- config/profiles/executorruntime.yaml → corerunner.yaml; name: CoreRunner. -- config/profiles/platform.yaml: executorruntime → corerunner group entry. -- src/operator_console/git_watcher.py: "ExecutorRuntime" → "CoreRunner" in Executors frozenset. -- repo_root path in corerunner.yaml intentionally still points to ExecutorRuntime/ dir — will update after Phase 6 GitHub rename. -- 121 of 129 tests pass; 8 pre-existing watcher_pane failures unrelated to this change. - -## 2026-05-19 — Suppressed pre-existing C29/D11 custodian findings (git_watcher.py) - -Added C29 suppression for git_watcher.py (518 lines, same rationale as other TUI -panel modules). Added D11 suppression for _put() helper duplicated between -git_watcher.py and watcher_status_pane.py (intentional micro-helper duplication). +## 2026-06-04 — Reconcile .console/ (worksheet + prune + enforce) + +Authored `.console/reconcile.yaml` (untracked) classifying backlog/log work: +13 done items owned by OperatorConsole (each cited to existing docs — +architecture.md / daily-use.md / profiles.md / local_aider_usage.md) plus 2 +cross-repo routing rows (OperationsCenter queue intake, ContextLifecycle hook +runtime). `cl reconcile check` GREEN, then `cl reconcile prune --apply` moved +completed history to the private archive (log 442→123 lines; Done backlog +cleared to a pointer), added the archive pointer + CHANGELOG summary lines +(deduped to one per item); a second --apply is a no-op. Flipped +`audit.reconcile_enforce: true` in `.custodian/config.yaml` (R1/R2 now active). +Added `/.console/reconcile.yaml` and `/.console/archive/` to `.gitignore`. +No scrub-target names in tracked `.console`/`docs` (grep clean). ## 2026-05-19 — Removed live kodo/archon references from src @@ -113,19 +24,6 @@ Updated providers.py backend entry (kodo → team_executor with TeamExecutor ins - Updated `README.md` and `docs/history/` to replace all `WorkStation`/`workstation` references with `PlatformDeployment`/`platformdeployment`. -## 2026-05-12 — Expand platform profile to RepoGraph and ProtocolWarden docs - -Added `RepoGraph` and `ProtocolWarden.github.io` to the tracked `platform` -profile so the platform watcher and lazygit multi-repo view include both repos -by default. Aligned the profile docs and demo wording to the new platform set. - -## 2026-05-12 — Remove WorkStation profile fallback - -Updated the platform group to target `PlatformDeployment` directly, removed the -tracked `workstation.yaml` profile, and removed `WorkStation` fallback lookup -from the providers/demo/workers paths so the interactive git watcher and -platform commands resolve the deployment repo by its canonical name only. - ## 2026-05-10 — Codex startup defaults to full access Updated OperatorConsole's Codex launcher to start Codex panes with @@ -187,34 +85,6 @@ _Not a task tracker — that's backlog.md. Keep entries concise and dated._ - Curses pane: collapse + keyboard resize (2026-05-08, on `feat/curses-pane-collapse-and-resize`): Followup on per-section scroll. Each section header now shows ▼/▶ collapse indicator and a focus marker; clicking a header (BUTTON1 on the header row) toggles `collapsed_sections[id]`, and `c` keys the same toggle for the focused section. Collapsed sections render a single header row regardless of overflow. `+`/`-` adjust `size_mult[focused]` by 0.25 within `[0.3, 3.0]`; `=` resets. Allocator extended to honor both: collapsed → 1 row; non-collapsed natural = `ceil(len(lines) * mult)`. `_draw_main` now returns `(section_rows, header_rows)` so the click handler can hit-test the header row precisely (only when the section's scroll offset is 0). 4 new tests (collapsed→1, collapsed-during-overflow, size_mult grows natural, baseline still passes). Pane suite 26 passing; ruff clean. Mouse-drag resize was deliberately ruled out — fragile under zellij + multi-terminal mouse modes. - Curses pane: per-section scroll + mouse wheel + CLI launcher (2026-05-08, on `feat/curses-pane-launcher-and-mouse`): The dense curses pane (`watcher_status_pane.py`) now scrolls each section independently. **Refactor**: `_build_main_lines` → `_build_sections` returning `list[{id, lines, sel_local}]`. New `_allocate_section_rows` distributes the middle area: each section gets its natural height when the total fits, otherwise proportional with a 3-row floor. **Per-section state**: `section_offsets: dict[str, int]` replaces the global scroll; each section renders its own slice with ▲/▼ indicators when there's more content. **Mouse wheel**: `curses.mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION)` enabled; BUTTON4=up, BUTTON5=down, 3 lines per tick, routed by mouse y → section under cursor. Wheel events also set `focused_section` so subsequent PgUp/PgDn target the same section. **CLI launcher**: `console watcher` subcommand + `console status --watcher` flag both forward argv (incl. `--profile`) to the pane. 4 new tests (allocator natural fit / overflow proportional / empty sections / zero-available; plus CLI shortcut presence). Pane suite 23 tests passing; ruff clean. -## Recent Decisions - -- Status pane: execution budget + system resources (2026-05-08, on `feat/status-budget-resources`): Two new sections in `console status` after the Watchers block. **Execution budget** reads OC's `tools/report/operations_center/execution/usage.json` for hourly/daily exec counts and shows them against env-driven caps (`OPERATIONS_CENTER_MAX_EXEC_PER_HOUR`/`DAY`, defaults 10/50). Color yellow at >=80%, red at >=100%, green otherwise. **System resources** shows process count + RAM/swap from /proc. RAM colored against OC's kodo dispatch threshold (kodo.min_kodo_available_mb, 6144 MB default); when free RAM drops below this OC silently blocks new kodo dispatches, so surfacing it explains why the budget might appear unmet. JSON output gains `execution_budget` + `system` top-level keys. 6 new tests; full console suite green. - -| Decision | Rationale | Date | -|----------|-----------|------| -| docs/architecture.md refresh | Module tree updated to actual src/operator_console/ contents (not the old src/console/ path with missing modules); pane diagram updated to current single/multi-repo Zellij stack layout (claude/codex/aider stack, watcher status pane); session-tracking section rewritten to cover all three tools (Claude, Codex, Aider) instead of only Claude. | 2026-05-07 | -| WS architecture refs updated after subgrouping | WorkStation moved its architecture/ docs into adapters/, routing/, contracts/, execution/, policy/, system/ subdirs. Inbound README links rewritten. | 2026-05-07 | -| docs reorganization | Moved docs/migration/fob-operator-flow-update.md and docs/audits/final_rename_refactor_verification_2.md into docs/history/. Removed empty migration/ and audits/ dirs. | 2026-05-07 | -| docs/README.md index added | Required by Custodian R6 (newly landed). Indexes daily-use guides, architecture, migration, and audit history. | 2026-05-07 | -| README ## What OperatorConsole Is Not section | Replaced inline "OperatorConsole is not a neutral bootstrap script..." sentence with a proper `## What OperatorConsole Is Not` H2 section listing the four explicit anti-scopes. Required by Custodian R4 README detector (newly landed). | 2026-05-06 | -| README workspace-layout diagrams corrected (round 2) | First pass still drew shell/status as horizontally split panes; they're actually a Zellij **stack** (overlapping, switchable). Redrew center and right columns with explicit stack notation so the diagram matches launcher.py and Zellij's actual rendering | 2026-05-06 | -| README workspace-layout diagrams corrected | Single-repo and multi-repo ASCII diagrams + descriptions described an older layout (status bottom-left, shell as center pane, logs on right; stacked lazygits in multi). Replaced with current: lazygit | claude/codex/aider | shell+status (single); git_watcher | claude/codex/aider | shell+status (multi). Source of truth: src/operator_console/launcher.py | 2026-05-06 | -| README ownership boundary: contracts attributed to CxRP/RxP | Section listed contracts under OperationsCenter; canonical cross-repo contracts now live in CxRP/RxP. Updated to map Dockerfiles→WS, routing→SB, adapters→OC, contracts→CxRP/RxP | 2026-05-06 | -| Add ExecutorRuntime, SourceRegistry, RxP to platform group | Three new repos joined the platform tab + git-dirty watcher; new profile yamls (bootstrap_files empty until repos grow .console/), `.gitignore` allowlist updated to track them | 2026-05-06 | -| C41 json.dumps ensure_ascii=False | 13 json.dumps calls across 9 files now include ensure_ascii=False | 2026-05-03 | -| Ruff style violations resolved | E701/E702/E741/F401 across clean.py, cli.py, delegate.py, observer.py, watcher_status_pane.py, git_watcher.py, commands.py, auto_once.py, tab_capture.py | 2026-05-03 | -| CLAUDE.md: simplify console update instruction | "Before each commit" → "After meaningful progress" | 2026-05-02 | -| cmd_install restored as `console symlink` | Was dead code (no CLI dispatch); added case "symlink" in cli.py; symlinks CONSOLE_DIR/console → ~/.local/bin/console | 2026-05-02 | -| get_aider_command implemented | Old version was a stub printing an error; now a real launcher (profile["aider"]: bin/model/auto_commits); aider pane added to layout alongside claude/codex | 2026-05-02 | -| spawn_update_clis_background restored | _UPDATE_LOG constant re-added; wired into console update --background; fire-and-forget subprocess.Popen | 2026-05-02 | -| read_decision wired into run_summary | Reads decision.json from run dir; run_summary now includes decision_basis and decision_confidence from OC's routing decision | 2026-05-02 | -| queue.remove wired into console queue cancel | Short-prefix resolution so cancel abc matches abcdef1234; delegates to queue.remove() | 2026-05-02 | -| check_branch gains force param; --force-branch flag | console open --force-branch suppresses protected-branch warning entirely; wired through cli → _run_open → launch → check_branch | 2026-05-02 | -| any_backend_missing gates run_providers exit code | providers.run_providers() now returns 1 when any backend is absent (unless --wait); was tracking the bool but not acting on it | 2026-05-02 | -| CxrpExecutionResult fully implemented | parse_execution_result(payload) validates + deserializes to typed CxrpExecutionResult; summarize_execution_result() takes typed object; T2 exclusion removed (tests now have real asserts) | 2026-05-02 | -| .console/ migrated to standard naming | active-mission/standing-orders/mission-log/objectives → task/guidelines/log/backlog | 2026-05-02 | - ## Stop Points - Wire Custodian B1 privacy block (2026-05-08, on `chore/wire-b1-privacy-block`): Added top-level `privacy:` block to `.custodian/config.yaml` listing the private repo name (and its lowercase variant) as banned literals. B1 reports zero leaks on the public surface — defaults exclude operator-private workspaces, history docs, and the config file itself, so the block is purely declarative for now and acts as a forward guard against future leaks. @@ -244,13 +114,6 @@ window, it now scrolls in lockstep with the top banner (reuses banner_offset). When it fits, renders static as before. No new state — same tick. -## 2026-05-08 — Multi-line collapsible hint bar (replaces marquee) - -Replaced marquee-on-overflow with a wrapped multi-line hint bar that -defaults to collapsed (' ? hints (press ? to expand)'). Footer height -tracks the hint rows; flash sits one row above. Added '?' key handler. - - ## 2026-05-08 — M1: CHANGELOG.md stub (Keep-a-Changelog format) Added a minimal CHANGELOG.md so M1 (and M5 format check) pass. @@ -268,175 +131,7 @@ not name-imported in tests). T8 for test_architecture_demo.py (subprocess+curses common_words += git_watcher (subcommand name, not a Python symbol). -## 2026-05-08 — Title Case all status pane text - -Banner messages, section headers, descriptors (running/queued/active/pending/etc), -hint chunks, action submenu, log view, and toggle indicators all Title Cased. -STOPPED / STALL ALERT remain ALL CAPS as severity emphasis. - - -## 2026-05-08 — CI regression guard - -Added .github/workflows/custodian-audit.yml + .hooks/pre-push. -Both run `custodian-multi --fail-on-findings`. CI is the source of -truth; pre-push catches regressions before they hit GitHub. - - -## 2026-05-08 — CI fix: Direct URL pip install syntax - - -## 2026-05-08 — A_BOLD on ERR + YLW for dark-terminal readability - -Plain red on dark background is nearly invisible on most terminals. -Bolding both ERR and YLW promotes them to the bright variants — readable -on dark + light alike. - - -## 2026-05-08 — Expand cryptic Backend Caps + Global Gate cell labels - - -## 2026-05-08 — Title-Case displayed values; rename Backend Caps → Backend Limits - -New _tc() helper Title-Cases snake_case identifiers for display only — -data unchanged. Wired into worker rows, active tasks, recent activity, -board, queue, backend rows, action submenu, log view header. -'(no caps)' → '(No Limits)'. Action submenu items also Title-Cased. - - -## 2026-05-08 — Global Gate three-liner; Execution Budget → Global Rate (single-line); spacers + ≥ spacing - - -## 2026-05-08 — Reorder pane sections by operator timeline - -Swapped board ↔ campaigns in section build order. Final timeline: -Workers / Active (Present) → Recent (Past) → Campaigns / Board / Queue -(Future) → Global Rate / Backend Limits (Capacity) → Services (Infra) -→ System Resources / Global Gate (bottom-anchored). - - -## 2026-05-08 — Bottom-anchored collapsible sections - -Restructured the bottom of the pane: System Resources, Global Gate, and -Global Rate are now three independently collapsible sections, all bottom- -anchored. Default-open: System Resources only; Gate + Rate collapsed. - -- Replaced flat _resources_lines() with _bottom_sections() → list[dict] -- Removed top-section 'budget' (Global Rate moved to bottom) -- Bottom render loop: spacer + divider, then each section header (and - body if expanded), divider between sections -- Click-on-header / 'c' / mouse-wheel hit-testing all work uniformly - - -## 2026-05-08 — Fix Global Gate header DIM-when-healthy; expand load column headers - -- Worst-cell tier ladder now picks RUN over DIM when at least one cell - is RUN — gate header reads green when configured + healthy (not grey). -- '1m / 5m / 15m' → '1 Min / 5 Min / 15 Min' (clearer time windows). -- '(N cores)' → '(N Cores)' (title-case suffix). - - -## 2026-05-08 — Reorder bottom sections: Rate → Gate → Resources - - -## 2026-05-08 — Single divider directly under Services (drop spacer-then-divider) - - -## 2026-05-08 — Anchor inter-block divider to last top section - - -## 2026-05-08 — Restore leading divider on bottom block (above Global Rate) - - -## 2026-05-08 — Top block as virtual scroll buffer - -When all top sections are uncollapsed and overflow the middle area, -the top block scrolls as a single virtual buffer (mouse-wheel + PgUp/ -Dn). Bottom-anchored sections (Rate/Gate/Resources) stay put; the -top block flows behind them. - -- _allocate_section_rows: drop proportional scaling, return natural sizes -- _draw_main: build vbuf from sections with dividers, render slice - starting at top_scroll_offset, expose section_buf_ranges for hit-testing -- Mouse wheel anywhere over top sections scrolls top_scroll_offset -- PgUp/PgDn/Home/End now operate on top_scroll_offset -- Top block scroll arrows on boundary rows (▲/▼) when scrolled -- Dropped per-section scrolling for top sections (kept section_offsets - signature for compatibility) - - -## 2026-05-08 — Drop top-block auto-scroll (operator-driven only) - - -## 2026-05-08 — Banner cycle buffer: leading pad + longer gap + 6s dwell - - -## 2026-05-08 — `x` collapse all + banner cycles after full scroll - - -## 2026-05-08 — Banner continuous-stream cycling (no hard cut) - - -## 2026-05-08 — Pin 'Just Started' banner to front of cycle (override severity sort) - - -- Status pane header layout (2026-05-09, on main): removed blank rows above and below "Operations Center" header (original rows 3 and 5); retained both separator lines; header now at row 3, blank breathing row at 4, sep at 5, content at 6. middle_top 7→6. - -## 2026-05-10 — GitHub username migration - -- Updated repo-owned references from the previous GitHub username to `ProtocolWarden` after the account rename. -- Scope: license headers, GitHub URLs, workflow install commands, manifests, dependency URLs, examples, and local owner defaults where present. - -## 2026-05-13 — Add repograph/protocolwarden profiles; fix git_watcher columns - -- Created `config/profiles/repograph.yaml` and `config/profiles/protocolwarden.github.io.yaml`; whitelisted both in `.gitignore`. -- `git_watcher.py`: name and branch column widths now computed dynamically from actual repo names so long entries like `ProtocolWarden.github.io` don't clobber adjacent columns. - -## 2026-05-10 — Console setup and Custodian hook resolution - -- Added non-interactive `setup.sh` to bootstrap OperatorConsole and symlink `console` into `~/.local/bin`. -- Updated the pre-push guard to prefer system `custodian-multi`, with repo venv and sibling Custodian venv fallbacks. - -## 2026-05-13 — Add CLAUDE.md and .custodian/tmp*.yaml to .gitignore - -- Added CLAUDE.md to .gitignore -- Added .custodian/tmp*.yaml to exclude custodian audit temp files - -### ADR 0005 — Add executor repos to platform profile (2026-05-18) -Added teamexecutor, dagexecutor, critiqueexecutor, protocolwarden to platform group. -Created profile yamls for each with lazygit git pane and standard helpers. - -## 2026-05-23 — Genericize fleet-repo ref + standardize hook - -- Genericized SyncingSolution ref in .custodian/config.yaml comment (public repo; private fleet layer must not be named). Standardized .hooks/pre-push. - -## 2026-05-24 — Platform tab anchors at PlatformManifest + export CL_ANCHOR - -- launcher._multi_pane_block: cross-repo group tab cwd → PlatformManifest (was bare ~/Documents/GitHub). git-watcher still spans all group repos. -- bootstrap.get_claude_command: wrapper now exports CL_ANCHOR= so OC-launched sessions satisfy the CL guard hooks (which now hard-require CL_ANCHOR, no CWD fallback). Single-repo tabs anchor at their repo; group tab at PlatformManifest. -- Added tests/test_anchor_launch.py (2 tests). NOTE: pre-existing test_watcher_pane.py failures are unrelated (confirmed on clean main). - -## 2026-05-24 — Fix stale cxrp test fixtures (0.2 → 0.3) - -- tests/test_cxrp_capture.py hardcoded schema_version "0.2" but cxrp is at 0.3 (envelope schema const "0.3"). Bumped the 4 envelope schema_version fixtures/assertions to "0.3"; left the separate nested $payload_schema coding_agent_target/v0.2 ref (consistent with code). Full OC suite green. - -## 2026-05-24 — OC panes anchor all 3 CLIs via cl session start (Phase 3) - -- bootstrap.get_{claude,codex,aider}_command now prepend a shared _CL_ANCHOR_PRELUDE (`eval "$(cl session start 2>/dev/null || true)"`) so every Console-launched CLI anchors at its repo OWNING MANIFEST (RepoGraph-resolved), not the bare cwd. Corrects the earlier hardcoded CL_ANCHOR=cwd. Repos not hooked to a manifest resolve to nothing → skipped. Updated tests/test_anchor_launch.py (asserts prelude across all 3 CLIs). 135 tests pass. - -## 2026-05-27 — Fix: re-anchor claude in pane shells after session exit - -`bootstrap.py`: `_CL_ANCHOR_PRELUDE` now resolves `cl` via `CL_HOME` (works in non-login shells); `get_claude_command` writes a shared `console-rc-{key}.sh` that defines `claude()` with auto-anchor, used by the post-claude shell and the shell pane. -`launcher.py`: shell pane (`while true`) uses `bash --rcfile /tmp/console-rc-{key}.sh` so typing `claude` from that pane re-anchors automatically. -`tests/test_anchor_launch.py`: updated assertion to match new prelude shape (`session start` + `_CL_BIN`). - -## 2026-05-27 — Fix: source ~/.bashrc in anchor prelude (CL_HOME not in zellij pane env) - -`_CL_ANCHOR_PRELUDE` now sources `~/.bashrc` before resolving `cl`. Zellij panes are non-login non-interactive shells — they don't source `~/.bashrc`, so `CL_HOME` and PATH were unset, causing `cl session start` to silently fail and `CL_ANCHOR` to stay unset. - -## 2026-05-27 — Fix: revert shell pane to bash -l (bash --rcfile -i caused stuck pane) - -Reverted the shell pane loop back to `while true; do bash -l; sleep 1; done`. The `bash --rcfile file -i` variant caused a stuck blinking cursor — bash with `-i` inside a zellij subshell loop does not present a prompt correctly. The `claude()` re-anchor function only needs to be in the post-claude drop-to-shell (exec bash --rcfile), not the shell pane loop. +## Archived -## 2026-06-03 — Phase 4 hot-trim: trim log + historical backlog from the compiled context +_Archived completed history → `/home/dev/Documents/GitHub/PrivateManifest/archive/console/OperatorConsole/log-2026-06-04.md`_ -bootstrap.build_resume_prompt now compiles only the most-recent N log entries (CONSOLE_LOG_RECENT_ENTRIES, default 5) + a pointer, and drops unambiguously-historical/completed backlog sections (Done, Recently Completed, Previously In Progress, Cycle N updates, Archived) — keeping active In Progress/Up Next + any unrecognized section. Source .console/ files are untouched (spec §5: source retained, blob trimmed); non-destructive and reversible. Fleet effect: PlatformManifest 2142→138, OperationsCenter ~3300→686; the heaviest (private) repo ~6000→~800; other repos ≤234. 8 new tests (test_bootstrap_trim.py). Added CONSOLE_LOG_RECENT_ENTRIES to .env.example (E1) and bootstrap.py to C29 exclusions (it sat at the 500 limit). Residual size in the two heaviest repos is un-reconciled ACTIVE backlog + large task/guidelines — that's §7c content reconciliation (and OperationsCenter's .console is live-loop-owned), not a compile fix. diff --git a/.custodian/config.yaml b/.custodian/config.yaml index 4e30163..3173c4d 100644 --- a/.custodian/config.yaml +++ b/.custodian/config.yaml @@ -23,6 +23,10 @@ tests_root: tests # across Python commands and shell tools. See .custodian/detectors.py. audit: + # Opt-in to the reconcile detectors (R1 over-budget advisory, R2 scrub-target + # leak fail-closed) now that this repo's .console/ has been reconciled. + reconcile_enforce: true + cross_repo: platform_manifest_repo: ../PlatformManifest diff --git a/.gitignore b/.gitignore index 3ec07ea..c747ec8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ __pycache__/ !.console/backlog.md !.console/guidelines.md !.console/log.md +# Reconciliation worksheet + local prune staging (never tracked) +/.console/reconcile.yaml +/.console/archive/ CLAUDE.md .custodian/tmp*.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 15a61af..66653cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +- 2026-06-04: reconciled `console-symlink` — Restore cmd_install as `console symlink` (was dead code) (history archived). +- 2026-06-04: reconciled `aider-launcher` — Implement get_aider_command (launcher with profile/bin/model/auto_commits) (history archived). +- 2026-06-04: reconciled `spawn-update-clis-background` — Restore spawn_update_clis_background with _UPDATE_LOG constant (history archived). +- 2026-06-04: reconciled `read-decision-run-summary` — Wire read_decision into run_summary (decision_basis, decision_confidence) (history archived). +- 2026-06-04: reconciled `backend-missing-exit` — any_backend_missing gates run_providers exit code (history archived). +- 2026-06-04: reconciled `cxrp-execution-result` — CxrpExecutionResult fully implemented (parse + summarize) (history archived). +- 2026-06-04: reconciled `status-pane` — Curses status pane — collapsible sections, scroll, backend caps, resource gate, banners (history archived). +- 2026-06-04: reconciled `cl-anchoring` — ContextLifecycle anchoring — resolve cl once, bake path, re-anchor pane shells (history archived). +- 2026-06-04: reconciled `contextguard-hooks` — Wire ContextGuard / cl hooks into OperatorConsole's own .claude/ (history archived). +- 2026-06-04: reconciled `phase4-hot-trim` — Phase 4 hot-trim — compile only recent log entries + active backlog into context blob (history archived). +- 2026-06-04: reconciled `platform-profiles` — Platform-group profile expansion + git_watcher group wiring (RepoGraph, ProtocolWarden, executors, CL) (history archived).