@accelerator-mzq/forge 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +12 -12
  2. package/dist/cli/commands/ack.d.ts.map +1 -1
  3. package/dist/cli/commands/ack.js +87 -12
  4. package/dist/cli/commands/ack.js.map +1 -1
  5. package/dist/cli/commands/archive.d.ts +32 -33
  6. package/dist/cli/commands/archive.d.ts.map +1 -1
  7. package/dist/cli/commands/archive.js +339 -667
  8. package/dist/cli/commands/archive.js.map +1 -1
  9. package/dist/cli/commands/legacy-bridge.js +1 -1
  10. package/dist/cli/commands/legacy-bridge.js.map +1 -1
  11. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  12. package/dist/cli/commands/upgrade.js +2 -51
  13. package/dist/cli/commands/upgrade.js.map +1 -1
  14. package/dist/cli/commands/validate.d.ts.map +1 -1
  15. package/dist/cli/commands/validate.js +4 -25
  16. package/dist/cli/commands/validate.js.map +1 -1
  17. package/dist/cli/index.js +0 -9
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/core/ack/marker-ack.d.ts +28 -0
  20. package/dist/core/ack/marker-ack.d.ts.map +1 -0
  21. package/dist/core/ack/marker-ack.js +155 -0
  22. package/dist/core/ack/marker-ack.js.map +1 -0
  23. package/dist/core/ack-log.d.ts.map +1 -1
  24. package/dist/core/ack-log.js +10 -7
  25. package/dist/core/ack-log.js.map +1 -1
  26. package/dist/core/archive/index.d.ts +2 -3
  27. package/dist/core/archive/index.d.ts.map +1 -1
  28. package/dist/core/archive/index.js +7 -5
  29. package/dist/core/archive/index.js.map +1 -1
  30. package/dist/core/archive/pause-decisions-fence.js +12 -12
  31. package/dist/core/archive/pause-decisions-fence.js.map +1 -1
  32. package/dist/core/archive/summary-builder.d.ts +26 -21
  33. package/dist/core/archive/summary-builder.d.ts.map +1 -1
  34. package/dist/core/archive/summary-builder.js +115 -223
  35. package/dist/core/archive/summary-builder.js.map +1 -1
  36. package/dist/core/archive/summary-render.d.ts +5 -3
  37. package/dist/core/archive/summary-render.d.ts.map +1 -1
  38. package/dist/core/archive/summary-render.js +38 -44
  39. package/dist/core/archive/summary-render.js.map +1 -1
  40. package/dist/core/lock.d.ts +46 -0
  41. package/dist/core/lock.d.ts.map +1 -0
  42. package/dist/core/lock.js +98 -0
  43. package/dist/core/lock.js.map +1 -0
  44. package/dist/core/markers/types.d.ts +27 -134
  45. package/dist/core/markers/types.d.ts.map +1 -1
  46. package/dist/core/markers/types.js +10 -1
  47. package/dist/core/markers/types.js.map +1 -1
  48. package/dist/core/migrate/index.js +1 -1
  49. package/dist/core/migrate/index.js.map +1 -1
  50. package/dist/core/monitor/artifact-observer.d.ts.map +1 -1
  51. package/dist/core/monitor/artifact-observer.js +28 -78
  52. package/dist/core/monitor/artifact-observer.js.map +1 -1
  53. package/dist/core/monitor/divergence-map.d.ts.map +1 -1
  54. package/dist/core/monitor/divergence-map.js +9 -7
  55. package/dist/core/monitor/divergence-map.js.map +1 -1
  56. package/dist/core/monitor/health-verdict.d.ts.map +1 -1
  57. package/dist/core/monitor/health-verdict.js +2 -1
  58. package/dist/core/monitor/health-verdict.js.map +1 -1
  59. package/dist/core/monitor/trace-store.d.ts +1 -1
  60. package/dist/core/monitor/trace-store.js +2 -2
  61. package/dist/core/monitor/trace-store.js.map +1 -1
  62. package/dist/core/monitor/types.d.ts +1 -1
  63. package/dist/core/monitor/types.d.ts.map +1 -1
  64. package/dist/core/monitor/types.js +0 -1
  65. package/dist/core/monitor/types.js.map +1 -1
  66. package/dist/core/schemas/archive-summary.d.ts +39 -109
  67. package/dist/core/schemas/archive-summary.d.ts.map +1 -1
  68. package/dist/core/schemas/archive-summary.js +15 -23
  69. package/dist/core/schemas/archive-summary.js.map +1 -1
  70. package/dist/core/templates/commands/ack-confirm.md +1 -1
  71. package/dist/core/templates/commands/apply.md +51 -114
  72. package/dist/core/templates/commands/archive.md +43 -160
  73. package/dist/core/templates/commands/review.md +49 -74
  74. package/dist/core/templates/commands/upgrade.md +21 -40
  75. package/dist/core/templates/commands/verify.md +43 -146
  76. package/dist/core/templates/skills/_shared/tier23-command-bridge.md +34 -0
  77. package/dist/core/templates/skills/exploring.md +3 -3
  78. package/dist/core/templates/skills/finishing-a-development-branch.md +6 -21
  79. package/dist/core/templates/skills/receiving-code-review.md +14 -45
  80. package/dist/core/templates/skills/requesting-code-review.md +11 -0
  81. package/dist/core/templates/skills/subagent-driven-development.md +33 -29
  82. package/dist/core/templates/skills/subagent-driven-discipline.md +28 -28
  83. package/dist/core/templates/skills/using-forge.md +25 -24
  84. package/dist/core/templates/skills/verification-before-completion.md +7 -18
  85. package/dist/core/templates/skills/verifying-three-dimensions.md +93 -169
  86. package/dist/core/templates/skills/writing-plans.md +6 -17
  87. package/dist/core/validate/archive-summary-schema.d.ts +1 -1
  88. package/dist/core/validate/archive-summary-schema.d.ts.map +1 -1
  89. package/dist/core/validate/archive-summary-schema.js +101 -125
  90. package/dist/core/validate/archive-summary-schema.js.map +1 -1
  91. package/dist/core/validate/index.d.ts +0 -1
  92. package/dist/core/validate/index.d.ts.map +1 -1
  93. package/dist/core/validate/index.js +2 -1
  94. package/dist/core/validate/index.js.map +1 -1
  95. package/dist/core/validate/marker-schema.d.ts +12 -4
  96. package/dist/core/validate/marker-schema.d.ts.map +1 -1
  97. package/dist/core/validate/marker-schema.js +98 -605
  98. package/dist/core/validate/marker-schema.js.map +1 -1
  99. package/dist/index.d.ts +1 -1
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +8 -1
  102. package/dist/index.js.map +1 -1
  103. package/package.json +5 -4
  104. package/scripts/codex-review-helper.mjs +337 -0
  105. package/src/core/codex-review/prompts/adversarial-default.md +105 -0
@@ -1,30 +1,16 @@
1
- // src/core/validate/archive-summary-schema.ts — plan-9e1 Task 1
2
- // validateArchiveSummarySchema:校验 archive_summary 顶级字段
3
- // 不校验业务规则(handoff 三类聚合是否齐全)— 那是 Task 2 builder 与 e2e 的事
4
- // 沿 marker-schema.ts checkXxx helper 同结构
1
+ // src/core/validate/archive-summary-schema.ts — v4 OpenSpec alignment 简版(plan-v4 Phase 1 Task 1.4)
2
+ //
3
+ // v4 BREAKING:
4
+ // - schema literal: forge-archive-summary/v1 → v2
5
+ // - 删 process_evidence_summary / acked_warnings / pending_suggestions 必填校验
6
+ // - 简化 handoff_to_backlog source 枚举(仅 pause_decisions / scope_entries)
7
+ // - 删 FENCE_INVARIANT_NAMES 依赖(archive fence 砍后无 14 不变量)
8
+ // - ISO 8601 允许 ms 精度(V-1 修复)
9
+ // - 加 spec_updates_applied forge operation 风格校验
5
10
  import { ok, failed, mergeResults } from './types.js';
6
11
  import { ARCHIVE_SUMMARY_ISO_8601_RE, SEMVER_RE } from '../schemas/archive-summary.js';
