Skip to content

Commit aa0521f

Browse files
committed
feat: surface vector stage in query traces
1 parent 52ceeb3 commit aa0521f

12 files changed

Lines changed: 73 additions & 4 deletions

docs/brainstorms/2026-04-19-mainline-progress-reconciliation-and-post-m7-direction-requirements.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ This document re-baselines current mainline truth on 2026-04-19, records what ch
162162
- `npm test -- src/learning/KnowledgeLearningPlatform.persistence.test.ts --runInBand`
163163
- The current working branch remains a reference source for future lanes, not a justification for direct wide merge.
164164

165-
## Execution Note (2026-04-20 M8.1-M8.4)
165+
## Execution Note (2026-04-20 M8.1-M8.5)
166166

167167
- The smallest executed post-M7 slice is now an evidence bundle, not an adapter claim:
168168
- `npm run verify:foundation:readiness`
@@ -179,6 +179,9 @@ This document re-baselines current mainline truth on 2026-04-19, records what ch
179179
- The next bounded execution slice after that extracts local vector-prefilter scoring into:
180180
- `src/learning/vectorAccelerationAdapter.ts`
181181
- while keeping the adapter explicitly staged as `prefilter_only` so readiness cannot flip to `go` from file existence alone.
182+
- The next bounded execution slice after that exposes staged vector metadata through query traces:
183+
- query responses now surface vector `mode`, `status`, and `candidateCount`
184+
- the agent-workspace query-trace card now renders that metadata directly instead of hiding the prefilter stage.
182185
- Current expected outcome on `main` remains:
183186
- status `in_progress`
184187
- decision `no-go`

docs/diataxis/en/explanation/development-progress-dashboard.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,23 @@ Execution anchor:
639639
- `npm run docs:diataxis:check`
640640
- `npm run docs:site:build`
641641

642+
## Latest Mainline Increment (2026-04-20 M8.5 Query Trace Vector Visibility)
643+
644+
- Extended public query-trace payloads so the staged vector boundary is inspectable instead of implicit:
645+
- `src/learning/types.ts`
646+
- `src/learning/KnowledgeLearningPlatform.ts`
647+
- Query traces now expose bounded vector stage metadata:
648+
- `mode`
649+
- `status`
650+
- `candidateCount`
651+
- Updated the agent-workspace query-trace card to render that staged vector status directly in chat:
652+
- `src/frontend/agent_workspace_runtime.js`
653+
- `src/frontend/locales/en.json`
654+
- `src/frontend/locales/zh.json`
655+
- Added focused regression coverage for trace payload and runtime rendering:
656+
- `src/learning/KnowledgeLearningPlatform.test.ts`
657+
- `src/agent_workspace.runtime.behavior.test.ts`
658+
642659
## Latest Mainline Increment (2026-04-20 M8.4 Vector Boundary Extraction)
643660

644661
- Added a dedicated vector-acceleration boundary without changing the public query contract:

docs/diataxis/zh/explanation/development-progress-dashboard.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,23 @@
642642
- `npm run docs:diataxis:check`
643643
- `npm run docs:site:build`
644644

645+
## 主线最新增量(2026-04-20 M8.5 Query Trace 向量阶段可见性)
646+
647+
- 已扩展公共 query-trace 载荷,让当前 staged vector 边界可被直接检查,而不是隐含在实现内部:
648+
- `src/learning/types.ts`
649+
- `src/learning/KnowledgeLearningPlatform.ts`
650+
- query trace 现在显式暴露有界向量阶段元数据:
651+
- `mode`
652+
- `status`
653+
- `candidateCount`
654+
- 已更新 agent-workspace 的 query-trace 卡片,使对话面直接显示该向量阶段状态:
655+
- `src/frontend/agent_workspace_runtime.js`
656+
- `src/frontend/locales/en.json`
657+
- `src/frontend/locales/zh.json`
658+
- 已补 trace 载荷与 runtime 渲染的聚焦回归:
659+
- `src/learning/KnowledgeLearningPlatform.test.ts`
660+
- `src/agent_workspace.runtime.behavior.test.ts`
661+
645662
## 主线最新增量(2026-04-20 M8.4 Vector 边界抽取)
646663

647664
- 已新增独立 vector-acceleration 边界,且未改变外部 query 合同:

