Skip to content

Revert Harden Playwright cache restore behavior (#132) - #151

Merged
BigSimmo merged 1 commit into
mainfrom
revert-pr-132
Jul 2, 2026
Merged

Revert Harden Playwright cache restore behavior (#132)#151
BigSimmo merged 1 commit into
mainfrom
revert-pr-132

Conversation

@BigSimmo

@BigSimmo BigSimmo commented Jul 2, 2026

Copy link
Copy Markdown
Owner

This reverts commit 1ce9e40 from #132 because CI did not pass after the merge.

@BigSimmo
BigSimmo enabled auto-merge (squash) July 2, 2026 09:23
@BigSimmo
BigSimmo merged commit 276c843 into main Jul 2, 2026
3 checks passed
@BigSimmo
BigSimmo deleted the revert-pr-132 branch July 2, 2026 16:31
BigSimmo added a commit that referenced this pull request Jul 30, 2026
Main resolved #148 via #1491 and moved it to the archive table, so its side of
the open-items hunk was empty. Resolution keeps main's archival and re-adds only
#149, #150 and #151; the next-id marker stays at 152, which is the value this
branch allocated and is still above main's highest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
Re-lands the rows that were reverted out of this PR earlier, now that
auto-merge is off and there is no merge race to lose them to. Recording them
here makes them durable: they were otherwise held only in an ephemeral
session and in pre-revert commits that the squash-merge would make
unreachable.

  #149 task  — adopt a consolidated answer-home notice block. The hero stacks
               three notices in three type sizes with two opposing shield
               icons, and the least important reads loudest. Adoption moves
               PrivacyInputNotice, the single site-wide APP-5 line, across the
               answer, documents and calculators composers, so it needs a full
               clinical governance preflight rather than a design review.
  #150 issue — answer mode ships no verify-before-use caveat while
               differentials, prescribing, specifiers and calculators all do.
               Stands independently of any redesign.
  #151 issue — verify:pr-local exits 0 when guard-next-build refuses to run,
               reporting green with the production build never executed.

Ids allocated above main's current highest (#148); the marker moves to 152.
The three cross-references between the rows were updated to match.

check:outstanding-issues: 149 rows (60 open, 89 archived), unique ids,
next-id=152 above the highest, no merge driver.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
main landed its own #133 fix, which strips the Prettier column padding from
the issues ledger. That reformats every row, so the whole table conflicted
rather than just the rows anyone edited — the last and largest instance of
exactly the problem #133 exists to end.

Resolved by taking main's unpadded table wholesale and re-emitting this
branch's three captured rows in the same format (#149 adopt a consolidated
answer-home notice block, #150 answer mode ships no verify-before-use caveat,
#151 verify:pr-local exits 0 when its build step refuses to run). Taking one
side wholesale is safe here only because this branch's sole contribution to
the file is those three rows; main's own rows are unmodified.

check:outstanding-issues: 149 rows (59 open, 90 archived), unique ids,
next-id=152 above the highest, no merge driver, no ids deleted from base
00ddb22 — main's new #148 gate confirming nothing was dropped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
BigSimmo added a commit that referenced this pull request Jul 30, 2026
#150 — the four at-risk worktrees were snapshotted onto their own already-merged
branches (748ef018f, 5dbd9f965, b7eae51a4, d949859c3), so the work survives a
worktree reclaim. All four are clean now. None is pushed or reviewed; the next
action is per-snapshot promote-or-reset.

#151 — the never-pushed branch is superseded rather than salvageable: its script
and hook reached main by other routes, so the fail-open guard was applied to
main's committed hook in PR #1494 instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
BigSimmo added a commit that referenced this pull request Jul 30, 2026
 edits

Another session reconciled the same three rows while this one snapshotted the
worktrees. Resolution keeps this side for #149 and #150 (theirs carried no
snapshot SHAs) and unions #151: their PR #1442 provenance plus the correction
that the archived #143 row implied the fail-open was durable when only the hook
and script had landed, kept alongside this side's redirect to PR #1494.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
BigSimmo added a commit that referenced this pull request Jul 30, 2026
…rktree (#1494)

* fix(hooks): fail open when the inventory script is absent from the worktree

core.hooksPath is an absolute path to the primary checkout, so this hook runs
from every linked worktree - including ones whose branch predates the sync
tooling and so does not contain scripts/update-docs-inventory.mjs. Those commits
aborted with MODULE_NOT_FOUND before the author could do anything about it,
which is ledger row #151 (originally #143).

The inventory task now drops itself when its script is missing, removes
docs/scripts-index.md from docs_to_check, and re-checks the all-tasks-empty
early exit. That re-check matters: an empty docs_to_check makes the trailing
`git diff --name-only --` match every modified file in the tree and fail the
commit for unrelated reasons. The grep carries `|| true` because it exits 1 when
it filters everything out, which `set -e` would treat as a hook failure.

Verified in an isolated repository with the script genuinely absent - not merely
deleted from the working tree, which the mixed-inputs guard catches first: the
hook prints "skipping inventory sync" and the commit succeeds. With the script
present the new block is a no-op, so the normal path is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(hooks): reject staged inventory generator removal

* docs: record pre-commit hook review

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
Fourth ledger id collision on this branch: main allocated #149
(check:installed-lock-parity only compares seven top-level packages) and #150
(CodeRabbit reviewed none of a full day's PRs) while this branch held
#149-#151 for the answer-home notice capture.

main's rows are kept and the incoming rows renumber per the ledger's own
rule: #151 adopt a consolidated answer-home notice block, #152 answer mode
ships no verify-before-use caveat, #153 verify:pr-local exits 0 when its
build step refuses to run. Their three cross-references and the marker (154)
follow.

check:outstanding-issues: 151 rows (58 open, 93 archived), unique ids,
next-id=154 above the highest, no ids deleted from base 4312a21.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
BigSimmo added a commit that referenced this pull request Jul 30, 2026
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
BigSimmo added a commit that referenced this pull request Jul 30, 2026
…closed (#1508)

PR #1490 was closed unmerged, so none of its content reached main. Confirmed by
content rather than id: main's #149 and #150 are unrelated rows (installed-lock
parity and CodeRabbit rate limits) that happened to take those ids, so an
id-presence check reported them as landed when they were not.

- #151 corrects the earlier claim that CI is unreadable. The PAT lacks Checks:
  read but has Actions: read, so workflow runs are queryable; the endpoint that
  looked authoritative returns an empty result rather than an error, which is
  what made it read as a hard wall.
- #152 re-lands the at-risk worktree inventory together with the four
  preservation snapshots taken on 2026-07-31, which existed in no other record.
- #153 archives the pre-commit fail-open as resolved by PR #1494.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
BigSimmo pushed a commit that referenced this pull request Jul 30, 2026
#151 was written before the word-only pass existed, so it referenced only
/mockups/warning-consolidation and recommended 02 + 01. A memory row that
lags the work is the failure mode this ledger exists to prevent, so it now
also records:

  - /mockups/warning-line, the words-only study (six variants A-F), with the
    line counts measured from the rendered DOM rather than asserted
  - the constraint that matters: nothing fits one line on a 390px phone while
    the pinned APP-5 sentence stays verbatim, because 45 characters of
    obligation plus the 27-character link exceeds the ~60 available at 11px
  - D as that study's recommendation, and why F fits better but needs the
    same privacy sign-off as #152 plus a tests/privacy-ui.test.ts update
  - that PR #1437 was closed unmerged as a deliberate pause during an
    owner-authorized ordered merge sweep, with the branch preserved

Evidence and the original diagnosis are left intact; this extends the Detail
and Next rather than rewriting the row.

check:outstanding-issues: 151 rows (53 open, 98 archived), unique ids,
next-id=154 above the highest, no ids deleted from base db50738.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
BigSimmo added a commit that referenced this pull request Jul 31, 2026
* issues: capture the unreadable-CI token, at-risk worktree work, and the unpushed hook fix

Three findings from the 2026-07-30 organisation session that were recorded
nowhere durable:

- #149 the session GitHub PAT lacks Checks: Read, so no agent can confirm a PR
  is green. The endpoint that does work returns an empty result rather than an
  error, so it reads like an absence of checks rather than an absence of
  permission.
- #150 four worktrees on already-merged branches hold uncommitted work that
  exists in no branch and no PR, the largest being +395/-200 across 19 files
  including CI config.
- #151 the pre-commit fail-open for #143 lives only on a never-pushed local
  branch, which is also 17 behind main and conflicts on the file whose count
  sentence main's new docs:update generator now owns.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(ledger): record the session-followup capture review for PR #1490

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(ledger): record #143/#151/#149 reconciliation for PR #1490

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs(ledger): supersede PR #1490 reconciliation after remote sync

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* issues: record the worktree snapshots and redirect #151 to PR #1494

#150 — the four at-risk worktrees were snapshotted onto their own already-merged
branches (748ef018f, 5dbd9f965, b7eae51a4, d949859c3), so the work survives a
worktree reclaim. All four are clean now. None is pushed or reviewed; the next
action is per-snapshot promote-or-reset.

#151 — the never-pushed branch is superseded rather than salvageable: its script
and hook reached main by other routes, so the fail-open guard was applied to
main's committed hook in PR #1494 instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: remove credential metadata and correct audit dates

* docs: consolidate session follow-up findings

* docs: record consolidated follow-up review

* issues: record that #101 hydration shipped

PR #1463 merged as dba7356, so #86's "Next X3 unit — rag-hydration.ts" is
now stale. The row records the extraction as shipped and keeps the corrected
boundary: hydration re-homed only two of prepareCoverageGateResults's five
rag.ts-only dependencies, so it did not unblock that function — exactly as the
Codex review on PR #1461 predicted.

This row was deliberately dropped from #1463 itself (commit 6290d02) after
docs/outstanding-issues.md conflicted on five consecutive main syncs. Recording
it separately here is the same pattern used for #1454 via #1461.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGEBHp4Seoh1jK1vGTNtYS

* docs(ledger): record the landed X3 hydration review

Appended with npm run ledger:append (never hand-written), keyed to the squash
commit dba7356 so ledger:lookup can resolve it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGEBHp4Seoh1jK1vGTNtYS

* docs: fix the #101 mislabel and key the ledger row to a resolvable ref

Both defects were raised by Codex on PR #1495 and both are real; verified
against the files before accepting.

1. #101 is NOT this extraction. docs/outstanding-issues.md:138 shows #101 is
   "Canary-gated retrieval parallelisation candidates" (P3, rec) — a separate,
   still-open recommendation gated on a live canary pair. Calling the hydration
   extraction "#101" marked that unrelated work as shipped and could have caused
   the live-evaluation work to be skipped. The label came from the original task
   brief and was propagated without checking it against the ledger. Both the
   #86 row and the X3 work-order entry now identify the change as the X3
   hydration unit (PR #1463) instead. #101's own row is untouched and still open.

2. The ledger row did not resolve. `npm run ledger:lookup --
   dba7356` returned NOT REVIEWED, because the
   ref cell held only the slash-form branch token and that branch no longer
   resolves locally, so the throttling record could not prevent a repeat review.
   Appended a superseding record keyed to the landed SHA; the same lookup now
   returns ALREADY REVIEWED. The original row is retained, per the ledger's
   append-only rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGEBHp4Seoh1jK1vGTNtYS

* docs: record consolidated PR reviews

* docs: record ingestion recovery review

* docs(visual): document the platform-scoped baseline layout and how to seed it

`playwright.visual.config.ts` records snapshots under
`__screenshots__/{platform}/`, so a baseline taken on Windows lands in `win32/`
and is never consulted by the `ubuntu-24.04` CI job, which reads `linux/`.
Nothing said so, and committing `win32/` images looks like protection while
providing none.

Records the constraint, names the CI artifact as the supported recorder for
`linux/` baselines, and notes that comparison stays advisory until the jobs come
off `continue-on-error`. Also creates the tracked directory `.gitignore` already
claims exists, which sets `ui_changed=true` (`scripts/ci-change-scope.mjs`) so
the visual job can run and produce that first artifact.

No baselines are added here — they cannot be produced on this platform.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: correct visual baseline adoption steps

* docs: record visual baseline guidance review

* fix(ui): repair mockup accent token references

* docs: record token-reference repair review

* docs: archive advisory UI scoping task

* docs: record advisory UI closure review

* issues: archive #151 after #1494 and mark #143 fully resolved

PR #1494 landed the fail-open guard on main, so close the open salvage
row and update the #143 archive from PARTIAL to resolved across #1442
and #1494. Also carries the merge of origin/main that cleared the
GitHub DIRTY mergeability state.

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs(ledger): record PR #1490 main-sync and #151 closeout

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs(ledger): record #1496 id-collision renumber for PR #1490

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* issues: record the withdrawn live-region finding as #151 so it is not re-filed

Archive-only row. There is no defect and no work to do — the row exists purely
as a guard rail against repeating a misreading that already happened once.

search-results-header-band.tsx sets aria-live={faulted ? "off" : "polite"} on
its count/status span, which reads like a silenced failure announcement. It is
not: the band mounts a separate fault panel with role="alert" carrying the
failure title, body and Retry, and the mute is deliberate so the two do not both
speak. The reasoning is in a comment directly above the attribute, and
tests/search-results-header-band.dom.test.tsx pins it with singular role queries
that throw on duplicates.

During session 2026-07-30 (PR #1481) this was filed as a real P2 defect on the
strength of the attribute alone, and the proposed fix — escalating the count span
to role="alert"/aria-live="assertive" — would have produced a duplicate
announcement and a red test, making it worse than no change. Codex caught it.
An earlier withdrawal row was then lost to the squash that merged #1481, which
is the row-deletion shape #148 now guards against.

Also records that the mockup's escalation is correct in the mockup and must not
be ported: search-refine-adaptive-mockups.tsx has no fault panel, so there the
count span is the only announcement channel.

#148 needed no work — the merge-base deletion check landed on main
independently, and its output now reports the base it compared against.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JdPa3mHCX5ZQZZvU5GHU3r

* docs(rag): record refuted lexical probe collapse (#98)

* issues: capture the residual id-allocation hazard as #151

#133 is resolved: #1444 removed merge=union and #1479 excluded the ledger from
Prettier, which together fixed conflict frequency. Neither changes id
allocation, which is still read-modify-write against the next-id marker, so
concurrent branches still claim the same number.

Measured on PR #1451: one row was renumbered #135 -> #141 -> #145 -> #147 ->
#149 across four sync cycles. The sharper finding is that GitHub's Update-branch
button resolved one such collision into duplicate #141 rows with the marker left
below main's highest id — git reported success and only
check:outstanding-issues caught it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(issues): attribute the mobile CLS breach — a 128px reserve round trip

#147 asked which elements shift. Driving Chromium against the same
offline production build with a PerformanceObserver on layout-shift
(Lighthouse mobile emulation, reading entry.sources[].node) gives one
dominant cause on all four breaching routes: the entire main content
region moves down 128px and straight back up 128px within 15-60ms. Both
moves score, so it is pure cost with zero net movement — 100% of
/documents/search's 0.220 and about 75% of /dsm's.

The shifting element is the max-sm:pt-[var(--phone-overlay-chrome-h)]
wrapper around <main>. A MutationObserver timeline on the root style
attribute pins the mechanism rather than inferring it: the property goes
CSS seed -> 200px -> 72px, and the 200px is written when the header
stack ALREADY measures 72px (t=1552ms reserve=200px stack=72, corrected
at t=1612ms). usePhoneOverlayChromeReserve reads stack.offsetHeight
while the stack is transiently tall, publishes a value that is stale by
the time it lands, and its ResizeObserver then corrects it.

The CSS seed at globals.css:375 is correct for the settled stack, which
corrects the mechanism recorded on the now-archived #130 — that framed
the defect as the seed under-reserving by 0-8px. Measured, the driver is
a 128px transient over-reserve written by the hook, not the seed. / is
the control: it never writes the property and is the one clean route.

Variance is stated rather than smoothed: /dsm measured 0.363 and 0.219
across two runs, and this harness has no network throttling so /forms
and /therapy-compass run high locally. Only /dsm, /documents/search and
/ reproduced the live dispatch exactly.

Also recorded: attaching a MutationObserver to document.documentElement
inside a Playwright addInitScript throws before the document element
exists, silently killing the CLS observer and reporting a uniform
CLS=0.000 — a false clean bill that voided one run of this harness.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01361jh3eYVjJCzXWjAhdZiF

* docs(ledger): record the #151 capture review for PR #1506

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(review): clarify snapshot branch state

* docs(ledger): record PR #1490 main sync after snapshot wording

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs: archive rendered style contract task

* docs: record style contract closure review

* docs: record synced style contract review

* docs: record post-121 style closure review

* docs: normalize style review ledger after sync

* docs: record post-1490 style closure review

* docs: record consolidated PR 1490 review

* docs: record replacement consolidation review

* docs: record reconciled consolidation review

* docs: record post-1511 consolidation review

* docs: normalize PR 1510 ledger after main sync

* docs: record PR 1510 post-sync review

* docs: correct false #98 canary evidence and NOTES triage

Remove the incorrect probe-collapse canary attribution from #98 and
point the unread --med-accent-soft note at #157 without breaking the
seven-token TOKENS_MISSING accounting.

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs(ledger): record PR #1510 evidence-correction review

Supersede the prior approve-with-no-findings row after correcting the
false #98 canary attribution and NOTES triage drift.

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs: keep concurrency note inside issue table

* docs: record post-1513 consolidation review

* docs: address CodeRabbit notes on PR #1510

Fix the computed-value-time wording in design-sync notes, give #33 a
unique recommended-queue order, and drop the duplicated #98 Done block.

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

* docs(ledger): record PR #1510 CodeRabbit fix review

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
BigSimmo added a commit that referenced this pull request Jul 31, 2026
BigSimmo pushed a commit that referenced this pull request Jul 31, 2026
Three conflicts, resolved by evidence rather than by side-preference.

scripts/ensure-codex-cloud-git-remote.mjs and tests/codex-cloud-setup.test.ts:
took main's version. The branch carried its own fix for the same defect
(5aa3d6c, judging origin safety from the configured remote URL) on top of
main's #1497, so neither side was obviously newer. main's version introduces a
configuredOriginUrl() helper, already covers the url.*.insteadOf case the
branch's extra test was written for, and passes 12/12 locally — verified
before choosing, since taking a side wholesale is only safe when the other
side's content is genuinely subsumed. This also clears the two
codex-cloud-setup failures this branch has carried all session.

docs/outstanding-issues.md: fifth id collision on this branch. main has since
claimed #151-#153 — the exact ids these rows previously held — and now runs to
#164. main's rows are kept and the follow-ups renumber to #165 (adopt a
consolidated answer-home notice block), #166 (answer mode ships no
verify-before-use caveat) and #167 (verify:pr-local exits 0 when its build
step refuses to run), with their three cross-references and the marker (168)
following.

check:outstanding-issues: 165 rows (50 open, 115 archived), unique ids,
next-id=168 above the highest, no ids deleted from base 23465d5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Copilot AI added a commit that referenced this pull request Aug 12, 2026
- Make #150 decision bot-agnostic: covers CodeRabbit spending-cap AND
  Codex quota/limit notices; neither counts as reviewer coverage
- Extend #151 CI observation procedure to query job-level PR required
  aggregate (GET /actions/runs/{id}/jobs) and require conclusion:success
  on the PR required job, not just workflow-run conclusion
- Add CI observation fallback section to docs/codex-review-protocol.md
  so the durable #151 rule lives in the required operational doc (#187)
- Update outstanding-issues.md #151 resolution to point to both docs"

Co-authored-by: BigSimmo <87357024+BigSimmo@users.noreply.github.com>
BigSimmo pushed a commit that referenced this pull request Aug 13, 2026
… writer (#313)

Re-prioritising is the mutation triage performs most often, and it was the one
mutation the ledger tooling could not express. AGENTS.md and the ledger both
require mutating rows only through the writer — precisely because hand-authored
rows produced the width, escaping and wrong-table failures the writer exists to
stop — so every demotion had to take the forbidden path.

  npm run issues:update -- '#151' --pri P3

The gap turned out to be three layers deep, and each one looked fine while the
others were broken:

  1. scripts/outstanding-issues.mjs — updateIssue's editable map had no `pri`
     entry, so the Pri cell was unreachable.
  2. scripts/ledger-inbox.mjs createRequest — the update payload was built from
     summary/detail/source only, so even once updateIssue accepted pri, the CLI
     could not emit it.
  3. scripts/ledger-inbox.mjs validateRequest — required one of
     summary/detail/source, so a pri-only request was rejected before it reached
     either of the above. A re-prioritisation with no prose change is a
     legitimate triage edit and now counts on its own.

Values are validated against the same P1/P2/P3 set `add` uses, at both the
request boundary and the writer, and rejected before the guarded write so a bad
value reports itself rather than surfacing as a gate refusal about a malformed
row. Deliberately per-row: no bulk re-prioritise mode, because a sweep that
moves many rows at once should be visible row by row in review.

Every assertion here was mutation-tested rather than merely observed passing.
Removing `pri` from the editable map makes the writer throw on a pri-only
request; dropping the createRequest passthrough makes the CLI reject it;
dropping it from the validator fails the inbox self-test. The writer's own
self-test additionally pins that ONLY the Pri cell moves — an off-by-one there
would write a priority over the ID or Type cell and still produce a
structurally valid row.

Verified end to end through the real CLI: `issues:update '#90' --pri P3` queues
a valid merge-safe request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuYJz8hauCsCdx8r4fXiZU
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant