Skip to content

Commit 483d8da

Browse files
committed
feat: mirror readiness criterion ids in runtime
1 parent cde8d6c commit 483d8da

10 files changed

Lines changed: 65 additions & 3 deletions

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,10 @@ This document re-baselines current mainline truth on 2026-04-19, records what ch
225225
- readiness now reports `promotionCriteriaUnsatisfiedIds`
226226
- current mainline unmet ids are `graph_backend_independent` and `vector_backend_independent`
227227
- overall status still remains `in_progress` / `no-go`.
228+
- The next bounded execution slice after that makes runtime criterion-id parity explicit:
229+
- agent-workspace diagnostics snapshots now persist both `promotionCriteriaSatisfiedIds` and `promotionCriteriaUnsatisfiedIds`
230+
- toolbar summaries now render both satisfied and unmet criterion ids from the same readiness payload
231+
- overall status still remains `in_progress` / `no-go`.
228232
- Current expected outcome on `main` remains:
229233
- status `in_progress`
230234
- decision `no-go`

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,19 @@ Execution anchor:
314314
- decision stays `no-go`,
315315
- derived id lists improve diffability only; they do not alter readiness semantics.
316316

317+
## Latest Mainline Increment (2026-04-20 M8.15 Foundation Runtime Criterion-Id Parity)
318+
319+
- Closed the remaining operator-runtime parity gap for derived criterion-id summaries:
320+
- `lastFoundationReadiness.promotionCriteriaSatisfiedIds`
321+
- `lastFoundationReadiness.promotionCriteriaUnsatisfiedIds`
322+
- Runtime/operator visibility now mirrors the full typed readiness payload instead of only the unmet subset:
323+
- toolbar summaries render both `satisfied ...` and `unmet ...` criterion ids,
324+
- diagnostics snapshots keep both arrays for downstream diffing and report exports.
325+
- Guardrail remains unchanged on `main`:
326+
- status stays `in_progress`,
327+
- decision stays `no-go`,
328+
- runtime parity improves inspectability only; it does not relax graph/vector independence requirements.
329+
317330
## Latest Mainline Increment (2026-04-20 M8.13 Foundation Readiness Provenance Evidence)
318331

319332
- Added machine-readable provenance so operator tooling can tell whether readiness is reading the runtime project root or falling back to real repo evidence:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ Bundle note:
5252
- toolbar button `Foundation Readiness`
5353
- diagnostics snapshot field `lastFoundationReadiness`
5454
- runbook link `foundation-reentry-readiness-checklist`
55+
- runtime snapshots now preserve both `promotionCriteriaSatisfiedIds` and `promotionCriteriaUnsatisfiedIds`
5556
- Current expected result on `main` is:
5657
- status `In Progress`
5758
- decision `No-Go`
@@ -86,6 +87,9 @@ Bundle note:
8687
- Current expected derived criterion-id summaries on `main` are:
8788
- `promotionCriteriaSatisfiedIds = [store_backend_evidence_present, query_backend_boundary_present, vector_backend_present, docs_aligned, readiness_verifier_present]`
8889
- `promotionCriteriaUnsatisfiedIds = [graph_backend_independent, vector_backend_independent]`
90+
- Current expected runtime/operator summary phrasing on `main` is:
91+
- `satisfied store_backend_evidence_present, query_backend_boundary_present, vector_backend_present, docs_aligned, readiness_verifier_present`
92+
- `unmet graph_backend_independent, vector_backend_independent`
8993
- Current expected provenance behavior is:
9094
- direct verifier/utility usage reports `runtimeProjectRootAligned = true`
9195
- hermetic runtime/API usage may report `runtimeProjectRootAligned = false` while preserving the same repo-truth readiness payload

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,19 @@
314314
- 决策仍为 `no-go`
315315
- 派生 id 列表只提升可比对性,不改变 readiness 语义。
316316

