Skip to content

Board: correct existing-data truth and hierarchy - #957

Draft
jeffhuber wants to merge 3 commits into
mainfrom
claude/947-board-existing-truth
Draft

Board: correct existing-data truth and hierarchy#957
jeffhuber wants to merge 3 commits into
mainfrom
claude/947-board-existing-truth

Conversation

@jeffhuber

@jeffhuber jeffhuber commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

The Board can overstate existing evidence: missing measurements look like zero, unknown states can look healthy, repeated reasons inflate owner work, old campaigns look live, and a successful gate publisher can be mistaken for the gate verdict. This presentation-only change groups work by PR, assigns routine work to builder/orchestrator lanes, reserves owner attention for explicit owner evidence, and labels missing, stale, cached, and publisher-only data accurately.

The current-work summary, Owner Queue, and Lane Work now precede aggregate history. Campaign deadlines contribute liveness only while a provider is awaiting a response, so terminal cards retain their actual result and styling. The renderer uses only the existing /api/status payload; it adds no API, cloud, lifecycle, session-resolution, or Slack fields.

Closes #947

Builder: Code Mower Claude (claude-opus-5, named session Code Mower Claude #947)
Reviewer: Code Mower Codex exact-head merge-authority audit

Validation:

  • python -m unittest tests.test_board.BoardPresentationTruthTests — 23 passed
  • related Board, lease, campaign, qualification, diagnostics, productivity, lane-status, and release-hygiene suites — 1,013 passed
  • full repository suite on the implementation head before the final narrow truth fixes — 3,005 passed, 11 skipped
  • final merge head contains Devin PR Devin: one optional setup and readiness path for local CLI and hosted v3 #940 mainline; 543 Board/lease/campaign tests pass after that clean merge
  • ruff check .
  • python -m compileall -q src scripts
  • python scripts/privacy_scan.py
  • git diff --check origin/main...HEAD

This PR remains draft and unmerged while the v1.4.2 release stays ordered after Devin release #912 and Graphify release #915 under #945.

Presentation-only change against the existing /api/status payload. No
schema, payload, or cloud projection field is added or changed.

- Put the current-work summary (Work Now), the owner queue, and lane work
  before aggregate productivity and release history.
- Group owner-queue entries by PR into one work item with grouped reasons,
  one primary responsible role, and one next action.
- Classify rebase, CI repair, audit fixes, and re-review as builder or
  orchestrator work; reserve owner attention for PRs carrying explicit
  permission, budget, policy, product-decision, or owner-request labels.
- Render unmeasured time, cost, quality, and productivity values as "not
  recorded" instead of coercing them to zero, and stop unknown or
  unavailable states from rendering green or as pass.
- Separate the gate publisher from the code-mower/gate commit status so a
  green publisher run cannot pass a pending verdict. The publisher is an
  allowlist of the canonical "Code Mower gate" workflow and its "publish
  Code Mower gate status" job, so an unrelated check such as security-gate
  stays an ordinary check.
- Report observation age for replayed, aged, GitHub-unavailable, and
  server-cache-unconfirmed snapshots, showing the older of the observation
  time and board.cache.age_seconds. A snapshot with no parseable
  observation time is reported neutrally with no live claim and no
  synthetic age. Show a running campaign with no unexpired provider
  response deadline as last reported rather than currently running.
- Keep GitHub data useful when local session inputs are absent and name
  which local data is unavailable.

Refs #947

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jeffhuber jeffhuber added builder:claude Code Mower generated label needs-codex-audit labels Sep 12, 2026
@jeffhuber

Copy link
Copy Markdown
Contributor Author

Codex audit (merge-authority lane)

Head SHA: 41cfb82011ec795ec8d49dfa57e5d78c37c3d195
Findings: P0=0, P1=0, P2=1, P3=0 (blocker policy: any P0/P1/P2 → BLOCKED)

Codex Audit: BLOCKED

Summary:

The deadline logic incorrectly warns on terminal provider results and overrides failure styling. All 20 presentation-truth tests pass but do not cover terminal cards retaining expired deadlines.

Findings:

  • [P2] Apply overdue warnings only to nonterminal provider cards -- /private/var/folders/f2/g9zqfdjx7z3ckcsx_f46htwm0000gn/T/codex-audit-ek9se4qb/wt/src/code_mower/board.py:1592
    Finding ID: codex:044b8d66dadb5a1987a8
    Completed and blocked providers can retain response_deadline_at: the Devin result-handling path in release_campaigns.py sets their terminal state without clearing the deadline. Once that deadline passes, this helper marks successful cards as overdue and changes blocked cards from red to yellow, even though their response has already arrived. Restrict overdue presentation to providers still awaiting a response and preserve terminal-state styling.

Addresses Codex audit finding codex:044b8d66dadb5a1987a8 on 41cfb82.

A provider card can retain the response_deadline_at it was dispatched
with after its response arrives. cardLiveness() marked any passed
deadline overdue, so a terminal `complete` card warned yellow and a
terminal `blocked` card was downgraded from red to yellow.

Read the deadline only while a card is still awaiting a response. Of the
five valid provider states in release_campaigns, `complete` and `blocked`
are its TERMINAL_EVIDENCE_STATES and `unavailable` never dispatched, so
only `queued` and `running` await one. Terminal and never-dispatched
cards keep their own state styling and show no overdue warning.

Campaign-level liveness now requires an awaiting card with an unexpired
deadline, so an unexpired deadline retained by a finished card cannot
verify a running campaign.

Refs #947

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jeffhuber

Copy link
Copy Markdown
Contributor Author

Codex audit (merge-authority lane)

Head SHA: 3c72bc38ffc8d5098b091167c8d0014a7f3d5460
Findings: P0=0, P1=0, P2=0, P3=0 (blocker policy: any P0/P1/P2 → BLOCKED)

Codex Audit: PASS

Summary:

No actionable regressions were identified. Full test verification was limited by the read-only sandbox and socket restrictions.

Findings: none.

@jeffhuber

Copy link
Copy Markdown
Contributor Author

Codex audit (merge-authority lane)

Head SHA: 1eb74c54277a2c3be2f9afe1e907fc36450eebc2
Findings: P0=0, P1=0, P2=0, P3=0 (blocker policy: any P0/P1/P2 → BLOCKED)

Codex Audit: PASS

Summary:

No actionable regressions were identified. All 23 presentation-truth tests passed.

Findings: none.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

builder:claude Code Mower generated label codex-audit-done

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Board: correct existing-data truth, hierarchy, and attention semantics

1 participant