Skip to content

Latest commit

 

History

History
1707 lines (1481 loc) · 79.9 KB

File metadata and controls

1707 lines (1481 loc) · 79.9 KB

Devlog

Current operational execution log. Historical entries moved during RA-2 are archived at docs/archive/2026-q2/DEVLOG-2026-q2.md.

2026-06-15

DS-13c - Mobile-Friendly Read-Only Board View

actor: codex-cli status: implemented-awaiting-review branch: codex/ds13c-mobile-view commit: pending

Summary

Implemented DS-13c exactly as the responsive-only board slice:

  • Added a max-width: 768px CSS media query to the existing self-contained GET / board HTML so the v8 Catio 现场 shell stacks the left session list, center workbench, and right detail panel into one readable column on phone-sized viewports.
  • Kept the existing viewport meta tag and reused the existing dark Warp and OpenCode-white CSS variables; no new colors, fonts, links, external assets, endpoints, data flow, JavaScript logic, or bind behavior were added.
  • Made the 看板 view one column and the 时间线 view a narrow single-column feed under the same media query.
  • Added a focused served-HTML regression test for DS-13c and updated the existing byte-stability baseline for the intentional CSS-only HTML change.
  • Updated the DS-13 plan and decision-board API reference for the responsive read-only contract.

Verification

  • Focused DS-13c RED: PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k ds13c failed with the expected missing @media (max-width: 768px) assertion.
  • Focused DS-13c GREEN: PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k ds13c passed with 1 passed, 59 deselected.
  • Baseline + DS-13c focused rerun: PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k "ds13c or ds11a2_endpoint_baseline" passed with 2 passed, 58 deselected.
  • Full suite: PYTHONPATH=src python3 -m pytest -q passed with 616 passed.
  • PYTHONPATH=src python3 -m conductor.cli verify . passed.
  • PYTHONPATH=src python3 -m conductor.cli verify --json . | python3 -m json.tool parsed successfully with ok: true.
  • git diff --check passed.

Decisions

  • No real browser or Tailscale smoke was attempted here; supervisor owns the true narrow-viewport smoke per the DS-13c task card.
  • No DS-13a/b snapshot or transport code was touched.
  • Work is intentionally left unstaged for supervisor review per the task card.
  • Self-review: PASS [6 items] - CSS-only scope, mobile single-column collapse, theme-token reuse, no external assets, no JS/data/endpoint/bind changes, and verification evidence checked.

2026-06-14

DS-11b - Agent Report JSONL Adapter And Protocol v0

actor: codex-cli status: implemented-awaiting-review branch: codex/ds11b-jsonl-adapter commit: pending

Summary

Implemented DS-11b as the third adapter brake test:

  • Added Agent Report Protocol v0 wire models under src/conductor/protocols/agent_report_v0.py with neutral envelope fields, four supported event types, unknown-field tolerance, and schema-version isolation.
  • Added AgentReportJsonlAdapter with local JSONL transport, future HTTP placeholder, config loading, offset checkpoint, event-id dedupe, bad-line and unknown-schema diagnostics, upsert/resolve state, persisted current state, stale heartbeat downgrade, canonical ConductorEvent output, and read-only capabilities.
  • Wired JSONL sessions into /api/overview.windows and JSONL attention requests into /api/decisions through canonical AttentionRequest fields; JSONL rows do not imitate Orbit vault IDs, source_path, or context_link.
  • Added .conductor/config.yaml, template config, and conductor init scaffolding for the local spool and checkpoint paths.
  • Added docs/reference/agent-report-protocol-v0.md and the repository template docs/skills/conductor-report/SKILL.md; no user-level ~/.claude/skills install was attempted.

Verification

  • DS-11b RED: /opt/homebrew/bin/python3 -m pytest -q tests/test_agent_report_jsonl_adapter.py failed with expected missing conductor.protocols, conductor.adapters.agent_report_jsonl, and board merge failures.
  • Rotation RED: /opt/homebrew/bin/python3 -m pytest -q tests/test_agent_report_jsonl_adapter.py::test_agent_report_jsonl_offset_checkpoint_and_event_id_dedupe failed because a truncated spool with a checkpoint offset beyond EOF was not replayed.
  • Focused GREEN: /opt/homebrew/bin/python3 -m pytest -q tests/test_agent_report_jsonl_adapter.py tests/test_source_adapters.py tests/test_decision_api.py tests/test_init.py passed with 77 passed.
  • Full suite: /opt/homebrew/bin/python3 -m pytest -q passed with 596 passed.
  • Documented runner with local dependency cache: PYTHONPATH=/Users/caoyuqi/miniconda3-clean-20260428-161522/lib/python3.13/site-packages:. .venv/bin/python -m pytest -q passed with 596 passed.
  • .venv/bin/conductor verify . passed.
  • .venv/bin/conductor verify --json . | .venv/bin/python -m json.tool parsed successfully.
  • git diff --check passed.

Decisions

  • Kept DS-11b local-only: no listener, daemon, network, SDK, plugin runtime, marketplace, writeback route, credentials, mobile, LAN, or MCP behavior.
  • .venv/bin/python -m pytest -q without the local dependency PYTHONPATH currently fails at collection because this .venv lacks pydantic; no environment mutation was made.
  • Work is intentionally left unstaged for supervisor review per the task card.
  • Self-review: PASS [8 items] - protocol neutrality, JSONL-as-transport boundary, checkpoint/rotation, dedupe, bad-line isolation, upsert/resolve, heartbeat TTL, and board canonical projection checked.

2026-06-12

DS-10b - Kanban and Timeline Views

actor: codex-cli status: implemented-awaiting-review branch: codex/ds10b-kanban-timeline commit: pending

Summary

Implemented DS-10b exactly as the board/timeline slice:

  • Restored real 看板 and 时间线 tabs while keeping 现场 as the default DS-10a live view.
  • Added the four kanban columns 排队 / 干活中 / 等你 / 今日完成, derived only from existing /api/overview, /api/decisions, and /api/events payloads plus the existing windows registry projection.
  • Added project@tmux_target assignees for registered windows, project-only assignees for unregistered projects, 暂无 empty states, per-project aggregation for today's commit cards, and purple gate badges for today's merge/review-gate commit cards.
  • Added the timeline standup view with tested rewrite rules for common commit/event agent-speak and collapsed 原文 disclosure for unmatched text.
  • Added /api/events.server_local_date so 今日完成 uses the server local date without adding a new data source.
  • Updated docs/reference/decision-board-api.md with the DS-10b mapping and rewrite rules.

Verification

  • Focused DS-10b RED: .venv/bin/python -m pytest -q tests/test_decision_api.py -k ds10b failed with 3 expected failures before implementation: missing kanban mapping helper, missing timeline rewrite helper, and missing real kanban/timeline tabs. A second focused RED failed on the missing per-project 今日完成 aggregation for multi-commit projects.
  • Focused DS-10b GREEN: .venv/bin/python -m pytest -q tests/test_decision_api.py -k ds10b passed with 3 passed, 37 deselected.
  • Decision API focused suite: .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 40 passed.
  • Pre-record full gate: .venv/bin/python -m pytest -q passed with 559 passed; .venv/bin/conductor verify . passed; git diff --check passed.
  • Final post-record gate: .venv/bin/python -m pytest -q tests/test_decision_api.py -k ds10b passed with 3 passed, 37 deselected; .venv/bin/python -m pytest -q passed with 559 passed; .venv/bin/conductor verify . passed; git diff --check passed.

Decisions

  • No browser/socket/tmux smoke was attempted here; supervisor owns browser smoke per the DS-10b task card.
  • No new data source, dependency, external link/resource, non-localhost behavior, admission filtering, or source-file writeback was added.
  • Work is intentionally left unstaged for supervisor review.
  • Self-review: PASS [6 items] - scope, data sources, DS-10a default behavior, visual tokens, XSS/text-node rendering, and verification evidence checked.

DS-10a - Live Warp Field View

actor: codex-cli status: implemented-awaiting-review branch: codex/ds10a-live-view commit: pending

Summary

Implemented DS-10a exactly as the live-view slice:

  • Replaced the served GET / page with a self-contained Warp dark 现场 view using the locked v7 literal tokens, ASCII [c] conductor logo, local font stacks, semantic-only color roles, 3px buttons, and 4px cards.
  • Kept deferred 看板 and 时间线 views out of the rendered page for this milestone.
  • Added registered-window projection to /api/overview using the existing read-only windows registry probe.
  • Added GET /api/terminal?project=<name> for read-only tmux capture-pane -p -t <registered target> with a 5 second timeout, project-label whitelist, and structured 窗格不可达 degradation.
  • Rendered live terminal text with text nodes, not HTML, and kept terminal capture out of disk/audit writes.
  • Reworked pending decisions into humanlayer-style approval cards and wired the bottom backfeed input through the existing confirmed POST /api/decide path.
  • Allowed /api/decide to accept a .conductor/windows.yaml registered project label for backfeed while preserving repo-local audit and registered tmux target lookup only.
  • Updated docs/reference/decision-board-api.md for DS-10a and /api/terminal.

