Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
f1203d4
Keep collection authority capability-bound
callumalpass Aug 30, 2026
a585336
Bound and cancel authoritative capture
callumalpass Aug 30, 2026
a94e13f
Make runtime outcomes structurally valid
callumalpass Aug 30, 2026
0a9195f
Retain provable resolution evidence
callumalpass Aug 30, 2026
0a0fffd
Isolate legacy compatibility surfaces
callumalpass Aug 30, 2026
7096f8a
Authenticate runtime journal transitions
callumalpass Aug 30, 2026
9919d3e
Move command mutations to typed services
callumalpass Aug 30, 2026
99f3a69
Bind all collection I/O to held authority
callumalpass Aug 30, 2026
ef4a431
Qualify authority safety across platforms
callumalpass Aug 30, 2026
3ab8683
Gate Unix snapshot hooks by platform
callumalpass Aug 30, 2026
55166f0
Use handle-relative Windows replacement
callumalpass Aug 30, 2026
e74f80c
Share Windows readers with atomic publication
callumalpass Aug 30, 2026
9b82aa8
Stabilize cross-platform authority tests
callumalpass Aug 30, 2026
190baed
Bound transient Windows replacement retries
callumalpass Aug 30, 2026
3c1bbbc
Normalize concurrent no-clobber conflicts
callumalpass Aug 30, 2026
e53b30b
Run feature graph guard through Bash on Windows
callumalpass Aug 31, 2026
fa93a99
Merge refreshed typed outcome base
callumalpass Aug 31, 2026
518be46
Run shell feature guard only on Unix
callumalpass Aug 31, 2026
1bdaebb
Make typed wire parity independent of filesystem clocks
callumalpass Aug 31, 2026
ed23779
Bound transient publication visibility races
callumalpass Aug 31, 2026
37d28d3
Avoid reserved Windows device names in fixtures
callumalpass Aug 31, 2026
ec31fc7
Isolate atomic rename race from collection setup
callumalpass Aug 31, 2026
e8dadab
Stabilize concurrent create conflict classification
callumalpass Aug 31, 2026
a915abc
Avoid write locking transaction-free collection opens
callumalpass Aug 31, 2026
464fc4d
Retry concurrent capability directory visibility
callumalpass Aug 31, 2026
1f3511a
Report concurrent type create outcomes
callumalpass Aug 31, 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
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,17 @@ jobs:
- name: Enforce architecture and debt budgets
run: cargo run --locked -p mdbase-architecture-check -- .
- run: cargo clippy --locked --workspace --all-targets --all-features -- -D warnings
- name: Strict canonical no-default lint gates
run: |
cargo clippy --locked -p mdbase --no-default-features --all-targets -- -D warnings
cargo clippy --locked -p mdbase-command --no-default-features --all-targets -- -D warnings
cargo clippy --locked -p mdbase-runtime --no-default-features --all-targets -- -D warnings
cargo clippy --locked -p mdbase-testbed-adapter --all-targets -- -D warnings
- run: ./scripts/check-legacy-feature-boundary.sh
- name: Reject legacy mutation feature in canonical resolved graphs
run: ./scripts/check-no-legacy-feature.sh
- run: cargo test --locked -p mdbase --no-default-features backfill
- run: cargo test --locked -p mdbase-command --no-default-features
- run: cargo test --locked -p mdbase-runtime --no-default-features
- run: cargo test --locked -p mdbase-runtime --no-default-features --features sqlite
- run: cargo check --locked -p mdbase-runtime --no-default-features --features postgres
Expand Down Expand Up @@ -57,6 +68,9 @@ jobs:
with:
node-version: 22
- uses: Swatinem/rust-cache@v2
- name: Compile every Windows target, including capability publication
if: runner.os == 'Windows'
run: cargo check --locked --workspace --all-targets --all-features
- run: cargo test --locked --workspace --all-features
env:
MDBASE_SPEC_REPO_DIR: ${{ github.workspace }}/mdbase-spec
Expand Down
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ All notable changes to this project are documented in this file.

### Breaking

- Context-free JSON `Collection` create/update/delete/rename/backfill/batch
methods are isolated behind the default-on `legacy-collection-mutation` 0.4.x
compatibility feature. They retain strict source compatibility, including
under `deny(deprecated)`, while rustdoc records their planned 0.5.0 removal.
- Deprecated ephemeral `ExecutionOutcome::result` and `CommitRejection::result`
projections now have a 0.5.0 removal gate; typed callers use `operation`.
- `Collection::build_all_files_data` now returns
`Result<Vec<ResolvedFileData>, CollectionSnapshotError>` instead of silently
treating discovery/read failures as an empty collection. This is a deliberate
Expand All @@ -25,6 +31,15 @@ All notable changes to this project are documented in this file.
`Result<String, FrontmatterSerializationError>`. Callers must handle YAML
emitter failures; serialization no longer panics or substitutes empty YAML.