317+
## 主线最新增量(2026-04-20 M8.15 Foundation 运行时条件 ID 对齐)
318+
319+
- 已补齐派生条件 ID 摘要在执行侧运行时中的最后一处对齐缺口:
320+
- `lastFoundationReadiness.promotionCriteriaSatisfiedIds`
321+
- `lastFoundationReadiness.promotionCriteriaUnsatisfiedIds`
322+
- 运行时/执行侧可见性现在完整镜像 typed readiness payload,而不再只保留 unmet 子集:
323+
- 工具栏摘要会同时显示 `satisfied ...``unmet ...` 条件 id,
324+
- diagnostics snapshot 会保留两组数组,便于后续 diff 与报告导出。
325+
- `main` 上的护栏结论保持不变:
326+
- 状态仍为 `in_progress`
327+
- 决策仍为 `no-go`
328+
- 运行时对齐只提升可检查性,不放宽 graph/vector independence 要求。
329+
317330
## 主线最新增量(2026-04-20 M8.13 Foundation Readiness 来源证据)
318331

319332
- 已新增 machine-readable provenance,执行侧现在可以直接知道 readiness 是读取 runtime project root,还是回退到真实 repo 证据:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
- 工具栏按钮 `Foundation Readiness`
5353
- diagnostics snapshot 字段 `lastFoundationReadiness`
5454
- runbook link `foundation-reentry-readiness-checklist`
55+
- runtime snapshot 现在会同时保留 `promotionCriteriaSatisfiedIds``promotionCriteriaUnsatisfiedIds`
5556
- 当前主线的预期结果是:
5657
- 状态 `In Progress`
5758
- 决策 `No-Go`
@@ -86,6 +87,9 @@
8687
- 当前 `main` 的预期派生条件 ID 摘要为:
8788
- `promotionCriteriaSatisfiedIds = [store_backend_evidence_present, query_backend_boundary_present, vector_backend_present, docs_aligned, readiness_verifier_present]`
8889
- `promotionCriteriaUnsatisfiedIds = [graph_backend_independent, vector_backend_independent]`
90+
- 当前主线预期的运行时/执行侧摘要措辞为:
91+
- `satisfied store_backend_evidence_present, query_backend_boundary_present, vector_backend_present, docs_aligned, readiness_verifier_present`
92+
- `unmet graph_backend_independent, vector_backend_independent`
8993
- 当前预期 provenance 行为为:
9094
- 直接 verifier/utility 调用会报告 `runtimeProjectRootAligned = true`
9195
- hermetic runtime/API 调用可能报告 `runtimeProjectRootAligned = false`,但 readiness 载荷仍必须保持同一份 repo-truth 结论

