Skip to content

Commit 477caef

Browse files
committed
feat: strengthen foundation readiness evidence
1 parent 66f011c commit 477caef

15 files changed

Lines changed: 114 additions & 4 deletions

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

Lines changed: 5 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.7)
165+
## Execution Note (2026-04-20 M8.1-M8.8)
166166

167167
- The smallest executed post-M7 slice is now an evidence bundle, not an adapter claim:
168168
- `npm run verify:foundation:readiness`
@@ -189,6 +189,10 @@ This document re-baselines current mainline truth on 2026-04-19, records what ch
189189
- agent-workspace toolbar now exposes `Foundation Readiness`
190190
- runtime diagnostics snapshots persist `lastFoundationReadiness`
191191
- no status flip occurs; the route still reports `in_progress` / `no-go`.
192+
- The next bounded execution slice after that strengthens readiness evidence without overclaiming independent ANN:
193+
- readiness now reports `queryBackendDefaultMode`
194+
- readiness now reports `vectorAdapterLinkedIntoQueryBackend`
195+
- operator UI and diagnostics snapshots expose the same linkage evidence, while overall status still remains `in_progress` / `no-go`.
192196
- Current expected outcome on `main` remains:
193197
- status `in_progress`
194198
- decision `no-go`

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

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

642+
## Latest Mainline Increment (2026-04-20 M8.8 Foundation Readiness Adapter-Linkage Evidence)
643+
644+
- Strengthened the readiness bundle so it now distinguishes static module presence from actual query-backend linkage evidence:
645+
- `queryBackendDefaultMode`
646+
- `vectorAdapterLinkedIntoQueryBackend`
647+
- Kept the readiness decision honest:
648+
- current mainline still reports `in_progress` / `no-go`
649+
- vector status remains `prefilter_only`
650+
- independent ANN evidence is still absent
651+
- Surfaced the same linkage evidence through the agent-workspace toolbar summary and diagnostics snapshot:
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 readiness utility contracts, platform mapping, and toolbar diagnostics:
656+
- `src/foundation.readiness.contract.test.ts`
657+
- `src/learning/KnowledgeLearningPlatform.test.ts`
658+
- `src/agent_workspace.runtime.behavior.test.ts`
659+
642660
## Latest Mainline Increment (2026-04-20 M8.7 Foundation Readiness Toolbar Inspectability)
643661

644662
- Added a bounded operator-side foundation-readiness entry point directly in the agent-workspace toolbar:

docs/diataxis/en/explanation/foundation-reentry-readiness-checklist.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ Bundle note:
5757
- decision `No-Go`
5858
- rationale: file-backed baseline exists, query-backend and vector-boundary modules are now present, but the vector adapter is still only `prefilter_only`, so independent ANN evidence is still absent.
5959
- The readiness payload now makes that distinction explicit:
60+
- `queryBackendDefaultMode`
61+
- `vectorAdapterLinkedIntoQueryBackend`
6062
- `vectorAdapterStatus`
6163
- `vectorAdapterIndependent`
6264

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

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

645+
## 主线最新增量(2026-04-20 M8.8 Foundation Readiness Adapter 接线证据)
646+
647+
- 已强化 readiness bundle,使其不再只停留在模块存在性,而是显式区分当前 query backend 与 vector adapter 的接线证据:
648+
- `queryBackendDefaultMode`
649+
- `vectorAdapterLinkedIntoQueryBackend`
650+
- 仍保持 readiness 决策诚实:
651+
- 当前主线结果依旧是 `in_progress` / `no-go`
652+
- vector 状态仍为 `prefilter_only`
653+
- 独立 ANN 证据仍未进入主线
654+
- 同一份接线证据现在也会出现在 agent-workspace 工具栏摘要与 diagnostics snapshot 中:
655+
- `src/frontend/agent_workspace_runtime.js`
656+
- `src/frontend/locales/en.json`
657+
- `src/frontend/locales/zh.json`
658+
- 已补 readiness utility 合同、platform 映射与工具栏 diagnostics 的聚焦回归:
659+
- `src/foundation.readiness.contract.test.ts`
660+
- `src/learning/KnowledgeLearningPlatform.test.ts`
661+
- `src/agent_workspace.runtime.behavior.test.ts`
662+
645663
## 主线最新增量(2026-04-20 M8.7 Foundation Readiness 工具栏可检查性)
646664

647665
- 已在 agent-workspace 工具栏补上受限 foundation-readiness 入口,方便执行侧直接检查当前主线基线:

