Skip to content

fix: provider credential checks, routing divergence, ruvector drift, dashboard gate, qe-court self-heal - #69

Merged
pacphi merged 4 commits into
mainfrom
fix/provider-credentials-dashboard-qe-court
Jul 28, 2026
Merged

fix: provider credential checks, routing divergence, ruvector drift, dashboard gate, qe-court self-heal#69
pacphi merged 4 commits into
mainfrom
fix/provider-credentials-dashboard-qe-court

Conversation

@pacphi

@pacphi pacphi commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Summary

Commit What Why it matters
b722980 fix(dashboard): gate overlay never hides due to missing [hidden] CSS rule .gate had display:flex with no [hidden] override — every sibling gated element in the file (.menu, .badge, .panel, .segbadge, .view, .live-health, .live-empty, .sdetail) already had one; .gate was the one omission from #68. The dashboard's auth gate rendered permanently on top of the page regardless of token validity — a real auth success looked identical to a failure. Verified before/after with real Playwright screenshots.
f642d03 fix: aqe fallback-chain credential checks, seeded-routing divergence detection, ruvector drift management Closes #54 (credential-checked aqe fallback chain: applyAqeRouter warns on a keyless rung, ak status/pick surface it, openrouter now visible). Closes #55 (seeded-routing divergence via divergedRoutes(), ak x provider refresh, corrected per-token-vs-per-task catalog notes). Also adds opt-in drift detection/upgrade for the standalone global ruvector npm CLI, wired into ak status/sync/dashboard. ak was writing and reporting dead fallback rungs as healthy, and silently running stale seeded model pins with no way to see or selectively refresh them. Standalone ruvector installs could rot with nothing watching.
bd9bc91 fix(qe-court): temporary self-heal for writerIsNeverJuror collision agentic-qe's own shipped default qe-court/config.json violates its own writerIsNeverJuror invariant (defense: cognitum-low / jury: cognitum-high collide on vendor). Filed upstream: proffesor-for-testing/agentic-qe#576. Until fixed there, ak status flags it and ak sync reassigns jury to an already-configured distinct-vendor seat, backup-first. Every brand-new project running qe-court for the first time got an invalid adversarial-review panel with zero user action — silently defeating the anti-collusion guarantee the court exists to provide.

Explanation

Three independent defects surfaced during a readiness review of issues #49/#54/#55, each traced to a concrete repro (not a hypothetical):

Impact

🤖 Generated with Claude Code

pacphi added 4 commits July 28, 2026 14:17
…rule

.gate had display:flex with no [hidden] override, so the auth gate
rendered on top of the dashboard permanently regardless of token
validity — every sibling gated element in this file (.menu, .badge,
.panel, .segbadge, .view, .live-health, .live-empty, .sdetail) already
follows this pattern; .gate was the one omission (from PR #68).

Verified with Playwright: before the fix, computed display was "flex"
even with the hidden attribute set (token accepted); after, "none".
…detection, ruvector drift management

Closes #54 — ak now checks every aqe fallback rung against an actual
credential before writing/reporting it: applyAqeRouter warns (never
refuses) on a keyless rung, ak x provider pick warns interactively, ak
status reports a WARN providers row when any rung lacks a credential,
and openrouter is now visible in ak x provider status's provider table.

Closes #55 — seeded per-activity routing pins that diverge from current
DEFAULT_ROUTES are now surfaced (info severity, never "stale"/"outdated"
per the issue's explicit framing) via divergedRoutes(), with a new
`ak x provider refresh` to re-seed per-activity on demand. ak sync never
auto-refreshes. MODEL_CATALOG notes now distinguish per-token price from
per-task cost. aqeFallback entries carry source provenance.

Also adds standalone ruvector (global npm CLI) drift detection/upgrade,
opt-in and separate from the nested ruflo/aqe copies already managed
indirectly, wired into ak status/sync and the dashboard.

824+ tests added/passing; full suite green.
agentic-qe's own shipped default qe-court config.json violates its own
writerIsNeverJuror invariant (defense: cognitum-low, jury: cognitum-high
resolve to the same vendor), so a brand-new project fails validation
before any user touches the file. Filed upstream:
proffesor-for-testing/agentic-qe#576.

Until that's fixed, ak status flags a fixable violation and ak sync
reassigns `jury` to an already-configured distinct-vendor seat
(preferring deeperReviewer), backing up the original first. Never
invents a vendor the project hasn't configured, never touches other
keys. qeCourtShipped() consolidated into qeCourt.mjs to avoid a second
copy of the version gate.
…t collect()

withoutEnv() wasn't async and didn't await fn(), so its `finally` fired
the instant fn() returned a still-pending promise — before collect()'s
own awaited work (driftReport() et al.) had reached the credential
check — clobbering the env vars the test had just set before
credentialGaps ever read them.

This stayed invisible on any machine exporting a real credential env
var (e.g. a personal OPENROUTER_API_KEY): the premature restore landed
on that real value instead of `undefined`, and a real key is just as
truthy as the test's injected 'sk-test', so the assertion passed for
the wrong reason. CI has no such variable, so the race was exposed:
9/9 test matrix jobs failed identically on 'warn' !== 'ok'.

Verified locally both with and without a personal OPENROUTER_API_KEY
present. Root-caused via a targeted debug run (not guessed) — see
run https://github.com/pacphi/agentic-kit/actions/runs/30401871783.
@pacphi
pacphi merged commit 1e3b070 into main Jul 28, 2026
11 checks passed
@pacphi
pacphi deleted the fix/provider-credentials-dashboard-qe-court branch July 28, 2026 21:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant