Skip to content

feat(daemon): changed_since USN-delta RPC + nightly-CI fixes + full dependency refresh - #600

Merged
githubrobbi merged 8 commits into
mainfrom
feat/usn-changed-since-rpc
Aug 22, 2026
Merged

feat(daemon): changed_since USN-delta RPC + nightly-CI fixes + full dependency refresh#600
githubrobbi merged 8 commits into
mainfrom
feat/usn-changed-since-rpc

Conversation

@githubrobbi

Copy link
Copy Markdown
Collaborator

What this PR carries

The feature: changed_since — USN-journal delta as first-class daemon surface

The daemon owns live volume access and the journal loops; this RPC lets any client ask which files changed on this drive since my cursor, answered from the NTFS USN journal instead of a full index or MFT sweep. Honest cursor contract: bootstrap / recreated journal / wrapped cursor come back complete: false with a fresh cursor and zero fabricated delta. Bounded paging (read_usn_journal_bounded, batch-aligned resume cursor). Read-only operator probe: uffs --daemon changed-since <DRIVE>. First consumer: uffs-content watermark jobs (delta enumeration + targeted snapshot record reads), landing with the products pin bump after this ships.

Nightly-CI triage (#597)

  • Fuzz crash fixed: parse_record panicked on a truncated attribute header (range end index 100 out of range for slice of length 98). Both unguarded slice sites in attribute_helpers.rs now bounds-check via get(); the crash input is committed as a fuzz corpus seed and a unit regression test (verified to panic without the fix).
  • decrypt_cache mutation gaps killed: six surviving mutants from the advisory cargo-mutants run now each have a boundary-shaped test; scoped re-run shows crypto.rs at 35 caught / 0 missed.
  • The mutants job itself stays advisory by design (documented no-baseline rollout).

Security & supply chain

  • h2 0.4.18 clears RUSTSEC-2026-0258 (trusted-publisher vetted, publisher proof in imports.lock — no exemption).
  • Five from_utf8_lossy-feeding-a-decision sites remediated (2 strict-parse fixes, 3 documented AUDIT-OK(bytes)); the anti-pattern gate is green on a clean tree again.
  • Every dependency at latest with 25 real delta audits certified into audits.toml (concrete notes per crate; zero new exemptions — the exemption count went down). Folds the weekly vet-import refresh (chore(security): weekly cargo-vet import refresh #598) and the GH-Actions bumps (ci(deps): bump the github-actions group with 2 updates #599).
  • The one deliberate hold, re-verified today: reqwest stays 0.12 — 0.13 still costs the ~63k-line Android JNI vet surface for a target we never ship, and polars-io remains on the 0.12 line (a bump would compile two TLS stacks into one binary). Rationale refreshed in Cargo.toml.

Validation

just go fully green (2458 tests), workspace-wide cargo xwin clippy -D warnings clean for x86_64-pc-windows-msvc, cargo deny/audit/vet all passing, vet audit-discipline gate exit 0 over the whole range.

Closes #597
Supersedes #598
Supersedes #599

githubrobbi and others added 8 commits August 21, 2026 18:36
…emon surface

The daemon owns live volume access and the journal loops; this RPC lets
any client ask it the incremental question directly — which files
changed on this drive since my cursor — answered from the NTFS USN
journal instead of a full index or MFT sweep.

Cursor contract (uffs-client::protocol::response_journal): a cursor is
(journal_id, usn). Bootstrap, a recreated journal, or a wrapped cursor
come back complete=false with a fresh cursor and zero fabricated delta —
the caller must run its own full pass before trusting deltas again. A
valid cursor gets the aggregated per-FRS delta, paged by a bounded
journal read (truncated=true → continue from next_usn).

- uffs-mft: read_usn_journal_bounded (batch-aligned resume cursor,
  exhaustion flag); read_usn_journal now a thin uncapped wrapper
- uffs-daemon: changed_since handler on the blocking pool; strict param
  validation (missing drive is rejected, never defaulted to bootstrap);
  262,144-record per-call cap
- uffs-client: ChangedSinceParams/Response wire types + changed_since()
  sync method, with round-trip and defaults tests
- uffs-cli: read-only probe `uffs --daemon changed-since <DRIVE>
  [--journal-id N --since-usn N --max-records N]` (exempt from the
  elevation gate) so the capability is field-testable in two commands;
  parse tests included
- docs: daemon.md command table + changed-since section

First consumer: uffs-content watermark jobs (delta enumeration against
the resident daemon + targeted snapshot record reads) — lands with the
uffs-products pin bump after this ships.
cargo update -p h2 (0.4.15 -> 0.4.18); 0.4.18 is covered by the
existing trusted-publisher vet record (seanmonstar, safe-to-deploy) and
imports.lock records the crates.io publisher proof — no exemption
added. cargo deny advisories ok, cargo vet succeeded.
The gate was red on a clean tree — five lossy conversions feeding
decisions had landed since the rule (masked by the pipeline's resumable
step cache). Each gets the remedy the data deserves, not a blanket
exemption:

- watchdog status_snapshot: STRICT parse — the payload is JSON (UTF-8
  by spec) from our own binary; invalid UTF-8 now reads as unknown
  instead of replacement characters feeding the JSON parse
- resident gui_domain (macOS): STRICT parse — the uid feeds a launchctl
  target; fail loudly rather than aim at a lossy-mangled domain
- resident watchdog_running: AUDIT-OK(bytes) — ASCII needle survives
  lossy byte-exact; strict parse of tasklist's console-codepage output
  would false-negative and double-spawn the watchdog
- resident run_tool error text: AUDIT-OK(bytes) — display-only stderr
- system_status process scan: AUDIT-OK(bytes) — ASCII CSV fields with
  per-line strict parses; whole-buffer strict would discard the entire
  scan over one console-codepage byte
Scheduled weekly refresh of supply-chain/imports.lock
from upstream audit sources (Mozilla, Google, Bytecode
Alliance, ISRG, Zcash).

See .github/workflows/cargo-vet-refresh.yml for
rationale and docs/architecture/security/
supply-chain-posture.md for the full supply-chain
posture.
Bumps the github-actions group with 2 updates: [github/codeql-action/init](https://github.com/github/codeql-action) and [github/codeql-action/analyze](https://github.com/github/codeql-action).


Updates `github/codeql-action/init` from 4.37.6 to 4.37.7
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@5595cca...ff2f1c6)

Updates `github/codeql-action/analyze` from 4.37.6 to 4.37.7
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@5595cca...ff2f1c6)

---
updated-dependencies:
- dependency-name: github/codeql-action/init
  dependency-version: 4.37.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/analyze
  dependency-version: 4.37.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
The 2026-08-17 Tier 2 nightly fuzzer crashed parse_record on a 98-byte
record whose final attribute header is cut mid-field: the $FILE_NAME
value-offset read at bytes 20..22 of the attribute sliced past the end
of the buffer ('range end index 100 out of range for slice of length
98', crash-202ec813…). Same latent hazard in parse_data_attribute_full's
resident value-length read (bytes 16..20).

Both now slice with get() and treat truncation as the malformed-record
path, matching parse_standard_info_full's existing hardening. The crash
input is committed as a fuzz corpus seed (replayed by every nightly) and
as a unit regression test, which was verified to panic without the fix
and pass with it.

Part of #597 (the workflow-failing half; the cargo-mutants job in that
run is advisory by design, pending its documented baseline).
… mutants run

The 2026-08-17 advisory cargo-mutants run showed six surviving
mutations in decrypt_cache's size-gate arithmetic (192:19 < → ==/<=,
192:36 + → -, 228:44 + → -, 255:46 + → -, 256:19 < → >). Each now has
a boundary-shaped test asserting the SPECIFIC behavior that
distinguishes the real operator from its mutation:

