chore(lane): stop tracking lane publication text - #4531
Merged
Conversation
.lane/ is per-worktree publication text the harvest reads from the checkout; tracked on master, every merged lane rewrote it and every other open lane conflicted on it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YGi8wLWGR2HYBh8p8fXFXz
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Sinity
added a commit
that referenced
this pull request
Sep 3, 2026
…re (#4583) ## Summary Eighteen Codex review findings verified against `cc58ef3e6` and re-confirmed by behavior at this branch's base. Eleven are prose or operation-description corrections; seven are code defects, each with a test naming the mutation that reddens it. ## Findings and disposition Every finding held at HEAD. None were refuted. ### Docs and config | # | PR | Location | Claim | Change | | --- | --- | --- | --- | --- | | 1 | #4456 | `docs/verification-authority.md:17` | "do not claim ... recorded run evidence" is unqualified, but `run_tests.py:533` and `verify.py:585` both call `append_verify_history` | Says what foreground runs do record, and that the disclaimer is about AgentCTL | | 2 | #4456 | `docs/internals.md:1002` | "The member row is the durable, complete inventory" is singular; the same step writes one row per candidate | Member rows, plural | | 3 | #4458 | `docs/internals.md:1247` | Owner list named `verified_blob_receipts`/`blob_publication_reservations`, omitted `material_observations` and `history_sidecars` | Restated from `BLOB_OWNERS` (`storage/blob_liveness.py`), whose docstring excludes receipt caches | | 4 | #4458 | `docs/sidecars.md:11` | `content_hash` claimed to bind sidecar bytes to a primary revision; `source.py:924-931` has no FK or raw-id column | Describes the 32-byte blob hash and the `blob_refs` `sidecar` edge that is the only ownership link | | 5 | #4458 | `docs/sidecars.md` | `.lane/` row documents harvest/coordinator mechanics in a product doc | Row removed. `.lane/` untracked by #4531, `.gitignore:120`, zero tracked files | | 6 | #4458 | `docs/internals.md:1251` | Retention said to delete references only; `cleanup_superseded_raw_snapshots(dry_run=False)` calls `unlink_unreferenced_blob_hashes_under_exclusion` and returns deleted blob counts | Retention's immediate unlink stated; integrity repair and hook-payload replacement remain reference-only | | 7 | #4458 | `docs/sidecars.md:9` | Antigravity metadata said to live with the vendor tree only; `origin_specs.py:1470-1477` routes it `parse_policy="raw-only"` | Durable raw admission documented | | 8 | #4503 | `docs/repo-layout.md:17` | `.coderabbit.yaml` listed in the complete tracked root inventory; file deleted | Row removed | | 9 | #4515 | `docs/hermes-operators.md:528` | Smoke overrides HOME/XDG but not the five `POLYLOGUE_*` roots that outrank them | `env -u` for all five | | 10 | #4571 | `CLAUDE.md:151` | Verb list claims twelve and names ten | `status` and `bench` named. `COMMAND_SPECS` yields exactly twelve top-level verbs | | 11 | #4504 | `.agentctl/project.toml:226` | Description hides the timed fail-open merge | Discloses the `merge-answered` path and the 30-minute `REVIEW_ABSENT_GRACE_SECONDS` fail-open | ### Code **12 — `.config/wt.toml:8`.** The substituted worktree path was unquoted inside the command substitution, so a path containing a space handed `readlink` two operands and `--python` a fragment. **13 — `.config/wt.toml:14`.** `cp -f` of a live testmon datafile can copy a partial transaction and leaves the source's `-wal` behind, so the committed tail the copy depends on is missing. Replaced by `devtools.testmon_provision --seed`, which snapshots through SQLite's backup API and leaves nothing behind on failure. **14 — `polylogue/sources/sqlite_snapshot.py:20`.** `_SQLITE_SIDECAR_SUFFIXES` omitted `-journal` while `daemon/backup.py`, `migration_runner.py` and `audit_leaf.py` all include it. A database in the default journal mode writes `-journal`, so `sqlite_database_for_sidecar` returned `None` for it and the watcher could not attribute the event to its database. **15 — `capture_jobs.py` update digest.** `retention` joined the request digest in #4574, after update receipts were already durable. A retry/TTL-only request replayed against a receipt written before that recomputed a different digest and hit `request_id_conflict`. The pre-upgrade digest shape is now an accepted match for requests that carry no retention; a retention-bearing request has no legacy shape and still conflicts. **16 — `capture_jobs.py` retention states.** No client sends a retention object, so every job held the creation default forever and `gc()` collected nothing. A terminal retry state now retires a job that no client has spoken for: state `active` -> `eligible`, with `timeline_authoritative` derived from whether the job actually holds conversation-bearing events. A job whose retention a client declared is left alone. **17 — `capture_job_events.py` paging.** The page was read ascending from the oldest event with no cursor, so on any job with more than one page of events the newest fell out — and the timeline projection is defined most-recent-first, so it never saw them. The page is now selected newest-first and returned in receiver order, with a `before_revision` cursor and `next_before_revision` for walking older. **18 — `capture_jobs.py` checkpoint.** Nothing posted to `/v1/capture-jobs/{id}/events`, and the only automatic event (`created`) carries empty refs, which the projection predicate excludes — so `timelines` was empty for every production job. The checkpoint route, which the extension does call, now appends a `capture-attempted` event without advancing the job revision. ## Verification ``` devtools verify --quick # exit 0, zero "out of sync" devtools render all --check # exit 0, zero "out of sync" devtools test tests/unit/browser_capture -n 2 # 176 passed devtools test tests/unit/devtools/test_worktree_hooks.py \ tests/unit/devtools/test_testmon_provision.py \ tests/unit/sources/test_sqlite_sidecars.py \ tests/unit/sources/test_live_watcher.py -n 2 # 141 passed ``` Ten tests added; each docstring names its anti-vacuity condition — remove `-journal` from the suffix tuple, swap `backup()` for `shutil.copyfile`, drop the inner quotes in `wt.toml`, delete the legacy-digest branch, return `current` from `_retention_after_retry`, delete the checkpoint `_append_event` call, or restore ascending `ORDER BY event_revision LIMIT`. Selected scope only; no full-corpus run. Three api/mcp tests are red on master itself (`test_archive_tiers_api_session_costs_read_index_tier`, `test_existing_same_version_ops_database_receives_additive_call_log`, `test_record_context_delivery_requires_initialized_user_tier`) — inherited, untouched here. ## Residual risk Finding 18's fallback ref is `intent:<intent_key>` when a checkpoint payload names no conversation. That key is an intent, not a conversation, in a conversation-keyed map; the alternative is the empty projection the finding reports. Worth a follow-up if checkpoint payloads should carry conversation refs directly. Finding 17 changes the default page from oldest-first to newest-first, and `has_more` is now cursor-derived rather than `total > limit`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01YGi8wLWGR2HYBh8p8fXFXz --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
.lane/body.mdand.lane/titleleave the index;.gitignorealready lists.lane/.Problem
Every merged lane PR rewrote the two tracked files, so every other open lane branch conflicted with master on them (#4509 rebased four times tonight, #4513/#4515/#4516/#4520/#4522 all cycled through the rebase reaction for this alone). The harvest reads the publication text from the worktree, not from the commit.
Solution
Untrack the two files. Lane branches that still carry them conflict once more (delete versus modify) and then never again.
Verification
Residual risk
A lane that force-adds
.lane/reintroduces the churn for itself only.🤖 Generated with Claude Code
https://claude.ai/code/session_01YGi8wLWGR2HYBh8p8fXFXz
Receipt: session-01YGi8wLWGR2HYBh8p8fXFXz