7
- // plan-9e2 Task 3:派生 EXPECTED_INVARIANT_COUNT 从 FENCE_INVARIANT_NAMES.length(自动跟随 invariant 数演化)
8
- import { FENCE_INVARIANT_NAMES } from '../archive/fence.js';
9
12
  /**
10
- * plan-9e2 v2 codex 一轮 plan review MAJOR 5 修订:模块级派生常量
11
- * 沿 brainstorm spec §3.5 + DoD 显式要求"派生常量"语义 — 不放函数内 const,模块级单源
12
- * 后续若 invariant 数演化(plan-v1.1+),本常量自动跟随 FENCE_INVARIANT_NAMES.length
13
- */
14
- const EXPECTED_INVARIANT_COUNT = FENCE_INVARIANT_NAMES.length;
15
- /**
16
- * plan-9e2 Task 3 quality review I-1 修订:placeholder=false 路径必填的 4 个 number 字段
17
- * 沿仓库约定:SCREAMING_SNAKE_CASE = 模块级常量(参 marker-schema.ts 模块级 const 模式)
18
- * 与 EXPECTED_INVARIANT_COUNT 对称,避免函数内 inline 声明违约
19
- */
20
- const REQUIRED_FIELDS = [
21
- 'invariants_passed',
22
- 'invariants_with_warning',
23
- 'invariants_failed',
24
- 'legacy_exempt',
25
- ];
26
- /**
27
- * 校验 archive_summary 对象的 schema 合法性
13
+ * 校验 archive_summary v2 对象的 schema 合法性
28
14
  * @param m 已解析的对象
29
15
  * @param file 可选错误报告用 archive_summary.yaml 路径
30
16
  */
