Workspace tooling — architecture¶
Design decisions for repo-wide developer tooling — test-coverage measurement (Workspace test-coverage mea... (FEAT_0120)), the onboarding golden path (Onboarding golden path + as... (FEAT_0121)) and test-execution records (Test-execution records (FEAT_0122)). Requirements live in Workspace tooling.
Solution strategy¶
Context. The workspace has no coverage tooling — no tool, script,
or CI job. Any choice must run on the pinned stable toolchain
( Decision.
Consequences. ✅ Accurate, compiler-grade line coverage on the
pinned stable toolchain. ✅ lcov output feeds a later CI/Codecov step
without revisiting the tool choice. ❌ Contributors need an extra
installed binary ( |
Context. With coverage measured in CI (CI measures coverage via th... (REQ_0998)), the results need somewhere to go, and the setup must be gate-ready without being a gate today. Forces: pre-1.0 personal project with no external service accounts wired to the repo; nothing consumes a coverage trend yet; local and CI runs must produce the same numbers. Decision. CI runs the identical local entrypoint
(
Consequences. ✅ Zero external dependencies or secrets; local and CI runs cannot drift; enabling a floor is a one-line flip. ❌ No historical trend line and no per-PR diff-coverage view. ❌ Artifacts expire with the repo’s retention window (default 90 days) — the summary in the job log outlives them only as long as the log does. |
Context. The workspace is 41 independently-versioned pre-1.0 library
crates with no facade; assembling an application means picking five to
eight of them by hand, and discovery is the first-hour cost. A Decision. The front door is a curated golden-path example
(Hardware-free two-connector... (REQ_1002)) plus a two-tier assembly guide (README "Start here" assembl... (REQ_1004),
Golden-path example walkthr... (REQ_1005)) — additive documentation and one runnable crate, nothing
new to version. The
Consequences. ✅ The discovery fix ships immediately with no standing
liability — nothing new to version, and the underlying crates keep bumping
independently. ❌ No |
Implementation footprint¶
The realising artefacts, all in-repo:
|
Test-execution records — solution strategy¶
Architecture Decision: Record assembled from the useblocks toolchain, not a bespoke generator ADR_0138
|
Context. The record must join four facts about a commit: which tests
ran and their results, which verification case ( Decision. Use the useblocks extensions, whose data model is
sphinx-needs itself:
Consequences. ✅ The record is native, already-validated sphinx-needs
data; the marker→case binding is machine-checked at the source. ✅ The
later slices (release, deployment, SBOM, approval) extend the same graph
rather than a bespoke format. ❌ Two new Sphinx extensions become spec
build dependencies. ❌ The join relies on stable test-function identity
between |
Context. Decision. Run the medkit tests under
Consequences. ✅ Stable-toolchain JUnit that |
Test-execution records — implementation footprint¶
The realising artefacts:
|
Unsafe-code gate — solution strategy¶
Context. Decision. Extract unsafe into
Consequences. ✅ Compile-time hard boundary: adding unsafe to
|
Unsafe-code gate — implementation footprint¶
The realising artefacts, all in-repo:
|
Decisions at a glance¶
ID |
Title |
Status |
Refines |
|---|---|---|---|
Coverage measured with cargo-llvm-cov |
accepted |
||
Coverage results stay in-repo — artifacts + job summary, no Codecov |
accepted |
||
Front door is a curated example + guide, not a facade crate |
accepted |
||
Record assembled from the useblocks toolchain, not a bespoke generator |
accepted |
||
Structured results via cargo-nextest JUnit |
accepted |
||
Extract unsafe into sys crate with sound safe abstractions |
accepted |