Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
d977d37
docs(architecture): add reqwest 0.12 to 0.13 migration plan
githubrobbi Jul 14, 2026
ed29eea
feat(winget): winget-av-submit helper + Defender FP early-warning
githubrobbi Jul 14, 2026
cb02ed6
fix(core): stop uffsd crash on multi-extension --ext filters + close …
githubrobbi Jul 15, 2026
9531faf
fix(client): make await_ready resilient to heavy-load daemon startup
githubrobbi Jul 15, 2026
099b595
feat(content): scaffold uffs-content + uffs-content-protocol crates
githubrobbi Jul 16, 2026
a23a2a1
feat(content-protocol): codec, error taxonomy, state machines, lossless
githubrobbi Jul 16, 2026
8d8c12f
feat(content-protocol): frame envelope + all 12 frame payload types (…
githubrobbi Jul 16, 2026
07fe584
test(content-protocol): golden fixture conformance corpus (UFI.0)
githubrobbi Jul 16, 2026
c7ba77e
feat(content-reader-protocol): new crate for Coordinator<->Reader IPC…
githubrobbi Jul 16, 2026
56f43dc
feat(broker-protocol): Snapshot Manager wire protocol (UFI.1)
githubrobbi Jul 16, 2026
4950335
feat(content): durable SQLite job/failure-bucket ledger (UFI.0)
githubrobbi Jul 16, 2026
eee0317
refactor(content): replace SQLite job database with ephemeral run state
githubrobbi Jul 16, 2026
a388258
feat(content): job workflow + fast dir-walk parity harness (UFI.0/§9.5)
githubrobbi Jul 16, 2026
22bcb6b
feat(broker): UFI.1 snapshot lease lifecycle manager
githubrobbi Jul 16, 2026
9b67b5a
feat(vss-requestor): per-run native VSS snapshot helper (UFI.1)
githubrobbi Jul 16, 2026
4952993
feat(broker): wire uffs-vss-requestor into the Broker's Snapshot Manager
githubrobbi Jul 16, 2026
c9104ff
test(broker): add real elevated end-to-end VSS snapshot round-trip test
githubrobbi Jul 16, 2026
5dfb857
feat(broker): add --self-test-vss subcommand + rust-script smoke test
githubrobbi Jul 16, 2026
e1ad17d
fix(docs): repair three broken intra-doc links blocking the rustdoc gate
githubrobbi Jul 16, 2026
9024d88
fix(broker): quote helper command-line args correctly, stamp vss-requ…
githubrobbi Jul 16, 2026
aa74218
feat(broker): add live progress logging to the VSS self-test round trip
githubrobbi Jul 16, 2026
784ec60
fix(scripts): stream the broker's live output instead of buffering it
githubrobbi Jul 16, 2026
fa4d67e
feat(scripts): add a bounded timeout to the VSS smoke-test wrapper
githubrobbi Jul 16, 2026
57b687c
feat(scripts): add a live helper-process watchdog, drop timeout to 30s
githubrobbi Jul 16, 2026
fe7de69
fix(vss-requestor): drop DeleteSnapshots, use auto-release for delete…
githubrobbi Jul 16, 2026
a2298d3
feat(vss-requestor): add file-based debug log for the delete-path hang
githubrobbi Jul 16, 2026
f592aae
feat(vss-requestor): bracket writeln! and flush separately in write_e…
githubrobbi Jul 16, 2026
7469c76
fix(vss-requestor): fix the actual named-pipe deadlock (Ping too, not…
githubrobbi Jul 16, 2026
2fb094c
feat(broker): make Ping/Pong a real, tested wire round trip
githubrobbi Jul 16, 2026
8f1568a
fix(vss-requestor): gate the debug log off by default, cap its size
githubrobbi Jul 16, 2026
2a90507
feat(broker): add a real Failed-path check to --self-test-vss
githubrobbi Jul 16, 2026
5b1756c
feat(content): real VSS snapshot + privileged Reader content pipeline
githubrobbi Jul 17, 2026
02b4abc
fix(rustdoc): de-link cross-platform doc comments pointing at Windows…
githubrobbi Jul 17, 2026
3387604
fix(broker): surface Snapshot Manager pipe failures instead of swallo…
githubrobbi Jul 17, 2026
039bb82
fix(broker): fix the real Snapshot Manager pipe data-loss race + stam…
githubrobbi Jul 17, 2026
2e70aa5
feat(content): widen JobRequest's filter surface + add a real-corpus …
githubrobbi Jul 17, 2026
261616a
fix(content): tolerate ACL-locked directories in the query-metadata g…
githubrobbi Jul 17, 2026
34779a3
feat(content): show exactly which paths differ on a query-metadata co…
githubrobbi Jul 17, 2026
ab37041
chore(content): dump the exact daemon query/response + fix a path-for…
githubrobbi Jul 17, 2026
e80c4e2
fix(content): dedup search rows by (file_reference, path) before buil…
githubrobbi Jul 17, 2026
1fc71df
feat(vss-requestor): retry snapshot creation with backoff on transien…
githubrobbi Jul 17, 2026
f32fca1
chore(content): remove the temp debug dumps from VssCandidateSource::…
githubrobbi Jul 17, 2026
6157aad
feat(content): add in-memory job registry for connection-blip resume
githubrobbi Jul 17, 2026
7737920
feat(content): add credit-based window/backpressure tracker
githubrobbi Jul 17, 2026
33966e3
feat(content-protocol): add JOB_RESUME frame + progress marker on HEA…
githubrobbi Jul 17, 2026
7d9a741
fix(content-protocol): FrameType::decode was missing the JobResume(13…
githubrobbi Jul 17, 2026
dff0fdf
feat(content): wire the two-pipe transport server into uffs-content
githubrobbi Jul 17, 2026
a962396
fix(content): fix RAM materialization and frame-size ceiling bugs
githubrobbi Jul 17, 2026
ac3ce0c
feat(content): JobRequest supports multiple roots, defaults to all dr…
githubrobbi Jul 17, 2026
47d06e0
feat(content): add --self-test-reader-benchmark for real content-read…
githubrobbi Jul 17, 2026
2cd57e4
feat(content-reader): serve multiple concurrent pipe connections
githubrobbi Jul 17, 2026
3cd5c65
feat(content): reader client opens one connection per leased drive
githubrobbi Jul 17, 2026
f923b73
feat(content): read candidates concurrently, one batch per drive count
githubrobbi Jul 17, 2026
62a8f51
fix(content): skip VSS-unsupported drives instead of aborting the job
githubrobbi Jul 17, 2026
28ce05a
feat(content): wire a real tracing subscriber + instrument the job pi…
githubrobbi Jul 17, 2026
a4085f7
fix(logging): surface ephemeral uffsd's own logs + version-at-startup
githubrobbi Jul 17, 2026
064e8f2
feat(cli): --self-test-reader-benchmark uses --drive, not a positiona…
githubrobbi Jul 17, 2026
b747df7
fix(cli): reject a second bare positional in --self-test-reader-bench…
githubrobbi Jul 17, 2026
276c12f
feat(content): log the exact search JSON + first 20 raw rows per root
githubrobbi Jul 17, 2026
0e694ba
fix(mft): read_all_index no longer silently reads the live volume
githubrobbi Jul 17, 2026
a36eb1c
fix(mft): get_mft_extents no longer reads the live $MFT's layout
githubrobbi Jul 17, 2026
a770164
fix(mft): gate two more live-volume-path accesses on is_live_letter
githubrobbi Jul 18, 2026
5c0ff5d
fix(daemon): ephemeral instances no longer auto-discover live drives
githubrobbi Jul 18, 2026
0d7592b
perf(content): drive-type-aware content-read concurrency
githubrobbi Jul 18, 2026
b55ca8d
perf(content): sliding-window pipeline replaces fixed-batch content r…
githubrobbi Jul 18, 2026
be6f23b
feat(content): enforce consumer-requestable content-delivery ceiling
githubrobbi Jul 18, 2026
2d97a60
feat(content): populate JOB_BEGIN snapshot provenance from the real V…
githubrobbi Jul 18, 2026
1b479e7
feat(content-protocol): reject a mismatched protocol_version explicitly
githubrobbi Jul 18, 2026
6700e66
test(content-protocol): add a full job-stream replay fixture
githubrobbi Jul 18, 2026
067bb62
fix(mft): re-open the correct device path in the write-protect fallback
githubrobbi Jul 18, 2026
0975005
feat(content-protocol): add FrameStreamReader + explicit wire-layout …
githubrobbi Jul 18, 2026
cd1364a
fix(content): stop a silent single-candidate hang, add real progress …
githubrobbi Jul 18, 2026
45f4d0b
fix(content): shorten stall threshold, add upfront notably-large-file…
githubrobbi Jul 18, 2026
a7bc3aa
fix(content): bound the sliding-window pipeline's reorder-buffer memory
githubrobbi Jul 18, 2026
7edfec7
feat(content): log consumer-facing pipe throughput in the progress he…
githubrobbi Jul 18, 2026
bb8a5bd
perf(content): raise DEFAULT_MAX_CHUNK_BYTES 64KB -> 1MiB
githubrobbi Jul 18, 2026
b35e11c
fix(content): pin connection + cache file handle per candidate read
githubrobbi Jul 18, 2026
43b7bea
fix(client): carry file_reference through the shmem search-result cha…
githubrobbi Jul 19, 2026
d6baf90
chore(diag): add FRS-vs-physical-layout correlation checker
githubrobbi Jul 19, 2026
afc9736
chore(diag): rewrite FRS-vs-LCN checker as rust-script, not PowerShell
githubrobbi Jul 19, 2026
8f53501
chore(diag): compare natural/FRS/oracle-LCN seek distance in FRS checker
githubrobbi Jul 19, 2026
f35c584
chore(diag): add block-sampling mode to FRS/LCN checker
githubrobbi Jul 19, 2026
82d559a
fix(diag): fix bytes/cluster parsing in FRS/LCN checker's MiB conversion
githubrobbi Jul 19, 2026
5e2a731
feat(daemon): resolve true physical location (LCN) for content-read jobs
githubrobbi Jul 19, 2026
6c7afda
feat(client): add --resolve-lcn-order diagnostic CLI flag
githubrobbi Jul 19, 2026
d84ad7b
fix(content): run all lease runs (drives) concurrently, not sequentially
githubrobbi Jul 19, 2026
ae3c2e9
feat(diag): add raw-throughput floor + fragmentation diagnostics
githubrobbi Jul 19, 2026
0186659
fix(diag): query volume size via FSCTL_GET_NTFS_VOLUME_DATA, not GetF…
githubrobbi Jul 19, 2026
ba8076b
fix(diag): align raw-throughput zone offsets to sector boundaries
githubrobbi Jul 19, 2026
042ed9f
fix(diag): filter sparse-hole LCN sentinel from fragmentation stats
githubrobbi Jul 19, 2026
c596e5c
feat(content-reader): instrument per-file open/close timing
githubrobbi Jul 19, 2026
a903e6d
perf(content-reader): cache the volume-hint handle across candidates
githubrobbi Jul 19, 2026
d5ed621
feat(content-reader): opt-in known_logical_size skips GetFileSizeEx
githubrobbi Jul 19, 2026
9fc523f
docs: fix broken/private/redundant rustdoc intra-doc links (xwin doc)
githubrobbi Jul 19, 2026
b9a8662
fix(content-reader): raise tracing max level to debug
githubrobbi Jul 19, 2026
e6497b5
perf(content): enumerate all roots concurrently, not sequentially
githubrobbi Jul 19, 2026
2249955
docs(architecture): add UFFS filtering reference for Docenta integration
githubrobbi Jul 19, 2026
5631ff7
fix(broker): stop uffs-content-reader.exe passing as the Coordinator …
githubrobbi Jul 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,47 @@ jobs:
fi
done

# Unsigned Rust binaries recurrently trip Defender's ML heuristic, which
# blocks the winget-pkgs PR (Validation-Defender-Error) hours after the
# release. Scan the freshly-built binaries here so the risk surfaces NOW,
# in the release summary, pointing at the remediation. EARLY WARNING ONLY:
# a clean result does NOT guarantee winget passes (its cloud/ML validation
# uses fresh defs this runner may lack), and a hit never fails the release.
- name: Defender false-positive early warning
if: contains(matrix.target, 'windows')
continue-on-error: true
shell: pwsh
run: |
$mp = (Get-ChildItem "$env:ProgramData\Microsoft\Windows Defender\Platform\*\MpCmdRun.exe" -ErrorAction SilentlyContinue |
Sort-Object FullName -Descending | Select-Object -First 1).FullName
if (-not $mp) { $mp = "$env:ProgramFiles\Windows Defender\MpCmdRun.exe" }
if (-not (Test-Path $mp)) { "::notice::MpCmdRun not found; skipping Defender early-warning scan."; exit 0 }
$sig = (Get-MpComputerStatus -ErrorAction SilentlyContinue).AntivirusSignatureVersion
$dir = "target/${{ matrix.target }}/release"
$flagged = @()
Get-ChildItem "$dir/*.exe" -ErrorAction SilentlyContinue | ForEach-Object {
& $mp -Scan -ScanType 3 -File $_.FullName -DisableRemediation *> $null
if ($LASTEXITCODE -eq 2) { $flagged += $_.Name }
}
$tag = "${{ needs.release-preparation.outputs.tag }}"
if ($flagged.Count -gt 0) {
$list = $flagged -join ", "
"::warning::Defender flagged $($flagged.Count) binary(ies) [$list] (defs $sig). This release will likely hit the winget Validation-Defender-Error. Remediate with: just winget-av-submit $tag"
@(
"### 🛡️ Defender false-positive early warning",
"",
"**$($flagged.Count) binary(ies) flagged** (signature defs ``$sig``): $list",
"",
"This release will very likely trip ``Validation-Defender-Error`` on the winget-pkgs PR. Prep the WDSI false-positive submission:",
'```',
"just winget-av-submit $tag",
'```'
) | Out-File -Append -Encoding utf8 $env:GITHUB_STEP_SUMMARY
} else {
"::notice::Defender early-warning scan clean (defs $sig). Note: winget cloud/ML validation may still differ."
"### 🛡️ Defender early-warning scan: clean (defs ``$sig``)" | Out-File -Append -Encoding utf8 $env:GITHUB_STEP_SUMMARY
}

- name: Package binaries
shell: bash
run: |
Expand Down
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ build/
*.rlib
*.bin
# `*.bin` is meant to keep transient generated blobs out of git, but the
# workspace contains three INTENTIONAL committed binary assets that must
# workspace contains INTENTIONAL committed binary assets that must
# remain tracked. Without these carve-outs, release-plz aborts with
# "the working directory has uncommitted changes" because it sees these
# files as both committed AND gitignored — the same R0-pattern issue
Expand All @@ -57,6 +57,11 @@ build/
# `ipc_integration::real_mft_search` test in `uffs-daemon` cannot find
# its fixture and silently no-ops.
!tests/fixtures/**/*.bin
# uffs-content-protocol golden wire-format fixtures (frozen manifest/frame
# byte samples) — see `crates/uffs-content-protocol/tests/golden_fixtures.rs`.
# These are the cross-language conformance corpus per the ingest-protocol
# addendum §5.5; committing the exact bytes is the point, not incidental.
!crates/uffs-content-protocol/tests/fixtures/*.bin
/test_scf

# =============================================================================
Expand Down
98 changes: 86 additions & 12 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 46 additions & 15 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,27 @@ cargo-features = [
resolver = "3"
members = [
# ── Foundation ──
"crates/uffs-polars", # 🚀 Polars facade (compilation isolation)
"crates/uffs-security", # 🔒 Crypto, key storage, secure FS ops
"crates/uffs-text", # 📝 Unicode text processing, i18n foundation
"crates/uffs-time", # ⏱️ NTFS FILETIME arithmetic (pure, zero deps)
"crates/uffs-version", # 🏷️ Shared --version strings + build-metadata stamp (leaf)
"crates/uffs-statusfmt", # 🎨 Shared operator-status styling (color, glyphs, fields) (leaf)
"crates/uffs-broker-protocol", # 📟 Cross-platform broker wire-protocol types (F5)
"crates/uffs-winsvc", # 🪟 Native Windows service control + broker-pipe probe (leaf)
"crates/uffs-mft", # 📦 MFT reading → Polars DataFrame
"crates/uffs-format", # 🧾 Shared CSV formatter (daemon + thin CLI)
"crates/uffs-core", # 🎯 Query engine + compact search engine
"crates/uffs-polars", # 🚀 Polars facade (compilation isolation)
"crates/uffs-security", # 🔒 Crypto, key storage, secure FS ops
"crates/uffs-text", # 📝 Unicode text processing, i18n foundation
"crates/uffs-time", # ⏱️ NTFS FILETIME arithmetic (pure, zero deps)
"crates/uffs-version", # 🏷️ Shared --version strings + build-metadata stamp (leaf)
"crates/uffs-statusfmt", # 🎨 Shared operator-status styling (color, glyphs, fields) (leaf)
"crates/uffs-broker-protocol", # 📟 Cross-platform broker wire-protocol types (F5)
"crates/uffs-content-protocol", # 📨 Cross-platform Content Service wire-protocol types
"crates/uffs-content-reader-protocol", # 📡 Private Coordinator<->Snapshot Reader wire-protocol types
"crates/uffs-winsvc", # 🪟 Native Windows service control + broker-pipe probe (leaf)
"crates/uffs-mft", # 📦 MFT reading → Polars DataFrame
"crates/uffs-format", # 🧾 Shared CSV formatter (daemon + thin CLI)
"crates/uffs-core", # 🎯 Query engine + compact search engine
# ── Daemon Architecture ──
"crates/uffs-daemon", # 🛡️ Background service process
"crates/uffs-client", # 📡 Thin client library
"crates/uffs-mcp", # 🤖 MCP stdio adapter for AI agents
"crates/uffs-broker", # 🔑 Windows elevated handle broker (optional)
"crates/uffs-daemon", # 🛡️ Background service process
"crates/uffs-client", # 📡 Thin client library
"crates/uffs-mcp", # 🤖 MCP stdio adapter for AI agents
"crates/uffs-broker", # 🔑 Windows elevated handle broker (optional)
"crates/uffs-vss-requestor", # 🩹 Per-run native VSS snapshot helper, spawned by uffs-broker (optional)
"crates/uffs-content", # 📦 Content Service — VSS-snapshot-scoped file content export (optional)
"crates/uffs-content-reader", # 📖 Privileged narrow Snapshot Reader, spawned by uffs-content (optional)
# ── Surfaces ──
"crates/uffs-cli", # 🖥️ Command-line interface
"crates/uffs-update", # ⬆️ Self-update acquire helper (HTTP/TLS isolated from the CLI)
Expand Down Expand Up @@ -149,6 +154,23 @@ uffs-client = { path = "crates/uffs-client", version = "0.6.27" }
# F5 (issue #205) so neither side duplicates `BROKER_PIPE_NAME` /
# wire-format byte literals.
uffs-broker-protocol = { path = "crates/uffs-broker-protocol", version = "0.6.27" }
# `uffs-content-protocol` carries the wire-protocol types shared between
# `uffs-content` (the unprivileged content-coordinator producer,
# Windows-only binary) and any downstream consumer (e.g. Docenta).
# Pure-logic Layer-0 lib — cross-platform tests run on every CI lane,
# matching the `uffs-broker-protocol` pattern above. Design references
# (docs/dev/architecture/, local-only, not tracked): the original
# `content-stream-tool-design.md` sketch, its
# `uffs-content-stream-enterprise-design-review.md` replacement-design
# review, and Docenta's `uffs-ingest-protocol-v2-vss.md`.
uffs-content-protocol = { path = "crates/uffs-content-protocol", version = "0.6.27" }
# `uffs-content-reader-protocol` — the private wire format between
# `uffs-content` (Coordinator) and the privileged Snapshot Reader process
# (addendum §2.1-§2.4). Deliberately does NOT depend on
# `uffs-content-protocol` — both are Layer 0, and Layer-0-to-Layer-0
# internal deps are disallowed (see crate-graph.md); see this crate's
# Cargo.toml for the full rationale.
uffs-content-reader-protocol = { path = "crates/uffs-content-reader-protocol", version = "0.6.27" }
# `uffs-winsvc` — native Windows service control (SCM query/start/stop) +
# the non-connecting broker-pipe readiness probe. Layer-0 leaf: its only
# dependency is the `windows` crate (windows-target), with non-Windows
Expand Down Expand Up @@ -203,6 +225,10 @@ windows = { version = "0.62.2", features = [
"Win32_System_Console",
"Win32_System_IO",
"Win32_System_Ioctl",
# Job Object kill-on-close (`uffs-broker`'s Snapshot Manager spawns
# `uffs-vss-requestor` per lease, assigned to a Job Object so it's
# killed if the Broker dies — `broker/snapshot_manager/vss_helper.rs`).
"Win32_System_JobObjects",
"Win32_System_Memory",
"Win32_System_Pipes",
"Win32_System_ProcessStatus",
Expand Down Expand Up @@ -305,6 +331,11 @@ rustc-hash = "2.1.3"
itoa = "1.0.18"
sha2 = "0.11.0"
hex = "0.4.3"
# BLAKE3 is the content-integrity digest mandated by the UFFS Content-Ingest
# protocol (uffs-content-protocol's manifest/frame checksums and the
# FILE_END content digest) — chosen there for speed over sha2, which stays
# in place for its existing unrelated consumers.
blake3 = "1.8.5"

# ───── Network (self-update acquire helper only) ─────
# Blocking HTTP with rustls + the system trust store. `rustls-tls-native-roots`
Expand Down
2 changes: 2 additions & 0 deletions crates/uffs-broker-protocol/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@

use thiserror::Error;

pub mod snapshot_manager;

/// Named-pipe path the broker listens on.
///
/// Both the broker server (`uffs-broker::broker`) and the daemon client
Expand Down
Loading
Loading