docs(task15): record retained-handle fix evidence

This commit is contained in:
2026-08-18 09:15:14 +02:00
parent 74b062f1a7
commit d7cd8fdf94
4 changed files with 92 additions and 79 deletions
+13 -12
View File
@@ -6,7 +6,8 @@
"fix_round2": "fe190e7046acc173f510dddcb32f46ed142858c1", "fix_round2": "fe190e7046acc173f510dddcb32f46ed142858c1",
"maintenance_profile_follow_up": "4d230b87afdcd24f02264f8f937c8628b92db05a", "maintenance_profile_follow_up": "4d230b87afdcd24f02264f8f937c8628b92db05a",
"fix_round3_and_final_docker": "e20bf33e2a00102192e5be66b178037aeca3a7b1", "fix_round3_and_final_docker": "e20bf33e2a00102192e5be66b178037aeca3a7b1",
"fix_round4_streamed_archive_privacy": "54698e73400a54ce7c3e6c10099e14eb471ce8b9" "fix_round4_streamed_archive_privacy": "54698e73400a54ce7c3e6c10099e14eb471ce8b9",
"fix_round5_retained_handle_private_creation": "74b062f1a737103524cbe706346cfd65f87cdfd1"
}, },
"versions": { "versions": {
"node_contract": "v24.16.0", "node_contract": "v24.16.0",
@@ -23,10 +24,10 @@
}, },
"unified_docker_smoke": { "unified_docker_smoke": {
"status": "PASS", "status": "PASS",
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9", "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1",
"run_id": "20260818061612-31842-22636", "run_id": "20260818070637-66409-30058",
"manifest": ".artifacts/task-15/unified-docker-images.json", "manifest": ".artifacts/task-15/unified-docker-images.json",
"manifest_sha256": "d6845cb3436872ee6a722916f3aa2ad058c5fd66c61333ccad18c0302933361e", "manifest_sha256": "9c8dec4546909fd93799dbcf374bcb3a89bc46cfe0fd482472c0cbe757ddf5b6",
"images": 5, "images": 5,
"cleanup": "PASS" "cleanup": "PASS"
} }
@@ -38,8 +39,8 @@
}, },
"platform_private_restore_staging": { "platform_private_restore_staging": {
"status": "PASS", "status": "PASS",
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9", "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1",
"evidence": "safeio_streamed_archive_unix_test_and_windows_static_cross_compile" "evidence": "safeio_unix_ancestor_swap_red_green_and_windows_rootdirectory_static_cross_compile"
}, },
"provider_fixture": { "provider_fixture": {
"status": "PASS", "status": "PASS",
@@ -62,18 +63,18 @@
"files": 2, "files": 2,
"node": "v24.16.0", "node": "v24.16.0",
"sentinel_leak_scan": "PASS", "sentinel_leak_scan": "PASS",
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9" "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1"
}, },
"go_race_build": { "go_race_build": {
"status": "PASS", "status": "PASS",
"packages": 18, "packages": 18,
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9" "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1"
}, },
"windows_cross_compile": { "windows_cross_compile": {
"status": "PASS", "status": "PASS",
"packages": 18, "packages": 18,
"execution": "cross_compile_only_not_native_execution", "execution": "cross_compile_only_not_native_execution",
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9" "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1"
}, },
"shell_and_compose_contracts": { "shell_and_compose_contracts": {
"status": "PASS", "status": "PASS",
@@ -84,12 +85,12 @@
"unified_compose", "unified_compose",
"compose_secret_policy" "compose_secret_policy"
], ],
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9" "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1"
}, },
"unified_docker_smoke": { "unified_docker_smoke": {
"status": "PASS", "status": "PASS",
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9", "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1",
"run_id": "20260818061612-31842-22636", "run_id": "20260818070637-66409-30058",
"images": 5, "images": 5,
"cleanup": "PASS" "cleanup": "PASS"
}, },
+21 -21
View File
@@ -1,9 +1,28 @@
{ {
"gate": "unified-deployment-smoke", "gate": "unified-deployment-smoke",
"status": "pass", "status": "pass",
"source_commit": "54698e73400a54ce7c3e6c10099e14eb471ce8b9", "source_commit": "74b062f1a737103524cbe706346cfd65f87cdfd1",
"run_id": "20260818061612-31842-22636", "run_id": "20260818070637-66409-30058",
"images": [ "images": [
{
"id": "sha256:2d7b19491c7eb8c119c3cedb390aaeb2ff5593f6fc43ab66c317565560da6d7d",
"roles": [
"compose-runtime",
"fixture-runtime"
],
"repo_digests": [
"sha256:2d7b19491c7eb8c119c3cedb390aaeb2ff5593f6fc43ab66c317565560da6d7d"
]
},
{
"id": "sha256:3b6c31a5d8f8fc58fa3233391b6175bd2fbc793eebb44d5e285ecc6e02e9e687",
"roles": [
"compose-runtime"
],
"repo_digests": [
"sha256:3b6c31a5d8f8fc58fa3233391b6175bd2fbc793eebb44d5e285ecc6e02e9e687"
]
},
{ {
"id": "sha256:57f573b47f1f71ebb445789f279fe3e596a8beab182f7cf486db9205bad87c5a", "id": "sha256:57f573b47f1f71ebb445789f279fe3e596a8beab182f7cf486db9205bad87c5a",
"roles": [ "roles": [
@@ -22,25 +41,6 @@
"sha256:75eab8c4ba42096724fdcfde8b4de0b5713d529dde32f285a1f86fdcb2c9e50c" "sha256:75eab8c4ba42096724fdcfde8b4de0b5713d529dde32f285a1f86fdcb2c9e50c"
] ]
}, },
{
"id": "sha256:9e59fd16740628538879652e9fb94472ef4f192418bfd5203fdf6a929df80532",
"roles": [
"compose-runtime"
],
"repo_digests": [
"sha256:9e59fd16740628538879652e9fb94472ef4f192418bfd5203fdf6a929df80532"
]
},
{
"id": "sha256:b3441d8c9ce6c95fc28eb6df8db1eb83d522e72e2a9d2a0709edb99f53ef5ad5",
"roles": [
"compose-runtime",
"fixture-runtime"
],
"repo_digests": [
"sha256:b3441d8c9ce6c95fc28eb6df8db1eb83d522e72e2a9d2a0709edb99f53ef5ad5"
]
},
{ {
"id": "sha256:c3cbe1cc1aa588a64951ac6286e0df7b27fe2e6324b1001c619bb358770c0178", "id": "sha256:c3cbe1cc1aa588a64951ac6286e0df7b27fe2e6324b1001c619bb358770c0178",
"roles": [ "roles": [
@@ -1,36 +1,44 @@
# Task 15 retained release-gate report — fix round 4 (sanitized) # Task 15 retained release-gate report — fix round 5 (sanitized)
- Final tested source commit: `54698e73400a54ce7c3e6c10099e14eb471ce8b9`. - Final tested source commit: `74b062f1a737103524cbe706346cfd65f87cdfd1`.
- Historical retained source commits: fix-round-2 `fe190e7046acc173f510dddcb32f46ed142858c1`, - Historical retained source commits: fix-round-2 `fe190e7046acc173f510dddcb32f46ed142858c1`,
maintenance follow-up `4d230b87afdcd24f02264f8f937c8628b92db05a`, and prior final Docker maintenance follow-up `4d230b87afdcd24f02264f8f937c8628b92db05a`, prior final Docker
source `e20bf33e2a00102192e5be66b178037aeca3a7b1`. source `e20bf33e2a00102192e5be66b178037aeca3a7b1`, and fix-round-4 streamed
archive privacy `54698e73400a54ce7c3e6c10099e14eb471ce8b9`.
- Versions: Node contract `v24.16.0`; host default Node `v25.6.1`; Go `go1.26.5`; - Versions: Node contract `v24.16.0`; host default Node `v25.6.1`; Go `go1.26.5`;
Pi `0.80.3`. Pi `0.80.3`.
- Automated gate artifact: `.artifacts/task-15/automated-gates.json`; - Automated gate artifact: `.artifacts/task-15/automated-gates.json`;
SHA-256 `cce61f6a51ea0a3312e26b7b38a2601512b3e45cd4177d37e60ed7d7ee5cf110`. SHA-256 `7d9ec93af15510605f1aa7179b26a7ee46d78122f647854300f7a9922057a63f`.
- Docker image manifest: `.artifacts/task-15/unified-docker-images.json`; - Docker image manifest: `.artifacts/task-15/unified-docker-images.json`;
SHA-256 `d6845cb3436872ee6a722916f3aa2ad058c5fd66c61333ccad18c0302933361e`. SHA-256 `9c8dec4546909fd93799dbcf374bcb3a89bc46cfe0fd482472c0cbe757ddf5b6`.
## Fix-round-4 evidence ## Fix-round-5 evidence
- PASS: test-first safe-I/O stream creator. The focused test first failed because - PASS, RED then GREEN: `TestCreateCanonicalNewPrivateFileUsesPinnedParentAfterAncestorSwap`
`CreateCanonicalNewPrivateFile` was absent; after implementation, four native selected tests first failed because the creator had not retained its parent before creation. It now opens every
passed: the safe-I/O read/write stream, Unix staged-file privacy, post-write cleanup, and Unix ancestor once, creates the leaf with `openat(O_NOFOLLOW|O_CREAT|O_EXCL)`, applies and checks
immutable staged bytes. The staged archive now enters through safeio with an exclusive private `0600` by descriptor (`fchmod`/`fstat`), and uses `unlinkat` for creator failure cleanup. The
parent, `0600` Unix regular-file protection, and an owner-only DACL set in the Windows creation deterministic test moves the opened parent, replaces its lexical name with an outside symlink,
call before archive bytes are streamed. validates the archive under the moved original parent, and proves no outside archive was written.
- PASS: full backup and safe-I/O package tests and their race runs. The final source also passed - PASS: the Windows implementation uses NT `RootDirectory`-relative traversal for every component
`go test -race ./...` across `18` packages and a native host `tht` CLI build. after the volume root and for final file creation. The retained final parent receives only the
- PASS: Windows amd64 static test/build cross-compile across `18` packages, including the staged required child-create right (`FILE_WRITE_DATA` for a file, `FILE_APPEND_DATA` for a directory),
archive Windows test that calls `safeio.ValidatePrivateRegular`. This was **cross-compile only**; reparse points are rejected, and the owner-only protected DACL is installed in the same
no Windows executable was run. Native execution remains PENDING. `NtCreateFile` operation. The native-Windows test attempts the pre-create parent swap and calls
- PASS on Node `v24.16.0`: the hermetic OIDC/F1 authentication browser smoke passed for the `safeio.ValidatePrivateRegular`; it is compiled but not executed on this host.
current `8` checks in `frontend/e2e/auth.spec.ts` and `frontend/e2e/f1.spec.ts`; its exact - PASS: `go test ./internal/safeio ./internal/backup -count=1`, `go test -race ./...` across
runtime sentinel leak scan passed. `18` packages, `go vet ./...`, and a native host `tht` CLI build. Existing StageArchive
capacity, lifecycle, rollback, streaming, and cleanup tests remain passing.
- PASS, compile-only: Windows amd64 static test/build compilation across `18` packages, including
the retained-handle Windows tests. No Windows executable was run; native execution remains
PENDING and is not inferred from compilation.
- PASS on Node `v24.16.0`: the hermetic OIDC/F1 authentication browser smoke passed all current
`8` checks in `frontend/e2e/auth.spec.ts` and `frontend/e2e/f1.spec.ts`; the runtime sentinel
leak scan passed.
- PASS: shell syntax, unified-smoke safety self-test, default Compose contract, unified Compose - PASS: shell syntax, unified-smoke safety self-test, default Compose contract, unified Compose
contract, and Compose secret-policy contract. contract, and Compose secret-policy contract.
- PASS: final unified Docker deployment smoke run `20260818061612-31842-22636`, bound to source - PASS: final unified Docker deployment smoke run `20260818070637-66409-30058`, bound exactly to
`54698e73400a54ce7c3e6c10099e14eb471ce8b9`. It exercised the maintenance-auth isolation check, source `74b062f1a737103524cbe706346cfd65f87cdfd1`. It exercised maintenance-auth isolation,
restore, registry lifecycle, bad-candidate rollback, image revalidation, and task-scoped cleanup. restore, registry lifecycle, bad-candidate rollback, image revalidation, and task-scoped cleanup.
## Sanitized final unified Docker output ## Sanitized final unified Docker output
@@ -45,19 +53,19 @@
== Reject the retired flat workspace layout and retain the valid snapshot == == Reject the retired flat workspace layout and retain the valid snapshot ==
== Inject a bad pinned Pi candidate and prove automatic rollback == == Inject a bad pinned Pi candidate and prove automatic rollback ==
Task 13 full deployment smoke passed. Task 13 full deployment smoke passed.
Task 13 cleanup proof: no labeled containers, volumes, networks, or images remain for 20260818061612-31842-22636. Task 13 cleanup proof: no labeled containers, volumes, networks, or images remain for 20260818070637-66409-30058.
``` ```
## Sanitized Docker image identities ## Sanitized Docker image identities
- `sha256:2d7b19491c7eb8c119c3cedb390aaeb2ff5593f6fc43ab66c317565560da6d7d`;
roles `compose-runtime`, `fixture-runtime`.
- `sha256:3b6c31a5d8f8fc58fa3233391b6175bd2fbc793eebb44d5e285ecc6e02e9e687`;
role `compose-runtime`.
- `sha256:57f573b47f1f71ebb445789f279fe3e596a8beab182f7cf486db9205bad87c5a`; - `sha256:57f573b47f1f71ebb445789f279fe3e596a8beab182f7cf486db9205bad87c5a`;
role `compose-runtime`. role `compose-runtime`.
- `sha256:75eab8c4ba42096724fdcfde8b4de0b5713d529dde32f285a1f86fdcb2c9e50c`; - `sha256:75eab8c4ba42096724fdcfde8b4de0b5713d529dde32f285a1f86fdcb2c9e50c`;
role `compose-runtime`. role `compose-runtime`.
- `sha256:9e59fd16740628538879652e9fb94472ef4f192418bfd5203fdf6a929df80532`;
role `compose-runtime`.
- `sha256:b3441d8c9ce6c95fc28eb6df8db1eb83d522e72e2a9d2a0709edb99f53ef5ad5`;
roles `compose-runtime`, `fixture-runtime`.
- `sha256:c3cbe1cc1aa588a64951ac6286e0df7b27fe2e6324b1001c619bb358770c0178`; - `sha256:c3cbe1cc1aa588a64951ac6286e0df7b27fe2e6324b1001c619bb358770c0178`;
role `rollback-candidate`. role `rollback-candidate`.
@@ -66,7 +74,7 @@ names and credentials are deliberately omitted.
## Complete observed matrix ## Complete observed matrix
- PASS: Task 13 lifecycle carry-ins; streamed owner-private restore staging; provider fixture - PASS: Task 13 lifecycle carry-ins; retained-handle owner-private restore staging; provider fixture
round-one `6/6`; backend Node 24 round-one suite `75 files / 1081 tests`; frontend Node 24 round-one `6/6`; backend Node 24 round-one suite `75 files / 1081 tests`; frontend Node 24
round-one suite `61 files / 444 tests`; current Node 24 authentication/F1 browser smoke `8/8`; round-one suite `61 files / 444 tests`; current Node 24 authentication/F1 browser smoke `8/8`;
final-source Go race/build `18 packages`; Windows static cross-compile `18 packages`; harness final-source Go race/build `18 packages`; Windows static cross-compile `18 packages`; harness
+21 -17
View File
@@ -7,7 +7,7 @@
> ThothII per il repository (app + CLI `thothctl`), (3) come usare l'applicazione ThothII di base > ThothII per il repository (app + CLI `thothctl`), (3) come usare l'applicazione ThothII di base
> (sessioni, domande, gate). Il documento userà parole semplici ed esempi; i dettagli tecnici > (sessioni, domande, gate). Il documento userà parole semplici ed esempi; i dettagli tecnici
> resteranno nei contratti esistenti. Esempio pratico completo: Policlinico San Donato. > resteranno nei contratti esistenti. Esempio pratico completo: Policlinico San Donato.
> Last updated: 2026-08-18 (Task 15 fix-round-4 evidence recorded; the authentication feature is > Last updated: 2026-08-18 (Task 15 fix-round-5 evidence recorded; the authentication feature is
> not complete or release-accepted while the required FAIL/PENDING gates listed below remain). > not complete or release-accepted while the required FAIL/PENDING gates listed below remain).
> Point a fresh session here ("read PROJECT_STATE.md") before substantial work. > Point a fresh session here ("read PROJECT_STATE.md") before substantial work.
@@ -16,32 +16,36 @@
- Task 13 carry-ins are closed with focused TDD: restore acquires the lifecycle lock before - Task 13 carry-ins are closed with focused TDD: restore acquires the lifecycle lock before
target-dependent preflight; stages the immutable candidate and recovery archives under that lock; target-dependent preflight; stages the immutable candidate and recovery archives under that lock;
accounts their combined capacity before mutation; and uses an opaque installation-bound accounts their combined capacity before mutation; and uses an opaque installation-bound
transaction capability. Fix-round-4 makes `StageArchive` create its streamed, secret-bearing transaction capability. Fix-round-5 makes private archive creation retain its validated parent
`archive.zip` through a narrow safeio read/write primitive: Unix keeps exact private regular-file through the full create/metadata/failure-cleanup sequence: Unix uses `openat` plus descriptor
behavior and Windows installs an owner-only DACL atomically before any archive bytes are written. `fchmod`/`fstat` and `unlinkat`; Windows uses NT `RootDirectory`-relative traversal and final
- Final tested source is `54698e73400a54ce7c3e6c10099e14eb471ce8b9`; prior final Docker source create with the owner-only DACL applied in that same operation. StageArchive capacity, lifecycle,
rollback, streaming, and cleanup behavior remain covered by its existing tests.
- Final tested source is `74b062f1a737103524cbe706346cfd65f87cdfd1`; fix-round-4
`54698e73400a54ce7c3e6c10099e14eb471ce8b9`, prior final Docker source
`e20bf33e2a00102192e5be66b178037aeca3a7b1`, fix-round-2 `e20bf33e2a00102192e5be66b178037aeca3a7b1`, fix-round-2
`fe190e7046acc173f510dddcb32f46ed142858c1`, and follow-up `fe190e7046acc173f510dddcb32f46ed142858c1`, and follow-up
`4d230b87afdcd24f02264f8f937c8628b92db05a` remain intact in history. The final unified Docker `4d230b87afdcd24f02264f8f937c8628b92db05a` remain historical provenance. The final unified
smoke is PASS for run `20260818061612-31842-22636`, including maintenance auth isolation, Docker smoke is PASS for run `20260818070637-66409-30058`, exactly bound to `74b062f...`,
restore, registry lifecycle, rollback, five-image revalidation, and task-scoped cleanup. including maintenance auth isolation, restore, registry lifecycle, rollback, five-image
revalidation, and task-scoped cleanup.
- PASS on pinned Node `v24.16.0`: provider security fixture 6/6 and current authentication/F1 - PASS on pinned Node `v24.16.0`: provider security fixture 6/6 and current authentication/F1
Playwright smoke 8/8 with the runtime sentinel used as the exact fixture credential and absent Playwright smoke 8/8 with the runtime sentinel used as the exact fixture credential and absent
from retained output. Round-1 full suites remain PASS: backend 75 files / 1081 tests, frontend from retained output. Round-1 full suites remain PASS: backend 75 files / 1081 tests, frontend
61 files / 444 tests, harness 921 passed / 4 L2 deselected. The host default Node is `v25.6.1`; 61 files / 444 tests, harness 921 passed / 4 L2 deselected. The host default Node is `v25.6.1`;
it is not the release contract and no tracked `v24.19.0` pin exists. it is not the release contract and no tracked `v24.19.0` pin exists.
- PASS: focused native TDD (`safeio` stream, Unix archive privacy, post-write cleanup, immutable - PASS: focused RED then GREEN Unix ancestor-swap creation test; full backup/safeio tests;
staged bytes); full backup/safeio tests; final-source Go race/build across 18 packages; Windows final-source Go race/vet/native-host build across 18 packages; Windows amd64 static test/build
amd64 static test/build cross-compile across 18 packages; Node 24 authentication smoke; shell cross-compile across 18 packages; Node 24 authentication smoke; shell syntax and unified safety
syntax and unified safety self-tests; default/unified Compose and secret-policy contracts; final self-tests; default/unified Compose and secret-policy contracts; final unified Docker smoke and
unified Docker smoke and cleanup. Windows results are cross-compile only; native execution of the cleanup. Windows results are compile-only; the native retained-handle
Windows-only `ValidatePrivateRegular` staged-archive test was unavailable and remains PENDING. `ValidatePrivateRegular` test was not executable on this host and remains PENDING.
- Durable sanitized evidence is tracked at `.artifacts/task-15/automated-gates.json` - Durable sanitized evidence is tracked at `.artifacts/task-15/automated-gates.json`
(`cce61f6a51ea0a3312e26b7b38a2601512b3e45cd4177d37e60ed7d7ee5cf110`), (`7d9ec93af15510605f1aa7179b26a7ee46d78122f647854300f7a9922057a63f`),
`.artifacts/task-15/unified-docker-images.json` `.artifacts/task-15/unified-docker-images.json`
(`d6845cb3436872ee6a722916f3aa2ad058c5fd66c61333ccad18c0302933361e`), and (`9c8dec4546909fd93799dbcf374bcb3a89bc46cfe0fd482472c0cbe757ddf5b6`), and
`.superpowers/sdd/2026-08-16-thothii-authentication/task-15-report.md` `.superpowers/sdd/2026-08-16-thothii-authentication/task-15-report.md`
(`628bdc6759c12c688d414825eef7b56881d96af1d91577dd9487959e90a9d0bf`). Authentication smoke (`058d4841ec3aa7296ff9ace8aff2efd12303a8e1b1a58d46d4d41941914343a9`). Authentication smoke
exercised no Docker images; the final unified run retained all five exercised image identities. exercised no Docker images; the final unified run retained all five exercised image identities.
- FAIL baseline evidence remains unchanged: Ruff reports 192 errors; MkDocs strict reports 69 - FAIL baseline evidence remains unchanged: Ruff reports 192 errors; MkDocs strict reports 69
warnings; canonical/workspace install checks have existing wording mismatches; Pi user-auth warnings; canonical/workspace install checks have existing wording mismatches; Pi user-auth