src/agent_workspace.runtime.behavior.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,11 @@ describe('agent workspace runtime behavior', () => {
589589
items: [{ atom: { id: 'a1' } }, { atom: { id: 'a2' } }],
590590
trace: {
591591
retrievalModes: ['keyword', 'graph_traversal'],
592+
vectorAcceleration: {
593+
mode: 'local_prefilter',
594+
status: 'prefilter_only',
595+
candidateCount: 2,
596+
},
592597
latencyMs: 17,
593598
evidenceCoverageRatio: 0.75,
594599
},
@@ -625,6 +630,7 @@ describe('agent workspace runtime behavior', () => {
625630

626631
const messages = document.getElementById('agent-workspace-messages') as HTMLElement;
627632
expect(messages.textContent || '').toContain('Query trace loaded');
633+
expect(messages.textContent || '').toContain('vector local_prefilter/prefilter_only');
628634
});
629635

630636
test('executes ingest guardrail capability and renders gate summary', async () => {

src/frontend/agent_workspace_runtime.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1043,16 +1043,26 @@
10431043
: {};
10441044
const itemsCount = Array.isArray(result && result.items) ? result.items.length : 0;
10451045
const retrievalModes = Array.isArray(trace.retrievalModes) ? trace.retrievalModes.join(', ') : '';
1046+
const vectorAcceleration = trace.vectorAcceleration && typeof trace.vectorAcceleration === 'object'
1047+
? trace.vectorAcceleration
1048+
: null;
1049+
const vectorMode = vectorAcceleration ? trimString(vectorAcceleration.mode) : '';
1050+
const vectorStatus = vectorAcceleration ? trimString(vectorAcceleration.status) : '';
1051+
const vectorCandidateCount = vectorAcceleration ? Number(vectorAcceleration.candidateCount) : NaN;
1052+
const vectorAccelerationSummary = vectorMode && vectorStatus
1053+
? `${vectorMode}/${vectorStatus}${Number.isFinite(vectorCandidateCount) ? `/${vectorCandidateCount}` : ''}`
1054+
: 'n/a';
10461055
const latencyMs = Number(trace.latencyMs);
10471056
const evidenceCoverageRatio = Number(trace.evidenceCoverageRatio);
10481057
appendMessage(
10491058
'assistant',
10501059
getI18nText(
10511060
'agentWorkspace.messages.queryTraceLoaded',
1052-
`Query trace loaded (${itemsCount} hits, modes ${retrievalModes || 'n/a'}, latency ${Number.isFinite(latencyMs) ? latencyMs : 0} ms, evidence ${Number.isFinite(evidenceCoverageRatio) ? evidenceCoverageRatio.toFixed(2) : '0.00'}).`,
1061+
`Query trace loaded (${itemsCount} hits, modes ${retrievalModes || 'n/a'}, vector ${vectorAccelerationSummary}, latency ${Number.isFinite(latencyMs) ? latencyMs : 0} ms, evidence ${Number.isFinite(evidenceCoverageRatio) ? evidenceCoverageRatio.toFixed(2) : '0.00'}).`,
10531062
{
10541063
itemsCount,
10551064
retrievalModes: retrievalModes || 'n/a',
1065+
vectorAcceleration: vectorAccelerationSummary,
10561066
latencyMs: Number.isFinite(latencyMs) ? latencyMs : 0,
10571067
evidenceCoverageRatio: Number.isFinite(evidenceCoverageRatio) ? evidenceCoverageRatio.toFixed(2) : '0.00',
10581068
}

src/frontend/locales/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@
271271
"studySessionBuildFailed": "Study session build failed.",
272272
"studySessionBuilt": "Study session built ({totalActions} actions, {totalEstimatedMinutes} min).",
273273
"queryTraceFailed": "Query trace request failed.",
274-
"queryTraceLoaded": "Query trace loaded ({itemsCount} hits, modes {retrievalModes}, latency {latencyMs} ms, evidence {evidenceCoverageRatio}).",
274+
"queryTraceLoaded": "Query trace loaded ({itemsCount} hits, modes {retrievalModes}, vector {vectorAcceleration}, latency {latencyMs} ms, evidence {evidenceCoverageRatio}).",
275275
"ingestGuardrailFailed": "Ingest guardrail evaluation failed.",
276276
"ingestGuardrailLoaded": "Ingest guardrails evaluated ({status}): {failedGates}/{totalGates} gates failed.",
277277
"sessionHistoryFailed": "Session history request failed.",

src/frontend/locales/zh.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@
271271
"studySessionBuildFailed": "学习会话构建失败。",
272272
"studySessionBuilt": "学习会话已构建(动作 {totalActions} 个,预计 {totalEstimatedMinutes} 分钟)。",
273273
"queryTraceFailed": "检索追踪请求失败。",
274-
"queryTraceLoaded": "检索追踪已加载(命中 {itemsCount} 条,模式 {retrievalModes},延迟 {latencyMs} ms,证据覆盖 {evidenceCoverageRatio})。",
274+
"queryTraceLoaded": "检索追踪已加载(命中 {itemsCount} 条,模式 {retrievalModes},向量阶段 {vectorAcceleration},延迟 {latencyMs} ms,证据覆盖 {evidenceCoverageRatio})。",
275275
"ingestGuardrailFailed": "摄取护栏评估失败。",
276276
"ingestGuardrailLoaded": "摄取护栏已评估({status}):{failedGates}/{totalGates} 个门禁未通过。",
277277
"sessionHistoryFailed": "会话历史请求失败。",

src/learning/KnowledgeLearningPlatform.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ describe('KnowledgeLearningPlatform', () => {
9898
expect(queryResult.trace.retrievalModes).toContain('temporal_filter');
9999
expect(queryResult.trace.modeWeights.keyword).toBeGreaterThan(0);
100100
expect(queryResult.trace.modeWeights.graph).toBeGreaterThan(0);
101+
expect(queryResult.trace.vectorAcceleration).toEqual({
102+
mode: 'local_prefilter',
103+
status: 'prefilter_only',
104+
candidateCount: expect.any(Number),
105+
});
101106
expect(queryResult.trace.latencyMs).toBeGreaterThanOrEqual(0);
102107
expect(queryResult.trace.evidenceCoverageRatio).toBeGreaterThan(0);
103108
});

src/learning/KnowledgeLearningPlatform.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,7 @@ export class KnowledgeLearningPlatform implements KnowledgeLearningPlatformAPI {
712712
items,
713713
trace: {
714714
retrievalModes: ['keyword', 'graph_traversal', 'temporal_filter'],
715+
vectorAcceleration: queryBackendResponse.vectorAcceleration,
715716
asOf,
716717
totalActiveAtoms: this.activeAtomIds.size,
717718
modeWeights: {

src/learning/queryBackend.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ describe('queryBackend', () => {
3838
});
3939

4040
expect(keywordOnly.vectorAcceleration).toEqual({
41+
candidateCount: 0,
4142
mode: 'disabled',
4243
status: 'inactive',
4344
});
4445
expect(localHybrid.vectorAcceleration).toEqual({
46+
candidateCount: 2,
4547
mode: 'local_prefilter',
4648
status: 'prefilter_only',
4749
});

0 commit comments

Comments
 (0)