Verification

  • Focused DS-10a RED: .venv/bin/python -m pytest -q tests/test_decision_api.py -k "ds10a or terminal_endpoint or overview_includes_registered_windows" failed with 6 expected failures before implementation: missing Warp page markers, missing approval/backfeed wiring, missing window projection, and missing terminal endpoint/injection boundary.
  • Focused DS-10a GREEN: .venv/bin/python -m pytest -q tests/test_decision_api.py -k "ds10a or terminal_endpoint or overview_includes_registered_windows" passed with 6 passed, 30 deselected.
  • Decision API focused suite: .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 37 passed.
  • Pre-record full gate: .venv/bin/python -m pytest -q passed with 556 passed; .venv/bin/conductor verify . passed; git diff --check passed.
  • Final post-record gate: .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 37 passed; .venv/bin/python -m pytest -q passed with 556 passed; .venv/bin/conductor verify . passed; git diff --check passed.

Decisions

  • No browser/socket/tmux smoke was attempted here; supervisor owns true tmux and browser smoke per the DS-10a task card.
  • No external resources, new dependencies, non-localhost behavior, docs/design edits, vault edits, or board/timeline implementation were added.
  • Work is intentionally left unstaged for supervisor review.

2026-06-11

RA-9 - Repo-wide docs honesty sweep

actor: codex-cli status: implemented-awaiting-review branch: codex/ra9-docs-honesty-sweep commit: pending-this-commit

Summary

Implemented the final pre-approved green queue item as a docs-only honesty sweep over docs/, including docs/reference/, excluding docs/archive/ and the two already-reviewed Phase A plan files.

Revised files:

  • docs/dashboard.md - changed CLI/JSON wording from "primary operator paths" to "supported non-experimental operator paths" so the [experimental] HTML dashboard preview is not presented as the primary path.
  • docs/plans/2026-05-23-platform-roadmap-v1.1-v2.0.md - added a status note anchoring the roadmap as historical/staged rather than current capability, changed "Add" architecture wording to "Stage", changed the adapter milestone from generic agent execution to generic adapter metadata and print-only previews, and marked the dashboard as an [experimental] local read-only preview rather than the primary operator path.
  • docs/product/anti-goals.md - clarified the UI anti-goal so it rejects dashboard/UI as the core product path while preserving the existing [experimental] local read-only HTML preview.
  • docs/reference/dashboard-read-model.md - changed CLI/JSON wording from "primary operator paths" to "supported non-experimental operator paths" so the [experimental] dashboard read model does not overstate the HTML preview.

Clean scanned files:

  • docs/ERROR_BOOK.md
  • docs/TRUST_PROFILE.md
  • docs/adr/0001-conductor-positioning-and-non-goals.md
  • docs/adr/0002-v2-daemon-and-execution-boundary.md
  • docs/adr/0003-credential-handling-boundary.md
  • docs/adr/0004-hosted-integration-and-marketplace-boundary.md
  • docs/agent-adapter-contract.md
  • docs/architecture/workspace-core-adapters-plugins.md
  • docs/conductor-schema.md
  • docs/conductor-v1-protocol.md
  • docs/examples/launchability/README.md
  • docs/examples/peer-adapters/README.md
  • docs/examples/red-surface-approval-packets/README.md
  • docs/handoff-protocol.md
  • docs/mobile-access.md
  • docs/plugin-extension-points.md
  • docs/product/charter.md
  • docs/product/principles.md
  • docs/product/use-cases.md
  • docs/push-checkpoints/2026-05-28-local-control-plane.md
  • docs/push-readiness.md
  • docs/queue-record-schema.md
  • docs/reference/execution-permission-model.md
  • docs/reference/foreground-preview-command-contract.md
  • docs/reference/knowledge-bridge.md
  • docs/reference/local-view.md
  • docs/reference/peer-adapter-boundaries.md
  • docs/reference/project-health-read-model.md
  • docs/reference/snapshot-ownership.md
  • docs/reference/task-sizing.md
  • docs/reference/trust-calibration.md
  • docs/reference/v1-migration-guide.md
  • docs/reference/v2-run-record-event-profile.md
  • docs/research/2026-05-humanlayer-design-extraction.md
  • docs/research/agent-infra-prior-art.md
  • docs/reviews/TASK-0142-opus-review.md
  • docs/run-record-schema.md
  • docs/runbooks/c3-envelope-operator-triage.md
  • docs/runbooks/development-loop.md
  • docs/runbooks/dogfood-workspace-profile-checklist.md
  • docs/runbooks/launchability-blocked-gate-triage.md
  • docs/runbooks/local-control-plane-quickstart.md
  • docs/runbooks/local-v2-control-plane-operator-checkpoint.md
  • docs/runbooks/private-dogfood-registry-bootstrap.md
  • docs/runbooks/v1-demo.md
  • docs/usage-tracking.md
  • docs/verify-json-schema.md
  • docs/workspace-registry.md

Verification

  • Changed-file relative link probe - checked 13 links, missing 0, 2026-06-11.
  • .venv/bin/python -m pytest -q - passed with 475 passed, 2026-06-11.
  • .venv/bin/conductor verify . - passed, 2026-06-11.
  • git diff --check - passed, 2026-06-11.
  • git diff --stat main -- src/ tests/ - empty, 2026-06-11.

Decisions

  • RA-9 only: no documents were deleted, moved, or restructured.
  • Docs-only scope was preserved: no src/, tests/, README, changelog, workflow, template, or archive files were modified.
  • Historical and research statements were left intact when they were anchored as historical, third-party, future, blocked, or proposed behavior.

Blockers

  • Supervisor review gate is pending after the implementation commit.
  • The green queue ends after RA-9; no further work is authorized by this item.

2026-06-10

RA-4 - Docs directory governance

actor: codex-cli status: completed branch: codex/ra4-docs-governance commit: pending-this-commit

Summary