- a buffer of exactly the 44-byte v1 minimum passes the size gate
  (fails later at GCM auth, never 'too short')
- under-minimum v1/v2 buffers are rejected BY the size gates, with
  their messages — not by later header parses
- a one-byte-truncated real ciphertext reports 'truncated'
- trailing bytes after a valid ciphertext still decrypt (exact slices)

Verified with a scoped local run: crypto.rs now 37 mutants tested,
35 caught, 2 unviable, zero missed. Also gitignores local mutants.out
artifacts. Part of the #597 triage.
…ll of it

cargo update across the workspace: aes-gcm 0.11.1, blake3 1.8.7 (drops
the arrayref dependency entirely), darling 0.24.1, either 1.18.0,
fast-float2 0.2.4, the ICU4X 2.3 train (a provenance/soundness pass:
Box transmutes replaced with into_raw/from_raw casts throughout),
quinn-proto 0.11.17 (congestion-overflow + reassembler DoS hardening),
rmcp 3.1.4 (secret redaction, response-id correlation, probe timeout),
rustls-webpki 0.103.15, uuid 1.24.1, and friends.

Every delta was reviewed and certified into supply-chain/audits.toml
with concrete notes — 25 audits, zero new exemptions (the count went
DOWN via the folded weekly import refresh). fast-float2's new GetAt
indexing verified checked-by-default (the no-panic feature is not
enabled anywhere in our tree).

