mirror of
https://github.com/proffesor-for-testing/agentic-qe.git
synced 2026-09-19 08:45:47 +08:00
fix/issue-511-code-deps-persistence
55 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
bec5a57f1c |
chore(lint): ignore src/_archived, align bounded-context count, apply safe autofixes
Repo-health cleanup from an external code audit: - eslint: ignore src/_archived (already excluded by tsconfig, so linting it only produced 6 parserOptions.project errors). - Align the architecture claim: src/index.ts and docs said "12"/"6" bounded contexts; there are 13 domain dirs (matching package.json). Updated src/index.ts (comment + ARCHITECTURE const) and the docs list to the actual 13. - Apply stock `eslint --fix` (prefer-const, prefer-as-const, no-useless-escape, no-regex-spaces) across 24 files. Lint problems: 1072 -> 1031. Typecheck and build pass; no behavioral changes. |
||
|
|
84fb9ca65d |
docs(adr): ADR-098 learning-store & routing hardening + mark 2 side-findings fixed
ADR-098 documents the durable behavioural decisions from the ruflo adoption pass (#510): domain-score de-dilution (#2), EWC++ importance-weighted forgetting (#6), contradiction suppression (#7), the two pre-existing bug fixes (consecutive_failures, MCP -32601), and the explicit NEGLECTED decisions — ruflo's Beta-priors (#2) and RaBitQ speedup (#8) did not transfer, and multi-bundle packaging is deferred. AQE WH(Y) format, Accepted. Marks the consecutive_failures ( |
||
|
|
3bc09cda6d |
fix(llm-router): address 10 findings from qe-devils-advocate audit
A post-Phase-4 devil's-advocate audit identified 10 issues. All addressed
with code fixes + tests. Some were real bugs (silent billing regression,
2 unwired MCP tools, 2 HybridRouter routing bugs); others were robustness
improvements (split singletons, silent errors, decorative type fields).
Findings → fixes (severity tagged in audit report):
1. CRITICAL — silent billing regression on upgrade
Users with ANTHROPIC_API_KEY in env would silently start paying for
Claude API calls on every Fleet operation. The CHANGELOG's "opt out
via code changes" wasn't sufficient — needed an env-only escape.
Fix: AQE_LLM_ROUTER_DISABLED=1 env kill-switch honored in both
QEKernelImpl._initializeLLMRouter and src/mcp/tools/base.ts
getSharedLLMRouter. Truthy values disable; 'false'/'0'/'no'/'off'/''
pass. Unified parse rule between kernel and MCP base.
2. HIGH — 2 unwired MCP standalone tools (audit said 3; QualityCriteria
isn't LLM-aware so excluded)
src/mcp/tools/test-generation/generate.ts:82 was calling
createTestGeneratorService(memory) without router. Same for
visual-accessibility/index.ts:177. Both now use the
createXxxServiceWithDependencies factories with { memory, llmRouter }.
3. CRITICAL — E2E only tested manual routing mode, not production
Production default is rule-based. Adding two new E2E tests for
rule-based mode SURFACED two real bugs in HybridRouter that I fixed:
3a. executeWithFallback hardcoded ['claude','openai','ollama'] as the
only fallback providers; gemini/openrouter/azure-openai/bedrock
users had no fallback even though ProviderManager can construct
them. Plus the user's defaultProvider wasn't auto-included in the
chain. Both fixed at src/shared/llm/router/hybrid-router.ts:612.
3b. A non-retryable error from one provider (e.g. Claude "invalid
x-api-key") aborted the entire fallback loop via `throw error`,
defeating the whole point of a fallback chain. Fixed: skip the
inter-attempt delay for non-retryable but continue to the next
fallback entry.
4. HIGH — MCPToolContext.llmRouter field was decorative
Added the field but no code populated it. Every getLLMRouter(context)
call fell through to getSharedLLMRouter().
Fix: added llmRouter and memory to BaseMCPTool.invoke() options;
qe-tool-bridge.ts and registry.ts now explicitly forward the shared
singleton via { llmRouter } at invoke time.
5. HIGH — 14 of 15 wired services had only STRUCTURAL verification, not
behavioral (only TestExecutor had a chat() round-trip test)
Fix: new tests/integration/llm-router-behavioral.test.ts asserts
isLLMAnalysisAvailable()===true (the exact gate the audit named) for
all 14 services + 2 full behavioral round-trips. 16 tests total.
6. HIGH — MCP and kernel built SEPARATE HybridRouter instances
Different cost trackers, caches, circuit breakers per side.
routing_economics/routing_metrics would only see half the traffic.
Fix: kernel.ts._initializeLLMRouter calls setSharedLLMRouter(router)
on init so both paths share one instance. kernel.dispose() calls
resetSharedLLMRouter() so the next kernel doesn't inherit the
previous instance.
7. HIGH — Silent error swallowing in _initializeLLMRouter
console.warn'd then continued without LLM, with no signal for
monitoring. A misconfigured provider would silently degrade with no
alert.
Fix: now publishes kernel.llm-router.init-failed (caught error) and
kernel.llm-router.init-no-provider (enabled=true but nothing
available) events on the event bus. Test confirms event delivery.
8. MEDIUM — Service count mismatch in docs (ADR/CHANGELOG said "14
services / 12 domains"; test enumerates 15 services / 11
LLM-enhanced domains)
Fix: ADR-043 addendum + CHANGELOG corrected to 15/11. Added
explicit service list and noted the 2 non-LLM domains
(enterprise-integration, coordination).
9. MEDIUM — aqe llm config --set apiKey=... silently dropped the key
stripApiKeys() returned a successfully-saved file without the key,
user thought it was saved.
Fix: CLI updateConfig() now throws a clear error pointing to env
vars BEFORE calling save. stripApiKeys also now logs a console.warn
when it strips anything, so programmatic callers see the strip.
10. LOW — Env vs disk precedence was counterintuitive and undocumented
Force-enable-on-env overrides explicit `enabled: false` on disk.
Fix: doc comment in config-store.applyEnvProviderDetection +
ADR-043 "Precedence & env-var conventions" section explains.
Verification
- npx tsc --noEmit: clean
- 191 unit + integration tests pass (16 new behavioral tests for #5,
17 wiring tests, gemini provider, config-store, llm-router-service,
kernel-llm-router with 17 tests including all kill-switch cases,
CLI persistence with 28 tests)
- 5 real-provider E2E tests pass (Gemini 2.5 Flash, OpenAI gpt-4o-mini,
OpenRouter, plus 2 rule-based-mode tests that previously failed and
now pass with the HybridRouter fallback fixes)
Refs ADR-043 audit findings (2026-05-21)
Builds on
|
||
|
|
c206c81751 |
feat(llm-router): Phases 3 + 4 — MCP path, integration tests, real-provider E2E, ADRs
Phase 3 — MCP tool path
- 8 standalone MCP tools (coverage-analyze, coverage-gaps, contract-validate,
chaos-inject, code-intel-analyze, defect-predict, learning-optimize) now
resolve the kernel HybridRouter via getLLMRouter(context) and pass it to
their service via the dependency-bag form.
- src/mcp/tools/base.ts: added getSharedLLMRouter() singleton, mirroring the
existing getSharedMemoryBackend() pattern. resetSharedLLMRouter() for
tests. Added MCPToolContext.llmRouter field so future tools (and the MCP
runtime when wiring per-request kernel context) can inject explicitly
rather than via the shared singleton.
Phase 4a — Mock-provider integration tests
- tests/integration/llm-router-wiring.test.ts (new, 17 tests).
- Per-domain wiring assertions (15): for each LLM-enhanced
plugin → coordinator → service path, asserts service.llmRouter ===
kernel.llmRouter after kernel boot with an injected mock provider.
This is the precise structural test for the gap the author's friend
flagged — a regression in any domain's wiring fails immediately.
- Behavioral end-to-end (1): TestExecutorService.analyzeFailuresWithLLM
actually invokes the mock provider; assert generateCalls counter
incremented and the response surfaced.
- Sanity (1): kernel.llmRouter is defined when a router was built.
Phase 4b — Real-provider E2E smoke test
- tests/e2e/llm-router-real-providers.test.ts (new, 3 tests).
- Gated by AQE_LLM_E2E=1; each provider auto-skips when its API key
isn't in env.
- Uses mode: 'manual' to bypass DEFAULT_QE_ROUTING_RULES (which would
otherwise route generic tasks to Claude even when defaultProvider
is set to something else — worth knowing).
- Verified live on 2026-05-21 against:
Gemini (gemini-2.5-flash) → "Hi!"
OpenAI (gpt-4o-mini) → "Hi!"
OpenRouter (openai/gpt-4o-mini) → "Hi!"
Claude intentionally skipped — the ANTHROPIC_API_KEY in the dev env
is a 24-char stub (real Anthropic keys are ~108 chars), would 401.
Phase 4c — Documentation
- docs/implementation/adrs/ADR-043-vendor-independent-llm.md: added
"Wiring Verified" status entry (2026-05-21) + full addendum documenting
the problem found, the four-phase resolution, the verification tests,
and the behavioral consequence for users.
- docs/implementation/adrs/ADR-051-agentic-flow-integration.md: added
"LLM-Enhancement Wiring Verified" status entry pointing to ADR-043's
addendum.
- CHANGELOG.md: added [Unreleased] section under Changed — behavioral,
explicitly noting the behavior shift (fleets with provider keys in env
will now start routing LLM calls through that provider), the opt-out
path (KernelConfig.llmRouter: { enabled: false }), and the persistence
fix for `aqe llm config --set`.
Test totals across all four phases on this branch
- 39 unit tests across 5 files (Phase 1)
- 17 integration tests in 1 file (Phase 4a)
- 3 real-provider E2E tests in 1 file (Phase 4b, AQE_LLM_E2E=1)
- 34 pre-existing kernel tests still pass (no regression)
- 22 pre-existing test-generation coordinator tests still pass (no regression)
- Clean tsc --noEmit across the full project
Refs ADR-043, ADR-051
Closes the wiring gap identified by user audit on 2026-05-21
Builds on
|
||
|
|
a9f7082f15 |
fix(embeddings): harden ADR-097 endpoint client against devil's-advocate audit
Closes 11 findings from a post-merge audit of the external embedder endpoint implementation. The "no silent hash fallback" correctness promise was being contradicted by two callers; the connect timeout was actually an idle timeout; the identity probe could be bypassed in several paths; and identity drift across runs was undetectable. All hardened. Critical/High fixes: - sqlite-persistence backfill no longer falls back to hash embeddings when the endpoint is configured; re-raises to protect the HNSW index from non-comparable vectors (was poisoning silently on every endpoint blip). - qe-reasoning-bank.embed() propagates the throw under isUsingEndpoint() instead of silently substituting a hash vector. - EmbedderEndpointClient.embed() now gates on probe() — lazy probe on first use with in-flight dedup so 20+ concurrent embeds share one probe. - Circuit breaker recovery (window expires) clears cached identity so the next embed re-probes — endpoint restarts often coincide with model swaps. - True TCP-connect timeout enforced at the socket layer (was req.setTimeout, which is an idle-after-write timeout — SYN blackholes hung ~75s instead of 5s). - Endpoint identity persisted to memory.db kv_store (_system namespace) — cross- run fingerprint drift now surfaces as a loud warning on next boot. Medium fixes: - encoding_format: 'float' pinned in request; base64 responses fail loud. - TLS knobs (ca, cert, key, rejectUnauthorized, servername) passthrough for self-hosted https endpoints without NODE_TLS_REJECT_UNAUTHORIZED=0. - URL userinfo stripped + warned at parse; redacted from all error messages and logs. - Embedding cache key namespaced by mode (endpoint:<fingerprint>:<text> vs inproc:<text>) — cross-mode collisions structurally impossible. Tests: - 33 unit tests pass (was 23): adds probe-gate, breaker re-probe, connect timeout, DNS failure, concurrent embed dedup, base64 fail-loud, URL redaction, encoding_format wire format. - 6 live integration tests against real llama-server (all-MiniLM-L6-v2.Q8_0.gguf): probe, single embed, batch, lazy probe gate, dim mismatch, 50-input batch. Replaces the prior "9ms in-process fake" with honest numbers (cold 15ms, warm 2ms against localhost llama.cpp). - New tests/integration/embedder-endpoint-llamacpp.test.ts is gated on AQE_LLAMA_EMBED_URL so it skips cleanly in CI without the binary. ADR-097 updated with the per-caller audit table (12 writers verified non-poisoning) and "drop-in for 6 providers" claim softened to "verified against llama-server; OpenAI shape compat expected but unverified" per provider. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
b17309b3f8 |
feat(embeddings): optional external embedder endpoint (ADR-097, #503)
Add opt-in OpenAI-compatible /v1/embeddings client to eliminate duplicate in-process model loads in ruflo/ruvector co-deployments and the per-hook cold-load cost in fresh agentic-qe CLI processes. When EmbeddingConfig.endpoint (or AQE_EMBEDDER_ENDPOINT) is set, the @huggingface/transformers import is bypassed entirely and feature-extraction routes through the remote service. Endpoint unset = today's behavior. Wire format is OpenAI's /v1/embeddings so any existing embedder server (TEI, vLLM, llama.cpp, Ollama, LocalAI, LM Studio, OpenAI) works as a drop-in, not just bespoke ruvector servers. Transport is HTTP or HTTP-over-Unix-socket. Errors hard-fail with a circuit breaker (3 failures / 60s window) — no silent hash-embedding fallback, which would poison the HNSW index by mixing non-comparable vectors. A startup probe asserts dim === 384 and computes a stable identity fingerprint that catches model/quantization drift at the boundary. - src/learning/embedder-endpoint-client.ts: OpenAI client with keep-alive agent, 5s/30s timeouts, Bearer auth from env, circuit breaker, probe - src/learning/real-embeddings.ts: endpoint branch placed strictly before the dynamic transformers import so the cold-load fix holds at runtime; new isUsingEndpoint() / getEndpointIdentity() observability helpers - 23 new unit tests (real http.createServer fixtures, no http mocking) - End-to-end smoke: 9ms for import + init + probe + embed, transformers never appears in the loaded-module list Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
d698c58721 |
fix(routing): collapse Q-state to 3-dim (drop complexityBucket) (#499)
ADR-096 fix #3 (Option A): the previous 4-dim state_key taskType|priority|domain|complexityBucket fragmented semantically identical tasks across cells. complexityBucket was derived from raw description length (round(min(len/200,1)*10)) — so a 55-char and 130-char phrasing of the same task landed in different Q-rows, and QWEIGHT_RAMP_VISITS=20 was rarely reachable per cell even after the fix #1/#2 loop closure. State key is now 3-dim: taskType|priority|domain Same change applied at both ends of the loop: - buildRoutingStateKey (agent-routing.ts) — parameter and key shape - updateHookRouterQValue (hooks-dream-learning.ts) — state_key SQL - qe-reasoning-bank.ts reader-side call - task-hooks.ts post-task writer call - routing-hooks.ts post-route writer call (new in fix #1) `deriveComplexityBucket` stays exported (marked @deprecated for state_key use) — the pre-task bridge payload still carries `complexityBucket` for kv_store schema compatibility and any downstream telemetry. `TaskBridgePayload` interface unchanged. Migration: existing rl_q_values rows written under the previous 4-dim key are orphaned. Field reports show real installs have at most ~2 such rows (the loop was broken; no real Q-data accumulated), so we accept the orphans rather than ship a migration. If a future install carries substantial 4-dim data, a one-shot script that strips the trailing |N segment is straightforward. Test contract extended: - agent-routing-exploration.test.ts pins the 3-segment key shape - route-q-loop-closure.test.ts asserts complexityBucket does NOT leak into updateHookRouterQValue payloads (writer-side check) and that bridge.complexityBucket is ignored even when present. ADR-096 updated: complexity-bucket promoted from Open Questions to Decision (Option A). Open Questions now lists "re-introducing a coarse complexity tier if telemetry shows the 3-dim key conflating decisions that benefit from differentiation" as a wait-and-measure follow-up rather than a planned change. Refs: #499 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
d41bbc22b0 |
fix(routing): close Q-loop on routing surface (#499)
The route hook (UserPromptSubmit) reads `rl_q_values` to produce qWeight, but the only writer was task-hooks `post-task` gated on `outcome.bridge`. On real projects, `routing_outcomes` reached 139 rows while `rl_q_values` stayed at 2 — the route surface that displays qWeight had nothing to read, so `qWeight: 0` was structurally pinned. Two complementary producer additions, ADR-096: Fix #1 — post-route trains rl_q_values When the Stop hook resolves a routing_outcomes sentinel, derive a state_key from the sentinel's `task_json.description` using the same exported helpers the route hook used (`deriveTaskType`, `deriveComplexityBucket`, `detectQEDomains`) and call `updateHookRouterQValue`. Writer and reader address byte-identical rows. Best-effort + try/catch: Stop hooks must never crash the host. Fix #2 — post-task fires even when bridge is absent Drop the `if (outcome.bridge)` gate. When bridge is missing, derive state from `options.description` instead. Adds a new `--description` option to `aqe hooks post-task` so the PostToolUse hook command can pass `tool_input.description` for Task tools. Skip the update only when neither bridge nor description is available (would pollute an "unknown" sentinel state). Tests: tests/unit/cli/commands/route-q-loop-closure.test.ts pins the producer/consumer state_key alignment contract — if a future refactor desynchronizes the three call sites (routing-hooks.ts post-route, task-hooks.ts post-task, qe-reasoning-bank.ts:530), assertions fail the build. Closes the Open Question flagged in ADR-095. The deriveComplexityBucket fragmentation Jordi noted is acknowledged in ADR-096's Open Questions and tracked for a follow-up — orthogonal to closing the loop. Refs: #499 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
70154c1b72 |
feat(routing): three-signal routing — static + Q-value blend + mincut-gated ε-greedy (ADR-095, #488 Phase 4)
Closes the self-learning loop: the Q-value Bellman updates that #487 populates now have a routing-side reader; structurally-aware exploration (via the mincut infrastructure from ADR-047 / ADR-068) gathers Q-table signal beyond the deterministic greedy winner; the catalog diversifies without sacrificing safety on bottleneck decisions. Three signals blended at the agent-routing decision point: 1. Static score (existing): domain match + capability match + performance prior + language boost + pattern similarity. Computed by `calculateAgentScores` in src/learning/agent-routing.ts. 2. Q-value blend (NEW — reads from rl_q_values): effectiveScore = staticScore * (1 - qWeight) + sigmoid(qValue) * qWeight qWeight ramps from 0 (no Q-data) to MAX_Q_WEIGHT=0.4 over QWEIGHT_RAMP_VISITS=20 visits per (state_key, action_key). Cold-start behavior is identical to pre-ADR-095 static-only routing; the learned signal contributes meaningfully only after the Q-table has matured for that state. 3. Mincut-gated ε-greedy exploration (NEW): baseEpsilon = AQE_ROUTER_EXPLORATION_RATE env or 0.05 default safetyMultiplier = getSharedMinCutMonitor().isCritical() ? 0.2 : 1.0 epsilon = baseEpsilon * safetyMultiplier With probability ε, swap the greedy winner with a uniformly-random pick from the top-3 alternatives. Uses crypto.randomInt (NOT Math.random) to match the codebase convention (randomUUID is the established crypto entry-point in the same modules). Maintainer decisions captured in ADR-095 v2: 1. Default ON (Option A): mincut-modulated exploration ships enabled. AQE_ROUTER_EXPLORATION_RATE=0 is the documented escape hatch. 2. Telemetry surface: extended `aqe learning loop-health` with a new "Routing diversification" section showing 7-day exploit/explore counts, avg quality_score per bucket, avg criticality, avg q_weight. 3. crypto.randomInt over Math.random — codebase convention preserved. 4. Q-value ramp constants are best-guess (MAX_Q_WEIGHT=0.4, QWEIGHT_RAMP_VISITS=20); tune post-deploy from telemetry. Source-level findings worth noting: - `rl_q_values` was populated by `updateHookRouterQValue` since #487 but NEVER read during routing. Verified via grep across src/learning/, src/routing/, src/cli/commands/hooks-handlers/. This commit adds the reader; closes that loop. - Mincut graph is populated by Queen coordinator swarm activity, NOT per-task. So the "criticality" signal is graph-level safety (the `isCritical()` boolean from MinCutHealthMonitor) rather than per-task structural weight. Honest framing reflected in the ADR. What landed: src/kernel/unified-memory-schemas.ts - routing_outcomes gains exploration (INTEGER NOT NULL DEFAULT 0), criticality (REAL), q_weight (REAL) columns + an exploration index for the loop-health bucket queries src/routing/routing-outcomes-migration.ts (NEW) - ensureRoutingOutcomesAdr095Columns(db) — idempotent ALTER TABLE for pre-existing databases. Process-local flag avoids repeat work. src/routing/routing-feedback.ts - hooks the migration helper into the existing schema-migration block src/learning/agent-routing.ts - new helpers: blendStaticAndQValue, resolveExplorationRate, applyExplorationPolicy (uses crypto.randomInt), sigmoid normalization - new helpers: deriveTaskType, buildRoutingStateKey, deriveComplexityBucket — moved from task-hooks.ts so the routing path and the post-task Q-update path share the same state_key derivation - calculateAgentScores accepts optional qValueLookup; backward-compat when undefined (identical pre-ADR-095 behavior) - ScoredAgent gains optional telemetry fields: staticScore, qWeight, qValue, qVisits, exploration src/learning/qe-reasoning-bank-types.ts - QERoutingResult gains optional exploration / criticality / qWeight src/learning/qe-reasoning-bank.ts - routeTask builds the Q-value lookup from rl_q_values keyed by stateKey = deriveTaskType(task) | normal | domain | complexityBucket - applies exploration policy after sort; reports avgQWeight + the mincut safetyMultiplier in the QERoutingResult - new private buildQValueLookup helper with table-exists guard so the method is a graceful no-op when the schema isn't applied yet (tests, fresh-init scenarios) src/cli/commands/hooks-handlers/task-hooks.ts - private deriveTaskType removed (DRY: now imported from agent-routing) - pre-task sentinel INSERT writes the three new columns - migration helper invoked before write src/cli/commands/hooks-handlers/routing-hooks.ts - JSON output passes exploration / criticality / qWeight through - INSERT writes the three new columns; migration helper invoked src/cli/commands/learning.ts - `aqe learning loop-health` queries routing_outcomes for 7-day rolling exploration stats and avg quality_score per bucket. Skipped silently when the columns don't exist (pre-ADR-095 databases). Tests: - tests/unit/learning/agent-routing-exploration.test.ts: 35 tests cover sigmoid blend math, qWeight ramp, env override priority, mincut safety multiplier, exploration rate statistical tolerance, only-top-3 alternative constraint, deriveTaskType regex coverage, stateKey format, complexityBucket scaling, end-to-end Q-blend - tests/unit/routing/routing-outcomes-migration.test.ts: 5 tests cover fresh-DB migration, idempotent re-run, missing-table tolerance, exploration index creation, column type/default checks 634/634 tests pass across CLI commands, workers, bridge, learning, init/phases, architecture, kernel, and routing suites; build clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
6236a2cdc7 |
feat(kernel): kernel-side dream cycles + hooks-as-producers boundary (ADR-094, #488 Phase 2)
Moves dream cycles out of hook subprocesses into the long-lived kernel
process via the DreamScheduler that already existed but was never wired.
Single cutover, no feature flag — per maintainer decision on ADR-094.
Why this matters
================
Before this commit, every ~20 Edit/Write tool uses triggered a dream cycle
inside a short-lived `npx aqe hooks post-edit` subprocess. The cycle held
a SQLite write transaction for up to 10 seconds while the kernel-owning
MCP server, other hook subprocesses, and user MCP tool calls queued
behind it. stderr from the cycle was consumed by Claude Code's hook
reader and lost from operator visibility. Cold DreamEngine init paid
every ~20 edits.
Now the kernel's `QEKernelImpl.initialize()` boots a `DreamScheduler`
that runs cycles on its own cadence inside the long-lived process. Hook
subprocesses keep only `incrementDreamExperience` (a counter bump that
returns in ~50ms). Operators see `aqe learning loop-health` report the
`dreamScheduler` component as live within one tick.
What landed
===========
src/kernel/kernel.ts
- new private `_dreamScheduler?: DreamScheduler`
- new config flag `enableDreamScheduler` (default `true`, mirrors
`enableExperienceBridge`)
- initialize() constructs DreamEngine + DreamScheduler after the
bridge starts, wraps in try/catch (best-effort), failure logs a
warning and continues (kernel boot never blocks on this)
- dispose() stops the scheduler BEFORE bus/memory cleanup so a dream
in-progress doesn't write to a disposed backend
src/learning/dream/dream-scheduler.ts
- executeDream() now records loop-health on every tick (success or
failure) via the helper from #488 Phase 1 B.2. Operators see
`learning:loop-health.components.dreamScheduler.successesSinceBoot`
grow on each cycle.
src/cli/commands/hooks-handlers/editing-hooks.ts
src/cli/commands/hooks-handlers/task-hooks.ts
- dropped `checkAndTriggerDream` import + call
- kept `incrementDreamExperience` (the counter is the producer-side
signal the kernel scheduler reads)
- JSON output now emits `dreamTriggered: false, dreamReason:
'deferred-to-kernel'` so operator scripts grepping the field see
*where* the cycle actually runs
src/cli/commands/hooks-handlers/hooks-shared.ts
- removed the `checkAndTriggerDream` re-export. The function itself
is still defined in hooks-dream-learning.ts and exported there for
direct test access and the documented rollback path.
tests/unit/architecture/hooks-boundary.test.ts (NEW)
- greps `src/cli/commands/hooks-handlers/` for forbidden patterns:
imports from `src/learning/dream/` and references to
`checkAndTriggerDream`. Skips comment lines so explanatory mentions
don't false-positive. `hooks-dream-learning.ts` is in `allowedFiles`
since it DEFINES the function.
- This is the enforcement mechanism for the boundary contract. A
contributor accidentally re-adding heavy hook-side work gets a
clear CI failure pointing them at ADR-094.
tests/unit/kernel/dream-scheduler-wiring.test.ts (NEW)
- asserts `enableDreamScheduler` default, opt-out path, init+dispose
cleanliness with and without the scheduler, idempotent dispose
tests/unit/cli/commands/post-edit-dream-trigger.test.ts (REWRITTEN)
- was asserting checkAndTriggerDream was called from post-edit (the
#480 fix). That contract is now wrong — the kernel is the only
place that triggers dreams.
- now asserts: counter is bumped (the kernel reads it), no inline
cycle trigger, JSON emits `deferred-to-kernel`, hook stays robust
when the memory backend throws.
docs/implementation/adrs/ADR-094-kernel-side-dream-cycles.md
- status: Implemented
- migration section replaced with the single-cutover rationale and
a documented 4-line rollback path
583/583 tests pass across CLI, workers, bridge, learning, init/phases,
architecture, and kernel suites. Build clean.
Boundary contract (now enforced in CI)
======================================
Hook subprocesses MUST NOT do work that exceeds ~100ms. Acceptable
hook-side work: producer SQLite writes, counter increments, in-memory
routing lookups. Unacceptable: DreamEngine init, multi-second SQLite
transactions, anything that depends on long-lived state.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|
|
5d187de2a1 |
fix(install,rvf,hypergraph): unblock Windows install, fix RVF FsyncFailed, synthesize covers edges
Bundles fixes for issue #439 (Windows install) and Jordi RUFLO patches P020 (RVF init) + P220 (hypergraph blindness). Windows install (#439): - Move hnswlib-node from dependencies to optionalDependencies so installs no longer fail on Windows boxes without VS C++ Build Tools; HnswAdapter already routes around a missing native binary at runtime. - Replace HNSWIndex.ts top-level static `import hnswlib from 'hnswlib-node'` with a lazy require so package load survives the optional dep being absent. - README + preinstall.cjs: document toolchain requirement and disclose that the JS fallback degrades to O(N) brute-force when @ruvector/gnn is also unavailable (Windows default — no win32 prebuilds ship). - ADR-090 amendment reconciling the move with ADR-081's optional-dep + JS-fallback intent. RVF init (Jordi P020): - Root cause: shared-rvf-adapter and pattern-store factory always called RvfDatabase.create(), which throws `0x0303 FsyncFailed` when the .rvf file already exists from a prior init phase. Reproduced and confirmed against both 0.1.7 and 0.1.8 native binaries — not a version regression. - Fix: race-tolerant open-or-create ladder (try open → fall back to create → retry open on create-race) with dim() verification after open. Mismatched-dim files are closed and the caller degrades rather than corrupting silently. Hypergraph (Jordi P220): - Drop the original flushEdgesToHypergraph (wrote `call`/`extends` edges that no production query reads — devil's-advocate review caught it as dead infrastructure). - Add HypergraphEngine.synthesizeTestCoverage that re-tags test files type='test' and writes `covers` edges from each test file to functions in the source files it imports. This is the shape findUntestedFunctions / findImpactedTests actually filter on. - E2E verified: untested correctly excludes covered functions; impacted-tests returns the right test file. Verification: - `npm run build` clean - 276/276 tests pass across HNSW, RVF, KG, coordinator, hypergraph suites (5 new synthesizeTestCoverage tests; replaced 4 obsolete flush tests) - E2E on fresh project: aqe init clean, hooks stats shows nativeAvailable: true, code index logs `Test coverage synthesized`, hg untested + hg impacted return useful results Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
70e900e0f9 |
feat(adr-091): promote to Implemented + trust_tier 3
Promotion gate documented in ADR-091 (first green CI run of
test-qe-browser.yml against real Vibium) cleared at commit
|
||
|
|
cda9fb3c05 |
fixup(adr-091): address devil's-advocate review
Single commit covering the 5 concrete findings from the qe-devils-advocate review. Does not change the underlying CommandEvalRunner design or the 5 primitives — only the claims around them and the fixture-server hack the yaml had silently inherited. 1. Revert promotion (G4): trust_tier 3 -> 2 in SKILL.md; ADR-091 status Implemented -> In Progress (2026-04-21); v3-adrs.md index row updated to reflect the same; counts 80->79 Implemented, 6->7 In Progress. The promotion gate is now documented on ADR-091: first green CI run of test-qe-browser.yml (unit + smoke + eval against real Vibium) before trust_tier 3 / Implemented are restored. 2. Fix yaml fixtures (G3): tc006/tc007 were referencing http://localhost:8088/qe-browser/SKILL.md.html which required an unstarted fixture server, so `aqe eval run --skill qe-browser` would have failed on a fresh machine. Rewrote both to use https://httpbin.org/html (matching scripts/smoke-test.sh tc006/tc007). Dropped tc009 (poisoned-page check-injection) from the yaml — it needs the local serve-skills.js fixture which is out of scope for CommandEvalRunner. Documented as an explicit GAP comment in the yaml, noted that check-injection.js's severity path is unit-tested at tests/unit/scripts/qe-browser-check-injection.test.ts. yaml test_cases now 11 -> 10. 3. Correct pin comment wording (G1): the previous comment claimed ^26.3.18 was a "major.minor-line pin" — that's factually wrong under npm semver (^26.3.18 accepts 26.99.x). Rewritten to accurately describe the intent: major-line pin that blocks 27.0+ while allowing auto-uptake of 26.x security patches and additive features, with scripts/smoke-test.sh as the belt-and-suspenders API contract gate. The spec itself stays ^26.3.18 — the correct choice for an end-user tool under semver assumptions. 4. Add eval CI job (G2): third job in test-qe-browser.yml runs `aqe eval run --skill qe-browser --model claude-3.5-sonnet` against a real Vibium install after `npm run build`. This is the end-to-end proof that CommandEvalRunner dispatch works that the previous unit tests (all mocked CommandRunner) could not provide. Uploads the eval JSON as a CI artifact for post-run inspection. actionlint clean. 5. Scrub stray files (G5): git rm the coherence-comparison artifacts from docs/reports/ that were swept in by a prior `git add -A`, and added a focused pattern to .gitignore (not a blanket docs/reports/ ignore) so future sessions can't repeat the mistake while intentional reports can still be committed. Tests: 51 relevant tests still pass (3 files: command-eval-runner, command-eval-runner-qe-browser, browser-engine-installer). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
23416e1577 |
feat(adr-091): promote to Implemented — trust_tier 3, platform hint, yaml/smoke unify
Closes GAP-05, GAP-08, and final verification gate. - Linux ARM64 diagnostic (GAP-05): browser-engine-installer now probes os.platform + os.arch on Linux aarch64 and checks a prioritized list of system chromium locations (/usr/bin/chromium, chromium-browser, google-chrome, google-chrome-stable, /snap/bin/chromium). When a browser is found, the install result carries a PlatformHint with an exact VIBIUM_BROWSER_PATH export the user can copy. When none exists, the hint surfaces the `apt-get install chromium` remediation. Wired into phase 09 so it prints after vibium install succeeds. 5 new tests. - GAP-08: added explicit `vibium --headless viewport 1280 720` setup steps to yaml tc006/tc007 so the eval runs are as deterministic in CI as smoke-test.sh. Updated smoke-test.sh header to note the yaml is the canonical spec and the bash script is its mirror (covers the F1 vibium-missing contract case the yaml can't express cleanly). - Trust tier promoted 2 -> 3 now that (a) the eval is runnable via CommandEvalRunner, (b) CI runs both unit tests + smoke gate, and (c) all 11 dependent browser-using skills either reference qe-browser or document their intentional Playwright fallback. - ADR-091 status: Proposed -> Implemented (2026-04-21). - v3-adrs.md index reflects 80 Implemented / 6 In Progress / 3 Proposed. Verification: 643/643 tests pass across tests/unit/validation/, tests/unit/init/, tests/unit/scripts/qe-browser-*. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
864741a757 |
docs(adr-093): mark Accepted — Phases 1, 2, 4 implemented; Phase 3 not required
Status moves from Proposed to Accepted. Phase 3 thinking-config shim
dropped from scope after codebase sweep confirmed no raw-Messages-API
callers pass {type: enabled, budget_tokens: N}. Remaining work tracked:
Cyber Verification application submission (external) and 30-day
telemetry recalibration (~2026-05-17).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|
|
b055560e81 |
feat(adr-093): set Opus 4.7 as default ADR-092 advisor model
Commit 5 of 6 for ADR-093 (Commit 4 skipped — no thinking-config callers to shim; documented in the implementation plan). * src/routing/advisor/multi-model-executor.ts: DEFAULT_ADVISOR_MODEL upgraded from 'anthropic/claude-opus-4' to 'anthropic/claude-opus-4.7'. When TinyDancerRouter sets triggerMultiModel=true (confidence < 0.80, or < 0.85 for security tasks), MultiModelExecutor.consult() now dispatches to Opus 4.7 by default via HybridRouter.chat() + OpenRouter provider. * tests/routing/advisor/multi-model-executor.test.ts, tiny-dancer-router-advisor.test.ts: update expected provider model IDs. SWE-bench Verified 87.6% (vs 80.8% Opus 4.6), SWE-bench Pro 64.3% (vs 53.4%), CursorBench 70% (vs 58%). Vendor-independence preserved — consultations still flow through HybridRouter's 7 providers per ADR-043. Verification: * 0 tsc errors * 65/65 advisor unit tests pass Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
3ee1fbf518 |
feat(adr-093): add Opus 4.7, Sonnet 4.6, Haiku 4.5 to model registry
Commit 1 of 6 for ADR-093 Opus 4.7 migration. No runtime behavior change.
* src/shared/llm/model-mapping.ts: add MODEL_MAPPINGS entries for
claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5 with
anthropic / openrouter / bedrock IDs.
* src/shared/llm/model-registry.ts:
- extend ModelCapabilities with optional supportsAdaptiveThinking,
supportsEffortXHigh, tokenizerVersion fields (non-breaking)
- add MODEL_REGISTRY entries for 4.7 (1M context, xhigh, opus-4-7
tokenizer, $5/$25/MTok), 4.6 (standard 200k, legacy tokenizer,
$3/$15), 4.5 haiku
- mark claude-sonnet-4 deprecationDate 2026-06-15 (retired
alongside Sonnet 4 per Anthropic announcement)
- mark claude-haiku-3-5 deprecationDate 2026-02-19 (already retired)
- export DEFAULT_SONNET_MODEL = 'claude-sonnet-4-6',
DEFAULT_OPUS_MODEL = 'claude-opus-4-7',
DEFAULT_HAIKU_MODEL = 'claude-haiku-4-5',
RETIRING_MODELS registry with ISO retirement dates
* tests/unit/shared/llm/model-registry.test.ts: 14 new tests covering
new registry entries, central constants, and deprecation metadata.
All 154 tests across registry/mapping/cost-tracker pass.
* docs/implementation/adrs/ADR-093-opus-4-7-migration.md: new ADR
capturing migration decisions (Sonnet 4.6 as Tier 3 default, Opus 4.7
as escalation target, xhigh fleet-wide, thinking-config shim,
Cyber Verification for security agents, Routines/Monitor deferred
to ADR-094).
* docs/implementation/adrs/v3-adrs.md: ADR-093 index row added.
* docs/implementation/plans/ADR-093-IMPLEMENTATION-PLAN.md: 6-commit
execution plan with per-commit verification + rollback strategy.
* docs/security/cyber-verification-application.md: Cyber Verification
Program application draft (submitted 2026-04-17).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|
|
24e30e0584 |
feat(advisor): implement ADR-092 provider-agnostic advisor strategy
Multi-model routing layer with circuit breaking, PII redaction, and domain-specific prompts for the Queen coordinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
9c52823e0e |
fix(qe-browser): F1 — implement documented vibium-unavailable contract
Phase 5 UAT discovered the helper scripts surfaced missing-vibium as `actual: "eval error: vibium binary not found..."` inside a `failed` envelope. The Fallback Policy in SKILL.md said scripts MUST return status:"skipped" with reason "browser-engine-unavailable" — that contract was aspirational. F1 makes it real. Contract changes: - lib/vibium.js: ENOENT now throws typed VibiumUnavailableError (with stable code:"BROWSER_ENGINE_UNAVAILABLE" for cross-module duck typing) - New helper unavailableEnvelope() returns canonical skipped envelope with top-level vibiumUnavailable:true and output.reason field - New runOrSkip() wraps each helper's main() and converts the typed error into the documented envelope on the way out - New rethrowIfUnavailable() helper used inside per-script catch blocks so missing-vibium bubbles past local "convert exception to fail()" handlers — assert.runConsoleCheck/runNetworkCheck/runBrowserSideCheck, batch's per-step catch, check-injection main, intent-score main, visual-diff main all updated - emit() now returns exit code 2 for status:"skipped" (was 1) - Exit code contract documented: 0=success, 1=failed, 2=skipped Downstream skills can now branch on result.vibiumUnavailable === true or exit code === 2 instead of grepping the actual string for "vibium binary not found". Tests: 103 (was 86). New file qe-browser-unavailable-e2e.test.ts spawns each of the 5 helpers under PATH=/tmp/fake-bin (node only, no vibium) and asserts exit 2 + skipped envelope shape. vibium-lib test grew from 10 to 22 cases including VibiumUnavailableError, runOrSkip, exit codes. Smoke test: 10/10 PASS (was 9/9). New tc011 builds a fake bin dir inside the smoke test work dir and verifies the contract end-to-end against the actual installed scripts. SKILL.md updated: - Output Contract section now documents all 3 statuses with shapes and exit codes - Fallback Policy replaced generic prose with concrete bash + Node snippets that branch on the structured field ADR-091 Phase 6 documents the change and verification. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
e468038c4d |
docs(adr-091): Phase 5 — user-perspective verification of qe-browser
Ran fresh `aqe init --auto` against an empty test project at /tmp/qe-browser-uat and exercised every helper script as a real user. 12 checks documented in ADR-091, all passing: 1. qe-browser skill installed cleanly 2. navigate + assert end-to-end against httpbin.org 3. M5 --threshold=0.42 form parsed live (verified non-default value) 4. M6 batch pre-validation aborts BEFORE side effects 5. M7 intent-score returns scored candidates from real form 6. M4+M8 check-injection --exclude-selector strips body (3595→35 chars) 7. M2 fixture server binds 127.0.0.1 (verified via banner) 8. M3 path traversal blocked (HTTP 404 on /etc/passwd.html) 9. Vibium-missing fallback returns clear actionable error 10. Installed smoke-test.sh: 9/9 PASS from inside test project 11. Idempotent re-init: Browser engine line still printed 12. JSON envelope contract validated on every emit H6 pre-flight short-circuit confirmed in production: "Browser engine: vibium 26.3.18 (already installed)" The "this can take 1-3 minutes" banner is suppressed when vibium is already on PATH, matching the documented Phase 2 behavior. New finding logged as F1 (NOT a Phase 4 regression): Helper scripts surface missing-vibium as `actual: "eval error: ..."` inside a `failed` envelope. The SKILL.md Fallback Policy says downstream skills should report status:"skipped" reason: "browser-engine-unavailable". A cleaner contract would be a top-level vibiumUnavailable:true flag. Not a blocker. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
3eb9ccc461 |
fix(qe-browser): Phase 4 — all 9 medium devil's-advocate findings
M1 visual-diff threshold: documented "max difference fraction" convention matching Playwright maxDiffPixelRatio (was inconsistent in docs/code). M2 fixture server bind: default to 127.0.0.1 instead of 0.0.0.0; QE_BROWSER_FIXTURE_HOST=0.0.0.0 opt-in for explicit external access. Codespaces auto-forwards 0.0.0.0 ports — this was an unintentional open server every time the eval ran. M3 path-traversal guard: replaced startsWith() with path.relative() + '..'/absolute check. The old guard false-passed sibling-prefix dirs (/foo vs /foo2) and was fragile on Windows mixed separators. M4 ANSI escape injection: added sanitizeSnippet() that strips C0 controls (0x00-0x1F except \t\n) and DEL (0x7F) from every check-injection finding snippet. Prevents `cat findings.json` from triggering terminal control sequences embedded in malicious page content. M5 parseArgs --key=value: split on first '=' so --threshold=0.05 works alongside --threshold 0.05. Only the first '=' is split so URL/base64 values survive intact. M6 batch.js pre-validation: added validateAllSteps() that walks every step's required fields BEFORE the first vibium call. Step 17 typo now aborts before steps 1-16 execute their side effects. M7 intent-score bare-x regex: anchored \bx\b in close_dialog scorer so "fix", "exit", "extra", "sixteen" no longer match. Unicode × and ✕ unchanged. M8 check-injection --exclude-selector: new flag drops subtrees from the scan. Page text is read from a CLONE of <body> with matching elements removed — live page unchanged. Lets docs sites scan their own pages without self-flagging documentation about prompt injection. M9 09-assets vibium catch: wrapped raw error with actionable recovery guidance (`npm install -g vibium`, then re-run `aqe init`). Hidden bug found and fixed during M2/M3 testing: fixtures/serve-skills.js existed but had never been run because the repo root is ESM and the file uses CommonJS require(). Added scoped fixtures/package.json with "type": "commonjs" matching the existing scripts/package.json pattern. Tests: 86 unit tests across 7 files (was 50). All pass. Smoke test: 9/9 still passing against real Vibium v26.3.18. Mirrored .claude/skills/qe-browser → assets/skills/qe-browser. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
4e52d573f7 |
fix(qe-browser): Phase 3 — real Vibium smoke test verified 9/9 passing
User pushed back on Phase 3 attempt 1 ("blocked on linux-arm64"). After
re-verifying upstream — Vibium 26.3.18 IS the latest on npm, Chrome for
Testing across Stable/Beta/Dev/Canary still ships only linux64 (x86_64),
mac-arm64, mac-x64, win32, win64 — installed Debian's native ARM64
chromium + chromium-driver via apt and symlinked them into Vibium's
cache. Then ran the smoke test for real and found four real bugs in
the qe-browser helper scripts that would have shipped broken.
Bugs found and fixed:
1. Eval contract was wrong. lib/vibium.js's vibiumEvalStdin sent
`console.log(...)` expecting Vibium to capture it. Vibium doesn't —
`eval` returns the LAST EXPRESSION's value as
`{"ok":true,"result":"<stringified>"}`. Fix: dropped console.log
wrappers from assert.js/intent-score.js/check-injection.js; added
unwrapEvalResult() in lib/vibium.js that parses the envelope and
JSON-decodes the result string back into our object.
2. lib/vibium.js did not inject --headless. Vibium defaults to visible
browser, which fails in headless containers with "Missing X server
or $DISPLAY". Fix: lib/vibium.js prepends --headless unless
QE_BROWSER_HEADED=1 is set in the env.
3. `vibium screenshot -o /abs/path/foo.png` ignores the directory and
saves to `~/Pictures/Vibium/foo.png`. Verified live. Fix:
visual-diff.js passes just the basename, reads from Vibium's actual
output dir, copies to the requested path, unlinks the source.
4. `vibium screenshot --selector` flag does NOT exist in v26.3.x.
Verified via `vibium screenshot --help`. Fix: visual-diff.js throws
a clear error with remediation guidance if a caller passes
--selector. (B3's "fall back to eval-clip" comment is now removed.)
Plus a real environment-flakiness fix: smoke-test.sh sets
`vibium viewport 1280 720` before tc006/tc007 visual-diff captures
because httpbin.org/html renders at non-deterministic dimensions
(765x672 vs 780x654 observed) when no viewport is set, causing
spurious pixel-diff failures.
Verbatim smoke test result on this codespace:
Smoke testing against vibium v26.3.18
PASS tc001 url_contains on httpbin form
PASS tc002 selector_visible h1 on httpbin /html
PASS tc003 failing assertion exits 1
PASS tc004 batch 3-step happy path
PASS tc005 batch stops on first failure
PASS tc006 visual-diff baseline created
PASS tc007 visual-diff second run matches
PASS tc008 check-injection clean page
PASS tc010 intent-score submit_form on httpbin form
PASS: 9 FAIL: 0 SKIPPED: 0
Unit tests still pass: 50/50 (one test had to be updated — it asserted
`buildScript` includes 'console.log', which is now correctly NOT in the
script after the eval-contract fix).
Phase 3 verification COMPLETE per ADR-091. The qe-browser helpers work
end-to-end against real Vibium + real Chromium + pinned httpbin.org
fixtures. The Linux ARM64 chromium-symlink workaround is documented in
ADR-091; user-facing docs in references/migration-from-playwright.md
still need updating (marked as Phase 4 follow-up).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
||
|
|
07f20e13cf |
docs(adr-091): Phase 3 attempt 1 — blocked on Linux ARM64 chromedriver
Ran the smoke test in this codespace (linux-arm64). Vibium installed
cleanly (v26.3.18) and the H1 detectVibium fix verified against real
binary output. tc003 and tc005 passed (failure-path tests that don't
need a browser). The other 7 tests failed because Google does not
publish chrome-for-testing for linux-arm64; Vibium downloaded the
linux64 (x86_64) variant which dies under Rosetta with an elf-loader
error.
Workarounds attempted and rejected:
- apt install chromium → native ARM64 binary works but Vibium
hardcodes its own cached chromedriver, no --browser-path flag
- searched the binary for VIBIUM_CHROME_PATH / --browser-path /
BROWSER env var support → none in v26.3.18
- System chromium responds at /json/version with CDP, not BiDi;
would need a BiDi-speaking chromedriver to use --connect
Conclusion: Phase 3 verification cannot complete on linux-arm64. This
is a Vibium upstream platform gap, NOT a qe-browser bug. The qe-browser
script-level integration with the real vibium binary IS partially
verified by the 2 passing tests.
Added "Vibium does not support Linux ARM64 today" to the Negative
Consequences section. PR reopen still gated on running smoke-test.sh
on linux-x64 or mac-arm64.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
||
|
|
72e6e2403b |
fix(qe-browser): Phase 1 blockers from devil's-advocate review + ADR-091
Three correctness blockers identified by qe-devils-advocate review of the initial qe-browser implementation (PR #420, closed without merge): B1: intent-score.js String.replace special-char corruption - SCORER_JS.replace('__SCOPE__', JSON.stringify(scope)) interpreted $&, $`, $', $1-$9 in the replacement string. Scopes like div[data-x="$amount"] silently corrupted the generated script. - Fix: split('__TOKEN__').join(value) for literal substitution. - Tests: 4 new regression tests covering $&, $', $1, intent placeholder. B2: assert.js fail-OPEN on console/network telemetry errors - runConsoleCheck/runNetworkCheck used to return ok:true when `vibium console --json` failed for any reason. no_console_errors silently reported pass when telemetry was unavailable. - Fix: new unavailable() sentinel returns ok:false + unavailable:true. runCheck surfaces it via a new `unavailable` field. Summary distinguishes "assertion failed" from "telemetry unavailable". - Bonus (H5): expected-field uses ?? not || so element_count {count: 0} reports `expected: 0` instead of `null`. - Tests: 2 new regression tests on the sentinel + element_count zero. B3: visual-diff.js dead fallback comment - Source comment promised "fall back to eval-clip if not present" but no fallback existed. Direct violation of feedback_no_unverified_failure_modes. - Fix: comment removed; specific error handler added for unsupported --selector flag with clear remediation message. No fake fallback — silently substituting full-page would produce wrong baselines. Plus: ADR-091 documents the Vibium-as-engine decision with full rejected-alternatives section (dev-browser, gsd-browser, Playwright MCP, status quo, build-from-scratch), four implementation phases, and a risks table tracking the 11 devil's-advocate findings with status. Phase 3 (real Vibium install + smoke test) is explicitly gating PR reopen. Verification: - 420/420 tests pass (387 init + 33 qe-browser, 6 new regression tests) - npm run build: clean - eslint on touched files: clean - All 6 helper scripts pass node --check Branch is intentionally not pushed and PR is intentionally not reopened until Phase 2 (H1, H2, H4, H6, H7, H8) and Phase 3 (real Vibium smoke test) are complete. Refs: docs/implementation/adrs/ADR-091-qe-browser-skill-vibium-engine.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
3e6bd4a6b4 |
docs(adr): ADR-090 hnswlib-node migration with empirical verification (#399)
Documents the four @ruvector/router 0.1.28 bugs found during the issue #399 investigation, the empirical verification numbers showing hnswlib-node fixes all four, the rejected alternatives (wait for upstream, tune efSearch, brute-force, hybrid threshold), and the user migration guide for stale vectors.db files. Includes a comparison table: - Recall@10 (1k vectors, default params): 10% → 100% - Self-vector found in top-10: NO → YES - Auto-creates files in CWD: YES → NO - Multiple instances per process: NO → YES - Dispose releases resources: NO → YES (immediate JS-side null) - Native filter functions: NO → YES - Runtime efSearch tuning: NO → YES - Resize past initial capacity: NO → YES - Insert latency (1k × 384 dim): ~430ms → ~324ms Cross-references the diagnostic scripts in `scripts/diagnose-issue-399*.mjs` that reproduce each bug and verify hnswlib-node's correctness on the same fixtures. CHANGELOG.md gets a new [Unreleased] section describing the migration, the removed CWD pollution, and the added test infrastructure. The release manager will rename [Unreleased] to the next version at release time. Refs #399. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
a6202c39a3 |
chore(release): v3.9.1 (#395)
* feat: implement ADR-062 (StrongDM all 3 tiers) and ADR-087 (RuVector 14/14 capabilities)
ADR-062 StrongDM Software Factory — all 6 actions across 3 tiers:
- Tier 1: Loop detection wired to MCP protocol-server (blocks on strike 3+),
token dashboard (pre-existing)
- Tier 2: Holdout testing (10% FNV-1a selection, filtered in test-execution),
gate ratcheting (monotonic 5-pass/2%/95% cap, persisted to MemoryBackend)
- Tier 3: Progressive context (TF-IDF prediction, reduces availableFiles on spawn),
meta-learning cycle (4 insight types, stored + published as domain events)
ADR-087 RuVector Advanced Capabilities — milestones 1-5:
- EWC++ recordOutcome + backgroundConsolidate wired to 3 domain coordinators
- R1: HDC fingerprinting (10K-bit hypervectors, wired to PatternStore.store())
- R3: Delta event sourcing (sparse encoding, wired to PatternStore.store())
- R13: Cognitive routing (predictive compression, wired to mailbox.send/receive)
- R14: Hyperbolic HNSW (Poincare ball, auto-indexed in PatternStore.store())
Also updates ADR statuses: 059, 060, 061 → Implemented (were already done),
062 → Implemented, 086 → In Progress, 087 → Implemented.
223 new tests across 11 test files, all passing. Zero regressions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: implement RVF cluster (ADR-065/066/067/071) with native benchmarks
Implements the RVF persistence cluster for persistent HNSW vector storage,
agent memory branching, and HNSW unification foundation.
Key changes:
- RvfPatternStore: IPatternStore backed by @ruvector/rvf-node native HNSW
(1.2ms cold-start, 0.19ms search p50, verified with real native binary)
- AgentMemoryBranch: per-agent COW isolation via derive(), ingest-log merge,
wired into Kernel.initialize() + DefaultAgentCoordinator
- HnswLegacyBridge: adapts old IHNSWIndex to unified IHnswIndexProvider,
wired into PatternStore when useUnifiedHnsw flag enabled
- Factory routing: createPatternStore() returns RvfPatternStore when flag
enabled + native available + data directory exists
- Dream engine: accepts external RVF adapter (no duplicate file handles),
RVCOWBranchManager enhanced with recall validation check
- @ruvector/gnn bumped 0.1.19→0.1.25, 3 new feature flags added
- IPatternStore interface extracted for polymorphic pattern store usage
- 50 new tests (16 RvfPatternStore + 17 AgentMemoryBranch + 12 bridge + 5 benchmarks)
- 1188 tests pass, 0 regressions
ADR status: 066 Implemented, 067 Implemented, 065 Implemented,
069/071 In Progress (honest assessment after brutal-honesty review)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(init): resolve skills/agents paths from package root, not relative to bundle depth
esbuild code-splitting puts installer code into dist/cli/chunks/ (3 levels
deep) instead of dist/init/ (2 levels deep), so the old ../../ traversals
landed at dist/ instead of the package root — causing "Source directory not
found" errors for all global installs.
Replace brittle relative-path resolution in all 4 installers with a shared
findPackageRoot() that walks up to the nearest package.json with
name=agentic-qe. Prioritise assets/ paths (canonical npm source) over
.claude/ paths.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: complete RVF cluster Phases 2-3 (ADR-067/069/071/072) with devil's advocate fixes
Phase 2A (ADR-067): Agent memory branching enabled — useAgentMemoryBranching=true,
BRANCH_DISCARD witness action, recordIngest callback exposed to agents via config.
Phase 2B (ADR-069): Dream RVF COW — useRvfFork driven by isRVFPatternStoreEnabled(),
child adapter stored + temp files cleaned up on merge/discard, 13 tests.
Phase 2C (ADR-071): HNSW unification — useUnifiedHnsw=true, HNSWEmbeddingIndex routes
through HnswAdapter, UnifiedMemory vectorIndex uses UnifiedHnswIndex, HnswLegacyBridge
delegates to adapter string-ID APIs (no duplicate ID maps), addEmbeddingsBatch routed
correctly, saveIndex/loadIndex safe under unified mode.
Phase 3 (ADR-072): RVF primary migration scaffolding — RvfMigrationAdapter (5-stage
routing with write latency tracking), RvfConsistencyValidator (rolling divergence +
compaction), RvfStageGate (go/no-go with witness chain), rvfMigrationStage=1 default,
wired into shared-rvf-dual-writer at stage >= 2, 32 tests.
Cross-cutting fixes from devil's advocate review:
- Shared RVF adapter singleton eliminates dual file handles (kernel + dream engine)
- RvfPatternStore reports honest nativeAvailable=false + rvfInitError on failure
- ESM-safe dynamic import() replaces require() in dream-engine and branch-manager
- quality_assess defaults to src/ instead of cwd to prevent full-project scan hang
- discoverSourceFiles skips .agentic-qe/.claude/.cache dirs, adds maxFiles=5000 cap
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: complete RVF cluster plan — Phase 2C decommission, Phase 3 integration, fix 7 pre-existing test failures
Phase 2C (ADR-071) — HNSW decommission:
- Remove RuvectorFlatIndex fallback from unified-memory.ts; always use UnifiedHnswIndex
- Hardcode isUnifiedHnswActive()=true in HNSWEmbeddingIndex (hnswlib-node legacy path is dead code)
- Create HnswShadowValidator for brute-force vs HnswAdapter divergence validation
- Benchmark alias (rvf-pattern-store.bench.ts) for plan compliance
Phase 3 (ADR-072) — RVF Primary Migration integration:
- RvfMigrationCoordinator: wires adapter + validator + gate with real SQLite/RVF handles
- MCP tools: migration_status, migration_check, migration_promote (persistence category)
- Kernel boot wiring: coordinator initializes when rvfMigrationStage >= 2
- RvfMigrationAdapter.setStage(): propagate promotions to routing logic
- Promote default rvfMigrationStage from 1 (hybrid) to 2 (dual-write-sqlite-primary)
- Integration test: 13 tests covering full lifecycle (stage 1→2→3→4), write/read routing,
consistency checks, gate enforcement, fallback, metrics
Test fixes (7 pre-existing failures → 1 remaining):
- code-intelligence-metrics-wiring: spy console.info not console.log (logger routes to console.info)
- mcp-integration: disable ADR-062 loop detection (repeated identical calls are by design)
- dream-cycle-tool (2 tests): RvfPatternStore empty-query branch returns all patterns from SQLite
- coherence-integration (4 tests): RvfPatternStore vector search fallback computes brute-force
cosine over SQLite embeddings when RVF adapter unavailable; getStats() falls back to SQLite count;
auto-attach SQLitePatternStore in initialize() when not explicitly wired
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore(release): bump version to v3.9.1
- Version bump in package.json and skills-manifest.json
- Fix "Dynamic require of X is not supported" in ESM bundles by adding
createRequire banner to both CLI and MCP build scripts — every chunk
now has a working require() for Node.js builtins
- Add CHANGELOG.md entry and release notes for v3.9.1
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(ci): regenerate package-lock.json for npm ci compatibility
The lock file was out of sync with package.json — new transitive
dependencies added on main were missing. All 15 CI checks failed
at `npm ci` with "Missing from lock file" errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(ci): pin Node to 24.13.0 and restore working lock file
Node 24.14.1 ships npm 11.11.0 which enforces stricter lock file
validation than 11.6.x (what 24.13.0 ships). The existing lock file
passes under 11.6.x but fails under 11.11.0 with "Missing from lock
file" for transitive dependencies of private-registry packages.
Pin all 5 workflow files to node-version: '24.13.0' and restore the
lock file from commit
|
||
|
|
a445ec0bf6 |
chore(release): bump version to v3.9.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
e82a7240ec |
feat: implement CC-internals improvements IMP-00 through IMP-10 (Waves 0-4)
11 improvements across 4 priority tiers, all integrated into production code paths with 416 new tests across 33 test files. Each wave passed a brutal honesty audit with all findings resolved. Wave 0-2 (P0/P1): Middleware chain, microcompact, tool concurrency, retry engine, session durability, prompt cache latch, startup fast paths, hook security hardening. Wave 3 (P2): 4-tier context compaction pipeline, plugin architecture with local/GitHub/npm sources. Wave 4 (P3): QE Quality Daemon — priority queue, git watcher (with Linux polling fallback), coverage delta analyzer, CI monitor, test suggester, nightly consolidation, notification service with SSRF guard, persistent SQLite-backed memory, CLI commands, MCP startup integration. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
eebb76731e |
feat: implement RuVector Phase 5 Milestones 3-4 — Scale, Optimization & Advanced Learning (ADR-087)
Milestone 3 — Scale & Optimization (R7-R10): - R7: Meta-learning enhancements (DecayingBeta, PlateauDetector with CUSUM, ParetoFront, CuriosityBonus) wired into DomainTransferEngine - R8: PageRank pattern importance solver with citation graph pipeline (PatternCitationGraph bootstraps from 129 existing patterns, blended scoring in pattern-promotion.ts) - R9: Spectral graph sparsifier (degree-based leverage heuristic) wired into mincut-wrapper.ts as optional preprocessing - R10: Reservoir replay buffer with coherence-gated admission and CUSUM drift detection, wired into ExperienceReplay (write + read paths) Milestone 4 — Advanced Learning (R11-R12): - R11: E-prop online learning (12 bytes/synapse, eligibility traces, feedback alignment) — RL algorithm #10, extends BaseRLAlgorithm - R12: Granger causality for test failure prediction (VAR + F-test with full statistical math) wired into defect-intelligence coordinator with persistent history accumulation Infrastructure: - 8 feature flags (all default true per opt-out policy), convenience functions, env var support, CLI descriptions - RLAlgorithmType union: 9 → 10 members (added 'eprop') - ADR-087 status: Proposed → Active (M1-4 complete) - 234 new tests across 8 test files, all passing - Performance benchmarks for PageRank, sparsification, reservoir admission - 0 regressions in existing test suite Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
19ba1a8fb7 |
feat: implement RuVector Phase 5 Milestone 2 — Graph Learning (ADR-087)
Implements R4 (GraphMAE), R5 (Modern Hopfield), R6 (Cold-Tier GNN) with full integration wiring into pattern-store and code-intelligence domains. R4 GraphMAE Self-Supervised Learning: - SPSA optimizer for gradient-free training of masked graph autoencoders - Decoder head reconstructs features from embeddings (SCE loss, γ=2) - Per-epoch lossHistory for convergence analysis - Wired into coordinator-gnn.ts:generateGraphMAEEmbeddings() - 21 tests including 1K-node scale test R5 Modern Hopfield Networks: - Exponential-capacity exact pattern recall (Ramsauer 2020) - L2-normalized patterns for consistent softmax attention - Dimension-aware singleton, zero-vector rejection - Wired into pattern-store.ts store()/search() as exact-recall tier - 28 tests including 10K capacity and <2ms benchmark R6 Cold-Tier GNN Training: - LRU-cached mini-batch trainer with memory cap enforcement - FileBackedGraph for real disk-backed larger-than-RAM graphs - Unbiased Fisher-Yates shuffle (rejection sampling) - Wired into coordinator-gnn.ts:trainWithColdTier() - 25 tests including FileBackedGraph round-trip and mode equivalence Shared: - Extracted Xorshift128 PRNG to src/shared/utils/xorshift128.ts - 3 feature flags (default false) with documented activation criteria - Barrel exports for all types, classes, and factories 74 new tests, 0 type errors, 0 regressions across 1030 existing tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
fa28ce6bfa |
feat: implement RuVector Phase 5 Milestone 1 — Pattern Intelligence (ADR-087)
Adds 4 new capabilities with production wiring, 148 tests, and performance baselines: - R1: HDC Pattern Fingerprinting — 10K-bit binary hypervectors with O(1) XOR binding, wired into PatternStore search as Hamming-distance pre-filter - R2: CUSUM Drift Detection — two-sided statistical change-point detection across all 4 coherence gate types (retrieve/write/learn/act), auto-enabled via feature flag - R3: Delta Event Sourcing — pattern version history with rollback via SQLite pattern_deltas table, wired into PatternStore store/recordUsage paths - EWC++ Activation — three-loop protocol (instantAdapt→recordOutcome→backgroundConsolidate) wired in quality-assessment, test-generation, and contract-testing coordinators with double-flag guard (useSONAThreeLoop && useEwcPlusPlusRegularization) Extracts coherence-gate.ts (930 lines) into 4 modules under 500-line limit. All feature flags default true (opt-out) per amended ADR-087 policy. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
2086bafa6b |
feat(parsers): add web-tree-sitter WASM for Python, Java, C#, Rust, Swift (#323)
Integrate tree-sitter WASM as the default parser for 5 languages, replacing regex-only parsing (~97-98%) with AST-based parsing (~100% accuracy). - Add TreeSitterWASMParser implementing ILanguageParser for 5 languages - Bundle only needed WASM grammars in assets/grammars/ (8.5MB vs 50MB) - Add FallbackParser with 3-retry logic before permanent regex degradation - Add per-call parser instances to prevent concurrency races across await - Add cyclomatic complexity computation from AST branching nodes - Add property extraction from class/struct AST nodes - Add AQE_PARSER_REGEX_ONLY=1 env var for opt-out to regex - Replace require() with ESM-compatible dynamic import() in registry - Mark web-tree-sitter as external in CLI/MCP esbuild configs - Amend ADR-076 with decision rationale and alternatives evaluated Alternatives evaluated and rejected: - @ast-grep/napi: npm package only ships JS/TS/CSS/HTML, others need native .so - node-tree-sitter: requires native C compilation via node-gyp Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
ef9b9c3fee |
feat(skills): implement ADR-086 skill design standards across 84 QE skills
Based on Anthropic's "Lessons from Building Claude Code: How We Use Skills" article. Transforms QE skills from flat knowledge cards into folder-based systems with gotchas, progressive disclosure, composition, config, hooks, and run history. Changes across all 4 phases: - Add Gotchas sections to 30 skills with battle-tested failure data from Nagual/memory.db - Rewrite all 84 skill descriptions as "Use when..." trigger conditions - Strip 892 lines of textbook knowledge from 15 skills (26% reduction) - Create 10 reference/template files across 7 skills (OWASP, k6, mutation operators, etc.) - Add config.json with _setupPrompt to 7 skills - Add run-history.json with write instructions to 5 metric-producing skills - Create 5 on-demand hook skills with executable scripts (strict-tdd, no-skip, coverage-guard, freeze-tests, security-watch) - Create 5 new category-filling skills (test-failure-investigator, coverage-drop-investigator, e2e-flow-verifier, test-metrics-dashboard, skill-stats) - Add Skill Composition cross-references to 10 key skills - Remove 3 redundant/obsolete skills (qe-contract-testing → contract-testing, qe-security-compliance → security-testing, aqe-v2-v3-migration) - Add DEPRECATED_SKILLS cleanup to skills-installer.ts for --upgrade - Update all manifests (trust-tier, TRUST-TIERS.md, README.md, CLAUDE.md) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
6b249c034f |
feat: RuVector integration phases 1-4 — native HNSW, neural routing, safety gates, differentiation
Implements 23 tasks across 4 phases per docs/implementation/ruvector-integration-plan.md: Phase 1 — Foundation (make what we have faster): - Native HNSW backend via @ruvector/router (150x search speedup, ADR-081) - Metadata filtering layer with composable AND/OR/NOT/FIELD expressions - Temporal tensor compression (Int8Array quantization, 4x memory reduction) - Deterministic golden-ratio dithering for cross-platform reproducibility - 15 feature flags (all default false) with CLI profiles Phase 2 — Intelligence (make agents smarter): - Neural TinyDancer router with REINFORCE policy gradient (ADR-082) - SONA three-loop enhancement (MicroLoRA 0.18μs/adapt via WASM) - Cross-domain transfer learning with Thompson Sampling (ADR-084) - Regret tracking with log-log regression growth classification Phase 3 — Safety (make agents trustworthy): - Sheaf-gated test validation via prime-radiant CohomologyEngine - Coherence-gated agent actions (3-filter pipeline, ADR-083) - Witness chain audit trail with SHA-256 hash linking - HNSW health monitoring with spectral analysis Phase 4 — Differentiation (make AQE unique): - Cognitive container export/import (RVF v2) - DAG attention scheduler for dependency-aware test ordering - CNN visual regression with spatial pooling embeddings - Behavior tree orchestration (Sequence/Selector/Parallel) - Reasoning QEC with majority-vote consensus - Browser QE dashboard scaffolding Also: remove obsolete v2-to-v3-migration test (source already removed), add ADR-081 through ADR-085, research docs, benchmarks, and integration test suites for all 4 phases. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
3ec84594dd | ADR updates statuses | ||
|
|
5baf27e8e7 |
feat: implement agent dependency intelligence (#342)
Add three subsystems for fleet orchestration intelligence: - Pre-spawn MCP validation scans agent files for tool references and validates availability at install and spawn time (advisory only) - Agent dependency graph with YAML frontmatter parsing, topological sort, and phased spawn plans for multi-agent orchestration - Co-execution repository tracks agent pair success rates, feeding behavioral signals into the signal merger for routing decisions Wire all subsystems into the queen coordinator: dependency graph built on initialize(), MCP validation in requestAgentSpawn(), co-execution recording in handleTaskCompletionCallback(), and getSpawnPlan()/ getDependencyGraph() exposed on the public interface. Add structured dependencies frontmatter to 5 agent definitions and 475 passing tests including 7 end-to-end integration tests proving the wiring works. Closes #342 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
3b81b10d30 |
chore(release): bump version to v3.7.14
Brain export v3.0 (25 tables), witness chain v3 with Ed25519 signing, streaming for large tables, RVF freeze/derive/indexStats, npm packaging fix. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
18e15e843c |
feat(validation): add trigger optimizer, version comparator, and skill intent classification
Implements three improvements from Claude Blog skill-creator analysis: - Trigger Optimizer: analyzes skill descriptions/tags for false positive/negative activation risks - Version Comparator: A/B testing between skill versions with Cohen's d effect size - Skill Intent: classify skills as capability_uplift, encoded_preference, or hybrid Includes 52 unit tests (23 + 29), schema sync across all 3 copies, and ADR-056 update. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
e2fb4a2f14 |
feat(multi-lang): add docs, ADRs, tests, and fixtures for multi-language support
Update ADRs 075-079 with implementation details, revise the multi-language GOAP implementation plan, add test generators and parser test fixtures for Go, Rust, Java, C#, Swift, Python. Include skill validation schema updates and v2→v3 migration skill. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
9733f2960b |
feat(test-generation): add multi-language support plan with ADRs (075-079)
Add comprehensive plan to extend AQE test generation from 2 languages (TS/JS) to 11 (adding Java, C#, Go, Rust, Swift, Kotlin, Dart, Python AST fix, React Native, Flutter). Includes GOAP execution plan optimized for parallel agent swarm execution (up to 5 concurrent agents). ADR-075: Unified TestFramework type system (single source of truth) ADR-076: tree-sitter WASM multi-language parser integration ADR-077: Compilation validation loop for generated tests ADR-078: Backward-compatible multi-language API extension ADR-079: Language-specific test file path resolution GitHub Issue: #319 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
4b0ec635f5 |
feat(loki-mode): integrate 7 adversarial quality gates (ADR-074)
Add anti-sycophancy scoring, test quality gates, blind review, EMA calibration, edge-case injection, complexity-driven composition, and auto-escalation. All features enabled by default (opt-out). 178 tests, 14 new files, 6 config flags. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
2253d05618 |
feat: flatten project structure — archive v2, promote v3 to root
Remove the nested v3/ subdirectory by moving all active source code, tests, configs, and assets directly to the project root. Archive v2/ (dead code, 847MB) to v2-archive.tar.gz. Key changes: - Move v3/src/ → src/, v3/tests/ → tests/, v3/packages/ → packages/ - Move v3/tsconfig.json, v3/vitest.config.ts to root - Merge v3/package.json into root package.json (ESM, scripts, deps, exports) - Merge v3/scripts/ into scripts/, v3/implementation/ into docs/implementation/ - Update all CI workflows to remove "cd v3 &&" and v3/ path prefixes - Fix all init installer path resolution (3-level-up → 2-level-up) - Fix hooks to use "node ./dist/cli/bundle.js" instead of bare "aqe" - Update settings.json ADR/DDD directories to docs/implementation/ - Fix helper scripts (statusline, adr-compliance, ddd-tracker, guidance-hooks) - Update 58 agent definitions: aqe/v3/ → aqe/ memory namespaces - Update 15 guidance shards: v3/src/ → src/ path references - Fix sync interfaces: remove v3/ and v2/ path references - Fix test path calculations (process.cwd() + '..' no longer needed) - Fix flaky perf test threshold (500ms → 1000ms for CI environments) - Fix complexity-analyzer test to match ADR-051 keyword-based eligibility Build passes, 17,901 tests pass, CLI and MCP bundles verified. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
e8b2ae6094 |
feat(v3): add TinyDancer routing, consensus engine, and documentation updates
Major Features: - TinyDancer 3-tier model routing (ADR-026): Haiku/Sonnet/Opus based on complexity - Multi-model consensus engine with Byzantine fault tolerance - Claim verifier service for agent work validation - Code intelligence metric collectors (LOC, test counts) - Fleet integration with init wizard Documentation: - Update README with 50 agents (43 main + 7 subagents) - Add TinyDancer, Dream cycles, Consensus sections - Remove unverified performance claims (keep 166x MCP verified) - Create v2-vs-v3 comparison document - Add reference docs for AQE fleet and Claude Flow Testing: - Add consensus engine unit tests - Add queen-tinydancer wiring integration tests - Add security-consensus wiring tests - Add claim verifier integration tests - Add fleet integration tests Bump version to 3.0.0-alpha.28 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
fd2f37eaa0 |
fix(v3): update README claims and init hooks to use correct package name
Changes: - Fix README.md agent counts (48 QE agents = 41 main + 7 subagents) - Fix README.md skill counts (15 QE-specific skills) - Fix v3/README.md agent counts (47 → 48) - Fix init-wizard.ts hooks from 'npx @agentic-qe/v3' to 'npx agentic-qe' - Complete v2 → v2/ folder reorganization (54 items moved) - Update root package.json to point to v3 as main version Verified claims: - 48 QE agents (41 main + 7 TDD subagents) - 15 QE-specific skills - 12 DDD bounded contexts - ~5,600+ tests - HNSW, ReasoningBank, Queen Coordinator features exist Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
0cb4f6fceb |
feat(release): v2.6.3 - C4 Model Architecture Diagrams
### Added - C4 diagram builders for context, container, and component levels - ProjectMetadataAnalyzer for system type inference from package.json/docker-compose - ExternalSystemDetector for database, API, cache, and queue detection - ComponentBoundaryAnalyzer for layer and relationship mapping - CLI commands: `aqe kg c4-context`, `aqe kg c4-container`, `aqe kg c4-component` - CodeIntelligenceAgent c4-diagrams capability - 22 unit tests for C4 diagram builders ### Changed - MermaidGenerator with static C4 generation methods - Type consolidation in src/code-intelligence/inference/types.ts - Standardized ComponentRelationship to use sourceId/targetId - Updated qe-code-intelligence.md with C4 capabilities and examples 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
0a7a1c8b09 |
feat(release): v2.6.2 - Phase 2 LLM Independence & Cost Optimization
## Added - ML-Based Complexity Classification with 4-level task analysis - Model Capability Registry with 25+ December 2025 models - Claude Opus 4.5, DeepSeek R1/V3, GPT-5, Gemini 2.5 Pro - Cost Optimization Strategies (PromptCompressor, Caching, Batching) - HybridRouter integration with complexity-based model selection ## Changed - README.md Quick Start section (user-focused, no version numbers) - .env.example rewritten for Phase 2 features - CONTRIBUTORS.md updated with @fndlalit's n8n contribution (#151) ## Fixed - HybridRouter RuVector test isolation - Compression benchmarks with honest expectations (2-8% vs false 50%) ## New Tests - ComplexityClassifier, ModelCapabilityRegistry, CompressionBenchmark - HybridRouter integration, model selection, and cost tracking tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
9fd235d2e6 |
feat(phase-1): complete LLM Independence Phase 1 implementation
Phase 1.1 - OllamaProvider: - Add OllamaProvider with all 13 ILLMProvider methods - Add unit and integration tests for OllamaProvider - Integrate with LLMProviderFactory auto-detection Phase 1.2 - Agent Abstraction: - Add IAgentLLM interface for provider-independent LLM access - Add AgentLLMAdapter bridging ILLMProvider to IAgentLLM - Update BaseAgent with getAgentLLM() method - Migrate 4 LLM-active agents: TestGenerator, CoverageAnalyzer, CodeIntelligence, N8nBase - 15 n8n agents inherit capability via N8nBaseAgent - 17 algorithmic agents work without LLM by design Phase 1.3 - Configuration: - Add ProviderConfig types and ConfigLoader - Add CLI providers commands (list, status, switch, test) - Add example provider configurations Documentation: - Update implementation plan with accurate agent categorization - Add usage examples for IAgentLLM patterns - Add provider guides and research documents 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
0f40bda3ef |
chore(release): bump version to v2.5.8
## Phase 0: LLM Independence Foundation ### M0.3: HNSW Pattern Store Integration - HNSWPatternAdapter - Bridge between LearningEngine and HNSWPatternStore - LearningEngine HNSW Integration - searchSimilarPatterns(), getHNSWStats() - O(log n) similarity search for pattern matching ### M0.5: Federated Learning - FederatedManager - Cross-agent pattern sharing with consensus - Pattern synchronization across distributed agents ### M0.6: Pattern Curation - PatternCurator - Manual curation workflow with approval/rejection - RuvllmPatternCurator - RuvLLM integration for pattern quality assessment ### RuvllmProvider Enhancements - Session Management (50% latency reduction) - Batch API (4x throughput improvement) - TRM/SONA integration for advanced reasoning - LLMBaselineTracker for performance monitoring - Error tracking in session metrics ### Documentation - Complete agent learning system architecture documentation - HNSW pattern store usage examples - Phase 0 implementation guides 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|
|
346438f0de |
Release v2.0.0: Claude 4.5 Optimization, QUIC Transport, 29 Agent Compaction (#100)
* SwarmMemoryManager Refactoring Plan * fix: add missing directories to npm package (v1.9.3) Added templates/, .claude/helpers/, and docs/reference/ to package.json files array. These were missing from the npm distribution, causing `aqe init` to fail with "Template file not found" errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * checkpoint improvements * fix: critical memory/learning system fixes for v1.9.4 ## Critical Fixes - Vector embeddings now stored correctly (was storing NULL) - SQL parameter style fixed for agentdb's SqlJsDatabase wrapper - HNSW index schema mismatch resolved with pattern_id column - Hooks now save to correct database (.agentic-qe/agentdb.db) ## New Features - Added 5 SwarmMemoryManager methods for learning data retrieval: - getBestAction() - Q-learning best action selection - getRecentLearningExperiences() - Recent experience retrieval - getLearningExperiencesByTaskType() - Task-filtered experiences - getHighRewardExperiences() - Successful experience extraction - getLearningStats() - Aggregate learning statistics - Added comprehensive integration test for memory/learning loop - Added RuVector pattern store integration (experimental) ## Technical Details - Vector embeddings: 384 dimensions × 4 bytes = 1,536 bytes per pattern - All 12 integration tests pass - HNSW index: 150x faster vector search enabled 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: move ARM64-only ruvector packages to optionalDependencies Fixes CI failures caused by platform-specific dependencies: - @ruvector/node-linux-arm64-gnu (ARM64 only) - ruvector-core-linux-arm64-gnu (ARM64 only) These packages caused npm ci to fail on x64 CI runners with: "EBADPLATFORM - wanted linux/arm64, current linux/x64" Solution: Move ARM64 packages to optionalDependencies and add x64 variants for cross-platform compatibility. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: regenerate package-lock.json with x64 ruvector packages Updates lockfile to include optional x64 platform packages for CI compatibility: - @ruvector/node-linux-x64-gnu@0.1.17 - ruvector-core-linux-x64-gnu@0.1.15 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: replace fake QUIC with proper implementation and clean up skills manifest QUIC Transport: - Remove fake HTTP/2-based QUICTransport.ts that pretended to be QUIC - Add proper QUIC implementation via Rust/WASM (@agentic-flow/quic-wasm) - Add WebSocket fallback transport for when WASM unavailable - Add dedicated type declarations for optional WASM module - Features: 0-RTT connection, stream multiplexing, TLS 1.3 built-in Skills Manifest: - Rewrite skills-manifest.json with only QE skills (41 skills) - Remove Claude Flow platform skills (agentdb-*, flow-nexus-*, github-*, etc.) - Organize into proper categories: qe-core, testing-methodologies, etc. Bug Fixes: - Fix UnifiedMemoryCoordinator.ts TypeScript errors - Use Logger.getInstance() instead of private constructor - Use swarmMemory.query() instead of non-existent list() method - Use correct close() method signatures for backends 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: add QX Partner agent, compact subagents, fix CLAUDE.md dynamic counts - Add QX Partner agent for Quality Experience analysis combining QA + UX perspectives - Compact 9 subagent definitions to ~80 lines each (88% reduction) - Fix CLAUDE.md template to dynamically count agents (including subagents) and skills - Move CLAUDE.md creation after parallel phases for accurate counts - Remove 'Production-Ready' claim from README and CHANGELOG - Clean up backup files and move docs to proper directory Initialization now correctly reports: - 31 QE Agents (20 main + 11 subagents) - 53 QE Skills - 8 Slash Commands 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
46b705bce3 | aqe init refactoring |