# Task 12 report — owner migration gate (#46) ## Current owner-gate record This section supersedes every historical section below. The owner-gate run at `d4818c8` observed **225 passed, 1 warning**. The final-review fix added five regressions to the selected files; its fresh run of `bash scripts/evidence-restructuring-acceptance.sh` observed **230 passed, 1 warning**. Both runs remained hermetic: they used only an isolated temporary authoring workspace and did not receive or mutate a PSD path. The authorized read-only PSD owner-gate package inspected the clean repository at immutable commit `47516f85b4db4a67cfa8a86cea4cb2e7b98c5813`. It recorded 35 moveable source documents plus the retained `psd-clinical/evidence/README.md` (36 current Evidence files total), and the narrow legacy Qdrant baseline: 163 `schema_table`, 2,275 `schema_column`, 2 `memory`, and 1 `solved_question`. The replacement observations used exact filtered counts and at most three IDs per kind with `with_payload:false` and `with_vector:false`. PSD Git status remained clean; no secret was read and no external mutation, branch, migration, activation, commit, or push occurred. The real Pi call, PSD migration, human Git review, authoritative pre/post vector inspection, activation, and complete manual walkthrough remain pending in issue #47 until the owner authorizes the migration window and exact target branch. The current package is read-only preparation, not migration or manual acceptance. ## Historical record — explicitly superseded Everything below preserves the sequence of earlier Task 12 runs for audit history only. Counts, scope statements, and pending-inventory wording below are not current; the current owner-gate record above and `docs/testing/evidence-restructuring-manual.md` are authoritative. ### Initial scope and boundary Implemented only ThothII-local artifacts: - `harness/tests/fixtures/evidence_authoring/poorly_structured.md` supplies prose, a rough list, enum values, URL, ambiguity, and a PostgreSQL-expression candidate. - `scripts/evidence-restructuring-acceptance.sh` uses a fake restructurer and an isolated `mktemp` authoring workspace. It never receives, discovers, or accesses a PSD path; it also asserts that the ThothII worktree status is unchanged. - `docs/testing/evidence-restructuring-manual.md` is the owner-gate package and manual procedure. It intentionally leaves the PSD 36-path inventory, PSD commit, and before-counts pending authorization. - `PROJECT_STATE.md` records only the observed hermetic result and says that issue #47 is pending. No external PSD authoring repository was accessed, modified, staged, migrated, or inspected. No GitHub issue was closed. ### Initial TDD record RED: ```text cd harness && .venv/bin/pytest -q tests/test_evidence_restructuring_fixture.py FAILED: FileNotFoundError for fixtures/evidence_authoring/poorly_structured.md ``` GREEN: ```text cd harness && .venv/bin/pytest -q tests/test_evidence_restructuring_fixture.py 1 passed cd harness && .venv/bin/ruff check . All checks passed! ``` ### Initial hermetic acceptance evidence ```text bash scripts/evidence-restructuring-acceptance.sh PASS hermetic fake-restructurer: split, review, Git recovery/diff, no-op, dirty, upgrade, orphan PASS isolation: only a temporary workspace was supplied; no external PSD path was read or written 222 passed, 1 warning PASS evidence restructuring automated acceptance ``` The runner directly proves typed splitting; visible unresolved-review and orphan validation failures; one-source manifest membership; recovery of the committed curated baseline and a visible Git diff; unchanged no-op; dirty-state refusal; no-write pipeline mismatch refusal and explicit all-source upgrade. Its selected suites cover all eight typed kinds, no-tool/no-session Pi invocation, formula acceptance/rejection, atomic semantic chunking and the 4,000-character policy, candidate evaluation and inactive-generation failure behavior, deterministic query rendering, hybrid branch and fused ranks, fail-closed search, and the pinned Qdrant Italian-BM25 L0 contract. ### Initial required local gates | Gate | Result | | --- | --- | | `harness/.venv/bin/pytest -q` | PASS — 1080 passed, 4 deselected, 53 warnings | | `harness/.venv/bin/ruff check .` | PASS | | `backend/npx tsc --noEmit -p .` | PASS | | `backend/npx vitest run` | FAIL — pre-existing failures listed below | | `tools/tht/go build ./cmd/tht` | PASS | | `tools/tht/go test ./...` | FAIL / timeout — pre-existing failures listed below | | `bash scripts/evidence-restructuring-acceptance.sh` | PASS — 222 passed, 1 warning | #### Baseline proof for unrelated failures The immutable pre-task source `0caa747` was checked out to a temporary detached worktree. Its targeted backend run reproduced the same 12 stable failures: - all ten failures in `test/auth-runtime-projection.test.ts` (`authentication runtime projection is invalid`); - `test/health.test.ts` expects Node 24 but the host runs Node 25; - `test/auth-routes-local.test.ts` expects the third Argon2 request to receive 429 but receives 401. The native host suite was run first unbounded and remained silent for more than seven minutes, then was rerun with `go test ./... -timeout 20s`. Both the task worktree and the detached `0caa747` baseline reproduce the same failures: - `internal/authconfig: TestRunProjectedMutationHoldsOuterLockAcrossCanonicalAndProjection` times out; - `internal/backup` restore/auth publication assertions fail; - `internal/setup` projected-server/root assertions fail. These packages and backend files were not changed by Task 12. The suite failures are therefore recorded as pre-existing concerns and were not repaired or hidden. ### Initial pending owner decision Focused ThothII commit: `fc83d29b5836b4db173e0874689426ecf2da526f` (`test(evidence): record restructuring acceptance`). Issue #46 is ready for the owner migration authorization gate. Issue #47 remains pending: the owner must authorize the migration window and exact PSD branch before any external repository inspection, 36-file inventory, migration, validation, activation, or manual PSD acceptance work begins. ### Fix round 1 evidence (Task 12 review) #### TDD RED: ```text cd harness && .venv/bin/pytest -q tests/test_evidence_candidate_publication.py tests/test_evidence_restructuring_fixture.py FAILED: acceptance runner did not include test_evidence_candidate_publication.py ``` The first integrated-test draft also exposed that the real configuration refuses a non-1024 embedding dimension; the fake was corrected to model the production contract instead of bypassing configuration loading. GREEN: ```text cd harness && .venv/bin/pytest -q tests/test_evidence_candidate_publication.py tests/test_evidence_restructuring_fixture.py 3 passed, 1 warning cd harness && .venv/bin/ruff check tests/test_evidence_candidate_publication.py tests/test_evidence_restructuring_fixture.py All checks passed! bash scripts/evidence-restructuring-acceptance.sh 224 passed, 1 warning ``` The new integrated test invokes the real v2 canonical-corpus validator, the real `preprocess_cmd._candidate_evaluator`, and `CorpusPipeline`, with an observable store, vector writer, and searcher. It records nine exact-generation branch searches (dense, BM25, fused for lexical, semantic, and mixed queries), asserts that the candidate is not ACTIVE during any search, publishes only after the PASS report, then proves a failed candidate remains inactive and is compensated. It also asserts the 4,000 default, rendered fragment bound, and rejection/absence of parallel vector-size aliases. The acceptance probe now creates a real temporary Git repository, commits its initial and proposed corpus, makes `evidence/curated` genuinely dirty, and calls `prepare_workspace_evidence` with the default Git-status detection path. It restores the temporary file before continuing; no injected `git_status` is used by the dirty case, no-op, pipeline mismatch, or explicit upgrade checks. #### Authorized read-only PSD preparation The PSD repository was inspected read-only at immutable commit `47516f85b4db4a67cfa8a86cea4cb2e7b98c5813`. `git status --porcelain` was empty before and after, `git diff --quiet` succeeded after, and no PSD secret, worktree content beyond the listed source names, or mutation command was used. The exact 36 paths, concrete rollback command, and Qdrant baseline are now in `docs/testing/evidence-restructuring-manual.md`. Read-only Qdrant observation for `127.0.0.1:6333`, collection `psd-clinical`: `schema_table=163`, `schema_column=2275`, `memory=2`, `solved_question=1`; the manual records representative IDs. The standard `tht workspace vector inspect --json` command was attempted, but its temporary maintenance container stopped before Qdrant access because production auth configuration was unavailable. No secret was read to bypass that guard; the owner-gate package explicitly requires repeating the contract command immediately before authorized preprocessing. Fresh no-write verification after the inspection: ```text status_lines=0 diff_quiet_exit=0 head=47516f85b4db4a67cfa8a86cea4cb2e7b98c5813 ``` Fresh required-gate evidence for this fix round: ```text harness pytest: 1082 passed, 4 deselected, 53 warnings harness ruff: PASS acceptance runner: 224 passed, 1 warning backend tsc: PASS backend vitest: 12 failures, exactly reproduced at baseline 0caa747 Go build: PASS Go test -timeout 20s: authconfig timeout plus backup/setup failures, exactly reproduced at baseline 0caa747 ``` Fix-round commit: `8542124f2737354b7ae35973933fc38ca85a31c1` (`test(evidence): harden owner gate acceptance`). ### Fix round 2 evidence (Task 12 re-review) #### TDD RED: ```text cd harness && .venv/bin/pytest -q tests/test_evidence_restructuring_fixture.py 1 failed, 2 passed, 1 warning ``` The new manual-contract test failed because the package still described 36 source documents and retained the old broad Qdrant request. GREEN: the package now distinguishes exactly 35 moveable source documents from the retained `psd-clinical/evidence/README.md` (36 current evidence files total). The authorized migration instruction moves exactly the 35 listed documents to `evidence/source/` and retains the README at its current path; the owner-only rollback restores the immutable pre-migration SHA. #### Narrow replacement Qdrant baseline The prior `with_payload:true` full-collection scroll was out-of-scope and is withdrawn as evidence. It is not a permitted fallback, and this report makes no claim that it did not materialize payloads. On 2026-08-25, the replacement baseline sent, for each of `schema_table`, `schema_column`, `memory`, and `solved_question`: ```text POST /collections/psd-clinical/points/count {"filter":{"must":[{"key":"record_kind","match":{"value":""}}]},"exact":true} POST /collections/psd-clinical/points/scroll {"filter":{"must":[{"key":"record_kind","match":{"value":""}}]},"limit":3,"with_payload":false,"with_vector":false} ``` The resulting no-payload/no-vector observations were: ```text schema_table=163: 01bc2535-24d6-5722-a58b-64a122b90b36, 024ddf60-c80d-5223-ac06-9247e7de7027, 086e00c8-b4a9-5063-b82d-e5a67add29cd schema_column=2275: 00126cc1-7564-521a-a084-c2d670263258, 00365200-2c55-5bb4-86bb-87dd2d1bb529, 004304bc-b543-5b2d-8b40-f18da8e82af7 memory=2: 8d5cd772-563a-5e22-b764-2ca76cf6efca, db74457a-3de8-5b95-9a31-d28a1ecf8141 solved_question=1: 2b6bb7d2-1a35-5f49-bd8d-b0cdcb98459a ``` No secret was read, no PSD mutation/stage/branch/commit/migration/activation/push command was invoked, and the PSD repository remained at `47516f85b4db4a67cfa8a86cea4cb2e7b98c5813` with empty porcelain status and a successful `git diff --quiet` after the replacement queries. The standard `tht workspace vector inspect --json` attempt remains blocked by missing production auth and must be repeated successfully immediately before any owner-authorized preprocessing. Focused correction gates: ```text cd harness && .venv/bin/pytest -q tests/test_evidence_restructuring_fixture.py 3 passed, 1 warning cd harness && .venv/bin/ruff check tests/test_evidence_restructuring_fixture.py All checks passed! bash scripts/evidence-restructuring-acceptance.sh 225 passed, 1 warning ``` Fix-round commit: `d4818c8cc33b8b11204377ff3cc65c6c9ee1425e` (`docs(evidence): narrow owner gate baseline`).