docs/diataxis/zh/explanation/foundation-reentry-readiness-checklist.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
- 决策 `No-Go`
5858
- 原因:file-backed 基线已存在,query-backend 与 vector 边界都已进入主线,但该 vector adapter 仍只是 `prefilter_only`,独立 ANN 证据仍未进入主线。
5959
- readiness 载荷现在也显式区分这层语义:
60+
- `queryBackendDefaultMode`
61+
- `vectorAdapterLinkedIntoQueryBackend`
6062
- `vectorAdapterStatus`
6163
- `vectorAdapterIndependent`
6264

scripts/foundation-readiness-utils.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,28 @@ function resolveVectorAdapterStatus(vectorAdapterSource, vectorAdapterModulePres
3838
return 'prefilter_only';
3939
}
4040

41+
function resolveQueryBackendDefaultMode(queryBackendSource, graphAdapterModulePresent) {
42+
if (!graphAdapterModulePresent) {
43+
return 'absent';
44+
}
45+
46+
const modeMatch = queryBackendSource.match(/request\.mode\s*\|\|\s*['"]([^'"]+)['"]/);
47+
if (modeMatch && (modeMatch[1] === 'local_hybrid' || modeMatch[1] === 'keyword_only')) {
48+
return modeMatch[1];
49+
}
50+
51+
return 'unknown';
52+
}
53+
54+
function resolveVectorAdapterLinkedIntoQueryBackend(queryBackendSource, graphAdapterModulePresent) {
55+
if (!graphAdapterModulePresent) {
56+
return false;
57+
}
58+
59+
return queryBackendSource.includes('createLocalVectorAccelerationAdapter')
60+
&& queryBackendSource.includes('vectorAccelerationAdapter.accelerate');
61+
}
62+
4163
function evaluateFoundationReadiness(options = {}) {
4264
const repoRoot = options.repoRoot || path.resolve(__dirname, '..');
4365
const packageJson = readJsonIfExists(path.join(repoRoot, 'package.json'));
@@ -80,6 +102,7 @@ function evaluateFoundationReadiness(options = {}) {
80102
);
81103

82104
const storeSource = readTextIfExists(storePath);
105+
const queryBackendSource = readTextIfExists(graphAdapterPath);
83106
const vectorAdapterSource = readTextIfExists(vectorAdapterPath);
84107
const enDashboard = readTextIfExists(enDashboardPath);
85108
const zhDashboard = readTextIfExists(zhDashboardPath);
@@ -89,9 +112,14 @@ function evaluateFoundationReadiness(options = {}) {
89112
storeSource.includes('createFileBackedKnowledgeGraphStore')
90113
&& storeSource.includes("storeType: 'file'");
91114
const graphAdapterModulePresent = fileExists(graphAdapterPath);
115+
const queryBackendDefaultMode = resolveQueryBackendDefaultMode(queryBackendSource, graphAdapterModulePresent);
92116
const vectorAdapterModulePresent = fileExists(vectorAdapterPath);
93117
const vectorAdapterStatus = resolveVectorAdapterStatus(vectorAdapterSource, vectorAdapterModulePresent);
94118
const vectorAdapterIndependent = vectorAdapterStatus === 'independent';
119+
const vectorAdapterLinkedIntoQueryBackend = resolveVectorAdapterLinkedIntoQueryBackend(
120+
queryBackendSource,
121+
graphAdapterModulePresent
122+
);
95123
const checklistPagesPresent = fileExists(enChecklistPath) && fileExists(zhChecklistPath);
96124
const dashboardReferencesPresent =
97125
enDashboard.includes('foundation-reentry-readiness-checklist')
@@ -193,9 +221,11 @@ function evaluateFoundationReadiness(options = {}) {
193221
loaded: storeModulePresent && storeSource.includes('loadSnapshot'),
194222
fileBackedStore,
195223
graphAdapterModulePresent,
224+
queryBackendDefaultMode,
196225
vectorAdapterModulePresent,
197226
vectorAdapterStatus,
198227
vectorAdapterIndependent,
228+
vectorAdapterLinkedIntoQueryBackend,
199229
},
200230
documents: {
201231
checklistPagesPresent,
@@ -224,9 +254,11 @@ function formatFoundationReadinessMarkdown(result, reportPaths) {
224254
`- Store load capability present: ${result.baseline.loaded ? 'yes' : 'no'}`,
225255
`- File-backed store evidence: ${result.baseline.fileBackedStore ? 'yes' : 'no'}`,
226256
`- Dedicated graph adapter module present: ${result.baseline.graphAdapterModulePresent ? 'yes' : 'no'}`,
257+
`- Query backend default mode: ${result.baseline.queryBackendDefaultMode}`,
227258
`- Dedicated vector adapter module present: ${result.baseline.vectorAdapterModulePresent ? 'yes' : 'no'}`,
228259
`- Vector adapter status: ${result.baseline.vectorAdapterStatus}`,
229260
`- Vector adapter independent: ${result.baseline.vectorAdapterIndependent ? 'yes' : 'no'}`,
261+
`- Vector adapter linked into query backend: ${result.baseline.vectorAdapterLinkedIntoQueryBackend ? 'yes' : 'no'}`,
230262
'',
231263
'## Documentation',
232264
'',

scripts/verify-foundation-readiness.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@ function printHumanReport(result, reportPaths) {
2020
console.log(
2121
`[Foundation Readiness] Dedicated graph adapter present: ${result.baseline.graphAdapterModulePresent ? 'yes' : 'no'}`
2222
);
23+
console.log(`[Foundation Readiness] Query backend default mode: ${result.baseline.queryBackendDefaultMode}`);
2324
console.log(
2425
`[Foundation Readiness] Dedicated vector adapter present: ${result.baseline.vectorAdapterModulePresent ? 'yes' : 'no'}`
2526
);
2627
console.log(`[Foundation Readiness] Vector adapter status: ${result.baseline.vectorAdapterStatus}`);
2728
console.log(
2829
`[Foundation Readiness] Vector adapter independent: ${result.baseline.vectorAdapterIndependent ? 'yes' : 'no'}`
2930
);
31+
console.log(
32+
`[Foundation Readiness] Vector adapter linked into query backend: ${result.baseline.vectorAdapterLinkedIntoQueryBackend ? 'yes' : 'no'}`
33+
);
3034
console.log(
3135
`[Foundation Readiness] Checklist pages present: ${result.documents.checklistPagesPresent ? 'yes' : 'no'}`
3236
);

src/agent_workspace.runtime.behavior.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,9 +1665,11 @@ describe('agent workspace runtime behavior', () => {
16651665
loaded: true,
16661666
fileBackedStore: true,
16671667
graphAdapterModulePresent: true,
1668+
queryBackendDefaultMode: 'local_hybrid',
16681669
vectorAdapterModulePresent: true,
16691670
vectorAdapterStatus: 'prefilter_only',
16701671
vectorAdapterIndependent: false,
1672+
vectorAdapterLinkedIntoQueryBackend: true,
16711673
},
16721674
documents: {
16731675
checklistPagesPresent: true,
@@ -1707,15 +1709,18 @@ describe('agent workspace runtime behavior', () => {
17071709
const messages = document.getElementById('agent-workspace-messages') as HTMLElement;
17081710
expect(messages.textContent || '').toContain('Foundation readiness');
17091711
expect(messages.textContent || '').toContain('prefilter_only');
1712+
expect(messages.textContent || '').toContain('local_hybrid');
17101713

17111714
const snapshot = runtime.getDiagnosticsSnapshot();
17121715
expect(snapshot.lastFoundationReadiness).toEqual(
17131716
expect.objectContaining({
17141717
status: 'in_progress',
17151718
decision: 'no-go',
17161719
storeType: 'file',
1720+
queryBackendDefaultMode: 'local_hybrid',
17171721
vectorAdapterStatus: 'prefilter_only',
17181722
vectorAdapterIndependent: false,
1723+
vectorAdapterLinkedIntoQueryBackend: true,
17191724
recommendationsCount: 1,
17201725
})
17211726
);

src/foundation.readiness.contract.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ type FoundationReadinessResult = {
1515
loaded: boolean;
1616
fileBackedStore: boolean;
1717
graphAdapterModulePresent: boolean;
18+
queryBackendDefaultMode: 'absent' | 'unknown' | 'local_hybrid' | 'keyword_only';
1819
vectorAdapterModulePresent: boolean;
1920
vectorAdapterStatus: 'absent' | 'prefilter_only' | 'independent';
2021
vectorAdapterIndependent: boolean;
22+
vectorAdapterLinkedIntoQueryBackend: boolean;
2123
};
2224
documents: {
2325
checklistPagesPresent: boolean;
@@ -108,9 +110,11 @@ describe('foundation readiness contract', () => {
108110
expect(result.baseline.loaded).toBe(true);
109111
expect(result.baseline.fileBackedStore).toBe(true);
110112
expect(result.baseline.graphAdapterModulePresent).toBe(true);
113+
expect(result.baseline.queryBackendDefaultMode).toBe('local_hybrid');
111114
expect(result.baseline.vectorAdapterModulePresent).toBe(true);
112115
expect(result.baseline.vectorAdapterStatus).toBe('prefilter_only');
113116
expect(result.baseline.vectorAdapterIndependent).toBe(false);
117+
expect(result.baseline.vectorAdapterLinkedIntoQueryBackend).toBe(true);
114118
expect(result.documents.checklistPagesPresent).toBe(true);
115119
expect(result.documents.dashboardReferencesPresent).toBe(true);
116120
expect(result.packageScripts.readinessVerifierPresent).toBe(true);
@@ -166,9 +170,11 @@ describe('foundation readiness contract', () => {
166170
expect(result.baseline.loaded).toBe(false);
167171
expect(result.baseline.fileBackedStore).toBe(true);
168172
expect(result.baseline.graphAdapterModulePresent).toBe(true);
173+
expect(result.baseline.queryBackendDefaultMode).toBe('unknown');
169174
expect(result.baseline.vectorAdapterModulePresent).toBe(true);
170175
expect(result.baseline.vectorAdapterStatus).toBe('independent');
171176
expect(result.baseline.vectorAdapterIndependent).toBe(true);
177+
expect(result.baseline.vectorAdapterLinkedIntoQueryBackend).toBe(false);
172178
expect(result.documents.checklistPagesPresent).toBe(true);
173179
expect(result.documents.dashboardReferencesPresent).toBe(true);
174180
});

src/frontend/agent_workspace_runtime.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1433,8 +1433,10 @@
14331433
status: 'pending',
14341434
decision: '',
14351435
storeType: '',
1436+
queryBackendDefaultMode: '',
14361437
vectorAdapterStatus: '',
14371438
vectorAdapterIndependent: false,
1439+
vectorAdapterLinkedIntoQueryBackend: false,
14381440
recommendationsCount: 0,
14391441
};
14401442
setBusy(true);
@@ -1460,21 +1462,27 @@
14601462
status: trimString(readiness && readiness.status),
14611463
decision: trimString(readiness && readiness.decision),
14621464
storeType: trimString(baseline.storeType),
1465+
queryBackendDefaultMode: trimString(baseline.queryBackendDefaultMode),
14631466
vectorAdapterStatus: trimString(baseline.vectorAdapterStatus),
14641467
vectorAdapterIndependent: Boolean(baseline.vectorAdapterIndependent),
1468+
vectorAdapterLinkedIntoQueryBackend: Boolean(baseline.vectorAdapterLinkedIntoQueryBackend),
14651469
recommendationsCount,
14661470
};
14671471
appendMessage(
14681472
'assistant',
14691473
getI18nText(
14701474
'agentWorkspace.messages.foundationReadinessLoaded',
1471-
`Foundation readiness ${trimString(readiness && readiness.status) || 'unknown'} / ${trimString(readiness && readiness.decision) || 'unknown'} (store ${trimString(baseline.storeType) || 'n/a'}, vector ${trimString(baseline.vectorAdapterStatus) || 'n/a'}, independent ${Boolean(baseline.vectorAdapterIndependent) ? 'yes' : 'no'}).`,
1475+
`Foundation readiness ${trimString(readiness && readiness.status) || 'unknown'} / ${trimString(readiness && readiness.decision) || 'unknown'} (store ${trimString(baseline.storeType) || 'n/a'}, backend ${trimString(baseline.queryBackendDefaultMode) || 'n/a'}, vector ${trimString(baseline.vectorAdapterStatus) || 'n/a'}, independent ${Boolean(baseline.vectorAdapterIndependent) ? 'yes' : 'no'}, linked ${Boolean(baseline.vectorAdapterLinkedIntoQueryBackend) ? 'yes' : 'no'}).`,
14721476
{
14731477
status: trimString(readiness && readiness.status) || 'unknown',
14741478
decision: trimString(readiness && readiness.decision) || 'unknown',
14751479
storeType: trimString(baseline.storeType) || 'n/a',
1480+
queryBackendDefaultMode: trimString(baseline.queryBackendDefaultMode) || 'n/a',
14761481
vectorAdapterStatus: trimString(baseline.vectorAdapterStatus) || 'n/a',
14771482
vectorAdapterIndependent: Boolean(baseline.vectorAdapterIndependent) ? 'yes' : 'no',
1483+
vectorAdapterLinkedIntoQueryBackend: Boolean(baseline.vectorAdapterLinkedIntoQueryBackend)
1484+
? 'yes'
1485+
: 'no',
14781486
}
14791487
)
14801488
);
@@ -1486,8 +1494,10 @@
14861494
status: 'failed',
14871495
decision: '',
14881496
storeType: '',
1497+
queryBackendDefaultMode: '',
14891498
vectorAdapterStatus: '',
14901499
vectorAdapterIndependent: false,
1500+
vectorAdapterLinkedIntoQueryBackend: false,
14911501
recommendationsCount: 0,
14921502
};
14931503
recordFailure('loadFoundationReadiness', errorMessage);

0 commit comments

Comments
 (0)