The one deliberate hold, re-verified today against 0.13.4: reqwest
stays on 0.12 — 0.13 still routes system trust through
rustls-platform-verifier (the ~63k-line Android JNI stack cargo-vet
would audit for a target we never ship), and polars-io through 0.55.2
stays on the 0.12 line, so bumping would compile two reqwest/TLS
stacks into the same binaries. Rationale refreshed in Cargo.toml.

Vet-Reviewed-Diff: ref-cast-impl@1.0.26->1.0.27
Vet-Reviewed-Diff: darling_macro@0.24.0->0.24.1
Vet-Reviewed-Diff: rmcp-macros@3.1.2->3.1.4
Vet-Reviewed-Diff: libredox@0.1.19->0.1.20
Vet-Reviewed-Diff: zerovec-derive@0.11.5->0.11.6
Vet-Reviewed-Diff: uuid@1.24.0->1.24.1
Vet-Reviewed-Diff: rustls-webpki@0.103.14->0.103.15
Vet-Reviewed-Diff: ref-cast@1.0.26->1.0.27
Vet-Reviewed-Diff: potential_utf@0.1.5->0.1.6
Vet-Reviewed-Diff: aes-gcm@0.11.0->0.11.1
Vet-Reviewed-Diff: darling_core@0.24.0->0.24.1
Vet-Reviewed-Diff: darling@0.24.0->0.24.1
Vet-Reviewed-Diff: tinystr@0.8.3->0.8.4
Vet-Reviewed-Diff: litemap@0.8.2->0.8.3
Vet-Reviewed-Diff: zerotrie@0.2.4->0.2.5
Vet-Reviewed-Diff: pkg-config@0.3.33->0.3.34
Vet-Reviewed-Diff: either@1.17.0->1.18.0
Vet-Reviewed-Diff: blake3@1.8.6->1.8.7
Vet-Reviewed-Diff: fast-float2@0.2.3->0.2.4
Vet-Reviewed-Diff: quinn-proto@0.11.16->0.11.17
Vet-Reviewed-Diff: writeable@0.6.3->0.6.4
Vet-Reviewed-Diff: icu_collections@2.2.0->2.3.0
Vet-Reviewed-Diff: icu_normalizer_data@2.2.0->2.3.0
Vet-Reviewed-Diff: icu_locale_core@2.2.0->2.3.0
Vet-Reviewed-Diff: icu_provider@2.2.0->2.3.1
Vet-Reviewed-Diff: zerovec@0.11.6->0.11.8
Vet-Reviewed-Diff: icu_properties@2.2.0->2.3.0
Vet-Reviewed-Diff: icu_properties_data@2.2.0->2.3.0
Vet-Reviewed-Diff: icu_normalizer@2.2.0->2.3.0
Vet-Reviewed-Diff: rmcp@3.1.2->3.1.4
@githubrobbi
githubrobbi added this pull request to the merge queue Aug 22, 2026
Merged via the queue into main with commit deccbe4 Aug 22, 2026
23 checks passed
@githubrobbi
githubrobbi deleted the feat/usn-changed-since-rpc branch August 22, 2026 04:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🔴 CI Failure: Tier 2 Nightly CI — 74faefd

1 participant