diff --git a/docs/specs/CBG-COPY-01/approvals/process-identity-test.md b/docs/specs/CBG-COPY-01/approvals/process-identity-test.md new file mode 100644 index 00000000..3943473a --- /dev/null +++ b/docs/specs/CBG-COPY-01/approvals/process-identity-test.md @@ -0,0 +1,11 @@ +# CBG-COPY-01 — process-identity verification follow-up + +- **Decision:** 2026-10-27, exact-scope implementation approved. This is a verification fix, not a product/loading contract revision. +- **Existing canonical contract:** [CBG-COPY-01/spec.md](https://github.com/rabii-chaarani/codebaseGraph/blob/75a99c840aa53e75a3f14df8dab41979c9efa19c/docs/specs/CBG-COPY-01/spec.md), revision0.2 at full Git SHA `75a99c840aa53e75a3f14df8dab41979c9efa19c`, especially A3/A9 separate-process sequential loading and exact reopen/PK/connector/search/control verification. Its existing [Scope A approval](https://github.com/rabii-chaarani/codebaseGraph/blob/75a99c840aa53e75a3f14df8dab41979c9efa19c/docs/specs/CBG-COPY-01/approval.md) and [resource-ceiling amendment approval](https://github.com/rabii-chaarani/codebaseGraph/blob/75a99c840aa53e75a3f14df8dab41979c9efa19c/docs/specs/CBG-COPY-01/resource-ceilings-approval.md) remain unchanged. The merged SHA republishes those approved historical contracts; it does not replace their originally approved SHAs. +- **User decision reference:** this conversation,2026-10-27. Assistant asked: “**Approve investigating and fixing that separate test**, while preserving process-isolation and data checks? Otherwise, I’ll leave the PR blocked.” The user replied **“approved”**. This is distinct from the earlier COD-52-only approval. +- **Baseline/evidence:** PR157 head `9e7645028013555cc78529a552e3ce0b0468c20f` (evidence-only follow-up to source `d2a442faaf4ca59dc5fe33f082b2072f49b97aa5`), failed CI40449278177, Windows integration shard3. `tests/copy_phase_process.rs:417` sees55unique numeric PIDs across56COPY trace records. Specific PID reuse is plausible, not proven from retained logs; diagnostic artifacts omit phases.jsonl. Preserve failed evidence. +- **Authorized outcome:** investigate and correct only the test/instrumentation's process-identity oracle so valid reuse of a terminated numeric PID does not fail, while repeated COPY execution in one process still fails verification. Preserve real process launch/isolation, all existing native chunk/index/thread/no-replay/Managed+Direct preservation and exact reopen/PK/connector/search/clean-control checks. Missing or malformed process evidence must not pass. +- **Scope/constraints:** narrow debug/test trace and fixture correction; use a process-lifetime identity that stays constant for multiple trace records from one helper, never a per-event/request identifier that masks same-process reuse. Add deterministic same-PID/distinct-incarnation acceptance and same-incarnation rejection coverage, plus identity stability and real native process regressions. Do not remove/weaken assertions, add retries/timeouts, change product protocol, loading, containment, native dependencies, resources or public CLI/MCP/data contracts. No merge/deployment/service restart or aggregate closure. +- **Acceptance:** final test detects genuine same-process reuse despite distinct events; accepts different process instances with reused numeric PID; actual chunked/reopen/PK/connectors/search/control test executes to completion; existing failure-preservation cases stay valid; native Mac/Windows CI actually executes the cases and aggregate results remain honest. Runner reports identify exact source/binary/native environment; configuration alone is not passing evidence. +- **Architecture/delivery:** proportional Scryer `chg-k66bxx`, existing claims only; no invented responsibilities/topology. Separate Maintenance issue links this record and the existing CBG-COPY-01 contracts. Detailed execution/ownership stays in Scryer. Prior COD-52 cursor source and approval remain unchanged. +- **State:** approved scope; implementation/verification/review/closure are separate, not implied by this record. diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/clippy.log b/docs/specs/CBG-COPY-01/process-identity-evidence/clippy.log new file mode 100644 index 00000000..9621aff2 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/clippy.log @@ -0,0 +1,3 @@ + Checking codebase-graph v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans) + Checking k-wiki v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans/crates/k-wiki) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 8.02s diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/deterministic-tests.junit.xml b/docs/specs/CBG-COPY-01/process-identity-evidence/deterministic-tests.junit.xml new file mode 100644 index 00000000..8bd8f0a7 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/deterministic-tests.junit.xml @@ -0,0 +1,37 @@ + + + + + +running 1 test +test db_writer::phase::tests::phase_trace_process_instance_is_stable_across_calls_and_threads ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + + + +running 1 test +test phase_process_oracle_accepts_reused_pid_but_rejects_reused_process ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s + + + + + + +running 1 test +test phase_process_oracle_rejects_missing_or_invalid_evidence ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s + + + + + + diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/deterministic-tests.log b/docs/specs/CBG-COPY-01/process-identity-evidence/deterministic-tests.log new file mode 100644 index 00000000..bec3fa0d --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/deterministic-tests.log @@ -0,0 +1,10 @@ + Compiling codebase-graph v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans) + Finished `test` profile [unoptimized + debuginfo] target(s) in 8.39s +──────────── + Nextest run ID b52b6dc5-841f-4f5c-92f1-e84f791f460a with nextest profile: copy-pid + Starting 3 tests across 2 binaries (848 tests skipped) + PASS [ 0.025s] (1/3) codebase-graph db_writer::phase::tests::phase_trace_process_instance_is_stable_across_calls_and_threads + PASS [ 0.019s] (2/3) codebase-graph::copy_phase_process phase_process_oracle_accepts_reused_pid_but_rejects_reused_process + PASS [ 0.017s] (3/3) codebase-graph::copy_phase_process phase_process_oracle_rejects_missing_or_invalid_evidence +──────────── + Summary [ 0.063s] 3 tests run: 3 passed, 848 skipped diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/final-review.md b/docs/specs/CBG-COPY-01/process-identity-evidence/final-review.md new file mode 100644 index 00000000..9caa2daa --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/final-review.md @@ -0,0 +1,50 @@ +# COD-98 / CBG-COPY-01 process-identity fix — final adversarial review + +## Outcome + +**No confirmed P0–P3 defect found in the reviewed change.** Proceed within the approved verification-fix scope. This source-review verdict is not native Windows qualification, aggregate CI completion, merge permission, or closure approval. + +Fresh, read-only reviewer: **GPT-6.1 Sol / Max**, using `/Users/rabii/.codex/skills/adversarial-review-engineer/SKILL.md`. The coordinator attested that `rlm.spawn(model="openai-codex/gpt-6.1-sol", thinking="max")` resolved to `openai-codex/gpt-6.1-sol`. This reviewer did not implement the change. + +## Reviewed snapshot and authority + +- Worktree: `/private/tmp/codebasegraph-cod52-macos-scans`. +- Baseline/approval commit: `931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef`. +- Approval: `docs/specs/CBG-COPY-01/approvals/process-identity-test.md`; existing CBG-COPY-01 A3/A9 and historical approvals remain unchanged. Linear **COD-98**, Scryer **chg-k66bxx**. No new responsibility, public contract, or resource policy is required. +- Reviewed patch: `implementation-diff.patch`, SHA-256 `a86248348434b968a8bddd979d35ab0dee6f903edac7064add881bd24f2f846a`. +- Actual source SHA-256, independently matched to `implementation-snapshot.json`: + - `src/db_writer/phase.rs`: `889b005587d1ce59a63ae35fdcbb1d799ae5248cc910e65cb102e23b80ffa9fa`. + - `tests/copy_phase_process.rs`: `bd6d263acba7364a2846b9cb52a669a5281026adadd7b347689e3a5bc0fdbf94`. +- Reverse-applying the supplied hunks in memory reconstructed baseline Git blobs `0e9a9b92aa5fc13ac34f39313f032aee9223804b` and `f47449443e185598bd0273ababd7f64198cfdffc`, matching the patch headers. No source was modified. + +## Adversarial checks + +1. **Per-event randomness cannot hide same-process execution.** `phase.rs:402–415` contains one process-global, function-static `OnceLock>`. Only its initializer obtains the 32 random bytes and constructs the 64-character lowercase-hex value. There is no reset, request field, sequence number, PID fallback, or alternate producer. `record_test_phase_result` uses that exact singleton at `:463–466`, after executing the real phase (`:366–368`). Repeated requests or threads in one helper therefore emit the same token. The new unit test checks repeated calls and a second thread (`:1190–1205`). The existing launch path creates a fresh executable (`:142–146,190`; guarded Unix `process_lifecycle/unix.rs:329–332`, Windows `process_lifecycle/windows.rs:357–368`), not a fork-only child retaining an initialized singleton. +2. **Missing or malformed evidence fails closed.** `copy_phase_process.rs:172–190` requires a numeric PID in `1..=u32::MAX`, a string token of exactly 64 bytes, and only ASCII digits/lowercase `a..f`. Missing/null/wrong-type fields, nonpositive/out-of-range PIDs, empty/wrong-length/non-ASCII/nonhex/uppercase tokens cannot pass. `:192–203` rejects fewer than two records, validates every event before set insertion, and compares token contents, not numeric PIDs or reference addresses. Equal PID/different valid token passes; equal token with equal or different PID fails. Deterministic tests exercise the intended distinction and malformed evidence (`:205–231`). Not every malformed input variant has its own test; the remaining predicate branches were traced statically. +3. **Adjacent process checks retain the same property.** The schema/COPY assertion (`:300`), recovery/failed-schema assertion (`:319–323`), and all-COPY assertion (`:479`) use the same validated oracle. A missing recovery record still fails indexing; an empty/single COPY set fails the oracle rather than passing vacuously. No PID-only process-identity comparison remains in this fixture. +4. **Instrumentation failures do not manufacture success.** With no trace environment variable, the existing early return occurs before token initialization (`phase.rs:419–420`). Entropy failure is stored as `Err` in the singleton, cloned back to callers, and propagated by `?` before opening/appending a trace (`:408–414,465,469–475`). There is no fallback token or partial success record. Existing create/serialize/open/append failures still propagate. The real post-COPY acknowledgement failure remains after the completed trace (`:476–483`); the new field does not replace the native operation or the failure fixture. +5. **The data and failure oracles were not weakened.** Relative to the baseline patch, the only replaced assertions concern process identity. The full fixture still checks thread count and bounded real staging files, repeated tables and early PK index order, connector ordering (`:423–478`); exact 1,400 labels/IDs, all keyed lookups, the actual `PRIMARY_KEY_SCAN_NODE_TABLE` plan, all connector endpoints, logical rows/JSON, search and clean-control equality (`:490–605`); and Managed plus Direct acknowledgement-failure/no-replay/publication preservation, bundle hashes, old/new search and later recovery (`:253–324`). The jumbo real-COPY/reopen case remains unchanged (`:343–381`). +6. **Compatibility and boundaries remain intact.** `Cargo.toml` still declares MSRV 1.82 and existing `getrandom = "0.3.4"`; no dependency or profile changed. Added standard-library APIs are available by 1.82 (`OnceLock` and `Option::is_some_and` since 1.70; the other used APIs are older). This is a static MSRV assessment, not an executed Rust 1.82 build. Identity generation is `cfg(debug_assertions)` and trace-opt-in; it changes neither phase protocol version/request, CLI/MCP/data contracts, loading, containment, resource controls, nor release behavior. The 32-byte/64-hex debug identity is a probabilistic test oracle, not a production process-authentication guarantee. + +## Executed evidence examined + +The coordinator owns serialized builds and tests. This reviewer ran no build, test, Git operation, reproduction, or external mutation. + +- `deterministic-tests.log` and `deterministic-tests.junit.xml`: **3/3 pass**, zero failures/errors; the log names compilation from the reviewed worktree. The singleton stability and both actual oracle tests executed in a debug-enabled test build on macOS. +- `native-copy-process-tests.log` and `native-copy-process-tests.junit.xml`, run ID `c2454682-b32f-485d-81d6-a9c7e6c6cc75`: **5/5 pass**, zero skipped/failures/errors, 301.558 s total. The previously failing `bounded_production_chunks_reopen_with_primary_keys_connectors_and_search` **passed in 121.218 s**, so its downstream PK/connector/search/control assertions executed to the end. `jumbo_staged_row_survives_real_copy_and_fresh_process_read` **passed in 26.980 s**. `native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles` **passed in 153.320 s**, executing both storage modes and their preservation/recovery checks. Both deterministic oracle cases also passed. Inspected final log and parsed the matching final JUnit; not a partial-run inference. +- `phase-unit-tests.log` and `phase-unit-tests.junit.xml`, run ID `d548c202-96ad-4f3e-830b-09a527a7bddb`: **13/13 pass**, zero failures/errors, 833 filtered out; includes the singleton stability, trace metadata, protocol, error-boundary, and surrounding phase fixtures. +- `provenance.json` records exact commands/environment: macOS 26.6.2 (25G83), aarch64-apple-darwin, rustc 1.96.0, normal debug CLI/test profiles, shared `CARGO_TARGET_DIR`, and `CARGO_BIN_EXE_codebase-graph` explicitly targeting the frozen CLI. Independently hashed frozen CLI: `e189db48a699a276019674f93c8698e59805ff80f0e1f7c9260089069ce7a25f`, matching that manifest. The manifest records native Ladybug SHA-256 `a840ea7c538e67a8b9fc0d58495b5226dc9c0a5f2f144ff0c48c0f6ca1193ae6`. +- Final `cargo fmt --all --check`: **pass** (`format-final.log`, empty). Strict `cargo clippy --locked --workspace --all-targets --all-features -- -D warnings`: **pass** (`clippy.log`, successful 8.02 s compiler summary, no warnings). Exact exit results and commands are recorded in the updated `provenance.json`. + +## Remaining gates and limits + +- The complete native five-case and nearby 13-case reports, strict Clippy, and formatting have now passed locally. Native Windows follow-up CI is **pending**; local Mac/deterministic execution is not Windows qualification. Broader/aggregate delivery and release gates remain separate. +- The prior broad local debug run is **incomplete**, not a passing 1,110-case result: 606 pass records and one fixture-prerequisite failure requiring a captured shipping executable, followed by termination. `prior-local-full-run-incomplete.json`/`.md` preserve that distinction. Historical hosted Mac 843-pass/2-ignored evidence is not execution of this new instrumentation. +- The old Windows failure establishes 55 numeric PIDs across 56 COPY events. Without its raw `phases.jsonl`, specific numeric PID reuse remains **unproven**. This repair corrects the oracle's known invalid all-time uniqueness premise; it does not retrospectively diagnose that run. +- No conditional defect or unresolved product/architecture decision was identified in this bounded patch. Native-platform/aggregate evidence and delivery/closure remain coordinator/owner gates. + +Repository workflow: used supplied target-worktree graph discovery/change-impact evidence before source inspection; no graph MCP was exposed in this reviewer session. Recalled repository memory, read canonical approval/contracts and pipeline wiki, and fetched governing Scryer rules/scoped intent. Live Linear was not available here. Memory assessment: no new reusable knowledge claim beyond the existing approved process-identity decision and retained evidence warrants a memory write. Only this requested report was written; no constants or source files were changed by the reviewer. + +## Final evidence checkpoint — 2026-10-27 + +After the completed native/unit/lint/format reports arrived, independently re-hashed both reviewed source files and the frozen CLI: all still match the identities above. The final JUnit case counts and zero failure/error results agree with the actual logs. Recommendation is unchanged: **no confirmed P0–P3 defect in the reviewed patch; proceed within the authorized scope, with native Windows/aggregate qualification pending**. diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/format-final.log b/docs/specs/CBG-COPY-01/process-identity-evidence/format-final.log new file mode 100644 index 00000000..e69de29b diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/implementation-diff.patch b/docs/specs/CBG-COPY-01/process-identity-evidence/implementation-diff.patch new file mode 100644 index 00000000..14655532 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/implementation-diff.patch @@ -0,0 +1,174 @@ +diff --git a/src/db_writer/phase.rs b/src/db_writer/phase.rs +index 0e9a9b9..dbcf240 100644 +--- a/src/db_writer/phase.rs ++++ b/src/db_writer/phase.rs +@@ -399,6 +399,21 @@ fn copy_source_metadata(statement: &str) -> Option<(String, u64)> { + None + } + ++#[cfg(debug_assertions)] ++fn test_process_instance() -> Result<&'static str, String> { ++ static INSTANCE: OnceLock> = OnceLock::new(); ++ INSTANCE ++ .get_or_init(|| { ++ let mut bytes = [0; 32]; ++ getrandom::fill(&mut bytes) ++ .map_err(|error| format!("failed to identify test phase process: {error}"))?; ++ Ok(bytes.iter().map(|byte| format!("{byte:02x}")).collect()) ++ }) ++ .as_ref() ++ .map(String::as_str) ++ .map_err(Clone::clone) ++} ++ + #[cfg(debug_assertions)] + fn record_test_phase_result(request: &LadybugWritePhaseRequest) -> Result<(), String> { + let Some(directory) = std::env::var_os("CODEBASE_GRAPH_TEST_COPY_RESULT_DIR") else { +@@ -445,6 +460,10 @@ fn record_test_phase_result(request: &LadybugWritePhaseRequest) -> Result<(), St + serde_json::json!(staged.as_ref().map(|(_, bytes)| bytes)), + ); + object.insert("pid".into(), serde_json::json!(std::process::id())); ++ object.insert( ++ "process_instance".into(), ++ serde_json::json!(test_process_instance()?), ++ ); + object.insert("success".into(), serde_json::json!(true)); + let trace_path = directory.join("phases.jsonl"); + let mut trace_file = OpenOptions::new() +@@ -1168,6 +1187,23 @@ mod tests { + assert!(std::str::from_utf8(message.as_bytes()).is_ok()); + } + ++ #[cfg(debug_assertions)] ++ #[test] ++ fn phase_trace_process_instance_is_stable_across_calls_and_threads() { ++ let first = test_process_instance().unwrap(); ++ assert_eq!(first.len(), 64); ++ assert!(first ++ .bytes() ++ .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))); ++ assert_eq!(test_process_instance().unwrap(), first); ++ assert_eq!( ++ std::thread::spawn(|| test_process_instance().unwrap()) ++ .join() ++ .unwrap(), ++ first ++ ); ++ } ++ + #[cfg(debug_assertions)] + #[test] + fn copy_trace_metadata_reports_generated_file_bytes() { +diff --git a/tests/copy_phase_process.rs b/tests/copy_phase_process.rs +index f474494..dcc20dd 100644 +--- a/tests/copy_phase_process.rs ++++ b/tests/copy_phase_process.rs +@@ -169,6 +169,67 @@ fn traces(directory: &Path) -> Vec { + .collect() + } + ++fn process_instance(event: &Value) -> Result<&str, &'static str> { ++ if !event["pid"] ++ .as_u64() ++ .is_some_and(|pid| pid > 0 && pid <= u32::MAX as u64) ++ { ++ return Err("phase trace has no valid diagnostic PID"); ++ } ++ let instance = event["process_instance"] ++ .as_str() ++ .ok_or("phase trace has no process instance")?; ++ if instance.len() != 64 ++ || !instance ++ .bytes() ++ .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) ++ { ++ return Err("phase trace has an invalid process instance"); ++ } ++ Ok(instance) ++} ++ ++fn distinct_phase_processes(events: &[&Value]) -> Result<(), &'static str> { ++ if events.len() < 2 { ++ return Err("process isolation needs multiple phase records"); ++ } ++ let mut instances = BTreeSet::new(); ++ for event in events { ++ if !instances.insert(process_instance(event)?) { ++ return Err("multiple phases executed in one process instance"); ++ } ++ } ++ Ok(()) ++} ++ ++#[test] ++fn phase_process_oracle_accepts_reused_pid_but_rejects_reused_process() { ++ let first = json!({"pid": 42, "process_instance": "a".repeat(64)}); ++ let next = json!({"pid": 42, "process_instance": "b".repeat(64)}); ++ assert!(distinct_phase_processes(&[&first, &next]).is_ok()); ++ assert!(distinct_phase_processes(&[&first, &first]).is_err()); ++ let changed_pid = json!({"pid": 43, "process_instance": "a".repeat(64)}); ++ assert!(distinct_phase_processes(&[&first, &changed_pid]).is_err()); ++} ++ ++#[test] ++fn phase_process_oracle_rejects_missing_or_invalid_evidence() { ++ let valid = json!({"pid": 42, "process_instance": "a".repeat(64)}); ++ assert!(distinct_phase_processes(&[]).is_err()); ++ assert!(distinct_phase_processes(&[&valid]).is_err()); ++ for invalid in [ ++ json!({"pid": 43}), ++ json!({"process_instance": "b".repeat(64)}), ++ json!({"pid": 0, "process_instance": "b".repeat(64)}), ++ json!({"pid": "43", "process_instance": "b".repeat(64)}), ++ json!({"pid": 43, "process_instance": ""}), ++ json!({"pid": 43, "process_instance": "B".repeat(64)}), ++ json!({"pid": 43, "process_instance": "g".repeat(64)}), ++ ] { ++ assert!(distinct_phase_processes(&[&valid, &invalid]).is_err()); ++ } ++} ++ + fn bundle_hashes(db: &Path, manifest: &Path) -> BTreeMap { + let mut paths = vec![db.to_path_buf(), manifest.to_path_buf()]; + let value: Value = serde_json::from_slice(&fs::read(manifest).unwrap()).unwrap(); +@@ -236,10 +297,7 @@ fn native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles() { + assert!(events[1].get("buffer_pool_bytes").is_none()); + assert!(events[1].get("worker_memory_bytes").is_none()); + assert!(events[1]["staged_file_bytes"].as_u64().unwrap() > 0); +- assert_ne!( +- events[0]["pid"], events[1]["pid"], +- "phases must actually be isolated" +- ); ++ assert_eq!(distinct_phase_processes(&[&events[0], &events[1]]), Ok(())); + assert_eq!(fixture.paths(), (db.clone(), manifest.clone())); + assert_eq!(bundle_hashes(&db, &manifest), before); + assert!(fixture +@@ -258,7 +316,11 @@ fn native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles() { + assert!(!fixture + .search("failed_marker") + .contains(&"failed_marker".to_owned())); +- assert_ne!(traces(&recovery_trace)[0]["pid"], events[0]["pid"]); ++ let recovered_events = traces(&recovery_trace); ++ assert_eq!( ++ distinct_phase_processes(&[&recovered_events[0], &events[0]]), ++ Ok(()) ++ ); + fs::remove_dir_all(&fixture.root).unwrap(); + } + } +@@ -414,14 +476,7 @@ fn bounded_production_chunks_reopen_with_primary_keys_connectors_and_search() { + assert!(!events[first_connector..] + .iter() + .any(|event| event["phase_kind"] == "index")); +- assert_eq!( +- copies +- .iter() +- .map(|event| event["pid"].as_u64().unwrap()) +- .collect::>() +- .len(), +- copies.len() +- ); ++ assert_eq!(distinct_phase_processes(&copies), Ok(())); + + let (db_path, _) = fixture.paths(); + let database = lbug::Database::new( diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/implementation-snapshot.json b/docs/specs/CBG-COPY-01/process-identity-evidence/implementation-snapshot.json new file mode 100644 index 00000000..ee4ccf30 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/implementation-snapshot.json @@ -0,0 +1,10 @@ +{ + "baseline": "931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef", + "files": { + "src/db_writer/phase.rs": "889b005587d1ce59a63ae35fdcbb1d799ae5248cc910e65cb102e23b80ffa9fa", + "tests/copy_phase_process.rs": "bd6d263acba7364a2846b9cb52a669a5281026adadd7b347689e3a5bc0fdbf94" + }, + "approval": "931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef", + "linear": "COD-98", + "scryer": "chg-k66bxx" +} diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/native-copy-process-tests.junit.xml b/docs/specs/CBG-COPY-01/process-identity-evidence/native-copy-process-tests.junit.xml new file mode 100644 index 00000000..34452f8c --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/native-copy-process-tests.junit.xml @@ -0,0 +1,57 @@ + + + + + +running 1 test +test bounded_production_chunks_reopen_with_primary_keys_connectors_and_search ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 121.20s + + + chunked native build resources: {"database_write":184452344,"parse":23124382,"search_index":1048544,"staging":2053466} +PK lookup plan: QueryResult { result: "explain result\n┌────────────────────────────────────┐\n│┌──────────────────────────────────┐│\n││ Physical Plan ││\n│└──────────────────────────────────┘│\n└────────────────────────────────────┘\n┌────────────────────────────────────┐\n│ RESULT_COLLECTOR[2] │\n│ ------------------------------ │\n│ Expressions: n.id │\n│ ------------------------------ │\n│ NumOutputTuples: 0 │\n│ ------------------------------ │\n│ ExecutionTime: 0.000000 │\n│ ------------------------------ │\n│ TotalTime: 0.000000 │\n└─────────────────┬──────────────────┘\n┌─────────────────┴──────────────────┐\n│ PROJECTION[1] │\n│ ------------------------------ │\n│ Expressions: n.id │\n│ ------------------------------ │\n│ NumOutputTuples: 0 │\n│ ------------------------------ │\n│ ExecutionTime: 0.000000 │\n│ ------------------------------ │\n│ TotalTime: 0.000000 │\n└─────────────────┬──────────────────┘\n┌─────────────────┴──────────────────┐\n│ PRIMARY_KEY_SCAN_NODE_TABLE[0] │\n│ ------------------------------ │\n│ Key: missing │\n│ Alias: n │\n│ Index: HASH │\n│ Expressions: n.id │\n│ ------------------------------ │\n│ NumOutputTuples: 0 │\n│ ------------------------------ │\n│ ExecutionTime: 0.000000 │\n│ ------------------------------ │\n│ TotalTime: 0.000000 │\n└────────────────────────────────────┘\n\n" } + + + + +running 1 test +test jumbo_staged_row_survives_real_copy_and_fresh_process_read ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 26.96s + + + + + + +running 1 test +test native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 153.30s + + + + + + +running 1 test +test phase_process_oracle_accepts_reused_pid_but_rejects_reused_process ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s + + + + + + +running 1 test +test phase_process_oracle_rejects_missing_or_invalid_evidence ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s + + + + + + diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/native-copy-process-tests.log b/docs/specs/CBG-COPY-01/process-identity-evidence/native-copy-process-tests.log new file mode 100644 index 00000000..8b04e2d6 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/native-copy-process-tests.log @@ -0,0 +1,15 @@ + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.08s +──────────── + Nextest run ID c2454682-b32f-485d-81d6-a9c7e6c6cc75 with nextest profile: copy-pid + Starting 5 tests across 1 binary + SLOW [> 60.000s] (───) codebase-graph::copy_phase_process bounded_production_chunks_reopen_with_primary_keys_connectors_and_search + SLOW [>120.000s] (───) codebase-graph::copy_phase_process bounded_production_chunks_reopen_with_primary_keys_connectors_and_search + PASS [ 121.218s] (1/5) codebase-graph::copy_phase_process bounded_production_chunks_reopen_with_primary_keys_connectors_and_search + PASS [ 26.980s] (2/5) codebase-graph::copy_phase_process jumbo_staged_row_survives_real_copy_and_fresh_process_read + SLOW [> 60.000s] (───) codebase-graph::copy_phase_process native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles + SLOW [>120.000s] (───) codebase-graph::copy_phase_process native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles + PASS [ 153.320s] (3/5) codebase-graph::copy_phase_process native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles + PASS [ 0.021s] (4/5) codebase-graph::copy_phase_process phase_process_oracle_accepts_reused_pid_but_rejects_reused_process + PASS [ 0.018s] (5/5) codebase-graph::copy_phase_process phase_process_oracle_rejects_missing_or_invalid_evidence +──────────── + Summary [ 301.558s] 5 tests run: 5 passed (2 slow), 0 skipped diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/phase-unit-tests.junit.xml b/docs/specs/CBG-COPY-01/process-identity-evidence/phase-unit-tests.junit.xml new file mode 100644 index 00000000..d0e5caff --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/phase-unit-tests.junit.xml @@ -0,0 +1,139 @@ + + + + + +running 1 test +test db_writer::phase::tests::copy_trace_metadata_reports_generated_file_bytes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.02s + + + + + + +running 1 test +test db_writer::phase::tests::error_tail_reader_requests_no_more_than_the_limit ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::error_tail_reads_at_most_the_limit_and_decodes_utf8_lossily ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::isolated_error_keeps_context_inside_the_cap ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test db_writer::phase::tests::oversized_native_error_preserves_query_vs_explicit_checkpoint_boundary ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::phase_protocol_requires_v2_containment_contract ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::phase_query_keeps_successful_if_not_exists_idempotence_but_surfaces_native_error ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.12s + + + + + + +running 1 test +test db_writer::phase::tests::phase_registry_scope_restores_nested_and_unwound_contexts ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + +thread 'db_writer::phase::tests::phase_registry_scope_restores_nested_and_unwound_contexts' (34625047) panicked at src/db_writer/phase.rs:993:21: +test scope restoration +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + +running 1 test +test db_writer::phase::tests::phase_request_v2_preserves_thread_setting ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test db_writer::phase::tests::phase_test_allocation_is_scoped_to_the_ready_loader ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::phase_test_allocation_requires_trigger_and_rejects_unbounded_memory ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::phase_trace_process_instance_is_stable_across_calls_and_threads ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test db_writer::phase::tests::scoped_phase_request_lives_outside_candidate_and_preserves_database_path ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/phase-unit-tests.log b/docs/specs/CBG-COPY-01/process-identity-evidence/phase-unit-tests.log new file mode 100644 index 00000000..62ae9a1a --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/phase-unit-tests.log @@ -0,0 +1,19 @@ + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.11s +──────────── + Nextest run ID d548c202-96ad-4f3e-830b-09a527a7bddb with nextest profile: copy-pid + Starting 13 tests across 1 binary (833 tests skipped) + PASS [ 0.036s] ( 1/13) codebase-graph db_writer::phase::tests::copy_trace_metadata_reports_generated_file_bytes + PASS [ 0.021s] ( 2/13) codebase-graph db_writer::phase::tests::error_tail_reader_requests_no_more_than_the_limit + PASS [ 0.020s] ( 3/13) codebase-graph db_writer::phase::tests::error_tail_reads_at_most_the_limit_and_decodes_utf8_lossily + PASS [ 0.024s] ( 4/13) codebase-graph db_writer::phase::tests::isolated_error_keeps_context_inside_the_cap + PASS [ 0.021s] ( 5/13) codebase-graph db_writer::phase::tests::oversized_native_error_preserves_query_vs_explicit_checkpoint_boundary + PASS [ 0.019s] ( 6/13) codebase-graph db_writer::phase::tests::phase_protocol_requires_v2_containment_contract + PASS [ 0.141s] ( 7/13) codebase-graph db_writer::phase::tests::phase_query_keeps_successful_if_not_exists_idempotence_but_surfaces_native_error + PASS [ 0.023s] ( 8/13) codebase-graph db_writer::phase::tests::phase_registry_scope_restores_nested_and_unwound_contexts + PASS [ 0.024s] ( 9/13) codebase-graph db_writer::phase::tests::phase_request_v2_preserves_thread_setting + PASS [ 0.020s] (10/13) codebase-graph db_writer::phase::tests::phase_test_allocation_is_scoped_to_the_ready_loader + PASS [ 0.019s] (11/13) codebase-graph db_writer::phase::tests::phase_test_allocation_requires_trigger_and_rejects_unbounded_memory + PASS [ 0.020s] (12/13) codebase-graph db_writer::phase::tests::phase_trace_process_instance_is_stable_across_calls_and_threads + PASS [ 0.019s] (13/13) codebase-graph db_writer::phase::tests::scoped_phase_request_lives_outside_candidate_and_preserves_database_path +──────────── + Summary [ 0.410s] 13 tests run: 13 passed, 833 skipped diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/prior-local-full-run-incomplete.json b/docs/specs/CBG-COPY-01/process-identity-evidence/prior-local-full-run-incomplete.json new file mode 100644 index 00000000..431a9031 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/prior-local-full-run-incomplete.json @@ -0,0 +1,10 @@ +{ + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --lib --test storage_foundation --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 --no-fail-fast > /private/tmp/codebasegraph-cod52-evidence/final-library-and-foundation.log 2>&1", + "state": "terminated incomplete before separate approved COPY instrumentation builds", + "completed_pass_records": 606, + "fail_records": [ + " FAIL [ 10.410s] ( 596/1110) codebase-graph storage::maintenance_collector_tests::dc_s5_real_containment_fifo_retires_with_pin_receipt_and_terminal_root" + ], + "last_output": " SLOW [>2160.000s] (\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500) codebase-graph storage::maintenance_collector_tests::dc_s5_twenty_updates_collect_without_source_edits_and_match_clean_control", + "evidence_basis": "hosted exact-tree Mac unit843pass/2ignored + native generation/integration/artifact passed; local full debug run not claimed pass" +} diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/prior-local-full-run-incomplete.md b/docs/specs/CBG-COPY-01/process-identity-evidence/prior-local-full-run-incomplete.md new file mode 100644 index 00000000..b5500403 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/prior-local-full-run-incomplete.md @@ -0,0 +1,7 @@ +# Earlier broad local debug run — incomplete, not passing evidence + +Command and state are recorded in prior-local-full-run-incomplete.json. Source was COD-52-only before the approved COPY instrumentation follow-up. The coordinator terminated the run before further source builds to preserve binary provenance. + +606 completed pass records and one failure were observed before termination. Failure `dc_s5_real_containment_fifo_retires_with_pin_receipt_and_terminal_root` reports: “real containment qualification requires the captured shipping executable” at tests/support/storage_maintenance/collector.rs2020. The command lacked that fixture's captured-CLI prerequisite; this is not a reproduced product containment assertion failure. The failed fixture was retained by the harness. The later long20-update case had not completed at termination. No1110-case full passing result or complete JUnit is claimed. + +Hosted CI40449278177 tested a tree-identical COD-52 source and passed the Mac native unit843case cohort (2ignored) plus Mac generation/integration/artifact, but failed the separate Windows COPY PID-cardinality assertion. Keep those results separate from this incomplete local command. For follow-up native process tests the coordinator freezes/captures the current CLI and supplies CARGO_BIN_EXE_codebase-graph; no prerequisite bypass or assertion weakening. diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/proposal-review.md b/docs/specs/CBG-COPY-01/process-identity-evidence/proposal-review.md new file mode 100644 index 00000000..0b81a626 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/proposal-review.md @@ -0,0 +1,31 @@ +# COPY process-identity test repair — fresh proposal review + +## Recommendation + +**Proceed with the bounded implementation and verification described below.** No decision-blocking or material defect was found in this proposal. This is permission to begin an already user-approved test repair, not a passing-test, platform-qualification, PR-closure, or rollout verdict. + +- Reviewer: fresh read-only agent, GPT-6.1 Sol / High, using `adversarial-proposal-review-engineer`. +- Reviewed decision: repair PR157's process-identity oracle, preserving the exact CBG-COPY-01 A3/A9 process-isolation and data checks. Source baseline: `9e7645028013555cc78529a552e3ce0b0468c20f`; supplied worktree: `/private/tmp/codebasegraph-cod52-macos-scans`. +- Approval: `docs/specs/CBG-COPY-01/approvals/process-identity-test.md` at `931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef`; Scryer `chg-k66bxx`; Linear COD98. Existing resource amendment remains unchanged. The old spec's proposed-status header is not itself approval evidence; this narrow approval explicitly preserves the historical approvals rather than silently advancing them. + +## Evidence and challenge results + +1. **The existing oracle confuses a PID with a process incarnation.** `tests/copy_phase_process.rs:417–424` counts unique numeric PIDs across COPY records. The retained `failed-artifact/platform-test.log` establishes 55 unique PIDs versus 56 records in the named Windows test at that assertion. It does **not** establish whether PID reuse or genuine process reuse caused that specific run: `phases.jsonl` is unavailable. Keep that cause unproven in the handoff. +2. **The replacement tests the intended property without accepting same-process reuse.** A 256-bit random token initialized through one process-global `OnceLock>`, generated in the executing helper rather than the request/parent, stays constant across multiple requests/records in that native process. A set of those tokens therefore rejects a helper executing multiple COPY phases, while accepting separate helper instances whose numeric PIDs happen to match. A token per event/request would defeat the test and is explicitly excluded. Normal helper execution uses a fresh executable, not a fork-only child inheriting an initialized singleton. +3. **The mechanism is feasible and proportional.** `src/db_writer/phase.rs:354–369` performs the real mutation before its debug-only trace hook; `:402–465` already owns that internal trace and acknowledgement-failure injection. `Cargo.toml:43` already declares `getrandom = "0.3.4"`; no dependency, product protocol, request, loading, containment, public API, or resource change is needed. Keep token generation/encoding inside the existing debug instrumentation, after checking that tracing was requested. Entropy failure should propagate as a test-instrumentation error; no PID/time/per-request fallback. +4. **Do not leave the same invalid identity premise in adjacent checks.** `tests/copy_phase_process.rs:239–242` compares schema/COPY PIDs, and `:261` compares recovery/failed-build schema PIDs. The coordinator confirmed these will use the same validated process-instance identity, with PID retained and validated as a diagnostic. This preserves their separate-process assertions rather than deleting them. This review point is resolved in the agreed proposal, not an outstanding finding. +5. **The correctness safeguards remain independent and must survive unchanged.** Preserve chunk byte limits, thread count, repeated-table and early-index ordering, connector ordering (`:355–416`); exact scans/IDs, PK lookup and actual PK operator, endpoint equality, search, and clean-control equality (`:426–549`); and both managed/direct acknowledgement-failure, no-replay/no-publication, bundle hashes, old/new search, and recovery checks (`:191–262`). Changing only the evidence of process identity does not justify relaxing any of these assertions. + +Microsoft documents PID validity only from process creation until termination: [Process Handles and Identifiers](https://learn.microsoft.com/en-us/windows/win32/procthread/process-handles-and-identifiers) (accessed 2026-10-27). This supports rejecting an all-time unique-PID assumption; it does not diagnose the failed run. A cached 256-bit random token is a probabilistic test identity, not a new operating-system identity or production security guarantee. That is proportionate for this bounded fixture. + +## Required verification before completion + +- The actual integration oracle, not an unused parallel helper, validates a present 64-character lowercase-hex `process_instance` and a present numeric PID, then requires unique instance tokens across the COPY phases. Preserve PID in useful failure diagnostics. +- Deterministic tests accept equal PIDs with distinct valid tokens; reject equal tokens across distinct events, including when their PIDs differ; and reject missing/malformed identity evidence. Do not allow omitted fields or an empty set of COPY records to turn the intended check into a false success. +- A current-process unit test establishes identity stability through repeated helper calls/trace construction. Confirm the trace path actually uses that singleton, never fresh randomness for each record. +- Execute the real native chunked/reopen/PK/connectors/search/control case to its end, plus both managed/direct acknowledgement-failure cases and the affected test radius. Run the debug-enabled native profile on Mac and Windows; ordinary release excludes these fixtures. Preserve exact source/binary/environment evidence. Local deterministic tests do not qualify Windows behavior or prove the earlier root cause. +- Final read-only review must inspect the actual integrated diff and executed evidence. Keep platform or aggregate gates pending if their execution is unavailable. + +## Scope and limits + +Read source only after parent-supplied graph discovery and explicit change-impact context (`Function:f7aaab26b7510a0d5c02`, appended to `discovery.txt`). Recalled repository memory, read governing Scryer proportionality/test/closure rules, inspected the exact approval, trace hook, complete fixture assertions, dependency declaration, and retained failure log. Repository graph MCP is not exposed in this reviewer session; parent supplied target-worktree CLI graph evidence. No implementation edits, builds, tests, Git operations, or external record mutations were performed. Only this requested review report was written. No new reusable repository-memory claim is warranted by an unimplemented proposal. diff --git a/docs/specs/CBG-COPY-01/process-identity-evidence/provenance.json b/docs/specs/CBG-COPY-01/process-identity-evidence/provenance.json new file mode 100644 index 00000000..91a9436a --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-evidence/provenance.json @@ -0,0 +1,69 @@ +{ + "baseline": "931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef", + "files": { + "src/db_writer/phase.rs": "889b005587d1ce59a63ae35fdcbb1d799ae5248cc910e65cb102e23b80ffa9fa", + "tests/copy_phase_process.rs": "bd6d263acba7364a2846b9cb52a669a5281026adadd7b347689e3a5bc0fdbf94" + }, + "cursor_sources": { + "src/storage/locks.rs": "3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c", + "src/storage/maintenance_candidate.rs": "8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765" + }, + "commands": [ + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --lib --test copy_phase_process --config-file /private/tmp/codebasegraph-copy-pid-followup/nextest.toml --profile copy-pid -E 'test(phase_trace_process_instance_is_stable) | test(phase_process_oracle_)' --no-fail-fast > /private/tmp/codebasegraph-copy-pid-followup/deterministic-tests.log 2>&1", + "result": 0, + "log": "deterministic-tests.log", + "junit": "deterministic-tests.junit.xml", + "result_summary": "3pass,848filtered" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo build --locked -p codebase-graph --bin codebase-graph", + "result": 0, + "log": "cli-build.log" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --test copy_phase_process --config-file /private/tmp/codebasegraph-copy-pid-followup/nextest.toml --profile copy-pid --no-fail-fast > /private/tmp/codebasegraph-copy-pid-followup/native-copy-process-tests.log 2>&1", + "result": 0, + "log": "native-copy-process-tests.log", + "junit": "native-copy-process-tests.junit.xml", + "result_summary": "5pass,0skipped; boundedchunk121.218s jumbo26.980s ManagedDirectackfailure153.320s plus2oracle cases" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo clippy --locked --workspace --all-targets --all-features -- -D warnings", + "result": 0, + "log": "clippy.log" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --lib --config-file /private/tmp/codebasegraph-copy-pid-followup/nextest.toml --profile copy-pid -E 'test(db_writer::phase::tests::)' --no-fail-fast > /private/tmp/codebasegraph-copy-pid-followup/phase-unit-tests.log 2>&1", + "result": 0, + "log": "phase-unit-tests.log", + "junit": "phase-unit-tests.junit.xml" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo fmt --all --check", + "result": 0, + "log": "format-final.log" + } + ], + "environment": { + "CARGO_TARGET_DIR": "/private/tmp/codebasegraph-pr153-platform-862a8f88d485/cargo-target", + "CARGO_BIN_EXE_codebase-graph": "/private/tmp/codebasegraph-copy-pid-followup/captured-codebase-graph", + "RUST_TEST_THREADS": "1 from unchanged project .cargo/config.toml", + "HOME": "target/test-home project config", + "rustc": "rustc 1.96.0 (ac68faa20 2026-05-25)\nbinary: rustc\ncommit-hash: ac68faa20c58cbccd01ee7208bf3b6e93a7d7f96\ncommit-date: 2026-05-25\nhost: aarch64-apple-darwin\nrelease: 1.96.0\nLLVM version: 22.1.2\n", + "os": "ProductName:\t\tmacOS\nProductVersion:\t\t26.6.2\nBuildVersion:\t\t25G83\n" + }, + "cli_sha256": "e189db48a699a276019674f93c8698e59805ff80f0e1f7c9260089069ce7a25f", + "native_lbug_sha256": "a840ea7c538e67a8b9fc0d58495b5226dc9c0a5f2f144ff0c48c0f6ca1193ae6", + "approval": { + "commit": "931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef", + "path": "docs/specs/CBG-COPY-01/approvals/process-identity-test.md", + "linear": "COD-98", + "scryer": "chg-k66bxx" + }, + "limits": [ + "specific old Windows PID reuse cause unproven, no raw phases retained", + "nativeWindowsfollowup pending", + "old broad debug run incomplete, fixtureCLI prerequisite failure retained" + ] +} diff --git a/docs/specs/CBG-COPY-01/process-identity-execution.md b/docs/specs/CBG-COPY-01/process-identity-execution.md new file mode 100644 index 00000000..1628f128 --- /dev/null +++ b/docs/specs/CBG-COPY-01/process-identity-execution.md @@ -0,0 +1,35 @@ +# CBG-COPY-01 — process-identity verification repair + +## Scope and approval + +[COD-98](https://linear.app/codebasegraph/issue/COD-98), Maintenance `P-COD-2`; separate from COD-52 cursor behavior. [User-approved follow-up](https://github.com/rabii-chaarani/codebaseGraph/blob/931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef/docs/specs/CBG-COPY-01/approvals/process-identity-test.md) at full commit `931c3ddaeccba9c3f94f75e3ae58be9e3016a4ef` records the2026-10-27 explicit “approved” response. Reuse existing CBG-COPY-01 A3/A9 with historical ScopeA/resource-amendment approvals unchanged. Scryer `chg-k66bxx`; no new modeled responsibilities/topology. + +Baseline PR157 evidence head `9e7645028013555cc78529a552e3ce0b0468c20f`. [Failed native evidence](../CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/summary.json) establishes55unique numericPIDs across56COPYevents, not the specific cause. Diagnostic artifact contains logs/inventories, not raw phases.jsonl; earlier Windows PID reuse remains plausible, not proven. + +## Repair and preserved behavior + +- Existing debug trace now contains `process_instance`:256random bits from existing getrandom dependency, generated once per helper process by process-global OnceLock, constant across calls/threads. PID remains a validated diagnostic. It is not an operating-system/security identity or product protocol. +- All three fixture PID-uniqueness comparisons use the same validated lifetime-identity predicate. Different process instances may reuse a numeric PID; multiple phase records from one process still fail. Empty/singleton collections, missing/malformed tokens and invalid diagnostic PIDs fail. +- No per-request/event token, retry, timeout, numeric-PID fallback, native/loading/containment/resource/dependency or public CLI/MCP/data-format change. All existing chunk byte/thread/index/PK/connector/search/clean-control/failure/no-replay/Managed+Direct preservation assertions remain. +- Entropy errors remain cached errors and stop the debug trace before append. Tracing-disabled ordinary builds do not initialize the token. Release builds compile out this existing test instrumentation. + +## Verification and evidence + +Exact reviewed source hashes in [snapshot](process-identity-evidence/implementation-snapshot.json): phase.rs `889b005587d1ce59a63ae35fdcbb1d799ae5248cc910e65cb102e23b80ffa9fa`, copy_phase_process.rs `bd6d263acba7364a2846b9cb52a669a5281026adadd7b347689e3a5bc0fdbf94`. Cursor files remain unchanged from COD-52's reviewed hashes. [Diff](process-identity-evidence/implementation-diff.patch). + +Native macOS26.6.2ARM64, Rust1.96.0, unchanged cached Ladybug0.19archive SHA256 `a840ea7c538e67a8b9fc0d58495b5226dc9c0a5f2f144ff0c48c0f6ca1193ae6`. Captured rebuilt CLI SHA256 `e189db48a699a276019674f93c8698e59805ff80f0e1f7c9260089069ce7a25f`; process tests use that copied binary through CARGO_BIN_EXE_codebase-graph. Commands execute from the isolated project environment; builds serialized. + +- Deterministic **3/3pass**: stable singleton calls+threads; samePID/distinctinstance accepts; duplicateinstance across events (even differentPIDs) rejects; missing/malformed/empty evidence rejects. [Log](process-identity-evidence/deterministic-tests.log), [JUnit](process-identity-evidence/deterministic-tests.junit.xml). +- Actual native COPY suite **5/5pass,0skipped**: boundedchunk/reopen/PK/connector/search/clean-control121.218s; jumbo row26.980s; Managed+Direct acknowledgement-failure/no-replay/old-bundle preservation/recovery153.320s; both identity oracle cases. [Log](process-identity-evidence/native-copy-process-tests.log), [JUnit](process-identity-evidence/native-copy-process-tests.junit.xml). +- Nearby phase unit **13/13pass**, including singleton stability, metadata/thread/protocol/scope and bounded failure diagnostics. [Log](process-identity-evidence/phase-unit-tests.log), [JUnit](process-identity-evidence/phase-unit-tests.junit.xml). +- Final `cargo clippy --locked --workspace --all-targets --all-features -- -D warnings` and `cargo fmt --all --check` **pass**. [Clippy](process-identity-evidence/clippy.log), [format](process-identity-evidence/format-final.log), [complete command/environment/binary provenance](process-identity-evidence/provenance.json). +- Fresh GPT-6.1Sol/High [proposal review](process-identity-evidence/proposal-review.md): proceed, no blocking finding. Fresh GPT-6.1Sol/Max [final review](process-identity-evidence/final-review.md) finds no confirmed P0–P3; final evidence addendum records exact source/results without inferring native Windows execution. +- Native Windows follow-up and current-head CI remain pending. Deterministic/Mac results are not Windows execution. + +Earlier broad local1110case command is explicitly **incomplete, not passing**:606completed passes and a fixture failure requiring capturedshippingCLI, then stopped before follow-up builds. [Record](process-identity-evidence/prior-local-full-run-incomplete.json), [limits](process-identity-evidence/prior-local-full-run-incomplete.md). Hosted exact-old-source Mac843pass/2ignored is separate. No missing CLI prerequisite was bypassed; current process verification captures the actual CLI. + +## Reconciliation and remaining gates + +Governing Scryer claims checked; debug trace has no symbol claim and surrounding release-resources claim is unchanged. Configured model/graph are older-root orientation; unavailable graph MCP reported, target CLI graph discovery used. No exact-worktree model/verdicts fabricated, unrelated drift untouched. Memory assessment: no filler memory for transientCI cause; preserve evidence and exact process identity semantics here. + +COD-98 localimplementation only, qualification/review/closure pending. COD-52 remains In Review. No merge, deployment, service restart, otherMaintenance scope or aggregateclosure. Final native cases, strictchecks, final source/evidence review and Mac/Windows head-bound CI must be reconciled before completion. diff --git a/docs/specs/CBG-PLAT-01/approvals/cod52-macos-nested-scans.md b/docs/specs/CBG-PLAT-01/approvals/cod52-macos-nested-scans.md new file mode 100644 index 00000000..f4c2c921 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/approvals/cod52-macos-nested-scans.md @@ -0,0 +1,11 @@ +# CBG-PLAT-01/S01 — exact-scope implementation approval + +- **Decision date:** 2026-10-27. +- **Work / Linear:** `CBG-PLAT-01/S01`, [COD-52](https://linear.app/codebasegraph/issue/COD-52); prerequisite [COD-51](https://linear.app/codebasegraph/issue/COD-51), Maintenance `P-COD-2`, CodebaseGraph workspace/team COD. +- **Canonical specification:** `docs/specs/CBG-PLAT-01/spec.md`, revision 0.10 at approved full Git SHA `1a9db7b558b60248888408daa6268a3b45f2f0df` ([immutable file](https://github.com/rabii-chaarani/codebaseGraph/blob/1a9db7b558b60248888408daa6268a3b45f2f0df/docs/specs/CBG-PLAT-01/spec.md)); file SHA-256 `13aa21bb99084865557b8f9db2d39d51298e27e28ce9f60c2c6de4b7ae540030`. +- **Approved scope:** S01/COD-52 only, requirement R01, acceptance A01–A02, with applicable unchanged shared safety/failure/recovery constraints. Isolate macOS directory-enumeration cursors for nested cleanup scans and add/run the specified regression checks. Preserve pinned rooted-directory authority, fixed scratch, cancellation, no-follow/identity checks, bounded maintenance and conservative unknown-entry retention. No `dup`/`try_clone` cursor-isolation substitute. +- **User decision reference:** this conversation, 2026-10-27. The assistant asked: “I recommend approving **COD-52 only** next: fix nested macOS directory scans and add regression tests under spec rev0.10. Other tasks, merges and deployment stay excluded. **Approve COD-52, or keep implementation paused?**” The user replied: **“approved”**. +- **Unchanged exclusions:** no other implementation slice, merge, deployment, service restart, supported-platform/consumer qualification claim, S09 inclusion/deferral or aggregate milestone closure is approved. Already settled policies and prior CI-only approval remain unchanged. Native Windows and affected storage verification are required by A02; unexecuted checks remain pending, not passing. +- **Current source baseline:** `origin/main` `7038e66ff8271ffddc511f879cf8d28353a09b2d` (4.0.0), after PR153 merged. `src/storage/locks.rs` and `src/storage/maintenance_candidate.rs` are byte-unchanged from reviewed CI-fix head `d6dd34493e9da6f80847240bafcc92dbcaed2c38` (`git diff` executed before implementation). This records source revalidation, not passing behavior. +- **Architecture:** existing Graph Store `node-88`, `resp-232` / `resp-233`; restoring existing claims needs no new topology or claim. S00 ledger `chg-7h1q9s` records the approval prerequisite; the implementation ledger records its own scope/evidence. The configured model and older main-checkout graph are not SHA-bound proof of this implementation. +- **State:** exact-scope approved, not implemented, verified or closed by this record. Maintainer/user retains aggregate closure ownership. diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/baseline-repeats.json b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/baseline-repeats.json new file mode 100644 index 00000000..7b737fbf --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/baseline-repeats.json @@ -0,0 +1,72 @@ +{ + "command": [ + "/private/tmp/pr157-ci-fix-evidence/baseline-bin/lib-tests", + "--exact", + "storage::maintenance_collector_tests::dc_s5_canonical_only_durable_detach_interruption_resumes_without_source_edit", + "--nocapture" + ], + "cli_sha256": "c7c3ecc720699ec9b3d70ddabc8f107810955462fb1289065165cca95d2f150f", + "lib_sha256": "be155df810f9f2c81613b593df0925d7fe847e9f08e4483abff26f3e4bd8a587", + "results": [ + { + "iteration": 0, + "result": 0, + "seconds": 16.929786999999997 + }, + { + "iteration": 1, + "result": 0, + "seconds": 14.533341500000002 + }, + { + "iteration": 2, + "result": 0, + "seconds": 14.786040624999998 + }, + { + "iteration": 3, + "result": 0, + "seconds": 14.586137749999999 + }, + { + "iteration": 4, + "result": 0, + "seconds": 14.546568792000002 + }, + { + "iteration": 5, + "result": 0, + "seconds": 14.693865916999997 + }, + { + "iteration": 6, + "result": 0, + "seconds": 14.587553832999987 + }, + { + "iteration": 7, + "result": 0, + "seconds": 14.802619917000001 + }, + { + "iteration": 8, + "result": 0, + "seconds": 15.733288625 + }, + { + "iteration": 9, + "result": 0, + "seconds": 15.725559292000014 + }, + { + "iteration": 10, + "result": 0, + "seconds": 16.251023790999994 + }, + { + "iteration": 11, + "result": 0, + "seconds": 17.55192308300002 + } + ] +} \ No newline at end of file diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/clippy.log b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/clippy.log new file mode 100644 index 00000000..9ebc9fc5 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/clippy.log @@ -0,0 +1,4 @@ + Compiling codebase-graph v4.0.1 (/private/tmp/codebasegraph-cod52-macos-scans) + Checking xtask v4.0.1 (/private/tmp/codebasegraph-cod52-macos-scans/crates/xtask) + Checking k-wiki v4.0.1 (/private/tmp/codebasegraph-cod52-macos-scans/crates/k-wiki) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 38.75s diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostic-repeats.json b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostic-repeats.json new file mode 100644 index 00000000..af8bfebf --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostic-repeats.json @@ -0,0 +1,110 @@ +{ + "command": [ + "/private/tmp/pr157-ci-fix-evidence/diagnostic-lib-tests", + "--exact", + "storage::maintenance_collector_tests::dc_s5_canonical_only_durable_detach_interruption_resumes_without_source_edit", + "--nocapture" + ], + "results": [ + { + "iteration": 0, + "result": 0, + "seconds": 19.505625917 + }, + { + "iteration": 1, + "result": 0, + "seconds": 16.841320291 + }, + { + "iteration": 2, + "result": 0, + "seconds": 16.921751874999998 + }, + { + "iteration": 3, + "result": 0, + "seconds": 17.838461083999995 + }, + { + "iteration": 4, + "result": 0, + "seconds": 17.633315124999996 + }, + { + "iteration": 5, + "result": 0, + "seconds": 14.085189624999998 + }, + { + "iteration": 6, + "result": 0, + "seconds": 16.518808707999995 + }, + { + "iteration": 7, + "result": 0, + "seconds": 17.031901665999996 + }, + { + "iteration": 8, + "result": 0, + "seconds": 13.898395958999998 + }, + { + "iteration": 9, + "result": 0, + "seconds": 16.702551583 + }, + { + "iteration": 10, + "result": 0, + "seconds": 17.583676999999994 + }, + { + "iteration": 11, + "result": 0, + "seconds": 17.859921291000006 + }, + { + "iteration": 12, + "result": 0, + "seconds": 17.706752667000018 + }, + { + "iteration": 13, + "result": 0, + "seconds": 23.87436141699999 + }, + { + "iteration": 14, + "result": 0, + "seconds": 20.90744004200002 + }, + { + "iteration": 15, + "result": 0, + "seconds": 18.991779874999963 + }, + { + "iteration": 16, + "result": 0, + "seconds": 20.200680583000008 + }, + { + "iteration": 17, + "result": 0, + "seconds": 16.988905375 + }, + { + "iteration": 18, + "result": 0, + "seconds": 23.065330791999997 + }, + { + "iteration": 19, + "result": 0, + "seconds": 19.538914750000004 + } + ] +} \ No newline at end of file diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostic-source-provenance.json b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostic-source-provenance.json new file mode 100644 index 00000000..bb534b21 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostic-source-provenance.json @@ -0,0 +1,7 @@ +{ + "head": "2a392a1b49f25923291ad90944148aa72a5caace", + "native_diagnostic_artifact_store_sha256": "ff8d7af8c7d32cbf9a441a59565ada82b68f85923dfcfc458a1a6f63dd0b6ebb", + "native_lib_sha256": "524be1d1038d898a7f2357e307984d63b2465f111dd8e2d18d689d45e67afb69", + "native_cli_sha256": "7be1d8661d409c0a7b197e94436486c45e80e7ccd5701c087e02a9c9f0c3b9eb", + "stress_source_sha256": "4c568b4133d4d3145c9308f0fee6d523036eddb378adae6affaf5259253cbc3d" +} \ No newline at end of file diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostics.patch b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostics.patch new file mode 100644 index 00000000..52824c34 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/diagnostics.patch @@ -0,0 +1,129 @@ +diff --git a/src/artifact_store.rs b/src/artifact_store.rs +index 844b90f..d062849 100644 +--- a/src/artifact_store.rs ++++ b/src/artifact_store.rs +@@ -19,6 +19,19 @@ const ARTIFACT_KEY_BYTES: usize = 32; + const ARTIFACT_KEY_HEX_LEN: usize = ARTIFACT_KEY_BYTES * 2; + const ARTIFACT_IO_BUFFER_BYTES: usize = 64 * 1024; + ++// Optional tracking errors must not change primary publication semantics. ++// Tests retain the precise stage in CI's log when a receipt precondition fails. ++macro_rules! trace_origin_result { ++ ($stage:literal, $operation:expr) => {{ ++ let result = $operation; ++ #[cfg(test)] ++ if let Err(error) = &result { ++ eprintln!("artifact origin {} failed: {error}", $stage); ++ } ++ result ++ }}; ++} ++ + #[derive(Debug, Clone, PartialEq, Eq)] + pub(crate) enum ArtifactWriteOutcome { + Written, +@@ -160,13 +173,27 @@ impl ArtifactStore { + use crate::storage::maintenance_controls::try_begin_root_publication; + use crate::storage::maintenance_origin::{OriginWriter, ORIGIN_NAME}; + let root = RootedDirectory::open(&self.root, path_identity(&self.root)?)?; +- let mut capability = mutation.artifact_root_producer_capability().unwrap_or(None); ++ let mut capability = ++ trace_origin_result!("capability", mutation.artifact_root_producer_capability()) ++ .unwrap_or(None); ++ #[cfg(test)] ++ if capability.is_none() { ++ eprintln!( ++ "artifact origin capability unavailable: {:?}", ++ mutation.pending_reason() ++ ); ++ } + // Tracking is optional. Primary no-replace/equality semantics and actual + // anchored transport are identical when controls are missing or busy. + let publication = match capability.as_mut() { +- Some(cap) => try_begin_root_publication(cap).unwrap_or(None), ++ Some(cap) => trace_origin_result!("publication lease", try_begin_root_publication(cap)) ++ .unwrap_or(None), + None => None, + }; ++ #[cfg(test)] ++ if publication.is_none() { ++ eprintln!("artifact origin publication lease unavailable"); ++ } + let prefix_name = &artifact_key.as_bytes()[..2]; + let prefix = match root.create_directory(prefix_name) { + Ok(dir) => { +@@ -196,11 +223,15 @@ impl ArtifactStore { + #[cfg(test)] + producer_hook("created", &temp); + let mut origin = publication.as_ref().and_then(|lease| { +- OriginWriter::create(lease, &temp, &payload, key_bytes, true, true).ok() ++ trace_origin_result!( ++ "creation", ++ OriginWriter::create(lease, &temp, &payload, key_bytes, true, true) ++ ) ++ .ok() + }); + let receipt_identity = origin.as_ref().map(OriginWriter::receipt_identity); + if let Some(origin) = origin.as_mut() { +- let _ = origin.writing(); ++ let _ = trace_origin_result!("writing", origin.writing()); + } + let prepared = (|| -> Result<(u64, [u8; 32]), NativeError> { + let bytes = write_envelope_file_and_sync( +@@ -212,7 +243,10 @@ impl ArtifactStore { + temp.sync_namespace()?; + root.sync_namespace()?; + if let Some(origin) = origin.as_mut() { +- let _ = origin.complete(&temp, &payload, bytes.0, bytes.1); ++ let _ = trace_origin_result!( ++ "completion", ++ origin.complete(&temp, &payload, bytes.0, bytes.1) ++ ); + } + Ok(bytes) + })(); +@@ -280,7 +314,7 @@ impl ArtifactStore { + root.sync_namespace()?; + if let Some(lease) = publication.as_ref() { + if let Some(origin) = origin_publication { +- let _ = origin.published(lease, &temp); ++ let _ = trace_origin_result!("publication", origin.published(lease, &temp)); + } + } + Ok(ArtifactWriteOutcome::Written) +diff --git a/tests/support/storage_maintenance/collector.rs b/tests/support/storage_maintenance/collector.rs +index b326a71..c1f1511 100644 +--- a/tests/support/storage_maintenance/collector.rs ++++ b/tests/support/storage_maintenance/collector.rs +@@ -1433,12 +1433,30 @@ fn capture_receipt_diagnostics(root: &FixtureRoot, artifact_root: &Path, key: &s + } + Err(error) => json!({"error":error.to_string()}), + }; ++ let payload = match fs::read( ++ artifact_root ++ .join(&key[..2]) ++ .join(key) ++ .join("partition.json"), ++ ) { ++ Ok(bytes) => { ++ json!({"bytes": bytes.len(), "sha256": format!("{:x}", Sha256::digest(&bytes))}) ++ } ++ Err(error) => json!({"error": error.to_string()}), ++ }; + let path = root + .path() + .parent() + .unwrap() + .join("qualification-receipt-diagnostics.json"); +- fs::write(&path, serde_json::to_vec_pretty(&json!({"fixture_root":root.path(),"artifact_root":artifact_root,"key":key,"reference_epoch":epoch,"controls":metadata,"receipt":receipt})).unwrap()).unwrap(); ++ let diagnostics = serde_json::to_vec_pretty(&json!({"fixture_root":root.path(),"artifact_root":artifact_root,"key":key,"reference_epoch":epoch,"controls":metadata,"receipt":receipt,"payload":payload})).unwrap(); ++ // CI retains the test log, but does not upload arbitrary fixture paths. ++ // Emit the evidence before writing so even a failed diagnostic write keeps it. ++ eprintln!( ++ "canonical receipt diagnostics:\n{}", ++ String::from_utf8_lossy(&diagnostics) ++ ); ++ fs::write(&path, diagnostics).unwrap(); + path + } + diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/native-pair-repeats.json b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/native-pair-repeats.json new file mode 100644 index 00000000..b49fb92a --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/native-pair-repeats.json @@ -0,0 +1,17 @@ +{ + "command": [ + "/private/tmp/pr157-ci-fix-evidence/native-bin/lib-tests", + "--exact", + "storage::maintenance_collector_tests::dc_s5_artifact_use_lease_defers_obsolete_key_until_release", + "storage::maintenance_collector_tests::dc_s5_canonical_only_durable_detach_interruption_resumes_without_source_edit", + "--test-threads=1", + "--nocapture" + ], + "results": [ + { + "iteration": 0, + "result": 0, + "seconds": 153.331854667 + } + ] +} \ No newline at end of file diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/provenance.json b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/provenance.json new file mode 100644 index 00000000..3a532230 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/provenance.json @@ -0,0 +1,25 @@ +{ + "source_baseline": "2a392a1b49f25923291ad90944148aa72a5caace", + "failed_merge": "4a9bef13247bf2faa1f311e4de0328ebd1dc67d3", + "same_git_tree": true, + "worktree": "/private/tmp/codebasegraph-cod52-macos-scans", + "platform": "macOS-26.6.2-arm64-arm-64bit", + "os": "ProductName:\t\tmacOS\nProductVersion:\t\t26.6.2\nBuildVersion:\t\t25G83\n", + "rustc": "rustc 1.96.0 (ac68faa20 2026-05-25)\nbinary: rustc\ncommit-hash: ac68faa20c58cbccd01ee7208bf3b6e93a7d7f96\ncommit-date: 2026-05-25\nhost: aarch64-apple-darwin\nrelease: 1.96.0\nLLVM version: 22.1.2\n", + "target_dir": "/private/tmp/codebasegraph-pr153-platform-862a8f88d485/cargo-target", + "cli": "/private/tmp/pr157-ci-fix-evidence/baseline-bin/codebase-graph", + "checks": { + "targeted": "env CARGO_TARGET_DIR=/private/tmp/codebasegraph-pr153-platform-862a8f88d485/cargo-target CARGO_BIN_EXE_codebase-graph=/private/tmp/pr157-ci-fix-evidence/baseline-bin/codebase-graph cargo nextest run --locked -p codebase-graph --lib --config-file /private/tmp/pr157-ci-fix-evidence/nextest.toml --profile pr157 -E 'test(artifact_store::tests::dc_origin_) | test(storage::maintenance_collector_tests::dc_s5_canonical_only_) | test(storage::locks::rooted_directory_tests::) | test(terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto)' --no-fail-fast", + "clippy": "env CARGO_TARGET_DIR=/private/tmp/codebasegraph-pr153-platform-862a8f88d485/cargo-target cargo clippy --locked --workspace --all-targets --all-features -- -D warnings", + "format": "cargo fmt --all --check", + "whitespace": "git diff --check" + }, + "limits": [ + "Diagnostic checkpoint only; original CI cause unproven.", + "Native pair repetition 0 completed; subsequent exploratory repetition deliberately interrupted, not passing.", + "Sandbox full run interrupted after local IPC denial; not source defect or qualification.", + "Unsandboxed frozen diagnostic baseline full run remains in progress; not passing.", + "Temporary diagnostic stress test completed 1000 real tracked publications; not retained implementation.", + "Current-host macOS evidence only; hosted/native Windows and full current revision qualification pending." + ] +} \ No newline at end of file diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/review.md b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/review.md new file mode 100644 index 00000000..b79c2e93 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/review.md @@ -0,0 +1,9 @@ +# COD-101 diagnostic checkpoint review + +Fresh read-only reviewer: GPT-6.1 Sol, Max effort, `fork_turns: none`; applied `/Users/rabii/.codex/skills/adversarial-review-engineer/SKILL.md`. Baseline `2a392a1b49f25923291ad90944148aa72a5caace`; independently matched the source and patch hashes in `snapshot.json`. + +No confirmed P0–P3 defect remains in the checkpoint. The reviewer traced every macro call through unchanged primary publication/error/cleanup paths: each operation is evaluated once and the same Result is returned; `cfg(test)` removes the logs in production. Existing ownership and test assertions remain intact. The diagnostic JSON contains control/receipt metadata plus payload length/hash, without payload/source bytes. + +The reviewer read the completed targeted log and JUnit: 27/27 passed, zero failures/errors, 819 not executed. Strict Clippy passed; formatting passed as reported by the coordinator. The reviewer performed no builds, tests, Git operations or writes. + +Readiness is limited to preserving diagnostic evidence. The hosted failure's cause is unproven; this is not a causal-fix, full-suite, MSRV or platform-qualification verdict. No new reusable-memory claim is warranted. diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/snapshot.json b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/snapshot.json new file mode 100644 index 00000000..7dc7983b --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/snapshot.json @@ -0,0 +1,8 @@ +{ + "baseline": "2a392a1b49f25923291ad90944148aa72a5caace", + "files": { + "src/artifact_store.rs": "e37ad48cceb33ff62249371ecf7f2b96aba3194c3061e8c0020aa592bc17eb30", + "tests/support/storage_maintenance/collector.rs": "7dbb6ea0512297b21e0e5395655e6591debf60fcca80ad5631113f3e4c862628" + }, + "patch_sha256": "95fd45c2dc6ec815dcfc9e22691482f6ef45975a9722780023ca146c8f5c6b2f" +} \ No newline at end of file diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/targeted-tests.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/targeted-tests.junit.xml new file mode 100644 index 00000000..99697c67 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/targeted-tests.junit.xml @@ -0,0 +1,280 @@ + + + + + +running 1 test +test artifact_store::tests::dc_origin_actual_fresh_publication_reuse_bounded_receipt_and_old_load_no_attestation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.49s + + + + + + +running 1 test +test artifact_store::tests::dc_origin_completed_receipt_remains_origin_only_for_nonfinite_loader_failure ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.22s + + + + + + +running 1 test +test artifact_store::tests::dc_origin_created_temp_foreign_neighbor_stays_at_original_name_on_failure ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.18s + + + + + + +running 1 test +test artifact_store::tests::dc_origin_missing_payload_is_republished_without_adopting_retained_directory ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.27s + + + + + + +running 1 test +test artifact_store::tests::dc_origin_missing_payload_refuses_unstamped_or_spoofed_receipt_birth ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.33s + + + + + + +running 1 test +test artifact_store::tests::dc_origin_optional_busy_publisher_still_writes_rooted_untracked_payload ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.26s + + + artifact origin publication lease unavailable + + + + +running 1 test +test artifact_store::tests::dc_origin_optional_receipt_completion_failure_preserves_actual_published_payload ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.22s + + + artifact origin publication failed: artifact_origin_receipt_changed + + + + +running 1 test +test artifact_store::tests::dc_origin_parallel_parser_publications_both_retain_real_creation_receipts ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.28s + + + + + + +running 1 test +test artifact_store::tests::dc_origin_unproven_empty_or_different_canonical_is_never_moved_or_overwritten ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.36s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 0.24s + + + + + + +running 1 test +test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 8.78s + + + + + + +running 1 test +test storage::maintenance_collector_tests::dc_s5_canonical_only_durable_detach_interruption_resumes_without_source_edit ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 18.37s + + + canonical-only fixture preparation: 1 known completed run(s) removed by established compatibility cleanup; this does not qualify terminal GC + + + + +running 1 test +test storage::maintenance_collector_tests::dc_s5_canonical_only_payload_unlink_interruption_resumes_without_source_edit ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 20.35s + + + canonical-only fixture preparation: 1 known completed run(s) removed by established compatibility cleanup; this does not qualify terminal GC + + + + +running 1 test +test storage::maintenance_collector_tests::dc_s5_canonical_only_real_producer_spare_key_is_collected_without_source_edit ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 845 filtered out; finished in 20.04s + + + canonical-only fixture preparation: 1 known completed run(s) removed by established compatibility cleanup; this does not qualify terminal GC + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-evidence/targeted-tests.log b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/targeted-tests.log new file mode 100644 index 00000000..729729c8 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-evidence/targeted-tests.log @@ -0,0 +1,37 @@ + Blocking waiting for file lock on package cache + Blocking waiting for file lock on package cache + Blocking waiting for file lock on package cache + Blocking waiting for file lock on package cache + Finished `test` profile [unoptimized + debuginfo] target(s) in 0.43s +──────────── + Nextest run ID ee57fc68-a85c-4d2d-a2b6-cd9600702fed with nextest profile: pr157 + Starting 27 tests across 1 binary (819 tests skipped) + PASS [ 0.510s] ( 1/27) codebase-graph artifact_store::tests::dc_origin_actual_fresh_publication_reuse_bounded_receipt_and_old_load_no_attestation + PASS [ 0.241s] ( 2/27) codebase-graph artifact_store::tests::dc_origin_completed_receipt_remains_origin_only_for_nonfinite_loader_failure + PASS [ 0.205s] ( 3/27) codebase-graph artifact_store::tests::dc_origin_created_temp_foreign_neighbor_stays_at_original_name_on_failure + PASS [ 0.296s] ( 4/27) codebase-graph artifact_store::tests::dc_origin_missing_payload_is_republished_without_adopting_retained_directory + PASS [ 0.356s] ( 5/27) codebase-graph artifact_store::tests::dc_origin_missing_payload_refuses_unstamped_or_spoofed_receipt_birth + PASS [ 0.288s] ( 6/27) codebase-graph artifact_store::tests::dc_origin_optional_busy_publisher_still_writes_rooted_untracked_payload + PASS [ 0.244s] ( 7/27) codebase-graph artifact_store::tests::dc_origin_optional_receipt_completion_failure_preserves_actual_published_payload + PASS [ 0.299s] ( 8/27) codebase-graph artifact_store::tests::dc_origin_parallel_parser_publications_both_retain_real_creation_receipts + PASS [ 0.376s] ( 9/27) codebase-graph artifact_store::tests::dc_origin_unproven_empty_or_different_canonical_is_never_moved_or_overwritten + PASS [ 0.044s] (10/27) codebase-graph storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases + PASS [ 0.032s] (11/27) codebase-graph storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases + PASS [ 0.023s] (12/27) codebase-graph storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file + PASS [ 0.035s] (13/27) codebase-graph storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag + PASS [ 0.021s] (14/27) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 + PASS [ 0.022s] (15/27) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity + PASS [ 0.032s] (16/27) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries + PASS [ 0.028s] (17/27) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls + PASS [ 0.021s] (18/27) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution + PASS [ 0.027s] (19/27) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission + PASS [ 0.057s] (20/27) codebase-graph storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement + PASS [ 0.025s] (21/27) codebase-graph storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity + PASS [ 0.030s] (22/27) codebase-graph storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor + PASS [ 0.266s] (23/27) codebase-graph storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor + PASS [ 8.803s] (24/27) codebase-graph storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto + PASS [ 18.395s] (25/27) codebase-graph storage::maintenance_collector_tests::dc_s5_canonical_only_durable_detach_interruption_resumes_without_source_edit + PASS [ 20.382s] (26/27) codebase-graph storage::maintenance_collector_tests::dc_s5_canonical_only_payload_unlink_interruption_resumes_without_source_edit + PASS [ 20.069s] (27/27) codebase-graph storage::maintenance_collector_tests::dc_s5_canonical_only_real_producer_spare_key_is_collected_without_source_edit +──────────── + Summary [ 71.149s] 27 tests run: 27 passed, 819 skipped diff --git a/docs/specs/CBG-PLAT-01/execution/cod101-receipt-diagnostics.md b/docs/specs/CBG-PLAT-01/execution/cod101-receipt-diagnostics.md new file mode 100644 index 00000000..e89aa0a0 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod101-receipt-diagnostics.md @@ -0,0 +1,23 @@ +# COD-101 — canonical receipt diagnostic checkpoint + +The failure in [CI 40608776432, job 122554842902](https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40608776432/job/122554842902) is **not yet reproduced or causally fixed**. The durable-detach case failed during `CanonicalFixture::new`, before its interruption boundary: the normal producer returned `Written`, but the fixture did not observe a complete receipt. The referenced diagnostic JSON was absent from the uploaded artifact. + +This checkpoint preserves optional tracking and every existing receipt, ownership, interruption, recovery and payload assertion. It logs ignored producer-stage errors only in test builds and emits the fixture's diagnostic JSON into the retained test log, adding payload length/hash without printing payload bytes. It does not add retries, relax the fixture or change production publication behavior. + +## Authority and trace + +- [COD-101](https://linear.app/codebasegraph/issue/COD-101), related to [COD-52](https://linear.app/codebasegraph/issue/COD-52). User decision: the explicit 2026-10-28 request to debug/fix the linked failed job on PR157's branch. +- Existing canonical wiki `knowledge/architecture/graph-disk-cleanup-contract.md`, DC-S5 revision 0.1 R5/R6/R8 and A2/A3; unchanged DC-S2/S3 ownership contracts. No new specification or architecture contract is introduced. +- COD-52 R01/A01–A02 retains [specification 0.10 at approved SHA 1a9db7b558b60248888408daa6268a3b45f2f0df](https://github.com/rabii-chaarani/codebaseGraph/blob/1a9db7b558b60248888408daa6268a3b45f2f0df/docs/specs/CBG-PLAT-01/spec.md) and [its original approval](../approvals/cod52-macos-nested-scans.md). +- Scryer proportional ledger `chg-nw1t96`, existing Graph Store `node-88` / `resp-232,233` context. The connected model belongs to the older root checkout; the target has no model. No model copy, invented claims, root test verdict ingestion or unrelated drift reconciliation occurred. Target graph discovery was performed explicitly. +- Source baseline `2a392a1b49f25923291ad90944148aa72a5caace`; failed synthetic merge `4a9bef13247bf2faa1f311e4de0328ebd1dc67d3` has an identical Git tree. Changed implementation/fixture anchors and hashes are in [the reviewed patch](cod101-evidence/diagnostics.patch) and [snapshot](cod101-evidence/snapshot.json). + +## Executed evidence and limits + +- Current checkpoint: **27/27 selected existing tests pass**, zero failures/errors; **819 not executed**. This includes actual durable detach, payload unlink, genuine producer collection, origin semantics and rooted traversal. [JUnit](cod101-evidence/targeted-tests.junit.xml), [log](cod101-evidence/targeted-tests.log), [environment/commands](cod101-evidence/provenance.json). +- Strict locked workspace/all-target/all-feature Clippy with warnings denied passes; formatting and whitespace checks pass. [Clippy log](cod101-evidence/clippy.log). +- Investigation before this checkpoint: unchanged exact case 12/12 passes; temporary diagnostic exact case 20/20 passes; one optimized predecessor-plus-failing-case pair passes; one temporary real producer experiment completes 1,000 tracked publications. These observations do not establish a cause. Repeat records and frozen diagnostic identities are retained in [the evidence directory](cod101-evidence/). +- Additional native-pair repetition was deliberately interrupted. A sandbox full run was interrupted after coordinator IPC denial. A subsequent unsandboxed frozen diagnostic baseline run is still in progress. Neither full run is counted as passing, and neither tests this later checkpoint. +- Current macOS 26.6.2 ARM64 / Rust 1.96 execution is not Rust 1.82, minimum-macOS, Windows, whole-matrix or consumer qualification. Hosted execution of this checkpoint remains pending. + +Fresh read-only GPT-6.1 Sol/High proposal review cleared the bounded diagnostic experiment. Fresh read-only GPT-6.1 Sol/Max [checkpoint review](cod101-evidence/review.md) found no confirmed P0–P3 defect. Its readiness verdict applies to diagnostic preservation only. The underlying fix and COD-101 acceptance remain open; aggregate/milestone closure stays with the maintainer. No merge, deployment or service restart occurred. No new reusable-memory claim is warranted by an unreproduced cause. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/baseline-provenance.json b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/baseline-provenance.json new file mode 100644 index 00000000..2ca386f1 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/baseline-provenance.json @@ -0,0 +1,27 @@ +{ + "baseline": "7038e66ff8271ffddc511f879cf8d28353a09b2d", + "approval": "9bf9212d9266c33b389829925b456c1da7320886", + "scope": [ + "COD-52", + "R01", + "A01", + "A02" + ], + "files": { + "src/storage/locks.rs": "c9e62ce647dfe207e6c44a7f9029b734bc1ff5dd319fccc60c1a87c7d6a4d88b", + "src/storage/maintenance_candidate.rs": "2d63f7e9950cd82784f84fb3cbffcb4ff266508949161ef65e5934d02ae4dd17", + "Cargo.toml": "c63838504978568dc8428065f3d4e8afcff76528040bac9496f6380ce614eef9", + "Cargo.lock": "b99948cf1027f1609cbec7f7c43b796743ce4523550e95ce860cfe5dbd4d7d84" + }, + "native_library": { + "path": "/Users/rabii/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/lbug-0.19.0/.cache/lbug-prebuilt/latest/lib/liblbug.a", + "sha256": "a840ea7c538e67a8b9fc0d58495b5226dc9c0a5f2f144ff0c48c0f6ca1193ae6" + }, + "target_dir": "/private/tmp/codebasegraph-pr153-platform-862a8f88d485/cargo-target", + "platform": { + "os": "ProductName:\t\tmacOS\nProductVersion:\t\t26.6.2\nBuildVersion:\t\t25G83\n", + "rustc": "rustc 1.96.0 (ac68faa20 2026-05-25)\nbinary: rustc\ncommit-hash: ac68faa20c58cbccd01ee7208bf3b6e93a7d7f96\ncommit-date: 2026-05-25\nhost: aarch64-apple-darwin\nrelease: 1.96.0\nLLVM version: 22.1.2\n" + }, + "old_root_mcp_graph_not_exact_source": true, + "target_graph_discovery": "/private/tmp/codebasegraph-cod52-evidence/graph-discovery.txt" +} diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/baseline-rooted.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/baseline-rooted.junit.xml new file mode 100644 index 00000000..d474e708 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/baseline-rooted.junit.xml @@ -0,0 +1,125 @@ + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 265 filtered out; finished in 0.01s + + + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/clippy-final-frozen.log b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/clippy-final-frozen.log new file mode 100644 index 00000000..81166279 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/clippy-final-frozen.log @@ -0,0 +1,3 @@ + Checking codebase-graph v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans) + Checking k-wiki v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans/crates/k-wiki) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 7.55s diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/excluded-partial-library-run.md b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/excluded-partial-library-run.md new file mode 100644 index 00000000..d375bd67 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/excluded-partial-library-run.md @@ -0,0 +1,3 @@ +# Excluded partial library run + +The full library run `library-full.log` began before the candidate receipt test was integrated. A later targeted Cargo build reused the same target/test binary path while that run remained active. The coordinator terminated it to avoid mixed-binary provenance. Preserve the partial output as excluded historical evidence; it is not a passing or source-specific full-suite result. Final full-library verification must run only after source/test edits and builds are serialized. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/executed-commands.json b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/executed-commands.json new file mode 100644 index 00000000..8e0272e7 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/executed-commands.json @@ -0,0 +1,93 @@ +[ + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo test --locked -p codebase-graph --test storage_foundation --no-run", + "result": 0, + "log": "baseline-compile.log" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --test storage_foundation --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 -E test(rooted_directory_tests::)", + "result": 0, + "log": "baseline-rooted-tests.log", + "junit": "baseline-rooted.junit.xml" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --test storage_foundation --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 -E 'test(nested_directory_scans_do_not_consume_the_outer_cursor) | test(interrupted_directory_scan_restarts_on_the_pinned_root)' --no-fail-fast", + "result": 100, + "log": "regression-baseline.log", + "junit": "regression-baseline.junit.xml", + "limits": "new tests with old Mac production, expected invariant failure" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --test storage_foundation --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 --no-fail-fast", + "result": 0, + "log": "storage-foundation-full.log", + "junit": "storage-foundation-full.junit.xml", + "limits": "267 pass, ignored subprocess-only relative_barrier_subprocess_fixture; precedes final fixture changes" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo clippy --locked --workspace --all-targets --all-features -- -D warnings", + "result": 101, + "log": "clippy.log", + "limits": "manual C string lint, fixed" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo clippy --locked --workspace --all-targets --all-features -- -D warnings", + "result": 0, + "log": "clippy-fixed.log" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --test storage_foundation --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 -E 'test(rooted_directory_tests::)' --no-fail-fast", + "result": 0, + "log": "rooted-postreview.log", + "junit": "rooted-postreview.junit.xml", + "limits": "14/14, Windows-advisory expectation corrected but native Mac execution only" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo fmt --all --check", + "result": 0, + "log": "format-final.log" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --test storage_maintenance --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 --no-fail-fast", + "result": 0, + "log": "storage-maintenance-full.log", + "junit": "storage-maintenance-full.junit.xml", + "limits": "11 pass, no skipped; before final candidate test-only integration" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --lib --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 -E 'test(storage::locks::rooted_directory_tests::) | test(terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto)' --no-fail-fast", + "result": 0, + "log": "integrated-final-regressions.log", + "junit": "integrated-final-regressions.junit.xml", + "source_hashes": { + "src/storage/locks.rs": "3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c", + "src/storage/maintenance_candidate.rs": "8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765" + }, + "result_summary": "15 pass,830 filtered (not executed)" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo nextest run --locked -p codebase-graph --lib --config-file /private/tmp/codebasegraph-cod52-evidence/nextest.toml --profile cod52 -E 'test(terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto)'", + "result": 100, + "log": "receipt-final-old-production.log", + "junit": "receipt-final-old-production.junit.xml", + "limits": "final strengthened candidate fixture, only Mac production reverted to old cursor; expected selection failure" + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo clippy --locked --workspace --all-targets --all-features -- -D warnings", + "result": 0, + "log": "clippy-final-frozen.log", + "source_hashes": { + "src/storage/locks.rs": "3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c", + "src/storage/maintenance_candidate.rs": "8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765" + } + }, + { + "command": "cd /private/tmp/codebasegraph-cod52-macos-scans && cargo fmt --all --check", + "result": 0, + "log": "format-final-frozen.log", + "source_hashes": { + "src/storage/locks.rs": "3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c", + "src/storage/maintenance_candidate.rs": "8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765" + } + } +] diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-frozen-diff.patch b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-frozen-diff.patch new file mode 100644 index 00000000..ef47a30a --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-frozen-diff.patch @@ -0,0 +1,321 @@ +diff --git a/src/storage/locks.rs b/src/storage/locks.rs +index 8407242..754de2f 100644 +--- a/src/storage/locks.rs ++++ b/src/storage/locks.rs +@@ -2100,28 +2100,105 @@ mod rooted_directory_tests { + root.sync_namespace().unwrap(); + assert_eq!(root.identity(), id); + } +- #[cfg(windows)] ++ #[cfg(any(target_os = "macos", windows))] + #[test] + fn nested_directory_scans_do_not_consume_the_outer_cursor() { + let fixture = Fixture::new(); + let root = fixture.anchor(); +- for name in [b"one".as_slice(), b"two", b"three"] { +- drop(root.create_new(name).unwrap()); +- } +- let mut outer = Vec::new(); ++ let mut expected = Vec::new(); ++ // Even minimum-sized native records cannot fit in one scratch buffer. ++ for index in 0..160 { ++ let name = format!("directory-{index:03}-{}", "x".repeat(64)).into_bytes(); ++ drop(root.create_directory(&name).unwrap()); ++ expected.push(name); ++ } ++ let mut all_entries = expected.clone(); ++ drop(root.create_new(b"regular-payload").unwrap()); ++ all_entries.push(b"regular-payload".to_vec()); ++ all_entries.sort(); ++ let mut baseline = Vec::new(); + root.visit_entries(&mut [0; 4096], &mut |name| { +- let mut inner = 0; +- root.visit_entries(&mut [0; 4096], &mut |_| { +- inner += 1; +- Ok(()) +- })?; +- assert_eq!(inner, 3); +- outer.push(name.to_vec()); ++ baseline.push(name.to_vec()); + Ok(()) + }) + .unwrap(); +- outer.sort(); +- assert_eq!(outer, [b"one".to_vec(), b"three".to_vec(), b"two".to_vec()]); ++ baseline.sort(); ++ assert_eq!(baseline, all_entries); ++ ++ for directories_only in [false, true] { ++ let mut outer = Vec::new(); ++ let mut visit = |name: &[u8]| { ++ if directories_only && root.open_directory_readonly(name).is_err() { ++ return Ok(()); ++ } ++ let mut inner = Vec::new(); ++ root.visit_entries(&mut [0; 4096], &mut |entry| { ++ inner.push(entry.to_vec()); ++ Ok(()) ++ })?; ++ inner.sort(); ++ assert_eq!(inner, all_entries); ++ outer.push(name.to_vec()); ++ Ok(()) ++ }; ++ if directories_only { ++ root.visit_directories(&mut [0; 4096], &mut visit) ++ } else { ++ root.visit_entries(&mut [0; 4096], &mut visit) ++ } ++ .unwrap(); ++ outer.sort(); ++ assert_eq!( ++ outer.as_slice(), ++ if directories_only { ++ &expected ++ } else { ++ &all_entries ++ } ++ ); ++ } ++ } ++ #[cfg(target_os = "macos")] ++ #[test] ++ fn interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement() { ++ let fixture = Fixture::new(); ++ let public = fixture.root.join("public"); ++ fs::create_dir(&public).unwrap(); ++ let root = ++ RootedDirectory::open_readonly_root(&public, path_identity(&public).unwrap()).unwrap(); ++ let mut expected = Vec::new(); ++ for index in 0..160 { ++ let name = format!("owned-{index:03}").into_bytes(); ++ drop(root.create_new(&name).unwrap()); ++ expected.push(name); ++ } ++ let mut visited = 0; ++ let error = root ++ .visit_entries(&mut [0; 4096], &mut |_| { ++ visited += 1; ++ Err(std::io::ErrorKind::Interrupted.into()) ++ }) ++ .unwrap_err(); ++ assert_eq!(error.kind(), std::io::ErrorKind::Interrupted); ++ assert_eq!(visited, 1); ++ fs::rename(&public, fixture.root.join("original")).unwrap(); ++ fs::create_dir(&public).unwrap(); ++ fs::write(public.join("foreign-sentinel"), b"foreign").unwrap(); ++ ++ for _ in 0..2 { ++ let mut seen = Vec::new(); ++ root.visit_entries(&mut [0; 4096], &mut |name| { ++ seen.push(name.to_vec()); ++ Ok(()) ++ }) ++ .unwrap(); ++ seen.sort(); ++ assert_eq!(seen, expected); ++ } ++ assert_eq!( ++ fs::read(public.join("foreign-sentinel")).unwrap(), ++ b"foreign" ++ ); + } + #[cfg(windows)] + #[test] +@@ -2540,22 +2617,37 @@ impl RootedDirectory { + ) -> std::io::Result<()> { + #[cfg(target_os = "macos")] + { +- use std::os::fd::AsRawFd; ++ use std::os::fd::{AsRawFd, FromRawFd}; ++ // A new open file description isolates nested traversal offsets. ++ // SAFETY: trusted dot resolves against the retained actual directory; ++ // no public pathname is reopened and the returned FD is owned below. ++ let fd = unsafe { ++ libc::openat( ++ self.directory.as_raw_fd(), ++ c".".as_ptr(), ++ libc::O_RDONLY | libc::O_DIRECTORY | libc::O_NOFOLLOW | libc::O_CLOEXEC, ++ ) ++ }; ++ if fd < 0 { ++ return Err(std::io::Error::last_os_error()); ++ } ++ // SAFETY: openat returned a fresh descriptor owned by this File. ++ let directory = unsafe { File::from_raw_fd(fd) }; ++ if file_identity(&directory).map_err(native_io)? != self.identity { ++ return Err(std::io::ErrorKind::InvalidInput.into()); ++ } + let mut attributes: libc::attrlist = unsafe { std::mem::zeroed() }; + attributes.bitmapcount = libc::ATTR_BIT_MAP_COUNT; + attributes.commonattr = libc::ATTR_CMN_NAME | libc::ATTR_CMN_RETURNED_ATTRS; + if directories_only { + attributes.commonattr |= libc::ATTR_CMN_OBJTYPE; + } +- // SAFETY: actual directory FD, bounded writable caller scratch and +- // initialized attrlist. No libc DIR allocation or path expansion. +- if unsafe { libc::lseek(self.directory.as_raw_fd(), 0, libc::SEEK_SET) } < 0 { +- return Err(std::io::Error::last_os_error()); +- } + loop { ++ // SAFETY: actual directory FD, bounded writable caller scratch ++ // and initialized attrlist. No libc DIR or path expansion. + let count = unsafe { + libc::getattrlistbulk( +- self.directory.as_raw_fd(), ++ directory.as_raw_fd(), + (&mut attributes as *mut libc::attrlist).cast(), + bytes.as_mut_ptr().cast(), + bytes.len(), +diff --git a/src/storage/maintenance_candidate.rs b/src/storage/maintenance_candidate.rs +index 92bc9c3..9c862a4 100644 +--- a/src/storage/maintenance_candidate.rs ++++ b/src/storage/maintenance_candidate.rs +@@ -2104,6 +2104,147 @@ mod tests { + corrupt[8] = 1; + assert!(Control::decode(&corrupt, scope).is_err()); + } ++ ++ #[cfg(target_os = "macos")] ++ #[test] ++ fn terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto() { ++ use super::super::layout::{create_fresh_reference_root, managed_generation_id}; ++ use super::super::maintenance_admission::tests::Fixture; ++ use super::super::maintenance_controls::{ ++ self as controls, WorkspaceCreatedDirectory, WorkspaceDisposition, ++ WorkspaceRegistration, ++ }; ++ use super::super::maintenance_origin; ++ use super::super::maintenance_ownership::ReferenceMutation; ++ use std::fs; ++ use std::path::Path; ++ ++ let f = Fixture::new(); ++ let workspace_base = f ++ .domain ++ .workspace_registry(2, Some(&f.target.state_root)) ++ .expect("managed worker registry"); ++ fs::create_dir_all(&workspace_base).unwrap(); ++ let root = workspace_base.join(format!("worker-{}", managed_generation_id())); ++ let fresh = create_fresh_reference_root(&root).unwrap().unwrap(); ++ let anchor = RootedDirectory::open(&root, fresh.identity()).unwrap(); ++ let owner = ++ locks::create_new_coordination_in(&anchor, b"lease.lock", &root.join("lease.lock")) ++ .unwrap(); ++ let creation_mutation = ReferenceMutation::begin_in_domain(&f.domain).unwrap(); ++ let startup = locks::open_shared_coordination(&f.domain.workspace_startup_path()).unwrap(); ++ let registration = ++ WorkspaceRegistration::create(&fresh, &f.domain, &creation_mutation, &owner, 2) ++ .unwrap() ++ .expect("fresh worker registration"); ++ drop((startup, creation_mutation)); ++ ++ let create_directory = |path: &Path| { ++ let output = WorkspaceCreatedDirectory::create_new(path) ++ .unwrap() ++ .expect("registered workspace directory output"); ++ let binding = output.origin_binding(); ++ maintenance_origin::record_created_workspace_directory(&output).unwrap(); ++ let receipt = controls::workspace_origin_name( ++ &binding.incarnation, ++ binding.parent, ++ binding.output, ++ &binding.operation, ++ ); ++ let identity = binding.output; ++ drop(output); ++ (receipt, identity) ++ }; ++ ++ let mut fillers = Vec::new(); ++ for index in 0..161 { ++ let path = root.join(format!("output-{index:03}")); ++ let (receipt, identity) = create_directory(&path); ++ fs::write(path.join("retain"), b"ineligible").unwrap(); ++ fillers.push((path, receipt, identity)); ++ } ++ // Without the child-receipt veto this smallest receipt would win. ++ let parent_index = fillers ++ .iter() ++ .enumerate() ++ .min_by_key(|(_, (_, receipt, _))| *receipt) ++ .unwrap() ++ .0; ++ let (parent_path, parent_receipt, parent_id) = fillers.remove(parent_index); ++ fs::remove_file(parent_path.join("retain")).unwrap(); ++ let child = parent_path.join("retired-child"); ++ let _ = create_directory(&child); ++ fs::remove_dir(&child).unwrap(); ++ ++ // Observe native order rather than assume APFS ordering. The selected ++ // target lies well beyond the first 4096-byte native result batch. ++ let root_pin = ++ RootedDirectory::open_readonly_root(&root, locks::path_identity(&root).unwrap()) ++ .unwrap(); ++ let registry = root_pin ++ .open_directory_readonly(b".workspace-origins") ++ .unwrap(); ++ let mut order = Vec::new(); ++ registry ++ .visit_entries(&mut [0; 4096], &mut |entry| { ++ if entry.len() == 64 { ++ let mut name = [0; 64]; ++ name.copy_from_slice(entry); ++ order.push(name); ++ } ++ Ok(()) ++ }) ++ .unwrap(); ++ let position = |name: &[u8; 64]| order.iter().position(|seen| seen == name); ++ let (target_path, target_receipt, target_id) = fillers ++ .iter() ++ .find(|(_, receipt, _)| position(receipt).is_some_and(|index| index > 128)) ++ .expect("160 fillers cannot all fit in the first 129 entries"); ++ let target_position = position(target_receipt).unwrap(); ++ assert!(target_position > 128); ++ assert!(parent_receipt < *target_receipt); ++ assert!(parent_path.is_dir()); ++ assert!(!parent_path.join("retired-child").exists()); ++ assert_eq!(fs::read_dir(&parent_path).unwrap().count(), 0); ++ fs::remove_file(target_path.join("retain")).unwrap(); ++ ++ let mutation = ReferenceMutation::begin_in_domain(&f.domain).unwrap(); ++ registration ++ .terminal(&owner, &mutation, WorkspaceDisposition::AbortedNotPublished) ++ .unwrap(); ++ drop((mutation, owner, anchor, fresh)); ++ ++ let ready = ++ controls::prepare_terminal_workspace_boxed(&root, &f.domain, &f.memory).unwrap(); ++ let scope = ready.origin_scope(); ++ assert!( ++ workspace_has_child_receipts(®istry, parent_id, scope, &f.memory, &|| false) ++ .unwrap() ++ ); ++ drop(registry); ++ drop(root_pin); ++ ++ let mut report = CandidateReport::default(); ++ assert!(matches!( ++ prepare_terminal_output(ready, &f.memory, &|| true, &mut report), ++ Err(CandidateError::Io(std::io::ErrorKind::Interrupted)) ++ )); ++ assert!(parent_path.is_dir()); ++ let ready = ++ controls::prepare_terminal_workspace_boxed(&root, &f.domain, &f.memory).unwrap(); ++ let selected = prepare_terminal_output(ready, &f.memory, &|| false, &mut report) ++ .unwrap() ++ .expect("selection must continue after the parent receipt is vetoed"); ++ assert_eq!(selected.origin.binding.output, *target_id); ++ assert!(selected.origin.directory); ++ let selected_name = ++ &selected.origin.binding.name[..selected.origin.binding.name_len as usize]; ++ assert_eq!( ++ selected_name, ++ target_path.file_name().unwrap().as_encoded_bytes() ++ ); ++ assert!(parent_path.is_dir()); ++ } + } + + /// Produced only after the already-prepared completion control was durably diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-frozen-snapshot.json b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-frozen-snapshot.json new file mode 100644 index 00000000..531733aa --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-frozen-snapshot.json @@ -0,0 +1,16 @@ +{ + "baseline": "7038e66ff8271ffddc511f879cf8d28353a09b2d", + "files": { + "src/storage/locks.rs": "3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c", + "src/storage/maintenance_candidate.rs": "8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765" + }, + "approval": "9bf9212d9266c33b389829925b456c1da7320886", + "evidence": { + "final_receipt_old_production": "FAIL", + "final_fixed_regressions": "15/15PASS" + }, + "command_environment": { + "CARGO_TARGET_DIR": "/private/tmp/codebasegraph-pr153-platform-862a8f88d485/cargo-target" + }, + "native_library_sha256": "a840ea7c538e67a8b9fc0d58495b5226dc9c0a5f2f144ff0c48c0f6ca1193ae6" +} diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-review-followup.md b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-review-followup.md new file mode 100644 index 00000000..6213e431 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-review-followup.md @@ -0,0 +1,58 @@ +# COD-52 / CBG-PLAT-01 S01 — final-review follow-up + +## Outcome + +**No unresolved confirmed P0–P3 defect in the final frozen production/test change. F1 is fixed.** Final source hashes independently match `final-frozen-snapshot.json`. The final strengthened receipt test has the intended old-production failure and passes alongside all 14 rooted cases (15/15) on native macOS. The source/test review gate is complete for this exact snapshot. Coordinator-owned final strict/full checks and required native Windows execution remain separate verification/A02 gates. This is not COD-52 closure, release approval or aggregate qualification. + +## Reviewer and reviewed state + +Same fresh read-only reviewer as `final-review.md`; actual execution was attested by the coordinator as `openai-codex/gpt-6.1-sol`, `thinking="max"`. Used the required adversarial-review-engineer skill; no inherited implementation work. + +- Baseline: `7038e66ff8271ffddc511f879cf8d28353a09b2d`. +- Scope: approved spec rev0.10 at `1a9db7b558b60248888408daa6268a3b45f2f0df`, R01 / A01–A02 / S01 only; existing `resp-232`/`resp-233`, Scryer `chg-bfthrc`. +- Production + corrected rooted tests: `src/storage/locks.rs` SHA-256 `3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c`. +- Latest strengthened receipt-test source read: `src/storage/maintenance_candidate.rs` SHA-256 `8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765`. +- Final binding: `final-frozen-snapshot.json` with the two hashes above; independently reread source matches exactly. The earlier `integrated-snapshot.json`/`integrated-diff.patch` binds candidate hash `80ac795fbc95c49d7f09691ca96a33f21da6362690afe69bd36b1280c31e515a`, not the final variant. That interim mismatch was detected and resolved by the final manifest. Read `receipt-integrated-description.md` for the final oracle; original worker reports describe historical variants. +- Source-discovery evidence: initial `graph-discovery.txt` plus expanded `fixture-graph-discovery.txt`. Inspected only graph-discovered locks/candidate and fixture/control/origin source. Reviewed real receipt factories and canonical temporary fixture handling; mutable implementation facts were not inferred from recalled memory or older-root Scryer state. + +## F1 — resolved + +The broadened nested test now verifies each directory hint with `open_directory_readonly` before the filtered exact-set assertion (`locks.rs:2131–2133`). Windows intentionally returns advisory names for `visit_directories`, so this excludes the regular payload without changing product behavior. Missing real directories still fail the exact expected-set assertion. The unfiltered branch retains exact complete-set and nested-scan checks. No source path still has the initial deterministic Windows mismatch. + +Evidence after correction: `rooted-postreview.log`/JUnit 14/14 macOS pass; the earlier integrated library run also passes all 14 rooted cases. Native Windows has not run, so this is static Windows verification plus native macOS execution, not a Windows passing claim. + +## Latest production receipt regression reviewed + +Location: `maintenance_candidate.rs:2108–2247` (latest hash above). + +1. Uses the genuine canonicalized `maintenance_admission::tests::Fixture`, a fresh kind-2 worker root, exclusive lease, real reference mutation/startup gate and `WorkspaceRegistration::create`. It does not forge a decoded receipt or bypass registration with a mock. +2. Uses `WorkspaceCreatedDirectory::create_new` and `record_created_workspace_directory`; the factory checks live workspace scope and created-directory identity/nonce, creates genuine receipt files, writes/fsyncs and reads back durable origin frames. The test records real receipt names and physical identities from those outputs. +3. Creates 161 root directory outputs, initially all nonempty. It chooses the lexicographically smallest root receipt as the protected parent. It removes that directory's sentinel, creates/records a child and removes only the child payload. The parent is empty while its genuine child receipt remains. +4. The remaining 160 fillers guarantee at least one observed receipt index greater than128. Each native macOS record has at least32 bytes before name storage; more than129 records cannot fit the fixed4096-byte result batch. Thus the selected target is beyond one batch without asserting the incidental native85 count. Observed order is used instead of assuming APFS lexicographic enumeration. +5. Only the selected late filler becomes empty. The parent receipt is asserted lex-smaller than the target, so deleting/omitting the child-veto check from the otherwise-correct selector would select the parent and fail the target-identity assertion. This strengthens the earlier64-pair variant, which independently checked the veto helper but did not guarantee that same mutation was detected by the final selection oracle. +6. Terminalizes the real registration and releases actual owner guards before preparing the real terminal workspace. It explicitly confirms `workspace_has_child_receipts` for the empty parent, then calls the production `prepare_terminal_output`, not a test-only replacement selector. +7. The new cancellation check passes an always-true callback and asserts the actual existing `CandidateError::Io(Interrupted)` outcome. It checks the parent remains, reprepares the real workspace and retries successfully. This tests prompt callback cancellation/retry; it does not claim forced preemption during arbitrary native calls or every nested cancellation point. +8. Final assertions require the selected exact physical identity, directory flag and basename, and retain the parent. Preparation is read-only eligibility work; this test does not execute destructive retirement or claim full deletion-protocol coverage. + +The only changes in `maintenance_candidate.rs` are inside the macOS test module. Production receipt selection, child retention, bounded scratch, cancellation mapping, authority checks and deletion protocol are unchanged. The initial macOS production analysis in `final-review.md` remains valid: fresh pinned `openat` description, immediate RAII, identity check, no shared `lseek`, unchanged parser/API and native error propagation. No changed Rust operation exceeds MSRV1.82 by static API/stability analysis; actual MSRV execution remains absent. + +## Executed evidence examined and its revision limits + +- **Final negative control:** `receipt-final-old-production.log` / `.junit.xml`, final candidate hash `8e539db8…` with only the macOS production cursor restored to its old implementation: expected failure at `maintenance_candidate.rs:2237`, no selected candidate, 0 pass/1 fail (4.725s). Registration, child-veto and immediate-cancel assertions completed before that failure. This isolates the original cursor mechanism rather than invalid fixture setup. +- **Final fixed run:** `integrated-final-regressions.log` / `.junit.xml`, final candidate/locks hashes above, native library target: **15/15 pass**, 830 skipped by the focused filter, total 7.590s. The receipt case passes in 7.111s, including smallest-parent, actual selector cancellation/reprepare, late-target identity/name and retained-parent assertions. All 14 rooted cases pass, including F1's corrected test. The coordinator restored the fixed production bytes after the negative control; this review independently confirms the final source hashes. +- `format-final-frozen.log`: empty success as reported by the coordinator for the final frozen bytes. Final strict/full runs were still in progress at this report update; no passing result is inferred. +- **Historical earlier fixture:** `receipt-old-production.log` / `.junit.xml`: old macOS shared-cursor production with the earlier `80ac795f…` receipt fixture fails at `prepare_terminal_output(...).expect`, returning no candidate. Setup and explicit child-veto checks completed before the failure, so this is the intended selection-completeness negative control rather than an invalid fixture. Result:0 pass,1 fail,9.634s. +- `integrated-regressions.log` / `.junit.xml`: restored production plus the same earlier fixture,15/15 pass in the library target, including all14 rooted tests and actual receipt selection (18.206s receipt case). The storage-foundation harness does **not** include this candidate test; the earlier no-tests attempt is not passing coverage. +- `rooted-postreview.log` / `.junit.xml`:14/14 pass after F1 correction. +- `storage-maintenance-full.log` / `.junit.xml`:11/11 pass (338.450s), before final test-only changes. Includes real worker publication-birth, owner-death/retry, public-build/control and foreign-sentinel checks. +- Earlier storage-foundation267/267 (one ignored), strict Clippy and format results retain their original revision limits. `format-integrated.log` is empty success per coordinator; final full checks are still owned by the coordinator. +- Local execution environment remains macOS26.6.2 build25G83 ARM64, Rust1.96 with recorded native archive provenance. No native Windows, Rust1.82 or macOS13.3 execution was performed by this reviewer. + +## Remaining gates and recommendation + +- Final source binding and final receipt negative/positive checks are satisfied as recorded above; preserve the separate historical-variant labels. +- Complete coordinator-owned final strict/full verification at this frozen snapshot. Do not count an interrupted/partial full-library run as passing. +- Native Windows nested/storage verification is still required for A02. The final Windows test is statically sound, but neither source review nor macOS results qualify Windows. +- Preserve the older-root Scryer/isolated-model limitation; do not ingest worktree evidence as root implementation proof or silently declare architecture/delivery closure. + +The final source/test review is satisfied for the recorded snapshot. Proceed within approved scope only after the remaining executed-verification gates; keep qualification/closure pending until its stated gates pass. No new confirmed defect or separate conditional product risk survived this scoped follow-up. No product constants/dependencies/API or supported platform scope changed. Assumptions: native order is observed before non-registry mutations; the fixture is isolated and no external actor mutates it. No builds, source edits, Git operations or external mutations were performed by this reviewer. Only requested review evidence was written; no reusable-memory candidate is warranted for transient review state. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-review.md b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-review.md new file mode 100644 index 00000000..b0e2ab61 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/final-review.md @@ -0,0 +1,60 @@ +# COD-52 / CBG-PLAT-01 S01 — independent final review (initial pass) + +## Outcome + +One confirmed P2 was found in the broadened Windows test. The coordinator has corrected it in the working tree; the correction is statically verified below, with execution still pending. No confirmed defect survives review of the macOS production cursor-isolation change. **The final review/completion gate is still pending:** the production receipt-selection regression is not yet integrated/reviewed, final-snapshot checks are pending, and native Windows execution is absent. + +## Reviewer, scope and snapshot + +- Fresh read-only reviewer, did not implement this patch. Used `/Users/rabii/.codex/skills/adversarial-review-engineer/SKILL.md` and its engineering lenses. +- Actual reviewer execution attested by coordinator: `openai-codex/gpt-6.1-sol`, `thinking="max"`; spawn resolved to that model. The observer does not independently expose effort. +- Base: `7038e66ff8271ffddc511f879cf8d28353a09b2d`. +- Worktree: `/private/tmp/codebasegraph-cod52-macos-scans`. +- Initial review snapshot: `review-snapshot.json`; diff: `review-diff.patch`. +- Initial `src/storage/locks.rs` SHA-256: `7ad30072cb9ceed32391c95638dc3ade880db1251f1bd10cc034f498f3d941b5`. +- Initial `src/storage/maintenance_candidate.rs` SHA-256: `2d63f7e9950cd82784f84fb3cbffcb4ff266508949161ef65e5934d02ae4dd17` (unchanged at initial snapshot). +- Scope: approved rev0.10 at `1a9db7b558b60248888408daa6268a3b45f2f0df`, R01, A01–A02 / S01 only; approval record `docs/specs/CBG-PLAT-01/approvals/cod52-macos-nested-scans.md`; Scryer `chg-bfthrc`, existing `resp-232`/`resp-233`, no new claims. +- Followed the supplied isolated graph-discovery evidence before source inspection. Recalled repository memory, read the canonical cleanup contract through k-wiki, and read Scryer rules, Graph Store intent and the proportional ledger. The configured model is the older root, not SHA-bound worktree evidence; no model mutations or test-report ingestion were performed. + +## Finding F1 — P2, confirmed static trace; corrected, execution pending + +**New filtered nested-scan assertion fails on native Windows.** + +Initial reviewed location: `src/storage/locks.rs:2128–2155`, especially the `directories_only` branch at 2141–2142 and expected-directory assertion at 2150–2151. + +The fixture now creates 160 directories plus `regular-payload`. The test calls `visit_directories` and asserts that the outer results contain only directories. Windows `visit_entries_filtered` deliberately ignores `directories_only` (initial line 2764) and uses `FileNamesInformation`, passing every nondot name to the callback (2841–2843). The API documents these as advisory hints (2600–2601), not a cross-platform exact filter. Therefore the Windows outer set necessarily also includes `regular-payload`, causing a deterministic test/CI failure despite unchanged Windows production behavior. The old three-file test used only `visit_entries` and did not have this failure. + +Smallest remedy: preserve production behavior and verify directory hints by opening them in the test before comparing the directory-only set. Keep exact-set nested traversal checks for real directories and the unfiltered case. + +Coordinator correction inspected: callback now begins `if directories_only && root.open_directory_readonly(name).is_err() { return Ok(()); }`. This defeats the traced failure: a regular file cannot pass the existing directory-handle checks; real fixture directories still run the nested scan and are checked exactly once. Post-correction locks SHA-256: `3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c`. **Statically resolved; rerun the final macOS rooted test and native Windows test before claiming execution/qualification.** + +## Production and test review + +- `openat(retained_fd, c".", O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC)` opens a fresh file description relative to the retained actual directory, not a substituted public pathname. The fresh descriptor is immediately owned by `File::from_raw_fd`; all normal, callback-error, parse-error and identity-error exits drop it. No `dup`/`try_clone` isolation or shared-cursor `lseek` remains in the macOS branch. +- The new handle's physical identity is checked against the pin before enumeration. The native error from failed `openat` is preserved; identity mismatch is `InvalidInput`; existing callback and native traversal errors still propagate. The root itself stays borrowed/live through callbacks. +- The 4096-byte scratch/parser and borrowed-name API are unchanged. Rust borrowing requires disjoint mutable scratch for nesting; callback data cannot escape its borrow. The change does not add a heap entry catalog, public-path join or deletion authority. +- Native `open(2)`/`getattrlistbulk(2)` documentation from the installed Apple SDK confirms relative-FD resolution, fresh initial position and reopening as a valid restart mechanism. Both APIs predate the approved macOS13.3 floor (introduced 10.10). +- Rust's primary 1.77 announcement confirms C-string literals are stable from 1.77, below the declared 1.82 minimum: https://blog.rust-lang.org/2024/03/21/Rust-1.77.0/ . Other added Rust operations already exist in this file/baseline. No Rust1.82 execution was performed; current checks use 1.96. +- The multi-batch fixture is independent of incidental native batch sizes: 160 long directory names require more than 4096 bytes, and exact sorted vectors detect omissions and duplicates in both outer and inner visits. The supplied baseline-fail evidence shows the test detects the old cursor bug rather than merely passing both versions. +- The new interrupted-callback/retry test returns `Interrupted` after exactly one callback, replaces the public root name, then repeats complete scans of the original pinned object and checks a foreign replacement sentinel. It tests restart/pin behavior, not arbitrary OS-call preemption or mutation authority. +- Windows and Linux production branches are unchanged. The initial Windows test defect is isolated to new expectations, not a new production enumeration contract. Linux is outside this approved platform scope. +- Existing receipt-selection source reaches nested scans of the same registry in `prepare_terminal_output` → `workspace_has_child_receipts` (maintenance candidate lines 2717–2822, 2651–2697). These calls use separate fixed buffers and preserve conservative veto behavior. The required actual receipt regression is still pending and must be reviewed separately before final acceptance. + +## Evidence examined (coordinator runs, not independently rerun) + +- `regression-baseline.log` / `.junit.xml`: two new cases, one passes and the nested exact-set case fails against old production source. +- `fixed-rooted-tests.log`: 14/14 pass on macOS before the Windows-test correction and pending receipt integration. +- `storage-foundation-full.log` / `.junit.xml`: 267/267 pass, one ignored/skipped, before the final pending changes. +- `clippy-fixed.log`: successful strict workspace/all-target/all-feature command as supplied by coordinator; the short log alone does not encode flags. +- `baseline-provenance.json`: macOS26.6.2 build25G83 ARM64, Rust1.96, cached lbug archive hash and target dir recorded. This is local evidence, not minimum-macOS or Windows support qualification. +- `storage-maintenance-full.log` is still in progress; no full-suite passing claim is made. + +## Remaining gates / limitations + +1. Integrate and inspect the actual multi-batch production receipt-selection regression, including later-eligible selection, child-parent protection and cancellation behavior; bind its executed result to final source hashes. +2. Recheck final integrated hashes/diff and the Windows correction; rerun affected checks after the last source/test edit. +3. Execute required native Windows nested traversal/storage checks. Static resolution and macOS passes do not satisfy A02's Windows gate. +4. Rust1.82 and minimum-macOS13.3 were not executed here; do not imply platform/consumer qualification from API-age/static compatibility analysis. +5. Keep unavailable isolated Scryer/Linear reconciliation honest. No older-root model state or root test report was used as exact worktree proof. + +No additional conditional product defect survived the scoped review. No builds, source edits, Git operations or external mutations were performed by this reviewer. Only this requested evidence report was written. Reusable-knowledge assessment: no new durable repository memory is warranted from this bounded initial review; transient finding/gate state belongs in this report and delivery evidence. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/format-final-frozen.log b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/format-final-frozen.log new file mode 100644 index 00000000..e69de29b diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/case-records.txt b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/case-records.txt new file mode 100644 index 00000000..2f6ce434 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/case-records.txt @@ -0,0 +1,31 @@ +job=122007920956 line=892 native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1) UNKNOWN STEP 2026-10-27T04:37:38.0004485Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok +job=122007921364 line=1077 native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2) UNKNOWN STEP 2026-10-27T04:39:36.6026999Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok +job=122007921553 line=1242 native (macos-arm64) / native tests (macos-arm64, unit) UNKNOWN STEP 2026-10-27T04:32:26.2595620Z test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok +job=122007921553 line=1245 native (macos-arm64) / native tests (macos-arm64, unit) UNKNOWN STEP 2026-10-27T04:32:26.4023460Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok +job=122007921553 line=1316 native (macos-arm64) / native tests (macos-arm64, unit) UNKNOWN STEP 2026-10-27T04:33:31.6553580Z test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... ok + +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:42:36.1503191Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:42:36.1503616Z Running tests\copy_phase_process.rs (target\native-tests\deps\copy_phase_process-cda64781e6ef47db.exe) +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:42:36.1504159Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:42:36.1504260Z running 1 test +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5429055Z test bounded_production_chunks_reopen_with_primary_keys_connectors_and_search ... chunked native build resources: {"database_write":191893504,"parse":23124171,"search_index":1048568,"staging":2053466} +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5429935Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5430458Z thread 'bounded_production_chunks_reopen_with_primary_keys_connectors_and_search' (2604) panicked at tests\copy_phase_process.rs:417:5: +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5431176Z assertion `left == right` failed +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5431472Z left: 55 +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5431720Z right: 56 +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5432087Z note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5432543Z FAILED +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5432663Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5432780Z failures: +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5432930Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5433020Z failures: +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5433390Z bounded_production_chunks_reopen_with_primary_keys_connectors_and_search +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5433760Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5434080Z test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2 filtered out; finished in 27.38s +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5434498Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5447023Z error: test failed, to rerun pass `-p codebase-graph --test copy_phase_process` +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5448048Z Running tests\http_admission_process.rs (target\native-tests\deps\http_admission_process-8d922bafc1a44710.exe) +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5448886Z +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5449085Z running 0 tests +native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3) UNKNOWN STEP 2026-10-27T04:43:03.5449313Z diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/provenance.json b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/provenance.json new file mode 100644 index 00000000..84505d5d --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/provenance.json @@ -0,0 +1,511 @@ +{ + "retrieval_method": "gh run view --repo rabii-chaarani/codebaseGraph --job --log", + "job_log_hashes": { + "122007920956": "b4b8dfc7e1d186f8b602d97b7afc5733b6f21fff7202f6efed8b82532f69f5cd", + "122007921094": "f954338dd0a2508d2e05459168c80b8cf7e3be7b7af6c2d53cc415cb734a1517", + "122007921364": "87a127783fec7f8d4c9b1284dd15ebe4e79142b24cd4fa4e9c9ffbd7f56e8174", + "122007921553": "01cfb9c7fa75108e16df2f50bc20846ca6d06df976e86d83d5cd9073145bcefc", + "122007921569": "fb85a85a0c505fabfd68c20f58f53342e63119e9c287bce3002782f73ec4d401", + "122007921021": "6a81cdeeda7a9f2750a0558ec21c25a45fb2a0b22112e0b1b8ec0d3ef6aa1c53" + }, + "source_records": [ + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)", + "job_id": 122007920956, + "records": [ + { + "line": 36, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:21:29.8930800Z source-sha: f633445077d1c81888eb44f7a496927f54289ad7" + }, + { + "line": 129, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:21:35.7643199Z HEAD is now at f633445 Merge d2a442faaf4ca59dc5fe33f082b2072f49b97aa5 into 7038e66ff8271ffddc511f879cf8d28353a09b2d" + }, + { + "line": 892, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:37:38.0004485Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "line": 2883, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:51:37.6611892Z test result: ok. 47 passed; 0 failed; 0 ignored; 0 measured; 780 filtered out; finished in 839.92s" + }, + { + "line": 2889, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:51:37.6925365Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s" + }, + { + "line": 3033, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:52:57.5126099Z test result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 738 filtered out; finished in 78.93s" + }, + { + "line": 3039, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:52:57.5439263Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 3047, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:52:57.5595897Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 0.00s" + }, + { + "line": 3053, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:52:57.5750552Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 3059, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:52:57.5752080Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 32 filtered out; finished in 0.00s" + }, + { + "line": 5290, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:17.4443280Z test result: ok. 77 passed; 0 failed; 1 ignored; 0 measured; 749 filtered out; finished in 679.03s" + }, + { + "line": 5296, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:17.4757095Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 5302, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:17.4911540Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s" + }, + { + "line": 5308, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:17.5067519Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 5317, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:17.5071061Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 29 filtered out; finished in 0.01s" + }, + { + "line": 5398, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:22.2643423Z test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 787 filtered out; finished in 3.85s" + }, + { + "line": 5404, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:22.2647055Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 5410, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:22.2795367Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s" + }, + { + "line": 5416, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:22.2951960Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 5428, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:22.3111629Z test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 26 filtered out; finished in 0.02s" + }, + { + "line": 5456, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T05:04:25.6008323Z SHA256 digest of uploaded artifact is 3e9b536247e18d84334d9221698b990ca34e48cdc2987e856c7d6ca72574db91" + } + ] + }, + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)", + "job_id": 122007921094, + "records": [ + { + "line": 36, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:21:28.8791415Z source-sha: f633445077d1c81888eb44f7a496927f54289ad7" + }, + { + "line": 129, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:21:34.6359951Z HEAD is now at f633445 Merge d2a442faaf4ca59dc5fe33f082b2072f49b97aa5 into 7038e66ff8271ffddc511f879cf8d28353a09b2d" + }, + { + "line": 983, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:39:05.7873498Z test result: ok. 90 passed; 0 failed; 0 ignored; 0 measured; 737 filtered out; finished in 61.08s" + }, + { + "line": 989, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:39:05.8024791Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 996, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:39:05.8337665Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.01s" + }, + { + "line": 1002, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:39:05.8491996Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1008, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T04:39:05.8493865Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 32 filtered out; finished in 0.00s" + }, + { + "line": 10051, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:28.2870480Z test result: ok. 78 passed; 0 failed; 1 ignored; 0 measured; 748 filtered out; finished in 2361.53s" + }, + { + "line": 10057, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:28.3183064Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 10065, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:28.3337784Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 0.00s" + }, + { + "line": 10071, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:28.3493392Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 10079, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:28.3496737Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 30 filtered out; finished in 0.00s" + }, + { + "line": 10141, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:31.2000862Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 826 filtered out; finished in 0.00s" + }, + { + "line": 10161, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:31.6994672Z test result: ok. 37 passed; 0 failed; 0 ignored; 0 measured; 790 filtered out; finished in 2.42s" + }, + { + "line": 10167, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:31.7149271Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 10173, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:31.7303837Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s" + }, + { + "line": 10179, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:31.7488886Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 10191, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:31.7618259Z test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 26 filtered out; finished in 0.02s" + }, + { + "line": 10219, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)\tUNKNOWN STEP\t2026-10-27T05:18:34.4846141Z SHA256 digest of uploaded artifact is b230998b7b87f39287c7988cf1a61d92b5fbaad619b174d4fb3903c1ba64c473" + } + ] + }, + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)", + "job_id": 122007921364, + "records": [ + { + "line": 36, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:21:28.8657209Z source-sha: f633445077d1c81888eb44f7a496927f54289ad7" + }, + { + "line": 129, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:21:34.4320085Z HEAD is now at f633445 Merge d2a442faaf4ca59dc5fe33f082b2072f49b97aa5 into 7038e66ff8271ffddc511f879cf8d28353a09b2d" + }, + { + "line": 979, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:34.9856266Z test result: ok. 92 passed; 0 failed; 0 ignored; 0 measured; 735 filtered out; finished in 84.05s" + }, + { + "line": 985, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:35.0166649Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 992, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:35.0170117Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.00s" + }, + { + "line": 998, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:35.0323875Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1004, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:35.0490580Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 32 filtered out; finished in 0.00s" + }, + { + "line": 1077, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:36.6026999Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "line": 1225, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:24.4059373Z test result: ok. 79 passed; 0 failed; 0 ignored; 0 measured; 748 filtered out; finished in 228.41s" + }, + { + "line": 1231, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:24.4371259Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1239, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:24.4548962Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 8 filtered out; finished in 0.00s" + }, + { + "line": 1245, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:24.4684238Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1252, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:24.4688318Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 31 filtered out; finished in 0.00s" + }, + { + "line": 1336, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:29.4749415Z test result: ok. 37 passed; 0 failed; 0 ignored; 0 measured; 790 filtered out; finished in 4.07s" + }, + { + "line": 1342, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:29.4902257Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1348, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:29.4903901Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s" + }, + { + "line": 1354, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:29.5060025Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1365, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:29.5218340Z test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 27 filtered out; finished in 0.01s" + }, + { + "line": 1393, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:43:32.1572273Z SHA256 digest of uploaded artifact is 6e4af62c87755b6a6af8a65239f7dafe2a49dcdc87daaf842a6989d2d4e99d44" + } + ] + }, + { + "job": "native (macos-arm64) / native tests (macos-arm64, unit)", + "job_id": 122007921553, + "records": [ + { + "line": 36, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:22:32.8480470Z source-sha: f633445077d1c81888eb44f7a496927f54289ad7" + }, + { + "line": 126, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:22:35.2453250Z HEAD is now at f633445 Merge d2a442faaf4ca59dc5fe33f082b2072f49b97aa5 into 7038e66ff8271ffddc511f879cf8d28353a09b2d" + }, + { + "line": 1242, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:32:26.2595620Z test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok" + }, + { + "line": 1245, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:32:26.4023460Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "line": 1316, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:33:31.6553580Z test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... ok" + }, + { + "line": 1624, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:04.8967650Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s" + }, + { + "line": 1715, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:07.2752670Z test result: ok. 843 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 1730.76s" + }, + { + "line": 1721, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:07.3398700Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1737, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:07.3935250Z test result: ok. 10 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s" + }, + { + "line": 1743, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:07.4134780Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 1792, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:08.4685720Z test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.04s" + }, + { + "line": 1819, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:57:12.4810700Z SHA256 digest of uploaded artifact is d8d1fd1d5a481a2f230bc5d31766f35858130225806d9d42f3535c27581990b7" + } + ] + }, + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)", + "job_id": 122007921569, + "records": [ + { + "line": 36, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:21:28.8965983Z source-sha: f633445077d1c81888eb44f7a496927f54289ad7" + }, + { + "line": 129, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:21:34.4729373Z HEAD is now at f633445 Merge d2a442faaf4ca59dc5fe33f082b2072f49b97aa5 into 7038e66ff8271ffddc511f879cf8d28353a09b2d" + }, + { + "line": 966, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:38:52.8574969Z test result: ok. 89 passed; 0 failed; 0 ignored; 0 measured; 738 filtered out; finished in 63.24s" + }, + { + "line": 972, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:38:52.8892111Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 979, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:38:52.9045822Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.01s" + }, + { + "line": 985, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:38:52.9200975Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 991, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:38:52.9203829Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 32 filtered out; finished in 0.00s" + }, + { + "line": 2309, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:27.3476174Z test result: ok. 77 passed; 0 failed; 0 ignored; 0 measured; 750 filtered out; finished in 693.52s" + }, + { + "line": 2315, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:27.3786880Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 2322, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:27.3788969Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.00s" + }, + { + "line": 2328, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:27.3943784Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 2337, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:27.4105016Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 29 filtered out; finished in 0.00s" + }, + { + "line": 2429, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:31.7897995Z test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured; 787 filtered out; finished in 3.45s" + }, + { + "line": 2435, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:31.8054280Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 2441, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:31.8207882Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s" + }, + { + "line": 2447, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:31.8210997Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + }, + { + "line": 2460, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:31.8522334Z test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 26 filtered out; finished in 0.02s" + }, + { + "line": 2488, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)\tUNKNOWN STEP\t2026-10-27T04:50:34.4772044Z SHA256 digest of uploaded artifact is 0c6ea10364809e9301298bf82e94a96e7f7f8ab823a6ccba2a4c183d7e9c0761" + } + ] + }, + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)", + "job_id": 122007921021, + "records": [ + { + "line": 36, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:21:29.7373128Z source-sha: f633445077d1c81888eb44f7a496927f54289ad7" + }, + { + "line": 129, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:21:35.4102508Z HEAD is now at f633445 Merge d2a442faaf4ca59dc5fe33f082b2072f49b97aa5 into 7038e66ff8271ffddc511f879cf8d28353a09b2d" + }, + { + "line": 862, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:40:57.5337213Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.02s" + }, + { + "line": 870, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:42:35.5355860Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 98.01s" + }, + { + "line": 878, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:42:36.1502748Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.59s" + }, + { + "line": 904, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:43:03.5449774Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s" + }, + { + "line": 910, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:43:03.5584934Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.00s" + }, + { + "line": 916, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:43:03.5588130Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s" + }, + { + "line": 928, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:48:33.9811856Z test result: ok. 6 passed; 0 failed; 0 ignored; 0 measured; 17 filtered out; finished in 330.42s" + }, + { + "line": 959, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:48:34.8878250Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "line": 1007, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:48:37.9677368Z test result: ok. 64 passed; 0 failed; 0 ignored; 0 measured; 192 filtered out; finished in 3.97s" + }, + { + "line": 1036, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:01.0965534Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 143.13s" + }, + { + "line": 1078, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.5839102Z test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 20 filtered out; finished in 0.27s" + }, + { + "line": 1088, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.5997525Z test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.01s" + }, + { + "line": 1097, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.6305861Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.00s" + }, + { + "line": 1104, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.6310286Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 4 filtered out; finished in 0.00s" + }, + { + "line": 1111, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.6463252Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.00s" + }, + { + "line": 1120, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.7712436Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.12s" + }, + { + "line": 1128, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8025130Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.02s" + }, + { + "line": 1136, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8336412Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.01s" + }, + { + "line": 1143, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8494740Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.00s" + }, + { + "line": 1150, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8650443Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 7 filtered out; finished in 0.00s" + }, + { + "line": 1157, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8806370Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 5 filtered out; finished in 0.00s" + }, + { + "line": 1165, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8809584Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 3 filtered out; finished in 0.00s" + }, + { + "line": 1173, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:02.8964493Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.00s" + }, + { + "line": 1204, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:51:06.3578199Z SHA256 digest of uploaded artifact is 5ca88605f65eebbb3e94acf4be21a08b7880443fd896783e831922ef15dde32c" + } + ] + } + ], + "head": "d2a442faaf4ca59dc5fe33f082b2072f49b97aa5", + "tested_merge": "f633445077d1c81888eb44f7a496927f54289ad7" +} diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/review-addendum.md b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/review-addendum.md new file mode 100644 index 00000000..78a13220 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/review-addendum.md @@ -0,0 +1,52 @@ +# COD-52 / PR157 — hosted verification review addendum + +## Outcome + +**The COD-52 regression cases pass on hosted macOS and Windows. The overall required run still fails.** The blocker is a different, unchanged Windows COPY process-test assertion:56 COPY trace records contain55 distinct numeric PIDs. This establishes duplicate numeric PID values in the trace, **not** a confirmed process-reuse, COPY/data-integrity or cursor-isolation defect. No new P0–P3 defect in the reviewed COD-52 diff is established by this failure. + +Do not mark CI, Windows artifact qualification or COD-52 closure green. The local1110-test run remains in progress per coordinator; no full local pass is claimed here. + +## Reviewer / revision / method + +- Continuation of the fresh GPT-6.1 Sol Max read-only adversarial final review; actual execution settings were attested by the coordinator (`openai-codex/gpt-6.1-sol`, `thinking="max"`). Same required skill and source-review scope apply. +- PR157 head: `d2a442faaf4ca59dc5fe33f082b2072f49b97aa5`; baseline: `7038e66ff8271ffddc511f879cf8d28353a09b2d`. +- Hosted run: [40449278177](https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177), actual tested synthetic merge `f633445077d1c81888eb44f7a496927f54289ad7`. Coordinator evidence reports an empty head-versus-merge tree diff; this reviewer did not run Git. +- Independently reread frozen source hashes: locks `3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c`; candidate `8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765`. They match the reviewed frozen snapshot. +- Examined `hosted-ci-summary-final.json`, `hosted-case-records.txt`, and the bounded failed-job source log `windows-integration-failed.log`. Read graph-discovered `tests/copy_phase_process.rs` to establish the precise assertion and which checks precede/follow it. Recalled relevant repository memory only as advisory context. +- No builds, source edits, Git operations, CI reruns, external mutations, timeout increases or assertion changes were performed. Only this requested report was written. + +## Actual hosted results + +- Native Windows `nested_directory_scans_do_not_consume_the_outer_cursor` has explicit `... ok` records in unit shard1 job122007920956 (line892), unit shard2 job122007921364 (line1077), and even the otherwise-failing integration shard3 job122007921021 (line959). **F1 is now verified on native Windows**, not merely statically resolved. +- Native macOS unit job122007921553 explicitly passes the nested scan, interrupted/replaced-root retry and production receipt-selection regression (records1242/1245/1316). The job concludes success. Coordinator reports the complete macOS unit cohort as843 passed,2 ignored; that total is supplied by the coordinator rather than present in the narrow case extracts reviewed here. +- macOS generation/integration/artifact jobs succeed. All Windows unit/generation jobs and integration shards1/2/4 succeed. Integration shard3 fails as below. +- Run conclusion **failure**; `required` job122024829779 **failure**; Windows artifact job122024830234 **skipped**, not passing. Other green jobs do not override those outcomes. + +## Confirmed failure — numeric-PID uniqueness assertion + +Failure: `bounded_production_chunks_reopen_with_primary_keys_connectors_and_search`, `tests/copy_phase_process.rs:417–424`, Windows integration shard3 ([job122007921021](https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921021)). + +Source trace: + +1. Build a real isolated Direct graph with1400 functions, spill setting1MiB and debug trace output (lines338–355). +2. Filter trace records to `phase_kind == "copy"` (356–359). +3. Verify per-phase thread count, chunk sizes/paths, repeated node-table rotations, early primary-key-index ordering and no index phases after connectors (360–416). +4. Compare the cardinality of the set of `event["pid"].as_u64()` against COPY-event count (417–424). + +Hosted log885–888 shows the assertion's **left55, right56**, after `assert_success(&built)` and preceding chunk/order checks. Therefore at least two COPY records share a numeric PID. The failure is not a native COPY error response, missing table, connector mismatch, search failure or directory-traversal assertion. + +**Important execution boundary:** database reopen,1400-function/key lookup checks, connector equality, search and clean-control comparison occur only after line426 and were not reached in this failed Windows case. A successful build and earlier trace checks do not establish those downstream checks passed. + +The coordinator verified empty baseline diffs for this test, `src/db_writer/phase.rs` and the staging renderer; the reviewed COD-52 source patch changes only the macOS production traversal plus rooted tests and macOS-only receipt-test code. Windows product traversal/COPY/staging behavior is unchanged. This failure is outside the approved R01/S01 cursor-isolation implementation path. No causal link from the COD-52 code change to duplicate PID records is established; calling it an introduced COD-52 regression would exceed the evidence. Conversely, unchanged source alone is not proof that a test can be ignored. + +## Cause status — separate fact from hypothesis + +- **Confirmed:**56 COPY records;55 distinct numeric PID values; failure at the unchanged cardinality assertion. The specific repeated value and per-record process-lifetime identities are not in the supplied extracts. +- **Plausible/likely, not proved:** normal Windows reuse of a numeric PID after a previous phase process terminated. Microsoft's primary documentation states a process identifier is valid from creation until termination; it does not promise a globally unique identifier across successive process lifetimes: https://learn.microsoft.com/en-us/windows/win32/procthread/process-handles-and-identifiers . The test compares historical numeric values, so its oracle is stronger than that lifetime guarantee. +- **Not established:** whether the observed pair represents two separate process incarnations, duplicate trace emission, actual process reuse, or another instrumentation/control-flow cause. Full trace records and process-instance/launch evidence are required to decide. Do not label PID reuse as proven, and do not claim data integrity failed or passed from this assertion. + +## Safe next decision + +Keep the required-CI blocker explicit and obtain separate authorization before changing the unrelated process-test/trace contract. Preserve the failing run and, if available, its `phases.jsonl` plus launch/process-creation identity evidence for a narrow follow-up. A future fix should verify actual per-phase isolation using process incarnations/launch evidence rather than simply relaxing/removing the assertion, adding retries or widening a timeout; the exact remedy depends on that follow-up's proven cause and approved scope. + +The COD-52 source/test review remains satisfied for the recorded frozen snapshot, and named Windows nested-scan execution is no longer pending. Aggregate verification/qualification and maintainer closure remain blocked by the failed required run and unfinished local full evidence. No new durable memory is recorded: this is transient delivery evidence with an unresolved failure cause. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/summary.json b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/summary.json new file mode 100644 index 00000000..c010a2d3 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/hosted-run-40449278177/summary.json @@ -0,0 +1,214 @@ +{ + "run": { + "databaseId": 40449278177, + "status": "completed", + "conclusion": "failure", + "headSha": "d2a442faaf4ca59dc5fe33f082b2072f49b97aa5", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177" + }, + "actual_tested_merge": "f633445077d1c81888eb44f7a496927f54289ad7", + "base": "7038e66ff8271ffddc511f879cf8d28353a09b2d", + "head_vs_merge_tree_diff": "empty, git diff --stat executed", + "jobs": [ + { + "name": "cargo audit", + "id": 122007920803, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007920803" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, generation, shard 3)", + "id": 122007920955, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007920955" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)", + "id": 122007920956, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007920956" + }, + { + "name": "native (macos-arm64) / native tests (macos-arm64, generation)", + "id": 122007920981, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007920981" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)", + "id": 122007921021, + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921021" + }, + { + "name": "cargo publish dry-run", + "id": 122007921044, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921044" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, generation, shard 4)", + "id": 122007921046, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921046" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 2)", + "id": 122007921054, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921054" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 1)", + "id": 122007921069, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921069" + }, + { + "name": "cargo clippy", + "id": 122007921085, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921085" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 3)", + "id": 122007921094, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921094" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 4)", + "id": 122007921291, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921291" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)", + "id": 122007921364, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921364" + }, + { + "name": "native (macos-arm64) / native tests (macos-arm64, integration)", + "id": 122007921367, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921367" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, generation, shard 2)", + "id": 122007921416, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921416" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, generation, shard 1)", + "id": 122007921485, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921485" + }, + { + "name": "native (macos-arm64) / native tests (macos-arm64, unit)", + "id": 122007921553, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921553" + }, + { + "name": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 4)", + "id": 122007921569, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007921569" + }, + { + "name": "cargo fmt", + "id": 122007922020, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122007922020" + }, + { + "name": "native (macos-arm64) / native artifact (macos-arm64)", + "id": 122022637472, + "status": "completed", + "conclusion": "success", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122022637472" + }, + { + "name": "required", + "id": 122024829779, + "status": "completed", + "conclusion": "failure", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122024829779" + }, + { + "name": "native (windows-x86_64) / native artifact (${{ inputs.target }})", + "id": 122024830234, + "status": "completed", + "conclusion": "skipped", + "url": "https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177/job/122024830234" + } + ], + "new_case_actual_passes": [ + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)", + "id": 122007920956, + "line": 892, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 1)\tUNKNOWN STEP\t2026-10-27T04:37:38.0004485Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "job": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)", + "id": 122007921364, + "line": 1077, + "record": "native (windows-x86_64) / native tests (windows-x86_64, unit, shard 2)\tUNKNOWN STEP\t2026-10-27T04:39:36.6026999Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "job": "native (macos-arm64) / native tests (macos-arm64, unit)", + "id": 122007921553, + "line": 1242, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:32:26.2595620Z test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok" + }, + { + "job": "native (macos-arm64) / native tests (macos-arm64, unit)", + "id": 122007921553, + "line": 1245, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:32:26.4023460Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + { + "job": "native (macos-arm64) / native tests (macos-arm64, unit)", + "id": 122007921553, + "line": 1316, + "record": "native (macos-arm64) / native tests (macos-arm64, unit)\tUNKNOWN STEP\t2026-10-27T04:33:31.6553580Z test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... ok" + } + ], + "blocking_failure": { + "name": "bounded_production_chunks_reopen_with_primary_keys_connectors_and_search", + "path": "tests/copy_phase_process.rs", + "line": 417, + "observed_unique_pids": 55, + "copy_event_count": 56, + "source_unchanged_from_baseline": true, + "cause_status": "duplicate_numeric_PID established by source/assertion; PID reuse likely, not a confirmed COPY/data regression" + }, + "windows_nested_scan_pass_in_failed_job": { + "line": 959, + "record": "native (windows-x86_64) / native tests (windows-x86_64, integration, shard 3)\tUNKNOWN STEP\t2026-10-27T04:48:34.8878250Z test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok" + }, + "aggregate_limit": "overall run failed; required failed; Windows artifact skipped, not passing" +} diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/integrated-final-regressions.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/integrated-final-regressions.junit.xml new file mode 100644 index 00000000..41699ef3 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/integrated-final-regressions.junit.xml @@ -0,0 +1,155 @@ + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 0.17s + + + + + + +running 1 test +test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 844 filtered out; finished in 7.09s + + + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/integrated-final-regressions.log b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/integrated-final-regressions.log new file mode 100644 index 00000000..a379bded --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/integrated-final-regressions.log @@ -0,0 +1,22 @@ + Compiling codebase-graph v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans) + Finished `test` profile [unoptimized + debuginfo] target(s) in 7.22s +──────────── + Nextest run ID ae273b56-e60b-45af-8b20-47aabd40b613 with nextest profile: cod52 + Starting 15 tests across 1 binary (830 tests skipped) + PASS [ 0.032s] ( 1/15) codebase-graph storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases + PASS [ 0.025s] ( 2/15) codebase-graph storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases + PASS [ 0.019s] ( 3/15) codebase-graph storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file + PASS [ 0.026s] ( 4/15) codebase-graph storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag + PASS [ 0.018s] ( 5/15) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 + PASS [ 0.018s] ( 6/15) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity + PASS [ 0.028s] ( 7/15) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries + PASS [ 0.018s] ( 8/15) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls + PASS [ 0.017s] ( 9/15) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution + PASS [ 0.017s] (10/15) codebase-graph storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission + PASS [ 0.035s] (11/15) codebase-graph storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement + PASS [ 0.017s] (12/15) codebase-graph storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity + PASS [ 0.021s] (13/15) codebase-graph storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor + PASS [ 0.189s] (14/15) codebase-graph storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor + PASS [ 7.111s] (15/15) codebase-graph storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto +──────────── + Summary [ 7.590s] 15 tests run: 15 passed, 830 skipped diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/library-rooted.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/library-rooted.junit.xml new file mode 100644 index 00000000..25623216 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/library-rooted.junit.xml @@ -0,0 +1,145 @@ + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 843 filtered out; finished in 0.21s + + + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/proposal-review.md b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/proposal-review.md new file mode 100644 index 00000000..805463d6 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/proposal-review.md @@ -0,0 +1,37 @@ +# COD-52 / CBG-PLAT-01 S01 — proposal review + +## Recommendation: GREEN — proceed with the bounded implementation + +No decision-blocking or material defect was found in the proposed production change. This is approval of the approach for implementation review, **not passing acceptance, native qualification, release approval or aggregate closure**. + +Reviewer: fresh read-only session; GPT-6.1 Sol, High reasoning effort (launch settings supplied by the coordinator). Skill: `adversarial-proposal-review-engineer`. Baseline supplied: `7038e66ff8271ffddc511f879cf8d28353a09b2d`. No implementation edits, builds, tests, Git operations or external record writes were performed. Only this report was written. + +## Authority and evidence inspected + +- Approved spec revision 0.10, R01 / A01–A02 / S01, supplied as `approved-spec.md`; exact-scope approval `docs/specs/CBG-PLAT-01/approvals/cod52-macos-nested-scans.md` pins spec SHA `1a9db7b558b60248888408daa6268a3b45f2f0df` and records the user's “approved” response for COD-52 only. +- Coordinator's target-scoped `graph-discovery.txt`: both source files discovered; explicit change-impact context for `visit_entries`. The configured root graph/model is not SHA-bound evidence for the detached worktree. +- Scryer read-only `orient`, binding rules and Graph Store `node-88`: existing resp-232/233 apply; no changed claim or new topology is needed for restoring enumeration correctness. Broader model drift/pending resp-274 is outside this fix and does not grant additional scope. +- Wiki memory recall and canonical `architecture/graph-disk-cleanup-contract`. The recalled canonical-temp-parent fixture warning is relevant to genuine workspace-origin tests; it does not authorize weakening ownership checks. +- Worktree `src/storage/locks.rs` and `src/storage/maintenance_candidate.rs` after graph discovery. +- Apple SDK primary documentation: `/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/share/man/man2/open.2` (also referenced by `openat.2`), DESCRIPTION/HISTORY; `getattrlistbulk.2`, DESCRIPTION/RETURN VALUES. `openat` resolves a relative name against the retained directory FD; a successful open begins at offset zero; `getattrlistbulk` state is associated with its input descriptor and may be restarted by reopening. `openat` predates the approved macOS 13.3 minimum. These establish API suitability, not runtime qualification. + +## Why the minimal fix is sound + +The current macOS implementation seeks and enumerates `self.directory` (`locks.rs:2541–2559`). A callback that scans the same RootedDirectory resets and consumes that same cursor. The outer scratch still contains its first batch, but its next native query sees the cursor advanced by the inner scan. This matches the supplied multi-batch failure description. + +Opening the literal NUL-terminated `.` relative to the retained FD with `O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC` obtains an independent open file description without using a public pathname or `dup`/`try_clone`. Adopt the successful FD into `File` immediately, compare `file_identity(&directory)` to `self.identity` using the existing native-I/O conversion, and call `getattrlistbulk` on that local File. Remove the shared-FD seek. RAII closes the descriptor on identity failure, callback interruption, native/parser error and success. No shared helper, new trait or public contract is justified. + +This preserves the pinned namespace authority (`locks.rs:1299–1305`) even if its public name is renamed/replaced. Literal `.` is an internal trusted operation; do not relax the existing child-name validator, which intentionally rejects `.` (`locks.rs:1438–1446`). Identity/open failures must return errors, not fall back to the public root or another cursor mechanism. The extra FD is held only for the active scan, not per returned entry; existing bounded maintenance and fixed scratch remain intact. Windows already obtains a distinct directory file object (`locks.rs:2688–2692`) and should remain unchanged. Linux is explicitly outside S01. + +## Test conditions to preserve during implementation + +These are concrete verification requirements, not established defects in an unwritten test patch. + +1. **A01 must cross a native batch and detect duplicates.** Broaden the existing Windows-only nested test (`locks.rs:2103–2125`) to macOS+Windows. Use e.g. 200+ entries with unchanged 4096-byte scratch; the current macOS parser admits no record shorter than 32 bytes, so that exceeds any single accepted batch without assuming the incidental 85 count. Compare sorted vectors against the independently generated expected vector for the outer and inner scans; counts or sets alone miss duplicate/substitution failures. Repeated scans and an inner callback returning `Interrupted`, followed by a complete scan, are proportionate checks for local cursor lifetime. The existing filtered-directory test already verifies repeated hints (`locks.rs:2219–2255`); extend or reuse it rather than duplicate a framework. +2. **A02 must reach the nested production path.** `prepare_terminal_output` scans files first and stops before the directory pass if it selects a file (`maintenance_candidate.rs:2717,2752,2824–2825`). A fixture with many ordinary selectable file receipts can pass without exercising `workspace_has_child_receipts` at all. Arrange genuine receipts so directory selection actually runs, an early parent is vetoed by a child receipt, and a later eligible directory receipt is observed across batches. Receipt hashes/native order must not be presumed lexicographically ordered: Apple's documented order is unspecified. An old-source failure/new-source pass is strong evidence that the test reaches this bug rather than only checking eventual cleanup. A direct helper regression alone is not the specified actual selection regression. +3. **Preserve authority, not just progress.** The child check is a conservative receipt veto even if the child payload has gone (`maintenance_candidate.rs:2688–2691,2780–2793`). Verify the parent remains protected while that child receipt exists. Create receipts through existing genuine origin/nonce fixtures, with a canonical temporary parent on macOS, and assert registration succeeded. Do not manufacture weaker production admission or add hooks to force selection. A retained-anchor rename plus foreign public replacement test is proportionate proof against accidental pathname reopen; compare original/foreign contents and perform no deletion through an observed name alone. +4. **Honest qualification.** Run native macOS regressions and the affected storage radius; retain Windows nested-scan execution as pending until native Windows evidence exists. Source cfg inspection or macOS compilation cannot satisfy that Windows gate. No supported-platform expansion or minimum/current consumer qualification is established by these tests. + +## Limits and reusable knowledge assessment + +This is a source/API feasibility review of a small repair, not an executed behavior review. The eventual diff and actual receipt fixture still require final review. The report assumes the coordinator's supplied baseline/approval provenance and graph-discovery evidence are accurate; no Git commands were used to independently reverify them. No constants were changed. Existing fixed scratch stays 4096; suggested fixture counts are test data, not production policy. Reusable knowledge was assessed: no new repository memory is warranted before executed evidence; the canonical-temp-parent warning already exists in active memory. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-final-old-production.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-final-old-production.junit.xml new file mode 100644 index 00000000..089c281e --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-final-old-production.junit.xml @@ -0,0 +1,27 @@ + + + + + thread 'storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto' (34455936) panicked at src/storage/maintenance_candidate.rs:2237:14: +selection must continue after the parent receipt is vetoed +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +running 1 test +test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... FAILED + +failures: + +failures: + storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 844 filtered out; finished in 4.70s + + + +thread 'storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto' (34455936) panicked at src/storage/maintenance_candidate.rs:2237:14: +selection must continue after the parent receipt is vetoed +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-final-old-production.log b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-final-old-production.log new file mode 100644 index 00000000..806fe0e0 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-final-old-production.log @@ -0,0 +1,29 @@ + Compiling codebase-graph v4.0.0 (/private/tmp/codebasegraph-cod52-macos-scans) + Finished `test` profile [unoptimized + debuginfo] target(s) in 4.02s +──────────── + Nextest run ID d8b0323e-9a5d-4520-a9ae-e64fead090e8 with nextest profile: cod52 + Starting 1 test across 1 binary (844 tests skipped) + FAIL [ 4.725s] (1/1) codebase-graph storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto + stdout ─── + + running 1 test + test storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto ... FAILED + + failures: + + failures: + storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto + + test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 844 filtered out; finished in 4.70s + + stderr ─── + + thread 'storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto' (34455936) panicked at src/storage/maintenance_candidate.rs:2237:14: + selection must continue after the parent receipt is vetoed + note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + Cancelling due to test failure: +──────────── + Summary [ 4.727s] 1 test run: 0 passed, 1 failed, 844 skipped + FAIL [ 4.725s] (1/1) codebase-graph storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto +error: test run failed diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-integrated-description.md b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-integrated-description.md new file mode 100644 index 00000000..3f70fc09 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/receipt-integrated-description.md @@ -0,0 +1,12 @@ +# COD-52 receipt regression — integrated fixture + +The worker initially delivered a tests-only candidate fixture. The coordinator integrated and simplified it before final verification; the earlier plan/report are historical, not the final oracle. + +Final test: `storage::maintenance_candidate::tests::terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto`, macOS-only in `src/storage/maintenance_candidate.rs`. + +- A canonical temporary fresh-domain Fixture registers a bare kind-2 worker with genuine fresh-root, owner, startup and reference-mutation controls. No RunWorkspace metadata file receipts bypass directory selection. +- Create161 real directory outputs and durable bound origin receipts. Initially every output contains a fixture-owned sentinel. The lexicographically smallest receipt becomes the parent: remove its sentinel, create/record a real child directory then remove only that fixture-owned child payload, retaining the genuine child receipt. The parent is now empty but must remain vetoed by that receipt. +- The other160 directory outputs stay nonempty. Observe actual registry order and choose a filler whose index is greater than128; one exists regardless of directory ordering because160fillers cannot fit in the first129slots. Remove only that filler sentinel so it is the sole eligible directory. The parent receipt is strictly smaller, so losing the child veto would select the parent instead of the expected target. +- Terminalize through real registration, release owner/mutation, and prepare the genuine terminal workspace. Explicitly assert `workspace_has_child_receipts`. Request selector cancellation and require Interrupted with parent retained, reprepare, then call actual `prepare_terminal_output` and require the late target's exact identity/name while the parent remains. +- No production admission change, handcrafted receipt, ordering seam, deletion-authority broadening, or fixed incidental85-entry expectation. Index128 is a conservative test-only proof that records cannot fit a4096-byte buffer given the existing parser's minimum32-byte record; output counts are fixture data, not production constants. +- Native execution results bind only to the final source hashes and command/JUnit evidence in the execution report. Earlier receipt variants' passes/fails are preserved separately, not claimed as final snapshot verification. diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/regression-baseline.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/regression-baseline.junit.xml new file mode 100644 index 00000000..5c167e61 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/regression-baseline.junit.xml @@ -0,0 +1,41 @@ + + + + + +running 1 test +test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.03s + + + + + + thread 'storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor' (34412907) panicked at src/storage/./locks.rs:2148:13: +assertion `left == right` failed + left: [[100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120]] + right: [[100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [114, 101, 103, 117, 108, 97, 114, 45, 112, 97, 121, 108, 111, 97, 100]] +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +running 1 test +test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... FAILED + +failures: + +failures: + storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor + +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + +thread 'storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor' (34412907) panicked at src/storage/./locks.rs:2148:13: +assertion `left == right` failed + left: [[100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120]] + right: [[100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 48, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 49, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 50, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 51, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 52, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 53, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 54, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 55, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 56, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 48, 57, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 48, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 49, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 50, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 51, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 52, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 48, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 49, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 50, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 51, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 52, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 53, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 54, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 55, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 56, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [100, 105, 114, 101, 99, 116, 111, 114, 121, 45, 49, 53, 57, 45, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120], [114, 101, 103, 117, 108, 97, 114, 45, 112, 97, 121, 108, 111, 97, 100]] +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/rooted-postreview.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/rooted-postreview.junit.xml new file mode 100644 index 00000000..99969669 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/rooted-postreview.junit.xml @@ -0,0 +1,145 @@ + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.22s + + + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/storage-foundation-full.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/storage-foundation-full.junit.xml new file mode 100644 index 00000000..820a94a1 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/storage-foundation-full.junit.xml @@ -0,0 +1,2701 @@ + + + + + +running 1 test +test atomic_write_failure_preserves_existing_file_and_cleans_temp ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test control_lease_rejects_a_symlinked_lock_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test control_leases_are_exclusive_nonblocking_and_transfer_after_release ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test direct_committed_read_accepts_readonly_parent_with_existing_guards ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.05s + + + + + + +running 1 test +test direct_committed_read_preserves_corrupt_registration ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test direct_committed_read_preserves_missing_registration ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test direct_committed_registered_pair_reads_after_publication ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test direct_control_lock_paths_are_stable_and_destination_scoped ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test direct_phase_unknown_preserves_base_and_blocks_publish_replay_and_cleanup ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test direct_prepared_recovery_preserves_expected_sidecars_on_validation_failure ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.47s + + + + + + +running 1 test +test direct_recovery_replays_every_rename_and_checkpoint ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 15.28s + + + + + + +running 1 test +test direct_store_recovers_database_manifest_and_committed_journal_phases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.10s + + + + + + +running 1 test +test direct_store_recovers_interrupted_publication_with_sidecars_and_split_parents ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test direct_store_rejects_forged_journal_candidate_paths ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test direct_write_session_holds_writer_lock_and_drop_cleans_unpublished_candidates ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.06s + + + + + + +running 1 test +test empty_prelease_startup_is_retired_and_does_not_block_next_writer ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test error::tests::source_change_failure_has_a_stable_machine_readable_message ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test existing_lock_probe_does_not_recreate_a_vanished_workspace ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test final_containment_verification_requires_prior_retirement_without_writing ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test managed_abort_and_drop_retain_runs_while_phase_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.28s + + + + + + +running 1 test +test managed_begin_write_holds_writer_lock_and_marks_candidate_ready_explicitly ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test managed_cleanup_recovers_published_crash_after_active_pointer_write ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.22s + + + + + + +running 1 test +test managed_cleanup_recovers_publishing_crash_after_active_pointer_write ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.23s + + + + + + +running 1 test +test managed_cleanup_recovers_publishing_crash_after_generation_rename ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.24s + + + + + + +running 1 test +test managed_cleanup_recovers_publishing_crash_before_generation_rename ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.24s + + + + + + +running 1 test +test managed_cleanup_reports_and_later_removes_locked_runs ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.06s + + + + + + +running 1 test +test managed_control_lock_paths_are_stable_and_role_scoped ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test managed_last_reader_drop_triggers_best_effort_retirement_cleanup ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.30s + + + + + + +running 1 test +test managed_metadata_sizes_include_db_sidecars_and_allocated_bytes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.13s + + + + + + +running 1 test +test managed_phase_unknown_preserves_candidate_and_active_read_until_empty ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.30s + + + + + + +running 1 test +test managed_publish_reconciles_an_error_after_active_pointer_commit ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.28s + + + + + + +running 1 test +test managed_publish_rejects_a_stale_base_generation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.12s + + + + + + +running 1 test +test managed_store_rejects_untrusted_generation_ids ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test managed_writer_is_serialized_across_sessions ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test missing_lease_with_any_launch_evidence_remains_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test owned_writer_cleanup_reports_readers_and_collects_after_their_release ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.30s + + + + + + +running 1 test +test persisted_relative_barrier_survives_cleanup_from_a_different_process_cwd ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test persisted_run_barrier_survives_drop_and_blocks_generic_orphan_collection ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.09s + + + + + + +running 1 test +test phase_registry_collection_retains_unknown_siblings_then_reclaims_empty_orphans ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test phase_registry_probe_never_recreates_missing_roots_or_locks ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test private_lifecycle_receipt_accepts_ancestor_alias_but_rejects_foreign_or_symlink_roots ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.06s + + + + + + +running 1 test +test process_lifecycle::tests::accepted_nonblocking_socket_is_normalized_for_control_frames ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test process_lifecycle::tests::bounded_protocol_rejects_unterminated_control_frame ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test process_lifecycle::tests::capability_json_is_private_at_creation_and_after_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test process_lifecycle::tests::retired_startup_rejects_late_guardian_before_child_creation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test process_lifecycle::tests::slow_trickle_cannot_extend_control_frame_deadline ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.13s + + + + + + +running 1 test +test process_lifecycle::tests::workspace_without_global_state_remains_protected_by_guardian_lease ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test process_lifecycle::unix::tests::absent_proof_never_establishes_emptiness ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test process_lifecycle::unix::tests::fifo_writer_controls_empty_proof ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test process_lifecycle::unix::tests::proof_without_ready_retains_live_writers_then_allows_empty_recovery ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test process_lifecycle::unix::tests::recovery_rejects_regular_files_symlinks_and_replaced_fifo_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test process_lifecycle::unix::tests::stopped_owned_child_is_not_an_exit_and_resume_or_cancellation_still_completes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.03s + + + + + + +running 1 test +test process_rss::tests::allocator_pressure_relief_is_safe_at_phase_boundaries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test process_rss::tests::sampler_reports_current_process_memory_charge ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test relative_registry_probe_matches_absolute_private_descriptor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test run_workspace_cleanup_rejects_symlink_content ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.06s + + + + + + +running 1 test +test storage::atomic::tests::atomic_temp_paths_are_scoped_to_the_writer_process ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::containment::tests::windows_job_name_does_not_expose_or_depend_on_control_nonce ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::containment::tests::windows_job_name_rejects_malformed_build_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::bounded_detailed_inventory_retains_overdeep_state_and_reports_unknown_totals ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.03s + + + + + + +running 1 test +test storage::inventory::tests::busy_writer_is_reported_without_waiting_or_mutation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::configured_ancestor_root_is_rejected_without_scanning_sources ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::dc_s1_a1_classifies_and_counts_active_live_recovery_and_legacy ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::dc_s1_a2_missing_and_dropped_observations_do_not_create_or_repair ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + +thread 'storage::inventory::tests::dc_s1_a2_missing_and_dropped_observations_do_not_create_or_repair' (34414930) panicked at src/storage/./inventory.rs:2515:51: +interrupted observation +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + +running 1 test +test storage::inventory::tests::dc_s1_a3_constant_pointer_does_not_hide_artifact_and_run_mutations ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::dc_s1_a3_invalid_pointer_and_foreign_direct_are_retained ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::dc_s1_a3_symlinks_are_not_followed_and_sizes_are_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::dc_s1_a4_repeat_observation_is_deterministic ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::existing_live_lease_is_observed_without_recovery ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::hardlinked_direct_identity_is_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::physical_hardlinks_count_once_and_allocation_uses_filesystem_blocks ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::recognized_direct_pair_uses_repository_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_bound_external_store_survives_missing_conventional_state ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_case_alias_roots_are_rejected_without_double_counting ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::review_complete_root_reconciliation_is_insertion_order_independent ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::review_config_repository_parent_traversal_cannot_erase_symlink ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::review_config_storage_parent_traversal_cannot_erase_symlink_or_missing_component ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_configured_storage_cannot_be_overridden_with_unselected_local_root ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_current_configuration_is_revalidated_on_every_observation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_default_direct_only_is_current_graph_and_cache ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_direct_cache_inside_managed_root_is_rejected ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::review_explicit_direct_alongside_managed_is_current ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_external_config_requires_matching_repository_binding ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::review_external_current_direct_config_observes_exact_bundle_without_local_state ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_managed_config_makes_unselected_default_direct_former ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_managed_root_inside_direct_cache_is_rejected ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::inventory::tests::review_raw_config_direct_spelling_selects_matching_cache ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_real_directory_dot_parent_config_paths_remain_supported ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::inventory::tests::review_scope_rejects_source_state_and_unregistered_external_storage ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_control_scratch_uses_small_worker_frame_and_retains_reserved_path_storage ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_coordination_nonce_initializes_only_exclusive_empty_creation_and_is_immutable ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_facts_cross_threads_but_actual_authority_cannot ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_open_read_and_recheck_are_noncreating_and_bounded ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_path_free_lock_release_and_identity_composition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_rejects_in_place_change_and_new_public_incarnation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_rejects_symlinks_hardlinks_and_nonregular_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_same_length_write_with_restored_mtime_stays_changed ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::fixed_control_tests::dc_fixed_stamp_scratch_uses_shared_reservation_and_releases_it ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_directory_hints_keep_verified_directories_and_reject_file_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_blocks_inode_aba_and_rejects_aliases ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_fifo_creation_pin_never_adopts_pin_collision_or_regular_file ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_nonce_promotion_requires_the_exact_existing_creation_tag ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_component_validation_is_noncreating_and_accepts_exact_key64 ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_file_rename_is_no_replace_and_checks_exact_source_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_namespace_no_replace_and_exact_empty_removal_preserve_foreign_entries ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_nonfollowing_open_rejects_symlinks_and_hardlinked_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_operations_remain_on_actual_parent_after_public_name_substitution ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::dc_rooted_readonly_payload_access_needs_no_payload_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::metadata_validation_preserves_private_creator_sharing_and_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::namespace_flush_accepts_an_existing_readonly_directory_anchor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::locks::rooted_directory_tests::nested_directory_scans_do_not_consume_the_outer_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.19s + + + + + + +running 1 test +test storage::maintenance_admission::tests::canonical_large_registry_is_bounded_nonmutating_and_unknown_siblings_survive ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.29s + + + + + + +running 1 test +test storage::maintenance_admission::tests::canonical_live_producer_is_nonblocking_and_preparation_does_not_spend_grant ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.23s + + + + + + +running 1 test +test storage::maintenance_admission::tests::canonical_metadata_composition_rejects_another_root_before_callback ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.24s + + + + + + +running 1 test +test storage::maintenance_admission::tests::canonical_ready_holds_actual_guards_and_compares_before_own_epoch ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test storage::maintenance_admission::tests::canonical_small_grant_and_panic_drop_actual_authority_before_work ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.12s + + + +thread 'storage::maintenance_admission::tests::canonical_small_grant_and_panic_drop_actual_authority_before_work' (34415112) panicked at src/storage/./maintenance_admission.rs:1092:29: +fixture callback unwind +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + +running 1 test +test storage::maintenance_admission::tests::canonical_stale_epoch_and_changed_config_never_enter_callback ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.12s + + + + + + +running 1 test +test storage::maintenance_admission::tests::legacy_request_source_missing_cache_is_noncreating_and_cannot_approve_later_birth ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test storage::maintenance_admission::tests::legacy_request_source_replacement_invalidates_confirmation_without_rebinding_runtime ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test storage::maintenance_admission::tests::local_epoch_invalidates_current_counter_while_unrelated_shared_producer_stays_live ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test storage::maintenance_admission::tests::private_metadata_composes_actual_canonical_root_and_selector_without_reacquisition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.13s + + + + + + +running 1 test +test storage::maintenance_admission::tests::private_metadata_composes_actual_owned_root_without_reacquisition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.12s + + + + + + +running 1 test +test storage::maintenance_admission::tests::private_metadata_owner_keeps_preparation_images_in_charged_boxes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_admission::tests::private_metadata_partial_frame_and_reset_preserve_unknown_bytes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.23s + + + + + + +running 1 test +test storage::maintenance_admission::tests::private_metadata_resumes_each_durable_control_cut_from_same_bound_files ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.38s + + + +thread 'storage::maintenance_admission::tests::private_metadata_resumes_each_durable_control_cut_from_same_bound_files' (34415141) panicked at src/storage/./maintenance_admission.rs:1990:21: +fixture durable metadata write cut +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + +thread 'storage::maintenance_admission::tests::private_metadata_resumes_each_durable_control_cut_from_same_bound_files' (34415141) panicked at src/storage/./maintenance_admission.rs:1990:21: +fixture durable metadata write cut + +thread 'storage::maintenance_admission::tests::private_metadata_resumes_each_durable_control_cut_from_same_bound_files' (34415141) panicked at src/storage/./maintenance_admission.rs:1990:21: +fixture durable metadata write cut + + + + +running 1 test +test storage::maintenance_admission::tests::private_metadata_stages_over_one_hundred_frames_without_advancing_source_epoch ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 2.96s + + + + + + +running 1 test +test storage::maintenance_admission::tests::simultaneous_preparations_fit_one_account_without_maximum_path_overcharges ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test storage::maintenance_admission::tests::target_binding_duplicate_retains_actual_legacy_objects_and_same_challenge ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.10s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_grant_zero_entry101_deadline_and_atomic_transition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_box_alignment_exact_charge_and_drop_order ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_box_failed_reservation_and_panicking_pointee_release ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + +thread 'storage::maintenance_budget::tests::dc_memory_box_failed_reservation_and_panicking_pointee_release' (34415209) panicked at src/storage/./maintenance_budget.rs:504:17: +expected pointee panic +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_box_fieldwise_large_initialization_is_charged_and_drops_once ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_box_into_inner_transfers_drop_once_and_releases_exact_charge ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_checks_layout_overflow_and_duplicate_buffers ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_simultaneous_reservations_share_one_ceiling ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_split_failure_and_account_lifetime ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_budget::tests::dc_memory_work_types_cross_threads ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_controls::factory_codec_tests::dc_control_binding_modes_are_explicit_and_reserve_unknown_bytes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_controls::tests::dc_control_codec_reserves_before_bytes_and_preserves_full_intended_slot ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_controls::tests::dc_control_independent_regions_recover_every_partial_write_cut ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.69s + + + + + + +running 1 test +test storage::maintenance_controls::tests::dc_control_invalid_witnesses_and_unrelated_generations_stay_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_json::tests::dc_json_differential_producer_whitespace_hash ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_json::tests::dc_json_long_string_dense_values_fixed_account ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.17s + + + + + + +running 1 test +test storage::maintenance_json::tests::dc_json_low_ceiling_releases_failed_construction ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_json::tests::dc_json_producer_defaults_and_nonfinite_are_only_facts ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_json::tests::dc_json_rejects_malformed_trailing_utf8_and_matches_loader_depth ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_json::tests::dc_json_unicode_duplicate_keys_and_lexical_facts ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_legacy_guard::source_observation_layout_tests::prepared_source_observation_keeps_snapshot_and_recovery_images_boxed ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_legacy_guard::tests::dc_legacy_staging_closed_record_refuses_new_actual_producer ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.03s + + + + + + +running 1 test +test storage::maintenance_legacy_guard::tests::dc_legacy_staging_custom_root_is_not_enrolled_or_created ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_legacy_guard::tests::dc_legacy_staging_retains_actual_shared_gate_through_arc_result_lifetime ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.01s + + + + + + +running 1 test +test storage::maintenance_origin::tests::dc_origin_actual_creation_frames_interrupted_publication_and_torn_prefix ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.16s + + + + + + +running 1 test +test storage::maintenance_origin::tests::dc_origin_frames_fail_closed_on_wrong_key_scope_identity_and_extra_bytes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_origin::workspace_origin_tests::workspace_control_binds_only_two_exact_names_and_never_complete ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_origin::workspace_origin_tests::workspace_fifo_proof_is_exact_creation_only_and_rejects_other_names ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_origin::workspace_origin_tests::workspace_frames_bind_exact_creation_and_completed_bytes ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_origin::workspace_origin_tests::workspace_matching_partial_completion_is_creation_only ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_ownership::legacy_coverage::staged_gate_tests::staged_generation_gate_authenticates_each_restart_prefix_until_activation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.18s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_activity_excludes_snapshots_until_all_producers_finish ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_collector_composes_owned_exclusive_root_without_reacquisition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_crash_before_effect_invalidates_prior_snapshot ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.16s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_direct_recovery_invalidates_and_idle_read_does_not ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.19s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_exhaustion_rejects_before_effects_and_releases_activity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_initial_creator_excludes_fresh_coverage_until_effects_finish ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_managed_publication_reader_drop_and_generation_removal ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 1.24s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_managed_recovery_promotion_invalidates_before_references_change ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.98s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_mismatched_producer_disables_existing_coverage_before_effects ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_missing_or_unwritable_control_never_repairs_recognized_proof ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_new_cache_cannot_initialize_old_reference_domain ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_observer_is_noncreating_and_does_not_advance ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_optional_direct_cleanup_preserves_committed_read_but_not_journal_replay ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.64s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_optional_managed_cleanup_preserves_committed_read_and_residue ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 3.73s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_retained_observation_does_not_block_current_writer_or_reader ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.97s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_root_creation_nonce_is_bound_beyond_recycled_numeric_metadata ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_scope_writer_replacement_stays_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_scoped_run_lifetime_and_orphan_removal_invalidate ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.53s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_epoch_unassociated_old_orphan_is_preserved_without_repair ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.16s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_activity_contention_returns_and_preserves_caller_ownership ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_callback_error_and_unwind_release_owned_controls_only ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.29s + + + +thread 'storage::maintenance_ownership::tests::dc_fixed_epoch_callback_error_and_unwind_release_owned_controls_only' (34415461) panicked at src/storage/./maintenance_ownership.rs:5345:21: +fixture callback unwind +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_cohort_or_control_replacement_rejects_before_effect ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.30s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_complete_effect_reservation_allows_its_last_reserved_entry ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_exact_compare_precedes_increment_and_retains_real_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_expired_grant_does_not_open_or_change_epoch_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_preparation_delay_does_not_consume_fresh_mutation_grant ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.26s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_preparation_is_noncreating_and_rejects_exhausted_or_oversized_controls ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_rejects_shared_writer_and_shared_root_without_reacquiring_them ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.16s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_replaced_root_with_same_control_inodes_is_not_the_same_domain ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_stale_preparation_never_adopts_an_unrelated_increment ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_fixed_epoch_zero_and_short_grants_have_no_epoch_effect ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.45s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_cache_consumer_is_existing_readonly_and_does_not_advance_or_decode_optional_proof ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.14s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_cache_consumer_missing_guard_never_creates_or_attests_caller_owned_root ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_cohort_recycled_numeric_lock_identity_does_not_restore_creation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.05s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_cohort_unknown_or_corrupt_creation_header_never_repairs_on_use_or_observation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_current_v2_receipt_and_unknown_v1_follow_existing_guardian_policy ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.06s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_direct_borrowed_session_truthfully_defers_active_companions ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_direct_reader_and_alternate_manifest_exclude_collector ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.11s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_exact_borrowed_writer_requires_exclusive_exact_destination ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_external_bound_managed_store_does_not_require_local_state ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_factory_creates_bound_fixed_names_before_tracked_producer_use ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.16s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_factory_partial_names_are_never_repaired_or_retried_on_acquisition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.05s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_group_deduplicates_same_parent_and_retains_all_guards ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_group_handles_distinct_parents_and_duplicate_resource_keys ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_macos_long_s_consumer_blocks_ascii_direct_even_with_valid_record ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.09s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_macos_parent_aliases_deduplicate_physical_family ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_macos_unicode_nfc_nfd_existing_and_creation_aliases_exclude ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_producer_conversion_holds_parent_until_session_release ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_recreated_coordination_invalidates_destination_proof ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.10s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_replaced_parent_incarnation_invalidates_held_use ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_family_shared_existing_readable_coordination_requires_no_write_permission ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_fresh_creation_header_is_bound_and_really_downgraded_to_shared ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.07s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_guarded_creation_and_controlled_proof_are_incarnation_bound ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.09s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_hardlinks_symlinks_and_case_aliases_cannot_bypass_resource_guard ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_inventory_cohort_observer_is_noncreating_and_validates_lock_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_legacy_cohort_v1_is_not_upgraded_by_read_or_guard_acquisition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_managed_borrowed_session_defers_active_reference_use_without_deadlock ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.08s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_missing_startup_lease_keeps_unknown_evidence ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_optional_producer_capability_never_repairs_untracked_or_corrupt_proof ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_owned_state_transition_never_waits_or_holds_state_during_validation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_preexisting_root_never_becomes_modern_from_guard_acquisition ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_producer_and_collector_exclude_whole_artifact_operation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_producer_capability_borrows_live_tracked_root_and_activity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.15s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_producer_capability_uses_actual_borrowed_exclusive_root ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.17s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_publication_nonce_proof_is_optional_but_never_numeric_only ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.33s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_registered_shared_manifest_and_shared_database_are_retained ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.18s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_replaced_writer_inode_does_not_validate_borrowed_authority ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_review_dangling_worker_state_is_unknown_and_preserved ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_review_hardlinked_coordination_invalidates_held_authority ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_review_legacy_database_new_cache_requires_destination_migration_proof ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.12s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_review_managed_read_resolution_completes_with_paused_collector ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.06s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_review_publication_proof_does_not_bless_legacy_destination_or_sibling ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.10s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_review_unreadable_worker_state_is_unknown_and_preserved ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_shared_manifest_registration_across_database_parents_is_retained ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.09s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_waiter_on_detached_incarnation_cannot_write_fresh_public_root ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.09s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_worker_launch_evidence_without_lifecycle_is_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_workspace_child_owns_startup_gate_and_late_start_refuses_closed ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.32s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_workspace_live_output_prevents_terminal_and_preserves_root ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.38s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_workspace_terminal_admission_preserves_local_source_with_unrelated_producer ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.35s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_s2_writer_worker_and_startup_contention_are_nonblocking ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.04s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_workspace_root_removal_restarts_after_partial_effects_and_failed_done ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.45s + + + + + + +running 1 test +test storage::maintenance_ownership::tests::dc_workspace_root_removal_unknown_sibling_never_starts_intent ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.34s + + + + + + +running 1 test +test storage::maintenance_projection::tests::dc_projection_decodes_utf8_surrogates_and_all_json_escapes_exactly ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_projection::tests::dc_projection_matches_current_config_scalars_duplicates_and_escaped_keys ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_projection::tests::dc_projection_rechecks_current_source_before_decoding_and_does_not_move_file_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_projection::tests::dc_projection_requires_complete_object_and_preserves_loader_depth_errors ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_projection::tests::dc_projection_streams_large_ignored_keys_values_and_limits_only_decoded_storage ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.24s + + + + + + +running 1 test +test storage::maintenance_projection::tests::dc_projection_validates_long_ignored_numbers_like_ordinary_loader_without_cutoff ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.03s + + + + + + +running 1 test +test storage::maintenance_projection::tests::numeric_projection_preserves_the_input_cursor ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_projection::tests::projection_rejects_changed_content_when_the_metadata_stamp_matches ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_retirement::tests::direct_marker_fixed_slots_preserve_full_native_pair_identity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_retirement::tests::direct_marker_record_generation_and_corruption_are_checked ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_workspace_gate::preparation_layout_tests::selector_replacement_does_not_write_through_the_detached_owner ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::maintenance_workspace_gate::preparation_layout_tests::workspace_removal_keeps_large_images_out_of_fixed_owner_layout ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_absent_read_probe_preserves_genuine_first_producer_root_creation ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.42s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_read_recovery_closes_registered_run_without_replaying ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 1.26s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_read_recovery_does_not_recreate_a_partially_retired_run_lease ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.97s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_registered_owner_finish_retains_terminal_work_for_bounded_collection ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.51s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_typed_ambiguous_pointer_error_retains_bytes_and_requires_durability_recovery ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.55s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_typed_generation_issue_never_preempts_required_replay_or_its_error ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 1.08s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_typed_merge_preserves_first_issue_with_a_complete_latest_report ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_typed_recovered_publication_retains_run_until_persisted_barrier_resolves ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.57s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_typed_recovery_accepts_staged_only_and_published_only_seams ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 1.07s + + + + + + +running 1 test +test storage::managed::transaction_janitor_tests::managed_typed_required_corrupt_or_missing_evidence_is_not_an_absent_alternative ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.99s + + + + + + +running 1 test +test storage::run_workspace::retain_recovery_tests::retain_for_recovery_preserves_journal_and_payload_but_releases_actual_lease ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::run_workspace::tests::cleanup_barrier_records_its_absolute_origin ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + +running 1 test +test storage::run_workspace::tests::confined_run_cleanup_is_idempotent ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.00s + + + + + + +running 1 test +test storage::run_workspace::tests::unanchored_persisted_barrier_cannot_authorize_orphan_cleanup ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 267 filtered out; finished in 0.02s + + + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-evidence/storage-maintenance-full.junit.xml b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/storage-maintenance-full.junit.xml new file mode 100644 index 00000000..83cd87e9 --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-evidence/storage-maintenance-full.junit.xml @@ -0,0 +1,135 @@ + + + + + +running 1 test +test fixture::process::tests::covered_epoch_observer_propagates_missing_serial_lock ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + + + + + +running 1 test +test fixture::workload::tests::independent_control_matches_twenty_source_updates_without_rewriting_stable_input ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.03s + + + + + + +running 1 test +test fixture::workload::tests::oracle_rejects_missing_response_fields_and_preserves_context_multiplicity ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + + + + + +running 1 test +test fixture::workload::tests::schedule_covers_twenty_updates_and_each_required_interruption_boundary ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + + + + + +running 1 test +test fixture::workload::tests::search_oracle_omits_only_incarnation_ids_and_keeps_rank_spans_and_content ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + + + + + +running 1 test +test health_preserves_legacy_fields_and_marks_unobserved_maintenance_unknown ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + + + + + +running 1 test +test isolated_worker_first_creation_and_followup_keep_same_covered_publication_birth ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 65.92s + + + + + + +running 1 test +test native_phase_owner_death_preserves_prior_graph_and_retries_without_source_edit ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 28.25s + + + + + + +running 1 test +test nonboolean_quiescence_confirmation_is_rejected_before_repository_effects ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.00s + + + + + + +running 1 test +test repeated_health_entries_preserve_source_and_foreign_sentinels ... ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 0.01s + + + + + + +running 1 test +test twenty_public_builds_match_clean_control_and_preserve_unchanged_artifact ... revision 1: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 2: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 3: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 4: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 5: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 6: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 7: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 8: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 9: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 10: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 11: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 12: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 13: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 14: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 15: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 16: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 17: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 18: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 19: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +revision 20: published with stable artifact reuse; watch event=refreshed event_count=0 changed_paths=0 rebuilt=0 deleted=0 skipped=true database_written=false +ok + +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 10 filtered out; finished in 244.02s + + + + + + diff --git a/docs/specs/CBG-PLAT-01/execution/cod52-macos-nested-scans.md b/docs/specs/CBG-PLAT-01/execution/cod52-macos-nested-scans.md new file mode 100644 index 00000000..603d4bdb --- /dev/null +++ b/docs/specs/CBG-PLAT-01/execution/cod52-macos-nested-scans.md @@ -0,0 +1,63 @@ +# COD-52 — macOS nested directory scans + +## Identity and scope + +- Work: `CBG-PLAT-01/S01`, [COD-52](https://linear.app/codebasegraph/issue/COD-52), Maintenance `P-COD-2`. S00/COD-51 is cleared **only for this slice**. +- [Canonical spec](https://github.com/rabii-chaarani/codebaseGraph/blob/1a9db7b558b60248888408daa6268a3b45f2f0df/docs/specs/CBG-PLAT-01/spec.md) revision0.10, approved full SHA `1a9db7b558b60248888408daa6268a3b45f2f0df`, R01 / A01–A02. [Exact user approval](../approvals/cod52-macos-nested-scans.md) records the2026-10-27 explicit “approved” response for COD-52 only. +- Source baseline main `7038e66ff8271ffddc511f879cf8d28353a09b2d` (4.0.0), after PR153 merged. Both target files were unchanged from reviewed CI-fix head `d6dd34493e9da6f80847240bafcc92dbcaed2c38` before this work. +- Source state: locally implemented; final full local verification and native Windows CI pending. No release/consumer qualification or aggregate closure. No merge, deployment, service restart or other slice implementation. + +## Implementation and acceptance trace + +| Criteria | Existing claim context | Implementation / verification | +|---|---|---| +| A01 / R01 | Graph Store resp-232/233 | `RootedDirectory::visit_entries_filtered` opens literal `.` relative to the retained directory FD with a fresh open file description, owns it with File, verifies physical identity, and enumerates on that local FD. Shared-cursor lseek removed on macOS only. Nested multi-batch exact-vector regression spans160directories plus1file and checks unfiltered/verified-directory traversal. Old production fails; corrected production passes. | +| A02 / R01 | Graph Store resp-232; canonical DC-S3-R3/DC-S4-R4 | Actual `prepare_terminal_output` regression uses genuine terminal registration/origin receipts, an empty parent whose child receipt remains, a later eligible directory beyond one native batch, immediate cancellation and successful reprepare/retry. Missing child veto would select the lexicographically smallest parent instead of target. Old production fails; corrected production passes. Rooted interruption/public-name-replacement test and existing authority/nonfollowing tests pass. Native Windows nested/storage execution remains pending. | + +No public API, product constants, dependencies, buffer/parser policy, Windows/Linux production branch, deletion authority or child-retention rule changed. Fixture counts160/161 and native-order index128 are test data:128 is a conservative4096/32capacity bound, not the incidental85-entry observation or a new product setting. No `dup`/`try_clone`, public-path reopen or platform framework added. + +## Exact source and environment + +Final source SHA-256 values in [snapshot](cod52-evidence/final-frozen-snapshot.json): + +- `src/storage/locks.rs`: `3334713035db60f24a86c34e3fbdaed0724943fcbdf96103c7bf1a39e163f25c` +- `src/storage/maintenance_candidate.rs`: `8e539db80a81de8fb674270adaf608a551954db86352b3e87ad674d6badac765` + +Native macOS26.6.2 build25G83, ARM64, Rust1.96.0. Cached Ladybug0.19 native archive SHA-256 `a840ea7c538e67a8b9fc0d58495b5226dc9c0a5f2f144ff0c48c0f6ca1193ae6`. [Baseline provenance](cod52-evidence/baseline-provenance.json) records paths and unchanged manifest/lock hashes. The root package actually compiled from the isolated worktree; shared-target evidence is bound to source hashes and named tests, not merely pass totals. Rust1.82/macOS13.3 were not executed; API-age/MSRV source review is not native qualification. + +## Executed results and revision limits + +Commands and result codes: [executed-commands.json](cod52-evidence/executed-commands.json). JUnit reports are runner-produced, not inferred from configuration. + +- Final strengthened fixture plus final corrected production: **15/15 native library regressions pass**,830filtered (not executed): [log](cod52-evidence/integrated-final-regressions.log), [JUnit](cod52-evidence/integrated-final-regressions.junit.xml). +- Same final receipt fixture with **only old macOS production restored**: expected selection-completeness **failure**,0pass/1fail; setup/child-veto/cancellation checks pass first: [log](cod52-evidence/receipt-final-old-production.log), [JUnit](cod52-evidence/receipt-final-old-production.junit.xml). Fixed production was restored before final checks. +- Earlier rooted regression against old production:1pass/1fail, failure is incomplete outer enumeration: [JUnit](cod52-evidence/regression-baseline.junit.xml). +- Storage-foundation: **267pass,1existing ignored subprocess-only `relative_barrier_subprocess_fixture`**; before final test-only candidate integration. Candidate is not compiled by this harness: [JUnit](cod52-evidence/storage-foundation-full.junit.xml). +- Cleanup integration: **11pass,0skipped**, before final test-only integration, including20public build/control updates, native-owner death/retry and actual first/follow-up publication birth: [JUnit](cod52-evidence/storage-maintenance-full.junit.xml). +- Final strict `cargo clippy --locked --workspace --all-targets --all-features -- -D warnings` and `cargo fmt --all --check` pass: [Clippy](cod52-evidence/clippy-final-frozen.log), [format](cod52-evidence/format-final-frozen.log). Initial Clippy manual-C-string warning was corrected to MSRV-compatible `c"."`. +- Final full library+foundation run is **in progress**, not passing yet. An earlier partial full-library run was terminated after a later build reused its binary path; [excluded partial evidence note](cod52-evidence/excluded-partial-library-run.md). It is not counted as full-suite verification. + +## Independent review + +Fresh GPT-6.1Sol/High [proposal review](cod52-evidence/proposal-review.md) green. Fresh GPT-6.1Sol/Max [initial final review](cod52-evidence/final-review.md) found a P2 Windows advisory-directory expectation in the new test; fixed by verifying hinted directory opens, without changing production. [Follow-up](cod52-evidence/final-review-followup.md) checks the final strengthened receipt/cancellation fixture and reports no unresolved P0–P3 source defect. Earlier fixture variants/evidence in that historical report retain their stated limits; the final strengthened fixture's exact results are above. Final full-suite/native Windows evidence still gates acceptance/closure. + +## Hosted native execution — source head `d2a442faaf4ca59dc5fe33f082b2072f49b97aa5` + +[CI run40449278177](https://github.com/rabii-chaarani/codebaseGraph/actions/runs/40449278177) finished **failure**:19jobs succeeded,2failed (one native integration and required aggregate),1Windows artifact skipped. [Job/case summary](cod52-evidence/hosted-run-40449278177/summary.json), [exact testcase and failure records](cod52-evidence/hosted-run-40449278177/case-records.txt). + +Actual tested synthetic merge `f633445077d1c81888eb44f7a496927f54289ad7` merges the head into baseline `7038e66ff8271ffddc511f879cf8d28353a09b2d`. Executed `git diff --stat` between tested merge and head is empty: whole Git trees match. Named actual passes (not inferred from green jobs): + +- Mac unit job122007921553: interruption/public-root substitution, nested scan and genuine terminal receipt selection; all843cases pass,2ignored. Mac integration/generation and native artifact build/smoke also pass. +- Windows unit jobs122007920956/122007921364: nested scan passes; the same test also passes in storage-foundation inside failed integration job122007921021. All Windows unit/generation cohorts and3of4integration shards pass. + +Blocking Windows integration shard3 failure is **unchanged** `tests/copy_phase_process.rs:417`, `bounded_production_chunks_reopen_with_primary_keys_connectors_and_search`: the assertion compares unique numeric PID count to COPY event count and sees55vs56. This establishes duplicate PID values. PID reuse is a likely explanation, not confirmed raw-phase provenance or evidence of COPY/data loss. This test and COPY production paths are unchanged from baseline; no relation to the macOS-only production delta is established. Read-only triage discovered the file through the target graph; connected graph MCP became unavailable (`MCP session is not initialized`), CLI fallback used. No assertion/deadline weakened, unapproved test repair, CI retry or dependency change performed. + +[Fresh reviewer evidence addendum](cod52-evidence/hosted-run-40449278177/review-addendum.md) confirms the scope distinction and notes that downstream reopen/PK/connector/search/control checks in the failed COPY case were not reached. Windows named nested-scan execution is now verified; the required aggregate is not. + +Required aggregate remains failed and Windows artifact skipped, **not passing qualification**. COD-52 remains In Review; no merge/close/consumer qualification. User decision is required before expanding to repair the separate process-identity test. Final local library+foundation run is still active with slow cleanup coverage, not a passing full-suite result. + +## Architecture, delivery and remaining gates + +Scryer proportional ledger `chg-bfthrc` preserves existing Graph Store resp-232/233; no new claims/topology. Governing intent/rules and changed-symbol claims were checked. Configured graph/model remain bound to the older dirty root checkout; target-scoped local graph independently discovered implementation/fixture files. `orient(project=isolated_path)` reports no model. No model was copied/invented, worktree reports were not ingested as root verdicts, and unrelated drift/pending claims were not globally reconciled. + +Remaining: final full local run, native Windows nested/storage execution at the delivered head/synthetic merge, current binary/source identities and review evidence reconciliation, then COD-52 acceptance. Minimum/current clean-consumer archives, other policies/slices, S09 disposition and maintainer aggregate closure remain separate COD-61/milestone gates. Existing dirty checkout is untouched. Reusable-knowledge assessment: this restores a specified invariant; ordinary shared-descriptor semantics and existing binary-provenance procedures need no filler memory or duplicate wiki contract. diff --git a/src/artifact_store.rs b/src/artifact_store.rs index 844b90f8..d062849f 100644 --- a/src/artifact_store.rs +++ b/src/artifact_store.rs @@ -19,6 +19,19 @@ const ARTIFACT_KEY_BYTES: usize = 32; const ARTIFACT_KEY_HEX_LEN: usize = ARTIFACT_KEY_BYTES * 2; const ARTIFACT_IO_BUFFER_BYTES: usize = 64 * 1024; +// Optional tracking errors must not change primary publication semantics. +// Tests retain the precise stage in CI's log when a receipt precondition fails. +macro_rules! trace_origin_result { + ($stage:literal, $operation:expr) => {{ + let result = $operation; + #[cfg(test)] + if let Err(error) = &result { + eprintln!("artifact origin {} failed: {error}", $stage); + } + result + }}; +} + #[derive(Debug, Clone, PartialEq, Eq)] pub(crate) enum ArtifactWriteOutcome { Written, @@ -160,13 +173,27 @@ impl ArtifactStore { use crate::storage::maintenance_controls::try_begin_root_publication; use crate::storage::maintenance_origin::{OriginWriter, ORIGIN_NAME}; let root = RootedDirectory::open(&self.root, path_identity(&self.root)?)?; - let mut capability = mutation.artifact_root_producer_capability().unwrap_or(None); + let mut capability = + trace_origin_result!("capability", mutation.artifact_root_producer_capability()) + .unwrap_or(None); + #[cfg(test)] + if capability.is_none() { + eprintln!( + "artifact origin capability unavailable: {:?}", + mutation.pending_reason() + ); + } // Tracking is optional. Primary no-replace/equality semantics and actual // anchored transport are identical when controls are missing or busy. let publication = match capability.as_mut() { - Some(cap) => try_begin_root_publication(cap).unwrap_or(None), + Some(cap) => trace_origin_result!("publication lease", try_begin_root_publication(cap)) + .unwrap_or(None), None => None, }; + #[cfg(test)] + if publication.is_none() { + eprintln!("artifact origin publication lease unavailable"); + } let prefix_name = &artifact_key.as_bytes()[..2]; let prefix = match root.create_directory(prefix_name) { Ok(dir) => { @@ -196,11 +223,15 @@ impl ArtifactStore { #[cfg(test)] producer_hook("created", &temp); let mut origin = publication.as_ref().and_then(|lease| { - OriginWriter::create(lease, &temp, &payload, key_bytes, true, true).ok() + trace_origin_result!( + "creation", + OriginWriter::create(lease, &temp, &payload, key_bytes, true, true) + ) + .ok() }); let receipt_identity = origin.as_ref().map(OriginWriter::receipt_identity); if let Some(origin) = origin.as_mut() { - let _ = origin.writing(); + let _ = trace_origin_result!("writing", origin.writing()); } let prepared = (|| -> Result<(u64, [u8; 32]), NativeError> { let bytes = write_envelope_file_and_sync( @@ -212,7 +243,10 @@ impl ArtifactStore { temp.sync_namespace()?; root.sync_namespace()?; if let Some(origin) = origin.as_mut() { - let _ = origin.complete(&temp, &payload, bytes.0, bytes.1); + let _ = trace_origin_result!( + "completion", + origin.complete(&temp, &payload, bytes.0, bytes.1) + ); } Ok(bytes) })(); @@ -280,7 +314,7 @@ impl ArtifactStore { root.sync_namespace()?; if let Some(lease) = publication.as_ref() { if let Some(origin) = origin_publication { - let _ = origin.published(lease, &temp); + let _ = trace_origin_result!("publication", origin.published(lease, &temp)); } } Ok(ArtifactWriteOutcome::Written) diff --git a/src/db_writer/phase.rs b/src/db_writer/phase.rs index 0e9a9b92..dbcf2404 100644 --- a/src/db_writer/phase.rs +++ b/src/db_writer/phase.rs @@ -399,6 +399,21 @@ fn copy_source_metadata(statement: &str) -> Option<(String, u64)> { None } +#[cfg(debug_assertions)] +fn test_process_instance() -> Result<&'static str, String> { + static INSTANCE: OnceLock> = OnceLock::new(); + INSTANCE + .get_or_init(|| { + let mut bytes = [0; 32]; + getrandom::fill(&mut bytes) + .map_err(|error| format!("failed to identify test phase process: {error}"))?; + Ok(bytes.iter().map(|byte| format!("{byte:02x}")).collect()) + }) + .as_ref() + .map(String::as_str) + .map_err(Clone::clone) +} + #[cfg(debug_assertions)] fn record_test_phase_result(request: &LadybugWritePhaseRequest) -> Result<(), String> { let Some(directory) = std::env::var_os("CODEBASE_GRAPH_TEST_COPY_RESULT_DIR") else { @@ -445,6 +460,10 @@ fn record_test_phase_result(request: &LadybugWritePhaseRequest) -> Result<(), St serde_json::json!(staged.as_ref().map(|(_, bytes)| bytes)), ); object.insert("pid".into(), serde_json::json!(std::process::id())); + object.insert( + "process_instance".into(), + serde_json::json!(test_process_instance()?), + ); object.insert("success".into(), serde_json::json!(true)); let trace_path = directory.join("phases.jsonl"); let mut trace_file = OpenOptions::new() @@ -1168,6 +1187,23 @@ mod tests { assert!(std::str::from_utf8(message.as_bytes()).is_ok()); } + #[cfg(debug_assertions)] + #[test] + fn phase_trace_process_instance_is_stable_across_calls_and_threads() { + let first = test_process_instance().unwrap(); + assert_eq!(first.len(), 64); + assert!(first + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))); + assert_eq!(test_process_instance().unwrap(), first); + assert_eq!( + std::thread::spawn(|| test_process_instance().unwrap()) + .join() + .unwrap(), + first + ); + } + #[cfg(debug_assertions)] #[test] fn copy_trace_metadata_reports_generated_file_bytes() { diff --git a/src/storage/locks.rs b/src/storage/locks.rs index 8407242e..754de2fe 100644 --- a/src/storage/locks.rs +++ b/src/storage/locks.rs @@ -2100,28 +2100,105 @@ mod rooted_directory_tests { root.sync_namespace().unwrap(); assert_eq!(root.identity(), id); } - #[cfg(windows)] + #[cfg(any(target_os = "macos", windows))] #[test] fn nested_directory_scans_do_not_consume_the_outer_cursor() { let fixture = Fixture::new(); let root = fixture.anchor(); - for name in [b"one".as_slice(), b"two", b"three"] { - drop(root.create_new(name).unwrap()); - } - let mut outer = Vec::new(); + let mut expected = Vec::new(); + // Even minimum-sized native records cannot fit in one scratch buffer. + for index in 0..160 { + let name = format!("directory-{index:03}-{}", "x".repeat(64)).into_bytes(); + drop(root.create_directory(&name).unwrap()); + expected.push(name); + } + let mut all_entries = expected.clone(); + drop(root.create_new(b"regular-payload").unwrap()); + all_entries.push(b"regular-payload".to_vec()); + all_entries.sort(); + let mut baseline = Vec::new(); root.visit_entries(&mut [0; 4096], &mut |name| { - let mut inner = 0; - root.visit_entries(&mut [0; 4096], &mut |_| { - inner += 1; - Ok(()) - })?; - assert_eq!(inner, 3); - outer.push(name.to_vec()); + baseline.push(name.to_vec()); Ok(()) }) .unwrap(); - outer.sort(); - assert_eq!(outer, [b"one".to_vec(), b"three".to_vec(), b"two".to_vec()]); + baseline.sort(); + assert_eq!(baseline, all_entries); + + for directories_only in [false, true] { + let mut outer = Vec::new(); + let mut visit = |name: &[u8]| { + if directories_only && root.open_directory_readonly(name).is_err() { + return Ok(()); + } + let mut inner = Vec::new(); + root.visit_entries(&mut [0; 4096], &mut |entry| { + inner.push(entry.to_vec()); + Ok(()) + })?; + inner.sort(); + assert_eq!(inner, all_entries); + outer.push(name.to_vec()); + Ok(()) + }; + if directories_only { + root.visit_directories(&mut [0; 4096], &mut visit) + } else { + root.visit_entries(&mut [0; 4096], &mut visit) + } + .unwrap(); + outer.sort(); + assert_eq!( + outer.as_slice(), + if directories_only { + &expected + } else { + &all_entries + } + ); + } + } + #[cfg(target_os = "macos")] + #[test] + fn interrupted_directory_scan_restarts_on_the_pinned_root_after_name_replacement() { + let fixture = Fixture::new(); + let public = fixture.root.join("public"); + fs::create_dir(&public).unwrap(); + let root = + RootedDirectory::open_readonly_root(&public, path_identity(&public).unwrap()).unwrap(); + let mut expected = Vec::new(); + for index in 0..160 { + let name = format!("owned-{index:03}").into_bytes(); + drop(root.create_new(&name).unwrap()); + expected.push(name); + } + let mut visited = 0; + let error = root + .visit_entries(&mut [0; 4096], &mut |_| { + visited += 1; + Err(std::io::ErrorKind::Interrupted.into()) + }) + .unwrap_err(); + assert_eq!(error.kind(), std::io::ErrorKind::Interrupted); + assert_eq!(visited, 1); + fs::rename(&public, fixture.root.join("original")).unwrap(); + fs::create_dir(&public).unwrap(); + fs::write(public.join("foreign-sentinel"), b"foreign").unwrap(); + + for _ in 0..2 { + let mut seen = Vec::new(); + root.visit_entries(&mut [0; 4096], &mut |name| { + seen.push(name.to_vec()); + Ok(()) + }) + .unwrap(); + seen.sort(); + assert_eq!(seen, expected); + } + assert_eq!( + fs::read(public.join("foreign-sentinel")).unwrap(), + b"foreign" + ); } #[cfg(windows)] #[test] @@ -2540,22 +2617,37 @@ impl RootedDirectory { ) -> std::io::Result<()> { #[cfg(target_os = "macos")] { - use std::os::fd::AsRawFd; + use std::os::fd::{AsRawFd, FromRawFd}; + // A new open file description isolates nested traversal offsets. + // SAFETY: trusted dot resolves against the retained actual directory; + // no public pathname is reopened and the returned FD is owned below. + let fd = unsafe { + libc::openat( + self.directory.as_raw_fd(), + c".".as_ptr(), + libc::O_RDONLY | libc::O_DIRECTORY | libc::O_NOFOLLOW | libc::O_CLOEXEC, + ) + }; + if fd < 0 { + return Err(std::io::Error::last_os_error()); + } + // SAFETY: openat returned a fresh descriptor owned by this File. + let directory = unsafe { File::from_raw_fd(fd) }; + if file_identity(&directory).map_err(native_io)? != self.identity { + return Err(std::io::ErrorKind::InvalidInput.into()); + } let mut attributes: libc::attrlist = unsafe { std::mem::zeroed() }; attributes.bitmapcount = libc::ATTR_BIT_MAP_COUNT; attributes.commonattr = libc::ATTR_CMN_NAME | libc::ATTR_CMN_RETURNED_ATTRS; if directories_only { attributes.commonattr |= libc::ATTR_CMN_OBJTYPE; } - // SAFETY: actual directory FD, bounded writable caller scratch and - // initialized attrlist. No libc DIR allocation or path expansion. - if unsafe { libc::lseek(self.directory.as_raw_fd(), 0, libc::SEEK_SET) } < 0 { - return Err(std::io::Error::last_os_error()); - } loop { + // SAFETY: actual directory FD, bounded writable caller scratch + // and initialized attrlist. No libc DIR or path expansion. let count = unsafe { libc::getattrlistbulk( - self.directory.as_raw_fd(), + directory.as_raw_fd(), (&mut attributes as *mut libc::attrlist).cast(), bytes.as_mut_ptr().cast(), bytes.len(), diff --git a/src/storage/maintenance_candidate.rs b/src/storage/maintenance_candidate.rs index 92bc9c38..9c862a46 100644 --- a/src/storage/maintenance_candidate.rs +++ b/src/storage/maintenance_candidate.rs @@ -2104,6 +2104,147 @@ mod tests { corrupt[8] = 1; assert!(Control::decode(&corrupt, scope).is_err()); } + + #[cfg(target_os = "macos")] + #[test] + fn terminal_receipt_selection_reaches_late_directory_after_child_receipt_veto() { + use super::super::layout::{create_fresh_reference_root, managed_generation_id}; + use super::super::maintenance_admission::tests::Fixture; + use super::super::maintenance_controls::{ + self as controls, WorkspaceCreatedDirectory, WorkspaceDisposition, + WorkspaceRegistration, + }; + use super::super::maintenance_origin; + use super::super::maintenance_ownership::ReferenceMutation; + use std::fs; + use std::path::Path; + + let f = Fixture::new(); + let workspace_base = f + .domain + .workspace_registry(2, Some(&f.target.state_root)) + .expect("managed worker registry"); + fs::create_dir_all(&workspace_base).unwrap(); + let root = workspace_base.join(format!("worker-{}", managed_generation_id())); + let fresh = create_fresh_reference_root(&root).unwrap().unwrap(); + let anchor = RootedDirectory::open(&root, fresh.identity()).unwrap(); + let owner = + locks::create_new_coordination_in(&anchor, b"lease.lock", &root.join("lease.lock")) + .unwrap(); + let creation_mutation = ReferenceMutation::begin_in_domain(&f.domain).unwrap(); + let startup = locks::open_shared_coordination(&f.domain.workspace_startup_path()).unwrap(); + let registration = + WorkspaceRegistration::create(&fresh, &f.domain, &creation_mutation, &owner, 2) + .unwrap() + .expect("fresh worker registration"); + drop((startup, creation_mutation)); + + let create_directory = |path: &Path| { + let output = WorkspaceCreatedDirectory::create_new(path) + .unwrap() + .expect("registered workspace directory output"); + let binding = output.origin_binding(); + maintenance_origin::record_created_workspace_directory(&output).unwrap(); + let receipt = controls::workspace_origin_name( + &binding.incarnation, + binding.parent, + binding.output, + &binding.operation, + ); + let identity = binding.output; + drop(output); + (receipt, identity) + }; + + let mut fillers = Vec::new(); + for index in 0..161 { + let path = root.join(format!("output-{index:03}")); + let (receipt, identity) = create_directory(&path); + fs::write(path.join("retain"), b"ineligible").unwrap(); + fillers.push((path, receipt, identity)); + } + // Without the child-receipt veto this smallest receipt would win. + let parent_index = fillers + .iter() + .enumerate() + .min_by_key(|(_, (_, receipt, _))| *receipt) + .unwrap() + .0; + let (parent_path, parent_receipt, parent_id) = fillers.remove(parent_index); + fs::remove_file(parent_path.join("retain")).unwrap(); + let child = parent_path.join("retired-child"); + let _ = create_directory(&child); + fs::remove_dir(&child).unwrap(); + + // Observe native order rather than assume APFS ordering. The selected + // target lies well beyond the first 4096-byte native result batch. + let root_pin = + RootedDirectory::open_readonly_root(&root, locks::path_identity(&root).unwrap()) + .unwrap(); + let registry = root_pin + .open_directory_readonly(b".workspace-origins") + .unwrap(); + let mut order = Vec::new(); + registry + .visit_entries(&mut [0; 4096], &mut |entry| { + if entry.len() == 64 { + let mut name = [0; 64]; + name.copy_from_slice(entry); + order.push(name); + } + Ok(()) + }) + .unwrap(); + let position = |name: &[u8; 64]| order.iter().position(|seen| seen == name); + let (target_path, target_receipt, target_id) = fillers + .iter() + .find(|(_, receipt, _)| position(receipt).is_some_and(|index| index > 128)) + .expect("160 fillers cannot all fit in the first 129 entries"); + let target_position = position(target_receipt).unwrap(); + assert!(target_position > 128); + assert!(parent_receipt < *target_receipt); + assert!(parent_path.is_dir()); + assert!(!parent_path.join("retired-child").exists()); + assert_eq!(fs::read_dir(&parent_path).unwrap().count(), 0); + fs::remove_file(target_path.join("retain")).unwrap(); + + let mutation = ReferenceMutation::begin_in_domain(&f.domain).unwrap(); + registration + .terminal(&owner, &mutation, WorkspaceDisposition::AbortedNotPublished) + .unwrap(); + drop((mutation, owner, anchor, fresh)); + + let ready = + controls::prepare_terminal_workspace_boxed(&root, &f.domain, &f.memory).unwrap(); + let scope = ready.origin_scope(); + assert!( + workspace_has_child_receipts(®istry, parent_id, scope, &f.memory, &|| false) + .unwrap() + ); + drop(registry); + drop(root_pin); + + let mut report = CandidateReport::default(); + assert!(matches!( + prepare_terminal_output(ready, &f.memory, &|| true, &mut report), + Err(CandidateError::Io(std::io::ErrorKind::Interrupted)) + )); + assert!(parent_path.is_dir()); + let ready = + controls::prepare_terminal_workspace_boxed(&root, &f.domain, &f.memory).unwrap(); + let selected = prepare_terminal_output(ready, &f.memory, &|| false, &mut report) + .unwrap() + .expect("selection must continue after the parent receipt is vetoed"); + assert_eq!(selected.origin.binding.output, *target_id); + assert!(selected.origin.directory); + let selected_name = + &selected.origin.binding.name[..selected.origin.binding.name_len as usize]; + assert_eq!( + selected_name, + target_path.file_name().unwrap().as_encoded_bytes() + ); + assert!(parent_path.is_dir()); + } } /// Produced only after the already-prepared completion control was durably diff --git a/tests/copy_phase_process.rs b/tests/copy_phase_process.rs index f4744944..dcc20dde 100644 --- a/tests/copy_phase_process.rs +++ b/tests/copy_phase_process.rs @@ -169,6 +169,67 @@ fn traces(directory: &Path) -> Vec { .collect() } +fn process_instance(event: &Value) -> Result<&str, &'static str> { + if !event["pid"] + .as_u64() + .is_some_and(|pid| pid > 0 && pid <= u32::MAX as u64) + { + return Err("phase trace has no valid diagnostic PID"); + } + let instance = event["process_instance"] + .as_str() + .ok_or("phase trace has no process instance")?; + if instance.len() != 64 + || !instance + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) + { + return Err("phase trace has an invalid process instance"); + } + Ok(instance) +} + +fn distinct_phase_processes(events: &[&Value]) -> Result<(), &'static str> { + if events.len() < 2 { + return Err("process isolation needs multiple phase records"); + } + let mut instances = BTreeSet::new(); + for event in events { + if !instances.insert(process_instance(event)?) { + return Err("multiple phases executed in one process instance"); + } + } + Ok(()) +} + +#[test] +fn phase_process_oracle_accepts_reused_pid_but_rejects_reused_process() { + let first = json!({"pid": 42, "process_instance": "a".repeat(64)}); + let next = json!({"pid": 42, "process_instance": "b".repeat(64)}); + assert!(distinct_phase_processes(&[&first, &next]).is_ok()); + assert!(distinct_phase_processes(&[&first, &first]).is_err()); + let changed_pid = json!({"pid": 43, "process_instance": "a".repeat(64)}); + assert!(distinct_phase_processes(&[&first, &changed_pid]).is_err()); +} + +#[test] +fn phase_process_oracle_rejects_missing_or_invalid_evidence() { + let valid = json!({"pid": 42, "process_instance": "a".repeat(64)}); + assert!(distinct_phase_processes(&[]).is_err()); + assert!(distinct_phase_processes(&[&valid]).is_err()); + for invalid in [ + json!({"pid": 43}), + json!({"process_instance": "b".repeat(64)}), + json!({"pid": 0, "process_instance": "b".repeat(64)}), + json!({"pid": "43", "process_instance": "b".repeat(64)}), + json!({"pid": 43, "process_instance": ""}), + json!({"pid": 43, "process_instance": "B".repeat(64)}), + json!({"pid": 43, "process_instance": "g".repeat(64)}), + ] { + assert!(distinct_phase_processes(&[&valid, &invalid]).is_err()); + } +} + fn bundle_hashes(db: &Path, manifest: &Path) -> BTreeMap { let mut paths = vec![db.to_path_buf(), manifest.to_path_buf()]; let value: Value = serde_json::from_slice(&fs::read(manifest).unwrap()).unwrap(); @@ -236,10 +297,7 @@ fn native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles() { assert!(events[1].get("buffer_pool_bytes").is_none()); assert!(events[1].get("worker_memory_bytes").is_none()); assert!(events[1]["staged_file_bytes"].as_u64().unwrap() > 0); - assert_ne!( - events[0]["pid"], events[1]["pid"], - "phases must actually be isolated" - ); + assert_eq!(distinct_phase_processes(&[&events[0], &events[1]]), Ok(())); assert_eq!(fixture.paths(), (db.clone(), manifest.clone())); assert_eq!(bundle_hashes(&db, &manifest), before); assert!(fixture @@ -258,7 +316,11 @@ fn native_copy_acknowledgement_failure_preserves_managed_and_direct_bundles() { assert!(!fixture .search("failed_marker") .contains(&"failed_marker".to_owned())); - assert_ne!(traces(&recovery_trace)[0]["pid"], events[0]["pid"]); + let recovered_events = traces(&recovery_trace); + assert_eq!( + distinct_phase_processes(&[&recovered_events[0], &events[0]]), + Ok(()) + ); fs::remove_dir_all(&fixture.root).unwrap(); } } @@ -414,14 +476,7 @@ fn bounded_production_chunks_reopen_with_primary_keys_connectors_and_search() { assert!(!events[first_connector..] .iter() .any(|event| event["phase_kind"] == "index")); - assert_eq!( - copies - .iter() - .map(|event| event["pid"].as_u64().unwrap()) - .collect::>() - .len(), - copies.len() - ); + assert_eq!(distinct_phase_processes(&copies), Ok(())); let (db_path, _) = fixture.paths(); let database = lbug::Database::new( diff --git a/tests/support/storage_maintenance/collector.rs b/tests/support/storage_maintenance/collector.rs index b326a710..c1f1511c 100644 --- a/tests/support/storage_maintenance/collector.rs +++ b/tests/support/storage_maintenance/collector.rs @@ -1433,12 +1433,30 @@ fn capture_receipt_diagnostics(root: &FixtureRoot, artifact_root: &Path, key: &s } Err(error) => json!({"error":error.to_string()}), }; + let payload = match fs::read( + artifact_root + .join(&key[..2]) + .join(key) + .join("partition.json"), + ) { + Ok(bytes) => { + json!({"bytes": bytes.len(), "sha256": format!("{:x}", Sha256::digest(&bytes))}) + } + Err(error) => json!({"error": error.to_string()}), + }; let path = root .path() .parent() .unwrap() .join("qualification-receipt-diagnostics.json"); - fs::write(&path, serde_json::to_vec_pretty(&json!({"fixture_root":root.path(),"artifact_root":artifact_root,"key":key,"reference_epoch":epoch,"controls":metadata,"receipt":receipt})).unwrap()).unwrap(); + let diagnostics = serde_json::to_vec_pretty(&json!({"fixture_root":root.path(),"artifact_root":artifact_root,"key":key,"reference_epoch":epoch,"controls":metadata,"receipt":receipt,"payload":payload})).unwrap(); + // CI retains the test log, but does not upload arbitrary fixture paths. + // Emit the evidence before writing so even a failed diagnostic write keeps it. + eprintln!( + "canonical receipt diagnostics:\n{}", + String::from_utf8_lossy(&diagnostics) + ); + fs::write(&path, diagnostics).unwrap(); path }