Repository navigation
Description
Problem
A correct-by-construction I/O architecture is not complete until its guarantees are checked at the right layers. Right now the repo has important verification assets, but they are not yet assembled into one deliberate architecture-level strategy.
This issue is the full verification and performance-validation track for the architecture umbrella.
Desired end-state
- architecture-level protocol/lifecycle rules are modeled where they should be model-checked
- local pure invariants are proved where proof pays off
- stateful correctness properties are exercised with proptest and deterministic integration tests
- distributed and crash/recovery behavior are exercised in Turmoil
- OTLP wire semantics are checked by loopback and oracle-style tests
- benchmark validation protects the architecture's performance goals
- non-core pure seams have an explicit Kani boundary contract so reviewers and CI can tell which files are proof-required, recommended, or exempt
Scope
1. TLA+
- update or extend specs for the protocol/lifecycle rules that must hold independent of implementation shape
2. Kani / local proofs
- prove local pure invariants and transition helpers where proof materially reduces risk
- define the repo contract for Kani-targetable pure seams outside
logfwd-core - add file/module-level proof expectations and exemption taxonomy for async/IO-heavy seams
- add a machine-readable Kani boundary manifest and fast CI checker so proof-required files do not drift silently
3. Proptest / stateful testing
- add randomized stateful tests where file lifecycle, retries, or boundary sequences are hard to cover exhaustively by hand
4. Turmoil / fault simulation
- expand deterministic faulted end-to-end scenarios for the final architecture
5. OTLP loopback + oracle
- sink->receiver loopback semantic equivalence
- otelcol differential checks at the right CI tier
6. Benchmark validation
- component-level throughput/latency validation with disciplined benchmark methodology
Design stance
Verification should match the seam. We should not force one technique everywhere, and we should not claim architecture guarantees without naming how they are enforced.
For Kani specifically: prefer semantic local pure modules first, promote to seam folders when the domain grows, and do not centralize all proof-worthy logic into one shared crate or one blanket pure/ tree.
Relationships
Depends conceptually on:
- File tailer refactor — split monolith, typestate, per-file correctness #1310 tailer architecture
- OTLP receiver refactor — axum, streaming decompression, unified receivers #1311 receiver architecture
- Output delivery contract — retry, reject, checkpoint, fanout #1312 exporter semantics
- File appender output — new component with rotation, cleanup, path templates #1313 file appender
Relates to:
- IO_CONTRACTS.md — living contract for I/O and control-plane semantics #1303
IO_CONTRACTS.md - I/O correctness refactor — correct by construction, not by patch #1315 architecture umbrella
- Phase 7: Complete verification — TLA+ specs, simulation testing, spec-to-code alignment #895 verification umbrella
- research: I/O component refactor — library evaluation and benchmarking #1283 research
Activity
github-actions commentedon Apr 6, 2026
tl;dr: This issue needs a human decision before implementation: #1314 says checkpoint advancement should happen only on successful delivery, but current code/spec intentionally advance checkpoints on reject, and that semantic choice changes drain/liveness behavior.
Recommendation
Outcome B — Needs human decision.
What's unclear
Options
Recommendation
I recommend Option 1 + Option 3: keep reject-advances-checkpoint semantics (already codified in Rust and TLA), and split/gate appender-dependent verification behind #1313. Please add label
needs-decision.Findings
crates/logfwd/src/pipeline.rs:977-983success=falsepath usesticket.reject()thenmachine.apply_ack(receipt)tla/README.md:179-189tla/PipelineBatch.tla:18-19RejectAdvancesCheckpointcrates/logfwd-config/src/lib.rs:759-763crates/logfwd-output/src/lib.rs:669-671.github/workflows/ci.yml:290.github/workflows/ci.yml:323-333ShutdownProtocolandPipelineBatchTLC jobs run in CI.github/workflows/bench.yml:167,174continue-on-errorand--mode binarycrates/logfwd-io/tests/it/transport_e2e.rs:428-490Verification
I validated the key claims with direct repository commands:
Detailed Action Plan (post-decision)
tla/README.md:179-189tla/PipelineBatch.tla:18-19crates/logfwd/src/pipeline.rs:977-983crates/logfwd-io/tests/it/.continue-on-error) for I/O verification suite — TLA+, Turmoil, loopback, otelcol oracle, benchmarks #1314 target metrics.Related Items
crates/logfwd/src/pipeline.rs:967-995tla/PipelineBatch.tla:14-26.github/workflows/bench.yml:152-176continue-on-error, binary mode).Note
🔒 Integrity filtering filtered 15 items
Integrity filtering activated and filtered the following items during workflow execution.
This happens when a tool call accesses a resource that does not meet the required integrity or secrecy level of the workflow.
issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)search_pull_requests: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)list_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)pull_request_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".)What is this? | From workflow: Issue Triage
Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.
strawgate commentedon Apr 6, 2026
Updated this issue to represent the full verification/performance-validation track for the architecture umbrella, not just a grab-bag of extra tests. The focus is now explicit: verification matched to the seam and tied to the final I/O architecture.
strawgate commentedon Apr 6, 2026
Following the pure-function-isolation fan-in, verification ownership is now split into one explicit policy batch plus several local-seam extraction batches:
This should make the verification story more operational: reviewers and CI can tell which files are Kani-required, while implementation slices stay local to the owning crates.
strawgate commentedon Apr 10, 2026
Queued low-conflict verification execution work-units:
These were intentionally scoped away from current high-conflict open PR surfaces (#1764/#1759/#1753/#1738/#1733).
strawgate commentedon Apr 10, 2026
Tightened execution scopes and proof gates on child work-units for first-pass quality:
These are now strict enough to assign without additional interpretation drift.
strawgate commentedon Apr 11, 2026
Partial-resolution status update (April 11, 2026):
Recent verification slices landed under this scope:
Recommendation:
strawgate commentedon Apr 11, 2026
Queued next Turmoil bug-finding wave (post-PR #1809 merge):
I can take this as the next branch as soon as #1809 is merged.
strawgate commentedon Apr 24, 2026
Deep-Dive Research: I/O Verification Suite
Current State (Code-Verified)
Rich verification already exists:
RuntimeBarrierEventenum with PipelinePhase, BatchSubmitted, AckApplied, etc. Entireinput_pipeline.rshascfg(not(feature = "turmoil"))guardslogfwd-bench/benches/bench/scenarios/Gaps
Recommended Phase 1: Loopback Harness
ArrowIpc output + ArrowIpc input already exist. Loopback test: Generator → pipeline → ArrowIpc output → ArrowIpc receiver → validate batch equality. Zero external dependencies.
Complexity: XL (meta across TLA+, Turmoil, loopback, oracle, benchmarks)