Skip to content

chore: remediate UAT validation findings (DOC-007, R5, R6) - #7

Merged
marcuspat merged 3 commits into
mainfrom
chore/uat-remediation
Aug 20, 2026
Merged

chore: remediate UAT validation findings (DOC-007, R5, R6)#7
marcuspat merged 3 commits into
mainfrom
chore/uat-remediation

Conversation

@marcuspat

Copy link
Copy Markdown
Owner

Addresses the Sentinel findings from the 2026-08-21 UAT and validation report.

Report findings

  • DOC-007 (Medium) — license inconsistency. LICENSE is the MIT text and the README badge said MIT, but workspace.package.license declared Apache-2.0 and the README's License section said Apache-2.0. Reconciled to MIT. Verified with cargo metadata: all 8 crates now resolve to MIT.
  • R5 — CONTRIBUTING.md. Setup, the 8-crate bounded-context map, code style, testing expectations (security-relevant changes need a test that demonstrates the deny path), ADR process, and the areas that get extra security review.
  • R6 — release automation. Tag-driven release.yml: verify (clippy -D warnings, tests, cargo audit) → four-target binaries with SHA-256 sums (x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl, aarch64-apple-darwin, x86_64-apple-darwin) → GitHub Release built from the matching CHANGELOG.md section → opt-in crates.io publish walking the workspace in dependency order.

Two blockers found while implementing R6

cargo publish would have rejected every crate. Workspace-internal dependencies were declared with path only:

sentinel-core = { path = "sentinel-core" }

Cargo requires a version on any dependency of a published crate, so R6's crates.io half was unachievable as written. Each now carries version = "0.1.0" alongside path.

CI is red on main today. The lint job runs cargo clippy --workspace --all-targets -- -D warnings; current stable emits 8 collapsible_match errors in sentinel-tui/src/event_handler.rs. The key handler now uses match guards.

Behaviour is deliberately unchanged. Converting KeyCode::Char('a') => { if tab == Plan { … } } to a guard makes non-Plan-tab presses fall through to the later KeyCode::Char(c) arm, which would start inserting a, s, and r into the goal input. An explicit no-op arm preserves the current swallow:

KeyCode::Char('a') | KeyCode::Char('s') | KeyCode::Char('r') => {}

Verification

Run locally against this tree:

Check Result
cargo check --workspace --all-targets pass
cargo clippy --workspace --all-targets -- -D warnings pass
cargo test --workspace pass — 413 tests
cargo metadata license resolution MIT for all 8 crates

Every file on this branch was verified by git blob SHA against the locally built and tested tree.

Notes, not addressed here

  • crates.io name. The README badge points at sentinel-agent, but no crate in the workspace has that name — the binary sentinel comes from sentinel-tui. The publish job publishes the eight real crate names; the badge needs a decision.
  • rustfmt drift. cargo fmt --all -- --check fails across ~250 sites on current stable. CI does not run it and I left it out of release.yml rather than bundle a whole-tree reformat into this PR.
  • Mojibake. Four files contain double-encoded UTF-8 in comments (â�� where belongs). Cosmetic; a one-line sed if you want it.
  • alpine:3.19 in the Docker runtime stage reached EOL in Nov 2025.

🤖 Generated with Claude Code

https://claude.ai/code/session_01WhYNu2HEX62gqqtcPM5twr

@marcuspat
marcuspat merged commit e93ee1f into main Aug 20, 2026
3 checks passed
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.

1 participant