fix: provider credential checks, routing divergence, ruvector drift, dashboard gate, qe-court self-heal - #69
Merged
Conversation
…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.
6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
b722980fix(dashboard): gate overlay never hides due to missing[hidden]CSS rule.gatehaddisplay:flexwith no[hidden]override — every sibling gated element in the file (.menu,.badge,.panel,.segbadge,.view,.live-health,.live-empty,.sdetail) already had one;.gatewas the one omission from #68.f642d03fix: aqe fallback-chain credential checks, seeded-routing divergence detection, ruvector drift managementapplyAqeRouterwarns on a keyless rung,ak status/picksurface it,openrouternow visible). Closes #55 (seeded-routing divergence viadivergedRoutes(),ak x provider refresh, corrected per-token-vs-per-task catalog notes). Also adds opt-in drift detection/upgrade for the standalone globalruvectornpm CLI, wired intoak status/sync/dashboard.ruvectorinstalls could rot with nothing watching.bd9bc91fix(qe-court): temporary self-heal for writerIsNeverJuror collisionqe-court/config.jsonviolates its ownwriterIsNeverJurorinvariant (defense: cognitum-low/jury: cognitum-highcollide on vendor). Filed upstream: proffesor-for-testing/agentic-qe#576. Until fixed there,ak statusflags it andak syncreassignsjuryto an already-configured distinct-vendor seat, backup-first.Explanation
Three independent defects surfaced during a readiness review of issues #49/#54/#55, each traced to a concrete repro (not a hypothetical):
curlround-trips passed); the bug was purely a CSS cascade tie between the UA[hidden]rule and an equal-specificity author rule with no override — reproduced pixel-for-pixel with a real headless-Chromium screenshot, then fixed and re-verified.ak status/ak x provider statussurfaces); implemented together to land the detection helpers side by side, per the issues' own cross-references.ak x provider statusflagged an existing local qe-court panel as invalid. Traced to the exact upstream default template (not a local misconfiguration), filed upstream, and given a temporary, narrowly-scoped self-heal (never invents a vendor, never touches unrelated keys, backs up before writing) that's explicitly marked for removal once agentic-qe ships a fix.Impact
.claude/(where qe-court's config lives) is gitignored and never created by ak, so the self-heal only ever touches a file the qe-court skill itself generated.pnpm run check: typecheck + lint + markdown lint + build + test, exit 0); 856+ tests passing including new coverage for every acceptance-criteria item in aqe fallback chain is never credential-checked — ak writes and reports dead rungs as healthy #54/Seeded dual-routing model pins never refresh, and the divergence is invisible #55 and the qe-court heal (idempotency, no-op cases, unfixable-case guard).🤖 Generated with Claude Code