### Added

- Added privacy-safe `legacy_journal_inventory` runtime/provider APIs so operators
can prove that no version-2 journals remain before the 0.5.0 decoder removal.
- Added exact architecture ownership guards for the seven legacy Collection
facade definitions and internal compatibility allowlist, plus non-growing
guards for `OperationContext::legacy`, wire-only outcome variants/constructors,
and ephemeral runtime result projections.

### Fixed

- Generated values now evaluate against effective defaults and dependencies,
Expand Down
2 changes: 2 additions & 0 deletions Cargo.lock

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

12 changes: 10 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,18 @@ members = [
resolver = "2"

[features]
default = []
# Retained for the 0.4.x source-compatibility window. Canonical hosts should
# build with `--no-default-features`; the feature is removed in 0.5.0.
default = ["legacy-collection-mutation"]
legacy-collection-mutation = []
tracing = ["dep:tracing"]
hosted-storage-benchmark = []

[[bin]]
name = "phase0-baseline"
path = "src/bin/phase0-baseline.rs"
required-features = ["legacy-collection-mutation"]

[dependencies]
rusqlite = { version = "0.32", features = ["bundled"] }
serde = { version = "1", features = ["derive"] }
Expand Down Expand Up @@ -64,7 +72,7 @@ cap-std = "4.0.3"
cap-fs-ext = "4.0.3"

[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.61", features = ["Win32_Storage_FileSystem"] }
windows-sys = { version = "0.61", features = ["Wdk_Storage_FileSystem", "Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_IO"] }

[workspace.package]
edition = "2021"
Expand Down
100 changes: 84 additions & 16 deletions config/architecture-budgets.json
Original file line number Diff line number Diff line change
@@ -1,30 +1,35 @@
{
"rustSourceFileCountMax": 171,
"rustSourceLineCountMax": 93200,
"rustSourceFileCountMax": 173,
"rustSourceLineCountMax": 100297,
"rustSourceFileMaxLines": 1000,
"legacyFileLineBudgets": {
"crates/mdbase-command/src/lib.rs": 1816,
"crates/mdbase-command/src/profile.rs": 1348,
"crates/mdbase-architecture-check/src/main.rs": 1188,
"crates/mdbase-command/src/lib.rs": 1968,
"crates/mdbase-command/src/profile.rs": 1382,
"crates/mdbase-runtime/src/engine.rs": 1270,
"src/bin/phase0-baseline.rs": 1164,
"src/data_contracts.rs": 1075,
"src/data_contracts.rs": 1124,
"src/expressions/evaluator.rs": 3390,
"src/links/resolver.rs": 1040,
"src/links/resolver.rs": 1201,
"src/query/engine.rs": 1086,
"src/runtime/filesystem.rs": 1333,
"src/runtime/hosted_base.rs": 1943,
"src/runtime/filesystem.rs": 1435,
"src/runtime/canonical_operation.rs": 1410,
"src/runtime/hosted_base.rs": 1968,
"src/runtime/hosted_mutation.rs": 1200,
"src/runtime/hosted_query.rs": 3400,
"src/runtime/hosted_resource.rs": 1040,
"src/runtime/tests.rs": 3964,
"src/transactions.rs": 1015,
"src/transactions/runtime.rs": 1294,
"src/v03/batch.rs": 1365,
"src/v03/collection_setup.rs": 1479,
"src/v03/type_pack.rs": 2110,
"src/runtime/provider.rs": 1020,
"src/runtime/record_resolution.rs": 1393,
"src/runtime/tests.rs": 4372,
"src/api/typed.rs": 1075,
"src/transactions.rs": 1029,
"src/transactions/runtime.rs": 2625,
"src/v03/batch.rs": 1519,
"src/v03/collection_setup.rs": 1508,
"src/v03/type_pack.rs": 2135,
"src/views/execute.rs": 1376,
"src/views/expression.rs": 2965,
"src/watch/real.rs": 3143
"src/watch/real.rs": 3220
},
"deadCodeAllowancesByFile": {
"crates/mdbase-command/src/lib.rs": 1,
Expand All @@ -34,10 +39,73 @@
"src/matching/engine.rs": 1,
"src/runtime/outcome.rs": 2,
"src/runtime/provider.rs": 2,
"src/runtime/snapshot.rs": 1,
"src/snapshot.rs": 2,
"src/snapshot/discovery.rs": 1,
"src/cel.rs": 2
},
"ambientIoAllowlist": {
"crates/mdbase-command/src/lib.rs": {"std::fs": 4},
"crates/mdbase-command/src/profile.rs": {"std::fs": 14},
"crates/mdbase-testbed-adapter/src/main.rs": {"std::fs": 4},
"src/bin/phase0-baseline.rs": {"std::fs": 15},
"src/cache/mod.rs": {"std::fs": 2},
"src/cache/sqlite.rs": {"std::fs": 3, "std::fs::File": 2, "std::fs::OpenOptions": 2},
"src/collection_root.rs": {"cap_std::ambient-acquisition": 2, "std::fs": 3, "std::fs::File": 2, "tempfile": 4},
"src/compat/v02_migration.rs": {"std::fs": 5, "tempfile": 1},
"src/config/mod.rs": {"std::fs": 2},
"src/data_contracts.rs": {"std::fs": 3, "tempfile": 1, "walkdir": 2},
"src/init.rs": {"std::fs": 6},
"src/mutation/shadow.rs": {"std::fs": 3, "tempfile": 2},
"src/operations/mod.rs": {"std::fs": 2, "std::fs::File": 1},
"src/operations/type_file.rs": {"std::fs": 2, "tempfile": 1},
"src/record_load.rs": {"std::fs": 3, "std::fs::File": 3},
"src/runtime/catalog.rs": {"tempfile": 1},
"src/runtime/hosted_mutation.rs": {"std::fs": 11, "tempfile": 1},
"src/runtime/hosted_resource.rs": {"std::fs": 6, "tempfile": 3, "walkdir": 1},
"src/runtime/hosted_validation.rs": {"std::fs": 3, "tempfile": 1},
"src/transactions.rs": {"std::fs::File": 3},
"src/types/loader.rs": {"std::fs": 5, "tempfile": 1},
"src/v03/batch.rs": {"std::fs": 6, "tempfile": 1},
"src/v03/collection_setup.rs": {"std::fs": 5},
"src/v03/mod.rs": {"std::fs": 4, "walkdir": 4},
"src/v03/type_pack.rs": {"std::fs": 6},
"src/watch/mod.rs": {"std::fs": 25},
"src/watch/real.rs": {"std::fs": 1}
},
"transitionalReferenceBudgets": {
"uncheckedCollectionScans": 0,
"v03OperationFacade": 26
"v03OperationFacade": 26,
"legacyCollectionFacadeDefinitions": [
"backfill",
"batch_delete",
"batch_update",
"create",
"delete",
"rename",
"update"
],
"legacyCompatibilityAllowlist": {
"src/api/operations.rs": ["CreateInput", "CreateOutput", "DeleteInput", "DeleteOutput", "RenameInput", "UpdateInput", "UpdateOutput"],
"src/compat/legacy_mutation.rs": ["backfill_legacy", "batch_delete_legacy", "batch_update_legacy", "create_legacy", "delete_legacy", "rename_legacy", "update_legacy"],
"src/compat/mod.rs": ["legacy_mutation"],
"src/operations/backfill.rs": ["backfill_legacy"],
"src/operations/batch.rs": ["batch_delete_legacy", "batch_update_legacy", "delete_legacy"],
"src/operations/create.rs": ["CreateInput", "CreateOutput", "create_legacy"],
"src/operations/delete.rs": ["DeleteInput", "DeleteOutput", "delete_legacy"],
"src/operations/migrate.rs": ["backfill_legacy"],
"src/operations/rename/mod.rs": ["RenameInput", "rename_legacy"],
"src/operations/update.rs": ["UpdateInput", "UpdateOutput", "update_legacy"]
},
"operationContextLegacyProduction": 0,
"operationContextLegacySupport": 170,
"wireOnlyVariants": ["TypeResource", "Validation", "ViewResource"],
"wireOnlyConstructorAllowlist": {
"src/runtime/canonical_operation.rs": {"type_wire": 2, "validation_wire": 1, "view_wire": 2, "wire_only": 4},
"src/runtime/filesystem.rs": {"wire_only": 1},
"src/v03/batch.rs": {"wire_only": 1}
},
"ephemeralResultProduction": 0,
"ephemeralResultSupport": 4
}
}
2 changes: 2 additions & 0 deletions crates/mdbase-architecture-check/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ repository.workspace = true
publish = false

[dependencies]
proc-macro2 = "1"
regex = "1"
serde = { workspace = true, features = ["derive"] }
serde_json.workspace = true
syn = { version = "2", features = ["full", "visit"] }
walkdir = "2"
Loading
Loading