Repository navigation
Description
Finding
A fresh S22 ingest measured 184,749 edges/s: 363.244 s for 67,108,864 edges, 5.41× below the 1M edges/s criterion of #1387. The ladder attributes 323.27 s of that, 89% of wall time, to a phase labelled validation.
The label is wrong. ImportSession::validate_with_cancellation in crates/graphforge-api/src/import_session.rs is where construction happens: it reads and normalises every source, appends each batch into the construction session (encoding, UUID membership, partition shaping, spill), persists the session manifest, and then seals. commit is only the atomic publish. So "validation" is the ingest, not a check on it, and the phase total mixes source read, encode, membership, shaping, spill, evidence writing, and manifest durability into one number.
The instrument to split it already exists. The phase is wrapped in RegionScope::named("validate"), with nested append and seal regions, and seal_and_publish_inner in resumable_construction.rs opens prepare_encoding and hydration regions. #1477 wired RegionScope into lifecycle phases. Whether the import-path capture reaches the ladder's stock output must be verified, not assumed.
Why this blocks #1572
The SLO adjudication is currently reasoning about a bucket with the wrong label. A 5.41× gap on the whole phase says nothing about which mechanism owns it, and the simplification-track order in #735 has a conditional reorder that depends on this split: if hashing or evidence writing is a top-three region, #1617 moves to position 1.
Scope
- Confirm whether the import path's
RegionCapturesnapshot is emitted in the stockgfreceipt or JSON output. If not, expose it there; no custom binary. - Re-run the same S22 input on the same host under quiet-host conditions and report per region: wall, CPU, effective cores, fsync count, bytes written, bytes hashed. Regions: source read/normalise, append (split by node and edge), seal, prepare_encoding, hydration, manifest persistence, commit.
- Rename the ladder phase from
validationtostage+sealin the phase metric policy table that test(g500-ladder): the phase metric policy table assumes work proportional to data, which the redesign removes #1433 is redesigning, and in any receipt field or schema that carries the name. Keep a compatibility alias only if a consumer needs it, and say which. - Record the budget: at 1M edges/s the S22 total is 67 s. Report each region's share of that budget so decision(storage): adjudicate the 1M ingest SLO for v0.6.0 and shared-host time #1572 and epic(storage): scale complete ingest across cores and reach 1M edges/s #1387 can see which regions must shrink and by how much.
Non-goals
- Fixing any region. This issue attributes; epic(storage): scale complete ingest across cores and reach 1M edges/s #1387, refactor(storage,api): move digests and attribution off the data path; retire forensic verify #1617, refactor(storage): route every durable write through one commit abstraction and retire per-artifact durability proofs #1616, and the manifest-journal issue own the fixes.
Acceptance criteria
- Stock build emits the per-region snapshot for the import path; the command and output location are documented in
docs/development/. - S22 region table posted on the issue with wall, CPU, effective cores, fsync count, bytes written, bytes hashed per region, plus run identity, host, and quiet-host evidence (docs: stop committing per-issue evidence to the docs tree, prune unreferenced development docs, and give ADRs a lifecycle #1625: results live on the issue;
docs/development/keeps only the command and output location). - The regions sum to the phase total within a stated residual; the residual is reported, not hidden.
- Ladder policy and receipts use
stage+seal; no output calls this phasevalidation. - epic(scale): close billion-edge scale and hardened interchange #735 records the resulting decision on whether refactor(storage,api): move digests and attribution off the data path; retire forensic verify #1617 moves to position 1.
Acceptance evidence: S22 tables, original receipts, exact reconciliation and reopen proof; #735 priority adjudication; PR #1652 integrates the instrument and documented stock commands.
Activity
DecisionNerd commentedon Sep 29, 2026
Evidence location correction (see #1625): where this issue says a table or inventory is "committed under
docs/development/", read it as: the method and input digests go in the repo, the results table attaches to this issue. Do not add per-issue files todocs/development/.DecisionNerd commentedon Sep 29, 2026
S22 region split measured — capture already in the stock receipt; two clean quiet-host reruns
1. Scope 1: the region snapshot already reaches the stock receipt — no code change needed
gf --json import-session validate --session-uuid <uuid>(and every otherimport-sessionsubcommand) already embedsregion_diagnostics— theRegionCapturesnapshot, contractgraphforge-region-diagnostics/1,complete: true— in its JSON receipt (crates/graphforge-cli/src/portable_cli.rs:648). It is documented indocs/development/ingest-region-diagnostics.md, and the 363.244 s run's own committed receipt (docs/development/evidence/core-scaling-1448/final-integrated-s22/run/receipt-3-validate.json, treee90db036) carries a complete 45-region snapshot. No test feature, no custom binary, no crate-boundary change. The AC-1 work that remains is only pointing this issue's table at that documented command.2. Run identity and quiet-host evidence
Two fresh S22 complete ingests (five-command workflow: begin → register nodes → register edges → validate → commit), identical input, binary, and host to the 363.244 s reference run:
bf4b44d0)gfsha2561a846710eb013300db39e023093d5cef1ccf49171ecba52df24e50b28881f7c5— the reference run's own unmodified release binary (built frome90db03637eba072b4d733fb25eceb017a8815f6; currentmainbf4b44d0adds only docs on top of it).nodes.parquetbcbcbea526e61ceb63f6006ee5f56de6bb4f74cffdd68dc6eff6d230d3897f06,edges.parquet1c0ff75485f75e904cbd59b6f5d42da1d8b1af6ddac59ee6c495a4948a428d13(S22 Graph500, 4,194,304 nodes / 67,108,864 edges).TMPDIRon the ext4 md3 volume.runexec --no-container --cores 0-15. A sampler polled the process table every 20 s during both runs: zero compile processes. The refactor(modularity): gate algorithms, knowledge, search, provenance, and portable behind Cargo features with per-feature CI lanes #1621 agent'starget/received zero file writes inside either run window. (An earlier rerun attempt that overlapped a refactor(modularity): gate algorithms, knowledge, search, provenance, and portable behind Cargo features with per-feature CI lanes #1621 build burst measured validate at 349.2 s, +8%, and was discarded — quoted nowhere below.)Correctness of rerun A's published project, reopened and full-scanned: counts and all four answer digests are byte-identical to the reference run's committed digests — nodes
15563dc5…, edges979e01bd…, node-scan05cfd803…, edge-scan73e049c3….3. Region table — the phase the ladder reports as validate
Wall / process-CPU seconds, effective cores (process-CPU ÷ wall, process-inclusive per the documented units — values above 1.0 mean worker threads ran inside that region's window). fsync = fsync-region scopes inside the region's subtree; each scope wraps one instrumented durable call.
Region walls reproduce across three independent quiet-host runs within ±0.7% (append is identical to 4 ms). The I/O counters are byte-identical across all runs (deterministic ingest): validate-phase
application_iototals read 58,941,717,334 B, written 45,530,435,829 B,fsync_calls182,627 over 1,088 appended objects. Registration owned bytes: nodes 67,138,540, edges 3,222,211,061.fsync counts, two instruments with different boundaries, both reported: 44,006 fsync scopes (37,696 under append ≈ 34.6 per batch — the per-batch manifest fsync+rename cycle #1624 replaces; 6,308 under seal; the 180,407-call
fsync_synchronizationI/O phase and 2,220-callencode_write_postwrite_authenticationphase live inside seal). Instrument gap, stated not hidden: the capture records no per-region bytes written or bytes hashed — its work counters are rows/bytes/nodes/edges at registration/append/encoding sites, and no hashed-byte counter exists anywhere in the ingest path. Bytes written exists only at I/O-phase granularity (above); per-region bytes-written/hashed needs newrecord_workcall sites ingraphforge-storage— a bounded follow-up, deliberately not done in this measurement pass.4. Residuals (reported, not hidden)
5. Budget at the 1M edges/s floor (AC 4)
Total budget at 1,000,000 edges/s is 67.109 s for 67,108,864 edges. Measured 364.5 s = 5.43× the budget. Region shares of that same budget (nested regions intentionally overlap): seal 346%, shaping 248%, append 100% — append alone already consumes the entire 1M-edges/s wall budget, before any seal work. To reach the floor, seal must shrink by ~4.5× and append by ~2× while everything else also shrinks — or the path must parallelize; CPU per edge is unchanged at ~7.1 µs (474.8 s / 67.1 M edges), so this remains a parallelism gap, not a CPU-reduction gap.
6. What this says for #735 / #1617 (AC 5)
#1617 does not move to position 1. The conditional was "if hashing or evidence writing is a top-three region". Measured: hashing (
seal_authentication0.044 s;artifact_authentication3.898 s inside shape_routing) and durable evidence writing (fsync scopes sum ≈ 5.5 s wall, 1.7%) are nowhere near the top three. The top three are shaping 51.4%, append 20.7%, canonical_encoding 20.3% — 92.4% of the phase. The misnamed phase is construction work end to end, and the digests/receipts/attribution costs #1617 would move off the data path are already negligible here. #1624's baseline is directly measured: ~34.6 manifest fsync+rename cycles per appended batch, 180,407 file-layer fsyncs per validate.7. Rename census for scope 3
No ladder output surface carries the name "validation" — the native ladder's phase inventory and rung JSON say
ingest(progressive_qualification.py), and #1433'sPHASE_METRIC_POLICIESrows areapplication_iophase names with no validation row to rename. The name actually lives in: (1) the region pathimport_command/validate(import_session.rs:772), (2) the session progress labelvalidated(ImportPhase::Validated), (3) the certify runner's region allowlist and theschemas/certification-evidence.jsonpattern (kept in sync by a test), (4) human-facing reports (e.g. the #1622 disposition's "Validate wall" column). Astage+sealrename touches those four surfaces plus this issue's title — bounded, insidegraphforge-api/graphforge-cli/certify runner, not the crate-boundary files #1621 is editing (verified against its branch as of its four current commits; coordinate at file granularity anyway). No consumer needs a compatibility alias today; the region-name contract version inschemas/certification-evidence.jsonis the one gate to bump.8. Operational finding for anyone re-running this
The first rerun attempt failed at commit with
GF_PUBLICATION_FAILED … install stable materialized object … Invalid— the 96-charactersafe_causeredaction truncated "Invalid cross-device link" mid-message. Real cause: reader-workspace hydration hardlinks CAS objects into atempfileworkspace underTMPDIR(create_graph_workspace,workspace_hydration.rs:357), soTMPDIRmust be on the same ext4 volume as the project; with/tmpon tmpfs the link fails with EXDEV and the commit fail-closes. The committedverify.shalready setsTMPDIRto a volume path; the ingest driver must do the same. Worth either a documented requirement or an EXDEV-aware fallback/copy route in a follow-up issue; noted here because #1624 touches the same commit path.fix(bench): accept stage+seal in live measurement consumers (#1623)
DecisionNerd commentedon Sep 30, 2026
Raw #1623 S22 evidence, part 1/4. XZ bundle SHA-256
ea99531de93003dad71a35d32df4f3cbd84dc80c8a57072613acf91b450da907; part SHA-256b8bb1ab8852d233ade1750c974ae7add99ca53255e834677bbb25e9c21a2cbb7. Concatenate decoded parts in numeric order, verify the bundle digest, then XZ-decompress to JSON. Per-file SHA-256 values are inside the bundle. Includes original five receipts, complete sampled host/process evidence, input checks, chunk accounting, reopen receipts/reference digests, measurement and verification scripts, and validation summaries.Base64 part 1
DecisionNerd commentedon Sep 30, 2026
Raw #1623 S22 evidence, part 2/4. XZ bundle SHA-256
ea99531de93003dad71a35d32df4f3cbd84dc80c8a57072613acf91b450da907; part SHA-256fbed521886df2b03c03dcef42bc53d7ca088c1a0a3ef1092b6b58106805f0e63. Concatenate decoded parts in numeric order, verify the bundle digest, then XZ-decompress to JSON. Per-file SHA-256 values are inside the bundle. Includes original five receipts, complete sampled host/process evidence, input checks, chunk accounting, reopen receipts/reference digests, measurement and verification scripts, and validation summaries.Base64 part 2
DecisionNerd commentedon Sep 30, 2026
Raw #1623 S22 evidence, part 3/4. XZ bundle SHA-256
ea99531de93003dad71a35d32df4f3cbd84dc80c8a57072613acf91b450da907; part SHA-25624494d2e3c89e2a74637b1bab523497a18c1a2d9f88a74d850f5fea71e3b43a5. Concatenate decoded parts in numeric order, verify the bundle digest, then XZ-decompress to JSON. Per-file SHA-256 values are inside the bundle. Includes original five receipts, complete sampled host/process evidence, input checks, chunk accounting, reopen receipts/reference digests, measurement and verification scripts, and validation summaries.Base64 part 3
DecisionNerd commentedon Sep 30, 2026
Raw #1623 S22 evidence, part 4/4. XZ bundle SHA-256
ea99531de93003dad71a35d32df4f3cbd84dc80c8a57072613acf91b450da907; part SHA-25600380f150fdedd71e9323ba6dac6c39b8e206fce30bb5a87832c68cf600c3e1e. Concatenate decoded parts in numeric order, verify the bundle digest, then XZ-decompress to JSON. Per-file SHA-256 values are inside the bundle. Includes original five receipts, complete sampled host/process evidence, input checks, chunk accounting, reopen receipts/reference digests, measurement and verification scripts, and validation summaries.Base64 part 4
DecisionNerd commentedon Sep 30, 2026
S22 attribution completed on stock source
13480cadb1b8e810d4809cbce507703b578eb709(2026-09-30). PR #1652 exposes the import capture, observed SHA bytes/intervals and barrier calls in/2receipts; it attributes existing behavior.Run identity:
OVHC-AGENCY, Ryzen 7 3800X (8 physical / 16 logical CPUs, affinity 0–15), 125 GiB RAM, 878 GiB ext4 NVMe, kernel7.0.0-30-generic. Stock releasegfSHA-2562123b82a9e0a544507ad127e3a5760535d70a1d8c3b991834e7d7c7490c605c5, no custom/test features. Inputs are the same S22 files: nodesbcbcbea526e61ceb63f6006ee5f56de6bb4f74cffdd68dc6eff6d230d3897f06, edges1c0ff75485f75e904cbd59b6f5d42da1d8b1af6ddac59ee6c495a4948a428d13;sha256sum --checkpassed both. Commands and scripts are in the raw bundle below; the repository method isdocs/development/ingest-region-diagnostics.md.After sync and dropping caches, 13 five-second samples over 60 seconds passed the quiet policy: mean 0.068282 busy cores (limit 0.2), maximum 0.181417 (limit 0.5). During the run, 96 five-second process/CPU samples recorded no compiler or external GF process; own GF processes descend from the recorded runexec PID. Sampling cannot exclude activity between samples. No local build overlapped the run.
runexec --no-container --cores 0-15 driver.shreturned 0. Complete begin → register nodes → register edges → stage+seal → commit: 473.260492080 s wall, 556.998842 s CPU, 1.176939 effective cores, 11,016,183,808 B peak memory, 141,801.112 edges/s. At 1M edges/s the budget is 67.108864 s; this run consumes 705.2131% of it. #1387's floor remains unmet. This tree differs from the earlier 363.244 s run and observer overhead is unquantified; no matched speedup/regression claim is made.Root totals: 98,309,569,533 hashed bytes; 344,536 attempted file/directory barriers; 59,327,112,634 write-syscall bytes. Summed SHA update/finalize intervals are 78.315830091 s and barrier intervals 177.261520697 s. These intervals can overlap across workers and are neither process CPU nor critical-path wall time. Written bytes are Linux
wchar, not disk writeback or logical artifact size.Inclusive command/selected region table (parents overlap; do not sum these rows). CPU/wall is effective cores; 10 ms CPU resolution can dominate very short regions.
import_command/begin_import/manifest_persistenceimport_command/register_parquet/checkpoint/manifest_persistenceimport_command/register_parquet/checkpoint/manifest_persistenceimport_command/stage+sealimport_command/stage+seal/append_edgesimport_command/stage+seal/append_nodesimport_command/stage+seal/manifest_persistenceimport_command/stage+seal/normalizationimport_command/stage+seal/open_construction/manifest_persistenceimport_command/stage+seal/sealimport_command/stage+seal/seal/canonical_encodingimport_command/stage+seal/seal/canonical_encoding/membership_encodingimport_command/stage+seal/seal/checkpoint/manifest_persistenceimport_command/stage+seal/seal/shapingimport_command/stage+seal/source_readimport_command/commitimport_command/commit/checkpoint/manifest_persistenceimport_command/commit/publish/generation_commit/hydrationimport_command/commit/publish/prepare_encodingAll five command trees reconcile exactly by summing their residual rows: difference 0 for wall, CPU, write bytes, hash bytes, hash intervals, barrier calls and barrier intervals. Command roots sum to 473.101000198 s; outer workflow wall residual is 0.159491882 s. Workflow CPU minus root CPU is +0.178842 s, reported separately. No inclusive rows were summed together. Full disjoint residual table:
import_command/begin_importimport_command/begin_import/manifest_persistenceimport_commandimport_command/register_parquetimport_command/register_parquet/checkpointimport_command/register_parquet/checkpoint/manifest_persistenceimport_command/resume_importimport_commandimport_command/register_parquetimport_command/register_parquet/checkpointimport_command/register_parquet/checkpoint/manifest_persistenceimport_command/resume_importimport_commandimport_command/resume_importimport_command/stage+sealimport_command/stage+seal/append_edgesimport_command/stage+seal/append_edges/fsyncimport_command/stage+seal/append_nodesimport_command/stage+seal/append_nodes/fsyncimport_command/stage+seal/manifest_persistenceimport_command/stage+seal/normalizationimport_command/stage+seal/open_constructionimport_command/stage+seal/open_construction/fsyncimport_command/stage+seal/open_construction/lock_waitimport_command/stage+seal/open_construction/manifest_persistenceimport_command/stage+seal/sealimport_command/stage+seal/seal/canonical_encodingimport_command/stage+seal/seal/canonical_encoding/adjacency_encodingimport_command/stage+seal/seal/canonical_encoding/adjacency_encoding/adjacency_csrimport_command/stage+seal/seal/canonical_encoding/adjacency_encoding/adjacency_groupingimport_command/stage+seal/seal/canonical_encoding/edge_encodingimport_command/stage+seal/seal/canonical_encoding/edge_encoding/fsyncimport_command/stage+seal/seal/canonical_encoding/fsyncimport_command/stage+seal/seal/canonical_encoding/membership_encodingimport_command/stage+seal/seal/canonical_encoding/membership_encoding/fsyncimport_command/stage+seal/seal/canonical_encoding/node_encodingimport_command/stage+seal/seal/canonical_encoding/node_encoding/fsyncimport_command/stage+seal/seal/checkpointimport_command/stage+seal/seal/checkpoint/manifest_persistenceimport_command/stage+seal/seal/fsyncimport_command/stage+seal/seal/lock_waitimport_command/stage+seal/seal/seal_authenticationimport_command/stage+seal/seal/seal_authentication/fsyncimport_command/stage+seal/seal/shapingimport_command/stage+seal/seal/shaping/endpoint_resolutionimport_command/stage+seal/seal/shaping/endpoint_resolution/fsyncimport_command/stage+seal/seal/shaping/endpoint_resolution/partition_load_waitimport_command/stage+seal/seal/shaping/fsyncimport_command/stage+seal/seal/shaping/runtime_catalogimport_command/stage+seal/seal/shaping/runtime_catalog/fsyncimport_command/stage+seal/seal/shaping/shape_completionimport_command/stage+seal/seal/shaping/shape_completion/fsyncimport_command/stage+seal/seal/shaping/shape_family_finishimport_command/stage+seal/seal/shaping/shape_family_finish/fsyncimport_command/stage+seal/seal/shaping/shape_family_finish/partition_load_waitimport_command/stage+seal/seal/shaping/shape_planningimport_command/stage+seal/seal/shaping/shape_routingimport_command/stage+seal/seal/shaping/shape_routing/artifact_authenticationimport_command/stage+seal/seal/shaping/shape_routing/fsyncimport_command/stage+seal/seal/shaping/shape_row_finishimport_command/stage+seal/seal/shaping/surrogate_assignmentimport_command/stage+seal/seal/shaping/surrogate_assignment/fsyncimport_command/stage+seal/source_readimport_commandimport_command/commitimport_command/commit/checkpointimport_command/commit/checkpoint/manifest_persistenceimport_command/commit/open_constructionimport_command/commit/open_construction/fsyncimport_command/commit/open_construction/lock_waitimport_command/commit/publishimport_command/commit/publish/cas_installimport_command/commit/publish/fsyncimport_command/commit/publish/generation_commitimport_command/commit/publish/generation_commit/fsyncimport_command/commit/publish/generation_commit/hydrationimport_command/commit/publish/generation_commit/hydration/lock_waitimport_command/commit/publish/generation_commit/lock_waitimport_command/commit/publish/generation_commit/read_authorityimport_command/commit/publish/generation_commit/read_authority/lock_waitimport_command/commit/publish/prepare_encodingimport_command/commit/publish/prepare_encoding/fsyncimport_command/commit/publish/publication_authenticationimport_command/commit/publish/publication_authentication/lock_waitimport_command/commit/publish/publication_intentimport_command/commit/publish/publication_intent/fsyncimport_command/commit/publish/publication_receiptimport_command/commit/publish/publication_receipt/fsyncimport_command/commit/publish/publication_receipt/lock_waitimport_command/resume_importimport_commandAuthentication reconciliation: the
stage+seal/seal/shaping/shape_routing/artifact_authenticationleaf hashes exactly 3,290,610,048 B across 1,088 calls. Independently retained chunk receipts have contiguous sequences 0–1087 and contain exactly 4,194,304 node rows and 67,108,864 edge rows. Sum of each chunk'sparquet.bytesequals the observed leaf; difference 0 B, tolerance 0 B. Other source/intermediate hashing has different populations and is not asserted removable.Priority adjudication for #735: move #1617 to position 1 alongside #1621, and record it as a #1387 prerequisite. The largest residual regions are shape_routing 87.120253283 s, append_edges 79.317535077 s and edge_encoding 39.567895083 s. A statically verified nonoverlapping, caller-thread SHA subset totals 41.760542759 s: append_edges 16.636100402; node_encoding 6.056147435; edge_encoding 12.302647417; membership_encoding 2.282813144; generation_commit residual 4.482834361. It exceeds the third-largest residual wall by 2.192647676 s. Normalization completes before the append callback; membership completes before Parquet workers start; workers only compress and the caller hashes; lanes drain/join before encoding scopes finish; shaping joins before encoding; stage and commit are separate sequential commands. Nested hydration is excluded from generation_commit residual. This establishes the hashing mechanism's priority, not an achievable speedup or the removable classification of its digests.
Compatibility: measured outcomes and region names use
stage+seal; the CLI commandvalidate, durableValidatedstate/binding labels, and historical/1fixtures retain their existing consumers as documented. No new receipt describes the measured phase as validation.Validation: full
make pre-pushpassed atb8a1c7e083using isolated worktree cache, including Rust/native tests, Python 157 passing, Node 118 scenarios/443 steps, and coverage thresholds (Rust patch 227/235 = 96.60%, Python wrapper 98.37%, Node wrapper 100%). Its first run found an untracked local checklist; the checklist was moved outside the source tree and the supported same-source resume passed, preserving the source-ledger requirement. The subsequent13480cadbmerge changes only CI/policy files;git diff b8a1c7e083..13480cadb -- crates Cargo.toml Cargo.lock benchmarksis empty. Formatting,make pre-push-fast, CI storage policy and property-overlay contract checks passed at that final head. Exact-head CI run 36670775354 passed including CI Gate. Final real tiny and SCALE6–8 growth certification passed with rebuilt stock CLI/certifier/generator. Independent reviewers verified current code, observation semantics, exact chunk reconciliation and host provenance; CodeRabbit CLI authentication was unavailable, so no CLI pass is claimed.Reopen proof:
bash verify.sh project verify-v2returned 0. Counts are 4,194,304 nodes / 67,108,864 edges. Complete node and edge scans returned those row counts. All fourresult_sha256values match the retained reference exactly: nodes15563dc5ecd48bd37d48ccfe0da1d66be7da3fd4dd8c79d2d064e78657a0d228; node scan05cfd80300aa02d4247db5b4b45977f4dfa3862b9e8050dbd0799b794eded2b5; edges979e01bd5c8760c4e606da882ea550a6711605f6d555f64a9ae6e431789cb2fc; edge scan73e049c3aa7a21212036075959cdf3ffc9fcb27acb7931f91009b29f7bfeac4c. The original helper tried Arrow IPC on default Parquet output; that failed helper/output was preserved, corrected to assert/read Parquet, and verification rerun. The engine count command had succeeded throughout. Independent review confirmed all four final matches.Raw evidence is attached as a lossless XZ-compressed JSON bundle (55 files), with base64 binary parts in numeric order:
b8bb1ab8852d233ade1750c974ae7add99ca53255e834677bbb25e9c21a2cbb7.fbed521886df2b03c03dcef42bc53d7ca088c1a0a3ef1092b6b58106805f0e63.24494d2e3c89e2a74637b1bab523497a18c1a2d9f88a74d850f5fea71e3b43a5.00380f150fdedd71e9323ba6dac6c39b8e206fce30bb5a87832c68cf600c3e1e.Concatenate decoded parts, verify compressed SHA-256
ea99531de93003dad71a35d32df4f3cbd84dc80c8a57072613acf91b450da907, thenlzma.decompressand parse JSON. Uncompressed JSON SHA-256e5b22ccef1be582c5ba019d0f4734cd45e7d4cb4ae95a367001dd619cf7371cf. Thefilesmapping contains original text andfile_sha256its per-file digests. A download/decode/decompress/per-file digest round trip against all posted comments passed. Local source worktrees and original receipts remain intact.DecisionNerd commentedon Sep 30, 2026
PR #1652 merged into main as
edc91bc9e3e374cf4b01fecd2ef8a138570bcb70at 2026-09-30T05:49:44Z. Exact-head PR CI 36670775354 and merge-group CI 36673850259 both passed CI Gate. The squash commit is verified on main. All five acceptance outcomes are met by the S22 tables/raw bundle/reopen evidence and #735 priority adjudication; #1387 remains blocked by #1617 with its ingest floor unchanged. Only #1623 is the PR closing reference.fix(storage): name the cross-volume TMPDIR requirement when hydration…
observe(ingest): report per-region hashes, writes, and barriers (Cura…