Repository navigation
feat(cli): name preflight refusal stages and selected profiles - #407
Conversation
Fleet review (deepseek)Lens: evidence + test design. The slice does what its title says for the main refusal path: Blocking (2)
Suggestion (2)
Question (1)
Verdict: not ready |
Fleet review (mimo)Lens: requirements. Checked the diff against issue #374's four expected outcomes. Criterion 2 (the prerequisite note no longer claims the default route provider) is satisfied and pinned by a test. Criterion 3 (a refused --profile lists the valid ids, the selected id and the source state) is satisfied for the profile_invalid path and tested. Criterion 1 (refusals name the failing stage and stage input) is satisfied only for refusals that come out of RunLocalReportOn: two pre-pipeline refusal paths that belong to in-taxonomy stages still print no stage line — an unreadable evidence sidecar (internal/cli/doctor.go:349-364) and install-root resolution failure (internal/cli/doctor.go:371-374), contradicting both the criterion and this PR's own docs contract. Criterion 4 (doctor probe reporting distinguishes route resolution from actor binding from model probe) has no change in this diff; doctor's qa probe output (internal/cli/qabackend.go qaBackendLine) is untouched, and the PR's out-of-scope list does not mention it. The new docs/help promise that a qa run refusal names its preflight question, but request-file and cwd refusals print no stage and a pre-existing stage=catalog token sits outside the documented four-token vocabulary. Blocking (2)
Question (2)
Verdict: not ready |
Post-merge QA (glm)Slice 6/8: qa run refusals now name the preflight stage (route_resolution / actor_admission / model_probe / evidence_admission) via qaRefusalStage, the misleading default-provider claim is gone from the prerequisite note, and profile refusals print profile_selected (sanitized), profile_default, profile_valid_ids and route_setup. The four-stage vocabulary, the no-claimed-route rule for route refusals, the hostile-profile-id redaction and the post-launch-no-stage case are all pinned by tests, matching the linked issue's expected outcome. Nothing found that breaks what landed. Suggestion (1)
Verdict: clean |
Post-merge QA (deepseek)Lens: evidence + test design. The slice delivers the stage vocabulary and the profile diagnostics #374 asked for: one fixed token per preflight question, no stage line for post-launch outcomes, the note no longer claims a route, and an unknown --profile now points at the file with its valid ids. The refusal tests are exact-string, which is the strongest form for this surface. Two evidence gaps remain: one diagnostic field skips the sanitizer the neighbouring field uses, and two codes in the stage switch are mapped but not driven by any test. Suggestion (1)
Question (1)
Verdict: clean |
Linked Issue
Refs #374
Umbrella: #401
PR Type
type:featureFeaturetype:bugBug fixtype:docsDocumentationtype:refactorRefactoringtype:choreMaintenancetype:breaking-changeBreaking changeSummary
Name route resolution, actor admission, model probe and evidence admission refusals. Report the selected/default/valid profile ids and remove a misleading default-provider claim from the prerequisite note.
Changes
This is slice 6/8, 310 authored changed lines. Code, focused tests and applicable operating documentation stay together. Exact reviewed source commit:
b337e8b6cb94c0d66daf99cafdd672d834d8de1c. Delivery head569ea98a97fb90cb3eed86afdb917089c07fe3d8has the identical complete source tree.Focused Tests
Each cumulative prepared slice passed
go test ./internal/cli ./internal/qapi ./internal/qaroute ./internal/installobserve -count=1,go vet ./...and whitespace checks. Final candidate additionally passedgo test ./... -count=1,go vet ./...,go test -race ./...and all 15 repository Python policy tests on a byte-verified canonical clean snapshot. Independent source-agreement, typed-admission and final security verification passed with no severe blockers; final verification observed 19 named tests plus four package suites/vet.Native assessment of this exact slice: medium native tier, reviewDue=false (under_budget); no new native review started. Security-affecting slices retained explicit high-risk escalation and independent verification rather than treating assessment as proof. Parser's separately requested native review completed approved and acknowledged.
Runtime Harness
Disposable public CLI fixtures, no real provider calls. Rejections pin no launch/write effects, route identity and safe profile tokens. macOS /tmp is a symlink and intentionally refused: canonical snapshot cwd passed unchanged guards. No credentials changed.
Rollback
Revert this slice. Revert any dependent later slice first; no stored-data migration.
Chain Dependencies / Out of Scope
Sequential verified-main strategy: merged #406 -> [current slice 6/8] -> remaining slices. This PR targets main only after its predecessor lands, so its diff contains only this work unit. Do not close the umbrella from this intermediate slice.
Known acceptance limit: #329's literal transient/persistent causal distinction is NOT established by stage reporting and remains open. Defensive untyped branches, a currently unreachable non_nan_route mapping and a brittle wording assertion were disclosed as nonblocking verifier advisories, not silently fixed. Provider transport #345 and lifecycle #373 are out of scope.
Checklist
status:approved.type:*label is applied.