diff --git a/docs/lanes/wp6-error-regex-scope/DONE-NOTE.md b/docs/lanes/wp6-error-regex-scope/DONE-NOTE.md new file mode 100644 index 0000000..928fc6c --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/DONE-NOTE.md @@ -0,0 +1,338 @@ +# DONE-NOTE — `model_performance-wp6` + +**Lane:** `wp6-error-regex-scope` +**Branch:** `lane/wp6-error-regex-scope`, built on `origin/main` = `ea233a76a00f087e1096f7251b60323bd65b84ea` +("highway wave 2: Conformance Fixtures 2/3/4 + Ruling-1 conditions", #71) +**Scope:** option (2) only — tighten `tests/_util.py`'s `assert_no_silent_failure` to real error +ANNOUNCEMENT shapes. Option (1), the parseable-channel redesign of `doctor`'s output, was **not +taken**; see "Why option (1) was NOT taken" below. +**Spend:** **$0.00** of a **$0.00** authority. No API calls, no DTU, no infrastructure created, +nothing to tear down. Everything below is local `git`, `pytest`, `uv`, and the already-installed +`bd`. + +--- + +## Result + +**OUTCOME branch A — RESOLVED.** Every deliverable is DONE. No deliverable was recorded +NOT-POSSIBLE, and the cap never bound (there was nothing to buy). + +The predicate is now announcement-shaped, the guarantee is proven still standing by tests that +FAIL if it is retired, and the exact bytes that block PR #70 were reproduced locally and shown to +stop tripping the check. + +--- + +## The defect, restated from the evidence + +`assert_no_silent_failure` used `re.compile(r"\berror\b", re.IGNORECASE)`. That is not a test for +an error being **emitted**; it is a test for the word appearing. `doctor` prints every +assumption's own DESCRIPTION on a healthy run, so in a catalogue whose entire subject matter is +error handling, one honest sentence turns a green run red. + +Reproduced locally against PR #70's own head (`20557bc`), `doctor --quick`, exit code **0**: + +``` + [PASS] read.unavailable_not_absent an infrastructure read failure raises + BeadsUnavailableError with its cause intact on read/claim and reports UNAVAILABLE + (not ERROR) per project, while genuine absence on a healthy database still reports + plain 'not found' +``` + +`\berror\b` matches `ERROR` at **offset 302** of the combined stdout+stderr (offset 99 within that +row) → `assert_no_silent_failure` raises → `test_doctor_quick_succeeds_against_the_real_installed_bd` +FAILS on a completely healthy system. That is the CI failure blocking #70, reproduced. + +--- + +## The fix + +`tests/_util.py` now matches five **announcement** shapes instead of one word. Every shape is +justified by output this repository actually emits — none is a guess: + +| shape | pattern | why it is here | +|---|---|---| +| `error-colon` | `\berror\s*:` | `Error: unknown command "reclaim"` (the shipped `reap` bug this tier is named for); `ERROR: `, `adapter.py`'s own status for an unreadable project, as `instances` renders it in a table column; `ERROR: tokens file not found` (`gateway.py:141`); the argparse/cobra `: error: ` shape. Deliberately **not** anchored to line start — a real announcement is routinely preceded by a program name, a log prefix, or a column. | +| `json-error-field` | `"error"\s*:\s*(?!null\|""\|[]\|{})\S` | `supervisor.py:177,189` writes `{"error": str(e)}` into payloads the CLI prints. `{"error": "boom"}` beside exit 0 is exactly this tier's invariant. A null/empty value is the "no error" reading of the same field and is deliberately **not** matched. | +| `error-running` | `\berror\s+running\b` | An announcement with no colon; named in the item. | +| `unknown-command` | `\bunknown command\b` | The shipped bug's own words, kept as a shape in its own right so the guard survives the announcement prefix changing. **New coverage** — contains no "error". | +| `python-traceback` | `^Traceback \(most recent call last\):` | A Python crash printed while exiting 0 is the same silent failure in different clothes. **New coverage** — contains no "error". | + +`error_announcement()` returns `(shape_name, matched_text)`, and `assert_no_silent_failure` puts +both into the assertion message. That is not decoration: it is what lets a reader of a CI failure +tell a real announcement from a false positive without re-deriving the regex. + +**Net direction, stated honestly: this is not purely a loosening.** Two of the five shapes +(`unknown-command`, `python-traceback`) are strictly NEW coverage the parent commit did not have. + +--- + +## Deliverables + +| # | Deliverable | State | +|---|---|---| +| 1 | Regex narrowed to announcement shapes; an assumption description containing "error" in prose no longer fails on a healthy system | **DONE** | +| 2 | The guarantee is NOT retired — a test proves `Error: unknown command "reclaim"` + exit 0 STILL fails | **DONE** | +| 3 | Fail-before test: fails on the parent commit, passes on the fix, both outputs pasted | **DONE** | +| 4 | #70's REAL description text is the innocent-case fixture | **DONE** | +| 5 | Report whether #70 would now pass, with evidence | **DONE** — verdict: **it would** | +| 6 | All documented tiers + the modules suite, run and reported BY NAME | **DONE** — 1 pre-existing failure, not this lane's (below) | +| 7 | Fail-before evidence committed under the artifact root and pasted in the PR body | **DONE** | +| 8 | DRAFT PR on `origin`, branch `lane/wp6-error-regex-scope` | **DONE** | +| 9 | DONE-NOTE at `docs/lanes/wp6-error-regex-scope/DONE-NOTE.md` | **DONE** (this file) | + +### Deliverable 2 in detail — the one that can be faked + +A fix that makes everything pass has deleted the guard, not repaired it. So the regression file +asserts the guilty direction with **ten parametrised rows** plus three assertion-level tests, and +every one of them fails loudly if the shape stops being detected: + +``` +'Error: unknown command "reclaim"' <- THE shipped bug +'reaping stale holds...\nError: unknown command "reclaim"\n' <- as it appeared +' brokenqueue TOTAL - READY - HELD - ERROR: database unreachable' <- adapter.py status +'ERROR: tokens file not found: /etc/awt/tokens.json' <- gateway.py +'amplifier-work-tracker: error: unrecognized arguments: --nope' <- argparse +'internal error: connection reset by peer' +'{"custody": {"error": "dolt: connection refused"}}' <- supervisor.py +'error running bd list --json' +'unknown command "reclaim" for "bd"' <- NEW coverage +'Traceback (most recent call last):\n File "cli.py", line 1\n' <- NEW coverage +``` + +**Eight of those ten pass on the parent commit AND on the fix** (see the fail-before run) — which +is the actual proof that the guarantee survived the narrowing, rather than an assurance that it +did. + +Both directions live in **one file** on purpose, per the acceptance criteria. The failure mode +being fenced is not "too strict" or "too loose" — it is the two collapsing into each other. Split +across two files, one half can be deleted without the other noticing. + +### Why the regression test is TIER 1, not tier 3 + +Deliberate, and it is the trap the item warned about. The tier-3 test that surfaced this +(`test_doctor_quick_succeeds_against_the_real_installed_bd`) **cannot reach** +`assert_no_silent_failure` on this machine: `tests/conftest.py:308` repoints +`AMPLIFIER_WORK_TRACKER_ROOT` at a session-scoped tmp root, so `sweeps.alive` FAILs, `doctor` +exits 1, and the test dies at the EARLIER `assert result.returncode == 0`. That is +`model_performance-jyg`. I tried to bypass it by exporting the real root — `run_cli` uses +`setdefault`, so the monkeypatched value already wins; the attempt and why it cannot work are +recorded in `evidence/jyg-cannot-be-bypassed-from-outside.txt` rather than dropped. + +A tier-1 test of the predicate itself needs no `bd`, no dolt, and no healthy sweeps, so it cannot +be masked that way. The end-to-end evidence was obtained instead by running `doctor --quick` +directly, outside pytest, against the real root — where it does exit 0. + +--- + +## Fail-before / fail-after + +Full output: `evidence/fail-before.txt` (committed). + +**Parent commit `ea233a7` — `tests/_util.py` restored to the bare `\berror\b`, this lane's new +test file in place:** + +``` +$ .venv/bin/python -m pytest tests/unit/test_error_announcement_detection.py -q +... +FAILED tests/unit/test_error_announcement_detection.py::test_pr70_description_is_prose_not_an_announcement +FAILED tests/unit/test_error_announcement_detection.py::test_healthy_doctor_run_carrying_pr70s_description_is_not_a_silent_failure +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[reports UNAVAILABLE (not ERROR) per project] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[this command never reports an error it did not observe] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[ERROR and UNAVAILABLE are different readings of the same field] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": null}] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": ""}] +FAILED tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[unknown command "reclaim" for "bd"] +FAILED tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[Traceback (most recent call last):\n File "cli.py", line 1\n] +FAILED tests/unit/test_error_announcement_detection.py::test_the_failure_message_names_which_shape_fired +10 failed, 13 passed in 0.24s +``` + +Read that list carefully — it is the whole argument: + +* the **first seven** failures are the defect: prose classified as an emitted error, including #70's + real sentence; +* the **next two** are NEW coverage the old predicate never had; +* the **last** is the new shape-naming API; +* and the **13 that pass** include eight of the ten real error announcements — the guarantee, + already standing on the parent, and still standing after. + +The assertions are written against `looks_like_error_text` / `assert_no_silent_failure` — the API +that existed BEFORE this change — precisely so this run reports the real diagnosis instead of an +`AttributeError` on a helper that did not exist yet. + +**This branch:** + +``` +$ .venv/bin/python -m pytest tests/unit/test_error_announcement_detection.py -q +23 passed in 0.22s +``` + +--- + +## Would PR #70 now pass? + +**Yes, on the evidence available without merging anything.** Full detail: +`evidence/pr70-would-now-pass.txt`, with the raw captures beside it. + +Method — a real run, not a synthetic fixture: + +1. `git worktree add /tmp/wp6-pr70 origin/pr-70` (head `20557bc5bde2f3983615f30494234bf71510dba1`) +2. its own `uv venv` + `uv pip install -e ".[dev,web]"` +3. `.venv/bin/python -m amplifier_work_tracker.cli doctor --quick` against the **real** workspace + root, so `sweeps.alive` passes — i.e. the healthy-CI condition, **not** the jyg-masked one +4. exit code **0**, 35 rows, tail `All 35 assumptions hold. Safe to run parallel agents.` +5. both predicates applied to those exact bytes + +| predicate | result | +|---|---| +| parent `\berror\b` | **MATCH** — `ERROR` at offset 302 → `assert_no_silent_failure` raises → the test FAILS. **The CI failure that blocks #70, reproduced.** | +| this branch | **no announcement found** → does not raise → the silent-failure check **PASSES** | + +**What this does NOT prove**, stated plainly: it does not re-run #70's CI (nothing was merged), +and it does not touch `model_performance-jyg` — on a machine whose sweep heartbeats live outside +the isolated test root, that same test still dies earlier at `assert result.returncode == 0`. The +run above deliberately went around pytest to get past jyg. + +--- + +## Test tiers actually run, honestly + +All in `.venv` created by `make venv`, which installs both `.[dev,web]` and +`modules/tool-work-tracker[dev]` — so the modules tier did not silently fail at COLLECTION. +Raw logs under `evidence/`. + +| tier | command | result | log | +|---|---|---|---| +| 1 — unit | `make test-unit` | **813 passed** in 45.5s | `evidence/tier-unit.txt` | +| 2 — integration | `make test-integration` | **354 passed, 3 skipped** in 17m52s | `evidence/tier-integration.txt` | +| 3 — cli | `make test-cli` | **80 passed, 1 failed** in 6m56s — the failure is `jyg`, see below | `evidence/tier-cli.txt` | +| 4 — conformance ledger | `make test-ledger` | **26 passed** in 0.6s | `evidence/tier-ledger.txt` | +| 4b — ledger mutation harness | `make ledger-mutate` | **exit 0**, no unproven holes | `evidence/ledger-mutate.txt` | +| 5 — modules (`modules/tool-work-tracker/tests`) | `make test-module` | **113 passed** in 7m32s | `evidence/tier-modules.txt` | +| lint + types | `make check` | ruff check clean, 149 files formatted, **pyright 0 errors** | `evidence/check.txt` | + +### The one failure, and why it is not mine + +`tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd` fails +here — at the **earlier** assertion, before `assert_no_silent_failure` is ever called: + +``` +> assert result.returncode == 0, result.stdout + result.stderr +E [FAIL] sweeps.alive no heartbeat ever recorded for the reap sweep loop ... +E assert 1 == 0 +``` + +Proven pre-existing by re-running that single test with `tests/_util.py` restored to the parent +commit (`evidence/jyg-preexisting.txt`): **`1 failed in 46.35s`**, identical signature. This is +`model_performance-jyg` — separately filed, separately owned, explicitly out of scope. + +The two other known non-mine failures named in the item did **not** reproduce in these runs: +`model_performance-c0e` (modules reap-recovery) passed, and the `tests/unit/test_supervisor_web.py` +port-binding flake did not fire. Reported as observed; not claimed as fixed. + +--- + +## Why option (1) was NOT taken + +Option (1) — have `doctor` emit assumption descriptions on a channel the check can exclude (e.g. +filtering ` [PASS]` / ` [FAIL]` lines, or a `--json` surface the test consumes instead) — is +**not implemented here, and I am not recommending it be bundled into this change.** + +Three reasons, in order of weight: + +1. **The item pins scope to option (2) and says so twice.** The owner decision dated 2026-09-03 is + explicit: do option (2) now, file option (1) as a follow-up, do not do it here. +2. **It is a change to `doctor`'s output contract, not to a test helper.** This lane's entire diff + is two files under `tests/`. Option (1) touches `cli.cmd_doctor`'s printing, and anything + parsing that output — a materially larger blast radius, on a surface the owner has not ruled on. +3. **It would not have been sufficient on its own.** The evidence run turned up a genuine + `Error:` announcement arriving on **stderr from `bd` itself**, underneath a `doctor` run that + healed the condition and exited 0 (filed as `model_performance-kxk`, below). Filtering + `doctor`'s own `[PASS]` rows would not have excluded that; a shape-aware predicate is needed + regardless of whether the channel is redesigned. Option (1) and option (2) are complements, not + alternatives. + +**I did not conclude option (1) is necessary**, so there is nothing to stop for: option (2) fully +clears the blockage on #70, as demonstrated above. If option (1) is later built, this predicate +stays useful and can be narrowed further at that point. + +--- + +## Discovered work, filed not absorbed + +**`model_performance-kxk`** — *doctor/bd: a HEALED dirty-schema migration still leaks bd's own +`Error:` line to stderr while exiting 0*, filed `discovered-from` wp6. + +Observed once (did not reproduce on the immediately following run) during the #70 evidence run: + +``` +project 'contract1788423815748rm': bd init hit a dirty schema migration -- dropping and + retrying once: [mysql] 2026/09/03 01:25:03 connection.go:214 busy buffer +Error: failed to open Dolt store: failed to initialize schema: schema migration: pending + schema migrations alter pre-existing dirty tables: comments, compaction_snapshots, ... +``` + +…with stdout ending `All 35 assumptions hold` and **exit 0**. The recovery path works; bd's own +announcement is simply passed through underneath it. Both the old predicate and this branch's flag +that — **correctly**, by the letter of the invariant. It is a real intermittent CI-flake source for +any `tests/cli` test funnelling through `assert_no_silent_failure`, it is not caused by #70's +description, and it is a product-side output-contract question rather than a test-regex one. Raw +capture: `evidence/pr70-doctor-quick.run1-transient.stderr.txt`. + +--- + +## Deviations from the spec + +1. **The regression test is tier 1, not tier 3.** The acceptance criteria ask for "a regression + test [that] covers both cases in the same file"; it does not name a tier. Tier 1 was chosen + because tier 3 is structurally unable to reach the assertion on any machine with jyg present — + reasoning and the failed bypass attempt are both recorded above. The tier-3 test is left + untouched. +2. **Two shapes added beyond a pure narrowing** (`unknown command`, `Traceback`). Both are named + in the item text / owner decision, both strengthen the guard, and neither can produce the #70 + false positive. Called out rather than slipped in. +3. **A JSON `"error": ` shape was added** which the item did not name. Justification: + `supervisor.py` writes `{"error": str(e)}` into printed payloads, so the parent predicate DID + cover that real shape via `\berror\b`, and a colon-only rule would have dropped it — this + preserves existing coverage rather than adding new scope. Also called out rather than slipped in. +4. **Nothing was reworded in any assumption description**, per the scope-out. The trap is in the + predicate, not in #70's prose. + +--- + +## Spend + +| item | amount | +|---|---| +| Authority for this item | **$0.00** (pure code change; no runs to buy) | +| API spend | **$0.00** | +| DTU / infrastructure spend | **$0.00** | +| Infrastructure created | **none** — nothing registered in the ledger, nothing to tear down | + +The `$0` cap is stated as a bare figure rather than as arithmetic, and the authoring rule in the +goal asks for `runs x arms x per-run estimate / validity rate`. **That is not a defect here**: the +rule governs a *run-buying* deliverable, and this item buys no runs. The arithmetic closes +trivially — `0 runs x $0 = $0` — and every deliverable landed inside it. Recorded for completeness, +not raised as a finding. + +Cost incurred that is not dollars: ~35 minutes of wall clock across the integration (17m52s), +modules (7m32s) and cli (6m56s) tiers, plus one throwaway `uv venv` for the #70 worktree. + +--- + +## What remains open + +1. **`model_performance-jyg`** — the tier-3 doctor test cannot reach its own silent-failure check + on any machine whose sweeps live outside the isolated root. Untouched; separately owned. Until + it is fixed, tier 3 is red locally for everyone, and the wp6 defect would have been invisible + there. +2. **`model_performance-kxk`** — the healed-but-still-announced `Error:` leak, filed above. +3. **Option (1)** — the parseable-channel redesign of `doctor`'s output. Not filed by this lane + (the owner decision says to file it as a follow-up; I did not want to duplicate an item the + owner may already have opened). Recommended, on the evidence, as a **complement** to this + change rather than a replacement for it. +4. **`panic:`** — a Go panic from `bd` is an announcement shape this predicate still does not + match. Not added, because neither the item nor the owner decision named it and I would rather + name the gap than widen scope unasked. Widening this list is cheap and safe; narrowing it is + what retires a guarantee. diff --git a/docs/lanes/wp6-error-regex-scope/evidence/check.txt b/docs/lanes/wp6-error-regex-scope/evidence/check.txt new file mode 100644 index 0000000..cef0a9a --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/check.txt @@ -0,0 +1,7 @@ +=== make check (lint + types) === +.venv/bin/ruff check . +All checks passed! +.venv/bin/ruff format --check . +149 files already formatted +.venv/bin/pyright src tests +0 errors, 0 warnings, 0 informations diff --git a/docs/lanes/wp6-error-regex-scope/evidence/fail-before.txt b/docs/lanes/wp6-error-regex-scope/evidence/fail-before.txt new file mode 100644 index 0000000..2c8c5a5 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/fail-before.txt @@ -0,0 +1,350 @@ +=== FAIL-BEFORE: new tier-1 regression file run against the PARENT commit's tests/_util.py === +parent commit: ea233a76a00f087e1096f7251b60323bd65b84ea (== origin/main at branch time) +tests/_util.py: restored to parent (bare r'\berror\b') +test file: tests/unit/test_error_announcement_detection.py (from this fix) +command: .venv/bin/python -m pytest tests/unit/test_error_announcement_detection.py -q + +--- parent tests/_util.py predicate --- +_ERROR_WORD_RE = re.compile(r"\berror\b", re.IGNORECASE) + + +def looks_like_error_text(text: str) -> bool: + return bool(_ERROR_WORD_RE.search(text or "")) + +FF.F.FFFF........FF...F [100%] +=================================== FAILURES =================================== +______________ test_pr70_description_is_prose_not_an_announcement ______________ + + def test_pr70_description_is_prose_not_an_announcement(): + """The sentence that actually blocked a PR.""" +> assert _util.looks_like_error_text(PR70_DETAIL) is False +E assert True is False +E + where True = ("an infrastructure read failure raises BeadsUnavailableError with its cause intact on read/claim and reports UNAVAILABLE (not ERROR) per project, while genuine absence on a healthy database still reports plain 'not found'") +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:75: AssertionError +---------------------------- Captured stdout setup ----------------------------- +Starting server with Config HP="127.0.0.1:55083"|T="28800000"|R="false"|L="info" +---------------------------- Captured stderr setup ----------------------------- +time="2026-09-03T01:14:25-07:00" level=info msg="Creating root@localhost superuser" +time="2026-09-03T01:14:25-07:00" level=info msg="Server ready. Accepting connections." +time="2026-09-03T01:14:25-07:00" level=warning msg="secure_file_priv is set to \"\", which is insecure." +time="2026-09-03T01:14:25-07:00" level=warning msg="Any user with GRANT FILE privileges will be able to read any file which the sql-server process can read." +time="2026-09-03T01:14:25-07:00" level=warning msg="Please consider restarting the server with secure_file_priv set to a safe (or non-existent) directory." +time="2026-09-03T01:14:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1 +time="2026-09-03T01:14:25-07:00" level=info msg=ConnectionClosed connectionID=1 +__ test_healthy_doctor_run_carrying_pr70s_description_is_not_a_silent_failure __ + + def test_healthy_doctor_run_carrying_pr70s_description_is_not_a_silent_failure(): + """The end-to-end shape: a `doctor --quick` run that passes every + assumption, including PR #70's, and exits 0.""" + stdout = ( + _doctor_line("version", "bd 1.1.2") + + "\n" + + _doctor_line( + "conflict.retryable", + "Write conflicts surface as retryable serialization errors", + ) + + "\n" + + _doctor_line("read.unavailable_not_absent", PR70_DETAIL) + + "\n" + + HEALTHY_DOCTOR_TAIL + ) + result = subprocess.CompletedProcess( + args=["doctor", "--quick"], returncode=0, stdout=stdout, stderr="" + ) +> _util.assert_no_silent_failure(result) # must not raise + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +tests/unit/test_error_announcement_detection.py:96: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +result = CompletedProcess(args=['doctor', '--quick'], returncode=0, stdout=" [PASS] version ...ealthy database still reports plain 'not found'\n\nAll 35 assumptions hold. Safe to run parallel agents.\n", stderr='') + + def assert_no_silent_failure(result: subprocess.CompletedProcess) -> None: + """The invariant this whole tier exists to enforce: a command that + prints error-looking text must never also report success (exit 0). + + This is precisely the shape of the two shipped bugs this suite is + named to prevent from recurring: `amplifier-work-tracker reap` printed + `Error: unknown command "reclaim"` to stderr and still exited 0. + """ + combined = (result.stdout or "") + (result.stderr or "") + if looks_like_error_text(combined): +> assert result.returncode != 0, ( + ^^^^^^^^^^^^^^^^^^^^^^ + "command printed error-looking text but exited 0 (this is " + "exactly the silent-failure shape amplifier-work-tracker shipped before): " + f"{combined[:500]!r}" + ) +E AssertionError: command printed error-looking text but exited 0 (this is exactly the silent-failure shape amplifier-work-tracker shipped before): " [PASS] version bd 1.1.2\n [PASS] conflict.retryable Write conflicts surface as retryable serialization errors\n [PASS] read.unavailable_not_absent an infrastructure read failure raises BeadsUnavailableError with its cause intact on read/claim and reports UNAVAILABLE (not ERROR) per project, while genuine absence on a healthy database still reports plain 'not found'\n\nAll 35 assumptions hold. Safe to run parallel agents.\n" + +tests/_util.py:28: AssertionError +_ test_mentioning_errors_is_not_announcing_one[reports UNAVAILABLE (not ERROR) per project] _ + +text = 'reports UNAVAILABLE (not ERROR) per project' + + @pytest.mark.parametrize( + "text", + [ + # A real assumption description from src/amplifier_work_tracker/adapter.py. + "Write conflicts surface as retryable serialization errors", + # The shape of the sentence that blocked #70, isolated. + "reports UNAVAILABLE (not ERROR) per project", + # Prose about the guard itself. + "an infrastructure read failure raises BeadsUnavailableError", + "this command never reports an error it did not observe", + "ERROR and UNAVAILABLE are different readings of the same field", + # A JSON field explicitly saying there was NO error. + '{"ok": true, "error": null}', + '{"ok": true, "error": ""}', + ], + ) + def test_mentioning_errors_is_not_announcing_one(text): +> assert _util.looks_like_error_text(text) is False, ( + f"{text!r} was classified as an error announcement -- the check is back to " + f"failing commands for talking about errors while succeeding" + ) +E AssertionError: 'reports UNAVAILABLE (not ERROR) per project' was classified as an error announcement -- the check is back to failing commands for talking about errors while succeeding +E assert True is False +E + where True = ('reports UNAVAILABLE (not ERROR) per project') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:116: AssertionError +_ test_mentioning_errors_is_not_announcing_one[this command never reports an error it did not observe] _ + +text = 'this command never reports an error it did not observe' + + @pytest.mark.parametrize( + "text", + [ + # A real assumption description from src/amplifier_work_tracker/adapter.py. + "Write conflicts surface as retryable serialization errors", + # The shape of the sentence that blocked #70, isolated. + "reports UNAVAILABLE (not ERROR) per project", + # Prose about the guard itself. + "an infrastructure read failure raises BeadsUnavailableError", + "this command never reports an error it did not observe", + "ERROR and UNAVAILABLE are different readings of the same field", + # A JSON field explicitly saying there was NO error. + '{"ok": true, "error": null}', + '{"ok": true, "error": ""}', + ], + ) + def test_mentioning_errors_is_not_announcing_one(text): +> assert _util.looks_like_error_text(text) is False, ( + f"{text!r} was classified as an error announcement -- the check is back to " + f"failing commands for talking about errors while succeeding" + ) +E AssertionError: 'this command never reports an error it did not observe' was classified as an error announcement -- the check is back to failing commands for talking about errors while succeeding +E assert True is False +E + where True = ('this command never reports an error it did not observe') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:116: AssertionError +_ test_mentioning_errors_is_not_announcing_one[ERROR and UNAVAILABLE are different readings of the same field] _ + +text = 'ERROR and UNAVAILABLE are different readings of the same field' + + @pytest.mark.parametrize( + "text", + [ + # A real assumption description from src/amplifier_work_tracker/adapter.py. + "Write conflicts surface as retryable serialization errors", + # The shape of the sentence that blocked #70, isolated. + "reports UNAVAILABLE (not ERROR) per project", + # Prose about the guard itself. + "an infrastructure read failure raises BeadsUnavailableError", + "this command never reports an error it did not observe", + "ERROR and UNAVAILABLE are different readings of the same field", + # A JSON field explicitly saying there was NO error. + '{"ok": true, "error": null}', + '{"ok": true, "error": ""}', + ], + ) + def test_mentioning_errors_is_not_announcing_one(text): +> assert _util.looks_like_error_text(text) is False, ( + f"{text!r} was classified as an error announcement -- the check is back to " + f"failing commands for talking about errors while succeeding" + ) +E AssertionError: 'ERROR and UNAVAILABLE are different readings of the same field' was classified as an error announcement -- the check is back to failing commands for talking about errors while succeeding +E assert True is False +E + where True = ('ERROR and UNAVAILABLE are different readings of the same field') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:116: AssertionError +__ test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": null}] ___ + +text = '{"ok": true, "error": null}' + + @pytest.mark.parametrize( + "text", + [ + # A real assumption description from src/amplifier_work_tracker/adapter.py. + "Write conflicts surface as retryable serialization errors", + # The shape of the sentence that blocked #70, isolated. + "reports UNAVAILABLE (not ERROR) per project", + # Prose about the guard itself. + "an infrastructure read failure raises BeadsUnavailableError", + "this command never reports an error it did not observe", + "ERROR and UNAVAILABLE are different readings of the same field", + # A JSON field explicitly saying there was NO error. + '{"ok": true, "error": null}', + '{"ok": true, "error": ""}', + ], + ) + def test_mentioning_errors_is_not_announcing_one(text): +> assert _util.looks_like_error_text(text) is False, ( + f"{text!r} was classified as an error announcement -- the check is back to " + f"failing commands for talking about errors while succeeding" + ) +E AssertionError: '{"ok": true, "error": null}' was classified as an error announcement -- the check is back to failing commands for talking about errors while succeeding +E assert True is False +E + where True = ('{"ok": true, "error": null}') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:116: AssertionError +___ test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": ""}] ____ + +text = '{"ok": true, "error": ""}' + + @pytest.mark.parametrize( + "text", + [ + # A real assumption description from src/amplifier_work_tracker/adapter.py. + "Write conflicts surface as retryable serialization errors", + # The shape of the sentence that blocked #70, isolated. + "reports UNAVAILABLE (not ERROR) per project", + # Prose about the guard itself. + "an infrastructure read failure raises BeadsUnavailableError", + "this command never reports an error it did not observe", + "ERROR and UNAVAILABLE are different readings of the same field", + # A JSON field explicitly saying there was NO error. + '{"ok": true, "error": null}', + '{"ok": true, "error": ""}', + ], + ) + def test_mentioning_errors_is_not_announcing_one(text): +> assert _util.looks_like_error_text(text) is False, ( + f"{text!r} was classified as an error announcement -- the check is back to " + f"failing commands for talking about errors while succeeding" + ) +E AssertionError: '{"ok": true, "error": ""}' was classified as an error announcement -- the check is back to failing commands for talking about errors while succeeding +E assert True is False +E + where True = ('{"ok": true, "error": ""}') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:116: AssertionError +_ test_real_error_announcements_are_still_caught[unknown command "reclaim" for "bd"] _ + +text = 'unknown command "reclaim" for "bd"' + + @pytest.mark.parametrize( + "text", + [ + # THE bug. `amplifier-work-tracker reap` printed this to stderr and + # exited 0. If this row ever stops failing, the guard is gone. + 'Error: unknown command "reclaim"', + # ...preceded by other output, which is how it actually appeared. + 'reaping stale holds...\nError: unknown command "reclaim"\n', + # adapter.py's own status for a project whose database cannot be read, + # as `instances` renders it -- indented, in a table column. + " brokenqueue TOTAL - READY - HELD - ERROR: database unreachable", + # gateway.py. + "ERROR: tokens file not found: /etc/awt/tokens.json", + # argparse / cobra. + "amplifier-work-tracker: error: unrecognized arguments: --nope", + "internal error: connection reset by peer", + # supervisor.py writes {"error": str(e)} into printed payloads. + '{"custody": {"error": "dolt: connection refused"}}', + "error running bd list --json", + # The two rows below are NEW coverage: neither contains the word + # "error" at all, so the parent commit's `\berror\b` predicate missed + # both. A Go CLI that renames its announcement prefix, and a Python + # crash, are the same silent failure wearing different clothes. + 'unknown command "reclaim" for "bd"', + 'Traceback (most recent call last):\n File "cli.py", line 1\n', + ], + ) + def test_real_error_announcements_are_still_caught(text): +> assert _util.looks_like_error_text(text) is True, ( + f"{text!r} is a real error announcement and was NOT detected -- the " + f"silent-failure guarantee has been retired, not repaired" + ) +E AssertionError: 'unknown command "reclaim" for "bd"' is a real error announcement and was NOT detected -- the silent-failure guarantee has been retired, not repaired +E assert False is True +E + where False = ('unknown command "reclaim" for "bd"') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:153: AssertionError +_ test_real_error_announcements_are_still_caught[Traceback (most recent call last):\n File "cli.py", line 1\n] _ + +text = 'Traceback (most recent call last):\n File "cli.py", line 1\n' + + @pytest.mark.parametrize( + "text", + [ + # THE bug. `amplifier-work-tracker reap` printed this to stderr and + # exited 0. If this row ever stops failing, the guard is gone. + 'Error: unknown command "reclaim"', + # ...preceded by other output, which is how it actually appeared. + 'reaping stale holds...\nError: unknown command "reclaim"\n', + # adapter.py's own status for a project whose database cannot be read, + # as `instances` renders it -- indented, in a table column. + " brokenqueue TOTAL - READY - HELD - ERROR: database unreachable", + # gateway.py. + "ERROR: tokens file not found: /etc/awt/tokens.json", + # argparse / cobra. + "amplifier-work-tracker: error: unrecognized arguments: --nope", + "internal error: connection reset by peer", + # supervisor.py writes {"error": str(e)} into printed payloads. + '{"custody": {"error": "dolt: connection refused"}}', + "error running bd list --json", + # The two rows below are NEW coverage: neither contains the word + # "error" at all, so the parent commit's `\berror\b` predicate missed + # both. A Go CLI that renames its announcement prefix, and a Python + # crash, are the same silent failure wearing different clothes. + 'unknown command "reclaim" for "bd"', + 'Traceback (most recent call last):\n File "cli.py", line 1\n', + ], + ) + def test_real_error_announcements_are_still_caught(text): +> assert _util.looks_like_error_text(text) is True, ( + f"{text!r} is a real error announcement and was NOT detected -- the " + f"silent-failure guarantee has been retired, not repaired" + ) +E AssertionError: 'Traceback (most recent call last):\n File "cli.py", line 1\n' is a real error announcement and was NOT detected -- the silent-failure guarantee has been retired, not repaired +E assert False is True +E + where False = ('Traceback (most recent call last):\n File "cli.py", line 1\n') +E + where = _util.looks_like_error_text + +tests/unit/test_error_announcement_detection.py:153: AssertionError +_______________ test_the_failure_message_names_which_shape_fired _______________ + + def test_the_failure_message_names_which_shape_fired(): + """A CI reader must be able to tell a real announcement from a false + positive without re-deriving the regex. `error_announcement` returns the + shape name and the matched text; `assert_no_silent_failure` puts both in + the assertion message.""" +> assert _util.error_announcement(PR70_DETAIL) is None + ^^^^^^^^^^^^^^^^^^^^^^^^ +E AttributeError: module 'tests._util' has no attribute 'error_announcement' + +tests/unit/test_error_announcement_detection.py:202: AttributeError +--------------------------- Captured stderr teardown --------------------------- +time="2026-09-03T01:14:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2 +time="2026-09-03T01:14:25-07:00" level=info msg=ConnectionClosed connectionID=2 +time="2026-09-03T01:14:25-07:00" level=info msg="Server closing listener. No longer accepting connections." +time="2026-09-03T01:14:25-07:00" level=info msg="stats stopped: context canceled" +=========================== short test summary info ============================ +FAILED tests/unit/test_error_announcement_detection.py::test_pr70_description_is_prose_not_an_announcement +FAILED tests/unit/test_error_announcement_detection.py::test_healthy_doctor_run_carrying_pr70s_description_is_not_a_silent_failure +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[reports UNAVAILABLE (not ERROR) per project] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[this command never reports an error it did not observe] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[ERROR and UNAVAILABLE are different readings of the same field] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": null}] +FAILED tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": ""}] +FAILED tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[unknown command "reclaim" for "bd"] +FAILED tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[Traceback (most recent call last):\n File "cli.py", line 1\n] +FAILED tests/unit/test_error_announcement_detection.py::test_the_failure_message_names_which_shape_fired +10 failed, 13 passed in 0.24s diff --git a/docs/lanes/wp6-error-regex-scope/evidence/jyg-cannot-be-bypassed-from-outside.txt b/docs/lanes/wp6-error-regex-scope/evidence/jyg-cannot-be-bypassed-from-outside.txt new file mode 100644 index 0000000..cd26621 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/jyg-cannot-be-bypassed-from-outside.txt @@ -0,0 +1,102 @@ +=== ATTEMPT (FAILED) to reach the tier-3 doctor test's silent-failure check locally === + +Hypothesis: run_cli does env.setdefault("AMPLIFIER_WORK_TRACKER_ROOT", ...), +so exporting the REAL root (/home/bkrabach/.amplifier-work-tracker) would let +the subprocess see this machine's live reap/notify heartbeats, sweeps.alive +would PASS, doctor would exit 0, and the test would finally REACH +assert_no_silent_failure -- the line wp6 is about. + +RESULT: hypothesis is WRONG, and the reason matters. +tests/conftest.py:308 does mp.setenv("AMPLIFIER_WORK_TRACKER_ROOT", str(root)) +at session scope, so os.environ ALREADY carries the isolated tmp root by the +time setdefault runs. An exported value cannot win. sweeps.alive still FAILs +(see the captured run below), doctor still exits 1, and the test still dies at +the earlier `assert result.returncode == 0`. + +CONSEQUENCE, stated plainly: on any machine whose sweep heartbeats live +outside the isolated test root, this tier-3 test CANNOT reach the +silent-failure check at all, and no environment variable fixes that from +outside. That is model_performance-jyg, and it is exactly why the wp6 defect +was invisible locally and only surfaced in CI. + +It is also why this lane's regression test is TIER 1: a tier-1 test of the +predicate itself needs no bd, no dolt, and no healthy sweeps, so it cannot be +masked this way. The end-to-end evidence for #70 was instead obtained by +running doctor --quick directly, outside pytest, against the real root +(see pr70-would-now-pass.txt). + +--------------------------- the captured run --------------------------- +=== tier-3 doctor test, THIS BRANCH, in an environment where doctor exits 0 === + +The run_cli fixture uses env.setdefault("AMPLIFIER_WORK_TRACKER_ROOT", ...), +so exporting the REAL root makes the subprocess see this machine's live reap/ +notify heartbeats -- i.e. sweeps.alive PASSES and doctor exits 0. That is the +healthy-CI condition, and the only condition under which the wp6 defect is +reachable at all (see jyg-preexisting.txt). + +command: AMPLIFIER_WORK_TRACKER_ROOT=/home/bkrabach/.amplifier-work-tracker \ + .venv/bin/python -m pytest -m cli tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd -q + +F [100%] +=================================== FAILURES =================================== +___________ test_doctor_quick_succeeds_against_the_real_installed_bd ___________ + +run_cli = ._run at 0xfdfac5791080> + + def test_doctor_quick_succeeds_against_the_real_installed_bd(run_cli): + result = run_cli(["doctor", "--quick"]) +> assert result.returncode == 0, result.stdout + result.stderr +E AssertionError: [PASS] version bd 1.1.2 +E [PASS] capabilities all required bd commands present +E [PASS] resolve.fenced stale holder refused, as required +E [PASS] resolve.divergent_text_refused resolving a closed item with different text refuses and writes nothing +E [PASS] resolve.identical_text_idempotent re-sending identical resolution text is an idempotent success +E [PASS] reopen.reopens a resolved item reopens unassigned and is directly claimable again +E [PASS] reopen.clears_closed_at reopen clears closed_at (the documented, surfaced accounting cost) +E [PASS] reopen.close_reason_disposition reopen clears close_reason (measured), and the wrapper's archive comment preserves the previous resolution regardless +E [PASS] reopen.emits_event bd records a `reopened` events row, attributed +E [PASS] release.reopens_unresolved release reopens a held item with no resolution, and it is re-claimable +E [PASS] claim.subcommand --claim present, rejects --assignee as expected +E [PASS] claim.atomic skipped (--quick); run full doctor before trusting parallel agents +E [PASS] claim.directed_atomic skipped (--quick); run full doctor before trusting parallel agents +E [PASS] link.nonblocking discovered-from is non-blocking +E [PASS] list.includes_closed all-flag required and working +E [PASS] list.status_filter_includes_closed an explicit --status filter shows closed items without --all +E [PASS] show.dependents reverse link visible (1 links) +E [PASS] read.no_mutation repeated reads (including not-found/wrong-project misses) leave status, holder, and metadata unchanged +E [PASS] resolution.readable resolution text round-trips +E [PASS] timestamps.readable created_at/updated_at/closed_at all round-trip as real datetimes +E [PASS] metadata.roundtrip arbitrary JSON metadata round-trips +E [PASS] project.name_rules dotted names appear usable now; validator may be relaxed +E [PASS] custody.fresh_survives a fresh renewal survives regardless of total hold duration +E [PASS] custody.stale_reclaimed stale custody is reclaimed: custody stale -- last seen 3600s ago (ttl 900s) +E [PASS] custody.idle_not_exempt awaiting_human with stale custody is still reclaimed: custody stale -- last seen 3600s ago (ttl 900s) +E [PASS] custody.fenced old holder's renew and resolve are both refused after takeover +E [PASS] project.removal remove() drops both the directory and database; re-create afterward is genuinely empty +E [PASS] project.create_atomic an abandoned creation lock (dead pid) is healed automatically and create() completes fresh in the same call; path=/tmp/awtcontract_prepwr67/projects/contract1788426046199atomic +E [PASS] project.creation_state_reporting creation_state distinguishes none/creating/abandoned correctly +E [PASS] service.installed installed and active (unit: /home/bkrabach/.config/systemd/user/amplifier-work-tracker.service) +E [PASS] systemd.user_bus_reachable systemctl --user show-environment succeeded +E [PASS] dolt.reachable dolt sql-server responds on 127.0.0.1:35975 +E [FAIL] sweeps.alive no heartbeat ever recorded for the reap sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`); no heartbeat ever recorded for the notify sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`) +E [PASS] service.restart_policy installed unit has Restart=always -- survives a clean/unintended exit +E +E 1 assumption(s) VIOLATED. Beads has changed underneath us. +E Fix scope: amplifier_work_tracker/adapter.py only -- nothing above the seam encodes Beads behaviour. +E project 'contract1788426046199atomic': healing an abandoned creation attempt (lock /tmp/awtcontract_prepwr67/projects/contract1788426046199atomic/.create.lock named a dead pid) before retrying +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['/home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.ve...(lock /tmp/awtcontract_prepwr67/projects/contract1788426046199atomic/.create.lock named a dead pid) before retrying\n").returncode + +tests/cli/test_cli_surface.py:831: AssertionError +---------------------------- Captured stdout setup ----------------------------- +Starting server with Config HP="127.0.0.1:35975"|T="28800000"|R="false"|L="info" +---------------------------- Captured stderr setup ----------------------------- +----------------------------- Captured stdout call ----------------------------- + + +----------------------------- Captured stderr call ----------------------------- +--------------------------- Captured stderr teardown --------------------------- +=========================== short test summary info ============================ +FAILED tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd +1 failed in 45.99s diff --git a/docs/lanes/wp6-error-regex-scope/evidence/jyg-preexisting.txt b/docs/lanes/wp6-error-regex-scope/evidence/jyg-preexisting.txt new file mode 100644 index 0000000..9b71bfe --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/jyg-preexisting.txt @@ -0,0 +1,80 @@ +=== IS THE ONE tier-3 FAILURE PRE-EXISTING? (model_performance-jyg) === + +tests/_util.py restored to the PARENT commit ea233a7 (bare \berror\b). +The only other change on this branch is a NEW tier-1 file that this test +does not import, so this IS the parent state for this test. +command: .venv/bin/python -m pytest -m cli \ + tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd -q + +F [100%] +=================================== FAILURES =================================== +___________ test_doctor_quick_succeeds_against_the_real_installed_bd ___________ + +run_cli = ._run at 0xfd2155becea0> + + def test_doctor_quick_succeeds_against_the_real_installed_bd(run_cli): + result = run_cli(["doctor", "--quick"]) +> assert result.returncode == 0, result.stdout + result.stderr +E AssertionError: [PASS] version bd 1.1.2 +E [PASS] capabilities all required bd commands present +E [PASS] resolve.fenced stale holder refused, as required +E [PASS] resolve.divergent_text_refused resolving a closed item with different text refuses and writes nothing +E [PASS] resolve.identical_text_idempotent re-sending identical resolution text is an idempotent success +E [PASS] reopen.reopens a resolved item reopens unassigned and is directly claimable again +E [PASS] reopen.clears_closed_at reopen clears closed_at (the documented, surfaced accounting cost) +E [PASS] reopen.close_reason_disposition reopen clears close_reason (measured), and the wrapper's archive comment preserves the previous resolution regardless +E [PASS] reopen.emits_event bd records a `reopened` events row, attributed +E [PASS] release.reopens_unresolved release reopens a held item with no resolution, and it is re-claimable +E [PASS] claim.subcommand --claim present, rejects --assignee as expected +E [PASS] claim.atomic skipped (--quick); run full doctor before trusting parallel agents +E [PASS] claim.directed_atomic skipped (--quick); run full doctor before trusting parallel agents +E [PASS] link.nonblocking discovered-from is non-blocking +E [PASS] list.includes_closed all-flag required and working +E [PASS] list.status_filter_includes_closed an explicit --status filter shows closed items without --all +E [PASS] show.dependents reverse link visible (1 links) +E [PASS] read.no_mutation repeated reads (including not-found/wrong-project misses) leave status, holder, and metadata unchanged +E [PASS] resolution.readable resolution text round-trips +E [PASS] timestamps.readable created_at/updated_at/closed_at all round-trip as real datetimes +E [PASS] metadata.roundtrip arbitrary JSON metadata round-trips +E [PASS] project.name_rules dotted names appear usable now; validator may be relaxed +E [PASS] custody.fresh_survives a fresh renewal survives regardless of total hold duration +E [PASS] custody.stale_reclaimed stale custody is reclaimed: custody stale -- last seen 3600s ago (ttl 900s) +E [PASS] custody.idle_not_exempt awaiting_human with stale custody is still reclaimed: custody stale -- last seen 3600s ago (ttl 900s) +E [PASS] custody.fenced old holder's renew and resolve are both refused after takeover +E [PASS] project.removal remove() drops both the directory and database; re-create afterward is genuinely empty +E [PASS] project.create_atomic an abandoned creation lock (dead pid) is healed automatically and create() completes fresh in the same call; path=/tmp/awtcontract_zrg7zooz/projects/contract1788425983957atomic +E [PASS] project.creation_state_reporting creation_state distinguishes none/creating/abandoned correctly +E [PASS] service.installed installed and active (unit: /home/bkrabach/.config/systemd/user/amplifier-work-tracker.service) +E [PASS] systemd.user_bus_reachable systemctl --user show-environment succeeded +E [PASS] dolt.reachable dolt sql-server responds on 127.0.0.1:45435 +E [FAIL] sweeps.alive no heartbeat ever recorded for the reap sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`); no heartbeat ever recorded for the notify sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`) +E [PASS] service.restart_policy installed unit has Restart=always -- survives a clean/unintended exit +E +E 1 assumption(s) VIOLATED. Beads has changed underneath us. +E Fix scope: amplifier_work_tracker/adapter.py only -- nothing above the seam encodes Beads behaviour. +E project 'contract1788425983957atomic': healing an abandoned creation attempt (lock /tmp/awtcontract_zrg7zooz/projects/contract1788425983957atomic/.create.lock named a dead pid) before retrying +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['/home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.ve...(lock /tmp/awtcontract_zrg7zooz/projects/contract1788425983957atomic/.create.lock named a dead pid) before retrying\n").returncode + +tests/cli/test_cli_surface.py:831: AssertionError +---------------------------- Captured stdout setup ----------------------------- +Starting server with Config HP="127.0.0.1:45435"|T="28800000"|R="false"|L="info" +---------------------------- Captured stderr setup ----------------------------- +----------------------------- Captured stdout call ----------------------------- + + +----------------------------- Captured stderr call ----------------------------- +--------------------------- Captured stderr teardown --------------------------- +=========================== short test summary info ============================ +FAILED tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd +1 failed in 46.35s + +=== CONCLUSION === +It fails on the PARENT commit too, at the EARLIER assertion +(assert result.returncode == 0), because sweeps.alive FAILs under the +isolated AMPLIFIER_WORK_TRACKER_ROOT the run_cli fixture sets: this +machine's reap/notify heartbeats live outside that root. +assert_no_silent_failure is never reached, which is exactly why the wp6 +defect is invisible locally and only appeared in CI. This is +model_performance-jyg -- separately filed, separately owned, NOT this lane's. diff --git a/docs/lanes/wp6-error-regex-scope/evidence/ledger-mutate.txt b/docs/lanes/wp6-error-regex-scope/evidence/ledger-mutate.txt new file mode 100644 index 0000000..2e5ce60 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/ledger-mutate.txt @@ -0,0 +1,59 @@ +=== make ledger-mutate === +.venv/bin/python -m ledger.checks.mutation_harness +LEDGER MUTATION HARNESS -- discriminating-power evidence +Each probe is run against a counterfactual repo and must go RED. +Injection only: no product-code edit, no subprocess, nothing written to the repo. + +PINNING PROBES (row is red; probe pins the CURRENT non-conformant shape; + counterfactual = the FIXED behaviour) + (none) + +CONFORMANCE PROBES (row is green; probe asserts the invariant; + counterfactual = the known-wrong shape it forbids) + [PROVEN ] CCV1-000 LEDGER-INTEGRITY (CONFORMS) + test_row_ccv1_000 :: the governed contract moved under the pinned hash + [PROVEN ] CCV1-003 REGRESSION (CONFORMS) + test_row_ccv1_003 :: the failed-custody arm returns a bare failure again (no compensating release) + [PROVEN ] CCV1-004 REGRESSION (CONFORMS) + test_row_ccv1_004 :: a failed renewal no longer stops the loop (retry returns) + [PROVEN ] CCV1-005 REGRESSION (CONFORMS) + test_row_ccv1_005 :: the custody-keeps-itself-fresh reassurance returns to the skill + [PROVEN ] CCV1-008 REGRESSION (CONFORMS) + test_row_ccv1_008 :: awareness.md states the TTL release as automatic again + [PROVEN ] CCV1-009 REGRESSION (CONFORMS) + test_row_ccv1_009 :: the close fence is re-gated on item status (the original post-reclaim gap) + [PROVEN ] CCV1-011 REGRESSION (CONFORMS) + test_row_ccv1_011 :: renewal fences on holder only -- a zombie's generation matches again + [PROVEN ] CCV1-012 REGRESSION (CONFORMS) + test_row_ccv1_012 :: release reports its outcome from the exit code, not the read-back + [PROVEN ] CCV1-013 REGRESSION (CONFORMS) + test_row_ccv1_013 :: claim_item returns an Item parsed from the writing process's own stdout + [PROVEN ] CCV1-015 REGRESSION (CONFORMS) + test_row_ccv1_015 :: _verified_write stops verifying the SUCCESS path + [PROVEN ] CCV1-016 REGRESSION (CONFORMS) + test_row_ccv1_016 :: the transaction-was-aborted guarantee Incident B disproved returns to the prose + [PROVEN ] CCV1-017 REGRESSION (CONFORMS) + test_row_ccv1_017 :: the single-hold refusal is removed from the tool seam + [PROVEN ] CCV1-021 REGRESSION (CONFORMS) + test_row_ccv1_021 :: `make test` stops collecting ledger/checks + [PROVEN ] CCV1-022 REGRESSION (CONFORMS) + test_row_ccv1_022 :: CI stops installing the tool module editable (suite runs in nothing again) + [PROVEN ] CCV1-023 REGRESSION (CONFORMS) + test_row_ccv1_023 :: FIXED: a single-hold fixture now exists in the tool module suite + [PROVEN ] CCV1-023 REGRESSION (CONFORMS) + test_row_ccv1_023 :: FIXED: the contract's Fixture 4 location line points at a real path + [PROVEN ] CCV1-023 REGRESSION (CONFORMS) + test_row_ccv1_023 :: FIXED: the contract's named fixture file tests/test_single_hold.py now exists + +DENOMINATOR (this is the record) + pinning mutations proven 0 / 0 + pinning probes covered proven 0 / 0 + conformance mutations proven 17 / 17 + ALL mutations proven 17 / 17 + +UNPROVEN, named with reason + (none) + +Flip direction for every pinning probe above: VIOLATION-MOVEMENT. +A pinning probe going red means the behaviour moved TOWARD the contract: +update the row to CONFORMS and retarget the probe in the SAME change. diff --git a/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.run1-transient.stderr.txt b/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.run1-transient.stderr.txt new file mode 100644 index 0000000..bc0d273 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.run1-transient.stderr.txt @@ -0,0 +1,3 @@ +project 'contract1788423815748rm': bd init hit a dirty schema migration -- dropping and retrying once: [mysql] 2026/09/03 01:25:03 connection.go:214 busy buffer +Error: failed to open Dolt store: failed to initialize schema: schema migration: pending schema migrations alter pre-existing dirty tables: comments, compaction_snapshots, dependencies, events, issue_snapshots, labels; run 'bd dolt commit' to +project 'contract1788423815748atomic': healing an abandoned creation attempt (lock /tmp/awtcontract_h8rnisef/projects/contract1788423815748atomic/.create.lock named a dead pid) before retrying diff --git a/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.stderr.txt b/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.stderr.txt new file mode 100644 index 0000000..0ac6ca2 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.stderr.txt @@ -0,0 +1 @@ +project 'contract1788424171165atomic': healing an abandoned creation attempt (lock /tmp/awtcontract_vnsevrfc/projects/contract1788424171165atomic/.create.lock named a dead pid) before retrying diff --git a/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.stdout.txt b/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.stdout.txt new file mode 100644 index 0000000..d036e6f --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/pr70-doctor-quick.stdout.txt @@ -0,0 +1,37 @@ + [PASS] version bd 1.1.2 + [PASS] capabilities all required bd commands present + [PASS] read.unavailable_not_absent an infrastructure read failure raises BeadsUnavailableError with its cause intact on read/claim and reports UNAVAILABLE (not ERROR) per project, while genuine absence on a healthy database still reports plain 'not found' + [PASS] resolve.fenced stale holder refused, as required + [PASS] resolve.divergent_text_refused resolving a closed item with different text refuses and writes nothing + [PASS] resolve.identical_text_idempotent re-sending identical resolution text is an idempotent success + [PASS] reopen.reopens a resolved item reopens unassigned and is directly claimable again + [PASS] reopen.clears_closed_at reopen clears closed_at (the documented, surfaced accounting cost) + [PASS] reopen.close_reason_disposition reopen clears close_reason (measured), and the wrapper's archive comment preserves the previous resolution regardless + [PASS] reopen.emits_event bd records a `reopened` events row, attributed + [PASS] release.reopens_unresolved release reopens a held item with no resolution, and it is re-claimable + [PASS] claim.subcommand --claim present, rejects --assignee as expected + [PASS] claim.atomic skipped (--quick); run full doctor before trusting parallel agents + [PASS] claim.directed_atomic skipped (--quick); run full doctor before trusting parallel agents + [PASS] link.nonblocking discovered-from is non-blocking + [PASS] list.includes_closed all-flag required and working + [PASS] list.status_filter_includes_closed an explicit --status filter shows closed items without --all + [PASS] show.dependents reverse link visible (1 links) + [PASS] read.no_mutation repeated reads (including not-found/wrong-project misses) leave status, holder, and metadata unchanged + [PASS] resolution.readable resolution text round-trips + [PASS] timestamps.readable created_at/updated_at/closed_at all round-trip as real datetimes + [PASS] metadata.roundtrip arbitrary JSON metadata round-trips + [PASS] project.name_rules dotted names appear usable now; validator may be relaxed + [PASS] custody.fresh_survives a fresh renewal survives regardless of total hold duration + [PASS] custody.stale_reclaimed stale custody is reclaimed: custody stale -- last seen 3601s ago (ttl 900s) + [PASS] custody.idle_not_exempt awaiting_human with stale custody is still reclaimed: custody stale -- last seen 3601s ago (ttl 900s) + [PASS] custody.fenced old holder's renew and resolve are both refused after takeover + [PASS] project.removal remove() drops both the directory and database; re-create afterward is genuinely empty + [PASS] project.create_atomic an abandoned creation lock (dead pid) is healed automatically and create() completes fresh in the same call; path=/tmp/awtcontract_vnsevrfc/projects/contract1788424171165atomic + [PASS] project.creation_state_reporting creation_state distinguishes none/creating/abandoned correctly + [PASS] service.installed installed and active (unit: /home/bkrabach/.config/systemd/user/amplifier-work-tracker.service) + [PASS] systemd.user_bus_reachable systemctl --user show-environment succeeded + [PASS] dolt.reachable dolt sql-server responds on 127.0.0.1:3308 + [PASS] sweeps.alive reap sweep completed 205s ago (threshold 900s); notify sweep completed 283s ago (threshold 900s) + [PASS] service.restart_policy installed unit has Restart=always -- survives a clean/unintended exit + +All 35 assumptions hold. Safe to run parallel agents. diff --git a/docs/lanes/wp6-error-regex-scope/evidence/pr70-would-now-pass.txt b/docs/lanes/wp6-error-regex-scope/evidence/pr70-would-now-pass.txt new file mode 100644 index 0000000..70c2d91 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/pr70-would-now-pass.txt @@ -0,0 +1,57 @@ +=== WOULD PR #70 NOW PASS? === + +Source of truth: a REAL `doctor --quick` run from PR #70's own head, +not a synthetic fixture. + worktree : /tmp/wp6-pr70 (git worktree of origin/pr-70) + head : 20557bc5bde2f3983615f30494234bf71510dba1 + install : its own uv venv, `uv pip install -e '.[dev,web]'` + command : .venv/bin/python -m amplifier_work_tracker.cli doctor --quick + exit code: 0 (run against the REAL workspace root, so `sweeps.alive` + passes -- i.e. the healthy-CI condition, NOT the local + jyg-masked one where doctor exits 1) + stdout : 35 rows, 4032 bytes; tail: All 35 assumptions hold. Safe to run parallel agents. + stderr : "project 'contract1788424171165atomic': healing an abandoned creation attempt (lock /tmp/awtcontract_vnsevrfc/projects/co" + +The assumption row PR #70 adds, verbatim from that run: +" [PASS] read.unavailable_not_absent an infrastructure read failure raises BeadsUnavailableError with its cause intact on read/claim and reports UNAVAILABLE (not ERROR) per project, while genuine absence on a healthy database still reports plain 'not found'" + +PARENT predicate r'\berror\b' (tests/_util.py @ ea233a7): + MATCH + matched 'ERROR' at offset 302 of combined stdout+stderr + context: ...its cause intact on read/claim and reports UNAVAILABLE (not ERROR) per project, while genuine absence on a healthy database s... + => assert_no_silent_failure raises on exit 0 + => test_doctor_quick_succeeds_against_the_real_installed_bd FAILS + => THIS IS THE CI FAILURE THAT BLOCKS #70, reproduced locally. + +THIS BRANCH's predicate (announcement shapes): + no announcement found + => assert_no_silent_failure(exit 0) does NOT raise + +VERDICT: on PR #70's real doctor output, the silent-failure check PASSES. + +What this does and does not prove +--------------------------------- +DOES: the wp6 defect is gone from #70's actual output. The exact bytes + that tripped CI no longer trip the check. +DOES NOT: re-run #70's CI. Nobody in this lane merged anything. +DOES NOT: touch model_performance-jyg. On a machine whose sweep + heartbeats live outside the isolated test root -- including this + one -- that same test still dies EARLIER, at + `assert result.returncode == 0`, because `sweeps.alive` FAILs and + doctor exits 1. jyg is separately filed and separately owned. The + run above deliberately used the real root to get past it. + +One transient, reported rather than dropped +------------------------------------------- +The FIRST pr-70 run (evidence/pr70-doctor-quick.run1-transient.stderr.txt) +printed, on stderr, while still exiting 0: + project 'contract...rm': bd init hit a dirty schema migration -- + dropping and retrying once: [mysql] ... busy buffer + Error: failed to open Dolt store: failed to initialize schema: ... +i.e. `doctor` HEALED a bd failure and succeeded, but bd's own `Error:` +announcement leaked to stderr underneath it. Both the old predicate AND +this branch's flag that -- correctly, by the letter of the invariant: +an error was announced and the exit code was 0. It did not reproduce on +the second run (clean stderr). It is NOT caused by #70's description and +is NOT what blocks #70. It is a real, separate observation about healed- +but-still-announced errors, filed rather than absorbed. diff --git a/docs/lanes/wp6-error-regex-scope/evidence/tier-cli.txt b/docs/lanes/wp6-error-regex-scope/evidence/tier-cli.txt new file mode 100644 index 0000000..2972f7a --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/tier-cli.txt @@ -0,0 +1,1438 @@ +=== make test-cli (tier 3) === +.venv/bin/python -m pytest -m cli tests/cli -v +============================= test session starts ============================== +platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/bin/python +cachedir: .pytest_cache +rootdir: /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker +configfile: pyproject.toml +plugins: anyio-4.15.0, asyncio-1.4.0, amplifier-core-1.6.1 +asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function +collecting ... collected 81 items + +tests/cli/test_cli_move.py::test_move_end_to_end_via_cli PASSED [ 1%] +tests/cli/test_cli_move.py::test_move_missing_item_fails_loudly PASSED [ 2%] +tests/cli/test_cli_move.py::test_move_held_item_fails_loudly PASSED [ 3%] +tests/cli/test_cli_move.py::test_move_missing_destination_fails_loudly PASSED [ 4%] +tests/cli/test_cli_new_verbs.py::test_edit_amends_fields_via_cli PASSED [ 6%] +tests/cli/test_cli_new_verbs.py::test_edit_merge_into_supersedes_via_cli PASSED [ 7%] +tests/cli/test_cli_new_verbs.py::test_edit_refuses_combining_merge_into_with_fields PASSED [ 8%] +tests/cli/test_cli_new_verbs.py::test_defer_then_clear_via_cli PASSED [ 9%] +tests/cli/test_cli_new_verbs.py::test_defer_without_reason_fails_loudly PASSED [ 11%] +tests/cli/test_cli_new_verbs.py::test_block_then_clear_via_cli PASSED [ 12%] +tests/cli/test_cli_new_verbs.py::test_dep_declares_and_displays_edge_via_cli PASSED [ 13%] +tests/cli/test_cli_new_verbs.py::test_dep_missing_item_fails_loudly PASSED [ 14%] +tests/cli/test_cli_rename.py::test_rename_end_to_end_via_cli PASSED [ 16%] +tests/cli/test_cli_rename.py::test_rename_to_taken_name_fails_loudly PASSED [ 17%] +tests/cli/test_cli_rename.py::test_rename_missing_source_fails_loudly PASSED [ 18%] +tests/cli/test_cli_reopen.py::test_reopen_then_correct_end_to_end PASSED [ 19%] +tests/cli/test_cli_reopen.py::test_reopen_with_claim_flag_claims_the_item PASSED [ 20%] +tests/cli/test_cli_reopen.py::test_reopen_refuses_an_item_that_is_not_resolved PASSED [ 22%] +tests/cli/test_cli_reopen.py::test_resolve_on_a_closed_item_with_different_text_exits_nonzero_and_writes_nothing PASSED [ 23%] +tests/cli/test_cli_reopen.py::test_resolve_with_identical_text_exits_zero_and_says_it_was_idempotent PASSED [ 24%] +tests/cli/test_cli_status.py::test_status_breakdown_matches_manual_count PASSED [ 25%] +tests/cli/test_cli_status.py::test_instances_json_gains_blocked_deferred_resolved_counts PASSED [ 27%] +tests/cli/test_cli_status.py::test_status_on_unknown_project_gives_distinct_error PASSED [ 28%] +tests/cli/test_cli_status.py::test_status_never_mutates_project_state PASSED [ 29%] +tests/cli/test_cli_status.py::test_status_on_project_stuck_creating_reports_creating_not_a_healthy_zero PASSED [ 30%] +tests/cli/test_cli_surface.py::test_help_lists_every_subcommand PASSED [ 32%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[doctor] PASSED [ 33%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[new] PASSED [ 34%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[remove] PASSED [ 35%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[add] PASSED [ 37%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[instances] PASSED [ 38%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[status] PASSED [ 39%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[list] PASSED [ 40%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[claim] PASSED [ 41%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[custody] PASSED [ 43%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[reap] PASSED [ 44%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[resolve] PASSED [ 45%] +tests/cli/test_cli_surface.py::test_each_subcommand_is_recognized_by_argparse[notify] PASSED [ 46%] +tests/cli/test_cli_surface.py::test_capabilities_probe_matches_the_installed_bd_binary PASSED [ 48%] +tests/cli/test_cli_surface.py::test_new_rejects_dotted_name_with_nonzero_exit PASSED [ 49%] +tests/cli/test_cli_surface.py::test_new_is_idempotent_on_a_valid_name PASSED [ 50%] +tests/cli/test_cli_surface.py::test_new_reports_created_not_adopted_for_a_genuinely_fresh_project PASSED [ 51%] +tests/cli/test_cli_surface.py::test_new_reports_adoption_loudly_when_directory_gone_but_database_survives PASSED [ 53%] +tests/cli/test_cli_surface.py::test_remove_without_yes_exits_nonzero PASSED [ 54%] +tests/cli/test_cli_surface.py::test_remove_with_yes_drops_both_directory_and_database PASSED [ 55%] +tests/cli/test_cli_surface.py::test_remove_refuses_via_cli_while_an_item_is_held PASSED [ 56%] +tests/cli/test_cli_surface.py::test_remove_of_nonexistent_project_gives_distinct_error PASSED [ 58%] +tests/cli/test_cli_surface.py::test_instances_on_a_fresh_empty_root_exits_zero PASSED [ 59%] +tests/cli/test_cli_surface.py::test_instances_json_is_well_formed PASSED [ 60%] +tests/cli/test_cli_surface.py::test_list_shows_mixed_states_with_id_title_status_holder_resolution PASSED [ 61%] +tests/cli/test_cli_surface.py::test_list_status_filter_returns_only_matching_status PASSED [ 62%] +tests/cli/test_cli_surface.py::test_list_rejects_unknown_status_via_argparse_choices PASSED [ 64%] +tests/cli/test_cli_surface.py::test_list_never_mutates_project_state PASSED [ 65%] +tests/cli/test_cli_surface.py::test_list_on_a_project_with_no_matching_items_exits_zero_with_empty_list PASSED [ 66%] +tests/cli/test_cli_surface.py::test_list_on_nonexistent_project_gives_distinct_error PASSED [ 67%] +tests/cli/test_cli_surface.py::test_list_truncates_and_reports_it_explicitly PASSED [ 69%] +tests/cli/test_cli_surface.py::test_list_dash_dash_id_reads_full_body_without_claiming PASSED [ 70%] +tests/cli/test_cli_surface.py::test_list_dash_dash_id_human_readable_output_includes_body_fields PASSED [ 71%] +tests/cli/test_cli_surface.py::test_list_dash_dash_id_on_nonexistent_item_gives_distinct_error PASSED [ 72%] +tests/cli/test_cli_surface.py::test_list_dash_dash_id_with_id_from_a_different_project_gives_distinct_wrong_project_error PASSED [ 74%] +tests/cli/test_cli_surface.py::test_list_dash_dash_id_never_mutates_the_item PASSED [ 75%] +tests/cli/test_cli_surface.py::test_list_dash_dash_id_ignores_status_and_limit PASSED [ 76%] +tests/cli/test_cli_surface.py::test_add_creates_a_claimable_item_without_needing_lane_vocabulary PASSED [ 77%] +tests/cli/test_cli_surface.py::test_claim_on_empty_queue_exits_3_and_prints_no_error PASSED [ 79%] +tests/cli/test_cli_surface.py::test_claim_dash_dash_id_directs_a_claim_to_a_specific_item PASSED [ 80%] +tests/cli/test_cli_surface.py::test_claim_dash_dash_id_on_an_already_held_item_exits_nonzero_naming_the_holder PASSED [ 81%] +tests/cli/test_cli_surface.py::test_claim_dash_dash_id_on_nonexistent_id_exits_nonzero_with_distinct_error PASSED [ 82%] +tests/cli/test_cli_surface.py::test_claim_then_resolve_then_notify_full_cli_flow PASSED [ 83%] +tests/cli/test_cli_surface.py::test_resolve_by_a_reclaimed_stale_holder_exits_nonzero PASSED [ 85%] +tests/cli/test_cli_surface.py::test_reap_on_a_clean_queue_exits_zero_with_no_error_text PASSED [ 86%] +tests/cli/test_cli_surface.py::test_reap_reclaims_an_item_with_forged_stale_custody PASSED [ 87%] +tests/cli/test_cli_surface.py::test_custody_exits_nonzero_when_watched_pid_is_already_dead PASSED [ 88%] +tests/cli/test_cli_surface.py::test_custody_establishes_and_exits_cleanly_when_watched_pid_dies PASSED [ 90%] +tests/cli/test_cli_surface.py::test_commands_fail_loudly_when_bd_binary_is_entirely_absent[args0] PASSED [ 91%] +tests/cli/test_cli_surface.py::test_commands_fail_loudly_when_bd_binary_is_entirely_absent[args1] PASSED [ 92%] +tests/cli/test_cli_surface.py::test_commands_fail_loudly_when_bd_binary_is_entirely_absent[args2] PASSED [ 93%] +tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd FAILED [ 95%] +tests/cli/test_cli_unclaim.py::test_unclaim_releases_held_item_end_to_end PASSED [ 96%] +tests/cli/test_cli_unclaim.py::test_unclaim_sets_no_resolution_unlike_resolve PASSED [ 97%] +tests/cli/test_cli_unclaim.py::test_unclaim_not_held_fails_loudly_and_mutates_nothing PASSED [ 98%] +tests/cli/test_cli_unclaim.py::test_unclaim_missing_item_fails_loudly PASSED [100%] + +=================================== FAILURES =================================== +___________ test_doctor_quick_succeeds_against_the_real_installed_bd ___________ + +run_cli = ._run at 0xf8718200d8a0> + + def test_doctor_quick_succeeds_against_the_real_installed_bd(run_cli): + result = run_cli(["doctor", "--quick"]) +> assert result.returncode == 0, result.stdout + result.stderr +E AssertionError: [PASS] version bd 1.1.2 +E [PASS] capabilities all required bd commands present +E [PASS] resolve.fenced stale holder refused, as required +E [PASS] resolve.divergent_text_refused resolving a closed item with different text refuses and writes nothing +E [PASS] resolve.identical_text_idempotent re-sending identical resolution text is an idempotent success +E [PASS] reopen.reopens a resolved item reopens unassigned and is directly claimable again +E [PASS] reopen.clears_closed_at reopen clears closed_at (the documented, surfaced accounting cost) +E [PASS] reopen.close_reason_disposition reopen clears close_reason (measured), and the wrapper's archive comment preserves the previous resolution regardless +E [PASS] reopen.emits_event bd records a `reopened` events row, attributed +E [PASS] release.reopens_unresolved release reopens a held item with no resolution, and it is re-claimable +E [PASS] claim.subcommand --claim present, rejects --assignee as expected +E [PASS] claim.atomic skipped (--quick); run full doctor before trusting parallel agents +E [PASS] claim.directed_atomic skipped (--quick); run full doctor before trusting parallel agents +E [PASS] link.nonblocking discovered-from is non-blocking +E [PASS] list.includes_closed all-flag required and working +E [PASS] list.status_filter_includes_closed an explicit --status filter shows closed items without --all +E [PASS] show.dependents reverse link visible (1 links) +E [PASS] read.no_mutation repeated reads (including not-found/wrong-project misses) leave status, holder, and metadata unchanged +E [PASS] resolution.readable resolution text round-trips +E [PASS] timestamps.readable created_at/updated_at/closed_at all round-trip as real datetimes +E [PASS] metadata.roundtrip arbitrary JSON metadata round-trips +E [PASS] project.name_rules dotted names appear usable now; validator may be relaxed +E [PASS] custody.fresh_survives a fresh renewal survives regardless of total hold duration +E [PASS] custody.stale_reclaimed stale custody is reclaimed: custody stale -- last seen 3601s ago (ttl 900s) +E [PASS] custody.idle_not_exempt awaiting_human with stale custody is still reclaimed: custody stale -- last seen 3601s ago (ttl 900s) +E [PASS] custody.fenced old holder's renew and resolve are both refused after takeover +E [PASS] project.removal remove() drops both the directory and database; re-create afterward is genuinely empty +E [PASS] project.create_atomic an abandoned creation lock (dead pid) is healed automatically and create() completes fresh in the same call; path=/tmp/awtcontract__yl7zs5n/projects/contract1788423671584atomic +E [PASS] project.creation_state_reporting creation_state distinguishes none/creating/abandoned correctly +E [PASS] service.installed installed and active (unit: /home/bkrabach/.config/systemd/user/amplifier-work-tracker.service) +E [PASS] systemd.user_bus_reachable systemctl --user show-environment succeeded +E [PASS] dolt.reachable dolt sql-server responds on 127.0.0.1:38205 +E [FAIL] sweeps.alive no heartbeat ever recorded for the reap sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`); no heartbeat ever recorded for the notify sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`) +E [PASS] service.restart_policy installed unit has Restart=always -- survives a clean/unintended exit +E +E 1 assumption(s) VIOLATED. Beads has changed underneath us. +E Fix scope: amplifier_work_tracker/adapter.py only -- nothing above the seam encodes Beads behaviour. +E project 'contract1788423671584atomic': healing an abandoned creation attempt (lock /tmp/awtcontract__yl7zs5n/projects/contract1788423671584atomic/.create.lock named a dead pid) before retrying +E +E assert 1 == 0 +E + where 1 = CompletedProcess(args=['/home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/bin/python', '-m', 'amplifier_work_tracker.cli', 'doctor', '--quick'], returncode=1, stdout=" [PASS] version bd 1.1.2\n [PASS] capabilities all required bd commands present\n [PASS] resolve.fenced stale holder refused, as required\n [PASS] resolve.divergent_text_refused resolving a closed item with different text refuses and writes nothing\n [PASS] resolve.identical_text_idempotent re-sending identical resolution text is an idempotent success\n [PASS] reopen.reopens a resolved item reopens unassigned and is directly claimable again\n [PASS] reopen.clears_closed_at reopen clears closed_at (the documented, surfaced accounting cost)\n [PASS] reopen.close_reason_disposition reopen clears close_reason (measured), and the wrapper's archive comment preserves the previous resolution regardless\n [PASS] reopen.emits_event bd records a `reopened` events row, attributed\n [PASS] release.reopens_unresolved release reopens a...installed installed and active (unit: /home/bkrabach/.config/systemd/user/amplifier-work-tracker.service)\n [PASS] systemd.user_bus_reachable systemctl --user show-environment succeeded\n [PASS] dolt.reachable dolt sql-server responds on 127.0.0.1:38205\n [FAIL] sweeps.alive no heartbeat ever recorded for the reap sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`); no heartbeat ever recorded for the notify sweep loop -- it may never have started, or the heartbeat file was removed; restart the service (`amplifier-work-tracker service restart`)\n [PASS] service.restart_policy installed unit has Restart=always -- survives a clean/unintended exit\n\n1 assumption(s) VIOLATED. Beads has changed underneath us.\nFix scope: amplifier_work_tracker/adapter.py only -- nothing above the seam encodes Beads behaviour.\n", stderr="project 'contract1788423671584atomic': healing an abandoned creation attempt (lock /tmp/awtcontract__yl7zs5n/projects/contract1788423671584atomic/.create.lock named a dead pid) before retrying\n").returncode + +tests/cli/test_cli_surface.py:831: AssertionError +----------------------------- Captured stdout call ----------------------------- + + +----------------------------- Captured stderr call ----------------------------- +time="2026-09-03T01:21:11-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1960 +time="2026-09-03T01:21:11-07:00" level=info msg=ConnectionClosed connectionID=1960 +time="2026-09-03T01:21:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1961 +time="2026-09-03T01:21:12-07:00" level=info msg=ConnectionClosed connectionID=1961 +time="2026-09-03T01:21:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1962 +time="2026-09-03T01:21:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1963 +time="2026-09-03T01:21:12-07:00" level=info msg=ConnectionClosed connectionID=1962 +time="2026-09-03T01:21:12-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:12.236869594 -0700 PDT m=+314.486313629" connectionDb=contract1788423671584 connectionID=1963 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:12.246343039 -0700 PDT m=+314.495787090" +time="2026-09-03T01:21:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1964 +time="2026-09-03T01:21:12-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:12.247133739 -0700 PDT m=+314.496577774" connectionDb=contract1788423671584 connectionID=1964 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:12.248031703 -0700 PDT m=+314.497475706" +time="2026-09-03T01:21:12-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:12.247133739 -0700 PDT m=+314.496577774" connectionDb=contract1788423671584 connectionID=1964 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:12.249090514 -0700 PDT m=+314.498534533" +time="2026-09-03T01:21:12-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:12.247133739 -0700 PDT m=+314.496577774" connectionDb=contract1788423671584 connectionID=1964 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:12.251348312 -0700 PDT m=+314.500792331" +time="2026-09-03T01:21:15-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:12.247133739 -0700 PDT m=+314.496577774" connectionDb=contract1788423671584 connectionID=1964 error="table not found: ignored_schema_migrations" queryTime="2026-09-03 01:21:15.075461062 -0700 PDT m=+317.324905097" +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1964 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1963 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1965 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1965 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1966 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1967 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1966 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1967 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1968 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1968 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1969 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1970 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1969 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1970 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1971 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1971 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1972 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1973 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1972 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1973 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1974 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1974 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1975 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1975 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1976 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1976 +time="2026-09-03T01:21:16-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1977 +time="2026-09-03T01:21:16-07:00" level=info msg=ConnectionClosed connectionID=1977 +time="2026-09-03T01:21:17-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1978 +time="2026-09-03T01:21:17-07:00" level=info msg=ConnectionClosed connectionID=1978 +time="2026-09-03T01:21:17-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1979 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1980 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1979 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1981 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1980 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1982 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1982 +time="2026-09-03T01:21:18-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:18.049319417 -0700 PDT m=+320.298763452" connectionDb=contract1788423671584 connectionID=1981 error="backup 'backup_export' not found" queryTime="2026-09-03 01:21:18.298828995 -0700 PDT m=+320.548273030" +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1981 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1983 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1983 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1984 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1984 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1985 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1985 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1986 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1986 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1987 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1988 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1987 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1988 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1989 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1989 +time="2026-09-03T01:21:18-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1990 +time="2026-09-03T01:21:18-07:00" level=info msg=ConnectionClosed connectionID=1990 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1991 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1991 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1992 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1992 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1993 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1993 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1994 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1994 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1995 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1995 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1996 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1996 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1997 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1997 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1998 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=1999 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1998 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2000 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=2000 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=1999 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2001 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=2001 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2002 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=2002 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2003 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=2003 +time="2026-09-03T01:21:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2004 +time="2026-09-03T01:21:19-07:00" level=info msg=ConnectionClosed connectionID=2004 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2005 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2005 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2006 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2007 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2006 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2007 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2008 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2008 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2009 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2009 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2010 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2010 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2011 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2011 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2012 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2012 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2013 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2013 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2014 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2014 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2015 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2015 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2016 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2016 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2017 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2017 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2018 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2019 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2018 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2020 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2020 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2019 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2021 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2021 +time="2026-09-03T01:21:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2022 +time="2026-09-03T01:21:20-07:00" level=info msg=ConnectionClosed connectionID=2022 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2023 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2023 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2024 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2024 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2025 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2025 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2026 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2027 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2026 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2028 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2027 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2029 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2029 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2028 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2030 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2030 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2031 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2031 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2032 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2032 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2033 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2033 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2034 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2034 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2035 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2035 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2036 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2036 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2037 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2037 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2038 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2038 +time="2026-09-03T01:21:21-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2039 +time="2026-09-03T01:21:21-07:00" level=info msg=ConnectionClosed connectionID=2039 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2040 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2040 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2041 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2042 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2041 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2043 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2043 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2042 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2044 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2044 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2045 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2045 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2046 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2046 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2047 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2047 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2048 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2048 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2050 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2049 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2049 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2051 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2050 +time="2026-09-03T01:21:22-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2052 +time="2026-09-03T01:21:22-07:00" level=info msg=ConnectionClosed connectionID=2052 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2051 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2053 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2053 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2054 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2054 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2055 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2055 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2056 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2056 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2057 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2057 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2058 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2058 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2059 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2059 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2060 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2060 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2061 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2062 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2061 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2063 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2063 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2062 +time="2026-09-03T01:21:23-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2064 +time="2026-09-03T01:21:23-07:00" level=info msg=ConnectionClosed connectionID=2064 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2065 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2065 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2066 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2066 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2067 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2067 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2068 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2068 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2069 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2069 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2070 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2071 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2070 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2072 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2072 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2071 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2073 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2073 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2074 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2074 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2075 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2075 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2076 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2076 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2077 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2077 +time="2026-09-03T01:21:24-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2078 +time="2026-09-03T01:21:24-07:00" level=info msg=ConnectionClosed connectionID=2078 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2079 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2079 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2080 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2081 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2080 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2081 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2082 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2082 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2083 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2084 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2083 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2085 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2085 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2084 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2086 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2086 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2087 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2088 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2087 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2088 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2089 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2089 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2090 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2091 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2090 +time="2026-09-03T01:21:25-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2092 +time="2026-09-03T01:21:25-07:00" level=info msg=ConnectionClosed connectionID=2092 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2091 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2093 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2093 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2094 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2094 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2095 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2095 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2096 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2096 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2097 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2097 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2098 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2098 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2099 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2099 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2100 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2100 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2101 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2101 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2102 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2102 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2103 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2103 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2104 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2104 +time="2026-09-03T01:21:26-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2105 +time="2026-09-03T01:21:26-07:00" level=info msg=ConnectionClosed connectionID=2105 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2106 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2106 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2107 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2108 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2107 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2109 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2109 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2108 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2110 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2110 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2111 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2111 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2112 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2112 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2113 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2113 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2114 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2114 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2115 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2115 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2116 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2116 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2117 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2118 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2117 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2119 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2119 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2118 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2120 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2120 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2121 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2121 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2122 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2122 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2123 +time="2026-09-03T01:21:27-07:00" level=info msg=ConnectionClosed connectionID=2123 +time="2026-09-03T01:21:27-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2124 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2124 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2125 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2125 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2126 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2127 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2126 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2128 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2128 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2127 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2129 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2129 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2130 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2130 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2131 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2131 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2132 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2132 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2133 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2133 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2134 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2134 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2135 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2135 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2136 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2136 +time="2026-09-03T01:21:28-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2137 +time="2026-09-03T01:21:28-07:00" level=info msg=ConnectionClosed connectionID=2137 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2138 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2138 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2139 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2140 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2139 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2140 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2141 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2141 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2142 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2143 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2142 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2144 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2144 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2143 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2145 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2145 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2146 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2147 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2146 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2147 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2148 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2149 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2148 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2150 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2149 +time="2026-09-03T01:21:29-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2151 +time="2026-09-03T01:21:29-07:00" level=info msg=ConnectionClosed connectionID=2151 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2150 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2152 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2152 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2153 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2153 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2154 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2154 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2155 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2155 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2156 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2156 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2157 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2157 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2158 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2158 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2159 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2159 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2160 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2161 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2160 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2162 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2162 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2161 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2163 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2163 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2164 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2164 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2165 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2165 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2166 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2166 +time="2026-09-03T01:21:30-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2167 +time="2026-09-03T01:21:30-07:00" level=info msg=ConnectionClosed connectionID=2167 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2168 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2168 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2169 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2170 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2169 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2171 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2171 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2170 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2172 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2172 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2173 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2173 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2174 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2174 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2175 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2175 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2176 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2176 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2177 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2177 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2179 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2178 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2178 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2180 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2179 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2180 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2181 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2181 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2182 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2183 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2182 +time="2026-09-03T01:21:31-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2184 +time="2026-09-03T01:21:31-07:00" level=info msg=ConnectionClosed connectionID=2184 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2183 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2185 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2185 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2186 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2187 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2186 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2187 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2188 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2188 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2189 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2190 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2189 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2191 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2191 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2190 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2192 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2192 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2193 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2193 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2194 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2194 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2195 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2195 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2196 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2196 +time="2026-09-03T01:21:32-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2197 +time="2026-09-03T01:21:32-07:00" level=info msg=ConnectionClosed connectionID=2197 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2198 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2198 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2199 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2200 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2199 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2201 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2201 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2200 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2202 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2202 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2203 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2204 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2203 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2204 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2205 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2205 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2206 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2207 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2206 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2208 +time="2026-09-03T01:21:33-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2209 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2207 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2209 +time="2026-09-03T01:21:33-07:00" level=info msg=ConnectionClosed connectionID=2208 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2210 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2210 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2211 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2211 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2212 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2212 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2213 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2213 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2214 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2214 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2215 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2216 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2215 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2217 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2216 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2218 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2218 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2217 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2219 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2219 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2220 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2220 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2221 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2221 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2222 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2222 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2223 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2223 +time="2026-09-03T01:21:34-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2224 +time="2026-09-03T01:21:34-07:00" level=info msg=ConnectionClosed connectionID=2224 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2225 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2225 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2226 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2227 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2226 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2227 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2228 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2229 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2228 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2230 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2229 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2231 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2231 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2230 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2232 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2232 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2233 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2234 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2233 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2234 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2235 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2235 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2236 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2237 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2236 +time="2026-09-03T01:21:35-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2238 +time="2026-09-03T01:21:35-07:00" level=info msg=ConnectionClosed connectionID=2238 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2237 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2239 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2239 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2240 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2240 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2241 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2241 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2242 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2242 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2243 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2243 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2244 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2244 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2245 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2245 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2246 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2246 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2247 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2247 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2248 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2249 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2248 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2250 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2250 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2249 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2251 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2251 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2252 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2252 +time="2026-09-03T01:21:36-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2253 +time="2026-09-03T01:21:36-07:00" level=info msg=ConnectionClosed connectionID=2253 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2254 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2254 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2255 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2256 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2255 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2256 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2257 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2257 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2258 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2258 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2259 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2259 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2260 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2260 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2261 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2261 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2262 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2262 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2263 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2263 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2264 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2264 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2265 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2265 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2266 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2267 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2266 +time="2026-09-03T01:21:37-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2268 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2268 +time="2026-09-03T01:21:37-07:00" level=info msg=ConnectionClosed connectionID=2267 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2269 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2269 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2270 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2270 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2271 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2271 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2272 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2272 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2273 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2273 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2274 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2274 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2275 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2275 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2276 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2276 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2277 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2278 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2277 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2278 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2279 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2279 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2280 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2280 +time="2026-09-03T01:21:38-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2281 +time="2026-09-03T01:21:38-07:00" level=info msg=ConnectionClosed connectionID=2281 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2282 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2282 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2283 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2283 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2284 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2284 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2285 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2286 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2285 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2286 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2287 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2287 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2288 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2289 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2288 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2290 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2289 +time="2026-09-03T01:21:39-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2291 +time="2026-09-03T01:21:39-07:00" level=info msg=ConnectionClosed connectionID=2291 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2290 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2292 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2292 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2293 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2293 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2294 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2294 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2295 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2295 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2296 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2297 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2296 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2298 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2298 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2297 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2299 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2299 +time="2026-09-03T01:21:40-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2300 +time="2026-09-03T01:21:40-07:00" level=info msg=ConnectionClosed connectionID=2300 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2301 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2301 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2302 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2302 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2303 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2303 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2304 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2304 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2305 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2306 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2305 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2307 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2307 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2306 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2308 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2308 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2309 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2309 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2310 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2310 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2311 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2311 +time="2026-09-03T01:21:41-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2312 +time="2026-09-03T01:21:41-07:00" level=info msg=ConnectionClosed connectionID=2312 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2313 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2313 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2314 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2315 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2314 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2316 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2316 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2315 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2317 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2317 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2318 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2318 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2319 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2319 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2320 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2320 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2321 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2321 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2322 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2322 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2323 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2323 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2324 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2324 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2325 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2325 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2326 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2327 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2326 +time="2026-09-03T01:21:42-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2328 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2328 +time="2026-09-03T01:21:42-07:00" level=info msg=ConnectionClosed connectionID=2327 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2329 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2329 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2330 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2330 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2331 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2331 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2332 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2332 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2333 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2333 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2334 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2334 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2335 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2336 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2335 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2337 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2337 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2336 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2338 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2338 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2339 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2339 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2340 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2340 +time="2026-09-03T01:21:43-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2341 +time="2026-09-03T01:21:43-07:00" level=info msg=ConnectionClosed connectionID=2341 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2342 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2342 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2343 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2343 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2344 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2344 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2345 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2346 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2345 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2347 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2347 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2346 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2348 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2348 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2349 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2349 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2350 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2350 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2351 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2351 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2352 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2353 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2352 +time="2026-09-03T01:21:44-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2354 +time="2026-09-03T01:21:44-07:00" level=info msg=ConnectionClosed connectionID=2354 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2353 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2355 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2355 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2356 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2356 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2357 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2357 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2358 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2359 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2358 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2359 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2360 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2360 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2361 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2362 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2361 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2362 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2363 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2363 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2364 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2364 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2365 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2366 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2365 +time="2026-09-03T01:21:45-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2367 +time="2026-09-03T01:21:45-07:00" level=info msg=ConnectionClosed connectionID=2367 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2366 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2368 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2368 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2369 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2369 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2370 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2370 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2371 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2371 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2372 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2372 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2373 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2373 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2374 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2374 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2375 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2375 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2376 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2376 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2377 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2377 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2378 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2378 +time="2026-09-03T01:21:46-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2379 +time="2026-09-03T01:21:46-07:00" level=info msg=ConnectionClosed connectionID=2379 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2380 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2380 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2381 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2381 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2382 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2382 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2383 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2383 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2384 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2384 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2385 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2385 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2386 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2386 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2387 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2387 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2388 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2388 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2389 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2389 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2390 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2390 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2391 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2391 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2392 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2392 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2393 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2393 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2394 +time="2026-09-03T01:21:47-07:00" level=info msg=ConnectionClosed connectionID=2394 +time="2026-09-03T01:21:47-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2395 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2395 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2396 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2396 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2397 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2397 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2398 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2398 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2399 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2399 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2400 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2401 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2400 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2402 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2402 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2401 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2403 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2403 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2404 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2404 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2405 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2405 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2406 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2406 +time="2026-09-03T01:21:48-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2407 +time="2026-09-03T01:21:48-07:00" level=info msg=ConnectionClosed connectionID=2407 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2408 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2408 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2409 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2410 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2409 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2411 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2411 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2410 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2412 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2412 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2413 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2413 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2414 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2414 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2415 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2415 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2416 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2416 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2417 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2417 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2418 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2418 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2419 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2419 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2420 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2421 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2420 +time="2026-09-03T01:21:49-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2422 +time="2026-09-03T01:21:49-07:00" level=info msg=ConnectionClosed connectionID=2422 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2421 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2423 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2423 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2424 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2424 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2425 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2425 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2426 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2426 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2427 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2427 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2428 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2428 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2429 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2429 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2430 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2430 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2432 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2431 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2431 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2433 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2432 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2434 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2434 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2433 +time="2026-09-03T01:21:50-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2435 +time="2026-09-03T01:21:50-07:00" level=info msg=ConnectionClosed connectionID=2435 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2436 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2436 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2437 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2437 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2438 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2438 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2439 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2439 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2440 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2440 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2441 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2441 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2442 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2442 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2443 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2444 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2443 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2445 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2445 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2444 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2446 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2446 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2447 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2447 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2448 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2448 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2449 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2449 +time="2026-09-03T01:21:51-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2450 +time="2026-09-03T01:21:51-07:00" level=info msg=ConnectionClosed connectionID=2450 +time="2026-09-03T01:21:54-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2451 +time="2026-09-03T01:21:54-07:00" level=info msg=ConnectionClosed connectionID=2451 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2452 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2452 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2453 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2454 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2453 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2455 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2455 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2454 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2456 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2456 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2457 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2457 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2458 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2458 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2459 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2459 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2460 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2461 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2460 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2461 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2462 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2462 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2463 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2463 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2464 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2464 +time="2026-09-03T01:21:55-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2465 +time="2026-09-03T01:21:55-07:00" level=info msg=ConnectionClosed connectionID=2465 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2466 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2466 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2467 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2467 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2468 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2468 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2469 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2469 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2470 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2470 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2471 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2472 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2471 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2473 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2473 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2472 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2474 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2474 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2475 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2475 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2476 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2476 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2477 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2477 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2478 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2478 +time="2026-09-03T01:21:56-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2479 +time="2026-09-03T01:21:56-07:00" level=info msg=ConnectionClosed connectionID=2479 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2480 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2481 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2480 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2482 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2481 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2483 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2483 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2482 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2484 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2484 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2485 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2485 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2486 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2486 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2487 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2487 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2488 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2488 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2489 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2490 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2489 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2490 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2491 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2491 +time="2026-09-03T01:21:57-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2492 +time="2026-09-03T01:21:57-07:00" level=info msg=ConnectionClosed connectionID=2492 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2493 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2493 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2494 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2494 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2495 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2495 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2496 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2496 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2497 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2497 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2498 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2498 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2499 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2500 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2499 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2501 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2500 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2502 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2502 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2501 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2503 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2503 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2504 +time="2026-09-03T01:21:58-07:00" level=info msg=ConnectionClosed connectionID=2504 +time="2026-09-03T01:21:58-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2505 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2505 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2506 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2506 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2507 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2507 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2508 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2508 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2509 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2509 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2510 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2510 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2511 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2511 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2512 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2512 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2513 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2513 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2514 +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2515 +time="2026-09-03T01:21:59-07:00" level=info msg=ConnectionClosed connectionID=2514 +time="2026-09-03T01:21:59-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:59.897176236 -0700 PDT m=+362.146620271" connectionDb=contract1788423671584rm connectionID=2515 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:59.921316365 -0700 PDT m=+362.170760384" +time="2026-09-03T01:21:59-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2516 +time="2026-09-03T01:21:59-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:59.941811872 -0700 PDT m=+362.191255891" connectionDb=contract1788423671584rm connectionID=2516 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:59.944101093 -0700 PDT m=+362.193545112" +time="2026-09-03T01:21:59-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:59.941811872 -0700 PDT m=+362.191255891" connectionDb=contract1788423671584rm connectionID=2516 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:59.945071681 -0700 PDT m=+362.194515700" +time="2026-09-03T01:21:59-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:59.941811872 -0700 PDT m=+362.191255891" connectionDb=contract1788423671584rm connectionID=2516 error="table not found: schema_migrations" queryTime="2026-09-03 01:21:59.948510577 -0700 PDT m=+362.197954596" +time="2026-09-03T01:22:02-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:21:59.941811872 -0700 PDT m=+362.191255891" connectionDb=contract1788423671584rm connectionID=2516 error="table not found: ignored_schema_migrations" queryTime="2026-09-03 01:22:02.948545648 -0700 PDT m=+365.197989667" +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2516 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2515 +time="2026-09-03T01:22:04-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2517 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2517 +time="2026-09-03T01:22:04-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2518 +time="2026-09-03T01:22:04-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2519 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2518 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2519 +time="2026-09-03T01:22:04-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2520 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2520 +time="2026-09-03T01:22:04-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2521 +time="2026-09-03T01:22:04-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2522 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2521 +time="2026-09-03T01:22:04-07:00" level=info msg=ConnectionClosed connectionID=2522 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2523 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2523 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2524 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2525 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2524 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2525 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2526 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2526 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2527 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2527 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2528 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2528 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2529 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2529 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2530 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2530 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2531 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2531 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2532 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2533 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2532 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2534 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2534 +time="2026-09-03T01:22:05-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:05.563640094 -0700 PDT m=+367.813084113" connectionDb=contract1788423671584rm connectionID=2533 error="backup 'backup_export' not found" queryTime="2026-09-03 01:22:05.759267009 -0700 PDT m=+368.008711012" +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2533 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2535 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2535 +time="2026-09-03T01:22:05-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2536 +time="2026-09-03T01:22:05-07:00" level=info msg=ConnectionClosed connectionID=2536 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2537 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2537 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2538 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2538 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2539 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2539 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2540 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2540 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2541 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2541 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2542 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2542 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2543 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2543 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2544 +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2545 +time="2026-09-03T01:22:06-07:00" level=info msg=ConnectionClosed connectionID=2544 +time="2026-09-03T01:22:06-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:06.712136244 -0700 PDT m=+368.961580263" connectionDb=contract1788423671584rm connectionID=2545 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:06.729434517 -0700 PDT m=+368.978878536" +time="2026-09-03T01:22:06-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2546 +time="2026-09-03T01:22:06-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:06.730081378 -0700 PDT m=+368.979525381" connectionDb=contract1788423671584rm connectionID=2546 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:06.731860681 -0700 PDT m=+368.981304716" +time="2026-09-03T01:22:06-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:06.730081378 -0700 PDT m=+368.979525381" connectionDb=contract1788423671584rm connectionID=2546 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:06.736715091 -0700 PDT m=+368.986159094" +time="2026-09-03T01:22:06-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:06.730081378 -0700 PDT m=+368.979525381" connectionDb=contract1788423671584rm connectionID=2546 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:06.744167393 -0700 PDT m=+368.993611396" +time="2026-09-03T01:22:10-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:06.730081378 -0700 PDT m=+368.979525381" connectionDb=contract1788423671584rm connectionID=2546 error="table not found: ignored_schema_migrations" queryTime="2026-09-03 01:22:10.197601984 -0700 PDT m=+372.447046019" +time="2026-09-03T01:22:11-07:00" level=info msg=ConnectionClosed connectionID=2546 +time="2026-09-03T01:22:11-07:00" level=info msg=ConnectionClosed connectionID=2545 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2547 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2547 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2548 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2549 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2548 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2549 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2550 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2550 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2551 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2552 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2551 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2552 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2553 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2553 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2554 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2555 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2554 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2556 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2555 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2557 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2556 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2557 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2558 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2558 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2559 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2559 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2560 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2560 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2561 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2561 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2562 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2562 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2563 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2563 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2564 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2564 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2565 +time="2026-09-03T01:22:12-07:00" level=info msg=ConnectionClosed connectionID=2565 +time="2026-09-03T01:22:12-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2566 +time="2026-09-03T01:22:12-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:12.990360872 -0700 PDT m=+375.239804891" connectionID=2566 error="database not found: contract1788423671584atomic" queryTime="2026-09-03 01:22:12.997889862 -0700 PDT m=+375.247333929" +time="2026-09-03T01:22:13-07:00" level=info msg=ConnectionClosed connectionID=2566 +time="2026-09-03T01:22:13-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2567 +time="2026-09-03T01:22:13-07:00" level=info msg=ConnectionClosed connectionID=2567 +time="2026-09-03T01:22:13-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2568 +time="2026-09-03T01:22:13-07:00" level=info msg=ConnectionClosed connectionID=2568 +time="2026-09-03T01:22:13-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2569 +time="2026-09-03T01:22:13-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2570 +time="2026-09-03T01:22:13-07:00" level=info msg=ConnectionClosed connectionID=2569 +time="2026-09-03T01:22:13-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:13.555444166 -0700 PDT m=+375.804888169" connectionDb=contract1788423671584atomic connectionID=2570 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:13.556604608 -0700 PDT m=+375.806048627" +time="2026-09-03T01:22:13-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2571 +time="2026-09-03T01:22:13-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:13.557135694 -0700 PDT m=+375.806579713" connectionDb=contract1788423671584atomic connectionID=2571 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:13.558172441 -0700 PDT m=+375.807616476" +time="2026-09-03T01:22:13-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:13.557135694 -0700 PDT m=+375.806579713" connectionDb=contract1788423671584atomic connectionID=2571 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:13.559629619 -0700 PDT m=+375.809073638" +time="2026-09-03T01:22:13-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:13.557135694 -0700 PDT m=+375.806579713" connectionDb=contract1788423671584atomic connectionID=2571 error="table not found: schema_migrations" queryTime="2026-09-03 01:22:13.561935864 -0700 PDT m=+375.811379883" +time="2026-09-03T01:22:17-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:13.557135694 -0700 PDT m=+375.806579713" connectionDb=contract1788423671584atomic connectionID=2571 error="table not found: ignored_schema_migrations" queryTime="2026-09-03 01:22:17.907433511 -0700 PDT m=+380.156877514" +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2571 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2570 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2572 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2572 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2573 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2574 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2573 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2574 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2575 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2575 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2576 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2577 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2576 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2577 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2578 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2578 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2579 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2580 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2579 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2580 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2581 +time="2026-09-03T01:22:19-07:00" level=info msg=ConnectionClosed connectionID=2581 +time="2026-09-03T01:22:19-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2582 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2582 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2583 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2583 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2584 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2584 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2585 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2585 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2586 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2586 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2587 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2587 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2588 +time="2026-09-03T01:22:20-07:00" level=warning msg="error running query" connectTime="2026-09-03 01:22:20.40636888 -0700 PDT m=+382.655812883" connectionID=2588 error="database not found: contract1788423671584rm" queryTime="2026-09-03 01:22:20.409390579 -0700 PDT m=+382.658834614" +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2588 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2589 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2589 +time="2026-09-03T01:22:20-07:00" level=info msg=NewConnection DisableClientMultiStatements=false connectionID=2590 +time="2026-09-03T01:22:20-07:00" level=info msg=ConnectionClosed connectionID=2590 +=========================== short test summary info ============================ +FAILED tests/cli/test_cli_surface.py::test_doctor_quick_succeeds_against_the_real_installed_bd +=================== 1 failed, 80 passed in 415.76s (0:06:55) =================== +make: *** [Makefile:34: test-cli] Error 1 diff --git a/docs/lanes/wp6-error-regex-scope/evidence/tier-integration.txt b/docs/lanes/wp6-error-regex-scope/evidence/tier-integration.txt new file mode 100644 index 0000000..a31c132 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/tier-integration.txt @@ -0,0 +1,384 @@ +=== make test-integration (tier 2) === +.venv/bin/python -m pytest -m integration tests/integration -v +============================= test session starts ============================== +platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/bin/python +cachedir: .pytest_cache +rootdir: /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker +configfile: pyproject.toml +plugins: anyio-4.15.0, asyncio-1.4.0, amplifier-core-1.6.1 +asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function +collecting ... collected 357 items + +tests/integration/test_blocker_chain_and_activity.py::test_get_with_links_reports_full_blocker_detail PASSED [ 0%] +tests/integration/test_blocker_chain_and_activity.py::test_get_with_links_blocking_clears_once_blocker_resolved PASSED [ 0%] +tests/integration/test_blocker_chain_and_activity.py::test_get_with_links_reports_discovered_from_both_directions PASSED [ 0%] +tests/integration/test_blocker_chain_and_activity.py::test_get_with_links_blocks_inverse_is_present_but_lean PASSED [ 1%] +tests/integration/test_blocker_chain_and_activity.py::test_activity_reports_created_claimed_commented_and_resolved PASSED [ 1%] +tests/integration/test_blocker_chain_and_activity.py::test_activity_on_a_fresh_item_is_just_created PASSED [ 1%] +tests/integration/test_blocker_chain_and_activity.py::test_activity_is_read_only_and_does_not_touch_status_or_holder PASSED [ 1%] +tests/integration/test_contention_hardening.py::test_project_summary_survives_concurrent_writes PASSED [ 2%] +tests/integration/test_contention_hardening.py::test_20_concurrent_resolves_land_cleanly_with_zero_caller_spacing PASSED [ 2%] +tests/integration/test_contention_hardening.py::test_reported_write_failures_never_silently_land PASSED [ 2%] +tests/integration/test_contract_assumptions.py::test_bd_version_is_within_the_supported_window PASSED [ 3%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[capabilities] PASSED [ 3%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[resolve.fenced] PASSED [ 3%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[resolve.divergent_text_refused] PASSED [ 3%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[resolve.identical_text_idempotent] PASSED [ 4%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[reopen.reopens] PASSED [ 4%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[reopen.clears_closed_at] PASSED [ 4%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[reopen.close_reason_disposition] PASSED [ 5%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[reopen.emits_event] PASSED [ 5%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[release.reopens_unresolved] PASSED [ 5%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[claim.subcommand] PASSED [ 5%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[claim.atomic] PASSED [ 6%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[claim.directed_atomic] PASSED [ 6%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[link.nonblocking] PASSED [ 6%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[list.includes_closed] PASSED [ 7%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[list.status_filter_includes_closed] PASSED [ 7%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[show.dependents] PASSED [ 7%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[read.no_mutation] PASSED [ 7%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[resolution.readable] PASSED [ 8%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[timestamps.readable] PASSED [ 8%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[metadata.roundtrip] PASSED [ 8%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[project.name_rules] PASSED [ 8%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[custody.fresh_survives] PASSED [ 9%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[custody.stale_reclaimed] PASSED [ 9%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[custody.idle_not_exempt] PASSED [ 9%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[custody.fenced] PASSED [ 10%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[project.removal] PASSED [ 10%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[project.create_atomic] PASSED [ 10%] +tests/integration/test_contract_assumptions.py::test_contract_assumption_holds[project.creation_state_reporting] PASSED [ 10%] +tests/integration/test_create_related.py::test_create_with_relates_to_records_a_visible_edge PASSED [ 11%] +tests/integration/test_create_related.py::test_create_with_supersedes_records_a_visible_edge PASSED [ 11%] +tests/integration/test_create_related.py::test_create_with_follow_up_of_maps_to_discovered_from PASSED [ 11%] +tests/integration/test_create_related.py::test_create_with_multiple_related_entries_records_all PASSED [ 12%] +tests/integration/test_create_related.py::test_create_refuses_whole_create_on_unknown_relation_kind PASSED [ 12%] +tests/integration/test_create_related.py::test_create_without_related_is_unchanged PASSED [ 12%] +tests/integration/test_defer_block.py::test_defer_moves_status_and_stores_reason PASSED [ 12%] +tests/integration/test_defer_block.py::test_deferred_item_stays_visible_in_default_list_and_by_explicit_status PASSED [ 13%] +tests/integration/test_defer_block.py::test_deferred_item_is_skipped_by_claim_next PASSED [ 13%] +tests/integration/test_defer_block.py::test_undefer_moves_item_back_to_open_and_clears_reason PASSED [ 13%] +tests/integration/test_defer_block.py::test_undefer_refuses_when_not_deferred PASSED [ 14%] +tests/integration/test_defer_block.py::test_defer_refuses_without_a_reason PASSED [ 14%] +tests/integration/test_defer_block.py::test_block_moves_status_and_stores_reason PASSED [ 14%] +tests/integration/test_defer_block.py::test_blocked_item_is_skipped_by_claim_next PASSED [ 14%] +tests/integration/test_defer_block.py::test_unblock_moves_item_back_to_open_and_clears_reason PASSED [ 15%] +tests/integration/test_defer_block.py::test_unblock_refuses_when_not_blocked PASSED [ 15%] +tests/integration/test_defer_block.py::test_defer_and_block_reasons_never_collide PASSED [ 15%] +tests/integration/test_dependency.py::test_add_dependency_creates_edge_visible_via_get_with_links PASSED [ 15%] +tests/integration/test_dependency.py::test_get_readonly_with_links_displays_the_same_edge PASSED [ 16%] +tests/integration/test_dependency.py::test_claim_refuses_naming_the_dependency_created_via_add_dependency PASSED [ 16%] +tests/integration/test_dependency.py::test_resolving_the_blocker_makes_the_blocked_item_claimable PASSED [ 16%] +tests/integration/test_dependency.py::test_add_dependency_with_non_blocking_type_is_not_a_claim_blocker PASSED [ 17%] +tests/integration/test_dependency.py::test_add_dependency_refuses_on_nonexistent_target PASSED [ 17%] +tests/integration/test_directed_claim.py::test_claim_item_succeeds_on_a_free_item PASSED [ 17%] +tests/integration/test_directed_claim.py::test_claim_item_is_idempotent_for_the_same_actor PASSED [ 17%] +tests/integration/test_directed_claim.py::test_claim_item_refuses_when_already_held_by_someone_else PASSED [ 18%] +tests/integration/test_directed_claim.py::test_claim_item_refuses_on_nonexistent_id PASSED [ 18%] +tests/integration/test_directed_claim.py::test_claim_item_refuses_when_blocked_by_an_open_dependency PASSED [ 18%] +tests/integration/test_directed_claim.py::test_claim_item_succeeds_once_the_blocker_is_closed PASSED [ 19%] +tests/integration/test_directed_claim.py::test_claim_next_queue_path_is_unaffected_by_claim_item_existing PASSED [ 19%] +tests/integration/test_gateway_authz.py::test_no_token_is_401 PASSED [ 19%] +tests/integration/test_gateway_authz.py::test_bad_token_is_401 PASSED [ 19%] +tests/integration/test_gateway_authz.py::test_identity_spoof_via_query_param_is_403 PASSED [ 20%] +tests/integration/test_gateway_authz.py::test_identity_spoof_via_body_field_is_403 PASSED [ 20%] +tests/integration/test_gateway_authz.py::test_cross_reporter_read_is_404_not_403 PASSED [ 20%] +tests/integration/test_gateway_authz.py::test_redaction_is_applied_at_the_storage_layer_not_just_the_api_echo PASSED [ 21%] +tests/integration/test_gateway_authz.py::test_reporter_only_sees_their_own_reports_in_the_list_view PASSED [ 21%] +tests/integration/test_gateway_authz.py::test_healthz_requires_no_auth PASSED [ 21%] +tests/integration/test_get_via_sql_equivalence.py::test_get_open_item_matches_old_path_exactly PASSED [ 21%] +tests/integration/test_get_via_sql_equivalence.py::test_get_held_item_matches_old_path_exactly PASSED [ 22%] +tests/integration/test_get_via_sql_equivalence.py::test_get_resolved_item_matches_old_path_exactly PASSED [ 22%] +tests/integration/test_get_via_sql_equivalence.py::test_get_unknown_item_raises_same_way_as_old_path PASSED [ 22%] +tests/integration/test_get_via_sql_equivalence.py::test_get_free_text_with_commas_and_newlines_survives_intact PASSED [ 22%] +tests/integration/test_get_via_sql_equivalence.py::test_get_metadata_dict_round_trips_via_sql_path PASSED [ 23%] +tests/integration/test_get_via_sql_equivalence.py::test_get_priority_is_int_not_string_via_sql_path PASSED [ 23%] +tests/integration/test_get_via_sql_equivalence.py::test_get_via_sql_never_mutates_anything PASSED [ 23%] +tests/integration/test_get_via_sql_equivalence.py::test_get_readonly_real_missing_item_reports_not_found PASSED [ 24%] +tests/integration/test_get_via_sql_equivalence.py::test_get_readonly_real_wrong_project_prefix_reports_mismatch PASSED [ 24%] +tests/integration/test_get_via_sql_equivalence.py::test_get_with_links_still_returns_dependency_graph PASSED [ 24%] +tests/integration/test_item_edit.py::test_edit_item_changes_fields_and_leaves_audit_comment PASSED [ 24%] +tests/integration/test_item_edit.py::test_edit_item_refuses_with_no_fields PASSED [ 25%] +tests/integration/test_item_edit.py::test_edit_item_only_names_fields_that_actually_changed PASSED [ 25%] +tests/integration/test_item_edit.py::test_comment_appends_and_is_readable PASSED [ 25%] +tests/integration/test_item_edit.py::test_supersede_closes_original_with_structural_reference PASSED [ 26%] +tests/integration/test_item_edit.py::test_supersede_refuses_when_replacement_missing PASSED [ 26%] +tests/integration/test_item_move.py::test_move_moves_item_preserves_id_and_body PASSED [ 26%] +tests/integration/test_item_move.py::test_move_refuses_while_item_is_held PASSED [ 26%] +tests/integration/test_item_move.py::test_move_refuses_when_item_missing PASSED [ 27%] +tests/integration/test_item_move.py::test_move_twice_raises_cleanly_the_second_time PASSED [ 27%] +tests/integration/test_item_move.py::test_move_refuses_when_src_missing PASSED [ 27%] +tests/integration/test_item_move.py::test_move_refuses_when_dst_missing PASSED [ 28%] +tests/integration/test_item_move.py::test_move_refuses_when_src_equals_dst PASSED [ 28%] +tests/integration/test_item_move.py::test_move_rejects_invalid_project_names PASSED [ 28%] +tests/integration/test_item_move.py::test_move_refuses_when_item_already_exists_at_destination PASSED [ 28%] +tests/integration/test_item_move.py::test_move_drops_cross_project_dependency_edge PASSED [ 29%] +tests/integration/test_item_move.py::test_move_preserves_dependency_edge_to_non_issue_target PASSED [ 29%] +tests/integration/test_list_via_sql_equivalence.py::test_list_default_matches_old_path_excludes_only_closed PASSED [ 29%] +tests/integration/test_list_via_sql_equivalence.py::test_list_include_resolved_matches_old_path_exactly PASSED [ 29%] +tests/integration/test_list_via_sql_equivalence.py::test_list_ordering_matches_old_path_created_at_desc PASSED [ 30%] +tests/integration/test_list_via_sql_equivalence.py::test_list_ordering_prefers_lower_priority_number_over_creation_order PASSED [ 30%] +tests/integration/test_list_via_sql_equivalence.py::test_list_status_filter_matches_old_path[blocked] PASSED [ 30%] +tests/integration/test_list_via_sql_equivalence.py::test_list_status_filter_matches_old_path[deferred] PASSED [ 31%] +tests/integration/test_list_via_sql_equivalence.py::test_list_status_filter_matches_old_path[held] PASSED [ 31%] +tests/integration/test_list_via_sql_equivalence.py::test_list_status_filter_matches_old_path[open] PASSED [ 31%] +tests/integration/test_list_via_sql_equivalence.py::test_list_status_filter_matches_old_path[resolved] PASSED [ 31%] +tests/integration/test_list_via_sql_equivalence.py::test_list_unknown_status_raises_same_way_as_old_path PASSED [ 32%] +tests/integration/test_list_via_sql_equivalence.py::test_list_lane_filter_matches_old_path PASSED [ 32%] +tests/integration/test_list_via_sql_equivalence.py::test_list_lane_plus_include_resolved_matches_old_path PASSED [ 32%] +tests/integration/test_list_via_sql_equivalence.py::test_list_limit_zero_is_unlimited_like_old_path PASSED [ 33%] +tests/integration/test_list_via_sql_equivalence.py::test_list_explicit_limit_matches_old_path PASSED [ 33%] +tests/integration/test_list_via_sql_equivalence.py::test_list_default_limit_is_50_like_bd PASSED [ 33%] +tests/integration/test_list_via_sql_equivalence.py::test_list_free_text_with_commas_and_newlines_survives_intact PASSED [ 33%] +tests/integration/test_list_via_sql_equivalence.py::test_list_metadata_dict_round_trips_via_sql_path PASSED [ 34%] +tests/integration/test_list_via_sql_equivalence.py::test_list_priority_is_int_not_string_via_sql_path PASSED [ 34%] +tests/integration/test_list_via_sql_equivalence.py::test_list_unset_optional_fields_are_none_not_empty_string PASSED [ 34%] +tests/integration/test_list_via_sql_equivalence.py::test_list_via_sql_never_mutates_anything PASSED [ 35%] +tests/integration/test_list_via_sql_equivalence.py::test_list_on_empty_project_returns_empty_not_an_error PASSED [ 35%] +tests/integration/test_no_database_residue.py::test_probe_drops_its_database_on_exit PASSED [ 35%] +tests/integration/test_no_database_residue.py::test_probe_drops_databases_registered_by_a_check PASSED [ 35%] +tests/integration/test_no_database_residue.py::test_probe_exit_is_idempotent_over_an_already_dropped_database PASSED [ 36%] +tests/integration/test_no_database_residue.py::test_drop_project_removes_both_halves PASSED [ 36%] +tests/integration/test_no_database_residue.py::test_drop_project_is_a_no_op_for_a_project_that_was_never_created PASSED [ 36%] +tests/integration/test_observatory_aggregates.py::test_velocity_series_zero_fills_and_buckets_by_calendar_day PASSED [ 36%] +tests/integration/test_observatory_aggregates.py::test_velocity_series_reports_real_zero_for_wholly_quiet_project PASSED [ 37%] +tests/integration/test_observatory_aggregates.py::test_velocity_windows_current_vs_previous_and_delta PASSED [ 37%] +tests/integration/test_observatory_aggregates.py::test_velocity_windows_delta_pct_none_when_previous_is_zero PASSED [ 37%] +tests/integration/test_observatory_aggregates.py::test_reopened_count_counts_real_reopen_events PASSED [ 38%] +tests/integration/test_observatory_aggregates.py::test_reopened_count_zero_for_project_with_no_reopens PASSED [ 38%] +tests/integration/test_observatory_aggregates.py::test_reopened_count_also_counts_reopen_via_plain_status_update PASSED [ 38%] +tests/integration/test_observatory_aggregates.py::test_reopened_count_respects_window_boundary PASSED [ 38%] +tests/integration/test_observatory_aggregates.py::test_project_agents_reports_fresh_holder PASSED [ 39%] +tests/integration/test_observatory_aggregates.py::test_project_agents_reports_stale_holder_with_overage PASSED [ 39%] +tests/integration/test_observatory_aggregates.py::test_project_agents_no_custody_record_counts_as_stale_unmeasurable PASSED [ 39%] +tests/integration/test_observatory_aggregates.py::test_project_agents_excludes_unheld_items PASSED [ 40%] +tests/integration/test_observatory_aggregates.py::test_project_agents_sorts_stale_first_then_by_freshness PASSED [ 40%] +tests/integration/test_observatory_aggregates.py::test_agents_snapshot_spans_every_project PASSED [ 40%] +tests/integration/test_observatory_aggregates.py::test_agents_snapshot_from_rows_matches_agents_snapshot PASSED [ 40%] +tests/integration/test_observatory_aggregates.py::test_agent_stats_single_project_counts_resolved_and_held PASSED [ 41%] +tests/integration/test_observatory_aggregates.py::test_agent_stats_resolved_respects_window PASSED [ 41%] +tests/integration/test_observatory_aggregates.py::test_agent_stats_across_whole_workspace PASSED [ 41%] +tests/integration/test_observatory_aggregates.py::test_agent_stats_zero_for_unknown_agent PASSED [ 42%] +tests/integration/test_observatory_aggregates.py::test_attention_items_ranks_stale_custody_first PASSED [ 42%] +tests/integration/test_observatory_aggregates.py::test_attention_items_ranks_blocked_second PASSED [ 42%] +tests/integration/test_observatory_aggregates.py::test_attention_items_ranks_aging_ready_third_oldest_first PASSED [ 42%] +tests/integration/test_observatory_aggregates.py::test_attention_items_ordering_across_reasons_and_limit PASSED [ 43%] +tests/integration/test_observatory_aggregates.py::test_attention_items_aging_threshold_is_a_module_constant PASSED [ 43%] +tests/integration/test_observatory_aggregates.py::test_stale_attention_rows_matches_attention_items_stale_tier PASSED [ 43%] +tests/integration/test_observatory_aggregates.py::test_attention_items_from_rows_matches_attention_items PASSED [ 43%] +tests/integration/test_observatory_aggregates.py::test_velocity_series_and_windows_matches_separate_calls PASSED [ 44%] +tests/integration/test_observatory_aggregates.py::test_project_summary_held_stale_reflects_real_custody_state PASSED [ 44%] +tests/integration/test_observatory_aggregates.py::test_project_summary_held_stale_zero_and_none_when_nothing_held PASSED [ 44%] +tests/integration/test_observatory_aggregates.py::test_project_summary_held_stale_all_fresh_is_zero_not_fabricated PASSED [ 45%] +tests/integration/test_observatory_web.py::test_l0_renders_environment_kpis_and_fleet_from_real_data PASSED [ 45%] +tests/integration/test_observatory_web.py::test_l0_window_tabs_are_real_server_rendered_links_with_active_state PASSED [ 45%] +tests/integration/test_observatory_web.py::test_l0_unknown_window_param_falls_back_to_7d_not_a_500 PASSED [ 45%] +tests/integration/test_observatory_web.py::test_l0_page_declares_dark_theme_by_default PASSED [ 46%] +tests/integration/test_observatory_web.py::test_l0_new_project_nav_action_is_a_quiet_icon_button PASSED [ 46%] +tests/integration/test_observatory_web.py::test_l1_status_tab_changes_server_side_filter_state PASSED [ 46%] +tests/integration/test_observatory_web.py::test_resolve_post_without_confirm_field_is_refused PASSED [ 47%] +tests/integration/test_observatory_web.py::test_resolve_post_with_wrong_confirm_value_is_refused PASSED [ 47%] +tests/integration/test_observatory_web.py::test_resolve_post_with_confirm_yes_succeeds PASSED [ 47%] +tests/integration/test_observatory_web.py::test_l2_confirm_resolve_query_param_reveals_the_confirm_form PASSED [ 47%] +tests/integration/test_observatory_web.py::test_l0_every_icon_ref_has_a_matching_sprite_symbol PASSED [ 48%] +tests/integration/test_observatory_web.py::test_l1_every_icon_ref_has_a_matching_sprite_symbol PASSED [ 48%] +tests/integration/test_observatory_web.py::test_l2_every_icon_ref_has_a_matching_sprite_symbol PASSED [ 48%] +tests/integration/test_observatory_web.py::test_login_page_every_icon_ref_has_a_matching_sprite_symbol PASSED [ 49%] +tests/integration/test_phantom_conflict_recovery.py::test_resolve_verifies_by_readback_when_wrapper_reports_conflict_after_a_landed_close PASSED [ 49%] +tests/integration/test_phantom_conflict_recovery.py::test_resolve_still_raises_when_readback_shows_the_close_genuinely_did_not_land PASSED [ 49%] +tests/integration/test_phantom_conflict_recovery.py::test_release_verifies_by_readback_when_wrapper_reports_conflict_after_a_landed_release PASSED [ 49%] +tests/integration/test_phantom_conflict_recovery.py::test_release_on_an_already_resolved_item_writes_nothing_and_reports_already_closed PASSED [ 50%] +tests/integration/test_post_reclaim_fence.py::test_stale_holder_close_is_refused_after_a_real_reap PASSED [ 50%] +tests/integration/test_post_reclaim_fence.py::test_stale_holder_close_is_refused_after_release_without_reclaim PASSED [ 50%] +tests/integration/test_post_reclaim_fence.py::test_integrator_close_of_a_reclaimed_item_still_succeeds PASSED [ 50%] +tests/integration/test_post_reclaim_fence.py::test_current_holder_can_still_close_the_item_it_actually_holds PASSED [ 51%] +tests/integration/test_post_reclaim_fence.py::test_fence_does_not_fire_on_a_close_this_holder_already_landed PASSED [ 51%] +tests/integration/test_project_removal.py::test_remove_of_nonexistent_project_gives_a_distinct_error PASSED [ 51%] +tests/integration/test_project_removal.py::test_remove_drops_both_the_directory_and_the_database PASSED [ 52%] +tests/integration/test_project_removal.py::test_remove_refuses_while_an_item_is_held_naming_holder_and_item PASSED [ 52%] +tests/integration/test_project_removal.py::test_remove_leaves_non_beads_content_intact_and_reports_it PASSED [ 52%] +tests/integration/test_project_removal.py::test_remove_of_orphaned_database_after_directory_already_deleted PASSED [ 52%] +tests/integration/test_project_removal.py::test_remove_of_orphaned_database_with_a_held_item_still_refuses PASSED [ 53%] +tests/integration/test_project_removal.py::test_new_after_directory_deleted_reattaches_and_workspace_create_reports_it PASSED [ 53%] +tests/integration/test_project_rename.py::test_rename_moves_dir_and_database_and_preserves_items PASSED [ 53%] +tests/integration/test_project_rename.py::test_rename_refuses_when_new_name_already_exists PASSED [ 54%] +tests/integration/test_project_rename.py::test_rename_refuses_when_old_missing PASSED [ 54%] +tests/integration/test_project_rename.py::test_rename_refuses_while_an_item_is_held PASSED [ 54%] +tests/integration/test_project_rename.py::test_rename_rejects_invalid_new_name PASSED [ 54%] +tests/integration/test_project_rename.py::test_rename_to_itself_is_refused PASSED [ 55%] +tests/integration/test_reopen_roundtrip.py::test_full_correction_cycle_reopen_claim_resolve_reads_back_corrected_text PASSED [ 55%] +tests/integration/test_reopen_roundtrip.py::test_reopen_clears_closed_at_and_the_cost_is_visible PASSED [ 55%] +tests/integration/test_reopen_roundtrip.py::test_reopen_clears_the_stale_assignee_bd_leaves_behind PASSED [ 56%] +tests/integration/test_reopen_roundtrip.py::test_resolve_on_a_closed_item_with_divergent_text_refuses_and_writes_nothing PASSED [ 56%] +tests/integration/test_reopen_roundtrip.py::test_resolve_on_a_closed_item_with_identical_text_is_idempotent PASSED [ 56%] +tests/integration/test_reopen_roundtrip.py::test_reopen_refuses_an_item_that_is_not_resolved PASSED [ 56%] +tests/integration/test_reopen_roundtrip.py::test_reopen_twice_refuses_the_second_time PASSED [ 57%] +tests/integration/test_reopen_roundtrip.py::test_measured_close_reason_disposition_across_a_reopen PASSED [ 57%] +tests/integration/test_resolve_fence.py::test_resolve_succeeds_single_call_on_unheld_item_with_stale_custody PASSED [ 57%] +tests/integration/test_resolve_fence.py::test_resolve_succeeds_on_item_filed_by_someone_else_never_held PASSED [ 57%] +tests/integration/test_resolve_fence.py::test_resolve_still_refuses_and_names_holder_when_actively_held_by_someone_else PASSED [ 58%] +tests/integration/test_resolve_fence.py::test_resolve_still_refuses_with_custody_takeover_mismatch_while_held PASSED [ 58%] +tests/integration/test_roundtrip.py::test_create_claim_resolve_roundtrip PASSED [ 58%] +tests/integration/test_roundtrip.py::test_claim_returns_none_on_an_empty_lane PASSED [ 59%] +tests/integration/test_roundtrip.py::test_notifier_flips_linked_report_and_reporter_reads_back_the_resolution PASSED [ 59%] +tests/integration/test_web.py::test_unauthenticated_request_to_dashboard_is_refused_json PASSED [ 59%] +tests/integration/test_web.py::test_unauthenticated_request_to_dashboard_redirects_browser PASSED [ 59%] +tests/integration/test_web.py::test_healthz_is_exempt_from_auth PASSED [ 60%] +tests/integration/test_web.py::test_login_wrong_password_is_rejected_and_sets_no_cookie PASSED [ 60%] +tests/integration/test_web.py::test_login_success_sets_cookie_and_grants_dashboard_access PASSED [ 60%] +tests/integration/test_web.py::test_logout_clears_session PASSED [ 61%] +tests/integration/test_web.py::test_dashboard_shows_real_project_from_the_shared_workspace PASSED [ 61%] +tests/integration/test_web.py::test_project_view_shows_items_with_holder_and_status PASSED [ 61%] +tests/integration/test_web.py::test_full_write_flow_create_add_resolve_remove PASSED [ 61%] +tests/integration/test_web.py::test_remove_refuses_when_item_is_held_and_project_survives PASSED [ 62%] +tests/integration/test_web.py::test_remove_requires_typed_name_to_match PASSED [ 62%] +tests/integration/test_web.py::test_no_claim_route_exists PASSED [ 62%] +tests/integration/test_web.py::test_item_detail_shows_description_and_acceptance_criteria PASSED [ 63%] +tests/integration/test_web.py::test_item_detail_reachable_from_project_listing PASSED [ 63%] +tests/integration/test_web.py::test_item_detail_open_item_shows_no_lifecycle_action PASSED [ 63%] +tests/integration/test_web.py::test_item_detail_held_item_shows_resolve_not_claim PASSED [ 63%] +tests/integration/test_web.py::test_item_detail_resolved_item_shows_resolution_and_no_action_controls PASSED [ 64%] +tests/integration/test_web.py::test_item_detail_nonexistent_item_shows_friendly_error PASSED [ 64%] +tests/integration/test_web.py::test_item_detail_shows_blocked_by_chain_with_status_and_holder PASSED [ 64%] +tests/integration/test_web.py::test_item_detail_blocker_chain_clears_once_blocker_resolved PASSED [ 64%] +tests/integration/test_web.py::test_item_detail_shows_discovered_from_provenance PASSED [ 65%] +tests/integration/test_web.py::test_item_detail_shows_blocks_inverse PASSED [ 65%] +tests/integration/test_web.py::test_item_detail_with_no_dependencies_shows_no_open_blockers_empty_state PASSED [ 65%] +tests/integration/test_web.py::test_item_detail_with_unsatisfied_blocker_does_not_also_show_no_open_blockers PASSED [ 66%] +tests/integration/test_web.py::test_item_detail_shows_activity_feed_with_real_events PASSED [ 66%] +tests/integration/test_web.py::test_item_detail_fresh_item_activity_feed_shows_only_created PASSED [ 66%] +tests/integration/test_web.py::test_no_claim_affordance_anywhere_in_the_web_ui PASSED [ 66%] +tests/integration/test_web.py::test_dashboard_held_item_raises_the_custody_reading PASSED [ 67%] +tests/integration/test_web.py::test_dashboard_never_shows_a_static_health_ok_badge PASSED [ 67%] +tests/integration/test_web.py::test_project_view_empty_filter_state_names_the_filter_and_offers_clear PASSED [ 67%] +tests/integration/test_web.py::test_add_item_error_on_nonexistent_project_does_not_leak_path_or_cli PASSED [ 68%] +tests/integration/test_web.py::test_project_view_pagination_reachability_and_no_cli_flag_leak PASSED [ 68%] +tests/integration/test_web.py::test_dashboard_kpi_values_are_tabular_numerals PASSED [ 68%] +tests/integration/test_web.py::test_dashboard_fleet_row_is_a_real_link_to_the_project PASSED [ 68%] +tests/integration/test_web.py::test_item_detail_humanizes_the_reported_by_identity_end_to_end SKIPPED [ 69%] +tests/integration/test_web.py::test_remove_confirmation_page_is_real_and_get_is_side_effect_free PASSED [ 69%] +tests/integration/test_web.py::test_remove_held_refusal_is_rendered_as_visible_text_on_the_confirm_page PASSED [ 69%] +tests/integration/test_web.py::test_item_detail_edit_form_saves_and_persists_on_reload PASSED [ 70%] +tests/integration/test_web.py::test_item_detail_edit_form_is_present_and_prefilled PASSED [ 70%] +tests/integration/test_web.py::test_item_detail_edit_does_not_touch_status_or_holder PASSED [ 70%] +tests/integration/test_web.py::test_item_detail_edit_blank_fields_leave_existing_values_unchanged PASSED [ 70%] +tests/integration/test_web.py::test_item_detail_edit_nonexistent_item_reports_error PASSED [ 71%] +tests/integration/test_web.py::test_rename_project_success_redirects_to_new_name PASSED [ 71%] +tests/integration/test_web.py::test_rename_project_rejects_invalid_new_name PASSED [ 71%] +tests/integration/test_web.py::test_rename_project_refuses_when_target_name_already_exists PASSED [ 71%] +tests/integration/test_web.py::test_rename_project_refuses_while_item_is_held PASSED [ 72%] +tests/integration/test_web.py::test_danger_zone_has_rename_form_and_no_claim_control PASSED [ 72%] +tests/integration/test_web.py::test_danger_zone_rename_affordance_is_unambiguous_reveal_save_cancel PASSED [ 72%] +tests/integration/test_web.py::test_resolved_item_row_shows_no_holder_chip_though_it_has_a_stale_assignee PASSED [ 73%] +tests/integration/test_web.py::test_resolved_item_detail_shows_no_held_by_chip PASSED [ 73%] +tests/integration/test_web.py::test_dashboard_includes_auto_refresh_script PASSED [ 73%] +tests/integration/test_web.py::test_project_view_includes_auto_refresh_script PASSED [ 73%] +tests/integration/test_web.py::test_item_detail_never_includes_auto_refresh_script PASSED [ 74%] +tests/integration/test_web.py::test_login_page_never_includes_auto_refresh_script PASSED [ 74%] +tests/integration/test_web.py::test_remove_confirm_page_never_includes_auto_refresh_script PASSED [ 74%] +tests/integration/test_web.py::test_project_view_status_tabs_show_real_counts PASSED [ 75%] +tests/integration/test_web.py::test_project_view_clicking_a_status_tab_filters_the_list PASSED [ 75%] +tests/integration/test_web.py::test_project_view_no_longer_ships_a_status_select_dropdown PASSED [ 75%] +tests/integration/test_web.py::test_project_view_health_banner_absent_when_calm PASSED [ 75%] +tests/integration/test_web.py::test_project_view_health_banner_present_when_blocked PASSED [ 76%] +tests/integration/test_web.py::test_project_view_health_banner_calm_when_held_but_fresh PASSED [ 76%] +tests/integration/test_web.py::test_project_view_item_rows_include_priority_bar_and_status_icon PASSED [ 76%] +tests/integration/test_web.py::test_item_detail_created_and_updated_use_the_compact_age_format PASSED [ 77%] +tests/integration/test_web.py::test_project_view_search_placeholder_uses_the_new_filter_hint PASSED [ 77%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/manifest.json] PASSED [ 77%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/sw.js] PASSED [ 77%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/pwa-192.png] PASSED [ 78%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/pwa-512.png] PASSED [ 78%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/apple-touch-icon.png] PASSED [ 78%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/favicon.ico] PASSED [ 78%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/favicon-32.png] PASSED [ 79%] +tests/integration/test_web_pwa.py::test_pwa_asset_is_reachable_without_authentication[/og-dark.png] PASSED [ 79%] +tests/integration/test_web_pwa.py::test_manifest_content_type_and_cache_header PASSED [ 79%] +tests/integration/test_web_pwa.py::test_manifest_is_valid_json_with_scope_root_and_standalone_display PASSED [ 80%] +tests/integration/test_web_pwa.py::test_manifest_lists_both_icon_sizes_with_a_maskable_purpose PASSED [ 80%] +tests/integration/test_web_pwa.py::test_service_worker_content_type_and_cache_header PASSED [ 80%] +tests/integration/test_web_pwa.py::test_service_worker_caches_nothing PASSED [ 80%] +tests/integration/test_web_pwa.py::test_service_worker_passes_every_fetch_straight_to_the_network PASSED [ 81%] +tests/integration/test_web_pwa.py::test_service_worker_skips_waiting_and_claims_clients PASSED [ 81%] +tests/integration/test_web_pwa.py::test_icon_is_a_real_png_with_correct_content_type_and_cache_header[/pwa-192.png-\x89PNG\r\n\x1a\n] PASSED [ 81%] +tests/integration/test_web_pwa.py::test_icon_is_a_real_png_with_correct_content_type_and_cache_header[/pwa-512.png-\x89PNG\r\n\x1a\n] PASSED [ 82%] +tests/integration/test_web_pwa.py::test_icon_is_a_real_png_with_correct_content_type_and_cache_header[/apple-touch-icon.png-\x89PNG\r\n\x1a\n] PASSED [ 82%] +tests/integration/test_web_pwa.py::test_favicon_ico_content_type_cache_header_and_real_ico_magic PASSED [ 82%] +tests/integration/test_web_pwa.py::test_favicon_ico_bundles_all_three_resolutions PASSED [ 82%] +tests/integration/test_web_pwa.py::test_favicon_32_png_is_a_real_png_with_correct_content_type_and_cache_header PASSED [ 83%] +tests/integration/test_web_pwa.py::test_og_card_is_a_real_png_with_correct_content_type_and_cache_header PASSED [ 83%] +tests/integration/test_web_pwa.py::test_pwa_512_and_apple_touch_icon_are_opaque_maskable_safe_renders SKIPPED [ 83%] +tests/integration/test_web_pwa.py::test_pwa_192_keeps_the_source_icons_native_transparent_corners SKIPPED [ 84%] +tests/integration/test_web_pwa.py::test_authenticated_dashboard_head_includes_pwa_tags PASSED [ 84%] +tests/integration/test_web_pwa.py::test_login_page_head_also_includes_pwa_tags PASSED [ 84%] +tests/integration/test_webbrowse_route.py::test_retired_browse_route_redirects_to_l1_without_item_param PASSED [ 84%] +tests/integration/test_webbrowse_route.py::test_retired_browse_route_redirects_to_l2_with_item_param PASSED [ 85%] +tests/integration/test_webbrowse_route.py::test_l1_lists_items_as_direct_links_to_l2 PASSED [ 85%] +tests/integration/test_webbrowse_route.py::test_l2_shows_the_real_item_content PASSED [ 85%] +tests/integration/test_webbrowse_route.py::test_l2_unknown_item_is_graceful_not_500 PASSED [ 85%] +tests/integration/test_webbrowse_route.py::test_l1_unknown_project_is_graceful PASSED [ 86%] +tests/integration/test_webbrowse_route.py::test_l1_and_l2_ship_the_auto_refresh_poller PASSED [ 86%] +tests/integration/test_webbrowse_route.py::test_l1_and_l2_reflect_status_transitions_live PASSED [ 86%] +tests/integration/test_work_list.py::test_list_bounded_reports_id_title_status_for_an_open_item PASSED [ 87%] +tests/integration/test_work_list.py::test_list_bounded_populates_holder_for_a_held_item PASSED [ 87%] +tests/integration/test_work_list.py::test_list_bounded_shows_closed_items_and_their_resolution PASSED [ 87%] +tests/integration/test_work_list.py::test_list_bounded_mixed_states_in_one_project PASSED [ 87%] +tests/integration/test_work_list.py::test_list_bounded_status_filter_returns_only_matching_status[blocked] PASSED [ 88%] +tests/integration/test_work_list.py::test_list_bounded_status_filter_returns_only_matching_status[deferred] PASSED [ 88%] +tests/integration/test_work_list.py::test_list_bounded_status_filter_returns_only_matching_status[held] PASSED [ 88%] +tests/integration/test_work_list.py::test_list_bounded_status_filter_returns_only_matching_status[open] PASSED [ 89%] +tests/integration/test_work_list.py::test_list_bounded_status_filter_returns_only_matching_status[resolved] PASSED [ 89%] +tests/integration/test_work_list.py::test_list_bounded_calling_it_does_not_mutate_anything PASSED [ 89%] +tests/integration/test_work_list.py::test_list_bounded_truncates_and_reports_honestly PASSED [ 89%] +tests/integration/test_work_list.py::test_list_bounded_on_empty_project_returns_empty_not_an_error PASSED [ 90%] +tests/integration/test_work_list.py::test_list_bounded_on_nonexistent_project_raises_distinct_not_found PASSED [ 90%] +tests/integration/test_work_list.py::test_list_bounded_rows_are_lean_by_default_no_body_fields PASSED [ 90%] +tests/integration/test_work_list.py::test_get_readonly_reads_the_real_full_body_without_claiming PASSED [ 91%] +tests/integration/test_work_list.py::test_get_readonly_on_resolved_item_shows_resolution_too PASSED [ 91%] +tests/integration/test_work_list.py::test_get_readonly_never_mutates_the_item PASSED [ 91%] +tests/integration/test_work_list.py::test_get_readonly_on_nonexistent_item_in_this_project_raises_not_found PASSED [ 91%] +tests/integration/test_work_list.py::test_get_readonly_on_id_from_a_different_project_raises_distinct_wrong_project_error PASSED [ 92%] +tests/integration/test_write_readback.py::test_release_raises_when_bd_reports_success_but_the_hold_did_not_clear PASSED [ 92%] +tests/integration/test_write_readback.py::test_release_success_path_returns_only_after_the_readback_shows_no_hold PASSED [ 92%] +tests/integration/test_write_readback.py::test_claim_item_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 92%] +tests/integration/test_write_readback.py::test_claim_item_still_raises_when_the_claim_genuinely_did_not_land PASSED [ 93%] +tests/integration/test_write_readback.py::test_claim_item_raises_when_bd_reports_success_but_nobody_holds_the_item PASSED [ 93%] +tests/integration/test_write_readback.py::test_claim_next_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 93%] +tests/integration/test_write_readback.py::test_claim_next_still_raises_when_the_claim_genuinely_did_not_land PASSED [ 94%] +tests/integration/test_write_readback.py::test_claim_next_raises_when_bd_names_an_item_it_never_actually_claimed PASSED [ 94%] +tests/integration/test_write_readback.py::test_claim_next_on_an_empty_queue_is_still_a_normal_none PASSED [ 94%] +tests/integration/test_write_readback.py::test_create_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 94%] +tests/integration/test_write_readback.py::test_create_still_raises_when_the_create_genuinely_did_not_land PASSED [ 95%] +tests/integration/test_write_readback.py::test_create_raises_when_bd_prints_an_id_it_never_actually_wrote PASSED [ 95%] +tests/integration/test_write_readback.py::test_update_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 95%] +tests/integration/test_write_readback.py::test_edit_item_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 96%] +tests/integration/test_write_readback.py::test_comment_raises_when_bd_reports_success_but_no_comment_landed PASSED [ 96%] +tests/integration/test_write_readback.py::test_defer_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 96%] +tests/integration/test_write_readback.py::test_defer_raises_when_bd_reports_success_but_the_status_did_not_move PASSED [ 96%] +tests/integration/test_write_readback.py::test_block_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 97%] +tests/integration/test_write_readback.py::test_unblock_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 97%] +tests/integration/test_write_readback.py::test_add_dependency_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 97%] +tests/integration/test_write_readback.py::test_add_dependency_raises_when_bd_reports_success_but_no_edge_landed PASSED [ 98%] +tests/integration/test_write_readback.py::test_take_custody_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 98%] +tests/integration/test_write_readback.py::test_renew_custody_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 98%] +tests/integration/test_write_readback.py::test_renew_custody_raises_when_bd_reports_success_but_the_record_did_not_move PASSED [ 98%] +tests/integration/test_write_readback.py::test_supersede_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 99%] +tests/integration/test_write_readback.py::test_reopen_verifies_by_readback_when_the_wrapper_reports_conflict PASSED [ 99%] +tests/integration/test_write_readback.py::test_reopen_still_raises_when_readback_shows_the_reopen_genuinely_did_not_land PASSED [ 99%] +tests/integration/test_write_readback.py::test_move_refuses_when_the_copy_reports_success_but_the_rows_are_not_there PASSED [100%] + +=============================== warnings summary =============================== +tests/integration/test_observatory_web.py:20 + /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/tests/integration/test_observatory_web.py:20: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient # noqa: E402 + +.venv/lib/python3.12/site-packages/starlette/testclient.py:53 + /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/lib/python3.12/site-packages/starlette/testclient.py:53: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead. + _PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]] + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +SKIPPED [1] tests/integration/test_web.py:699: bd set no `owner` on this item -- happens where the environment has no git identity (e.g. a bare CI container with no `git config user.email`). `owner` is an environment-provided value, not a code invariant; the environment-independent humanization guarantees are covered by test_humanize_identity_* in tests/unit. +SKIPPED [1] tests/integration/test_web_pwa.py:234: Pillow not installed (dev/build-only tool) +SKIPPED [1] tests/integration/test_web_pwa.py:249: Pillow not installed (dev/build-only tool) +=========== 354 passed, 3 skipped, 2 warnings in 1071.88s (0:17:51) ============ diff --git a/docs/lanes/wp6-error-regex-scope/evidence/tier-ledger.txt b/docs/lanes/wp6-error-regex-scope/evidence/tier-ledger.txt new file mode 100644 index 0000000..90de786 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/tier-ledger.txt @@ -0,0 +1,39 @@ +=== make test-ledger (tier 4) === +.venv/bin/python -m pytest ledger/checks -v +============================= test session starts ============================== +platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/bin/python +cachedir: .pytest_cache +rootdir: /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker +configfile: pyproject.toml +plugins: anyio-4.15.0, asyncio-1.4.0, amplifier-core-1.6.1 +asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function +collecting ... collected 26 items + +ledger/checks/test_custody_rows.py::test_row_ccv1_000 PASSED [ 3%] +ledger/checks/test_custody_rows.py::test_row_ccv1_003 PASSED [ 7%] +ledger/checks/test_custody_rows.py::test_row_ccv1_004 PASSED [ 11%] +ledger/checks/test_custody_rows.py::test_row_ccv1_005 PASSED [ 15%] +ledger/checks/test_custody_rows.py::test_row_ccv1_008 PASSED [ 19%] +ledger/checks/test_custody_rows.py::test_row_ccv1_009 PASSED [ 23%] +ledger/checks/test_custody_rows.py::test_row_ccv1_011 PASSED [ 26%] +ledger/checks/test_custody_rows.py::test_row_ccv1_012 PASSED [ 30%] +ledger/checks/test_custody_rows.py::test_row_ccv1_013 PASSED [ 34%] +ledger/checks/test_custody_rows.py::test_row_ccv1_015 PASSED [ 38%] +ledger/checks/test_custody_rows.py::test_row_ccv1_016 PASSED [ 42%] +ledger/checks/test_custody_rows.py::test_row_ccv1_017 PASSED [ 46%] +ledger/checks/test_custody_rows.py::test_row_ccv1_021 PASSED [ 50%] +ledger/checks/test_custody_rows.py::test_row_ccv1_022 PASSED [ 53%] +ledger/checks/test_custody_rows.py::test_row_ccv1_023 PASSED [ 57%] +ledger/checks/test_ledger_integrity.py::test_rows_parse_as_a_top_level_list_with_the_sync_row_first PASSED [ 61%] +ledger/checks/test_ledger_integrity.py::test_row_ids_are_well_formed_unique_and_ordered PASSED [ 65%] +ledger/checks/test_ledger_integrity.py::test_every_row_has_a_legal_disposition_and_its_required_fields PASSED [ 69%] +ledger/checks/test_ledger_integrity.py::test_every_row_quote_verifies_against_the_contract_bytes PASSED [ 73%] +ledger/checks/test_ledger_integrity.py::test_every_clause_id_is_a_bare_identifier_the_contract_actually_names PASSED [ 76%] +ledger/checks/test_ledger_integrity.py::test_every_core_clause_is_cited_by_at_least_one_row PASSED [ 80%] +ledger/checks/test_ledger_integrity.py::test_every_assertion_ref_resolves PASSED [ 84%] +ledger/checks/test_ledger_integrity.py::test_every_probe_belongs_to_a_row PASSED [ 88%] +ledger/checks/test_ledger_integrity.py::test_every_probe_has_a_declared_mutation PASSED [ 92%] +ledger/checks/test_ledger_integrity.py::test_the_mutation_harness_runs_and_every_mutation_flips_its_probe_red PASSED [ 96%] +ledger/checks/test_ledger_integrity.py::test_indexed_cites_are_reserved_for_measured_rows PASSED [100%] + +============================== 26 passed in 0.62s ============================== diff --git a/docs/lanes/wp6-error-regex-scope/evidence/tier-modules.txt b/docs/lanes/wp6-error-regex-scope/evidence/tier-modules.txt new file mode 100644 index 0000000..a08603d --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/tier-modules.txt @@ -0,0 +1,139 @@ +=== make test-module (tier 5, modules/tool-work-tracker/tests) === +.venv/bin/python -m pytest modules/tool-work-tracker/tests -v +============================= test session starts ============================== +platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/bin/python +cachedir: .pytest_cache +rootdir: /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker +configfile: pyproject.toml +plugins: anyio-4.15.0, asyncio-1.4.0, amplifier-core-1.6.1 +asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function +collecting ... collected 113 items + +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture2_bad_half_stale_holders_resolve_is_refused_after_a_real_reap PASSED [ 0%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture2_good_half_a_live_holders_resolve_still_succeeds PASSED [ 1%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture2_good_half_integrator_close_of_a_reclaimed_item_still_succeeds PASSED [ 2%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture3_release_of_an_already_closed_held_item_clears_the_latch PASSED [ 3%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture3_work_status_reports_custody_lost_while_the_hold_is_retained PASSED [ 4%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture3_a_fenced_reclaim_clears_the_latch_with_no_manual_step PASSED [ 5%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture4_a_directed_second_claim_is_refused_while_holding PASSED [ 6%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture4_a_queue_second_claim_is_refused_while_holding PASSED [ 7%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture4_the_second_claim_succeeds_once_the_first_is_resolved PASSED [ 7%] +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture4_the_second_claim_succeeds_once_the_first_is_released PASSED [ 8%] +modules/tool-work-tracker/tests/test_custody_atomic.py::test_failed_take_custody_releases_the_claim_back_to_ready PASSED [ 9%] +modules/tool-work-tracker/tests/test_custody_atomic.py::test_failed_take_custody_then_failed_release_says_the_item_may_still_be_held PASSED [ 10%] +modules/tool-work-tracker/tests/test_phantom_conflict_recovery.py::test_unclaim_recovers_a_session_wedged_on_an_already_closed_item PASSED [ 11%] +modules/tool-work-tracker/tests/test_phantom_conflict_recovery.py::test_renew_loop_holds_session_lock_during_its_bd_call PASSED [ 12%] +modules/tool-work-tracker/tests/test_reap_recovery.py::test_explicit_resolve_refusal_after_reap_clears_held_and_allows_new_claim PASSED [ 13%] +modules/tool-work-tracker/tests/test_reap_recovery.py::test_explicit_declare_refusal_after_reap_clears_held_and_allows_new_claim PASSED [ 14%] +modules/tool-work-tracker/tests/test_reap_recovery.py::test_background_renew_loop_detects_reap_and_clears_held_state PASSED [ 15%] +modules/tool-work-tracker/tests/test_reap_recovery.py::test_background_renew_loop_generic_failure_does_not_clear_held PASSED [ 15%] +modules/tool-work-tracker/tests/test_result_guard.py::test_guarded_turns_an_unexpected_exception_into_an_honest_failure PASSED [ 16%] +modules/tool-work-tracker/tests/test_result_guard.py::test_guarded_passes_through_a_normal_result_untouched PASSED [ 17%] +modules/tool-work-tracker/tests/test_result_guard.py::test_guarded_never_swallows_a_real_failed_toolresult PASSED [ 18%] +modules/tool-work-tracker/tests/test_result_guard.py::test_guarded_does_not_swallow_cancellation PASSED [ 19%] +modules/tool-work-tracker/tests/test_result_guard.py::test_every_tool_classs_execute_is_guarded PASSED [ 20%] +modules/tool-work-tracker/tests/test_result_guard.py::test_work_add_reports_an_unexpected_non_beads_error_honestly PASSED [ 21%] +modules/tool-work-tracker/tests/test_result_guard.py::test_work_claim_reports_an_unexpected_non_beads_error_honestly PASSED [ 22%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_reports_bd_missing_before_touching_service_or_port PASSED [ 23%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_reports_bd_too_old_via_forged_version PASSED [ 23%] +modules/tool-work-tracker/tests/test_service_tools.py::test_status_tool_surfaces_console_script_fix_when_off_path PASSED [ 24%] +modules/tool-work-tracker/tests/test_service_tools.py::test_status_tool_omits_console_script_fields_when_on_path PASSED [ 25%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_reports_observed_rollback_detail_on_service_install_failure PASSED [ 26%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_admits_unknown_rollback_when_no_detail_was_observed PASSED [ 27%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_refuses_loudly_when_bd_missing PASSED [ 28%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_refuses_loudly_when_dolt_missing PASSED [ 29%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_reports_running_unmanaged_not_foreign_when_port_is_healthy PASSED [ 30%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_running_unmanaged_advises_adoption_not_shutdown PASSED [ 30%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_refuses_running_unmanaged_without_advising_to_kill_it PASSED [ 31%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_reports_running_systemd_unreachable_not_running_unmanaged PASSED [ 32%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_reports_installed_not_running_when_systemd_unreachable_and_port_down PASSED [ 33%] +modules/tool-work-tracker/tests/test_service_tools.py::test_classify_state_never_reachable_unknown_state_when_never_installed PASSED [ 34%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_refuses_running_systemd_unreachable_without_advising_to_kill_it PASSED [ 35%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_diagnoses_bus_unreachable_instead_of_generic_systemd_message PASSED [ 36%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_still_admits_unknown_rollback_for_called_process_error PASSED [ 37%] +modules/tool-work-tracker/tests/test_service_tools.py::test_install_tool_reports_not_the_init_system_when_marker_absent PASSED [ 38%] +modules/tool-work-tracker/tests/test_work_add.py::test_add_files_a_claimable_item_with_no_held_item_required PASSED [ 38%] +modules/tool-work-tracker/tests/test_work_add.py::test_added_item_applies_the_engineering_lane_label_itself PASSED [ 39%] +modules/tool-work-tracker/tests/test_work_add.py::test_add_then_claim_end_to_end PASSED [ 40%] +modules/tool-work-tracker/tests/test_work_add.py::test_add_with_related_records_a_visible_edge PASSED [ 41%] +modules/tool-work-tracker/tests/test_work_add.py::test_add_reports_beads_errors_without_raising PASSED [ 42%] +modules/tool-work-tracker/tests/test_work_bootstrap.py::test_work_claim_surfaces_repos_and_context PASSED [ 43%] +modules/tool-work-tracker/tests/test_work_bootstrap.py::test_work_claim_empty_lists_for_item_without_a_block PASSED [ 44%] +modules/tool-work-tracker/tests/test_work_bootstrap.py::test_work_list_directed_read_surfaces_repos_and_context PASSED [ 45%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_defer_sets_status_and_reason_with_no_held_item_required PASSED [ 46%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_defer_requires_a_reason_unless_clearing PASSED [ 46%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_defer_clear_moves_item_back_to_open PASSED [ 47%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_deferred_item_is_skipped_by_work_claim PASSED [ 48%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_block_sets_status_and_reason_with_no_held_item_required PASSED [ 49%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_block_clear_moves_item_back_to_open PASSED [ 50%] +modules/tool-work-tracker/tests/test_work_defer_block.py::test_defer_reports_beads_errors_without_raising PASSED [ 51%] +modules/tool-work-tracker/tests/test_work_dep.py::test_dep_declares_edge_and_returns_it PASSED [ 52%] +modules/tool-work-tracker/tests/test_work_dep.py::test_dep_without_depends_on_only_displays_existing_edges PASSED [ 53%] +modules/tool-work-tracker/tests/test_work_dep.py::test_dep_blocks_type_makes_work_claim_refuse_naming_the_blocker PASSED [ 53%] +modules/tool-work-tracker/tests/test_work_dep.py::test_dep_reports_beads_errors_without_raising PASSED [ 54%] +modules/tool-work-tracker/tests/test_work_edit.py::test_edit_amends_fields_with_no_held_item_required PASSED [ 55%] +modules/tool-work-tracker/tests/test_work_edit.py::test_edit_refuses_combining_merge_into_with_field_edits PASSED [ 56%] +modules/tool-work-tracker/tests/test_work_edit.py::test_edit_merge_into_supersedes_and_closes_the_item PASSED [ 57%] +modules/tool-work-tracker/tests/test_work_edit.py::test_edit_reports_beads_errors_without_raising PASSED [ 58%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_shows_mixed_states_with_holder_and_resolution PASSED [ 59%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_status_filter_returns_only_matching_status PASSED [ 60%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_rejects_unknown_status PASSED [ 61%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_never_claims_mutates_or_touches_custody PASSED [ 61%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_on_empty_project_returns_empty_not_an_error PASSED [ 62%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_reports_beads_errors_without_raising PASSED [ 63%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_truncates_and_reports_it_explicitly PASSED [ 64%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_default_rows_are_lean_no_body_fields PASSED [ 65%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_with_item_id_reads_full_body_without_claiming PASSED [ 66%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_with_item_id_ignores_status_and_limit PASSED [ 67%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_with_item_id_on_nonexistent_item_fails_with_distinct_error PASSED [ 68%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_with_item_id_from_a_different_project_gives_distinct_wrong_project_error PASSED [ 69%] +modules/tool-work-tracker/tests/test_work_list.py::test_list_with_item_id_never_mutates_the_item PASSED [ 69%] +modules/tool-work-tracker/tests/test_work_move.py::test_move_moves_item_between_projects_with_no_held_item_required PASSED [ 70%] +modules/tool-work-tracker/tests/test_work_move.py::test_move_does_not_require_a_held_item_in_this_session PASSED [ 71%] +modules/tool-work-tracker/tests/test_work_move.py::test_move_refuses_while_item_is_held_by_another_session PASSED [ 72%] +modules/tool-work-tracker/tests/test_work_move.py::test_move_reports_beads_errors_without_raising PASSED [ 73%] +modules/tool-work-tracker/tests/test_work_release.py::test_release_returns_held_item_to_the_queue_and_stops_custody PASSED [ 74%] +modules/tool-work-tracker/tests/test_work_release.py::test_released_item_can_be_claimed_again_immediately PASSED [ 75%] +modules/tool-work-tracker/tests/test_work_release.py::test_release_refuses_when_not_holding_anything PASSED [ 76%] +modules/tool-work-tracker/tests/test_work_release.py::test_release_refuses_a_different_item_than_the_one_held PASSED [ 76%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_reopen_claim_resolve_corrects_the_published_record PASSED [ 77%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_reopen_archives_the_previous_record_where_bd_cannot_destroy_it PASSED [ 78%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_claim_leg_degrades_without_dropping_an_existing_hold PASSED [ 79%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_reopen_refuses_an_item_that_is_not_resolved PASSED [ 80%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_reopen_refuses_an_empty_reason PASSED [ 81%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_work_resolve_refuses_divergent_text_on_a_closed_item PASSED [ 82%] +modules/tool-work-tracker/tests/test_work_reopen.py::test_work_reopen_tool_is_registered_with_the_expected_surface PASSED [ 83%] +modules/tool-work-tracker/tests/test_work_stats.py::test_stats_reports_full_breakdown_for_one_project PASSED [ 84%] +modules/tool-work-tracker/tests/test_work_stats.py::test_stats_empty_project_is_success_with_zeroes PASSED [ 84%] +modules/tool-work-tracker/tests/test_work_stats.py::test_stats_never_claims_or_mutates PASSED [ 85%] +modules/tool-work-tracker/tests/test_work_stats.py::test_stats_on_unreadable_project_reports_failure PASSED [ 86%] +modules/tool-work-tracker/tests/test_work_status.py::test_status_reports_success_when_there_is_nothing_to_report PASSED [ 87%] +modules/tool-work-tracker/tests/test_work_status.py::test_status_reports_failure_when_a_project_cannot_be_listed PASSED [ 88%] +modules/tool-work-tracker/tests/test_work_status.py::test_status_still_reports_every_healthy_project_alongside_a_broken_one PASSED [ 89%] +modules/tool-work-tracker/tests/test_work_status.py::test_status_row_carries_the_full_per_status_breakdown PASSED [ 90%] +modules/tool-work-tracker/tests/test_work_status.py::test_claim_on_an_empty_queue_still_reports_success_with_claimed_null PASSED [ 91%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_subscribe_is_idempotent_and_validates_project PASSED [ 92%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_subscribe_refuses_unknown_project PASSED [ 92%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_unsubscribe_is_idempotent PASSED [ 93%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_subscriptions_lists_current_state PASSED [ 94%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_claim_auto_subscribes_to_its_project PASSED [ 95%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_reminder_snapshot_reports_subscribed_project_counts PASSED [ 96%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_reminder_snapshot_empty_when_no_subscriptions PASSED [ 97%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_reminder_snapshot_reports_holding_and_fresh_custody PASSED [ 98%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_reminder_snapshot_reports_custody_stale_true_past_ttl PASSED [ 99%] +modules/tool-work-tracker/tests/test_work_subscribe.py::test_reminder_snapshot_never_mutates_or_touches_custody PASSED [100%] + +=============================== warnings summary =============================== +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture2_bad_half_stale_holders_resolve_is_refused_after_a_real_reap +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture2_good_half_integrator_close_of_a_reclaimed_item_still_succeeds +modules/tool-work-tracker/tests/test_conformance_fixtures.py::test_fixture3_a_fenced_reclaim_clears_the_latch_with_no_manual_step +modules/tool-work-tracker/tests/test_reap_recovery.py::test_explicit_resolve_refusal_after_reap_clears_held_and_allows_new_claim +modules/tool-work-tracker/tests/test_reap_recovery.py::test_explicit_declare_refusal_after_reap_clears_held_and_allows_new_claim +modules/tool-work-tracker/tests/test_reap_recovery.py::test_background_renew_loop_detects_reap_and_clears_held_state + /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/lib/python3.12/site-packages/_pytest/stash.py:108: RuntimeWarning: coroutine 'alarm_for_reclaimed_item' was never awaited + del self._storage[key] + Enable tracemalloc to get traceback where the object was allocated. + See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +================= 113 passed, 6 warnings in 451.55s (0:07:31) ================== diff --git a/docs/lanes/wp6-error-regex-scope/evidence/tier-unit.txt b/docs/lanes/wp6-error-regex-scope/evidence/tier-unit.txt new file mode 100644 index 0000000..cba1b50 --- /dev/null +++ b/docs/lanes/wp6-error-regex-scope/evidence/tier-unit.txt @@ -0,0 +1,836 @@ +=== make test-unit (tier 1) === +.venv/bin/python -m pytest tests/unit -v +============================= test session starts ============================== +platform linux -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0 -- /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/bin/python +cachedir: .pytest_cache +rootdir: /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker +configfile: pyproject.toml +plugins: anyio-4.15.0, asyncio-1.4.0, amplifier-core-1.6.1 +asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function +collecting ... collected 813 items + +tests/unit/test_adapter_mapping.py::test_field_mapping_renames_every_declared_field PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_raw_dict_is_preserved_verbatim PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_known_statuses_are_mapped PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_unknown_status_passes_through_unchanged PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_missing_status_defaults_to_unknown PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_tags_and_meta_default_to_empty_containers_when_absent PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_tags_and_meta_default_to_empty_containers_when_explicitly_null PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_missing_id_defaults_to_empty_string PASSED [ 0%] +tests/unit/test_adapter_mapping.py::test_retryable_detects_dolt_conflict_codes PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_retryable_is_case_insensitive PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_retryable_false_for_unrelated_errors PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_retryable_false_for_connection_errors PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_connection_retryable_detects_real_bd_unreachable_wording PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_connection_retryable_detects_transport_signatures PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_connection_retryable_is_case_insensitive PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_connection_retryable_false_for_domain_and_serialization_errors PASSED [ 1%] +tests/unit/test_adapter_mapping.py::test_run_returns_a_successful_response_even_if_its_text_matches_retryable PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_run_still_retries_and_raises_for_a_genuine_persistent_conflict PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_run_retries_a_real_conflict_then_returns_the_eventual_success PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_active_blockers_empty_when_no_dependencies PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_active_blockers_ignores_non_blocks_dependency_types PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_active_blockers_ignores_closed_blocker PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_active_blockers_reports_open_blocks_dependency PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_active_blockers_treats_blocked_and_deferred_blockers_as_still_active PASSED [ 2%] +tests/unit/test_adapter_mapping.py::test_active_blockers_handles_missing_dependencies_key PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_map_status_translates_every_known_bd_status PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_map_status_passes_through_unknown_value_rather_than_coercing PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_map_status_handles_none_and_empty PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_is_active_blocker_true_only_for_open_blocks_type PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_is_active_blocker_false_for_closed_blocks_type PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_is_active_blocker_false_for_non_blocks_type_regardless_of_status PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_get_enriched_links_include_title_status_holder_for_forward_direction PASSED [ 3%] +tests/unit/test_adapter_mapping.py::test_get_enriched_links_satisfied_blocker_is_not_blocking PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_name_re_accepts_simple_lowercase_name PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_name_re_rejects_dotted_name PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_name_re_rejects_uppercase PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_name_re_rejects_single_character PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_name_re_accepts_underscores_and_digits PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_workspace_create_rejects_dotted_name_before_touching_disk PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_workspace_create_rejects_uppercase_name_before_touching_disk PASSED [ 4%] +tests/unit/test_adapter_mapping.py::test_workspace_create_refuses_to_report_success_on_dead_residue PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_workspace_create_returns_cleanly_when_beads_dir_already_works PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_env_always_sets_bd_non_interactive PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_env_sets_bd_non_interactive_even_when_absent_from_environment PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_env_overrides_a_falsy_ambient_value PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_env_no_longer_sets_the_ineffective_telemetry_disable_var PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_disable_telemetry_once_is_cached_per_process PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_disable_telemetry_once_never_raises_on_subprocess_failure PASSED [ 5%] +tests/unit/test_adapter_mapping.py::test_statuses_public_tuple_covers_every_domain_status PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_status_reverse_map_is_the_exact_inverse_of_the_forward_map PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_list_rejects_unknown_status_before_any_subprocess_call PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_list_bounded_clamps_requested_limit_above_the_max PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_list_bounded_clamps_a_nonpositive_requested_limit_to_one PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_list_bounded_uses_default_limit_when_omitted PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_list_bounded_reports_truncation_honestly PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_list_bounded_reports_no_truncation_when_everything_fits PASSED [ 6%] +tests/unit/test_adapter_mapping.py::test_summary_default_is_lean_and_omits_body_fields PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_summary_full_adds_the_same_body_fields_claim_returns PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_summary_full_on_an_item_with_no_body_reports_none_not_missing PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_get_readonly_project_name_is_inferred_from_the_beads_dir_parent PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_get_readonly_wrong_project_prefix_raises_distinct_error PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_get_readonly_correct_prefix_but_missing_raises_plain_not_found PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_get_readonly_delegates_to_get_and_returns_the_item_unmodified PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_list_bounded_offset_defaults_to_zero_and_matches_prior_behavior PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_list_bounded_offset_shifts_the_returned_window PASSED [ 7%] +tests/unit/test_adapter_mapping.py::test_list_bounded_offset_past_the_end_reports_no_truncation PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_list_bounded_negative_offset_clamps_to_zero PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_history_events_oldest_entry_becomes_created PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_history_events_collapses_consecutive_identical_signatures PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_history_events_generic_transition_names_both_states PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_history_events_sorted_ascending_regardless_of_input_order PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_history_events_skips_entries_with_no_commit_date PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_history_events_empty_input_returns_empty PASSED [ 8%] +tests/unit/test_adapter_mapping.py::test_daily_resolved_counts_buckets_by_day_oldest_to_newest PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_daily_resolved_counts_none_when_unmeasurable PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_daily_resolved_counts_real_zero_when_nothing_resolved PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_daily_resolved_counts_out_of_window_is_dropped_not_errored PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_block_style_lists PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_inline_flow_style PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_strips_matching_quotes PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_only_one_key_present PASSED [ 9%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_yml_tag_and_crlf PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_no_block_is_empty_not_error PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_none_and_empty_are_empty PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_ignores_a_nested_list_item_named_like_a_key PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_parse_bootstrap_metadata_only_first_yaml_block_consulted PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_from_beads_populates_repos_and_context_from_description PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_from_beads_no_yaml_block_yields_empty_lists_backward_compatible PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_summary_full_includes_repos_and_context PASSED [ 10%] +tests/unit/test_adapter_mapping.py::test_summary_lean_omits_repos_and_context PASSED [ 11%] +tests/unit/test_adapter_mapping.py::test_summary_full_repos_context_empty_for_plain_item PASSED [ 11%] +tests/unit/test_bd_telemetry_env_audit.py::test_every_bd_subprocess_call_routes_through_the_telemetry_env_helper PASSED [ 11%] +tests/unit/test_bd_telemetry_env_audit.py::test_helper_itself_is_found_by_the_audit_in_at_least_one_real_call_site PASSED [ 11%] +tests/unit/test_chartsvg.py::test_sparkline_geometry_is_back_computable PASSED [ 11%] +tests/unit/test_chartsvg.py::test_sparkline_flat_series_draws_centre_line PASSED [ 11%] +tests/unit/test_chartsvg.py::test_sparkline_empty_is_valid_and_accessible PASSED [ 11%] +tests/unit/test_chartsvg.py::test_sparkline_single_value_draws_one_dot PASSED [ 11%] +tests/unit/test_chartsvg.py::test_sparkline_display_dimensions_are_separate_attrs PASSED [ 12%] +tests/unit/test_chartsvg.py::test_velocity_chart_geometry_is_back_computable PASSED [ 12%] +tests/unit/test_chartsvg.py::test_velocity_chart_empty_is_valid_and_accessible PASSED [ 12%] +tests/unit/test_chartsvg.py::test_velocity_chart_all_zero_values_do_not_divide_by_zero PASSED [ 12%] +tests/unit/test_chartsvg.py::test_velocity_chart_all_zero_renders_caption_not_isolated_zero_labels PASSED [ 12%] +tests/unit/test_chartsvg.py::test_velocity_chart_nonzero_data_has_no_caption PASSED [ 12%] +tests/unit/test_chartsvg.py::test_status_donut_segment_lengths_sum_to_circumference PASSED [ 12%] +tests/unit/test_chartsvg.py::test_status_donut_zero_total_draws_only_track PASSED [ 12%] +tests/unit/test_chartsvg.py::test_status_donut_skips_zero_count_statuses PASSED [ 13%] +tests/unit/test_chartsvg.py::test_status_donut_single_full_segment_renders_cleanly PASSED [ 13%] +tests/unit/test_chartsvg.py::test_status_donut_unique_pattern_id_is_respected PASSED [ 13%] +tests/unit/test_chartsvg.py::test_age_histogram_geometry_is_back_computable PASSED [ 13%] +tests/unit/test_chartsvg.py::test_age_histogram_empty_is_valid_and_accessible PASSED [ 13%] +tests/unit/test_chartsvg.py::test_age_histogram_all_zero_counts_do_not_divide_by_zero PASSED [ 13%] +tests/unit/test_chartsvg.py::test_age_histogram_zero_bucket_draws_a_deliberate_stub_no_value_label PASSED [ 13%] +tests/unit/test_cli_doctor.py::test_not_installed_is_skipped_not_failed PASSED [ 13%] +tests/unit/test_cli_doctor.py::test_unsupported_platform_is_skipped_not_failed PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_installed_but_not_active_is_skipped_service_check_already_failed PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_installed_and_active_with_fresh_heartbeats_passes PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_installed_and_active_with_stale_reap_heartbeat_fails PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_installed_and_active_startup_window_no_sweeps_yet_passes PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_installed_and_active_no_heartbeat_file_at_all_fails PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_restart_policy_skipped_when_service_not_installed PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_restart_policy_skipped_when_platform_unsupported PASSED [ 14%] +tests/unit/test_cli_doctor.py::test_restart_policy_skipped_on_non_linux_platform_with_no_unit_file PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_restart_policy_passes_when_unit_has_restart_always PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_restart_policy_fails_when_unit_still_has_restart_on_failure PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_restart_policy_fails_when_unit_has_no_restart_line_at_all PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_service_installed_passes_with_a_note_when_active_is_genuinely_unknown PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_service_installed_still_fails_when_genuinely_confirmed_inactive PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_service_installed_passes_when_never_installed PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_systemd_user_bus_reachable_skips_when_probe_reports_skipped PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_systemd_user_bus_reachable_passes_when_probe_reports_reachable PASSED [ 15%] +tests/unit/test_cli_doctor.py::test_systemd_user_bus_reachable_fails_when_probe_reports_unreachable PASSED [ 16%] +tests/unit/test_cli_unclaim.py::test_happy_path_releases_and_reports_open PASSED [ 16%] +tests/unit/test_cli_unclaim.py::test_refuses_when_not_held_and_mutates_nothing PASSED [ 16%] +tests/unit/test_cli_unclaim.py::test_reports_missing_item_without_mutating PASSED [ 16%] +tests/unit/test_cli_unclaim.py::test_refuses_if_readback_still_held PASSED [ 16%] +tests/unit/test_cli_update.py::test_builds_uv_tool_upgrade PASSED [ 16%] +tests/unit/test_cli_update.py::test_reinstall_flag_adds_reinstall PASSED [ 16%] +tests/unit/test_cli_update.py::test_missing_uv_fails_loud_and_runs_nothing PASSED [ 16%] +tests/unit/test_cli_update.py::test_nonzero_uv_exit_propagates_code PASSED [ 17%] +tests/unit/test_custody.py::test_age_seconds_of_a_fresh_timestamp_is_small PASSED [ 17%] +tests/unit/test_custody.py::test_age_seconds_never_negative_on_clock_skew PASSED [ 17%] +tests/unit/test_custody.py::test_age_seconds_of_empty_timestamp_is_infinite PASSED [ 17%] +tests/unit/test_custody.py::test_is_fresh_true_within_ttl PASSED [ 17%] +tests/unit/test_custody.py::test_is_fresh_false_beyond_ttl PASSED [ 17%] +tests/unit/test_custody.py::test_is_fresh_none_record_is_not_fresh PASSED [ 17%] +tests/unit/test_custody.py::test_is_fresh_ignores_declared_state PASSED [ 17%] +tests/unit/test_custody.py::test_reclaim_eligible_no_record_at_all PASSED [ 18%] +tests/unit/test_custody.py::test_reclaim_eligible_fresh_survives_a_long_total_hold PASSED [ 18%] +tests/unit/test_custody.py::test_reclaim_eligible_stale_after_ttl_lapses PASSED [ 18%] +tests/unit/test_custody.py::test_reclaim_eligible_escalation_ceiling_exceeded PASSED [ 18%] +tests/unit/test_custody.py::test_reclaim_eligible_awaiting_human_below_ceiling_is_not_eligible PASSED [ 18%] +tests/unit/test_custody.py::test_reclaim_eligible_idle_declaration_never_exempts_from_staleness PASSED [ 18%] +tests/unit/test_custody.py::test_should_notify_working_state PASSED [ 18%] +tests/unit/test_custody.py::test_should_notify_awaiting_human_is_suppressed PASSED [ 18%] +tests/unit/test_custody.py::test_should_notify_none_record PASSED [ 19%] +tests/unit/test_custody.py::test_should_notify_is_never_consulted_by_reclaim_eligible PASSED [ 19%] +tests/unit/test_custody.py::test_custody_roundtrip_through_dict PASSED [ 19%] +tests/unit/test_custody.py::test_now_iso_matches_expected_format PASSED [ 19%] +tests/unit/test_dashboard_ledger.py::test_state_bar_zero_state_renders_as_seam_not_absent PASSED [ 19%] +tests/unit/test_dashboard_ledger.py::test_state_bar_fixed_slot_order_is_always_the_same PASSED [ 19%] +tests/unit/test_dashboard_ledger.py::test_state_legend_zero_count_shows_real_number_not_hidden PASSED [ 19%] +tests/unit/test_dashboard_ledger.py::test_state_legend_nonzero_states_use_their_dedicated_fill PASSED [ 19%] +tests/unit/test_dashboard_ledger.py::test_state_bar_calm_zero_alarm_states_have_no_min_width_floor PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_state_bar_tiny_held_count_among_huge_total_still_gets_alarm_floor PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_state_bar_blocked_and_deferred_also_get_the_alarm_floor PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_dashboard_sort_key_orders_ready_descending PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_dashboard_sort_key_ties_break_by_name PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_dashboard_sort_key_broken_queues_sort_first_regardless_of_count PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_ledger_hero_unreadable_workspace_renders_honest_dash PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_ledger_hero_zero_projects_says_so_plainly PASSED [ 20%] +tests/unit/test_dashboard_ledger.py::test_ledger_hero_normal_case_shows_count_and_burn_rate PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_ledger_hero_no_throughput_is_an_honest_gap_not_a_fabricated_rate PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_secondary_readings_no_ready_items_is_honest_dash_for_concentration PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_secondary_readings_concentration_links_to_the_project PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_secondary_readings_waiting_7d_uses_amber_only_when_nonzero PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_secondary_readings_custody_reports_blocked_needing_attention PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_throughput_no_prior_rate_is_honest_not_a_fabricated_delta PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_throughput_reports_trend_percentage_when_measurable PASSED [ 21%] +tests/unit/test_dashboard_ledger.py::test_throughput_names_coverage_gap_when_some_queues_unmeasurable PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_throughput_no_coverage_footnote_when_fully_measurable PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_workspace_composition_computes_percent_resolved PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_workspace_composition_zero_total_never_divides_by_zero PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_broken_project_is_unmissable_alarm_row PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_zero_resolved_shows_dash_not_fabricated_zero_percent PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_real_resolved_shows_count_and_percent PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_calm_project_has_no_alarm_styling PASSED [ 22%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_held_item_flags_the_row_amber PASSED [ 23%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_blocked_item_flags_the_row_crimson_outranking_held PASSED [ 23%] +tests/unit/test_dashboard_ledger.py::test_dashboard_row_deferred_item_also_flags_the_row PASSED [ 23%] +tests/unit/test_dashboard_ledger.py::test_dashboard_totals_sums_every_readable_project PASSED [ 23%] +tests/unit/test_dashboard_ledger.py::test_attention_signal_absent_entirely_when_calm PASSED [ 23%] +tests/unit/test_dashboard_ledger.py::test_attention_signal_present_and_amber_when_only_held PASSED [ 23%] +tests/unit/test_dashboard_ledger.py::test_attention_signal_crimson_when_anything_is_blocked PASSED [ 23%] +tests/unit/test_error_announcement_detection.py::test_pr70_description_is_prose_not_an_announcement PASSED [ 23%] +tests/unit/test_error_announcement_detection.py::test_healthy_doctor_run_carrying_pr70s_description_is_not_a_silent_failure PASSED [ 23%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[Write conflicts surface as retryable serialization errors] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[reports UNAVAILABLE (not ERROR) per project] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[an infrastructure read failure raises BeadsUnavailableError] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[this command never reports an error it did not observe] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[ERROR and UNAVAILABLE are different readings of the same field] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": null}] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_mentioning_errors_is_not_announcing_one[{"ok": true, "error": ""}] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[Error: unknown command "reclaim"] PASSED [ 24%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[reaping stale holds...\nError: unknown command "reclaim"\n] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[ brokenqueue TOTAL - READY - HELD - ERROR: database unreachable] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[ERROR: tokens file not found: /etc/awt/tokens.json] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[amplifier-work-tracker: error: unrecognized arguments: --nope] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[internal error: connection reset by peer] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[{"custody": {"error": "dolt: connection refused"}}] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[error running bd list --json] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[unknown command "reclaim" for "bd"] PASSED [ 25%] +tests/unit/test_error_announcement_detection.py::test_real_error_announcements_are_still_caught[Traceback (most recent call last):\n File "cli.py", line 1\n] PASSED [ 26%] +tests/unit/test_error_announcement_detection.py::test_the_shipped_reap_bug_still_fails_the_assertion PASSED [ 26%] +tests/unit/test_error_announcement_detection.py::test_an_announced_error_with_a_nonzero_exit_is_fine PASSED [ 26%] +tests/unit/test_error_announcement_detection.py::test_announcements_are_found_across_the_stdout_stderr_seam PASSED [ 26%] +tests/unit/test_error_announcement_detection.py::test_the_failure_message_names_which_shape_fired PASSED [ 26%] +tests/unit/test_heartbeat.py::test_record_loop_started_then_read_shows_no_completion_yet PASSED [ 26%] +tests/unit/test_heartbeat.py::test_record_sweep_completed_sets_last_completed_and_keeps_loop_started_at PASSED [ 26%] +tests/unit/test_heartbeat.py::test_record_sweep_completed_without_prior_started_still_works PASSED [ 26%] +tests/unit/test_heartbeat.py::test_reap_and_notify_records_are_independent PASSED [ 27%] +tests/unit/test_heartbeat.py::test_read_loop_heartbeat_missing_file_is_none PASSED [ 27%] +tests/unit/test_heartbeat.py::test_read_loop_heartbeat_corrupt_file_is_none PASSED [ 27%] +tests/unit/test_heartbeat.py::test_record_loop_started_overwrites_a_previous_runs_completion PASSED [ 27%] +tests/unit/test_heartbeat.py::test_pid_alive_true_for_current_process PASSED [ 27%] +tests/unit/test_heartbeat.py::test_pid_alive_false_for_a_really_dead_process PASSED [ 27%] +tests/unit/test_heartbeat.py::test_fresh_completion_passes PASSED [ 27%] +tests/unit/test_heartbeat.py::test_stale_completion_fails_and_names_loop_and_fix PASSED [ 27%] +tests/unit/test_heartbeat.py::test_no_record_at_all_fails_and_names_loop PASSED [ 28%] +tests/unit/test_heartbeat.py::test_startup_window_no_completion_yet_but_recent_start_passes PASSED [ 28%] +tests/unit/test_heartbeat.py::test_startup_window_exceeded_with_no_completion_fails PASSED [ 28%] +tests/unit/test_heartbeat.py::test_dead_pid_with_recent_completion_does_not_read_as_fresh PASSED [ 28%] +tests/unit/test_heartbeat.py::test_dead_pid_check_uses_real_pid_alive_by_default PASSED [ 28%] +tests/unit/test_heartbeat.py::test_threshold_is_interval_times_stale_multiple PASSED [ 28%] +tests/unit/test_observatory_widgets.py::test_verdict_line_environment_alarm PASSED [ 28%] +tests/unit/test_observatory_widgets.py::test_verdict_line_environment_calm PASSED [ 28%] +tests/unit/test_observatory_widgets.py::test_verdict_line_environment_idle PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_project_alarm PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_project_calm PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_project_idle PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_environment_alarm_pluralization[1-1 item needs you] PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_environment_alarm_pluralization[2-2 items need you] PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_project_alarm_pluralization[1-Needs you \u2014 1 item requires attention] PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_project_alarm_pluralization[2-Needs you \u2014 2 items require attention] PASSED [ 29%] +tests/unit/test_observatory_widgets.py::test_verdict_line_single_agent_is_not_pluralized PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_verdict_line_alarm_requires_reasons PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_all_nine_observatory_widgets_are_registered PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_get_observatory_widget_unknown_id_names_known_ids PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_get_observatory_widget_roundtrip PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_register_observatory_duplicate_id_fails_loud PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_render_verdict_hero_alarm PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_render_verdict_hero_calm_with_meta_row PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_split_meta_value[465-expected0] PASSED [ 30%] +tests/unit/test_observatory_widgets.py::test_split_meta_value[0-expected1] PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_split_meta_value[\u2014-expected2] PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_split_meta_value[6d-expected3] PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_split_meta_value[3h ago-expected4] PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_split_meta_value[-2d-expected5] PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_render_verdict_hero_meta_row_splits_suffix_into_its_own_span PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_render_verdict_hero_idle PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_render_kpi_strip_blocked_zero_gets_quiet_class PASSED [ 31%] +tests/unit/test_observatory_widgets.py::test_render_kpi_strip_blocked_nonzero_has_no_is_zero PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_attention_queue_ranked_rows PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_attention_queue_truncation_note_when_capped PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_attention_queue_no_truncation_note_when_not_capped PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_fleet_table_mix_bar_and_dormant_section PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_fleet_table_no_dormant_omits_section PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_agents_now_stale_row PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_activity_feed_links_and_window_tabs PASSED [ 32%] +tests/unit/test_observatory_widgets.py::test_render_status_breakdown_full_legend PASSED [ 33%] +tests/unit/test_observatory_widgets.py::test_render_status_breakdown_zero_total_has_zero_percent PASSED [ 33%] +tests/unit/test_observatory_widgets.py::test_render_ready_age_histogram_with_flagged_note PASSED [ 33%] +tests/unit/test_observatory_widgets.py::test_render_ready_age_histogram_without_flagged_note PASSED [ 33%] +tests/unit/test_observatory_widgets.py::test_render_agents_panel_stale_and_fresh_rows PASSED [ 33%] +tests/unit/test_overview_needs_you.py::test_blocked_stale_counts_only_needlessly_blocked PASSED [ 33%] +tests/unit/test_overview_needs_you.py::test_blocked_stale_is_safe_when_upstream_status_unreadable PASSED [ 33%] +tests/unit/test_overview_needs_you.py::test_held_stale_oldest_age_uses_worst_breach_with_a_record PASSED [ 33%] +tests/unit/test_overview_needs_you.py::test_held_stale_oldest_age_none_when_nothing_stale PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_held_stale_oldest_age_none_when_only_recordless_holds PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_attention_for_none_when_calm_or_unreadable PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_attention_entries_rank_custody_over_blocker_over_age PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_attention_entry_carries_all_live_conditions_sorted PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_attention_entries_break_ties_by_count PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_verdict_idle_when_nothing_running_but_work_waits PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_verdict_idle_notes_zero_throughput_today PASSED [ 34%] +tests/unit/test_overview_needs_you.py::test_verdict_stalled_when_no_movement_and_holds_exist PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_all_clear_only_when_genuinely_calm PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_all_clear_no_open_work PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_alarm_amber_for_custody_only_fleet PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_blocked_crimson_and_plural_keyword PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_html_calm_uses_no_status_hue PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_html_alarm_carries_amber_not_crimson PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_verdict_html_is_flat_never_glass PASSED [ 35%] +tests/unit/test_overview_needs_you.py::test_needs_you_html_absent_when_no_entries PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_needs_you_html_marks_severity_and_since_and_dispatch PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_needs_you_blocked_condition_has_no_fabricated_since PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_dispatch_pick_prefers_aged_then_deep_queue PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_dispatch_html_absent_when_nothing_ready PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_dispatch_html_names_project_and_verb PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_units_legend_defines_one_vocabulary PASSED [ 36%] +tests/unit/test_overview_needs_you.py::test_sidebar_badge_spells_out_denominator PASSED [ 36%] +tests/unit/test_prereqs.py::test_os_arch_recognizes_supported_combinations[Linux-x86_64-expected0] PASSED [ 37%] +tests/unit/test_prereqs.py::test_os_arch_recognizes_supported_combinations[Linux-aarch64-expected1] PASSED [ 37%] +tests/unit/test_prereqs.py::test_os_arch_recognizes_supported_combinations[Darwin-arm64-expected2] PASSED [ 37%] +tests/unit/test_prereqs.py::test_os_arch_recognizes_supported_combinations[Darwin-x86_64-expected3] PASSED [ 37%] +tests/unit/test_prereqs.py::test_os_arch_raises_on_unknown_os PASSED [ 37%] +tests/unit/test_prereqs.py::test_os_arch_raises_on_unknown_arch PASSED [ 37%] +tests/unit/test_prereqs.py::test_bd_install_version_is_derived_from_min_version_not_duplicated PASSED [ 37%] +tests/unit/test_prereqs.py::test_bd_install_command_linux_amd64 PASSED [ 37%] +tests/unit/test_prereqs.py::test_bd_install_command_never_contains_rm PASSED [ 38%] +tests/unit/test_prereqs.py::test_dolt_install_command_never_contains_rm PASSED [ 38%] +tests/unit/test_prereqs.py::test_bd_install_command_linux_arm64 PASSED [ 38%] +tests/unit/test_prereqs.py::test_bd_install_command_darwin_arm64 PASSED [ 38%] +tests/unit/test_prereqs.py::test_bd_install_command_darwin_amd64_has_no_published_asset PASSED [ 38%] +tests/unit/test_prereqs.py::test_dolt_install_command_linux_amd64_matches_ci_asset_shape PASSED [ 38%] +tests/unit/test_prereqs.py::test_dolt_install_command_darwin_arm64 PASSED [ 38%] +tests/unit/test_prereqs.py::test_check_returns_none_when_bd_and_dolt_both_satisfied PASSED [ 38%] +tests/unit/test_prereqs.py::test_check_reports_bd_missing_when_path_has_neither_binary PASSED [ 38%] +tests/unit/test_prereqs.py::test_check_prefers_bd_missing_over_dolt_missing PASSED [ 39%] +tests/unit/test_prereqs.py::test_check_reports_bd_too_old_via_forged_version_string PASSED [ 39%] +tests/unit/test_prereqs.py::test_check_reports_bd_too_old_when_version_unparseable PASSED [ 39%] +tests/unit/test_prereqs.py::test_check_reports_dolt_missing_when_bd_ok_but_dolt_absent PASSED [ 39%] +tests/unit/test_prereqs.py::test_check_never_raises_for_a_missing_binary PASSED [ 39%] +tests/unit/test_prereqs.py::test_ci_workflow_pins_match_our_constants PASSED [ 39%] +tests/unit/test_project_summary_data.py::test_ready_age_buckets_sum_equals_ready_including_fractional_days PASSED [ 39%] +tests/unit/test_project_summary_data.py::test_ready_age_buckets_bands_are_floor_day_and_contiguous PASSED [ 39%] +tests/unit/test_project_summary_data.py::test_ready_age_buckets_undated_item_goes_to_unknown_not_dropped PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_ready_age_buckets_counts_only_open_work_lane_items PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_resolved_throughput_counts_within_windows PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_resolved_throughput_honest_zero_when_no_resolutions PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_resolved_throughput_honest_zero_when_all_resolutions_are_old PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_resolved_throughput_none_when_resolved_but_undated PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_last_activity_uses_most_recent_timestamp_of_any_kind PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_last_activity_none_when_no_timestamps_anywhere PASSED [ 40%] +tests/unit/test_project_summary_data.py::test_project_summary_creating_is_distinct_and_counts_none PASSED [ 41%] +tests/unit/test_project_summary_data.py::test_project_summary_broken_is_distinct_and_counts_none PASSED [ 41%] +tests/unit/test_project_summary_data.py::test_parse_dolt_timestamp_matches_the_bd_iso_parse_for_the_same_instant PASSED [ 41%] +tests/unit/test_project_summary_data.py::test_parse_dolt_timestamp_is_aware_utc_so_summary_arithmetic_never_raises PASSED [ 41%] +tests/unit/test_project_summary_data.py::test_parse_dolt_timestamp_none_for_empty_null_and_garbage PASSED [ 41%] +tests/unit/test_redaction.py::test_redact_email PASSED [ 41%] +tests/unit/test_redaction.py::test_redact_path_home PASSED [ 41%] +tests/unit/test_redaction.py::test_redact_path_users PASSED [ 41%] +tests/unit/test_redaction.py::test_redact_ssn PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_card_number PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_phone_number PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_secret_looking_token PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_empty_string_is_a_noop PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_clean_text_has_no_placeholders_and_no_counts PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_multiple_pii_classes_in_one_string_all_counted PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_repeated_same_class_counts_all_occurrences PASSED [ 42%] +tests/unit/test_redaction.py::test_redact_context_flat_string_field PASSED [ 43%] +tests/unit/test_redaction.py::test_redact_context_nested_dict_field_is_redacted PASSED [ 43%] +tests/unit/test_redaction.py::test_redact_context_list_of_strings_is_redacted PASSED [ 43%] +tests/unit/test_redaction.py::test_redact_context_non_string_values_pass_through_untouched PASSED [ 43%] +tests/unit/test_redaction.py::test_redact_context_aggregates_counts_across_nested_and_sibling_fields PASSED [ 43%] +tests/unit/test_redaction.py::test_redact_context_deeply_nested_dict_still_redacted PASSED [ 43%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_anything_that_is_not_resolved[open] PASSED [ 43%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_anything_that_is_not_resolved[held] PASSED [ 43%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_anything_that_is_not_resolved[blocked] PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_anything_that_is_not_resolved[deferred] PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_an_empty_reason_before_reading_anything[] PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_an_empty_reason_before_reading_anything[ ] PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_an_empty_reason_before_reading_anything[\n\t ] PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_archives_the_verbatim_previous_record_before_transitioning PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_refuses_to_report_success_if_the_item_is_still_resolved PASSED [ 44%] +tests/unit/test_reopen_preconditions.py::test_reopen_archives_a_blank_previous_resolution_explicitly PASSED [ 44%] +tests/unit/test_resolve_text_compare.py::test_norm_resolution_unifies_line_endings_and_strips_outer_whitespace PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_norm_resolution_keeps_case_and_internal_whitespace_significant PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_resolution_landed_is_true_only_for_the_same_text PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_echo_resolution_truncates_loudly_never_silently PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_divergent_error_message_carries_everything_a_caller_needs PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_divergent_text_on_a_closed_item_refuses_and_writes_nothing PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_identical_text_on_a_closed_item_is_an_idempotent_success_with_no_write PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_resolving_an_open_item_is_unchanged PASSED [ 45%] +tests/unit/test_resolve_text_compare.py::test_post_write_readback_refuses_when_the_stored_text_is_not_ours PASSED [ 46%] +tests/unit/test_resolve_text_compare.py::test_contended_path_reports_success_only_when_our_own_text_landed PASSED [ 46%] +tests/unit/test_resolve_text_compare.py::test_contended_path_raises_when_the_readback_text_is_not_ours PASSED [ 46%] +tests/unit/test_resolve_text_compare.py::test_contended_path_still_reraises_when_the_item_never_closed PASSED [ 46%] +tests/unit/test_resolve_text_compare.py::test_resolve_returns_an_item_for_every_existing_caller PASSED [ 46%] +tests/unit/test_service.py::test_resolve_root_expands_and_resolves PASSED [ 46%] +tests/unit/test_service.py::test_resolve_root_accepts_path_object PASSED [ 46%] +tests/unit/test_service.py::test_serve_argv_tail_bakes_root_as_argument_not_env PASSED [ 46%] +tests/unit/test_service.py::test_serve_argv_tail_includes_optional_dolt_host_and_port PASSED [ 46%] +tests/unit/test_service.py::test_serve_argv_tail_omits_dolt_flags_when_not_given PASSED [ 47%] +tests/unit/test_service.py::test_serve_argv_tail_omits_every_web_flag_when_web_port_not_given PASSED [ 47%] +tests/unit/test_service.py::test_serve_argv_tail_bakes_web_port_and_defaults PASSED [ 47%] +tests/unit/test_service.py::test_serve_argv_tail_bakes_every_web_flag_when_given PASSED [ 47%] +tests/unit/test_service.py::test_serve_argv_tail_omits_web_host_public_auth_ttl_when_only_web_port_given PASSED [ 47%] +tests/unit/test_service.py::test_systemd_unit_content_bakes_web_flags_into_exec_start PASSED [ 47%] +tests/unit/test_service.py::test_systemd_unit_content_omits_web_flags_when_web_port_not_given PASSED [ 47%] +tests/unit/test_service.py::test_resolve_web_tls_returns_none_none_when_neither_given_and_no_default_cert PASSED [ 47%] +tests/unit/test_service.py::test_resolve_web_tls_auto_detects_setup_tls_defaults_when_present PASSED [ 48%] +tests/unit/test_service.py::test_resolve_web_tls_validates_explicit_paths_exist PASSED [ 48%] +tests/unit/test_service.py::test_resolve_web_tls_raises_for_missing_explicit_cert PASSED [ 48%] +tests/unit/test_service.py::test_resolve_web_tls_raises_when_only_cert_given PASSED [ 48%] +tests/unit/test_service.py::test_resolve_web_tls_raises_when_only_key_given PASSED [ 48%] +tests/unit/test_service.py::test_serve_argv_tail_bakes_web_tls_flags_when_given PASSED [ 48%] +tests/unit/test_service.py::test_serve_argv_tail_omits_web_tls_flags_when_not_given PASSED [ 48%] +tests/unit/test_service.py::test_serve_argv_tail_omits_web_tls_flags_even_with_web_port_none PASSED [ 48%] +tests/unit/test_service.py::test_systemd_unit_content_bakes_web_tls_flags_into_exec_start PASSED [ 49%] +tests/unit/test_service.py::test_serve_argv_tail_bakes_web_http_port_when_given PASSED [ 49%] +tests/unit/test_service.py::test_serve_argv_tail_omits_web_http_port_when_not_given PASSED [ 49%] +tests/unit/test_service.py::test_serve_argv_tail_omits_web_http_port_even_with_web_port_none PASSED [ 49%] +tests/unit/test_service.py::test_systemd_unit_content_bakes_web_http_port_into_exec_start PASSED [ 49%] +tests/unit/test_service.py::test_systemd_analyze_verify_clean_with_web_http_port_baked_in PASSED [ 49%] +tests/unit/test_service.py::test_systemd_analyze_verify_clean_with_web_tls_flags_baked_in PASSED [ 49%] +tests/unit/test_service.py::test_service_install_raises_tls_config_error_for_incomplete_tls_pair PASSED [ 49%] +tests/unit/test_service.py::test_systemd_analyze_verify_clean_with_web_flags_baked_in PASSED [ 50%] +tests/unit/test_service.py::test_resolve_bin_tokens_never_returns_a_single_shell_string PASSED [ 50%] +tests/unit/test_service.py::test_systemd_unit_template_has_no_environment_line_for_root PASSED [ 50%] +tests/unit/test_service.py::test_systemd_unit_template_uses_restart_always_not_on_failure PASSED [ 50%] +tests/unit/test_service.py::test_windows_is_reported_as_unsupported_not_raised PASSED [ 50%] +tests/unit/test_service.py::test_service_install_raises_service_unsupported_on_windows PASSED [ 50%] +tests/unit/test_service.py::test_no_systemctl_is_reported_as_unsupported_on_linux PASSED [ 50%] +tests/unit/test_service.py::test_darwin_describe_dispatches_to_launchd PASSED [ 50%] +tests/unit/test_service.py::test_resolve_bin_tokens_prefers_console_script_when_present PASSED [ 51%] +tests/unit/test_service.py::test_resolve_console_script_reports_nothing_when_on_path PASSED [ 51%] +tests/unit/test_service.py::test_resolve_console_script_finds_unlinked_uv_tool_install PASSED [ 51%] +tests/unit/test_service.py::test_resolve_console_script_reports_nothing_when_truly_absent PASSED [ 51%] +tests/unit/test_service.py::test_resolve_bin_tokens_falls_back_to_module_invocation_as_separate_tokens PASSED [ 51%] +tests/unit/test_service.py::test_systemd_exec_start_never_quotes_the_module_fallback_as_one_token PASSED [ 51%] +tests/unit/test_service.py::test_systemd_analyze_verify_clean_for_console_script_resolution_path PASSED [ 51%] +tests/unit/test_service.py::test_systemd_analyze_verify_clean_for_module_fallback_resolution_path PASSED [ 51%] +tests/unit/test_service.py::test_systemd_install_rolls_back_unit_file_when_systemctl_fails PASSED [ 52%] +tests/unit/test_service.py::test_systemd_install_attaches_observed_rollback_detail_on_success PASSED [ 52%] +tests/unit/test_service.py::test_systemd_install_rollback_detail_reports_a_failed_rollback_step_honestly PASSED [ 52%] +tests/unit/test_service.py::test_service_install_propagates_the_failure_after_rollback PASSED [ 52%] +tests/unit/test_service.py::test_resolve_console_script_interpreter_reads_the_shebang PASSED [ 52%] +tests/unit/test_service.py::test_resolve_console_script_interpreter_returns_sys_executable_for_module_fallback PASSED [ 52%] +tests/unit/test_service.py::test_resolve_console_script_interpreter_returns_none_when_no_shebang PASSED [ 52%] +tests/unit/test_service.py::test_probe_web_extra_importable_true_for_the_real_test_interpreter PASSED [ 52%] +tests/unit/test_service.py::test_probe_web_extra_importable_false_when_the_target_cannot_import PASSED [ 53%] +tests/unit/test_service.py::test_probe_web_extra_importable_false_when_interpreter_cannot_be_resolved PASSED [ 53%] +tests/unit/test_service.py::test_service_install_refuses_with_remedy_when_web_extra_not_importable PASSED [ 53%] +tests/unit/test_service.py::test_service_install_skips_the_web_extra_check_when_web_port_not_given PASSED [ 53%] +tests/unit/test_service.py::test_service_install_proceeds_when_web_extra_importable PASSED [ 53%] +tests/unit/test_service.py::test_systemd_user_env_injects_xdg_runtime_dir_when_unset_and_candidate_exists PASSED [ 53%] +tests/unit/test_service.py::test_systemd_user_env_also_locates_dbus_session_bus_address_when_socket_present PASSED [ 53%] +tests/unit/test_service.py::test_systemd_user_env_does_not_inject_when_no_candidate_runtime_dir_exists PASSED [ 53%] +tests/unit/test_service.py::test_systemd_user_env_never_overrides_a_preset_xdg_runtime_dir PASSED [ 53%] +tests/unit/test_service.py::test_systemd_user_env_never_overrides_a_preset_dbus_session_bus_address PASSED [ 54%] +tests/unit/test_service.py::test_systemd_user_env_reports_no_note_when_both_already_set PASSED [ 54%] +tests/unit/test_service.py::test_systemd_call_passes_the_self_healing_env_to_subprocess_run PASSED [ 54%] +tests/unit/test_service.py::test_systemd_call_never_overrides_a_preset_env_var PASSED [ 54%] +tests/unit/test_service.py::test_systemd_call_attaches_env_injection_note_to_a_raised_called_process_error PASSED [ 54%] +tests/unit/test_service.py::test_diagnose_systemd_failure_names_xdg_runtime_dir_for_the_measured_bus_error PASSED [ 54%] +tests/unit/test_service.py::test_diagnose_systemd_failure_recognizes_bus_connection_refused PASSED [ 54%] +tests/unit/test_service.py::test_diagnose_systemd_failure_reserves_does_not_use_systemd_for_a_genuinely_non_systemd_host PASSED [ 54%] +tests/unit/test_service.py::test_diagnose_systemd_failure_reports_the_observed_detail_when_genuinely_systemd PASSED [ 55%] +tests/unit/test_service.py::test_systemd_describe_reports_active_none_when_is_active_probe_is_bus_unreachable PASSED [ 55%] +tests/unit/test_service.py::test_systemd_describe_reports_active_false_for_a_genuinely_inactive_unit PASSED [ 55%] +tests/unit/test_service.py::test_systemd_describe_reports_active_true_for_a_genuinely_active_unit PASSED [ 55%] +tests/unit/test_service.py::test_probe_systemd_user_bus_skips_when_systemctl_absent PASSED [ 55%] +tests/unit/test_service.py::test_probe_systemd_user_bus_skips_on_darwin PASSED [ 55%] +tests/unit/test_service.py::test_probe_systemd_user_bus_reachable_when_show_environment_succeeds PASSED [ 55%] +tests/unit/test_service.py::test_probe_systemd_user_bus_unreachable_names_xdg_fix_for_a_bus_error PASSED [ 55%] +tests/unit/test_supervisor.py::test_no_holders_means_proceed PASSED [ 56%] +tests/unit/test_supervisor.py::test_holders_not_responding_means_kill_stale PASSED [ 56%] +tests/unit/test_supervisor.py::test_holders_not_responding_ignores_owned_pid PASSED [ 56%] +tests/unit/test_supervisor.py::test_healthy_and_owned_means_refuse_ours PASSED [ 56%] +tests/unit/test_supervisor.py::test_healthy_and_owned_pid_present_among_multiple_holders PASSED [ 56%] +tests/unit/test_supervisor.py::test_healthy_but_not_owned_means_refuse_foreign PASSED [ 56%] +tests/unit/test_supervisor.py::test_healthy_owned_pid_recorded_but_holder_is_someone_else PASSED [ 56%] +tests/unit/test_supervisor.py::test_classification_is_exhaustive_and_returns_only_known_actions PASSED [ 56%] +tests/unit/test_supervisor.py::test_ensure_port_available_proceeds_silently_when_free PASSED [ 57%] +tests/unit/test_supervisor.py::test_ensure_port_available_kills_stale_holder PASSED [ 57%] +tests/unit/test_supervisor.py::test_ensure_port_available_refuses_ours_without_killing PASSED [ 57%] +tests/unit/test_supervisor.py::test_ensure_port_available_refuses_foreign_without_killing PASSED [ 57%] +tests/unit/test_supervisor.py::test_ensure_port_available_force_kills_unconditionally PASSED [ 57%] +tests/unit/test_supervisor.py::test_read_owned_pid_missing_file_is_none PASSED [ 57%] +tests/unit/test_supervisor.py::test_read_owned_pid_garbage_contents_is_none PASSED [ 57%] +tests/unit/test_supervisor.py::test_read_owned_pid_reads_back_written_value PASSED [ 57%] +tests/unit/test_supervisor.py::test_budget_not_exceeded_below_the_count PASSED [ 58%] +tests/unit/test_supervisor.py::test_budget_exceeded_at_the_count_within_the_window PASSED [ 58%] +tests/unit/test_supervisor.py::test_budget_never_exceeded_when_exits_are_spaced_beyond_the_window PASSED [ 58%] +tests/unit/test_supervisor.py::test_budget_trims_old_entries_before_counting PASSED [ 58%] +tests/unit/test_supervisor.py::test_dolt_supervisor_loop_gives_up_loudly_after_budget_exhausted PASSED [ 58%] +tests/unit/test_supervisor.py::test_dolt_supervisor_loop_stops_cleanly_without_raising_when_stop_requested PASSED [ 58%] +tests/unit/test_supervisor.py::test_reap_project_reclaims_stale_and_keeps_fresh PASSED [ 58%] +tests/unit/test_supervisor.py::test_reap_sweep_isolates_a_broken_project_from_the_others PASSED [ 58%] +tests/unit/test_supervisor.py::test_notify_project_flips_only_linked_unresolved_reports PASSED [ 59%] +tests/unit/test_supervisor.py::test_notify_sweep_isolates_a_broken_project_from_the_others PASSED [ 59%] +tests/unit/test_supervisor.py::test_reap_loop_records_start_before_its_first_sweep_completes PASSED [ 59%] +tests/unit/test_supervisor.py::test_reap_loop_records_completion_after_a_sweep PASSED [ 59%] +tests/unit/test_supervisor.py::test_notify_loop_records_completion_after_a_sweep PASSED [ 59%] +tests/unit/test_supervisor.py::test_reap_and_notify_loops_use_independent_heartbeat_records PASSED [ 59%] +tests/unit/test_supervisor_web.py::test_import_web_modules_returns_the_webapp_module PASSED [ 59%] +tests/unit/test_supervisor_web.py::test_import_web_modules_wraps_import_error_with_actionable_hint PASSED [ 59%] +tests/unit/test_supervisor_web.py::test_web_stop_watcher_mirrors_stop_event_into_should_exit PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_web_server_loop_serves_a_reachable_dashboard_and_drains_on_stop_event PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_web_server_loop_serves_https_when_tls_cert_and_key_are_given PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_web_server_loop_runs_trust_bootstrap_companion_listener_when_tls_active PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_web_server_loop_omits_trust_bootstrap_without_http_port PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_web_server_loop_raises_web_server_startup_error_for_rejected_config PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_web_server_loop_raises_web_server_startup_error_on_bind_failure PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_async_serve_without_web_never_touches_web_modules PASSED [ 60%] +tests/unit/test_supervisor_web.py::test_async_serve_with_web_runs_all_four_tasks PASSED [ 61%] +tests/unit/test_supervisor_web.py::test_web_server_loop_wraps_missing_web_extra_as_web_server_startup_error PASSED [ 61%] +tests/unit/test_supervisor_web.py::test_async_serve_fails_loud_and_terminates_real_dolt_child_on_missing_web_extra PASSED [ 61%] +tests/unit/test_supervisor_web.py::test_serve_returns_1_and_prints_remedy_on_missing_web_extra PASSED [ 61%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_none_when_not_held PASSED [ 61%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_fresh_hold_uses_started_at_for_age_and_is_not_stale PASSED [ 61%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_stale_when_renewal_lapsed_past_ttl PASSED [ 61%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_ttl_boundary_exactly_at_ttl_is_still_fresh PASSED [ 61%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_no_custody_record_is_stale_and_proxied_from_updated_at PASSED [ 61%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_no_custody_record_and_no_updated_at_has_no_age_at_all PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_awaiting_human_fresh_is_not_stale_but_reports_declared_state PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_reading_awaiting_human_past_escalation_ceiling_is_stale PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_none_reading_renders_nothing PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_fresh_reading_is_neutral_not_amber PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_stale_reading_is_amber_and_carries_the_real_reason_as_title PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_no_age_renders_held_with_no_duration PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_proxy_age_is_labeled_as_a_proxy_not_a_real_duration PASSED [ 62%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_fresh_awaiting_human_notes_the_ttl_clock_still_runs PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_custody_html_unknown_holder_degrades_honestly PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_item_row_held_item_shows_custody_reading_not_bare_identity PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_item_row_stale_held_item_shows_amber_custody_class PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_attention_signal_held_stale_default_is_byte_identical_to_before PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_attention_signal_held_stale_adds_a_parenthetical_when_nonzero PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_attention_signal_held_stale_zero_is_absent_not_a_dimmed_zero PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_attention_signal_held_stale_never_escalates_to_crimson_alone PASSED [ 63%] +tests/unit/test_webapp_held_staleness.py::test_attention_signal_held_stale_never_double_counts_the_total PASSED [ 64%] +tests/unit/test_webapp_held_staleness.py::test_held_stale_count_counts_only_reclaim_eligible_items PASSED [ 64%] +tests/unit/test_webapp_held_staleness.py::test_held_stale_count_zero_when_every_hold_is_fresh PASSED [ 64%] +tests/unit/test_webapp_held_staleness.py::test_held_stale_count_empty_list_is_zero PASSED [ 64%] +tests/unit/test_webapp_identity.py::test_humanize_identity_reduces_a_github_noreply_address_to_the_username PASSED [ 64%] +tests/unit/test_webapp_identity.py::test_humanize_identity_handles_a_hyphenated_username PASSED [ 64%] +tests/unit/test_webapp_identity.py::test_humanize_identity_leaves_an_ordinary_actor_name_unchanged PASSED [ 64%] +tests/unit/test_webapp_identity.py::test_humanize_identity_leaves_a_non_noreply_email_unchanged PASSED [ 64%] +tests/unit/test_webapp_identity.py::test_humanize_identity_handles_empty_and_none PASSED [ 65%] +tests/unit/test_webapp_identity.py::test_humanize_identity_strips_surrounding_whitespace PASSED [ 65%] +tests/unit/test_webapp_identity.py::test_identity_html_wraps_a_humanized_noreply_identity_with_a_raw_tooltip PASSED [ 65%] +tests/unit/test_webapp_identity.py::test_identity_html_renders_an_ordinary_identity_as_plain_escaped_text_only PASSED [ 65%] +tests/unit/test_webapp_identity.py::test_identity_html_escapes_html_special_characters PASSED [ 65%] +tests/unit/test_webapp_identity.py::test_identity_html_returns_empty_string_for_missing_identity PASSED [ 65%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_converts_bold PASSED [ 65%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_converts_inline_code PASSED [ 65%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_converts_fenced_code_block_and_preserves_alignment PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_converts_headings_to_subordinate_tags PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_leaves_plain_text_unchanged PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_escapes_html_before_processing_markdown PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_does_not_process_markdown_inside_code_blocks PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_render_item_markdown_preserves_newlines_for_the_pre_wrap_container PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_content_block_html_shows_empty_message_when_text_is_none PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_content_block_html_shows_empty_message_when_text_is_empty_string PASSED [ 66%] +tests/unit/test_webapp_item_render.py::test_content_block_html_renders_provided_text_with_monospace_and_measure PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_content_block_html_renders_markdown_inside_the_block PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_fact_value_html_escapes_and_is_non_interactive PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_fact_value_html_escapes_html_special_characters PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_item_row_never_concatenates_id_and_title_without_a_separator PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_item_row_has_separate_id_and_title_cells PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_empty_links_renders_nothing PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_unsatisfied_blocker_is_crimson_and_shows_holder PASSED [ 67%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_unsatisfied_blocker_falls_back_to_reporter_when_not_held PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_satisfied_blocker_is_neutral_with_check_mark PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_discovered_from_is_a_neutral_note_not_a_blocker PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_blocks_inverse_is_cheap_and_neutral PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_other_type_falls_back_to_generic_links_list PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_missing_id_is_skipped_not_rendered_as_broken_link PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_blocks_uses_link_chip_grid PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_related_type_gets_its_own_column PASSED [ 68%] +tests/unit/test_webapp_item_render.py::test_dependency_sections_no_blocks_or_related_renders_no_links_grid PASSED [ 69%] +tests/unit/test_webapp_item_render.py::test_activity_feed_empty_list_renders_nothing PASSED [ 69%] +tests/unit/test_webapp_item_render.py::test_activity_feed_renders_summary_actor_and_detail PASSED [ 69%] +tests/unit/test_webapp_item_render.py::test_activity_feed_does_not_render_its_own_heading PASSED [ 69%] +tests/unit/test_webapp_item_render.py::test_activity_feed_preserves_caller_supplied_order PASSED [ 69%] +tests/unit/test_webapp_list_polish.py::test_status_tab_counts_mirrors_the_real_project_summary PASSED [ 69%] +tests/unit/test_webapp_list_polish.py::test_status_tab_counts_all_zero_for_a_broken_or_creating_project PASSED [ 69%] +tests/unit/test_webapp_list_polish.py::test_status_tab_counts_none_fields_become_zero_not_none PASSED [ 69%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_shows_all_six_tabs_with_real_counts PASSED [ 69%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_zero_count_is_dimmed_not_hidden PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_held_turns_amber_when_nonzero PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_blocked_turns_crimson_when_nonzero PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_ready_and_resolved_never_get_an_alarm_class_even_when_large PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_active_tab_is_marked PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_all_tab_is_active_when_no_status_filter PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_clicking_a_tab_filters_via_status_query_param PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_status_tabs_html_carries_an_active_search_through PASSED [ 70%] +tests/unit/test_webapp_list_polish.py::test_tab_href_all_tab_with_no_search_has_no_query_string PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_tab_href_all_tab_with_a_search_carries_only_q PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_none_renders_the_shared_empty_glyph PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_fresh_item_reads_now_not_0m PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_uses_the_same_compact_units_as_the_row_age_column PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_days_matches_age_short PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_carries_the_real_iso_timestamp_as_a_title PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_never_escalates_to_the_amber_alarm_tier PASSED [ 71%] +tests/unit/test_webapp_list_polish.py::test_item_age_html_moderately_old_still_reads_a2 PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_maps_each_bd_priority_to_its_ramp_step[0-p0] PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_maps_each_bd_priority_to_its_ramp_step[1-p1] PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_maps_each_bd_priority_to_its_ramp_step[2-p2] PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_maps_each_bd_priority_to_its_ramp_step[3-p3] PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_maps_each_bd_priority_to_its_ramp_step[4-p4] PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_none_degrades_honestly_to_the_faint_neutral PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_out_of_range_value_also_degrades_honestly PASSED [ 72%] +tests/unit/test_webapp_list_polish.py::test_priority_bar_html_never_uses_the_reserved_amber_or_crimson_hues PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_status_icon_html_reuses_the_same_colour_class_as_the_text_badge[open-st-open] PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_status_icon_html_reuses_the_same_colour_class_as_the_text_badge[held-st-held] PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_status_icon_html_reuses_the_same_colour_class_as_the_text_badge[blocked-st-blkd] PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_status_icon_html_reuses_the_same_colour_class_as_the_text_badge[deferred-st-deferred] PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_status_icon_html_reuses_the_same_colour_class_as_the_text_badge[resolved-st-done] PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_item_row_includes_a_priority_bar_and_status_icon_gutter_cell PASSED [ 73%] +tests/unit/test_webapp_list_polish.py::test_item_row_gutter_degrades_honestly_when_priority_is_missing PASSED [ 73%] +tests/unit/test_webapp_nav_density.py::test_sidebar_open_total_is_total_minus_resolved PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_open_total_none_for_broken_project PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_open_total_none_for_missing_summary PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_open_total_never_goes_negative PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_open_total_none_fields_become_zero PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_alarm_class_blank_when_calm PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_alarm_class_amber_when_held PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_alarm_class_crimson_when_blocked PASSED [ 74%] +tests/unit/test_webapp_nav_density.py::test_sidebar_alarm_class_blocked_outranks_held PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_alarm_class_blank_for_broken_project PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_alarm_class_blank_for_missing_summary PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_lists_every_project_alphabetically PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_rollup_shows_real_summed_open_total PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_rollup_excludes_broken_projects_from_the_total PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_shows_open_over_total_badge_per_row PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_broken_project_badge_is_an_honest_dash PASSED [ 75%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_marks_current_project_row_not_the_rollup PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_marks_rollup_current_on_the_dashboard PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_alarm_marker_reaches_the_row_class PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_calm_project_carries_no_alarm_class PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_empty_workspace_renders_a_zero_rollup_and_no_rows PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_escapes_project_names PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_sidebar_html_includes_the_narrow_width_checkbox_toggle PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_search_field_shows_a_slash_shortcut_hint_by_default PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_search_field_aria_label_never_carries_the_shortcut_hint PASSED [ 76%] +tests/unit/test_webapp_nav_density.py::test_search_field_shortcut_can_be_suppressed PASSED [ 77%] +tests/unit/test_webapp_nav_density.py::test_density_toggle_html_default_is_unpressed PASSED [ 77%] +tests/unit/test_webapp_nav_density.py::test_list_controls_js_uses_the_dedicated_localstorage_key PASSED [ 77%] +tests/unit/test_webapp_nav_density.py::test_list_controls_js_has_its_own_dedicated_bind_once_guard PASSED [ 77%] +tests/unit/test_webapp_nav_density.py::test_list_controls_js_guards_row_nav_keys_against_focused_fields PASSED [ 77%] +tests/unit/test_webapp_nav_density.py::test_list_controls_js_respects_reduced_motion_for_scrolling PASSED [ 77%] +tests/unit/test_webapp_nav_density.py::test_list_controls_js_targets_the_shared_row_selector PASSED [ 77%] +tests/unit/test_webapp_setup.py::test_unauthenticated_get_setup_redirects_to_login PASSED [ 77%] +tests/unit/test_webapp_setup.py::test_unauthenticated_get_setup_refused_json PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_unauthenticated_post_setup_tls_refused_json PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_unauthenticated_get_ca_crt_refused_json PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_authenticated_get_setup_succeeds PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_dashboard_chrome_links_to_setup_when_authenticated PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_setup_status_shows_http_and_no_cert_note_when_nothing_configured PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_setup_status_reports_https_scheme_from_the_real_request PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_setup_status_labels_self_signed_certificate PASSED [ 78%] +tests/unit/test_webapp_setup.py::test_setup_status_flags_stale_cert_when_scheme_is_still_http PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_setup_status_labels_local_ca_signed_certificate_and_offers_download PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_setup_status_expiring_soon_certificate_is_flagged PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_setup_status_expired_certificate_is_flagged PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_setup_shows_all_three_real_methods_and_never_mkcert PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_setup_shows_tailscale_disabled_when_unavailable PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_setup_shows_tailscale_available_with_detected_hostname PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_post_setup_tls_selfsigned_generates_a_real_cert_in_the_isolated_home PASSED [ 79%] +tests/unit/test_webapp_setup.py::test_post_setup_tls_ca_generates_both_ca_and_leaf PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_post_setup_tls_unknown_method_is_refused_with_400 PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_post_setup_tls_tailscale_unavailable_is_refused_with_400 PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_post_setup_tls_does_not_touch_the_real_developer_home PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_ca_crt_route_404s_when_no_ca_is_configured PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_ca_crt_route_serves_a_valid_pem_when_ca_is_configured PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_recommended_method_is_tailscale_when_available PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_recommended_method_is_local_ca_when_tailscale_unavailable PASSED [ 80%] +tests/unit/test_webapp_setup.py::test_setup_shows_friction_spectrum_framing PASSED [ 81%] +tests/unit/test_webapp_setup.py::test_setup_recommends_tailscale_when_available PASSED [ 81%] +tests/unit/test_webapp_setup.py::test_setup_recommends_local_ca_when_tailscale_unavailable PASSED [ 81%] +tests/unit/test_webapp_setup.py::test_trust_bootstrap_url_uses_configured_web_http_port_when_known PASSED [ 81%] +tests/unit/test_webapp_setup.py::test_trust_bootstrap_url_falls_back_to_https_port_plus_one_pattern PASSED [ 81%] +tests/unit/test_webapp_setup.py::test_trust_bootstrap_url_pattern_uses_explicit_https_port PASSED [ 81%] +tests/unit/test_webapp_setup.py::test_setup_ca_section_omits_trust_cross_link_when_no_ca_configured PASSED [ 81%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_defaults_to_no_tls_when_nothing_configured PASSED [ 81%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_uses_explicit_tls_cert_and_key PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_raises_for_missing_explicit_cert PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_raises_for_missing_explicit_key PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_raises_when_only_tls_cert_given PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_raises_when_only_tls_key_given PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_never_silently_falls_back_to_http_for_missing_explicit_cert PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_raises_for_unreadable_explicit_cert PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_auto_detects_setup_tls_default_cert PASSED [ 82%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_ignores_a_half_present_default_cert PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_explicit_paths_take_priority_over_auto_detected PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_run_passes_ssl_kwargs_to_uvicorn_when_tls_configured PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_run_omits_ssl_kwargs_when_no_tls_configured PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_resolve_http_bootstrap_port_none_when_no_tls PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_resolve_http_bootstrap_port_defaults_to_port_plus_one_when_tls_active PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_resolve_http_bootstrap_port_uses_explicit_value_when_tls_active PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_resolve_http_bootstrap_port_raises_on_collision_with_https_port PASSED [ 83%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_no_trust_bootstrap_message_without_tls PASSED [ 84%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_defaults_trust_bootstrap_port_when_tls_active PASSED [ 84%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_uses_explicit_http_port_when_tls_active PASSED [ 84%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_ignores_http_port_without_tls_but_notes_it PASSED [ 84%] +tests/unit/test_webapp_tls.py::test_resolve_web_config_raises_on_http_port_colliding_with_https_port PASSED [ 84%] +tests/unit/test_webapp_tls.py::test_run_starts_both_servers_when_http_port_is_set PASSED [ 84%] +tests/unit/test_webbrowse_render.py::test_item_row_links_directly_to_l2_and_strips_project_prefix PASSED [ 84%] +tests/unit/test_webbrowse_render.py::test_item_row_status_chip_differs_by_status PASSED [ 84%] +tests/unit/test_webbrowse_render.py::test_item_row_holder_shows_blocked_by_id_when_blocked PASSED [ 84%] +tests/unit/test_webbrowse_render.py::test_item_row_holder_absent_for_resolved_item_with_leftover_holder PASSED [ 85%] +tests/unit/test_webbrowse_render.py::test_status_tabs_render_all_seven_with_real_counts PASSED [ 85%] +tests/unit/test_webbrowse_render.py::test_status_tabs_marks_the_active_one PASSED [ 85%] +tests/unit/test_webbrowse_render.py::test_status_tab_counts_zero_for_impaired_summary PASSED [ 85%] +tests/unit/test_webbrowse_render.py::test_agent_panel_groups_by_agent_stalest_first PASSED [ 85%] +tests/unit/test_webbrowse_render.py::test_ready_age_histogram_data_flags_the_7_plus_bucket PASSED [ 85%] +tests/unit/test_webbrowse_render.py::test_ready_age_histogram_omits_flag_note_when_nothing_aging PASSED [ 85%] +tests/unit/test_webpush.py::test_push_send_alarm_request_shape_and_headers PASSED [ 85%] +tests/unit/test_webpush.py::test_push_default_priority_is_urgent PASSED [ 86%] +tests/unit/test_webpush.py::test_push_bearer_absent_when_no_token PASSED [ 86%] +tests/unit/test_webpush.py::test_push_utf8_body_is_encoded PASSED [ 86%] +tests/unit/test_webpush.py::test_push_omits_tags_and_click_when_absent PASSED [ 86%] +tests/unit/test_webpush.py::test_push_disabled_channel_is_noop PASSED [ 86%] +tests/unit/test_webpush.py::test_push_enabled_without_topic_raises_config_error PASSED [ 86%] +tests/unit/test_webpush.py::test_push_retries_on_5xx_then_succeeds PASSED [ 86%] +tests/unit/test_webpush.py::test_push_retries_on_429_then_succeeds PASSED [ 86%] +tests/unit/test_webpush.py::test_push_retries_on_network_error_then_succeeds PASSED [ 87%] +tests/unit/test_webpush.py::test_push_loud_fail_after_exhausting_retries PASSED [ 87%] +tests/unit/test_webpush.py::test_push_non_transient_4xx_fails_immediately_without_retry PASSED [ 87%] +tests/unit/test_webpush.py::test_push_loud_fail_on_persistent_network_error PASSED [ 87%] +tests/unit/test_webpush.py::test_push_max_attempts_one_does_not_retry PASSED [ 87%] +tests/unit/test_webpush.py::test_push_resolve_config_defaults_and_secrets_env_only PASSED [ 87%] +tests/unit/test_webpush.py::test_push_resolve_config_overrides_and_url_join PASSED [ 87%] +tests/unit/test_webpush.py::test_push_resolve_config_disabled_when_flag_absent_or_falsey PASSED [ 87%] +tests/unit/test_webpush.py::test_push_resolve_config_bad_numbers_fall_back_to_defaults PASSED [ 88%] +tests/unit/test_webpush.py::test_push_dashboard_link_none_without_base PASSED [ 88%] +tests/unit/test_webpush.py::test_push_reclaim_alarm_payload_carries_id_reason_and_urgent_tags PASSED [ 88%] +tests/unit/test_webpush.py::test_push_fires_on_custody_ttl_breach_simulated_item PASSED [ 88%] +tests/unit/test_webpush.py::test_push_does_not_fire_when_custody_is_fresh PASSED [ 88%] +tests/unit/test_webpush.py::test_push_fire_reclaim_alarm_disabled_is_noop PASSED [ 88%] +tests/unit/test_webpush.py::test_push_fire_reclaim_alarm_swallows_config_error PASSED [ 88%] +tests/unit/test_webpush.py::test_push_fire_reclaim_alarm_swallows_delivery_error PASSED [ 88%] +tests/unit/test_webtls.py::test_common_name_passes_short_hostname_through_unchanged PASSED [ 89%] +tests/unit/test_webtls.py::test_common_name_truncates_long_hostname_to_64_chars PASSED [ 89%] +tests/unit/test_webtls.py::test_common_name_truncation_is_exercised_by_a_real_cert PASSED [ 89%] +tests/unit/test_webtls.py::test_default_hostnames_includes_hostname_local_and_localhost PASSED [ 89%] +tests/unit/test_webtls.py::test_default_lan_ip_returns_a_valid_ipv4_or_none PASSED [ 89%] +tests/unit/test_webtls.py::test_default_tailnet_name_returns_none_when_tailscale_not_on_path PASSED [ 89%] +tests/unit/test_webtls.py::test_default_leaf_sans_includes_loopback_and_default_hostnames PASSED [ 89%] +tests/unit/test_webtls.py::test_default_leaf_sans_folds_in_tailnet_name_and_lan_ip_when_present PASSED [ 89%] +tests/unit/test_webtls.py::test_default_paths_live_under_config_amplifier_work_tracker_tls PASSED [ 90%] +tests/unit/test_webtls.py::test_default_tls_dir_is_created_with_restricted_permissions PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_self_signed_writes_cert_and_key_with_restricted_key_perms PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_self_signed_san_covers_hostname_local_localhost_loopback_and_lan_ip PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_self_signed_deduplicates_loopback_ip_addresses PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_self_signed_skips_invalid_ip_strings_silently PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_local_ca_writes_ca_cert_and_key PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_local_ca_is_idempotent_and_reuses_existing_ca PASSED [ 90%] +tests/unit/test_webtls.py::test_generate_leaf_signed_by_ca_produces_a_cert_chained_to_the_ca PASSED [ 91%] +tests/unit/test_webtls.py::test_generate_leaf_signed_by_ca_requires_at_least_one_hostname PASSED [ 91%] +tests/unit/test_webtls.py::test_get_cert_info_returns_none_for_missing_file PASSED [ 91%] +tests/unit/test_webtls.py::test_get_cert_info_returns_none_for_unparseable_file PASSED [ 91%] +tests/unit/test_webtls.py::test_get_cert_info_reports_expiry_and_serial PASSED [ 91%] +tests/unit/test_webtls.py::test_detect_tailscale_returns_none_when_binary_absent PASSED [ 91%] +tests/unit/test_webtls.py::test_generate_tailscale_returns_none_when_binary_absent PASSED [ 91%] +tests/unit/test_webtls.py::test_get_cert_info_reports_self_signed_true_for_a_self_signed_cert PASSED [ 91%] +tests/unit/test_webtls.py::test_get_cert_info_reports_self_signed_false_for_a_ca_signed_leaf PASSED [ 92%] +tests/unit/test_webtls.py::test_is_signed_by_ca_true_for_a_real_matching_chain PASSED [ 92%] +tests/unit/test_webtls.py::test_is_signed_by_ca_false_for_a_self_signed_cert_against_an_unrelated_ca PASSED [ 92%] +tests/unit/test_webtls.py::test_is_signed_by_ca_returns_false_never_raises_for_missing_files PASSED [ 92%] +tests/unit/test_webtrust.py::test_detect_os[Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1-ios] PASSED [ 92%] +tests/unit/test_webtrust.py::test_detect_os[Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1-ios] PASSED [ 92%] +tests/unit/test_webtrust.py::test_detect_os[Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36-android] PASSED [ 92%] +tests/unit/test_webtrust.py::test_detect_os[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36-windows] PASSED [ 92%] +tests/unit/test_webtrust.py::test_detect_os[Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15-macos] PASSED [ 92%] +tests/unit/test_webtrust.py::test_detect_os[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36-linux] PASSED [ 93%] +tests/unit/test_webtrust.py::test_detect_os[-unknown] PASSED [ 93%] +tests/unit/test_webtrust.py::test_detect_os[some-unrecognizable-bot/1.0-unknown] PASSED [ 93%] +tests/unit/test_webtrust.py::test_detect_os_checks_android_before_linux PASSED [ 93%] +tests/unit/test_webtrust.py::test_classify_trust_state_none_when_no_cert_path_given PASSED [ 93%] +tests/unit/test_webtrust.py::test_classify_trust_state_none_when_cert_file_missing PASSED [ 93%] +tests/unit/test_webtrust.py::test_classify_trust_state_selfsigned PASSED [ 93%] +tests/unit/test_webtrust.py::test_classify_trust_state_public_when_not_self_signed_and_no_ca PASSED [ 93%] +tests/unit/test_webtrust.py::test_classify_trust_state_ca PASSED [ 94%] +tests/unit/test_webtrust.py::test_build_mobileconfig_produces_a_parseable_plist PASSED [ 94%] +tests/unit/test_webtrust.py::test_build_mobileconfig_carries_a_root_cert_payload_with_the_real_ca_bytes PASSED [ 94%] +tests/unit/test_webtrust.py::test_build_mobileconfig_is_idempotent_across_downloads PASSED [ 94%] +tests/unit/test_webtrust.py::test_build_mobileconfig_differs_for_a_different_ca PASSED [ 94%] +tests/unit/test_webtrust.py::test_trust_page_is_reachable_unauthenticated_over_plain_http PASSED [ 94%] +tests/unit/test_webtrust.py::test_trust_page_offers_install_profile_button_for_ios_ua PASSED [ 94%] +tests/unit/test_webtrust.py::test_trust_page_honest_about_selfsigned_no_ca_to_install PASSED [ 94%] +tests/unit/test_webtrust.py::test_trust_page_honest_about_no_cert_configured PASSED [ 95%] +tests/unit/test_webtrust.py::test_trust_page_continue_link_points_at_https_origin PASSED [ 95%] +tests/unit/test_webtrust.py::test_ca_crt_download_unauthenticated_when_ca_active PASSED [ 95%] +tests/unit/test_webtrust.py::test_ca_crt_404_honest_when_no_ca PASSED [ 95%] +tests/unit/test_webtrust.py::test_ca_crt_404_when_no_cert_at_all PASSED [ 95%] +tests/unit/test_webtrust.py::test_trust_mobileconfig_download_unauthenticated_when_ca_active PASSED [ 95%] +tests/unit/test_webtrust.py::test_trust_mobileconfig_404_honest_when_no_ca PASSED [ 95%] +tests/unit/test_webtrust.py::test_redirect_for_arbitrary_path_to_https_origin PASSED [ 95%] +tests/unit/test_webtrust.py::test_redirect_preserves_query_string PASSED [ 96%] +tests/unit/test_webtrust.py::test_redirect_for_bare_root PASSED [ 96%] +tests/unit/test_webtrust.py::test_redirect_never_fires_for_the_three_trust_routes PASSED [ 96%] +tests/unit/test_widgets_contract.py::test_register_and_get_roundtrip PASSED [ 96%] +tests/unit/test_widgets_contract.py::test_register_duplicate_id_fails_loud PASSED [ 96%] +tests/unit/test_widgets_contract.py::test_get_unknown_id_names_known_ids PASSED [ 96%] +tests/unit/test_widgets_contract.py::test_registry_preserves_registration_order PASSED [ 96%] +tests/unit/test_widgets_contract.py::test_render_passes_context_and_returns_fragment PASSED [ 96%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 97%] +tests/unit/test_widgets_contract.py::test_firewall_flags_raw_colour_and_gloss[] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_firewall_passes_token_only_and_avoids_false_positives[] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_firewall_passes_token_only_and_avoids_false_positives[x] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_firewall_passes_token_only_and_avoids_false_positives[] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_firewall_passes_token_only_and_avoids_false_positives[a ’ b · c] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_firewall_passes_token_only_and_avoids_false_positives[y] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_firewall_passes_token_only_and_avoids_false_positives[
4
] PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_render_enforce_raises_on_violation PASSED [ 98%] +tests/unit/test_widgets_contract.py::test_dashboard_registry_has_the_five_v2_panels PASSED [ 99%] +tests/unit/test_widgets_contract.py::test_dashboard_widget_needs_are_real_context_fields PASSED [ 99%] +tests/unit/test_widgets_contract.py::test_every_dashboard_widget_obeys_the_firewall_when_populated PASSED [ 99%] +tests/unit/test_widgets_contract.py::test_every_dashboard_widget_obeys_the_firewall_when_empty PASSED [ 99%] +tests/unit/test_widgets_contract.py::test_routed_output_is_byte_identical_to_inline_builder[empty] PASSED [ 99%] +tests/unit/test_widgets_contract.py::test_routed_output_is_byte_identical_to_inline_builder[populated] PASSED [ 99%] +tests/unit/test_workspace_remove.py::test_remove_without_force_refuses_before_touching_disk PASSED [ 99%] +tests/unit/test_workspace_remove.py::test_remove_with_force_false_explicitly_still_refuses PASSED [ 99%] +tests/unit/test_workspace_remove.py::test_remove_rejects_invalid_name_before_touching_disk PASSED [100%] + +=============================== warnings summary =============================== +tests/unit/test_webapp_setup.py:29 + /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/tests/unit/test_webapp_setup.py:29: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead. + from starlette.testclient import TestClient # noqa: E402 + +.venv/lib/python3.12/site-packages/starlette/testclient.py:53 + /home/bkrabach/dev/hw-model-performance/lanes/wp6-error-regex-scope/amplifier-work-tracker/.venv/lib/python3.12/site-packages/starlette/testclient.py:53: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead. + _PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]] + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================= 813 passed, 2 warnings in 45.46s ======================= diff --git a/tests/_util.py b/tests/_util.py index 4ba61fa..0a206be 100644 --- a/tests/_util.py +++ b/tests/_util.py @@ -8,25 +8,101 @@ import re import subprocess -_ERROR_WORD_RE = re.compile(r"\berror\b", re.IGNORECASE) +# -------------------------------------------------------------------------- +# What counts as "this command printed an error". +# +# The check below used to be a bare `\berror\b`. That is not a test for an +# error being EMITTED -- it is a test for the word "error" appearing, and a +# command is allowed to *talk about* errors while succeeding. `doctor` prints +# every assumption's own DESCRIPTION on a healthy run, so in a catalogue whose +# subject matter is error handling, one honest sentence turned a green run +# red: `read.unavailable_not_absent`'s description ("... reports UNAVAILABLE +# (not ERROR) per project ...") matched at offset 125 and failed +# `test_doctor_quick_succeeds_against_the_real_installed_bd` on a completely +# healthy system. That blocked PR #70, which was correct in every other +# respect. Rewording the description would only move the trap to the next +# assumption. +# +# So the predicate is now a list of ANNOUNCEMENT shapes -- the shapes a +# program uses when it is reporting its own failure, rather than describing +# one. Each entry below is justified by output this project actually emits; +# none of them is a guess: +# +# 1. `error:` -- the colon announcement. `Error: unknown command +# "reclaim"` (the shipped `reap` bug this whole tier is +# named for), `ERROR: ` (adapter.py's own status +# for an unreadable project), `ERROR: tokens file not +# found` (gateway.py), and the argparse/cobra +# `: error: ` shape all land here. Deliberately +# NOT anchored to the start of a line: a real +# announcement is routinely preceded by a program name, +# a log prefix, or a table column. +# 2. `"error": ..` -- the JSON shape, with a non-empty value. `supervisor.py` +# writes `{"error": str(e)}` into payloads the CLI +# prints, and `{"error": "boom"}` alongside exit 0 is +# exactly the silent failure this tier exists to catch. +# A null/empty value is the "no error" reading of the +# same field and is deliberately not matched. +# 3. `error running`-- announcement without a colon; named in the item. +# 4. `unknown command` -- the shipped bug's own words, kept as a shape in +# its own right so the guard survives the announcement +# prefix changing. +# 5. `Traceback` -- a Python crash printed while exiting 0 is the same +# silent-failure shape wearing different clothes. +# +# The line this must NOT match is ordinary prose that happens to contain the +# word: "(not ERROR)", "retryable serialization errors", "an error is +# reported". Those describe; they do not announce. +# +# Widening this list is cheap and safe. NARROWING it retires a guarantee -- +# see tests/unit/test_error_announcement_detection.py, which pins both +# directions in one file so the distinction cannot silently collapse again. +# -------------------------------------------------------------------------- + +_ERROR_ANNOUNCEMENT_RES: tuple[tuple[str, re.Pattern[str]], ...] = ( + ("error-colon", re.compile(r"\berror\s*:", re.IGNORECASE)), + ("json-error-field", re.compile(r'"error"\s*:\s*(?!null\b|""|\[\]|\{\})\S')), + ("error-running", re.compile(r"\berror\s+running\b", re.IGNORECASE)), + ("unknown-command", re.compile(r"\bunknown command\b", re.IGNORECASE)), + ("python-traceback", re.compile(r"^Traceback \(most recent call last\):", re.MULTILINE)), +) + + +def error_announcement(text: str) -> tuple[str, str] | None: + """Return `(shape_name, matched_text)` for the first error ANNOUNCEMENT + in `text`, or None if the text merely mentions errors. + + Naming the shape is not decoration: it is what tells a reader of a CI + failure whether the guard fired on a real announcement or on prose. + """ + for name, pattern in _ERROR_ANNOUNCEMENT_RES: + m = pattern.search(text or "") + if m: + return name, m.group(0) + return None def looks_like_error_text(text: str) -> bool: - return bool(_ERROR_WORD_RE.search(text or "")) + return error_announcement(text) is not None def assert_no_silent_failure(result: subprocess.CompletedProcess) -> None: """The invariant this whole tier exists to enforce: a command that - prints error-looking text must never also report success (exit 0). + ANNOUNCES an error must never also report success (exit 0). This is precisely the shape of the two shipped bugs this suite is named to prevent from recurring: `amplifier-work-tracker reap` printed `Error: unknown command "reclaim"` to stderr and still exited 0. + + "Announces" and "mentions" are different things, and keeping them + different is the whole job -- see the shape list above. """ combined = (result.stdout or "") + (result.stderr or "") - if looks_like_error_text(combined): + hit = error_announcement(combined) + if hit: + shape, matched = hit assert result.returncode != 0, ( - "command printed error-looking text but exited 0 (this is " + "command printed an error announcement but exited 0 (this is " "exactly the silent-failure shape amplifier-work-tracker shipped before): " - f"{combined[:500]!r}" + f"shape={shape} matched={matched!r} in {combined[:500]!r}" ) diff --git a/tests/unit/test_error_announcement_detection.py b/tests/unit/test_error_announcement_detection.py new file mode 100644 index 0000000..3a0f2c6 --- /dev/null +++ b/tests/unit/test_error_announcement_detection.py @@ -0,0 +1,211 @@ +"""Tier 1 -- `tests._util.assert_no_silent_failure`'s own predicate: the +difference between a command that ANNOUNCES an error and one that merely +MENTIONS the word. + +Both directions live in this one file on purpose. The failure mode being +fenced is not "the check is too strict" or "the check is too loose" -- +it is the two collapsing into each other. A fix that only proved the +innocent case passes would have retired the guarantee; a check that only +proved the guilty case fails is what shipped and blocked PR #70. Split +across two files, one half can be deleted without the other noticing. + +The assertions below are written against `looks_like_error_text` and +`assert_no_silent_failure` -- the API that existed BEFORE this change -- +so that running this file against the parent commit reports the real +diagnosis (prose classified as an error) rather than an AttributeError on +a helper that did not exist yet. `error_announcement`, which additionally +names WHICH shape fired, is exercised in one dedicated test at the end. + +Why this is tier 1 and not tier 3: the CLI-tier test that actually +surfaced this (`test_doctor_quick_succeeds_against_the_real_installed_bd`) +is invisible on any machine whose sweep heartbeats live outside the test +root -- there `doctor` exits 1 and the test dies at the EARLIER +`assert result.returncode == 0`, never reaching the silent-failure check +(`model_performance-jyg`). A tier-1 test of the predicate itself needs no +bd, no dolt, and no healthy sweeps, so it cannot be masked that way. +""" + +from __future__ import annotations + +import subprocess + +import pytest + +from .. import _util + +# -------------------------------------------------------------------------- +# The innocent case, verbatim. +# +# This is not a synthetic sentence: it is the actual `detail` string of the +# `read.unavailable_not_absent` contract check added by PR #70 +# (microsoft/amplifier-work-tracker, branch `lane/8zv-dolt-scan-dir`, head +# 20557bc, src/amplifier_work_tracker/contract.py:1372-1374). The old +# `\berror\b` predicate matched `ERROR` inside "(not ERROR)" at offset 125 +# and failed the doctor test on a completely healthy system. +# -------------------------------------------------------------------------- + +PR70_DETAIL = ( + "an infrastructure read failure raises BeadsUnavailableError with its cause " + "intact on read/claim and reports UNAVAILABLE (not ERROR) per project, while " + "genuine absence on a healthy database still reports plain 'not found'" +) + + +def _doctor_line(check_id: str, detail: str, *, mark: str = "PASS", width: int = 41) -> str: + """One rendered `doctor` row, in cli.cmd_doctor's own format: + + print(f" [{r.mark}] {r.id:<{width}} {r.detail}") + + `width` is the longest check id in the run; 41 is the observed width of + a real `doctor --quick` run on this branch. The exact padding does not + matter to the assertions -- what matters is that the description is + surrounded by real row furniture, not tested as a bare sentence. + """ + return f" [{mark}] {check_id:<{width}} {detail}" + + +HEALTHY_DOCTOR_TAIL = "\nAll 35 assumptions hold. Safe to run parallel agents.\n" + + +# --------------------------------------------------------- prose is not an error + + +def test_pr70_description_is_prose_not_an_announcement(): + """The sentence that actually blocked a PR.""" + assert _util.looks_like_error_text(PR70_DETAIL) is False + + +def test_healthy_doctor_run_carrying_pr70s_description_is_not_a_silent_failure(): + """The end-to-end shape: a `doctor --quick` run that passes every + assumption, including PR #70's, and exits 0.""" + stdout = ( + _doctor_line("version", "bd 1.1.2") + + "\n" + + _doctor_line( + "conflict.retryable", + "Write conflicts surface as retryable serialization errors", + ) + + "\n" + + _doctor_line("read.unavailable_not_absent", PR70_DETAIL) + + "\n" + + HEALTHY_DOCTOR_TAIL + ) + result = subprocess.CompletedProcess( + args=["doctor", "--quick"], returncode=0, stdout=stdout, stderr="" + ) + _util.assert_no_silent_failure(result) # must not raise + + +@pytest.mark.parametrize( + "text", + [ + # A real assumption description from src/amplifier_work_tracker/adapter.py. + "Write conflicts surface as retryable serialization errors", + # The shape of the sentence that blocked #70, isolated. + "reports UNAVAILABLE (not ERROR) per project", + # Prose about the guard itself. + "an infrastructure read failure raises BeadsUnavailableError", + "this command never reports an error it did not observe", + "ERROR and UNAVAILABLE are different readings of the same field", + # A JSON field explicitly saying there was NO error. + '{"ok": true, "error": null}', + '{"ok": true, "error": ""}', + ], +) +def test_mentioning_errors_is_not_announcing_one(text): + assert _util.looks_like_error_text(text) is False, ( + f"{text!r} was classified as an error announcement -- the check is back to " + f"failing commands for talking about errors while succeeding" + ) + + +# ------------------------------------------- the guarantee, still standing + + +@pytest.mark.parametrize( + "text", + [ + # THE bug. `amplifier-work-tracker reap` printed this to stderr and + # exited 0. If this row ever stops failing, the guard is gone. + 'Error: unknown command "reclaim"', + # ...preceded by other output, which is how it actually appeared. + 'reaping stale holds...\nError: unknown command "reclaim"\n', + # adapter.py's own status for a project whose database cannot be read, + # as `instances` renders it -- indented, in a table column. + " brokenqueue TOTAL - READY - HELD - ERROR: database unreachable", + # gateway.py. + "ERROR: tokens file not found: /etc/awt/tokens.json", + # argparse / cobra. + "amplifier-work-tracker: error: unrecognized arguments: --nope", + "internal error: connection reset by peer", + # supervisor.py writes {"error": str(e)} into printed payloads. + '{"custody": {"error": "dolt: connection refused"}}', + "error running bd list --json", + # The two rows below are NEW coverage: neither contains the word + # "error" at all, so the parent commit's `\berror\b` predicate missed + # both. A Go CLI that renames its announcement prefix, and a Python + # crash, are the same silent failure wearing different clothes. + 'unknown command "reclaim" for "bd"', + 'Traceback (most recent call last):\n File "cli.py", line 1\n', + ], +) +def test_real_error_announcements_are_still_caught(text): + assert _util.looks_like_error_text(text) is True, ( + f"{text!r} is a real error announcement and was NOT detected -- the " + f"silent-failure guarantee has been retired, not repaired" + ) + + +def test_the_shipped_reap_bug_still_fails_the_assertion(): + """The whole point, stated as the assertion callers actually make: + `Error: unknown command "reclaim"` on stderr with exit 0 must raise.""" + result = subprocess.CompletedProcess( + args=["reap"], + returncode=0, + stdout="", + stderr='Error: unknown command "reclaim"\n', + ) + with pytest.raises(AssertionError, match="exited 0"): + _util.assert_no_silent_failure(result) + + +def test_an_announced_error_with_a_nonzero_exit_is_fine(): + """The guard is about the COMBINATION. A command that announces an error + and exits non-zero is behaving correctly and must not be flagged.""" + result = subprocess.CompletedProcess( + args=["reap"], + returncode=1, + stdout="", + stderr='Error: unknown command "reclaim"\n', + ) + _util.assert_no_silent_failure(result) # must not raise + + +def test_announcements_are_found_across_the_stdout_stderr_seam(): + """`assert_no_silent_failure` concatenates the two streams; an + announcement on stderr must be caught even when stdout is chatty.""" + result = subprocess.CompletedProcess( + args=["reap"], + returncode=0, + stdout="reclaimed 0 holds\n", + stderr="ERROR: database unreachable\n", + ) + with pytest.raises(AssertionError): + _util.assert_no_silent_failure(result) + + +def test_the_failure_message_names_which_shape_fired(): + """A CI reader must be able to tell a real announcement from a false + positive without re-deriving the regex. `error_announcement` returns the + shape name and the matched text; `assert_no_silent_failure` puts both in + the assertion message.""" + assert _util.error_announcement(PR70_DETAIL) is None + assert _util.error_announcement('Error: unknown command "reclaim"') == ( + "error-colon", + "Error:", + ) + result = subprocess.CompletedProcess( + args=["reap"], returncode=0, stdout="", stderr='Error: unknown command "reclaim"\n' + ) + with pytest.raises(AssertionError, match=r"shape=error-colon"): + _util.assert_no_silent_failure(result)