Implemented Phase A RA-4 docs directory governance:

  • Moved task-level reports and one-time evidence packets into docs/archive/task-reports/.
  • Moved all stale plans out of docs/plans/ into docs/archive/plans/, leaving only 2026-05-23-platform-roadmap-v1.1-v2.0.md and 2026-06-10-refactor-phase-a-honesty-plan.md in place.
  • Moved stale research/discussion records into docs/archive/research/.
  • Moved secondary current reference documents into docs/reference/.
  • Kept top-level docs/*.md at 15 files.
  • Removed the untracked stale TASK-0153 post-push v1.1 duplicate after confirming it was content-covered by the tracked next-slice plan except for apostrophe style differences.

Verification

  • .venv/bin/python -m pytest -q - passed with 466 passed, 2026-06-10.
  • .venv/bin/conductor verify . - passed, 2026-06-10.
  • git diff --check - passed, 2026-06-10.
  • find docs -maxdepth 1 -type f -name '*.md' | wc -l - 15, 2026-06-10.
  • README/HANDOFF docs path existence probe - checked 41 paths, missing 0, 2026-06-10.

Decisions

  • RA-4 only: did not implement RA-5 dashboard downgrade or any later Phase A milestone.
  • Minimal source/test changes were limited to path constants and assertions for moved documentation evidence paths.
  • Push, release, publication, public PR creation, and remote mutation remain blocked without exact current-task human approval.

TASK-0183 - Archive historical logs

actor: codex-cli status: completed commit: pending

Summary

Implemented Phase A RA-2 log slimming by moving historical project records into docs/archive/2026-q2/ while keeping the root recovery files small and current.

Moved content:

  • Previous DEVLOG.md content is preserved in docs/archive/2026-q2/DEVLOG-2026-q2.md.
  • BACKLOG.md entries whose YAML metadata has status: done are preserved in docs/archive/2026-q2/BACKLOG-done-2026-q2.md.
  • Previous HANDOFF.md content is preserved in docs/archive/2026-q2/HANDOFF-history-2026-q2.md.

Verification

  • .venv/bin/python -m pytest -q - passed with 466 passed, 2026-06-10.
  • .venv/bin/python -m pytest -q tests/test_local_first_completion_closure.py
    • passed with 14 passed, 2026-06-10.
  • .venv/bin/conductor verify . - passed, 2026-06-10.
  • git diff --check - passed, 2026-06-10.
  • wc -l DEVLOG.md BACKLOG.md HANDOFF.md - root files total 451 lines, 2026-06-10.

Decisions

  • RA-2 only: no RA-3 capability labeling, daemon behavior, adapter behavior, queue behavior, provider work, non-localhost work, PyPI release, tag, push, or public PR work was implemented.
  • Because the existing DEVLOG mostly falls inside the last 30 calendar days but the RA-2 pass criterion requires the three root files to total no more than 1500 lines, the root DEVLOG now keeps the current operational entry and points to the full archive instead of retaining all recent historical entries inline.
  • No historical content was deleted; moved content remains tracked in archive files under docs/archive/2026-q2/.
  • Updated tests/test_local_first_completion_closure.py to read archived done backlog tasks when asserting historical TASK-0152/TASK-0157 records.

Blockers

None for RA-2 implementation. Red surfaces remain blocked unless separately approved: push/release/publication/public PR, provider/model/credential work, non-localhost/server/auth/action work, runtime/daemon/live-adapter execution, queue/lease/approval mutation, dependency/workflow change, destructive cleanup, private registry inspection, private project inventory exposure, plugin runtime or marketplace work, hosted/LAN/mobile access, and ADR 0001 non-goal changes.

RA-3 - Honest capability labeling

actor: codex-cli status: completed branch: codex/ra3-capability-labeling commit: pending-this-commit

Summary

Implemented Phase A RA-3 as copy-only honest labeling for the three half-finished capability surfaces:

  • daemon worker: [preview/bounded] runs at most two bounded cycles, not a resident daemon;
  • agent adapters: [preview] generates launch command previews; never executes them;
  • queue / runtime records: [preview/bounded] disabled by default; schema reserved.

Updated CLI help/docstrings, README labels, related capability docs, and CHANGELOG.md. No parameter, return-value, validation, or execution behavior was intentionally changed.

Verification

  • .venv/bin/python -m pytest -q - passed with 466 passed, 2026-06-10.
  • .venv/bin/conductor verify . - passed, 2026-06-10.
  • git diff --check - passed, 2026-06-10.

Decisions

  • RA-3 only: did not implement RA-4 docs directory governance or any later Phase A milestone.
  • Did not touch Phase A non-goals: true daemon, real agent launch, queue true consumption, provider integration, non-localhost, PyPI release, or tag.
  • Push, release, publication, public PR creation, and remote mutation remain blocked without exact current-task human approval.

RA-5 - Dashboard demotion to experimental

actor: codex-cli status: completed branch: codex/ra5-dashboard-demotion commit: pending-this-commit

Summary

Implemented Phase A RA-5 as docs/help-string-only dashboard demotion:

  • README/README_zh now present existing CLI/JSON projections, especially conductor operator overview --project . --json, as the primary machine-readable path.
  • README/README_zh include a minimal JSON output excerpt from a real local operator overview --json run.
  • conductor dashboard CLI help and dashboard docs now mark the HTML server as an [experimental] local read-only HTML preview.
  • CHANGELOG.md records the dashboard demotion.

No flags, parameters, defaults, behavior, dashboard renderer/server code, or src/conductor/dashboard.py code were changed.

Verification

  • .venv/bin/conductor operator overview --project . --json | .venv/bin/python -m json.tool - passed, 2026-06-11.
  • .venv/bin/python -m pytest -q - passed with 466 passed, 2026-06-11.
  • .venv/bin/conductor verify . - passed, 2026-06-11.
  • git diff --check - passed, 2026-06-11.

Decisions

  • RA-5 only: did not implement RA-6 onboarding acceptance, version changes, dashboard --json, dashboard.py splitting, daemon behavior, runtime/provider behavior, queue behavior, non-localhost behavior, PyPI release, tag, push, or public PR work.
  • Push, release, publication, public PR creation, and remote mutation remain blocked without exact current-task human approval.

RA-6 - Onboarding acceptance and 0.5.0 release hygiene

actor: codex-cli status: completed branch: codex/ra6-onboarding-release commit: pending-this-commit

Summary

Implemented Phase A RA-6 as onboarding documentation and version release-hygiene only:

  • README/README_zh Quick Start now matches the clean temporary-directory source-checkout path that was actually run.
  • pyproject.toml and src/conductor/__init__.py now declare package version 0.5.0.
  • CHANGELOG.md closes the previous unreleased section as 0.5.0 - Phase A honesty refactor (2026-06-11) and summarizes RA-1 through RA-6.

No daemon execution, real agent launch, queue consumption, provider integration, non-localhost access, tag, PyPI publication, public PR, push, or remote mutation was performed.

Onboarding Acceptance

Clean temporary-directory path, all commands exited 0; the temporary directory was removed after the run:

CONDUCTOR_REPO="$(pwd)"
ONBOARDING_DIR="$(mktemp -d)"
python3 -m venv "$ONBOARDING_DIR/.venv"
"$ONBOARDING_DIR/.venv/bin/python" -m pip install -e "$CONDUCTOR_REPO"
mkdir "$ONBOARDING_DIR/my-project"
cd "$ONBOARDING_DIR"
.venv/bin/conductor --version
.venv/bin/conductor init ./my-project
.venv/bin/conductor verify ./my-project
.venv/bin/conductor status --dir .
.venv/bin/conductor digest ./my-project

Observed key outputs:

  • Editable install built and installed conductor-ai-0.5.0.
  • .venv/bin/conductor --version printed conductor, version 0.5.0.
  • conductor init ./my-project created the v1.0 protocol scaffold.
  • conductor verify ./my-project printed Verification passed.
  • conductor status --dir . listed my-project.
  • conductor digest ./my-project rendered an empty project digest.

Verification

  • Clean temporary-directory onboarding path above - passed, 2026-06-11.
  • .venv/bin/python -m pytest -q - passed with 466 passed, 2026-06-11.
  • .venv/bin/conductor verify . - passed, 2026-06-11.
  • git diff --check - passed, 2026-06-11.

Decisions

  • RA-6 only: did not change CLI behavior except package/version reporting.
  • Did not touch Phase A non-goals: true daemon, real agent launch, queue true consumption, provider integration, non-localhost, PyPI release, or tag.
  • Push, release, publication, public PR creation, and remote mutation remain blocked without exact current-task human approval.

RA-7 - Test hardening for daemon, queue, and foreground surfaces

actor: codex-cli status: completed branch: codex/ra7-test-hardening commit: pending-this-commit

Summary

Implemented RA-7 as tests-only hardening for the daemon worker, queue, and foreground execution surfaces:

  • tests/test_daemon_worker.py: added no-work/no-write loop behavior, max_cycles lower-bound coverage, and malformed cross-owner lease blocking.
  • tests/test_foreground_runner.py: added missing-executable failure recovery and malformed-config pre-execution blocking coverage.
  • tests/test_queue_lease_projection.py: added unsafe queue path projection warning coverage and latest-terminal-record lease-clearing coverage.
  • tests/test_queue_records.py: added queue writer red-surface permission and malformed approval-ledger blocking coverage.

No files under src/conductor/ were modified. No daemon execution, real agent launch, queue consumption enablement, provider integration, non-localhost access, push, tag, release, publication, or remote mutation was performed.

Verification

  • .venv/bin/python -m pytest -q tests/test_queue_records.py tests/test_queue_lease_projection.py tests/test_foreground_runner.py tests/test_daemon_worker.py
    • passed with 99 passed, 2026-06-11.
  • .venv/bin/python -m pytest -q - passed with 475 passed, 2026-06-11.
  • .venv/bin/conductor verify . - passed, 2026-06-11.
  • git diff --check - passed, 2026-06-11.
  • git diff --stat main -- src/ - empty, 2026-06-11.

Decisions

  • RA-7 only: added behavior and boundary assertions under tests/ plus this DEVLOG entry and the HANDOFF refresh.
  • Tests assert observable outcomes: result statuses, blocked gates, queue/run records, read-only file preservation, bounded cycle behavior, and no denied side effects.
  • No source-code bug fix was needed; no xfail was added.

2026-06-11

RA-8 - Phase B feasibility research

actor: codex-cli status: completed branch: codex/ra8-phase-b-feasibility commit: pending-this-commit

Summary

Implemented RA-8 as a docs-only feasibility study for the user's Phase B decision:

  • Added docs/plans/phase-b-feasibility.md with five top-level sections: context, candidate capability analysis, dependency/order recommendation, open user questions, and references.
  • Covered all three requested candidate capabilities: real resident daemon, real agent launch via adapters, and real queue consumption.
  • For each capability, documented a design sketch, likely touched modules, needed components, safety/reliability/scope/maintenance risks, effort estimate, required verification, and WAH v2.1 reuse points.
  • Marked WAH-specific implementation claims beyond this repo as assumptions to validate with the user.

No src/, tests/, README, README_zh, CHANGELOG, pyproject.toml, workflows, runtime behavior, daemon execution, real agent launch, queue consumption, provider integration, non-localhost access, push, tag, release, publication, public PR, or remote mutation was performed.

Verification

  • .venv/bin/python -m pytest -q - passed with 475 passed, 2026-06-11.
  • .venv/bin/conductor verify . - passed, 2026-06-11.
  • git diff --check - passed, 2026-06-11.
  • .venv/bin/python relative-link probe for docs/plans/phase-b-feasibility.md - passed, all relative links resolve, 2026-06-11.
  • git diff --stat main -- src/ tests/ - empty, 2026-06-11.

Decisions

  • RA-8 only: created the feasibility note and updated project records.
  • The document is non-authorizing: it informs whether to start Phase B but does not approve or implement any Phase B capability.
  • Honesty standard held: current daemon, adapter, and queue/runtime record states are labeled [preview/bounded] or [preview]; proposed future behavior is described as future/proposed.
  • External industry patterns were cited without network access and marked as external references, not as repo evidence.

Phase B decision - deferred to WAH integration

actor: claude-supervisor status: completed branch: main

User decision (2026-06-11, locked): Phase B real execution will not be implemented in Conductor Core. Conductor locks its protocol/control-plane positioning; execution belongs to WAH v2.1; the future form is WAH as the adapter-contract execution end. Recorded in ADR 0005, the Phase A plan decision ledger, and the phase-b-feasibility.md status header (Q1 decided, Q2-Q8 sealed). Reconsideration: WAH v2.1 phase one closed AND a concrete integration need. Project enters maintenance mode.

DS-1 - Decision capture base

actor: codex-cli status: implemented awaiting review branch: codex/ds1-decision-base commit: pending-this-commit

Summary

Implemented Dashboard Sprint DS-1 decision capture and delivery base:

  • Added src/conductor/decisions.py for .conductor/decisions/decisions.jsonl schema validation, fail-closed reads, append-only decision writes, manual .conductor/windows.yaml lookup, and injected tmux delivery.
  • Added conductor decide --project ... --question ... --answer ...; it appends a manual-handoff audit record first, then attempts to deliver only the answer text with tmux send-keys -l, and appends a delivered receipt only on successful tmux exit.
  • Added focused tests in tests/test_decisions.py for schema validation, double-write ordering, and no-tmux degradation. Tests use fake tmux runners only and never send keys to a real tmux server.
  • Added ADR-0006 and docs/reference/decision-window-registry.md to document the decision-capture allowance and manual registry boundary.

No execution controls, push, dispatch, process kill, adapter launch, queue consumption, daemon behavior, network code, new dependencies, or reference-tool integration were added. DS-2 has not started.

Verification

  • .venv/bin/python -m pytest -q tests/test_decisions.py - passed with 13 passed, 2026-06-11.
  • .venv/bin/python -m pytest -q - passed with 488 passed, 2026-06-11.
  • .venv/bin/conductor verify . - passed, 2026-06-11.
  • git diff --check - passed, 2026-06-11.
  • Manual no-tmux smoke in /tmp/conductor-ds1-smoke-final.q2hNWr: .venv/bin/conductor decide --project "$tmpdir" --question "Smoke DS-1 final?" --answer "Approved for final smoke" appended .conductor/decisions/decisions.jsonl and printed manual_handoff_needed plus 待人工转达, 2026-06-11.

Decisions

  • DS-1 stores decision audit records before any tmux delivery attempt.
  • Delivery is best-effort text handoff only. Missing registry, missing tmux, or nonzero send-keys exits leave the decision recorded as manual_handoff_needed.
  • Successful tmux delivery appends an additional receipt record with the same decision id and delivery_status: delivered, preserving append-only history.
  • .conductor/windows.yaml is manual registration only; no window or process auto-discovery was added.

DS-2 - Localhost decision API

actor: codex-cli status: implemented awaiting review branch: codex/ds2-data-api commit: pending-this-commit

Summary

Implemented Dashboard Sprint DS-2 data API:

  • Extended src/conductor/decisions.py additively with .conductor/decisions/pending.jsonl, pending-question validation, append/load/open helpers, optional decision-record pending_id, and conductor decide --pending-id.
  • Added src/conductor/decision_api.py with stdlib http.server handlers for GET /api/overview, GET /api/decisions, and POST /api/decide. serve_decision_api() hard-binds to 127.0.0.1; there is no configurable host.
  • Added conductor board --project ... --port ... [--dir ...] as the sanctioned ADR-0006 localhost read+decide API command. --dir uses the same scan root style as conductor status --dir; otherwise the API serves the selected project only.
  • Added focused tests in tests/test_decisions.py and tests/test_decision_api.py for pending-question good/bad/fail-closed schema handling, old six-field decision-record compatibility, pending-answer detection by pending_id, in-process API handlers, fake tmux POST delivery, 400 paths, unknown-project rejection, latest-per-id decisions, and the 127.0.0.1 binding assertion.
  • Added docs/reference/decision-board-api.md and linked it from the DS-1 decision-window registry reference.

No execution controls, push, dispatch, process kill, adapter launch, queue consumption, daemon behavior, non-localhost host option, network client integration, reference-tool integration, dependency change, dashboard rendering change, README/CHANGELOG/workflow change, or docs/design edit was added.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decisions.py tests/test_decision_api.py failed during collection because PendingQuestionError and conductor.decision_api did not exist yet, 2026-06-11.
  • GREEN .venv/bin/python -m pytest -q tests/test_decisions.py tests/test_decision_api.py passed with 31 passed, 2026-06-11.
  • .venv/bin/python -m pytest -q passed with 506 passed, 2026-06-11.
  • Manual curl smoke attempt in /tmp/conductor-ds2-smoke.swMDAX, 2026-06-11: blocked by the Codex sandbox before any endpoint response was available. ThreadingHTTPServer(("127.0.0.1", 18765), ...) raised PermissionError: [Errno 1] Operation not permitted; a minimal Python socket bind probe to 127.0.0.1 failed with the same error.

Decisions

  • Pending questions use id, asked_at, project, question, optional context_link, and optional options defaulting to ["批准", "暂缓"].
  • A pending question is answered when any valid decision record carries the same pending_id.
  • /api/overview exposes only fields from existing read models: project name, recommendation status, branch/upstream/ahead/behind/dirty state, next decision, manual decisions, recent handoff/git events, and read warnings. It omits quota-ring data because no current read model provides it.
  • /api/decide accepts project names that match the served project or scanned projects, and existing directory paths; unknown labels are rejected with 400 instead of creating unintended directories.
  • API tests use fake tmux runners and in-process handlers; real tmux is not touched by tests.

DS-3 - Dashboard GUI page

actor: codex-cli status: implemented awaiting review branch: codex/ds3-gui-page commit: pending-this-commit

Summary

Implemented Dashboard Sprint DS-3 GUI page:

  • Added GET / to the existing src/conductor/decision_api.py stdlib decision-board server. The route serves a single self-contained Chinese HTML page derived from the locked v7 mockup copy, CSS variables, layout classes, tabs, inbox, lanes, task board, quota-ring slots, clock, and footer.
  • Added vanilla JavaScript polling of same-origin /api/decisions and /api/overview every 10 seconds. Polling re-renders only the pending-decision inbox, project lanes, and task-board regions; it does not trigger full page reloads.
  • Replaced v7 mock data with live API data: pending rows, decision options, delivery receipts, project lane status/git/next-decision/read-warning fields, and board cards derived from pending decisions plus overview events.
  • Added pause-free decision button behavior. A clicked row posts to /api/decide, changes to either 已记录 · ✓ 已送达 supervisor 窗 or 已记录 · ⚠ 待人工转达, marks the row .done, updates the count, and keeps the local receipt during the next poll until the API pending list reflects the answered pending_id.
  • Fixed the DS-2 review finding: /api/decide no longer resolves arbitrary existing directory paths. It accepts only the served project name or scanned project names; anything else returns 400.
  • Updated docs/reference/decision-board-api.md with GET /, partial polling, resolver restriction, and GUI honesty notes.

Deliberate honesty deviations from the v7 mockup:

  • Quota rings keep the v7 top-bar structure but render instead of mock percentages because no current read model provides quota data.
  • Task-board columns without real pending-decision or overview-event data render 暂无数据 / 暂无待决定 rather than fabricated counts or cards.
  • Lane fields with absent read-model values render ; read warnings are surfaced as subtle metadata instead of hidden.

No execution controls, push, dispatch, process kill, adapter launch, queue consumption, daemon behavior, non-localhost host option, external resources, framework/CDN links, dependency change, dashboard.py rendering change, README/CHANGELOG/workflow change, or docs/design/ edit was added.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py failed with 3 failures: GET / returned 404, the old resolver error text still mentioned existing directory paths, and an arbitrary existing directory path was accepted with 200, 2026-06-11.
  • GREEN .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 10 passed, 2026-06-11.
  • .venv/bin/python -m pytest -q passed with 508 passed, 2026-06-11.
  • .venv/bin/conductor verify . passed, 2026-06-11.
  • git diff --check passed, 2026-06-11.
  • Server/browser smoke was not attempted in this worker because the sandbox blocks binding sockets; supervisor review owns browser comparison and smoke.

Decisions

  • GET / belongs to the decision-board server so the DS-3 page can share the sanctioned 127.0.0.1 read+decide surface and same-origin API routes.
  • Quota data remains unknown until a real read model exists; the GUI must not infer or display synthetic quota percentages.
  • Project resolution for /api/decide is name-based only: served project or scanned project names. Existing path fallback is intentionally removed.

DS-4 - Closed-loop end-to-end test (supervisor-run)

actor: claude-supervisor + user click status: completed (PASS) branch: main

Codex sandbox cannot bind sockets or drive tmux, so DS-4 verification ran supervisor-side with the user performing the real browser click. All three pass criteria verified: tmux pane received the decision text, decisions.jsonl recorded audit-first + delivered records with pending_id links, UI receipt and pending-list clearing correct. Report: docs/reports/ds4-e2e-closed-loop-2026-06-11.md. Sprint DS-1..DS-4 complete; supervisor stopped. Open direction question recorded: delivery Enter semantics (typing-only vs auto-submit).

DS-5 - Honest navigation and cross-project events view

actor: codex-cli status: implemented pending commit branch: codex/ds5-events-view commit: pending-this-commit

Summary

Implemented Dashboard Sprint DS-5:

  • Removed the dead 学习 tab from GET /; the dashboard now exposes only the working 项目, 任务, and 动态 tabs. This is a deliberate §0-mandated deviation from the historical v7 mockup until DS-6 has a real learning data source.
  • Added GET /api/events to the existing localhost decision-board API. It uses the same single-project vs --dir project scan boundary as /api/overview, reads commit history with read-only git log, caps commits at 20 per project, merges timestamped commit events across projects by descending %cI timestamp, and returns handoff-derived next_step, blocker, and decision items with timestamp: null.
  • Added a real 动态 GUI view using the v7 compact row language: project color tags, relative commit ages, 当前状态 grouping for untimestamped handoff items, subtle git read warnings, and a working project filter select.
  • Kept failure honesty: a failed project git log contributes a read_warnings entry and no fabricated commit event.
  • Updated docs/reference/decision-board-api.md for /api/events, the three-tab navigation state, polling, and GUI honesty notes.

Dead-control audit: PASS. The page has no 学习 marker, no dead 动态 tab, and the only controls are working tab switches, the project filter select, and decision buttons/links backed by existing data.

No 127.0.0.1 binding change, dependency change, external resource, docs/design/ edit, dashboard.py edit, README/CHANGELOG/pyproject edit, or non-read-only git command was added.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py failed with 4 expected failures: 学习 still present, /api/events returned 404 for the endpoint tests, and decision_api had no git-log subprocess reader.
  • GREEN .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 14 passed after adding the offset-aware chronological sort regression test.
  • Full .venv/bin/python -m pytest -q passed with 512 passed.
  • Pre-record .venv/bin/conductor verify . passed.
  • Pre-record git diff --check passed.
  • Socket/browser smoke was not attempted because this Codex sandbox cannot bind 127.0.0.1; supervisor browser tests remain the review-gate owner.

Decisions

  • DS-5 keeps 学习 absent until DS-6 supplies a real read model.
  • Untimestamped handoff items stay untimestamped in the API and are grouped client-side under 当前状态; no synthetic times are generated.
  • Git history reads are limited to read-only git log; failures are warnings, not fabricated timeline rows.

DS-6 - Read-only orbit vault bridge and learning view

actor: codex-cli status: implemented pending commit branch: codex/ds6-vault-bridge commit: pending-this-commit

Summary

Implemented Dashboard Sprint DS-6:

  • Added .conductor/config.yaml orbit_vault_path: ~/claudecode_workspace/orbit; empty/missing/nonexistent paths silently turn the bridge off.
  • Added a read-only Orbit vault bridge in src/conductor/orbit_bridge.py. It scans 20_项目/*/*-问题与决策.md and 20_项目/*.md, includes sections marked [等用户拍板] / [等方案窗], and excludes sections whose pending marker is later superseded by [已闭环] / [已拍板] in the same section.
  • Merged vault pending rows into GET /api/decisions with stable vault: ids, project labels, question summaries, file:// 来源 › links, source paths, default options, and age_seconds only when a date is derivable.
  • Added vault-sourced POST /api/decide handling. It writes only the served repo decision audit, delivers only the user's decision text through the served repo tmux registration, never writes the vault, and returns 决定已记录,vault 状态需 orbit 窗收口.
  • Added GET /api/learning to parse the newest vault 90_计划/*.md weekly plan: unit schedule table, today's highlighted row by date, and locked decision bullets. Empty/unavailable/unparsable vault state returns 暂无计划 without fabricated data.
  • Restored the working 学习 tab in GET / and wired it to the real learning read model. The page still uses same-origin polling only and no external resources.
  • Updated docs/reference/decision-board-api.md with the DS-6 endpoints, config behavior, vault read-only boundary, and special vault receipt.

No vault writes, dependency changes, external resources, non-localhost binding, push/release/publication, docs/design/ edits, or execution controls were added.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py failed with 5 expected DS-6 failures: no working 学习 tab, missing vault pending aggregation, missing /api/learning, and vault-sourced decide rejected as an unknown project.
  • GREEN .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 20 passed after implementation and fixture isolation.
  • Final focused .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 20 passed.
  • Final full .venv/bin/python -m pytest -q passed with 518 passed.
  • Final .venv/bin/conductor verify . passed.
  • Final git diff --check passed.
  • Code review: PASS. No critical/high findings; tightened file:// allowance to vault-sourced rows only and avoided digit-stripping question summaries before the final verification rerun.

Decisions

  • DS-6 tests use only temporary fixture vaults; default test projects set orbit_vault_path: "" so they never read the real Orbit vault.
  • Vault state remains Orbit-owned. Conductor records the decision audit locally and surfaces the receipt that Orbit still needs to close the source section.
  • Missing or unparsable learning data renders 暂无计划; no schedule units or decision bullets are fabricated.

DS-7 - tmux window registration runbook and inspection CLI

actor: codex-cli status: implemented pending commit branch: codex/ds7-windows-registry commit: pending-this-commit

Summary

Implemented Dashboard Sprint DS-7:

  • Added docs/runbooks/window-registration.md with the tmux supervisor startup flow, .conductor/windows.yaml registration schema, a concrete conductor example, conductor windows list/check usage, and the explicit read-only probe boundary.
  • Added src/conductor/windows.py for strict DS-1 registry schema validation and read-only pane reachability checks using tmux display-message.
  • Added conductor windows list and conductor windows check. list reports missing registries as empty state with exit 0. check exits non-zero for a missing registry, malformed schema, unreachable pane, or unavailable tmux.
  • Added focused DS-7 tests covering registered, unregistered, malformed, unreachable, and tmux-missing states. The tests mock the tmux probe boundary and never require a real tmux server.
  • Updated docs/reference/decision-window-registry.md to link the runbook and document the new read-only inspection commands.

No tmux send-keys path, socket binding, dashboard startup, real tmux e2e, dependency change, push/release/publication, or external action was added.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_windows.py failed with the expected missing conductor.windows module.
  • GREEN .venv/bin/python -m pytest -q tests/test_windows.py passed with 6 passed.
  • Adjacent .venv/bin/python -m pytest -q tests/test_decisions.py passed with 23 passed.
  • Final focused .venv/bin/python -m pytest -q tests/test_windows.py passed with 6 passed.
  • Final full .venv/bin/python -m pytest -q passed with 534 passed.
  • Final .venv/bin/conductor verify . passed.
  • Final git diff --check passed.
  • Code review/self-review: PASS, no critical or high findings.

Decisions

  • conductor windows validates the documented DS-1 schema: projects.<project>.tmux_target.
  • list is an operator inventory command and remains exit 0 for a missing registry; check is the gate command and returns non-zero for missing, malformed, unreachable, or tmux-unavailable states.
  • DS-7 e2e retest remains supervisor-owned per the task card because this sandbox must not bind sockets, reach real tmux, or start anything.

DS-7 fix round 2 - tmux liveness probe correction

actor: codex-cli status: implemented pending review branch: codex/ds7-windows-registry commit: pending-this-commit

Summary

Applied the supervisor e2e finding from .conductor/tasks/ds7-fix-round-2.md:

  • Replaced the conductor windows list/check liveness probe from tmux display-message to read-only tmux list-panes -t <target> -F "#{session_name}:#{window_index}.#{pane_index}".
  • A registered pane is now reachable only when tmux returns rc 0 and the exact requested pane target appears in the output lines, preventing live-window / bad-pane false positives.
  • Added a 5 second timeout to the real subprocess probe; timeout is reported as unreachable with a clear message.
  • Updated mocked DS-7 tests for the new argv/semantics and added coverage for a bad pane index inside a live window plus a timed-out probe.
  • Updated the window-registration runbook probe description.

No tmux send-keys path, socket binding, dashboard startup, real tmux e2e, dependency change, push/release/publication, or external action was added.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_windows.py failed with the expected old-probe failures: display-message argv, false positives for unreachable/bad-pane targets, and missing timeout handling.
  • GREEN .venv/bin/python -m pytest -q tests/test_windows.py passed with 8 passed.
  • Final full .venv/bin/python -m pytest -q passed with 536 passed.
  • Final .venv/bin/conductor verify . passed.
  • Final git diff --check passed.
  • Code review/self-review: PASS, no critical or high findings.

Decisions

  • The liveness check intentionally requires the exact configured pane target in tmux list-panes output because tmux can return rc 0 while listing a live window that does not contain the requested pane.
  • Probe timeout is treated as unreachable, not as a process crash or a hanging CLI.

DS-8 - delivery auto-Enter and board confirm

actor: codex-cli status: implemented pending review branch: codex/ds8-enter-delivery commit: pending-this-commit

Summary

Implemented .conductor/tasks/ds8-task-card.md:

  • decide(...), POST /api/decide, and conductor decide now press Enter by default after typing the user's decision text into the registered tmux pane.
  • Added enter: false and --no-enter opt-outs to preserve typing-only delivery for callers that need the old DS-1 behavior.
  • New decision audit records include the boolean enter flag; old records without the field remain valid.
  • The board GUI now shows a local confirm prompt (发送并执行?) with the selected decision text before posting. Canceling does not mutate the row or call the API.
  • Updated docs/reference/decision-board-api.md, docs/reference/decision-window-registry.md, and appended the DS-8 semantics update to ADR-0006.

No real tmux, socket bind, server smoke, dependency change, push, release, publication, public PR, destructive cleanup, or docs/design/ edit was performed.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decisions.py tests/test_decision_api.py failed with 8 expected failures for the missing enter field/default behavior, --no-enter, API opt-out, Enter send argv, and confirm wiring.
  • GREEN .venv/bin/python -m pytest -q tests/test_decisions.py tests/test_decision_api.py passed with 57 passed.
  • Full .venv/bin/python -m pytest -q passed with 540 passed.
  • Final .venv/bin/conductor verify . passed.
  • Final git diff --check passed.
  • Final git status --short --branch --untracked-files=all showed branch codex/ds8-enter-delivery with only the intended DS-8 files modified.
  • Code review/self-review: PASS [6 items], no critical or high findings.

Decisions

  • Enter-after-text is the default delivery behavior because the DS-8 direction decision moves misfire handling to a board-side confirm prompt.
  • enter: false / --no-enter is retained as an explicit compatibility escape hatch for typing-only callers.

DS-9 - usage quota view and local alerts

actor: codex-cli status: implemented pending review branch: codex/ds9-usage-quota commit: pending-this-commit

Summary

Implemented .conductor/tasks/ds9-task-card.md:

  • Added src/conductor/usage_quota.py for local-only Claude and Codex transcript token parsing, TASK-0021 schema normalization, 5h estimated quota windows, local historical calibration, burn-rate projection, and threshold alert checks.
  • Claude parsing reads only message.usage token metadata, timestamp, and model; Codex parsing converts cumulative total_token_usage session events into deltas to avoid double counting.
  • Added GET /api/usage to the decision board and updated the top quota rings to render 估算, 校准值, or 无校准基准 without fabricated limits.
  • Added an in-process board-server alert timer that checks every 5 minutes and sends local macOS notifications via osascript once per 80% / 95% threshold per provider/window.
  • Updated docs/reference/decision-board-api.md and added docs/reference/usage-quota-estimates.md with ccusage fork attribution, endpoint shape, calibration rules, privacy boundaries, and alert behavior.

No credentials, outbound network, new dependency, new daemon, mobile push, real-home fixture test, real-data ccusage comparison, or real notification test was performed.

Verification

  • RED .venv/bin/python -m pytest tests/test_usage_quota.py tests/test_decision_api.py::test_get_root_serves_dashboard_page_with_v7_literal_markers tests/test_decision_api.py::test_usage_endpoint_returns_estimated_quota_view_from_fixture_transcripts -q failed with the expected missing conductor.usage_quota module.
  • GREEN focused DS-9 pytest passed with 8 passed.
  • Adjacent .venv/bin/python -m pytest tests/test_usage.py tests/test_usage_quota.py tests/test_decision_api.py -q passed with 43 passed.
  • Full .venv/bin/python -m pytest -q passed with 547 passed.
  • Final .venv/bin/conductor verify . passed.
  • Final git diff --check passed.
  • Code review/self-review: PASS [6 items], no critical or high findings.

Decisions

  • Calibrated limits come only from local historical completed 5h blocks; no official or guessed limit is embedded.
  • GET /api/usage is a read endpoint and validates parsed estimates through the existing usage schema without persisting transcript-derived records.
  • Supervisor owns real-data acceptance against npx ccusage blocks --live and the real macOS notification test per the task card.

DS-9 fix round 2 - usage quota acceptance corrections

actor: codex-cli status: implemented pending review branch: codex/ds9-usage-quota commit: pending-this-commit

Summary

Completed .conductor/tasks/ds9-fix-round-2.md after recovering the partial interrupted tree:

  • current_window now uses ccusage-style session blocks: the first activity after a reset starts at the UTC hour floor, each block spans exactly 5 hours, activity after a block end or after a 5 hour idle gap starts a new block, and the active block is the one containing now.
  • Claude transcript parsing deduplicates token entries by (message.id, requestId) and counts skipped duplicate or unkeyed token rows in provider warnings.
  • Codex cumulative sessions update the previous cumulative total before the lookback cutoff is applied, so the first in-window event emits only the in-window delta instead of booking the full pre-cutoff total.
  • Added focused fixture-only coverage for active block boundaries, idle-gap blocks, Claude dedupe, and Codex cutoff-straddle deltas.

No real-home transcript fixture, outbound network, npx ccusage blocks, real notification test, dependency change, push, release, publication, public PR, or destructive cleanup was performed.

Verification

  • .venv/bin/python -m pytest tests/test_usage_quota.py -q passed with 10 passed.
  • .venv/bin/python -m pytest -q passed with 551 passed.
  • .venv/bin/conductor verify . passed.
  • .venv/bin/conductor verify --json . | .venv/bin/python -m json.tool returned ok: true with no errors or warnings.
  • git diff --check passed.
  • Final git status --short --branch --untracked-files=all remains dirty and unstaged as requested for codex/ds9-usage-quota.

Decisions

  • Round-2 acceptance remains local-fixture-only in this worker; supervisor owns the real-data comparison against npx ccusage blocks and any real macOS notification acceptance.
  • Calibrated limits continue to come from completed local session blocks only; no official, guessed, or remote-provider limit is embedded.

DS-10b fix round 2 - timeline rewrite single source

actor: codex-cli status: implemented pending review branch: codex/ds10b-kanban-timeline commit: pending-this-tree

Summary

Completed .conductor/tasks/ds10b-fix-round-2.md in place:

  • /api/events now applies the backend-tested rewrite_timeline_event_text table to each event and serves display_text, original, and translated fields.
  • Untranslated events keep the raw value in original, set translated=false, and show the generic folded label 事件已记录.
  • The timeline frontend no longer contains the duplicated JavaScript regex rewrite table and renders only server-provided timeline display fields.
  • Pending decision timeline rows keep their question as the row display_text.
  • Updated served-HTML/API tests and the decision board API reference for the server-owned display contract.

No browser/socket/tmux smoke, runtime launch, dependency change, push, release, publication, public PR, or destructive cleanup was performed.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py -k "api_events_rewrites_timeline_display_text_server_side or get_root_serves_ds10b_real_kanban_and_timeline_tabs" failed with the expected missing /api/events display_text field and live rewriteEventText JavaScript rule copy.
  • GREEN .venv/bin/python -m pytest -q tests/test_decision_api.py -k "api_events_rewrites_timeline_display_text_server_side or get_root_serves_ds10b_real_kanban_and_timeline_tabs" passed with 2 passed, 39 deselected.
  • .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 41 passed.
  • .venv/bin/python -m pytest -q passed with 560 passed.
  • .venv/bin/conductor verify . passed.
  • git diff --check passed.

Decisions

  • The backend rewrite table is the single source for served timeline labels.
  • The tree remains unstaged for supervisor review per the round-2 task file.

DS-10c - pending admission filter and vault closeout writeback

actor: codex-cli status: implemented pending review branch: codex/ds10c-inbox-writeback commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds10c-task-card.md in place:

  • Added DS-10c admission filtering for repo/vault pending rows and manual decision text: boundary/policy statements leave the inbox, stopped-state text becomes ⏸停机待派活, true four-element pending rows stay actionable, rows missing source/question/action/age move to 原文待整理, and rows older than 14 days move to 陈年区.
  • Added a user-clicked stale Orbit-vault closeout path at POST /api/decisions/close with source-path containment, current-section recheck, whole-line status replacement only, backup under .conductor/vault-writeback-backups/, post-write verification, and kind=vault_writeback audit rows in .conductor/decisions/decisions.jsonl.
  • Kept repo-sourced pending rows read-only for closeout; mismatch returns 409 before any source write, backup, or audit append.
  • Updated the served board to render boundary folds, 原文待整理, actionable 陈年区, and a second-confirm 标记已闭环 button only for stale Orbit-vault rows.
  • Updated docs/reference/decision-board-api.md with the classifier rule table and writeback protocol.

No real vault smoke, browser/socket/tmux runtime smoke, dependency change, push, release, publication, public PR, destructive cleanup, or automatic closeout was performed.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py -k "ds10c or decisions_close" failed with expected policy/status leakage, missing stale group, and missing close-route failures.
  • GREEN .venv/bin/python -m pytest -q tests/test_decision_api.py -k "ds10c or decisions_close" passed with 5 passed, 41 deselected.
  • .venv/bin/python -m pytest -q tests/test_decision_api.py passed with 46 passed.
  • Final post-record full gate: .venv/bin/python -m pytest -q tests/test_decision_api.py -k "ds10c or decisions_close or ds10b_kanban" passed with 6 passed, 40 deselected; .venv/bin/python -m pytest -q passed with 565 passed; .venv/bin/conductor verify . passed; git diff --check passed.
  • Code review/self-review: PASS [6 items]. The review pass found and fixed one projection consistency gap: build_kanban_columns now includes stale_pending alongside pending for the 等你 column.

Decisions

  • Vault writeback is the only source-file write path added here and remains limited to replacing the matched standalone bold pending-status line.
  • Supervisor owns the real-vault smoke and any browser/runtime acceptance for DS-10c.

DS-10d - white theme and Catio three-column shell

actor: codex-cli status: implemented pending review branch: codex/ds10d-white-theme commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds10d-task-card.md in place:

  • Added the dual-theme CSS variable fork to the served decision board with dark Warp as the default and the v8 OpenCode white literals for the light theme.
  • Added the 切暗/白 localStorage-backed theme toggle and dual logo rendering: dark keeps the ASCII [c] mark, light uses the v8 rounded square check mark.
  • Refactored the 现场 view into the Catio-style three-column shell: registered sessions on the left, a center workbench with live badges and recent sessions, and the existing approval cards / live terminal / backfeed controls as a persistent right detail panel.
  • Kept the automation area as a gray 未接入 empty placeholder only; no automation routes, fake automation data, dead buttons, dependencies, or external resources were added.
  • Updated docs/reference/decision-board-api.md with the DS-10d theme and layout contract.

No API behavior, tmux delivery, vault writeback logic, dependency change, runtime/browser smoke, push, release, publication, public PR, or destructive cleanup was performed.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py -k ds10d failed with the expected missing default data-theme, dual-logo, light token, toggle, Catio shell, and automation empty-state assertions.
  • GREEN .venv/bin/python -m pytest -q tests/test_decision_api.py -k ds10d passed with 2 passed, 50 deselected.
  • Pre-record full gate: .venv/bin/python -m pytest -q passed with 571 passed; .venv/bin/conductor verify . passed; git diff --check passed.
  • Final post-record/self-review full gate: .venv/bin/python -m pytest -q tests/test_decision_api.py -k ds10d passed with 2 passed, 50 deselected; .venv/bin/python -m pytest -q passed with 571 passed; .venv/bin/conductor verify . passed; git diff --check passed.
  • Self-review: PASS [6 items]. Checked literal dark/light tokens, theme persistence and dual logo, Catio shell structure, automation empty-state boundary, unchanged same-origin API/delivery paths, and no external resources/dependencies.

Decisions

  • Catio remains reference-only; this task did not install, run, or vendor Catio.
  • Supervisor owns browser dual-theme smoke; this worker only verified served HTML literals and local tests.

DS-11a-1 - ADR-0007 and canonical model minimum fields

actor: codex-cli status: implemented pending review branch: codex/ds11a1-canonical-model commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds11a1-task-card.md in place:

  • Added ADR-0007 for the source-adapter boundary and canonical event model, including the local-first positioning anchor and the writeback-as-capability boundary.
  • Added the minimal Pydantic canonical model surface under src/conductor/core/: AgentSession, AttentionRequest, DecisionResponse, DecisionOption, SourceLocator, AdapterCapabilities, UsageSnapshot, and ConductorEvent.
  • Added src/conductor/adapters/base.py with the SourceAdapter protocol and SendResult, while preserving the existing conductor.adapters registry import surface in the new package initializer.
  • Declared pydantic>=2 in pyproject.toml.
  • Added focused fixture tests for field sets, defaults, Literal validation, model round trips, adapter protocol shape, and the models.py/events.py private-format wording guard.

No UI, decision API, existing source reader, terminal, vault, writeback, runtime, socket, tmux, adapter implementation, push, release, publication, public PR, or destructive cleanup behavior was changed.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_canonical_models.py failed before implementation because the new Pydantic dependency was not installed in .venv yet (ModuleNotFoundError: No module named 'pydantic').
  • Local dependency install attempt .venv/bin/python -m pip install 'pydantic>=2' was blocked by sandbox DNS / network resolution; no package was installed into .venv.
  • GREEN focused model gate using the compatible local Python 3.13 Pydantic 2 site-packages path: PYTHONPATH=/Users/caoyuqi/miniconda3-clean-20260428-161522/lib/python3.13/site-packages .venv/bin/python -m pytest -q tests/test_canonical_models.py passed with 5 passed.
  • Existing adapter compatibility plus canonical model focused gate: PYTHONPATH=/Users/caoyuqi/miniconda3-clean-20260428-161522/lib/python3.13/site-packages .venv/bin/python -m pytest -q tests/test_adapters.py tests/test_canonical_models.py passed with 21 passed.
  • Full suite with the same local Pydantic path: PYTHONPATH=/Users/caoyuqi/miniconda3-clean-20260428-161522/lib/python3.13/site-packages .venv/bin/python -m pytest -q passed with 576 passed.
  • .venv/bin/conductor verify . passed.
  • git diff --check passed.
  • Self-review: PASS [7 items]. Checked binding-source coverage, minimal field sets, Literal validation, models.py/events.py private-format wording guard, no behavior-path imports, existing conductor.adapters import compatibility, and unstaged task-contract state.

Decisions

  • DS-11a-1 stops at pure model files and ADR. DS-11a-2 owns any existing-source adapter implementation or UI wiring.
  • The task remains unstaged for supervisor review per the task-card contract.

DS-11a-2 - orbit/tmux adapters and canonical board projection

actor: codex-cli status: implemented pending review branch: codex/ds11a2-adapters-wiring commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds11a2-task-card.md in place:

  • Added src/conductor/adapters/orbit_vault.py as a thin wrapper around the existing Orbit vault bridge. It emits canonical ConductorEvent / AttentionRequest objects, exposes close/writeback as a capability, reuses configured vault path behavior, and leaves parser logic in orbit_bridge.
  • Added src/conductor/adapters/tmux.py as a thin wrapper around registered capture-pane, registered-target lookup, and send-keys write capability. Reads/writes remain limited to .conductor/windows.yaml targets.
  • Rewired decision_api collection paths to go through adapters and project back to the locked legacy JSON shape for /api/decisions, /api/learning, /api/terminal, /api/decide, and /api/decisions/close.
  • Added contract tests for Orbit markdown fixture -> AttentionRequest and tmux fake pane -> AgentSession.
  • Added a DS-11a-2 endpoint-byte regression test. Baseline response snapshot was taken before implementation: GET / length 34579 sha256 f2a5371e7be827676be32733af2db9a82b3cad3695ce48356cab97c3bbf7a37e; the fixture JSON endpoints are pinned to exact serialized bytes.

No DS-11b JSONL adapter, DS-12 AgeInfo work, plugin/runtime/HTTP/mobile/LAN surface, credential handling, daemon, arbitrary tmux target, push, release, publication, public PR, or destructive cleanup was performed.

Verification

  • RED PYTHONPATH=src /opt/homebrew/bin/python3 -m pytest -q tests/test_source_adapters.py failed before implementation with missing conductor.adapters.orbit_vault and conductor.adapters.tmux.
  • Baseline snapshot command before edits recorded: GET / 200 len 34579 sha256 f2a5371e7be827676be32733af2db9a82b3cad3695ce48356cab97c3bbf7a37e; /api/decisions 200 len 728; /api/learning 200 len 617; /api/terminal?project=alpha 200 len 62; POST /api/decide 200 len 134.
  • Focused GREEN PYTHONPATH=src /opt/homebrew/bin/python3 -m pytest -q tests/test_decision_api.py tests/test_source_adapters.py tests/test_canonical_models.py passed with 61 passed.
  • Full suite PYTHONPATH=src /opt/homebrew/bin/python3 -m pytest -q passed with 580 passed.
  • .venv/bin/conductor verify . passed.
  • git diff --check passed.
  • Self-review: PASS [7 items]. Checked adapter boundary placement, parser non-movement, registered tmux target gate, Orbit writeback gate, endpoint byte regression coverage, core neutrality grep, and stale .venv import boundary for non-dashboard CLI commands.

Decisions

  • Legacy Orbit display-only fields needed for byte-identical API responses stay in the Orbit adapter projection layer, not in core.
  • Full pytest used /opt/homebrew/bin/python3 because .venv is missing Pydantic and .venv/bin/python -m pip install -e . was blocked by DNS while fetching hatchling. The non-dashboard .venv/bin/conductor verify . path remains green via lazy adapter imports.
  • Supervisor owns true orbit+tmux browser smoke and visual/data zero-change confirmation. This worker stops before DS-12 and leaves changes unstaged.

DS-12 - AgeInfo and decision board age zones

actor: codex-cli status: round-2 fix applied pending review branch: codex/ds12-ageinfo commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds12-task-card.md in place:

  • Added canonical AgeInfo with created_at, updated_at, basis, and confidence; AttentionRequest now carries age: AgeInfo instead of the old parallel age_confidence field.
  • Kept Orbit-specific age interpretation inside OrbitVaultAdapter: explicit section/ancestor dates map to basis=explicit, confidence=high, file mtime fallback maps to file_mtime/medium, position-only estimates map to position_estimate/low, and missing age maps to unknown/unknown.
  • Updated /api/decisions to expose unknown_age alongside pending, stale_pending, raw_pending, boundary_items, status_items, and decided. Age bucketing now uses canonical age_info and derives age_seconds only for display.
  • Updated the dashboard approval pane to render Open / Stale / Unknown age / Resolved zones. Unknown-age rows remain actionable pending decisions but no longer mix into the main Open list.
  • Round 2 fixed the acceptance failure where date-less Orbit pendings with basis=file_mtime recomputed age_bucket=fresh from age_seconds and stayed in Open. The classifier now treats age_info.basis as the single zone source: only explicit routes by age into Open/Stale; file_mtime, position_estimate, ingest_time, and unknown route to Unknown age.
  • Updated docs/reference/decision-board-api.md with the DS-12 API and UI contract.

No DS-11b JSONL adapter, plugin/runtime/HTTP/mobile/LAN surface, credential handling, daemon, arbitrary tmux target, push, release, publication, public PR, destructive cleanup, or Orbit date-line parser patch was performed.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_canonical_models.py tests/test_source_adapters.py tests/test_decision_api.py -k "attention_request_defaults or orbit_vault_adapter_projects or orbit_vault_adapter_maps or ds12 or ds11a2_endpoint_baseline" was blocked at collection because .venv still lacks DS-11's pydantic>=2.
  • RED with available Pydantic: PYTHONPATH=src python3 -m pytest -q tests/test_canonical_models.py tests/test_source_adapters.py tests/test_decision_api.py -k "attention_request_defaults or orbit_vault_adapter_projects or orbit_vault_adapter_maps or ds12 or ds11a2_endpoint_baseline" failed on the missing AgeInfo import before implementation.
  • Focused GREEN same command passed with 8 passed / 60 deselected.
  • Affected suites PYTHONPATH=src python3 -m pytest -q tests/test_canonical_models.py tests/test_source_adapters.py tests/test_decision_api.py passed with 68 passed.
  • Full suite before record edits PYTHONPATH=src python3 -m pytest -q passed with 587 passed.
  • DS-12 initial final post-record gate: PYTHONPATH=src python3 -m pytest -q passed with 587 passed; .venv/bin/conductor verify . passed; .venv/bin/conductor verify --json . | python3 -m json.tool returned ok: true with empty errors/warnings; git diff --check passed; git status --short --branch --untracked-files=all showed only unstaged DS-12 task files.
  • Self-review: PASS [7 items]. Checked single canonical age source in core, Orbit-only age basis mapping, unknown-age admission vs raw_pending, canonical-age classifier bucketing, API/UI zone shape, DS-11a-2 intentional baseline update, and DS-11b/red-surface non-expansion.
  • Round-2 RED: PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k "ds12 or vault_pending_without_stated_date or vault_pending_uses_nearest_ancestor_heading_date or stale_vault_pending" failed with the expected file_mtime row still in pending and missing from unknown_age.
  • Round-2 focused GREEN: same command passed with 6 passed / 49 deselected.
  • Round-2 affected suite PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py passed with 55 passed.
  • Round-2 focused bundle PYTHONPATH=src python3 -m pytest -q tests/test_canonical_models.py tests/test_source_adapters.py tests/test_decision_api.py -k "attention_request_defaults or orbit_vault_adapter_projects or orbit_vault_adapter_maps or ds12 or ds11a2_endpoint_baseline or stale_vault_pending or vault_pending_uses_nearest_ancestor_heading_date" passed with 11 passed / 57 deselected.
  • Round-2 full suite before record edits PYTHONPATH=src python3 -m pytest -q passed with 587 passed.
  • Round-2 final post-record gate: PYTHONPATH=src python3 -m pytest -q passed with 587 passed; .venv/bin/conductor verify . passed; .venv/bin/conductor verify --json . | python3 -m json.tool returned ok: true with empty errors/warnings; git diff --check passed; git status --short --branch --untracked-files=all showed only unstaged DS-12 task files.

Decisions

  • DS-12 intentionally updates the DS-11a-2 endpoint baseline: GET / is now 35688 bytes with sha256 83cc2a58185db9f543e8a14e7133a0f9f8220dfc3854b9c02ddb5acab59ee49f, and /api/decisions includes age_info plus the empty unknown_age bucket in the pinned fixture.
  • .venv remains stale for Pydantic, so Python verification that imports canonical models uses PYTHONPATH=src python3; .venv/bin/conductor verify . remains the documented verifier path.
  • [plan-补丁] Supervisor intent for DS-12 round 2 is explicit stated date to Open/Stale and non-explicit age basis to Unknown age. This resolves the mild tension between the basis taxonomy and acceptance text: file mtime is a real fallback basis, but date-less Orbit items must not stay mixed into Open. Orbit window should ratify this mapping.
  • Supervisor owns true vault/browser smoke for the missing-date rows entering the Unknown age fold. This worker stops before DS-11b and leaves changes unstaged.

DS-13a - Read-only canonical snapshot endpoint

actor: codex-cli status: implemented pending final supervisor smoke branch: codex/ds13a-snapshot-endpoint commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds13a-task-card.md in place:

  • Added GET /api/snapshot with snapshot_schema_version: conductor.snapshot.v1, UTC generated_at, canonical sessions, canonical attention_requests, and canonical usage.
  • Reused DS-11/12 core objects and serialized them at the endpoint boundary with model_dump(mode="json"); no snapshot-specific data model was added.
  • Aggregated the same three canonical sources: Orbit vault pending events, registered tmux session snapshots, and Agent Report JSONL sessions/open attention requests.
  • Kept /api/snapshot GET-only. POST /api/snapshot returns 405 with Allow: GET.
  • Preserved the existing 127.0.0.1 hard bind; no LAN bind, 0.0.0.0, auth, Tailscale management, daemon, transport abstraction, mobile view, writeback, or bidirectional control was added.
  • Added a default-preserving Agent Report adapter persist_checkpoint option so normal board collectors keep checkpoint behavior while the snapshot path can poll without writing checkpoints.
  • Updated docs/reference/decision-board-api.md with the snapshot schema, version contract, read-only/no-side-effect behavior, and user-side tailscale serve http://127.0.0.1:<port> note.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_decision_api.py -k snapshot failed with the expected missing endpoint behavior: GET /api/snapshot returned 404 and POST /api/snapshot returned 404.
  • .venv/bin/python -m pytest -q tests/test_decision_api.py -k snapshot later blocked because this .venv is missing the declared pydantic>=2 dependency; .venv/bin/python -m pip install -e '.[test]' was blocked by restricted network/DNS while trying to fetch hatchling.
  • Focused GREEN with available dependencies: PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k snapshot passed with 2 passed / 56 deselected.
  • Affected API suite: PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py passed with 58 passed.
  • Affected adapter suite: PYTHONPATH=src python3 -m pytest -q tests/test_agent_report_jsonl_adapter.py passed with 20 passed.
  • Review fix RED PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k "snapshot_endpoint_returns_json_error" failed because malformed decision records escaped the snapshot handler.
  • Final focused GREEN PYTHONPATH=src python3 -m pytest -q tests/test_decision_api.py -k snapshot passed with 3 passed / 56 deselected.
  • Final full suite PYTHONPATH=src python3 -m pytest -q passed with 611 passed.
  • Final .venv/bin/conductor verify . passed.
  • Final .venv/bin/conductor verify --json . | python3 -m json.tool returned ok: true with empty errors/warnings.
  • Final git diff --check passed.

Decisions

  • DS-13a intentionally does not implement DS-13b transport abstraction or DS-13c mobile UI.
  • Snapshot usage is a canonical UsageSnapshot projection of the DS-9 usage estimate; provider-specific DS-9 quota details remain on /api/usage.
  • Supervisor owns true smoke with curl /api/snapshot against the live board.

DS-13b - SnapshotTransport export boundary

actor: codex-cli status: implemented pending supervisor review branch: codex/ds13b-transport commit: unstaged-by-task-contract

Summary

Implemented .conductor/tasks/ds13b-task-card.md in place:

  • Added conductor.transport.snapshot_transport as a DS-13 output/export transport boundary, separate from the DS-11b Agent Report JSONL input Transport.
  • Added SnapshotTransport.export(snapshot) -> ExportResult and export_snapshot(snapshot, transport) so callers can pass any compatible transport and keep the canonical snapshot collector transport-agnostic.
  • Added LocalHttpTransport(port) returning the existing http://127.0.0.1:<port>/api/snapshot location only. It does not open a port, bind LAN, bind 0.0.0.0, add auth, manage Tailscale, or add server behavior.
  • Added CloudPushTransport as interface-only. export() raises NotImplementedError; the class has no outbound network, HTTP client, credential, auth, cloud, hosted, WebSocket, or mobile writeback implementation.
  • Kept src/conductor/decision_api.py and core snapshot collection unaware of conductor.transport.
  • Added docs/reference/snapshot-transport.md and linked it from docs/reference/decision-board-api.md.

Verification

  • RED .venv/bin/python -m pytest -q tests/test_snapshot_transport.py first failed because conductor.transport did not exist.
  • Focused GREEN: PYTHONPATH=src python3 -m pytest -q tests/test_snapshot_transport.py passed with 4 passed.
  • .venv/bin/python -m pytest -q tests/test_snapshot_transport.py -k 'local_http_transport or cloud_push_transport or decision_api_does_not' passed with 3 passed / 1 deselected; the full snapshot fixture cannot run in .venv because this stale environment is missing pydantic.
  • Network-code guard: rg -n "requests|urllib|http\\.client|socket|aiohttp|urlopen|fetch|post\\(|put\\(" src/conductor/transport/snapshot_transport.py returned no matches.
  • Full available suite: PYTHONPATH=src python3 -m pytest -q passed with 615 passed.
  • Documented .venv full pytest: .venv/bin/python -m pytest -q remains blocked by the existing missing pydantic dependency in .venv during collection of canonical-model tests.
  • .venv/bin/conductor verify . passed.
  • .venv/bin/conductor verify --json . | python3 -m json.tool returned ok: true with empty errors/warnings.
  • git diff --check passed.

Decisions

  • DS-13b stops at the transport boundary. It does not implement DS-13c mobile UI, cloud push, auth, hosted relay, WebSocket, LAN bind, or bidirectional control.
  • The local transport returns an endpoint location for the already-running localhost board; it is not a server launcher.