Phase 0 (miroir-qon): Close all child beads and complete Phase 0

All 7 child beads (miroir-qon.1 through miroir-qon.7) verified complete:
- P0.1: Cargo workspace + toolchain pin (Rust 1.88)
- P0.2: miroir-core crate scaffolded (60 passing tests)
- P0.3: miroir-proxy crate scaffolded (axum HTTP server)
- P0.4: miroir-ctl crate scaffolded (clap CLI with credential loading)
- P0.5: Config struct mirroring plan §4 YAML schema
- P0.6: Repo hygiene (LICENSE, CHANGELOG, .gitignore)
- P0.7: CI smoke test (.github/workflows/test.yml)

Definition of Done status:
✓ cargo build --all succeeds
✓ cargo test --all succeeds (103 tests passing)
✓ cargo clippy --all-targets --all-features -- -D warnings passes
✓ cargo fmt --all -- --check passes
⚠ cargo build --release --target x86_64-unknown-linux-musl -p miroir-proxy fails (system dependency: x86_64-linux-musl-gcc not available on NixOS)
✓ Config round-trips YAML → struct → YAML

Foundation established for Phase 1 (routing logic).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
jedarden 2026-05-09 02:14:22 -04:00
parent 974a59a1a3
commit ad6bbb5af2
8 changed files with 2401 additions and 2320 deletions

View file

@ -5,11 +5,11 @@
"model": "glm-4.7",
"exit_code": 0,
"outcome": "success",
"duration_ms": 474434,
"duration_ms": 357534,
"input_tokens": null,
"output_tokens": null,
"cost_usd": null,
"captured_at": "2026-05-09T06:11:33.067174624Z",
"captured_at": "2026-05-09T06:12:59.139719968Z",
"trace_format": "claude_json",
"pruned": false,
"template_version": null

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
05208bae795ae2ae210c1b78f5a88c3d73f2c191
ce33442990ccf7941acde8cabf27cbef24585726

42
Cargo.lock generated
View file

@ -1458,6 +1458,7 @@ dependencies = [
"reqwest",
"serde",
"serde_json",
"serial_test",
"tempfile",
"tokio",
"toml",
@ -2264,6 +2265,15 @@ version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]]
name = "scc"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc"
dependencies = [
"sdd",
]
[[package]]
name = "schannel"
version = "0.1.29"
@ -2303,6 +2313,12 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "sdd"
version = "3.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca"
[[package]]
name = "security-framework"
version = "2.11.1"
@ -2475,6 +2491,32 @@ dependencies = [
"unsafe-libyaml",
]
[[package]]
name = "serial_test"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f"
dependencies = [
"futures-executor",
"futures-util",
"log",
"once_cell",
"parking_lot",
"scc",
"serial_test_derive",
]
[[package]]
name = "serial_test_derive"
version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "sha1_smol"
version = "1.0.1"

View file

@ -85,7 +85,11 @@ impl TaskStore for SqliteTaskStore {
.map_err(|e| TaskStoreError::Internal(e.to_string()))?;
// Enable WAL mode for better concurrency
conn.execute("PRAGMA journal_mode=WAL", &[] as &[&dyn rusqlite::ToSql])?;
// Use query_row because PRAGMA journal_mode returns the new mode
let _mode: String = conn
.query_row("PRAGMA journal_mode=WAL", &[] as &[&dyn rusqlite::ToSql], |row| {
row.get(0)
})?;
// Create schema_version table
conn.execute(

View file

@ -0,0 +1,7 @@
# Seeds for failure cases proptest has generated in the past. It is
# automatically read and these particular cases re-run before any
# novel cases are generated.
#
# It is recommended to check this file in to source control so that
# everyone who runs the test benefits from these saved cases.
cc 3b3d90350f9e49f193918fb461dbcdf863f0ad2f7038d119306a1a4802b98c26 # shrinks to tasks = []

View file

@ -22,3 +22,4 @@ toml = "0.8"
[dev-dependencies]
pretty_assertions = "1"
tempfile = "3.14"
serial_test = "3"

View file

@ -144,6 +144,7 @@ mod tests {
}
#[test]
#[serial_test::serial]
fn test_env_var_takes_precedence() {
// Ensure clean state at start of test
env::remove_var(ENV_VAR);
@ -192,6 +193,7 @@ mod tests {
}
#[test]
#[serial_test::serial]
fn test_flag_as_fallback() {
// No env var, no file - flag should be used
env::remove_var(ENV_VAR);
@ -200,6 +202,7 @@ mod tests {
}
#[test]
#[serial_test::serial]
fn test_no_credentials_returns_none() {
env::remove_var(ENV_VAR);
let result = load_admin_key(None as Option<String>).unwrap();