src/agent_workspace.runtime.behavior.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,6 +1790,9 @@ describe('agent workspace runtime behavior', () => {
17901790
expect(messages.textContent || '').toContain('lexical_token_overlap');
17911791
expect(messages.textContent || '').toContain('repo-source cwd');
17921792
expect(messages.textContent || '').toContain('aligned no');
1793+
expect(messages.textContent || '').toContain(
1794+
'satisfied store_backend_evidence_present, query_backend_boundary_present, vector_backend_present, docs_aligned, readiness_verifier_present'
1795+
);
17931796
expect(messages.textContent || '').toContain('unmet graph_backend_independent, vector_backend_independent');
17941797
expect(messages.textContent || '').toContain('graph_backend_not_independent');
17951798
expect(messages.textContent || '').toContain('vector_backend_not_independent');
@@ -1817,6 +1820,13 @@ describe('agent workspace runtime behavior', () => {
18171820
vectorAdapterLinkedIntoQueryBackend: true,
18181821
repoRootSource: 'cwd',
18191822
runtimeProjectRootAligned: false,
1823+
promotionCriteriaSatisfiedIds: [
1824+
'store_backend_evidence_present',
1825+
'query_backend_boundary_present',
1826+
'vector_backend_present',
1827+
'docs_aligned',
1828+
'readiness_verifier_present',
1829+
],
18201830
promotionCriteriaUnsatisfiedIds: [
18211831
'graph_backend_independent',
18221832
'vector_backend_independent',

src/frontend/agent_workspace_runtime.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1446,6 +1446,7 @@
14461446
runtimeProjectRootAligned: false,
14471447
promotionCriteriaPassed: 0,
14481448
promotionCriteriaTotal: 0,
1449+
promotionCriteriaSatisfiedIds: [],
14491450
promotionCriteriaUnsatisfiedIds: [],
14501451
promotionBlockerIds: [],
14511452
promotionBlockersCount: 0,
@@ -1500,6 +1501,9 @@
15001501
const promotionCriteriaTotal = Number.isFinite(Number(readiness && readiness.promotionCriteriaTotal))
15011502
? Number(readiness && readiness.promotionCriteriaTotal)
15021503
: promotionCriteria.length;
1504+
const promotionCriteriaSatisfiedIds = Array.isArray(readiness && readiness.promotionCriteriaSatisfiedIds)
1505+
? readiness.promotionCriteriaSatisfiedIds.map((entry) => trimString(entry)).filter(Boolean)
1506+
: promotionCriteria.filter((entry) => entry.satisfied).map((entry) => entry.criterionId);
15031507
const promotionCriteriaUnsatisfiedIds = Array.isArray(readiness && readiness.promotionCriteriaUnsatisfiedIds)
15041508
? readiness.promotionCriteriaUnsatisfiedIds.map((entry) => trimString(entry)).filter(Boolean)
15051509
: promotionCriteria.filter((entry) => !entry.satisfied).map((entry) => entry.criterionId);
@@ -1525,6 +1529,7 @@
15251529
runtimeProjectRootAligned: Boolean(provenance.runtimeProjectRootAligned),
15261530
promotionCriteriaPassed,
15271531
promotionCriteriaTotal,
1532+
promotionCriteriaSatisfiedIds,
15281533
promotionCriteriaUnsatisfiedIds,
15291534
promotionBlockerIds,
15301535
promotionBlockersCount: promotionBlockerIds.length,
@@ -1537,7 +1542,7 @@
15371542
'assistant',
15381543
getI18nText(
15391544
'agentWorkspace.messages.foundationReadinessLoaded',
1540-
`Foundation readiness ${trimString(readiness && readiness.status) || 'unknown'} / ${trimString(readiness && readiness.decision) || 'unknown'} (store ${trimString(baseline.storeType) || 'n/a'}, graph ${trimString(baseline.graphBackendStatus) || 'n/a'}/${trimString(baseline.graphBackendSignalKind) || 'n/a'}, graph-independent ${Boolean(baseline.graphBackendIndependent) ? 'yes' : 'no'}, backend ${trimString(baseline.queryBackendDefaultMode) || 'n/a'}, signals ${queryBackendScoreSignals.join(', ') || 'none'}, vector ${trimString(baseline.vectorAdapterStatus) || 'n/a'}, signal-kind ${trimString(baseline.vectorAdapterSignalKind) || 'n/a'}, independent ${Boolean(baseline.vectorAdapterIndependent) ? 'yes' : 'no'}, linked ${Boolean(baseline.vectorAdapterLinkedIntoQueryBackend) ? 'yes' : 'no'}, repo-source ${trimString(provenance.repoRootSource) || 'n/a'}, aligned ${Boolean(provenance.runtimeProjectRootAligned) ? 'yes' : 'no'}, criteria ${promotionCriteriaPassed}/${promotionCriteriaTotal}, unmet ${promotionCriteriaUnsatisfiedIds.join(', ') || 'none'}, blockers ${promotionBlockerIds.join(', ') || 'none'}).`,
1545+
`Foundation readiness ${trimString(readiness && readiness.status) || 'unknown'} / ${trimString(readiness && readiness.decision) || 'unknown'} (store ${trimString(baseline.storeType) || 'n/a'}, graph ${trimString(baseline.graphBackendStatus) || 'n/a'}/${trimString(baseline.graphBackendSignalKind) || 'n/a'}, graph-independent ${Boolean(baseline.graphBackendIndependent) ? 'yes' : 'no'}, backend ${trimString(baseline.queryBackendDefaultMode) || 'n/a'}, signals ${queryBackendScoreSignals.join(', ') || 'none'}, vector ${trimString(baseline.vectorAdapterStatus) || 'n/a'}, signal-kind ${trimString(baseline.vectorAdapterSignalKind) || 'n/a'}, independent ${Boolean(baseline.vectorAdapterIndependent) ? 'yes' : 'no'}, linked ${Boolean(baseline.vectorAdapterLinkedIntoQueryBackend) ? 'yes' : 'no'}, repo-source ${trimString(provenance.repoRootSource) || 'n/a'}, aligned ${Boolean(provenance.runtimeProjectRootAligned) ? 'yes' : 'no'}, criteria ${promotionCriteriaPassed}/${promotionCriteriaTotal}, satisfied ${promotionCriteriaSatisfiedIds.join(', ') || 'none'}, unmet ${promotionCriteriaUnsatisfiedIds.join(', ') || 'none'}, blockers ${promotionBlockerIds.join(', ') || 'none'}).`,
15411546
{
15421547
status: trimString(readiness && readiness.status) || 'unknown',
15431548
decision: trimString(readiness && readiness.decision) || 'unknown',
@@ -1557,6 +1562,7 @@
15571562
runtimeProjectRootAligned: Boolean(provenance.runtimeProjectRootAligned) ? 'yes' : 'no',
15581563
promotionCriteriaPassed,
15591564
promotionCriteriaTotal,
1565+
promotionCriteriaSatisfiedIds: promotionCriteriaSatisfiedIds.join(', ') || 'none',
15601566
promotionCriteriaUnsatisfiedIds: promotionCriteriaUnsatisfiedIds.join(', ') || 'none',
15611567
promotionBlockerIds: promotionBlockerIds.join(', ') || 'none',
15621568
}
@@ -1583,6 +1589,7 @@
15831589
runtimeProjectRootAligned: false,
15841590
promotionCriteriaPassed: 0,
15851591
promotionCriteriaTotal: 0,
1592+
promotionCriteriaSatisfiedIds: [],
15861593
promotionCriteriaUnsatisfiedIds: [],
15871594
promotionBlockerIds: [],
15881595
promotionBlockersCount: 0,

src/frontend/locales/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@
282282
"learningQualitySnapshotFailed": "Learning quality snapshot request failed.",
283283
"learningQualitySnapshotLoaded": "Learning quality snapshot loaded (retest {retestPassRatePct}%, recurrence {misconceptionRecurrenceRatePct}%).",
284284
"foundationReadinessFailed": "Foundation readiness request failed.",
285-
"foundationReadinessLoaded": "Foundation readiness {status} / {decision} (store {storeType}, graph {graphBackendStatus}/{graphBackendSignalKind}, graph-independent {graphBackendIndependent}, backend {queryBackendDefaultMode}, signals {queryBackendScoreSignals}, vector {vectorAdapterStatus}, signal-kind {vectorAdapterSignalKind}, independent {vectorAdapterIndependent}, linked {vectorAdapterLinkedIntoQueryBackend}, repo-source {repoRootSource}, aligned {runtimeProjectRootAligned}, criteria {promotionCriteriaPassed}/{promotionCriteriaTotal}, unmet {promotionCriteriaUnsatisfiedIds}, blockers {promotionBlockerIds}).",
285+
"foundationReadinessLoaded": "Foundation readiness {status} / {decision} (store {storeType}, graph {graphBackendStatus}/{graphBackendSignalKind}, graph-independent {graphBackendIndependent}, backend {queryBackendDefaultMode}, signals {queryBackendScoreSignals}, vector {vectorAdapterStatus}, signal-kind {vectorAdapterSignalKind}, independent {vectorAdapterIndependent}, linked {vectorAdapterLinkedIntoQueryBackend}, repo-source {repoRootSource}, aligned {runtimeProjectRootAligned}, criteria {promotionCriteriaPassed}/{promotionCriteriaTotal}, satisfied {promotionCriteriaSatisfiedIds}, unmet {promotionCriteriaUnsatisfiedIds}, blockers {promotionBlockerIds}).",
286286
"memoryPolicyFailed": "Memory snapshot request failed.",
287287
"memoryPolicyLoaded": "Memory snapshot loaded ({layer}/{operation}): {entriesCount} entries, evicted {evictedCount}, totals session {sessionCount}, unit {unitCount}, long-term {longTermCount}, recommended {recommendedActionsCount} actions."
288288
}

src/frontend/locales/zh.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@
282282
"learningQualitySnapshotFailed": "学习质量快照请求失败。",
283283
"learningQualitySnapshotLoaded": "学习质量快照已加载(复测通过率 {retestPassRatePct}% ,误解复发率 {misconceptionRecurrenceRatePct}%)。",
284284
"foundationReadinessFailed": "基础就绪性请求失败。",
285-
"foundationReadinessLoaded": "基础就绪性 {status} / {decision}(存储 {storeType},图后端 {graphBackendStatus}/{graphBackendSignalKind},图独立性 {graphBackendIndependent},后端 {queryBackendDefaultMode},打分信号 {queryBackendScoreSignals},向量阶段 {vectorAdapterStatus},信号类型 {vectorAdapterSignalKind},独立性 {vectorAdapterIndependent},接线 {vectorAdapterLinkedIntoQueryBackend},repo 来源 {repoRootSource},对齐 {runtimeProjectRootAligned},条件 {promotionCriteriaPassed}/{promotionCriteriaTotal},未满足 {promotionCriteriaUnsatisfiedIds},阻塞项 {promotionBlockerIds})。",
285+
"foundationReadinessLoaded": "基础就绪性 {status} / {decision}(存储 {storeType},图后端 {graphBackendStatus}/{graphBackendSignalKind},图独立性 {graphBackendIndependent},后端 {queryBackendDefaultMode},打分信号 {queryBackendScoreSignals},向量阶段 {vectorAdapterStatus},信号类型 {vectorAdapterSignalKind},独立性 {vectorAdapterIndependent},接线 {vectorAdapterLinkedIntoQueryBackend},repo 来源 {repoRootSource},对齐 {runtimeProjectRootAligned},条件 {promotionCriteriaPassed}/{promotionCriteriaTotal},已满足 {promotionCriteriaSatisfiedIds},未满足 {promotionCriteriaUnsatisfiedIds},阻塞项 {promotionBlockerIds})。",
286286
"memoryPolicyFailed": "记忆快照请求失败。",
287287
"memoryPolicyLoaded": "记忆快照已加载({layer}/{operation}):{entriesCount} 条,清理 {evictedCount} 条,总量 session {sessionCount}、unit {unitCount}、long-term {longTermCount},推荐动作 {recommendedActionsCount} 个。"
288288
}

src/server.migration.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,13 @@ describe('server migration settings routes', () => {
457457
}),
458458
promotionCriteriaPassed: 5,
459459
promotionCriteriaTotal: 7,
460+
promotionCriteriaSatisfiedIds: [
461+
'store_backend_evidence_present',
462+
'query_backend_boundary_present',
463+
'vector_backend_present',
464+
'docs_aligned',
465+
'readiness_verifier_present'
466+
],
460467
promotionCriteriaUnsatisfiedIds: [
461468
'graph_backend_independent',
462469
'vector_backend_independent'

0 commit comments

Comments
 (0)