MC architecture review 2026-05-13 — Luci-as-agent assessment
Independent architecture review of Mission Control / Luci-as-agent setup against the canonical runtime contract. Reviewers: 2 internal audits (Atlas systems architect + general...
StateDoneNext ActionClosedOwnerCouncilRuntimeClosedAge30d ago
Ticket is done; runtime is closed.·profile claude_opus_1m_high · cwd /home/lucienne/workspace/mission-control · uptime 29d 21h · last activity 28d 22h ago
Description
MC-3365
Independent architecture review of Mission Control / Luci-as-agent setup against the canonical runtime contract.
Reviewers: 2 internal audits (Atlas systems architect + general-purpose code-gap audit) + 5-model council (Codex, Gemini, GLM, Kimi, Opus).
Full report: ~/PKA/Elmar Inbox/luci-agent-review-2026-05-13/FINAL-ASSESSMENT.md
Top finding: core runtime contract (ticket → runtime_sessions → tmux → harvested history) is solidly implemented end-to-end. Architecture is mature and honest about its single-operator constraint. 4 critical/high findings require action.
This epic groups 9 child tickets — top 4 are critical/high path. The other 5 are tier-2 hardening. Deferred items captured in Vault note (not ticketed): per-phase runtime profile overrides, Agent Registry, luci-chat session-summary, 6-vs-7 phase doc fix, council→workflow_events 3-line patch, non-dev workflow template.
Activity
done
INTERACTIVE
Luci is working...
Details —
Done
· High
· Council
▼
SState
Done
Closed
PPeople
TTiming / Details▼
api (human)
Mission Control
30d ago
27d ago
Advanced / Operator evidence
RRouting owner
ROperator console
Ticket is done; runtime is closed.tmux_session_missingprofile claude_opus_1m_high · cwd /home/lucienne/workspace/mission-control · uptime 29d 21h · last activity 28d 22h agoMC is visibility-only. Hermes Luci launches and gates work outside MC, then mirrors evidence/status here.Raw console: luci · claude/anthropic/opus[1m]
WWorkflow
Start Dev Review + QA ▾
Select phases to include:
Agents
Review Gates
Decision
WAT routing: choose an agent, review gate, or decision. Buttons use the live runtime when one is attached.
Ticket picked up by Luci via MC dispatcher.
MC-3365: MC architecture review 2026-05-13 — Luci-as-agent assessment
Work this ticket in the live tmux runtime. Use DONE:, REVIEW:, or QUESTION: when you need MC to reflect the next state.
system29d ago
Runtime retry requested via MC ticket page. No previous failure reason was recorded.
Delivery reconciler: ticket message #33385 (turn 1) was persisted to history but never harvested from runtime within 300s. Marked `failed_to_inject` (was `injected`).
luci-operator29d ago
Operator repair: council workers emitted REVIEW signal but ticket remained in_progress. Moved to in_review, closed 3 stale runtime sessions (1 interactive + 2 council workers).
luci-operator30d ago
Luci Operator: promoted this assigned `inbox` ticket to `todo` so pickup can run it.
elmar29d ago
Some of the tickets that were created got lost. Can you review what was done and what is outstanding
Luci29d ago
I'll review the epic's child tickets and reconcile what was created vs what's
outstanding.
lucienne29d ago
LUCIENNE review (council-verified, 5/5 models). Epic substantively done — all 9 children landed on integration/mc-3365 (16 commits, +1854/-104, 794 pass vs master 705, no test_telegram hang). Verdict: MERGE WITH FIXES. 3 blockers being applied now (subagent a81ff716b6808b20f):
- B1 (CRITICAL, 1-line): reconciler find_stuck_runtime_messages must scope to persisted-only; reaping 'injected' rows = false failed_to_inject on healthy long agents
- B2 (schema): verify migrations 001-013 run on user_version=0 DB before the 014 stamp, else delivery_state column missing → OperationalError
- B3 (verify): apply_workflow_action unreachable from JSON sentinel path during shim
- Conflicts (3 files): take master's MC-3464 workbench as base, re-apply only delivery_state UI badges; union test_luci_ops_steward assertions
Then: full pytest ≥794, review skill, council CLEAN, merge --no-ff, cache-bump, restart, close epic.
CORRECTION: my earlier claim that MC-3367 fixes MC-3482 was WRONG — council confirmed MC-3367's reconciler uses the same 300s window and does NOT protect long agents from harvest reap. MC-3482 stays OPEN; the 300s deadline-scaling fix in its sharpened brief is still the real fix.
luci-operator29d ago
Operator repair: reclassified from needs_input → in_review. Council verdict received (MERGE WITH FIXES, 5/5 models), B1/B2 blockers applied (commit 392e243), remaining test fix committed (45527ee). Ticket is ready for final merge review.
lucienne27d ago
REOPENED — ground-truth verified NOT merged (zero integrate-mc-3365/MC-3371-74 commits on master). Was false-closed by the auto-close-on-weak-evidence pathology (= MC-3482's own bug). Work is intact on integration/mc-3365 (B1/B2 @ 392e243, conflicts @ a936f03). Landing now via mc-land-change skill: B3 verify + fresh-conflict vs current master + council-gate + merge + cache-bump + restart + verify. Do NOT auto-close until master shows the merge SHA.
lucienne27d ago
Epic NOT merged — correctly HELD. 33-commit / +6683 LOC divergence + semantic collision with master's independently-added nonce layer (213ca3e/a908c64) and evolved _runtime_sessions_table_sql. mc-land-change step 1/2 correctly caught this ('held the merge' outcome). Extracted ONLY B1 (the MC-3482 keystone) → landed e32872d. B2 (schema-stamp) rode the same cherry-pick but its test fails → UNTRUSTED, do not rely on it. Remaining children (MC-3371/3372/3373/3374 + workbench Q3) need FRESH re-integration against current master, NOT a force-merge. Keep open; epic = needs re-integration pass, not a land.
lucienne27d ago
STATUS CORRECTION → todo. Auto-misflipped to needs_input — no question pending. Epic remainder = fresh re-integration of MC-3371/3372/3373/3374 + workbench Q3 against CURRENT master (33-commit divergence; do NOT force-merge the stale integration branch). B1 already extracted+landed. This is a build/re-integration task, not awaiting-input.
luci27d ago
Council picking up this ticket (background worker).
council27d ago
## Council Review — MC-3365
### Codex (OpenAI)
Executive summary: Based on the provided diff, this should not merge as-is. The main blocker is the `.gitignore` rewrite: it removes existing secret/session protections and also hides several regression tests, while the patch separately deletes the repository’s current GitHub Pages deployment path with no replacement shown.
CRITICAL: In `.gitignore` at hunk `@@ -1,38 +1,26 @@`, the patch removes ignore rules for `.env`, `.env.*`, `*.pem`, `*.key`, `*.p12`, `scripts/.gmail-tokens/`, `**/*tokens*/`, `**/credentials*.json`, `**/secret*.json`, and `.wwebjs_auth/`. That reintroduces a direct path to committing live credentials, OAuth material, and WhatsApp auth state, which is a must-fix security regression.
IMPORTANT: `.gitignore` new lines 20-24 explicitly ignore `/test_mc_interactive_regressions.py`, `/test_models_dedup_regressions.py`, `/test_ticket_history_regressions.py`, `/test_ticket_pickup_regressions.py`, and `/test_ticket_runtime_regressions.py`. Those tests will now stay local and untracked by default, which undermines exactly the regression coverage this runtime-hardening work needs.
IMPORTANT: `.github/workflows/deploy.yml` is deleted in full (lines 1-30), and `.nojekyll` is removed as well. That disables the existing GitHub Pages deployment flow and changes Pages behavior for any manual publish path, with no replacement visible in the diff.
MINOR: The new graphify hook behavior is inconsistent between clients: `.claude/settings.json` lines 4-10 target `Glob|Grep`, while `.codex/hooks.json` lines 4-10 target every `Bash` invocation. That means Codex will fire the reminder on unrelated shell commands, while the overall setup still is not a precise, search-specific guardrail.
VERDICT: FAIL
### Gemini 2.5 Pro
## Executive Summary
This review assesses changes related to the Luci-as-agent architecture review. The implementation successfully introduces agent-level hooks to improve contextual awareness by checking for knowledge graphs, which is a positive step. However, the diff also contains a critical security regression in the `.gitignore` file, which removes long-standing protections against committing secrets and credentials, alongside other concerning changes to repository hygiene and testing workflows.
## Findings
**CRITICAL: The `.gitignore` file has been modified to no longer ignore secrets, credentials, and tokens. (Ref: `a/.gitignore`)**
Removing patterns such as `.env`, `*.pem`, `*.key`, `**/*tokens*/`, and `**/credentials*.json` creates a severe and unacceptable risk of sensitive data being committed to the repository. This is a direct violation of security best practices. Even in a single-operator environment, this makes the repository history a major liability, complicates key rotation, and creates a high-impact footgun for the operator. This change must be reverted immediately.
**IMPORTANT: The `.gitignore` file ignores specific, named regression test files. (Ref: `a/.gitignore`)**
The addition of `/test_mc_interactive_regressions.py`, `/test_ticket_history_regressions.py`, and other similar patterns is highly irregular. Regression tests are a crucial part of the codebase and must be version-controlled to prevent future changes from breaking existing functionality. If these files are temporary or developer-specific, this should be handled locally (e.g., via `git update-index --assume-unchanged`) rather than polluting the project's global ignore configuration. This practice suggests a flawed testing or development workflow that needs to be addressed.
**IMPORTANT: The `.gitignore` file no longer ignores common build artifacts and editor/OS-specific files. (Ref: `a/.gitignore`)**
Standard ignore patterns for `node_modules/`, `.vscode/`, `.idea/`, and `.DS_Store` have been removed. While not a security risk, this is a significant step backward for repository hygiene. It will bloat the repository with unnecessary files, increase clone/pull times, and create noise in diffs and code reviews, hindering developer productivity and code clarity.
**MINOR: Duplicated logic in agent hook configurations. (Ref: `a/.claude/settings.json`, `a/.codex/hooks.json`)**
The `command` string in both `.claude/settings.json` and `.codex/hooks.json` is identical. To adhere to the DRY (Don't Repeat Yourself) principle and improve maintainability, this command should be extracted into a standalone, executable script (e.g., `scripts/hooks/check-graphify.sh`). The configuration files can then simply call this script, ensuring that any future changes to the logic or the output message only need to be made in one place.
**MINOR: New JSON files lack a final newline character.**
The new files `.claude/settings.json` and `.codex/hooks.json` are missing a terminal newline. While most tools handle this gracefully, it's a deviation from POSIX standards for text files and can cause issues with certain command-line tools or scripts.
## VERDICT
**VERDICT: FAIL**
---
**Council verdict: CRITICAL**
lucienne27d ago
TRIAGE (Lucienne): needs_input was a misclassification — no pending question (same luci-operator needs_input-on-no-QUESTION bug MC-3590 root-causes). Corrected to in_review: this is an epic mid-integration. All 9 children landed on integration/mc-3365 (16 commits, +1854/-104, 794 pass). Real next action is NOT a status flip — it is landing integration/mc-3365 to master via the mc-land-change skill (B3 verify + fresh-conflict vs current master + council + merge + cache-bump + restart + live-verify). That is a Lucienne landing task, sequenced AFTER MC-3482's finisher (PID 86440) lands so B1/recursion stays broken. Stays in_review until master shows the merge SHA.
luci27d ago
MC-3365 CLOSED as superseded — audit 2026-05-17.
The integration/mc-3365 branch diverged irrecoverably: 34 ahead / 85 behind master, +6683 LOC, semantic collisions with master's independently-added nonce layer and evolved _runtime_sessions_table_sql; council blocked the merge (dangerous .gitignore rewrite). Re-integration is a worse trade than re-doing the open work against current master.
Findings audit (4 critical/high children) vs current master:
- MC-3366 (critical, dispatch gate): PARTIAL. preview_dispatch() + /api/v1/dispatch/preview landed; blocking enforce() gate + DispatchPolicyViolation NOT landed. mc_pickup.py:1043 references the missing class -> latent AttributeError masking. RE-TICKETED -> MC-3607.
- MC-3367 (high, persist/inject/harvest reconciler): DONE on master (delivery_state col, migration 013, _delivery_reconciler_loop). Confirmed by canonical runtime doc.
- MC-3368 (high, Telegram per-target busy-lock): SUPERSEDED by CCGram migration (old mc_telegram_bridge.py disabled). Per-target queueing already a runtime-doc roadmap item. Not re-ticketed.
- MC-3369 (high, turn-budget + spend ceiling): NOT on master. RE-TICKETED -> MC-3608.
Tier-2 children MC-3370-3374: assorted partial landings on master via independent commits; not individually re-audited — not on the critical path.
Successors: MC-3607 (dispatch gate), MC-3608 (cost-runaway protection).
Cleanup: integration/mc-3365 + worktree-mc-mc-3365 branches and the ~/workspace/mc-3365-integration worktree deleted.