create-yss-spec 3.4.9 → 3.4.10
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.
- package/package.json +1 -1
- package/src/template/attach-planner.js +5 -0
- package/src/template/sync-planner.js +5 -0
- package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.agents/skills/yss-openapi-draft-review/SKILL.md +2 -0
- package/template/.agents/skills/yss-openapi-governance/SKILL.md +4 -0
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +11 -5
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +63 -1
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.agents/skills/yss-prototype-stage/SKILL.md +2 -0
- package/template/.agents/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs +2 -2
- package/template/.agents/skills/yss-stage-decision/SKILL.md +2 -0
- package/template/.agents/skills/yss-tactical-design/SKILL.md +2 -0
- package/template/.agents/skills/yss-technical-design/SKILL.md +2 -0
- package/template/.agents/skills/yss-technical-design/scripts/engineering-design.mjs +1 -1
- package/template/.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs +11 -8
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.codex/skills/yss-openapi-draft-review/SKILL.md +2 -0
- package/template/.codex/skills/yss-openapi-governance/SKILL.md +4 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +11 -5
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +63 -1
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.codex/skills/yss-prototype-stage/SKILL.md +2 -0
- package/template/.codex/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs +2 -2
- package/template/.codex/skills/yss-stage-decision/SKILL.md +2 -0
- package/template/.codex/skills/yss-tactical-design/SKILL.md +2 -0
- package/template/.codex/skills/yss-technical-design/SKILL.md +2 -0
- package/template/.codex/skills/yss-technical-design/scripts/engineering-design.mjs +1 -1
- package/template/.codex/skills/yss-technical-design/scripts/validate-technical-design.mjs +11 -8
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.cursor/skills/yss-openapi-draft-review/SKILL.md +2 -0
- package/template/.cursor/skills/yss-openapi-governance/SKILL.md +4 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +11 -5
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +63 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.cursor/skills/yss-prototype-stage/SKILL.md +2 -0
- package/template/.cursor/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs +2 -2
- package/template/.cursor/skills/yss-stage-decision/SKILL.md +2 -0
- package/template/.cursor/skills/yss-tactical-design/SKILL.md +2 -0
- package/template/.cursor/skills/yss-technical-design/SKILL.md +2 -0
- package/template/.cursor/skills/yss-technical-design/scripts/engineering-design.mjs +1 -1
- package/template/.cursor/skills/yss-technical-design/scripts/validate-technical-design.mjs +11 -8
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.pi/skills/yss-openapi-draft-review/SKILL.md +2 -0
- package/template/.pi/skills/yss-openapi-governance/SKILL.md +4 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +11 -5
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +63 -1
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.pi/skills/yss-prototype-stage/SKILL.md +2 -0
- package/template/.pi/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs +2 -2
- package/template/.pi/skills/yss-stage-decision/SKILL.md +2 -0
- package/template/.pi/skills/yss-tactical-design/SKILL.md +2 -0
- package/template/.pi/skills/yss-technical-design/SKILL.md +2 -0
- package/template/.pi/skills/yss-technical-design/scripts/engineering-design.mjs +1 -1
- package/template/.pi/skills/yss-technical-design/scripts/validate-technical-design.mjs +11 -8
- package/template/AGENTS.md +2 -0
- package/template/CONTEXT.md +2 -1
- package/template/README.md +1 -0
- package/template/docs/agents/issue-tracker.md +7 -0
- package/template/docs/process/contract-reading.md +46 -0
- package/template/docs/process/lifecycle-artifact-map.md +2 -2
- package/template/docs/process/lifecycle-registry-baseline.json +2 -1
- package/template/docs/process/lifecycle-registry.yaml +10 -4
- package/template/docs/process/schemas/api-contract-decision-v2.schema.json +198 -0
- package/template/docs/process/schemas/digital-human-task-package.schema.json +8 -0
- package/template/docs/process/schemas/lifecycle-checkpoint.schema.json +259 -0
- package/template/docs/process/schemas/stage-tracking.schema.json +259 -0
- package/template/docs/process/stage-tracking.md +62 -0
- package/template/docs/process/strategic-handoff-package.md +8 -0
- package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +2 -0
- package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214/347/264/242/345/274/225.md +1 -0
- package/template/docs/user-guide//351/230/266/346/256/265/346/216/245/345/205/245/344/270/216/344/272/247/347/211/251/345/244/215/347/224/250/344/275/277/347/224/250/346/211/213/345/206/214.md +243 -0
- package/template/scripts/api-contract-decision +16 -0
- package/template/scripts/complete-backend-delivery +17 -0
- package/template/scripts/contract +13 -0
- package/template/scripts/dispatch-slice-task +13 -0
- package/template/scripts/lib/api-contract-decision.mjs +45 -4
- package/template/scripts/lib/approval-record.mjs +1 -1
- package/template/scripts/lib/approved-execution-context.mjs +35 -7
- package/template/scripts/lib/backend-architecture.mjs +2 -2
- package/template/scripts/lib/backend-delivery-terminal.mjs +51 -0
- package/template/scripts/lib/backend-platform-provenance.mjs +1 -1
- package/template/scripts/lib/backend-platform.mjs +1 -1
- package/template/scripts/lib/backend-scaffold-prerequisites.mjs +1 -1
- package/template/scripts/lib/context-contract.mjs +1 -1
- package/template/scripts/lib/context-reconciliation.mjs +1 -1
- package/template/scripts/lib/contract-source.mjs +22 -0
- package/template/scripts/lib/contract-views.mjs +109 -0
- package/template/scripts/lib/delivery-preflight.mjs +3 -2
- package/template/scripts/lib/digital-human-roles.mjs +1 -1
- package/template/scripts/lib/existing-backend-architecture.mjs +4 -3
- package/template/scripts/lib/existing-ui-baseline.mjs +4 -2
- package/template/scripts/lib/frontend-delivery-boundary.mjs +1 -1
- package/template/scripts/lib/frontend-delivery.mjs +1 -1
- package/template/scripts/lib/harness-execution-scope.mjs +15 -1
- package/template/scripts/lib/implementation-contract-compiler.mjs +4 -4
- package/template/scripts/lib/json-schema.mjs +19 -4
- package/template/scripts/lib/lifecycle-context-query.mjs +5 -1
- package/template/scripts/lib/lifecycle-controls.mjs +1 -1
- package/template/scripts/lib/lifecycle-execution-scope.mjs +92 -0
- package/template/scripts/lib/lifecycle-registry.mjs +2 -1
- package/template/scripts/lib/lifecycle-transition.mjs +21 -3
- package/template/scripts/lib/openapi-draft-validation.mjs +2 -1
- package/template/scripts/lib/skill-registry.mjs +1 -1
- package/template/scripts/lib/slice-contract-preparation.mjs +16 -14
- package/template/scripts/lib/slice-contract-views.mjs +1 -1
- package/template/scripts/lib/slice-contract.mjs +18 -3
- package/template/scripts/lib/slice-execution-preflight.mjs +7 -3
- package/template/scripts/lib/slice-repositories.mjs +1 -1
- package/template/scripts/lib/slice-task-package.mjs +3 -2
- package/template/scripts/lib/stage-tracking-migration.mjs +176 -0
- package/template/scripts/lib/stage-tracking.mjs +184 -0
- package/template/scripts/lib/strategic-handoff-consumption.mjs +5 -4
- package/template/scripts/lib/strategic-handoff-io.mjs +5 -2
- package/template/scripts/lib/strategic-handoff-routing.mjs +31 -0
- package/template/scripts/lib/strategic-handoff.mjs +4 -2
- package/template/scripts/lib/task-package.mjs +2 -0
- package/template/scripts/lib/technical-design-boundary.mjs +4 -2
- package/template/scripts/lib/ui-baseline.mjs +1 -1
- package/template/scripts/lib/user-decision.mjs +1 -1
- package/template/scripts/lib/validation-phase.mjs +72 -0
- package/template/scripts/stage-tracking +25 -0
- package/template/scripts/strategic-consumer-entry +47 -0
- package/template/scripts/verify-context-reconciliation +4 -3
- package/template/scripts/verify-lifecycle-checkpoint +10 -0
- package/template/skills-lock.json +13 -13
- package/template.snapshot.json +4 -4
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
1. 按 `orchestration-contract.yaml.request_triage` 理解请求并选择模式,再识别仓库身份、任务规模和影响面;问题理解与澄清细节见 [请求分诊协议](request-triage.md)。
|
|
6
6
|
2. `setup readiness`:每个任务只执行一次,核对 tracker、五态标签和领域文档布局,并在本轮缓存结果;仅在 tracker、主远端、真实标签或配置变化时重查。
|
|
7
|
-
3. 加载父 Ticket/checkpoint
|
|
7
|
+
3. 加载父 Ticket/checkpoint 与真实资产,计算最近可信阶段;按 `docs/process/stage-tracking.md` 登记、恢复并核验当前阶段工作项,写入前确保 checkpoint 已持久化,工作单元结果带 checkpoint_ref。
|
|
8
8
|
4. 评估资产、门禁和 `stale`,选择第一个未阻塞工作单元。进入 `work-unit.slice-implementation` 前,必须先通过 `scripts/lib/lifecycle-transition.mjs` 的 Ticket 正式化、垂直切片绑定和合法 `next_route` 校验;父 Ticket、缺少垂直切片或 `ready-for-human` 的切片一律 `blocked`。
|
|
9
9
|
5. 执行最小生命周期工作单元:主控先按 `docs/process/schemas/digital-human-task-package.schema.json` 编译并校验任务包,再只实际调用允许的 model-invoked skill;原生工作单元可直接持有正式资产,Matt 兼容 user-invoked skill 仅作为 workflow reference,仍由用户显式启动。将结果归一化为 `Workflow Execution Result`,验收输出并回写状态与证据。任务包的 `contract.kind` 按工作单元选择;只有实现子任务使用 `slice-implementation` 并消费 Slice Implementation Contract,其他阶段不伪造该合同。
|
|
10
10
|
6. 若仍在授权和自动推进边界内,回到第 3 步;否则暂停。
|
|
11
11
|
|
|
12
12
|
不要仅输出下一个提示词后结束 `orchestrate`/`resume`。不要因进入业务代码阶段而退出主控;应把实现交给专项 skill,并在返回后继续核验。
|
|
13
13
|
|
|
14
|
-
连续阶段自动推进时累积 Ticket 同步和 Git
|
|
14
|
+
连续阶段自动推进时累积 Ticket 同步和 Git 判断证据,在阶段退出、人工暂停、handoff、进入实现、合并或发布边界集中 checkpoint。发生阻塞、责任人变化或资产需要单独批准时立即落 checkpoint,不因合并记录而丢失阶段因果关系。
|
|
15
15
|
|
|
16
16
|
## 执行成本
|
|
17
17
|
|
|
@@ -5,6 +5,8 @@ description: Use when a YSS feature has product-design impact on a primary flow,
|
|
|
5
5
|
|
|
6
6
|
# YSS Prototype Stage
|
|
7
7
|
|
|
8
|
+
已有生命周期资产优先用 `scripts/contract view <资产> --kind <类型>` 阅读;执行任务用 `--profile task --unit <ID>`,绑定与校验明细用 `--profile full`。视图不授予执行权限,仍按本 Skill 的原始来源和批准门禁处理。类型、准备和迁移见 `docs/process/contract-reading.md`。
|
|
9
|
+
|
|
8
10
|
把产品设计影响收敛为跨 Agent 一致的原型交付物、证据和生命周期回流合同。它不替代 `yss-product-lifecycle` 的门禁裁决,也不把原型当作生产前端代码。
|
|
9
11
|
|
|
10
12
|
文档输出时按 `lifecycle-document-output` 条件调用 `i-have-adhd`,读取 `docs/process/document-writing.md`;作用域仅限当前产物,派发时传递条件及引用。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { existsSync } from "
|
|
4
|
-
import { mkdir,
|
|
3
|
+
import { existsSync, readFile, readdir } from "../../../../scripts/lib/validation-phase.mjs";
|
|
4
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { pathToFileURL } from "node:url";
|
|
7
7
|
import { parseDocument, stringify } from "../../../../scripts/vendor/yaml.mjs";
|
|
@@ -5,6 +5,8 @@ description: 编排 Plan 到 Spec 入口的方案决策与业务边界、协作
|
|
|
5
5
|
|
|
6
6
|
# YSS Stage Decision
|
|
7
7
|
|
|
8
|
+
已有生命周期资产优先用 `scripts/contract view <资产> --kind <类型>` 阅读;执行任务用 `--profile task --unit <ID>`,绑定与校验明细用 `--profile full`。视图不授予执行权限,仍按本 Skill 的原始来源和批准门禁处理。类型、准备和迁移见 `docs/process/contract-reading.md`。
|
|
9
|
+
|
|
8
10
|
`yss-stage-decision` 是由生命周期主控调度的上游决策技能,负责把需求、产品、商务输入和业务边界与规则设计结果整理成可审查、可版本化、可被下游消费的方案决策包。它不替代生命周期主控,也不生成产品代码、原型、OpenAPI 或垂直切片 Ticket。
|
|
9
11
|
|
|
10
12
|
文档输出时按 `lifecycle-document-output` 条件调用 `i-have-adhd`,读取 `docs/process/document-writing.md`;作用域仅限当前产物,派发时传递条件及引用。
|
|
@@ -5,6 +5,8 @@ description: 在 YSS 技术分析阶段将批准的战略领域输入细化为
|
|
|
5
5
|
|
|
6
6
|
# yss-tactical-design
|
|
7
7
|
|
|
8
|
+
已有生命周期资产优先用 `scripts/contract view <资产> --kind <类型>` 阅读;执行任务用 `--profile task --unit <ID>`,绑定与校验明细用 `--profile full`。视图不授予执行权限,仍按本 Skill 的原始来源和批准门禁处理。类型、准备和迁移见 `docs/process/contract-reading.md`。
|
|
9
|
+
|
|
8
10
|
本 skill 负责 DDD 战术设计,不新增生命周期主阶段,也不替代 `yss-stage-decision` 或 `yss-domain`。
|
|
9
11
|
|
|
10
12
|
## 适用边界
|
|
@@ -5,6 +5,8 @@ description: 在 YSS 技术分析中统一承接需求与战略输入,按已
|
|
|
5
5
|
|
|
6
6
|
# YSS 技术设计
|
|
7
7
|
|
|
8
|
+
已有生命周期资产优先用 `scripts/contract view <资产> --kind <类型>` 阅读;执行任务用 `--profile task --unit <ID>`,绑定与校验明细用 `--profile full`。视图不授予执行权限,仍按本 Skill 的原始来源和批准门禁处理。类型、准备和迁移见 `docs/process/contract-reading.md`。
|
|
9
|
+
|
|
8
10
|
由 `yss-product-lifecycle` 调度,负责 `work-unit.technical-analysis` 的技术设计,不另起生命周期、不生成生产代码。生命周期维护批准和状态;`yss-implementation-contract-compiler` 消费批准且当前的设计,起草实现合同。
|
|
9
11
|
|
|
10
12
|
文档输出时按 `lifecycle-document-output` 条件调用 `i-have-adhd`,读取 `docs/process/document-writing.md`;作用域仅限当前产物,派发时传递条件及引用。
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {readFileSync} from '
|
|
2
|
+
import {readFileSync} from '../../../../scripts/lib/validation-phase.mjs';
|
|
3
3
|
import {ensure,read,safe,hash} from '../../../../scripts/lib/strategic-handoff-io.mjs';
|
|
4
4
|
const beneath=(ref,scope)=>ref===scope||ref.startsWith(`${scope}/`);
|
|
5
5
|
export function validateEngineeringDesign(data,{root}) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync } from '
|
|
2
|
+
import { readFileSync, withValidationPhase, validationDependencies } from '../../../../scripts/lib/validation-phase.mjs';
|
|
3
3
|
import { validateEngineeringDesign } from './engineering-design.mjs';
|
|
4
4
|
import { createApprovedExecutionContext, assertApprovedExecutionContext } from '../../../../scripts/lib/approved-execution-context.mjs';
|
|
5
5
|
import { verifyArchitectureEvidence } from '../../../../scripts/lib/backend-architecture.mjs';
|
|
@@ -42,8 +42,8 @@ function validateMvc(design) {
|
|
|
42
42
|
if (!design.integration_catalog.length) ensure(text(design.integration_not_applicable_reason), '无外部集成必须说明原因');
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
export function verifyArchitecture(data, root, {execution,sliceRef}={}) {
|
|
46
|
-
if(execution)assertApprovedExecutionContext(execution,{root,technicalDesign:data,sliceId:sliceRef});
|
|
45
|
+
export function verifyArchitecture(data, root, {execution,sliceRef,readOnly=false}={}) {
|
|
46
|
+
if(execution)assertApprovedExecutionContext(execution,{root,technicalDesign:data,sliceId:sliceRef,readOnly});
|
|
47
47
|
const binding = data.architecture;
|
|
48
48
|
const file = safe(root, binding.decision_ref);
|
|
49
49
|
ensure(hash(readFileSync(file)) === binding.decision_digest, '架构来源摘要漂移');
|
|
@@ -63,7 +63,7 @@ export function verifyArchitecture(data, root, {execution,sliceRef}={}) {
|
|
|
63
63
|
ensure(!['stale','blocked'].includes(record.status) && !['stale','blocked'].includes(entry.status), '工程登记已失效');
|
|
64
64
|
if (entry.architecture_identity?.schema_version === 2) {
|
|
65
65
|
ensure(entry.architecture_evidence?.engineering_baseline && entry.architecture_evidence?.manifest, '既有工程登记缺少原始工程证据引用');
|
|
66
|
-
verifyArchitectureEvidence(entry.architecture_identity, { ...entry.architecture_evidence, repository_registration: { ref: binding.decision_ref, digest: binding.decision_digest } }, { root, execution });
|
|
66
|
+
verifyArchitectureEvidence(entry.architecture_identity, { ...entry.architecture_evidence, repository_registration: { ref: binding.decision_ref, digest: binding.decision_digest } }, { root, execution, readOnly });
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -111,7 +111,7 @@ export async function validateTechnicalDesign(data, { root = process.cwd(), slic
|
|
|
111
111
|
ensure(data.digest === technicalDigest(data), '技术设计合同摘要不匹配');
|
|
112
112
|
ensure(!['stale','blocked','drift','new_impacts'].includes(data.status), '设计状态不可消费');
|
|
113
113
|
if (sliceRef) ensure(data.status === 'approved', '切片只能消费 approved 设计');
|
|
114
|
-
verifyArchitecture(data, root, {execution,sliceRef});
|
|
114
|
+
verifyArchitecture(data, root, {execution,sliceRef,readOnly});
|
|
115
115
|
ensure(data.inputs.some(item => item.kind === 'context' && item.ref === 'CONTEXT.md') && data.inputs.some(item => item.kind === 'spec'), '共同输入缺少根 CONTEXT.md 或 Spec');
|
|
116
116
|
for (const input of data.inputs) ensure(hash(readFileSync(safe(root, input.ref))) === input.digest, `输入摘要漂移: ${input.ref}`);
|
|
117
117
|
for (const ref of data.evidence_refs) safe(root, ref);
|
|
@@ -135,12 +135,15 @@ export async function validateTechnicalDesign(data, { root = process.cwd(), slic
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
async function main() {
|
|
138
|
-
const { values, positionals } = parseArgs({ allowPositionals: true, options: { root: { type: 'string', default: process.cwd() }, slice: { type: 'string' }, 'legacy-ddd': { type: 'boolean', default: false }, 'read-only': {type:'boolean',default:false}, 'work-unit': {type:'string'}, 'approved-slice': {type:'string'}, 'approved-slice-digest': {type:'string'}, 'approved-slice-approval': {type:'string'} } });
|
|
138
|
+
const { values, positionals } = parseArgs({ allowPositionals: true, options: { root: { type: 'string', default: process.cwd() }, slice: { type: 'string' }, 'legacy-ddd': { type: 'boolean', default: false }, 'read-only': {type:'boolean',default:false}, 'validation-dependencies': {type:'boolean',default:false}, 'work-unit': {type:'string'}, 'approved-slice': {type:'string'}, 'approved-slice-digest': {type:'string'}, 'approved-slice-approval': {type:'string'} } });
|
|
139
139
|
ensure(positionals.length === 1, '用法: validate-technical-design.mjs <合同> --root <项目根> [--slice <ID>] [--legacy-ddd]');
|
|
140
140
|
const approvedOptions=['approved-slice','approved-slice-digest','approved-slice-approval'];
|
|
141
141
|
ensure(!approvedOptions.some(key=>values[key])||approvedOptions.every(key=>values[key]),'执行增量必须完整给出持久化 Slice、字节摘要及本地批准引用');
|
|
142
|
-
const
|
|
142
|
+
const output=await withValidationPhase({root:values.root,purpose:'technical-design',slice_id:values.slice,work_unit_id:values['work-unit'],readOnly:values['read-only']},async()=>{
|
|
143
|
+
const execution=values['approved-slice']?createApprovedExecutionContext({ref:values['approved-slice'],digest:values['approved-slice-digest'],approval_ref:values['approved-slice-approval']},{root:values.root,work_unit_id:values['work-unit'],readOnly:values['read-only']}):undefined;
|
|
143
144
|
const result = await validateTechnicalDesign(read(path.resolve(positionals[0])), { root: values.root, sliceRef: values.slice, legacyDdd: values['legacy-ddd'], readOnly:values['read-only'], execution });
|
|
144
|
-
|
|
145
|
+
return values['validation-dependencies']?{...result,validation_dependencies:validationDependencies()}:result;
|
|
146
|
+
});
|
|
147
|
+
process.stdout.write(`${JSON.stringify(output, null, 2)}\n`);
|
|
145
148
|
}
|
|
146
149
|
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) main().catch(error => { process.stderr.write(`${JSON.stringify({ result: 'blocked', errors: [error.message] })}\n`); process.exitCode = 1; });
|
package/template/AGENTS.md
CHANGED
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
|
|
43
43
|
## 6. Ticket 与状态
|
|
44
44
|
|
|
45
|
+
- Plan / Spec / Design 按 `docs/process/stage-tracking.md` 从阶段入口登记工作、按需拆分并在恢复 / 流转时验证;工作项进度不替代 Ticket 五态和阶段批准。
|
|
46
|
+
|
|
45
47
|
- 每个功能先建父 Ticket,汇总阶段资产、审查、阻塞和证据。
|
|
46
48
|
- Spec、设计、原型、OpenAPI Draft 和待冻结资产使用 `ready-for-human`;只有门禁通过、阻塞清除且可直接实现的垂直切片才能使用 `ready-for-agent`。
|
|
47
49
|
- 按 `docs/agents/issue-tracker.md` 持久化主 tracker,不从 Git remote 推断;平台不可用时生成待发布草案。五态见 `docs/agents/triage-labels.md`。
|
package/template/CONTEXT.md
CHANGED
|
@@ -39,8 +39,9 @@ context_schema_version: 1
|
|
|
39
39
|
| 技能投影 | 从权威共享技能生成、供特定 Agent root 加载的同步副本。 | — | 投影不是独立维护的技能源,不应在各 Agent root 中分别修改。 |
|
|
40
40
|
| Spec | 记录用户问题、解决方案、用户故事、关键决策、验收标准和测试 seam 的产品研发规格。 | — | 新资产统一使用 Spec;旧规格称谓只在迁移记录中保留。 |
|
|
41
41
|
| Spec Delta | 记录相对于既有冻结 Spec 基线的 `ADDED / MODIFIED / REMOVED` 行为、验收场景和测试映射。 | — | 不用于全新产品或全新模块,也不替代完整 Spec、OpenAPI 或架构资产。 |
|
|
42
|
+
| 阶段工作项 | Plan、Spec、Design 中有明确负责人、验收和证据的工作记录;当前进度由 checkpoint.stage_tracking 持有,按需独立落盘。 | — | 不等同于业务 Ticket 或可实现垂直切片,不授予 ready-for-agent。 |
|
|
42
43
|
| Ticket | 在追踪平台上承载功能生命周期或可实现工作单元的通用追踪对象。 | — | GitHub Issues / GitLab Issues 是具体平台对象名称;领域资产统一称为 Ticket。 |
|
|
43
|
-
| 功能父 Ticket | 汇总一个功能从
|
|
44
|
+
| 功能父 Ticket | 汇总一个功能从 Plan 或最近可信接入阶段到契约冻结的阶段状态、资产链接、审查结论和阻塞项的 Ticket。 | — | 不作为 Agent 直接实现的垂直切片。 |
|
|
44
45
|
| 垂直切片 Ticket | 契约冻结后生成的可独立验证实现单元,记录范围、阻塞关系、验收标准和验证证据。 | — | 只有通过必要门禁并具备直接实现条件时才能标记 `ready-for-agent`。 |
|
|
45
46
|
| `ready-for-human` | 表示 Spec、设计、契约草案或其他资产仍需会签(指定数字人或生物人)。 | — | 此状态不表示可以直接进入实现;也不等于某个数字人角色。 |
|
|
46
47
|
| `ready-for-agent` | 表示垂直切片已通过必要门禁并具备直接实现条件的流程状态。 | — | 不得用于 Spec 初稿、原型、OpenAPI Draft 或其他未冻结资产。 |
|
package/template/README.md
CHANGED
|
@@ -102,6 +102,7 @@ scripts/verify-template-fast
|
|
|
102
102
|
|------|------|
|
|
103
103
|
| [AGENTS.md](./AGENTS.md) | 全局 AI 指令 + 工程基线入口 + Agent 协作 |
|
|
104
104
|
| [docs/user-guide/用户手册.md](./docs/user-guide/用户手册.md) | 从首次只读检查到需求、开发、审查、发布和 CLI 操作的统一用户手册 |
|
|
105
|
+
| [阶段接入与产物复用使用手册](./docs/user-guide/阶段接入与产物复用使用手册.md) | 复用上游资产,从指定入口继续;含后端交付后前端开发操作 |
|
|
105
106
|
| [docs/process/PDCA-SCRUM.md](./docs/process/PDCA-SCRUM.md) | PDCA × Scrum × AI |
|
|
106
107
|
| [docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md](./docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md) | Matt Pocock Engineering Skills 集成与使用 |
|
|
107
108
|
| [docs/process/lifecycle-registry.yaml](./docs/process/lifecycle-registry.yaml) | 生命周期结构事实源:主阶段、门禁、产物、工作单元、证据与稳定 ID |
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
tracker:
|
|
3
|
+
lifecycle_tracking_version: 1
|
|
3
4
|
platform: local-markdown
|
|
4
5
|
root: docs/.scratch
|
|
5
6
|
legacy_roots:
|
|
@@ -135,3 +136,9 @@ Ticket 是默认 triage surface。MR / PR 是否纳入 triage 取决于当前平
|
|
|
135
136
|
- Local Markdown:读取引用的 `docs/.scratch/<feature>/...` 文件;旧路径引用必须先经过迁移检查。
|
|
136
137
|
- GitLab:使用 `glab issue view <iid> --comments`。
|
|
137
138
|
- GitHub:使用 `gh issue view <number> --comments`。
|
|
139
|
+
|
|
140
|
+
## 阶段工作追踪
|
|
141
|
+
|
|
142
|
+
新初始化默认启用 `tracker.lifecycle_tracking_version: 1`。已有项目的 attach / sync 保留原配置;缺省保持旧模式,按 [阶段工作追踪](../process/stage-tracking.md) 执行 check → plan → apply。
|
|
143
|
+
|
|
144
|
+
Plan / Spec / Design 的小工作记录在 checkpoint.stage_tracking;独立工作项使用 `work-items/<id>.md`,不占用业务票 / 实现切片的 `issues/`。执行进度只由 checkpoint 保存,父票和 map 引用;阶段工作项不得设置 `ready-for-agent`。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 合同阅读、准备与显式迁移
|
|
2
|
+
|
|
3
|
+
本文件描述工具入口;阶段、批准和执行门禁仍由 `docs/process/lifecycle-registry.yaml` 及资产所有者定义。YAML 是权威文件,视图不能编辑、批准合同或授予执行权限。
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
scripts/contract view <资产> --kind <类型> [--profile review|task|full] [--unit <ID>] [--json]
|
|
7
|
+
scripts/contract diff <旧资产> <新资产> --kind <类型> [--json]
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
默认 `review` 展示目标、非目标、验收、取舍、风险及未决事项,隐藏机器摘要明细,不附带折叠完整 JSON。`task` 保留适用工作单元、执行目录、写边界、Skill、验证、证据和未分类约束;Slice 必须明确 `--unit`。`full` 读取完整权威内容与绑定。三种视图均显示权威身份、版本、完整 SHA-256 和检查范围。批准有效性未核验;执行仍使用原预检和派发入口。来源未提供风险或取舍时明确标记缺口,不推断为无风险。
|
|
11
|
+
|
|
12
|
+
| 类型 | 资产组 | 阅读后的权威处理入口 |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| `plan`、`spec` | Plan、Spec 范围、用户决定 | 生命周期和用户决定校验 |
|
|
15
|
+
| `product-design`、`prototype-confirmation`、`visual-baseline` | 产品设计、确认、视觉基线 | 产品设计所有者校验 |
|
|
16
|
+
| `technical-design` | 技术设计 | 技术设计校验与生命周期批准 |
|
|
17
|
+
| `api-decision`、`data-decision` | API / 数据决定 | 对应决定校验、工程契约批准 |
|
|
18
|
+
| `scaffold`、`scaffold-decision` | 脚手架合同、架构选择 | 脚手架所有者及原始用户决定 |
|
|
19
|
+
| `slice` | Slice 与工作单元 | `scripts/slice-contract inspect`、原批准与派发 |
|
|
20
|
+
| `handoff`、`backend-delivery`、`frontend-acceptance` | 战略交接、后端交付、前端接收 | 对应包 / 交付 / 接收验证器 |
|
|
21
|
+
| `approval`、`user-decision`、`context-reconciliation` | 会签、原始回复、Context 对账 | 原批准 / 用户决定 / Context 校验 |
|
|
22
|
+
|
|
23
|
+
通用适配器保留未知字段,只做可读取、适用 schema 和可识别来源绑定核对;不支持结构核验的类型会明确标记。专用资产所有者的业务校验并未被通用视图替代。Markdown 正文完整保留。API v2 审查结果从绑定的实际记录展示。摘要字段变化、数组顺序和纯字节变化均在 diff 中保留,不据此自动认定批准可沿用。
|
|
24
|
+
|
|
25
|
+
## 准备机器字段
|
|
26
|
+
|
|
27
|
+
Slice 继续使用 `scripts/slice-contract prepare`。来源的原始字节摘要、版本、别名、Skill 闭包和验证映射由现有准备器生成。共用的 `scripts/lib/contract-source.mjs` 只读取明确选择的来源;冲突报告保留 supplied / observed 和恢复动作,不根据目录猜测授权。其他资产继续使用各自的生成器,不新增项目人员要维护的表单。
|
|
28
|
+
|
|
29
|
+
API 决定的新结构使用独立 v2 schema,v1 schema 和读取兼容保留:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
scripts/api-contract-decision prepare <来源选择.yaml> --output <新草案.yaml>
|
|
33
|
+
scripts/api-contract-decision migrate <已批准v1.yaml> --version v2 --output <新候选.yaml>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
准备输入包括决定 ID / 版本、影响、评估引用、证据和业务原因;有 API 影响时再给 `openapi.id/ref/version`、`validation_record.ref`、`draft_review.ref` 和 `freeze.version/frozen_at`。摘要自动生成;来源明确但缺失时报告缺口。准备器不能产生批准状态。新路径以排他方式写入;已存在路径不能覆盖。
|
|
37
|
+
|
|
38
|
+
v2 的 `openapi` 是唯一 Draft 绑定,`draft_review` 只存 `ref/digest`,Freeze 只保存版本和时间;实际结果、阻断项与 Draft 来源从真实审查记录读取。v1/v2 在消费时归一,外部永远绑定原文件 SHA-256。迁移先验证完整 v1,旧审查额外证据合并到顶层,旧文件与旧批准保持原字节。新候选按既有差异及授权延续协议处理,不继承批准。
|
|
39
|
+
|
|
40
|
+
## 验证阶段与回退
|
|
41
|
+
|
|
42
|
+
预检、准备、派发各自建立私有验证阶段。阶段绑定根目录、用途、切片、工作单元、只读状态;只在本次操作内共享输入和纯校验结果。原始输入不可变,返回给调用者的是独立副本。相同 schema、输入和格式选项复用;外部 `$ref` 未追踪的校验不享受结果复用。Python 引擎、同步 API 和技术设计 Node 边界保留。
|
|
43
|
+
|
|
44
|
+
成功返回前复核所有登记原字节、目录枚举及不存在项。技术设计子进程自行验证批准,再返回依赖清单;父进程合并读取集合,读取矛盾、遗漏报告或异常均阻断。此清单不是批准上下文。品牌上下文不能序列化、跨仓或从只读升级;在阶段中生成的上下文结束后失效。调用者可传入 `AbortSignal`,已收到的撤回事件须中止当前操作;下一次边界始终重新读取当前批准和回复。未接入读取追踪的消费者保留原检查,不共享结果。
|
|
45
|
+
|
|
46
|
+
P1 可回用原 `slice-contract` 阅读入口;P2 可回退阶段调用与本次改动的读取适配,恢复完整重复检查;P3 可停止创建 v2,但已生成 v2 的读取能力必须保留。回退后重新验证当前来源和批准,不恢复历史通过状态。
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
| `stage.spec-architecture` | Spec / 功能架构 | 固化解决方案和功能边界。 | Spec 基线和功能边界可审查。 |
|
|
15
15
|
| `stage.product-design` | 产品设计 | 在存在产品设计影响时校准页面流和状态。 | 命中的设计门禁通过;未命中项记录 not-applicable 及原因。 |
|
|
16
16
|
| `stage.system-data-engineering` | 系统 / 数据架构与工程契约 | 固化系统、数据、工程基线和 API 契约。 | 新建后端已由用户确认 DDD / MVC 与精确 Spring Boot 版本,既有工程已核验并复用登记值;受影响工程契约冻结或记录无 API 影响;required 脚手架证据齐全。 |
|
|
17
|
-
| `stage.ticket-formalization` | Ticket 正式化 |
|
|
17
|
+
| `stage.ticket-formalization` | Ticket 正式化 | 在既有功能追踪入口下,将冻结范围正式化为垂直切片。 | 工作单元窄、依赖清晰、验收和测试 seam 可执行。 |
|
|
18
18
|
| `stage.vertical-slice-implementation` | 垂直切片实现 | 以批准合同驱动 TDD 实现和跨仓库协作。 | 允许写路径、禁止模式、证据和验证命令全部满足。 |
|
|
19
19
|
| `stage.verification-release-retrospective` | 验证 / 发布 / 复盘 | 完成 fresh verification、发布和回顾。 | 所有命中门禁通过,人工审查点已完成,checkpoint 可追溯。 |
|
|
20
20
|
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
| `artifact.implementation-repository-preparation-result` | 实现仓库准备结果 | `stage.system-data-engineering` | 后端或前端交付面进入 Ticket 正式化。 |
|
|
83
83
|
| `artifact.tactical-design` | DDD 战术设计 | `stage.system-data-engineering` | 聚合边界、状态机、一致性或持久化映射复杂到无法在系统概要设计的 Tactical DDD Check 中清楚表达。 |
|
|
84
84
|
| `artifact.spec-delta` | Spec Delta | `stage.spec-architecture` | 已有冻结 Spec 的高风险行为变化。 |
|
|
85
|
-
| `artifact.parent-ticket` | 功能父 Ticket | `stage.
|
|
85
|
+
| `artifact.parent-ticket` | 功能父 Ticket | `stage.plan` | 每个功能首次进入 Plan 或最近可信接入阶段时建立,正式化时复用;Design profile 不创建工程父 Ticket。 |
|
|
86
86
|
| `artifact.vertical-slice-ticket` | 垂直切片 Ticket | `stage.ticket-formalization` | 进入实现前。 |
|
|
87
87
|
| `artifact.slice-implementation-contract` | Slice Implementation Contract | `stage.ticket-formalization` | Agent 进入实现。 |
|
|
88
88
|
| `artifact.frontend-implementation-plan` | 前端实现还原计划 | `stage.ticket-formalization` | UI 影响切片提升 ready-for-agent 前。 |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"registry_id": "yss.lifecycle",
|
|
4
|
-
"semantic_sha256": "
|
|
4
|
+
"semantic_sha256": "09490c2a354d5452d52522cc36e04cec044faf62cb3c80c90bf95cd07963f0fb",
|
|
5
5
|
"published_ids": [
|
|
6
6
|
"artifact.architecture-review",
|
|
7
7
|
"artifact.data-architecture",
|
|
@@ -104,6 +104,7 @@
|
|
|
104
104
|
"stage.verification-release-retrospective",
|
|
105
105
|
"stage.vertical-slice-implementation",
|
|
106
106
|
"work-unit.attach-sync-integration",
|
|
107
|
+
"work-unit.backend-delivery",
|
|
107
108
|
"work-unit.code-review",
|
|
108
109
|
"work-unit.discovery-opportunity",
|
|
109
110
|
"work-unit.discovery-requirements",
|
|
@@ -62,7 +62,7 @@ stages:
|
|
|
62
62
|
exit_criteria: 新建后端已由用户确认 DDD / MVC 与精确 Spring Boot 版本,既有工程已核验并复用登记值;受影响工程契约冻结或记录无 API 影响;required 脚手架证据齐全。
|
|
63
63
|
- id: stage.ticket-formalization
|
|
64
64
|
name: Ticket 正式化
|
|
65
|
-
goal:
|
|
65
|
+
goal: 在既有功能追踪入口下,将冻结范围正式化为垂直切片。
|
|
66
66
|
exit_criteria: 工作单元窄、依赖清晰、验收和测试 seam 可执行。
|
|
67
67
|
- id: stage.vertical-slice-implementation
|
|
68
68
|
name: 垂直切片实现
|
|
@@ -309,8 +309,8 @@ artifacts:
|
|
|
309
309
|
trigger: 已有冻结 Spec 的高风险行为变化。
|
|
310
310
|
- id: artifact.parent-ticket
|
|
311
311
|
name: 功能父 Ticket
|
|
312
|
-
stage: stage.
|
|
313
|
-
trigger:
|
|
312
|
+
stage: stage.plan
|
|
313
|
+
trigger: 每个功能首次进入 Plan 或最近可信接入阶段时建立,正式化时复用;Design profile 不创建工程父 Ticket。
|
|
314
314
|
- id: artifact.vertical-slice-ticket
|
|
315
315
|
name: 垂直切片 Ticket
|
|
316
316
|
stage: stage.ticket-formalization
|
|
@@ -445,7 +445,7 @@ work_units:
|
|
|
445
445
|
name: 垂直切片 Ticket 正式化
|
|
446
446
|
scope: project-instance
|
|
447
447
|
input: 冻结 Spec、设计、契约和阻塞关系。
|
|
448
|
-
output:
|
|
448
|
+
output: 更新既有功能父 Ticket 的关联、形成垂直切片和批准的 Slice Implementation Contract。
|
|
449
449
|
completion: 切片可独立验证;生命周期复算后才能 ready-for-agent。
|
|
450
450
|
- id: work-unit.slice-implementation
|
|
451
451
|
name: 垂直切片实现
|
|
@@ -465,6 +465,12 @@ work_units:
|
|
|
465
465
|
input: 不可变候选快照、Spec、Ticket、合同和执行结果。
|
|
466
466
|
output: Standards、Spec、UI fidelity 三轴 Review 与 fresh verification。
|
|
467
467
|
completion: findings 已处理;修复后重新捕获候选并全量复审。
|
|
468
|
+
- id: work-unit.backend-delivery
|
|
469
|
+
name: 后端职责交付终点
|
|
470
|
+
scope: project-instance
|
|
471
|
+
input: plan-to-backend 职责范围、当前 Slice 批准与独立代码审查、Backend Delivery 源文件及正式导出包。
|
|
472
|
+
output: 绑定当前源、独立审查和正式包的后端终点记录及下游前端待办。
|
|
473
|
+
completion: 完整复验源文件与正式包;仅后端可交付,不能宣布全业务完成或自动发布。
|
|
468
474
|
- id: work-unit.release-and-retrospective
|
|
469
475
|
name: 发布与复盘
|
|
470
476
|
scope: project-instance
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://yss.example/schemas/api-contract-decision-v2.schema.json",
|
|
4
|
+
"title": "YSS API Contract Decision v2",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"schema_version",
|
|
9
|
+
"kind",
|
|
10
|
+
"decision_id",
|
|
11
|
+
"decision_version",
|
|
12
|
+
"status",
|
|
13
|
+
"impact",
|
|
14
|
+
"assessment_ref",
|
|
15
|
+
"assessment_digest",
|
|
16
|
+
"evidence_refs"
|
|
17
|
+
],
|
|
18
|
+
"properties": {
|
|
19
|
+
"schema_version": {
|
|
20
|
+
"const": 2
|
|
21
|
+
},
|
|
22
|
+
"kind": {
|
|
23
|
+
"const": "api-contract-decision"
|
|
24
|
+
},
|
|
25
|
+
"decision_id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"minLength": 1
|
|
28
|
+
},
|
|
29
|
+
"decision_version": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"pattern": "^v[1-9][0-9]*$"
|
|
32
|
+
},
|
|
33
|
+
"status": {
|
|
34
|
+
"enum": [
|
|
35
|
+
"draft",
|
|
36
|
+
"approved"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"impact": {
|
|
40
|
+
"enum": [
|
|
41
|
+
"required",
|
|
42
|
+
"not-applicable"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"assessment_ref": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"minLength": 1
|
|
48
|
+
},
|
|
49
|
+
"assessment_digest": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"pattern": "^sha256:[a-f0-9]{64}$"
|
|
52
|
+
},
|
|
53
|
+
"evidence_refs": {
|
|
54
|
+
"type": "array",
|
|
55
|
+
"minItems": 1,
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"minLength": 1
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"reason": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"minLength": 1
|
|
64
|
+
},
|
|
65
|
+
"openapi": {
|
|
66
|
+
"$ref": "#/$defs/versionedArtifact"
|
|
67
|
+
},
|
|
68
|
+
"validation_record": {
|
|
69
|
+
"$ref": "#/$defs/artifact"
|
|
70
|
+
},
|
|
71
|
+
"draft_review": {
|
|
72
|
+
"$ref": "#/$defs/artifact"
|
|
73
|
+
},
|
|
74
|
+
"freeze": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"additionalProperties": false,
|
|
77
|
+
"required": [
|
|
78
|
+
"version",
|
|
79
|
+
"frozen_at"
|
|
80
|
+
],
|
|
81
|
+
"properties": {
|
|
82
|
+
"version": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"pattern": "^v[1-9][0-9]*$"
|
|
85
|
+
},
|
|
86
|
+
"frozen_at": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"format": "date-time"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"allOf": [
|
|
94
|
+
{
|
|
95
|
+
"if": {
|
|
96
|
+
"properties": {
|
|
97
|
+
"impact": {
|
|
98
|
+
"const": "required"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"then": {
|
|
103
|
+
"required": [
|
|
104
|
+
"openapi",
|
|
105
|
+
"validation_record",
|
|
106
|
+
"draft_review",
|
|
107
|
+
"freeze"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"if": {
|
|
113
|
+
"properties": {
|
|
114
|
+
"impact": {
|
|
115
|
+
"const": "not-applicable"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"then": {
|
|
120
|
+
"required": [
|
|
121
|
+
"reason"
|
|
122
|
+
],
|
|
123
|
+
"not": {
|
|
124
|
+
"anyOf": [
|
|
125
|
+
{
|
|
126
|
+
"required": [
|
|
127
|
+
"openapi"
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"required": [
|
|
132
|
+
"validation_record"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"required": [
|
|
137
|
+
"draft_review"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"required": [
|
|
142
|
+
"freeze"
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
],
|
|
150
|
+
"$defs": {
|
|
151
|
+
"artifact": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"additionalProperties": false,
|
|
154
|
+
"required": [
|
|
155
|
+
"ref",
|
|
156
|
+
"digest"
|
|
157
|
+
],
|
|
158
|
+
"properties": {
|
|
159
|
+
"ref": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"minLength": 1
|
|
162
|
+
},
|
|
163
|
+
"digest": {
|
|
164
|
+
"type": "string",
|
|
165
|
+
"pattern": "^sha256:[a-f0-9]{64}$"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"versionedArtifact": {
|
|
170
|
+
"type": "object",
|
|
171
|
+
"additionalProperties": false,
|
|
172
|
+
"required": [
|
|
173
|
+
"id",
|
|
174
|
+
"ref",
|
|
175
|
+
"version",
|
|
176
|
+
"digest"
|
|
177
|
+
],
|
|
178
|
+
"properties": {
|
|
179
|
+
"id": {
|
|
180
|
+
"type": "string",
|
|
181
|
+
"minLength": 1
|
|
182
|
+
},
|
|
183
|
+
"ref": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"minLength": 1
|
|
186
|
+
},
|
|
187
|
+
"version": {
|
|
188
|
+
"type": "string",
|
|
189
|
+
"pattern": "^v[1-9][0-9]*$"
|
|
190
|
+
},
|
|
191
|
+
"digest": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"pattern": "^sha256:[a-f0-9]{64}$"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -582,6 +582,10 @@
|
|
|
582
582
|
"type": "string",
|
|
583
583
|
"minLength": 1
|
|
584
584
|
}
|
|
585
|
+
},
|
|
586
|
+
"checkpoint_ref": {
|
|
587
|
+
"type": "string",
|
|
588
|
+
"minLength": 1
|
|
585
589
|
}
|
|
586
590
|
}
|
|
587
591
|
},
|
|
@@ -656,6 +660,10 @@
|
|
|
656
660
|
"review_result_ref": {
|
|
657
661
|
"type": "string",
|
|
658
662
|
"minLength": 1
|
|
663
|
+
},
|
|
664
|
+
"checkpoint_ref": {
|
|
665
|
+
"type": "string",
|
|
666
|
+
"minLength": 1
|
|
659
667
|
}
|
|
660
668
|
},
|
|
661
669
|
"allOf": [
|