@@ -39,11 +25,11 @@ export function validateArchiveSummarySchema(m, file) {
39
25
  const obj = m;
40
26
  const results = [];
41
27
  // 1. schema literal
42
- if (obj.schema !== 'forge-archive-summary/v1') {
28
+ if (obj.schema !== 'forge-archive-summary/v2') {
43
29
  results.push(failed({
44
30
  artifact: 'change',
45
31
  field: 'schema',
46
- message: `schema must be literal 'forge-archive-summary/v1' (got: ${JSON.stringify(obj.schema)})`,
32
+ message: `schema must be literal 'forge-archive-summary/v2' (got: ${JSON.stringify(obj.schema)})`,
47
33
  file,
48
34
  }));
49
35
  }
@@ -52,135 +38,125 @@ export function validateArchiveSummarySchema(m, file) {
52
38
  results.push(failed({
53
39
  artifact: 'change',
54
40
  field: 'version',
55
- message: 'must be semver string (major.minor.patch)',
41
+ message: 'version must be semver (X.Y.Z)',
56
42
  file,
57
43
  }));
58
44
  }
59
- // 3. archived_at ISO 8601
45
+ // 3. archived_at ISO 8601(允许 ms)
60
46
  if (typeof obj.archived_at !== 'string' || !ARCHIVE_SUMMARY_ISO_8601_RE.test(obj.archived_at)) {
61
47
  results.push(failed({
62
48
  artifact: 'change',
63
49
  field: 'archived_at',
64
- message: 'must be ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ)',
65
- file,
66
- }));
67
- }
68
- // 4. change_id 非空 string
69
- if (typeof obj.change_id !== 'string' || !obj.change_id) {
70
- results.push(failed({
71
- artifact: 'change',
72
- field: 'change_id',
73
- message: 'must be non-empty string',
74
- file,
75
- }));
76
- }
77
- // 5. verify_passed object
78
- if (!obj.verify_passed ||
79
- typeof obj.verify_passed !== 'object' ||
80
- Array.isArray(obj.verify_passed)) {
81
- results.push(failed({
82
- artifact: 'change',
83
- field: 'verify_passed',
84
- message: 'must be object',
85
- file,
86
- }));
87
- }
88
- // 6. review_passed object
89
- if (!obj.review_passed ||
90
- typeof obj.review_passed !== 'object' ||
91
- Array.isArray(obj.review_passed)) {
92
- results.push(failed({
93
- artifact: 'change',
94
- field: 'review_passed',
95
- message: 'must be object',
50
+ message: 'must be ISO 8601 UTC (YYYY-MM-DDTHH:MM:SS[.fff]Z)',
96
51
  file,
97
52
  }));
98
53
  }
99
- // 7. process_evidence_summary 必填 object(9e1 placeholder,9e2 9g 真实统计;两态都得过 schema)
100
- if (!obj.process_evidence_summary ||
101
- typeof obj.process_evidence_summary !== 'object' ||
102
- Array.isArray(obj.process_evidence_summary)) {
103
- results.push(failed({
104
- artifact: 'change',
105
- field: 'process_evidence_summary',
106
- message: 'must be object (9e1 placeholder, 9e2 接 9g 真实统计)',
107
- file,
108
- }));
54
+ // 4. change_id / archive_name / verified_by / reviewed_by 必填非空 string
55
+ for (const k of ['change_id', 'archive_name', 'verified_by', 'reviewed_by']) {
56
+ if (typeof obj[k] !== 'string' || obj[k].length === 0) {
57
+ results.push(failed({
58
+ artifact: 'change',
59
+ field: k,
60
+ message: `${k} must be non-empty string`,
61
+ file,
62
+ }));
63
+ }
109
64
  }
110
- // plan-9e2 Task 3:placeholder=false 路径严格校验(v2 codex 一轮 MAJOR 修订:4 字段 + sum 不变式)
111
- if (obj.process_evidence_summary &&
112
- typeof obj.process_evidence_summary === 'object' &&
113
- !Array.isArray(obj.process_evidence_summary)) {
114
- const peSummary = obj.process_evidence_summary;
115
- if (peSummary.placeholder === false) {
116
- // EXPECTED_INVARIANT_COUNT REQUIRED_FIELDS 都从模块顶层引用(I-1 quality review 修订)
117
- // 1. 4 字段必填 + number
118
- for (const field of REQUIRED_FIELDS) {
119
- if (typeof peSummary[field] !== 'number') {
120
- results.push(failed({
121
- artifact: 'change',
122
- field: `process_evidence_summary.${field}`,
123
- message: `required number when placeholder=false`,
124
- file,
125
- }));
126
- }
127
- }
128
- // 仅当 4 字段全部为 number 才走值域 + sum 不变式(避免 NaN 干扰)
129
- if (REQUIRED_FIELDS.every((f) => typeof peSummary[f] === 'number')) {
130
- // 2. 值域 [0, EXPECTED_INVARIANT_COUNT]
131
- for (const field of REQUIRED_FIELDS) {
132
- const v = peSummary[field];
133
- if (v < 0 || v > EXPECTED_INVARIANT_COUNT) {
134
- results.push(failed({
135
- artifact: 'change',
136
- field: `process_evidence_summary.${field}`,
137
- message: `must be in [0, ${EXPECTED_INVARIANT_COUNT}]`,
138
- file,
139
- }));
140
- }
141
- }
142
- // 3. sum 不变式(v2 codex 一轮 MAJOR 修订:4 字段 sum)
143
- const sum = peSummary.invariants_passed +
144
- peSummary.invariants_with_warning +
145
- peSummary.invariants_failed +
146
- peSummary.legacy_exempt;
147
- if (sum !== EXPECTED_INVARIANT_COUNT) {
65
+ // 5. applied_commits 可选,若存在必须 string[]
66
+ if (obj.applied_commits !== undefined) {
67
+ if (!Array.isArray(obj.applied_commits)) {
68
+ results.push(failed({
69
+ artifact: 'change',
70
+ field: 'applied_commits',
71
+ message: 'applied_commits must be array if present',
72
+ file,
73
+ }));
74
+ }
75
+ else {
76
+ for (let i = 0; i < obj.applied_commits.length; i++) {
77
+ if (typeof obj.applied_commits[i] !== 'string') {
148
78
  results.push(failed({
149
79
  artifact: 'change',
150
- field: 'process_evidence_summary',
151
- message: `sum invariant: ${sum} !== ${EXPECTED_INVARIANT_COUNT}`,
80
+ field: `applied_commits[${i}]`,
81
+ message: 'applied_commits item must be string',
152
82
  file,
153
83
  }));
154
84
  }
155
85
  }
156
86
  }
157
- // placeholder=true 路径不变(9e1 容忍)
158
87
  }
159
- // 8-10. 三数组字段
160
- if (!Array.isArray(obj.handoff_to_backlog)) {
88
+ // 6. spec_updates_applied 必填数组(可空)
89
+ if (!Array.isArray(obj.spec_updates_applied)) {
161
90
  results.push(failed({
162
91
  artifact: 'change',
163
- field: 'handoff_to_backlog',
164
- message: 'must be array',
92
+ field: 'spec_updates_applied',
93
+ message: 'spec_updates_applied must be array',
165
94
  file,
166
95
  }));
167
96
  }
168
- if (!Array.isArray(obj.acked_warnings)) {
169
- results.push(failed({
170
- artifact: 'change',
171
- field: 'acked_warnings',
172
- message: 'must be array',
173
- file,
174
- }));
97
+ else {
98
+ const ALLOWED_OPS = ['create', 'replace', 'delete'];
99
+ for (let i = 0; i < obj.spec_updates_applied.length; i++) {
100
+ const u = obj.spec_updates_applied[i];
101
+ if (!u || typeof u !== 'object') {
102
+ results.push(failed({
103
+ artifact: 'change',
104
+ field: `spec_updates_applied[${i}]`,
105
+ message: 'must be object',
106
+ file,
107
+ }));
108
+ continue;
109
+ }
110
+ if (typeof u.capability !== 'string' || u.capability.length === 0) {
111
+ results.push(failed({
112
+ artifact: 'change',
113
+ field: `spec_updates_applied[${i}].capability`,
114
+ message: 'capability must be non-empty string',
115
+ file,
116
+ }));
117
+ }
118
+ if (typeof u.operation !== 'string' || !ALLOWED_OPS.includes(u.operation)) {
119
+ results.push(failed({
120
+ artifact: 'change',
121
+ field: `spec_updates_applied[${i}].operation`,
122
+ message: `operation must ∈ {${ALLOWED_OPS.join(', ')}}`,
123
+ file,
124
+ }));
125
+ }
126
+ }
175
127
  }
176
- if (!Array.isArray(obj.pending_suggestions)) {
128
+ // 7. handoff_to_backlog 必填数组(可空)
129
+ if (!Array.isArray(obj.handoff_to_backlog)) {
177
130
  results.push(failed({
178
131
  artifact: 'change',
179
- field: 'pending_suggestions',
180
- message: 'must be array',
132
+ field: 'handoff_to_backlog',
133
+ message: 'handoff_to_backlog must be array',
181
134
  file,
182
135
  }));
183
136
  }
137
+ else {
138
+ const ALLOWED_SOURCES = ['pause_decisions', 'scope_entries'];
139
+ for (let i = 0; i < obj.handoff_to_backlog.length; i++) {
140
+ const h = obj.handoff_to_backlog[i];
141
+ if (!h || typeof h !== 'object') {
142
+ results.push(failed({
143
+ artifact: 'change',
144
+ field: `handoff_to_backlog[${i}]`,
145
+ message: 'must be object',
146
+ file,
147
+ }));
148
+ continue;
149
+ }
150
+ if (typeof h.source !== 'string' || !ALLOWED_SOURCES.includes(h.source)) {
151
+ results.push(failed({
152
+ artifact: 'change',
153
+ field: `handoff_to_backlog[${i}].source`,
154
+ message: `source must ∈ {${ALLOWED_SOURCES.join(', ')}}`,
155
+ file,
156
+ }));
157
+ }
158
+ }
159
+ }
184
160
  return results.length === 0 ? ok() : mergeResults(...results);
185
161
  }
186
162
  //# sourceMappingURL=archive-summary-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive-summary-schema.js","sourceRoot":"","sources":["../../../src/core/validate/archive-summary-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive-summary-schema.js","sourceRoot":"","sources":["../../../src/core/validate/archive-summary-schema.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,6 @@ export * from './specs.js';
4
4
  export * from './tasks.js';
5
5
  export * from './change.js';
6
6
  export * from './marker-schema.js';
7
- export * from './marker-integrity.js';
8
7
  export * from './finding-hash.js';
9
8
  export * from './candidate-validators.js';
10
9
  export * from './scope-entries.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AAEtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oBAAoB,CAAC;AAEnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AAInC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,oBAAoB,CAAC;AAEnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,6BAA6B,CAAC"}
@@ -4,8 +4,9 @@ export * from './specs.js';
4
4
  export * from './tasks.js';
5
5
  export * from './change.js';
6
6
  export * from './marker-schema.js';
7
- export * from './marker-integrity.js';
8
7
  // Task 7(plan-9a §8): cross-cutting framework — finding_hash 计算 + candidate 验证骨架
8
+ // v4 BREAKING(plan-v4 §10.1.6 Task 1.19):删 marker-integrity barrel(integrity fence 消亡),
9
+ // 保留 finding-hash(Tier 2/3 multi-harness bridge `forge finding hash` 依赖)
9
10
  export * from './finding-hash.js';
10
11
  export * from './candidate-validators.js';
11
12
  // plan-9b Task 4: scope YAML block 校验
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,iFAAiF;AACjF,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,sCAAsC;AACtC,cAAc,oBAAoB,CAAC;AACnC,uBAAuB;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,6CAA6C;AAC7C,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/validate/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,iFAAiF;AACjF,wFAAwF;AACxF,yEAAyE;AACzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,sCAAsC;AACtC,cAAc,oBAAoB,CAAC;AACnC,uBAAuB;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,6CAA6C;AAC7C,cAAc,6BAA6B,CAAC"}
@@ -1,10 +1,18 @@
1
1
  import type { AnyMarker } from '../markers/index.js';
2
2
  import { type ValidationResult } from './types.js';
3
3
  /**
4
- * 校验 marker 对象的 schema 合法性。
5
- * @param m - 已解析的 marker 对象(AnyMarker 或 unknown)
6
- * @param file - 可选:来源文件路径,用于错误报告
4
+ * validateMarkerSchema — 校验 marker 文件的 schema 类型 + 必填字段
5
+ *
6
+ * v4 简版:仅校验
7
+ * - schema 字段是否在 KNOWN_SCHEMAS 中
8
+ * - verified_at / reviewed_at ISO 8601 (允许 ms)
9
+ * - verified_by / reviewed_by 字符串非空
10
+ * - pause_decisions 数组类型(若存在)+ 内字段类型
11
+ * - created_by_tool_version semver 格式(若存在)
12
+ *
13
+ * 不再校验:tasks_hash / content_hash / git / process_evidence / ack_log_* / verify_findings
14
+ * (v4 反加固协议砍后这些字段已从 marker 删除)
7
15
  */
8
- export declare function validateMarkerSchema(m: unknown, file?: string): ValidationResult;
16
+ export declare function validateMarkerSchema(obj: unknown, file?: string): ValidationResult;
9
17
  export type { AnyMarker };
10
18
  //# sourceMappingURL=marker-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"marker-schema.d.ts","sourceRoot":"","sources":["../../../src/core/validate/marker-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,YAAY,CAAC;AAiD7E;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA8FhF;AA+nBD,YAAY,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"marker-schema.d.ts","sourceRoot":"","sources":["../../../src/core/validate/marker-schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,gBAAgB,EAA4B,MAAM,YAAY,CAAC;AAW7E;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAwElF;AAmGD,YAAY,EAAE,SAAS,EAAE,CAAC"}