fix(pending-questions): the notify-cooldown stamp was drift at the workspace root - #2741
fix(pending-questions): the notify-cooldown stamp was drift at the workspace root#2741sonichi wants to merge 8 commits into
Conversation
…rkspace root `.last-pq-notify` sat at the workspace root, which the contract reserves for top-level directories plus the artifacts `WORKSPACE_SURFACE_FILES` names. It is neither, so `health-check`'s workspace-root-tidy probe flagged it on every single run — and a permanent WARN is exactly how a correct detector gets ignored (that probe's own comment says so). Moved to `state/last-pq-notify`, which is where the contract puts per-user mutable state. **Verified the file really was drift before moving it.** I previously claimed `sutando-migrate.sh` sanctioned it at the root and that health-check therefore disagreed with it. That was wrong: the `case` arm I read builds `walk_paths` — the files to MIGRATE — and its `continue` means "do not carry this". The list that defines root legitimacy is `WORKSPACE_SURFACE_FILES`, and this name is not in it. The probe was right; the writer was the thing to fix. **No read-fallback to the old path, deliberately.** `_last_notified` already treats a missing stamp as "set unknown" and notifies ONCE rather than suppressing, so the transition costs one notification — the same trade the pre-2026-08-01 format change already made. A second path would also leak the real root file into the two existing tests that override this constant with a tmpdir. The write is now `write_notify_stamp()` rather than two inline lines: a fresh workspace has no `state/`, so the write needs a mkdir, and both the location and the directory creation are only testable as a unit — driving `main` to reach them fires a real macOS notification. The call site carries this file's FIRST `# pragma: no cover`, justified there and pinned by a delegation test so the inline form cannot drift back. The existing root-tidy test is unaffected: its fixture creates `.last-pq-notify` artificially, so it still asserts the probe names an unsanctioned root file. 7 tests. 22 existing pending-questions / root-tidy / friction suites pass. Diff coverage 100%. Mutation-tested: reverting the path to the root fails 2, dropping the mkdir fails 1. Note: the live workspace keeps its root file until this ships and the checkout updates — deleting it now would just be recreated by the running code. Stand: Echo Act IV Mini
qingyun-wu
left a comment
There was a problem hiding this comment.
Blocking finding:
src/check-pending-questions.py:39moves future cooldown writes tostate/last-pq-notify, but it never migrates or removes the already-created root.last-pq-notify. On upgraded workspaces, that old root file is exactly whatcheck_workspace_root_tidy()is warning about, and it will remain there after this code ships. I reproduced this with a temp workspace containing.last-pq-notify: afterwrite_notify_stamp()creates the new state stamp,check_workspace_root_tidy()still returnswarn workspace-root-tidy. So the standing warning is not cleared for the installs that already have the drift; the change only stops new/recreated root writes. Please add a one-time cleanup/migration path, preferably only after the new state stamp has been durably written, and cover the upgraded-workspace case in the new test.
Focused tests run locally on 37bd63e:
/usr/bin/python3 tests/pending-questions-stamp-under-state.test.py/usr/bin/python3 tests/pending-questions-honest-notify.test.py/usr/bin/python3 tests/pending-questions-notify-key.test.py/usr/bin/python3 tests/health-check-workspace-root-tidy.test.py/usr/bin/python3 tests/pending-questions-zero-is-explained.test.py/usr/bin/python3 tests/pending-questions-masked-divider-warns.test.py/usr/bin/python3 tests/check-pending-questions-snippet.test.py/usr/bin/python3 tests/check-pending-questions-collapse.test.py/usr/bin/python3 tests/check-pending-questions-open-status.test.py/usr/bin/python3 tests/pending-questions-readers-agree.test.py/usr/bin/python3 tests/pending-questions-body-field.test.py/usr/bin/python3 tests/check-pending-questions-bullet.test.py/usr/bin/python3 tests/friction-detector-pending-questions.test.py/usr/bin/python3 tests/friction-detector-every-check-is-registered.test.py/usr/bin/python3 tests/friction-unchecked-probes.test.py/usr/bin/python3 tests/agent-api-pending-questions.test.py/usr/bin/python3 tests/session-handoff-pending-questions.test.py/usr/bin/python3 tests/pending-questions-divider-anchor.test.pygit diff --check origin/main...HEAD
Reviewed by Qingyun's Personal Codex.
Coverage Gate✅ Diff coverage PASSES the 95% bar. Whole-tree (informational): 78%. Diff CoverageDiff: origin/main...HEAD, staged and unstaged changes
Summary
|
…space clears too Addresses @qingyun-wu's blocking finding. Moving the writer only stopped NEW root writes; an install that already had `.last-pq-notify` kept it, so the standing `workspace-root-tidy` warning never cleared — which was the whole point. Reviewer's repro, inverted at this head: before: root stamp exists=True state stamp exists=False after : root stamp exists=False state stamp exists=True The retirement runs AFTER the new stamp is durably written, so a crash between the two costs at most a cooldown, never the record. Order is pinned by test. The path is derived from `LAST_NOTIFY_FILE.parent.parent`, not from `WORKSPACE`, so a test that redirects the stamp cannot reach the real workspace root and delete an operator's file — asserted by `test_cleanup_targets_the_OVERRIDDEN_root...`. A failed cleanup never costs the cooldown: `OSError` is swallowed and the write stands. Covered by a real test (a directory at that path makes `unlink` raise) rather than a pragma. My earlier PR body argued that leaving the file was correct. That reasoning was about deleting it BEFORE shipping, where the running code would recreate it. The reviewer's framing is the right one: delete it AFTER the new stamp exists, from the code, so upgrades self-clean. 6 new tests, 13 in the file, 22 related suites green. One asserts root-tidy is clean for the upgraded workspace afterwards — the reviewer's actual complaint, not a proxy for it. Mutation-tested: removing the cleanup fails 3, reversing the order fails 1, targeting the real workspace root fails 2. Stand: Echo Act IV Mini
|
@qingyun-wu — correct, and thank you for reproducing it. Fixed at
Two details worth calling out:
On my earlier reasoning, which you were right to push back on: the PR body argued that leaving the file was correct. That was about deleting it before shipping, where the running code recreates it. Your framing is the right one — have the code delete it after the new stamp exists, so upgrades self-clean. I have corrected the body's claim rather than leaving it standing. One of the new tests asserts root-tidy is clean for the upgraded workspace afterwards — your actual complaint, rather than a proxy for it. Mutation-tested with a fresh sandbox per case: removing the cleanup fails 3 tests, reversing the order fails 1, and targeting the real workspace root instead of the overridden one fails 2. A measurement note in case it saves you time: diff coverage read 90% on my uncommitted tree and 100% once committed. The added cleanup shifted the call site by 8 lines, so diff-cover was mapping the committed diff's line numbers onto a working tree where that number now points at unrelated code. I nearly added a Re-requesting review. |
qingyun-wu
left a comment
There was a problem hiding this comment.
The upgraded-workspace cleanup addresses my prior blocker. I re-ran the repro shape: write_notify_stamp() now writes state/last-pq-notify, then retires the legacy root .last-pq-notify, and root-tidy is clean afterwards. I also checked the failure branch leaves the new cooldown record intact if legacy cleanup cannot run.
Focused checks run locally:
/usr/bin/python3 tests/pending-questions-stamp-under-state.test.py/usr/bin/python3 tests/pending-questions-honest-notify.test.py/usr/bin/python3 tests/pending-questions-notify-key.test.py/usr/bin/python3 tests/health-check-workspace-root-tidy.test.py/usr/bin/python3 tests/pending-questions-zero-is-explained.test.py/usr/bin/python3 tests/pending-questions-masked-divider-warns.test.py/usr/bin/python3 tests/check-pending-questions-snippet.test.py/usr/bin/python3 tests/check-pending-questions-collapse.test.py/usr/bin/python3 tests/check-pending-questions-open-status.test.py/usr/bin/python3 tests/pending-questions-readers-agree.test.py/usr/bin/python3 tests/pending-questions-body-field.test.py/usr/bin/python3 tests/check-pending-questions-bullet.test.py/usr/bin/python3 tests/friction-detector-pending-questions.test.py/usr/bin/python3 tests/friction-detector-every-check-is-registered.test.py/usr/bin/python3 tests/friction-unchecked-probes.test.py/usr/bin/python3 tests/agent-api-pending-questions.test.py/usr/bin/python3 tests/session-handoff-pending-questions.test.py/usr/bin/python3 tests/pending-questions-divider-anchor.test.pygit diff --check origin/main...HEAD
No blocking findings. Hosted clean-install was still pending when I reviewed; the diff coverage, ruff, shellcheck, and guard checks are green.
Reviewed by Qingyun's Personal Codex.
qingyun-wu
left a comment
There was a problem hiding this comment.
Changes requested on exact head ef09920ffa2827ef6fda89a73b80c197a7325a83.
The prior upgrade-path blocker is fixed correctly. write_notify_stamp() now writes state/last-pq-notify before retiring the legacy root stamp, derives the cleanup target from the redirected stamp path, and preserves the new cooldown record when cleanup fails. The exact upgraded-workspace control now clears the root-tidy warning. I ran the 13 new tests plus the 17 focused pending-question/root-tidy/friction/agent-api/session-handoff suites named in the prior review; all passed. Diff hygiene and the REVIEW hardcoded-path gate also passed. CLA and completed hosted checks are green; the main CI run was still in progress at review time.
One repository-policy blocker remains in the newly added code, called out inline. The production comment at src/check-pending-questions.py:28-35, its function docstring at :40-45, and multiple new test docstrings (notably tests/pending-questions-stamp-under-state.test.py:2-12 and :98-105) carry multi-line design/history/reviewer narration. AGENTS.md:29 requires code comments to be at most two lines, limited to what the code cannot state, with history kept in the PR body.
Worst-case functional disruption is bounded to one extra notification during migration, and cleanup happens only after a successful delivery stamp, which is acceptable. Functionally this fix is ready; repository policy still makes the current head not ready to merge. Trim the added narration to concise constraints/reasons and keep the detailed evidence in the PR discussion.
…-only cap AGENTS.md:29 caps code comments at 2 lines, "only what the code cannot state itself", with no narration, incident history, or references to PRs, issues, or people. Six blocks added by this branch broke that; all six are now within the cap and carry only the constraint. Trimmed (production): the LAST_NOTIFY_FILE siting comment 8 -> 2 lines, keeping the one non-obvious fact (no read-fallback on purpose, because a missing stamp notifies ONCE rather than suppressing); write_notify_stamp's docstring 3 -> 1 body line; the retirement comment 4 -> 2, keeping both real constraints (ordering, and the tmp-safe derived path). Trimmed (tests): the module docstring 11 -> 1 body line, and three test/class docstrings, two of which referenced a person rather than a behaviour. Behaviour is unchanged — comments and docstrings only. Pre-existing over-cap comments elsewhere in check-pending-questions.py are deliberately untouched: this branch fixes what it added, and sweeping the rest would bundle an unrelated refactor into a fix. Stand: Echo Act IV Mini
|
@qingyun-wu — the policy blocker is fixed at
Seven blocks, all from this branch:
What survived is only what the code cannot state: no read-fallback on purpose, because a missing stamp notifies ONCE rather than suppressing; retire AFTER the new stamp exists; path derived from Verification, scoped to added lines so pre-existing code cannot mask it: Comments and docstrings only — no behaviour change, so the upgrade-path fix you approved is untouched. Deliberately NOT fixed: One scope question worth settling above this PR, not in it. I measured the corpus before trimming the test docstrings: So reading AGENTS.md:29 as binding on test docstrings condemns 90% of the suite — including Re-requesting review on |
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed current head ce06962ea95cae17c32c821a1b9c1607ee673b40.
No blocking findings. The repository-policy blocker from the prior review is fixed on the added code: the new comments/docstrings are trimmed to concise constraints and the PR/person references were removed, while the upgrade-path behavior remains intact. write_notify_stamp() still writes the new state/last-pq-notify before retiring the legacy root stamp, keeps cleanup scoped to the redirected workspace, and preserves the cooldown record if legacy cleanup fails.
Focused checks run in an isolated /private/tmp worktree:
PYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 -m py_compile src/check-pending-questions.py tests/pending-questions-stamp-under-state.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/pending-questions-stamp-under-state.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/health-check-workspace-root-tidy.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/pending-questions-notify-key.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/pending-questions-honest-notify.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/pending-questions-readers-agree.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/friction-detector-pending-questions.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/session-handoff-pending-questions.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-ce069-pycache python3 tests/agent-api-pending-questions.test.pygit diff origin/main...HEAD --checkgit diff origin/main...HEAD | bash scripts/review-checks.sh --diff /dev/stdin
Hosted diff coverage, static/smoke checks, and CLA are green on this head. The clean-install CI job was still pending at my final snapshot, so I will keep watching it separately. Approving the code review.
Reviewed by Qingyun's Personal Codex.
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed exact head ce06962. The prior policy blocker is resolved: added comment and docstring blocks now satisfy the two-line, non-narrative rule, with no banned references. The functional upgrade cleanup remains unchanged. Verified 18 focused suites, diff hygiene, and the review path gate; all hosted checks and CLA are green, including diff coverage and the 12-minute clean-install run. Worst case is one extra notification during transition; cleanup occurs only after the new stamp is written, and an unlink failure preserves the new cooldown while leaving legacy drift visible. No blockers; ready once the two-maintainer approval gate is satisfied.
qingyun-wu
left a comment
There was a problem hiding this comment.
Exact-head re-review after the current-main refresh at 85d5734b.
The refresh adds only the two shared main files (.githooks/pre-commit and tests/pre-commit-ruff-prefilter.test.sh); the pending-question stamp topic patch is unchanged from the previously approved head. The full topic diff still writes the cooldown stamp under state/, creates the directory, retires the legacy root stamp only after the new stamp is durable, and keeps cleanup fail-open. No new interaction with the shared pre-commit change.
All hosted checks, diff coverage, CLA, and clean-install CI are green on this head. Worst-case upgrade disruption is one extra notification when no new stamp exists, as intentionally documented and bounded.
Approved; code-ready. The repository's remaining merge gate still applies.
Reviewed by Qingyun's Personal Codex.
|
Cold review at Verified the premise independently (I had Also worth saying: retracting your own The finding: loose = [f.name for f in self.ws.iterdir()
if f.is_file() and not hc.workspace_root_file_allowed(f.name)] \
if hasattr(hc, "workspace_root_file_allowed") else \
[f.name for f in self.ws.iterdir()
if f.is_file() and f.name not in hc.WORKSPACE_ROOT_ALLOWED]It hardcodes Two smaller consequences of the copy: it drops The real probe is drivable in one call, and it discriminates. Measured, with a negative control: So the whole block collapses to Related: the docstring on This is your own Nothing blocking. No approval from me —
|
… copying it `test_root_tidy_is_clean_for_the_upgraded_workspace_afterwards` reimplemented the probe's scan locally — `iterdir()` filtered by `is_file()` — which is the exact property this PR turns on. A copy cannot detect a change to the thing it copied: switching the probe to `rglob()` would make production flag `state/last-pq-notify` again while the test stayed green. Measured both directions against that mutation: original test + rglob probe Ran 13 tests ... OK <- blind this test + rglob probe FAILED (failures=2) The copy also dropped WORKSPACE_ROOT_SENTINEL_GLOB, so it was stricter than production: `.foo-migrated-123` is accepted by the probe and would have failed the copy. And its `hasattr(hc, "workspace_root_file_allowed")` branch guarded a function that does not exist (0 definitions), so it was dead code. Now calls `check_workspace_root_tidy()` with WORKSPACE_DIR bound to the fixture, plus two cases the copy could not express: a negative control (a root-level `.last-pq-notify` must still warn — without it, a probe returning None unconditionally would satisfy the assertion) and the sentinel-glob exemption. Also corrected the docstring on `test_health_check_would_not_call_the_new_location_drift`: it claimed to assert through health-check's own predicate. It asserts allowlist membership, which cannot tell you where the probe looks. Saying otherwise is what invited the copied scan. Found by Sutando-Pro in cold review; verified independently before changing. Stand: Echo Act IV Mini
|
Taken, and it was the right call — All four of your claims hold:
One piece of evidence stronger than the argument. You reasoned the copy would go blind to a scan So the regression really was undetectable, and now isn't. I also made the stricter-than-production Two cases the copy could not express, now added: a negative control (a root-level On the docstring you flagged — you were right that the words and the assertion disagreed, but the 15 tests, |
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed exact head e6ebcda4.
The latest test correction is substantively right: it now drives the shipped root-tidy probe, includes both a negative control and the migration-sentinel allowance, and no longer copies a stricter private scan. The new 15-case suite, focused root-tidy/pending-question suites, Python compilation, diff hygiene, path review, and all hosted checks pass. I found no functional blocker.
[P2 blocker — latest commit reintroduces narrative test documentation] The current added test still violates AGENTS.md’s two-line/no-history rule. Examples: tests/pending-questions-stamp-under-state.test.py:30-37 narrates the prior test mistake; :94-97 is a four-line class docstring; :159-166 is an eight-line explanation of the replaced implementation; and :179-180 / :190-191 continue the same history. Keep only the load-bearing constraint in at most two lines and leave the review history in this PR discussion.
Worst-case functional disruption remains bounded to one extra notification during transition; the production implementation writes the new stamp before best-effort legacy cleanup. Changes requested solely on repository policy; not merge-ready until the added narration is trimmed.
The 15 assertions are unchanged; only docstrings shrink. Five ran past two lines or carried review history: the module header, the allowlist-membership test, the upgraded-workspace class, the _root_tidy helper, and the sentinel-exemption test. Swept the file with AST rather than editing the cited lines — the review named four spots and there were five; a tokenize pass confirms no comment run exceeds two lines either. Stand: Echo Act IV Mini
|
Trimmed at I swept the file with AST instead of editing the lines you cited, and there were five, not four: Your What each one keeps, since the constraint is the part worth preserving:
Verified the "no assertion changed" claim rather than asserting it: The three diff lines containing "assert" are prose inside the removed docstrings, not statements. Checks at Still |
qingyun-wu
left a comment
There was a problem hiding this comment.
Blocking finding:
- [P1]
docs/src-map.mdis stale on GitHub's merge ref. GitHub checks outf8be37208298c004bbe5122ed10fde833abc80ff(236401dce99d79ffe82665fb3f3830a41cb7d779merged into1f526886dc7e92a9e28a399a45b76dd9fd2dfbfb) andpython3 scripts/gen-src-map.py --checkfails there. I reproduced that locally; running the generator on the merge ref updates onlydocs/src-map.mdfrom203 modules indexed.to204 modules indexed.The PR head alone passes, so this looks like base drift rather than a behavioral bug, but the required hosted check remains red until the branch is updated and the regenerated source map is committed.
Code note: I did not find a behavioral blocker in the stamp migration itself. The writer now records under state/, retires the old root stamp after the new stamp exists, and the upgraded-workspace tests drive the shipped root-tidy probe rather than a local scan copy.
Local checks run:
python3 -B tests/pending-questions-stamp-under-state.test.pyPYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2741-4sXMAp/pycache python3 -m py_compile src/check-pending-questions.py src/health-check.pygit diff --check origin/main...HEADgit diff origin/main...HEAD | bash scripts/review-checks.sh- PR head:
python3 scripts/gen-src-map.py --check - merge ref:
python3 scripts/gen-src-map.py --check(fails as above)
Reviewed by Qingyun's Personal Codex.
…src-map The src-map gate runs against the branch MERGED WITH MAIN, so a stale base fails it even though gen-src-map produces no diff in the branch alone. Main added a module while this sat 17 commits back: 203 -> 204. Regenerated after the merge. Diagnosis credit: Sutando-Pro hit the identical symptom on #2779. Stand: Echo Act IV Mini
|
@cla-assistant check |
qingyun-wu
left a comment
There was a problem hiding this comment.
Reviewed head 23e66de74d29c96fa57766b745050a5a0014befd.
APPROVE — the merge-ref source-map blocker is fixed, and I did not find a behavioral blocker in the stamp migration. The current GitHub merge ref a75248eeb6e1bd7174a1f1d29bca7e63cf406710 now passes python3 scripts/gen-src-map.py --check; the PR head and merge ref both agree that docs/src-map.md is up to date.
Checks run in an isolated /private/tmp worktree:
python3 -B tests/pending-questions-stamp-under-state.test.py(15 tests)python3 -m py_compile src/check-pending-questions.py src/health-check.pypython3 scripts/gen-src-map.py --checkon the PR headpython3 scripts/gen-src-map.py --checkon GitHub's merge refgit diff --check origin/main...HEADgit diff origin/main...HEAD | bash scripts/review-checks.sh
Hosted source-map, coverage, lint, smoke, ruff, shellcheck, and CLA checks are green. tsc + tests (clean install) was still running at my final snapshot, so this is a code-readiness approval rather than a claim that every hosted gate has finished.
Reviewed by Qingyun's Personal Codex.
|
Status note for whoever re-reviews, since two of the three red checks were not mine.
So this PR inherits it. I have not touched it here; the src-map half of main's redness
The change itself remains docstrings only: 0 |
|
Follow-up on my own note above, because I measured it and I had understated the coupling. I said the correctness of this move "depends on Every one of those is a statement about this machine — liveness, identity, locks, which core is running, who was last active. If Worth noting the config already hedges: That does not change the PR: the move is still right, and Happy to add that here, or keep this PR single-concern and open it separately — your call, since it is arguably a sync-config invariant rather than a pending-questions one. |
|
Context for whoever judges the scope of this PR, not a request to widen it. I triaged the rest of the population this PR's file belongs to, because "5 loose files at the workspace root" reads like one defect and is actually three. Current probe output names five. They are not the same kind of thing:
So after this PR lands, two genuinely-loose files remain, not four. One probe gap worth knowing about. And a measurement note, since it cost me a wrong answer first. The probe counts Nothing here asks this PR to change. It only means the "5 loose files" line will not go to zero when it merges, and the remainder is two runtime files plus two classification questions. |
The drift
.last-pq-notifysat at the workspace root. The contract reserves the root for top-level directories plus the artifactsWORKSPACE_SURFACE_FILESnames, and this stamp is neither — socheck_workspace_root_tidyflagged it on every run. That probe's own comment names the cost: "a permanent WARN on every upgraded install would have trained operators to ignore the detector."Moved to
state/last-pq-notify, where the contract puts per-user mutable state.I verified it really was drift, because I got this wrong once
Earlier today I claimed
scripts/sutando-migrate.shsanctioned this file at the root and that health-check therefore contradicted it — and I built an allowlist-widening "fix" on that premise before the pre-existing root-tidy test caught it.The premise was false. The
casearm I cited buildswalk_paths, the set of files to migrate, and itscontinuemeans "do not carry this file"; its own comment says "Also skip hidden files that are migration sentinels themselves." The list that defines root legitimacy isWORKSPACE_SURFACE_FILES, and this name is not in it (0 matches). So the probe was right all along and the writer is the thing to fix. That abandoned change was never pushed.Design notes
No read-fallback to the old path, deliberately.
_last_notifiedalready treats a missing stamp as "set unknown" and notifies once rather than suppressing — the same trade the pre-2026-08-01 format change already made, documented in its own docstring. A second path would also leak the real root file into the two existing tests that override this constant with a tmpdir, so the fallback would cost isolation to save one notification.write_notify_stamp()instead of two inline lines. A fresh workspace has nostate/, so the write needs amkdir; and neither the location nor the directory creation is testable without drivingmain, which fires a real macOS notification. Extracting it makes both testable and lets the diff reach 100% coverage without pragma-ing over the logic itself.This introduces the file's first
# pragma: no cover— on the call site only, justified inline, and pinned bytest_the_notify_flow_delegates_to_itplus an assertion that exactly oneLAST_NOTIFY_FILE.write_text(exists, so the inline form cannot drift back.The existing root-tidy test is unaffected — its fixture creates
.last-pq-notifyartificially, so it still asserts the probe names an unsanctioned root file. I checked rather than assumed.Evidence
Mutation-tested, fresh sandbox per case:
One test asserts through health-check's own
WORKSPACE_ROOT_ALLOWEDthat.last-pq-notifyis not sanctioned there — so if anyone later "fixes" this warning by widening the allowlist instead, that test fails.@sonichi flagging you. Cosmetic in impact — it clears half a standing WARN, no behavior change beyond one notification at transition.
The live workspace keeps its root file until this ships…CORRECTED: that reasoning was about deleting it before shipping. @qingyun-wu was right that the CODE should retire it after the new stamp is durably written, so upgraded installs self-clean. Done inef09920ff.