Board: freeze provider-neutral observation contract - #956
Conversation
Claude audit (merge-authority lane)Head SHA: Claude Audit: PASS Summary: New, additive, self-contained board_observation contract module with a closed JSON-Schema, extensive validation logic, and 17 valid + 13 adversarial fixtures exercising the invariants (timestamp ordering, identity binding, freshness/staleness, primary-route determinism, measurement null-vs-zero semantics, privacy scrubbing of display labels). package_manifest.py change is purely additive. No correctness, security, or contract-violation blockers found. Findings: none. |
CODE_MOWER_BUILDER:codex
CODE_MOWER_BUILDER:codex
CODE_MOWER_BUILDER:codex
0feb5f9 to
28356d9
Compare
Code Mower Codex writer refreshRebased the existing branch onto exact v1.4.1 main New exact head: Compatibility updates after the rebase:
Writer validation on this head:
The PR remains draft. The historical audit does not apply to this head; fresh independent exact-head review, completing CI, and an authoritative gate pass remain required. |
Claude audit (merge-authority lane)Head SHA: Claude Audit: PASS Summary: New provider-neutral Board observation contract (board_observation.py + schema + fixtures + tests) is well-scoped, fails closed on malformed/adversarial input, and is backed by an extensive fixture-driven test suite that exercises the validation branches (identity binding, timestamp ordering, stale-live claims, measurement coverage, display-label privacy checks). No P0/P1/P2 correctness, security, or data-loss issues found. Findings:
|
|
Code Mower notice: previously audited head |
…de artifacts; refresh roadmap facts
- board_service_mode.py (docs/pypi-release.md section 15) now requires
payload["schema"] == "code_mower.boardServiceStatus.v1" and requires the
sole services row to be a dict before calling .get on it. Unrelated or
changed JSON, a wrong/missing schema, or a non-dict row now fails closed
instead of being silently accepted or raising AttributeError.
tests/test_release_hygiene.py's
test_runbook_board_service_mode_fails_closed_on_unclassifiable_status
gained wrong_schema, missing_schema, non_dict_row, and non_dict_payload
regression cases (and the passing cases now carry the schema field the
real CLI always emits).
- Step 17's upgrade rehearsal (docs/pypi-release.md) now targets headless
Linux: file hashing uses a small `$RELEASE_PYTHON`/hashlib script instead
of the macOS-only `shasum -a 256`. The v1.4.2 upgrade installs the exact
wheel step 9 already downloaded and digest-verified
(`$PYPI_DOWNLOAD_DIR/code_mower-1.4.2-py3-none-any.whl`), never a fresh
`code-mower==1.4.2` index re-resolution that could silently install a
different build than the one this runbook verified. The v1.4.1 side is
now explicitly downloaded and digest-bound the same way before install,
instead of installing whatever the index resolves at rehearsal time.
tests/test_release_v142.py's UpgradeRehearsalTests updated to match.
- Fixed the awkward inline-code line break in docs/v142-qualification.md
("serving == installed ==" split across a line from "1.4.2").
- Refreshed docs/current-state-and-roadmap.md's Board section: #956/#957
are merged, not drafts behind main; #961, #999, #1000, #1002, and #951's
#1003 are accepted on `main`; #951 itself stays open only for its bounded
hosted Devin canary, tracked separately from its merged code evidence.
The near-term roadmap list's Board bullet was updated the same way.
Verification (fresh venv, unittest's own exit code, no pipeline masking):
- `python -m unittest tests.test_release_v142` -> 16/16 passed, exit 0.
- `python -m unittest discover -s tests -p "test_release_v14*.py"` -> exit 1
overall, exactly one failure:
`test_release_v141.InstalledPromptPackTests.test_literal_starter_and_explicit_config_walkthrough`
(the byte-identical, untouched historical file's own copy of the sandbox
`/tmp` symlink issue, confirmed via `git diff HEAD:<path> <path>` -> no
output for that file, docs/v141-release-notes.md,
docs/v141-qualification.md, and docs/v140-release-runbook.md).
- `python -m unittest discover -s tests -p "test_release_hygiene.py"` ->
361/361 passed, exit 0.
- `ruff check .`, `scripts/privacy_scan.py`, `scripts/guard_package_workflows.py`,
and `python -m code_mower.migration release-readiness --json`
(status: pass) all clean on this commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Board needs one closed local read model for session and work activity before presentation or producer work can safely begin. This defines
code_mower.boardObservation.v1, with exact session/work/run and repository/worktree binding, the existing remote-session public lifecycle projection, per-source freshness and coverage, separate requested and observed evidence, deterministic next-actor routing, and explicit unavailable measurements.The offline fixtures cover assigned through merged work, waiting and failure paths, stale and unavailable sources, unlinked process observations, and a strictly covered no-work state. Adversarial cases fail closed on enum/field drift, cross-session or worktree joins, stale live claims, timestamp and head mismatches, unauthorized display labels, missing measurements serialized as zero, and oversized identifiers.
The branch is refreshed onto v1.4.1 main
d52bc68396397edfeae782d08a768386f89a00f2. Its session identity contract now uses the same 32-character hexadecimal identity accepted by the current-session resolver from #935, including identifiers beginning with a digit. The current committed package manifest includes the new module and schema.This PR adds no Board UI, lifecycle producer, Slack mapping, cloud event or field, network action, provider mutation, or lease mutation. The later #949 producer integration must reuse the accepted #935 resolver; this PR only freezes the provider-neutral local observation contract and offline truth fixtures.
Validation at exact head
28356d970f391c124927ff4fa64e6a3ca6ee98a2:board_observation.pyplus its schemaThe earlier independent audit and CI evidence belong only to historical head
0feb5f98374622956bbc71158c6a1147a0df253c. This refreshed head still requires a new independent exact-head audit, normal CI, and authoritativecode-mower/gatebefore merge.Closes #946