universal-dev-standards 5.1.0-beta.6 → 5.1.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.
- package/README.md +6 -0
- package/bin/uds.js +14 -0
- package/bundled/ai/standards/agent-communication-protocol.ai.yaml +34 -0
- package/bundled/ai/standards/anti-sycophancy-prompting.ai.yaml +111 -0
- package/bundled/ai/standards/capability-declaration.ai.yaml +113 -0
- package/bundled/ai/standards/circuit-breaker.ai.yaml +93 -0
- package/bundled/ai/standards/developer-memory.ai.yaml +13 -0
- package/bundled/ai/standards/dual-phase-output.ai.yaml +108 -0
- package/bundled/ai/standards/failure-source-taxonomy.ai.yaml +115 -0
- package/bundled/ai/standards/frontend-design-standards.ai.yaml +305 -0
- package/bundled/ai/standards/health-check-standards.ai.yaml +140 -0
- package/bundled/ai/standards/immutability-first.ai.yaml +112 -0
- package/bundled/ai/standards/model-selection.ai.yaml +111 -3
- package/bundled/ai/standards/packaging-standards.ai.yaml +142 -0
- package/bundled/ai/standards/recovery-recipe-registry.ai.yaml +200 -0
- package/bundled/ai/standards/retry-standards.ai.yaml +134 -0
- package/bundled/ai/standards/security-decision.ai.yaml +87 -0
- package/bundled/ai/standards/skill-standard-alignment-check.ai.yaml +119 -0
- package/bundled/ai/standards/standard-admission-criteria.ai.yaml +107 -0
- package/bundled/ai/standards/standard-lifecycle-management.ai.yaml +144 -0
- package/bundled/ai/standards/timeout-standards.ai.yaml +104 -0
- package/bundled/ai/standards/token-budget.ai.yaml +108 -0
- package/bundled/ai/standards/translation-lifecycle-standards.ai.yaml +145 -0
- package/bundled/core/anti-sycophancy-prompting.md +184 -0
- package/bundled/core/capability-declaration.md +59 -0
- package/bundled/core/circuit-breaker.md +58 -0
- package/bundled/core/developer-memory.md +29 -1
- package/bundled/core/dual-phase-output.md +56 -0
- package/bundled/core/failure-source-taxonomy.md +72 -0
- package/bundled/core/frontend-design-standards.md +474 -0
- package/bundled/core/health-check-standards.md +72 -0
- package/bundled/core/immutability-first.md +105 -0
- package/bundled/core/model-selection.md +80 -0
- package/bundled/core/packaging-standards.md +216 -0
- package/bundled/core/recovery-recipe-registry.md +69 -0
- package/bundled/core/retry-standards.md +62 -0
- package/bundled/core/security-decision.md +65 -0
- package/bundled/core/skill-standard-alignment-check.md +79 -0
- package/bundled/core/standard-admission-criteria.md +84 -0
- package/bundled/core/standard-lifecycle-management.md +94 -0
- package/bundled/core/timeout-standards.md +63 -0
- package/bundled/core/token-budget.md +58 -0
- package/bundled/core/translation-lifecycle-standards.md +162 -0
- package/bundled/locales/zh-CN/CHANGELOG.md +51 -3
- package/bundled/locales/zh-CN/README.md +1 -1
- package/bundled/locales/zh-CN/core/anti-hallucination.md +22 -3
- package/bundled/locales/zh-CN/core/anti-sycophancy-prompting.md +192 -0
- package/bundled/locales/zh-CN/core/capability-declaration.md +123 -0
- package/bundled/locales/zh-CN/core/circuit-breaker.md +106 -0
- package/bundled/locales/zh-CN/core/dual-phase-output.md +103 -0
- package/bundled/locales/zh-CN/core/failure-source-taxonomy.md +99 -0
- package/bundled/locales/zh-CN/core/frontend-design-standards.md +289 -0
- package/bundled/locales/zh-CN/core/health-check-standards.md +144 -0
- package/bundled/locales/zh-CN/core/immutability-first.md +96 -0
- package/bundled/locales/zh-CN/core/packaging-standards.md +224 -0
- package/bundled/locales/zh-CN/core/recovery-recipe-registry.md +146 -0
- package/bundled/locales/zh-CN/core/retry-standards.md +131 -0
- package/bundled/locales/zh-CN/core/security-decision.md +104 -0
- package/bundled/locales/zh-CN/core/skill-standard-alignment-check.md +112 -0
- package/bundled/locales/zh-CN/core/standard-admission-criteria.md +104 -0
- package/bundled/locales/zh-CN/core/standard-lifecycle-management.md +116 -0
- package/bundled/locales/zh-CN/core/timeout-standards.md +117 -0
- package/bundled/locales/zh-CN/core/token-budget.md +108 -0
- package/bundled/locales/zh-CN/core/translation-lifecycle-standards.md +159 -0
- package/bundled/locales/zh-TW/CHANGELOG.md +51 -3
- package/bundled/locales/zh-TW/README.md +1 -1
- package/bundled/locales/zh-TW/core/anti-sycophancy-prompting.md +192 -0
- package/bundled/locales/zh-TW/core/capability-declaration.md +111 -0
- package/bundled/locales/zh-TW/core/circuit-breaker.md +111 -0
- package/bundled/locales/zh-TW/core/dual-phase-output.md +132 -0
- package/bundled/locales/zh-TW/core/failure-source-taxonomy.md +146 -0
- package/bundled/locales/zh-TW/core/frontend-design-standards.md +460 -0
- package/bundled/locales/zh-TW/core/health-check-standards.md +144 -0
- package/bundled/locales/zh-TW/core/immutability-first.md +159 -0
- package/bundled/locales/zh-TW/core/packaging-standards.md +224 -0
- package/bundled/locales/zh-TW/core/recovery-recipe-registry.md +146 -0
- package/bundled/locales/zh-TW/core/retry-standards.md +140 -0
- package/bundled/locales/zh-TW/core/security-decision.md +120 -0
- package/bundled/locales/zh-TW/core/skill-standard-alignment-check.md +112 -0
- package/bundled/locales/zh-TW/core/standard-admission-criteria.md +104 -0
- package/bundled/locales/zh-TW/core/standard-lifecycle-management.md +116 -0
- package/bundled/locales/zh-TW/core/timeout-standards.md +117 -0
- package/bundled/locales/zh-TW/core/token-budget.md +143 -0
- package/bundled/locales/zh-TW/core/translation-lifecycle-standards.md +159 -0
- package/bundled/skills/e2e-assistant/SKILL.md +19 -5
- package/bundled/skills/testing-guide/SKILL.md +5 -0
- package/bundled/skills/testing-guide/test-skeleton-templates.md +316 -0
- package/package.json +2 -1
- package/src/commands/check.js +6 -0
- package/src/commands/config.js +9 -0
- package/src/commands/init.js +97 -46
- package/src/commands/mcp.js +26 -0
- package/src/commands/run-intent.js +66 -0
- package/src/commands/update.js +41 -4
- package/src/core/command-router.js +85 -0
- package/src/core/project-config.js +91 -0
- package/src/flows/init-flow.js +6 -1
- package/src/i18n/messages.js +6 -6
- package/src/mcp/__tests__/server.test.js +251 -0
- package/src/mcp/server.js +352 -0
- package/src/prompts/init.js +157 -1
- package/src/reconciler/actual-state-scanner.js +24 -0
- package/src/uninstallers/hook-uninstaller.js +32 -1
- package/src/utils/detect-self-adoption.js +173 -0
- package/src/utils/e2e-analyzer.js +88 -5
- package/src/utils/e2e-detector.js +73 -1
- package/src/utils/integration-generator.js +22 -3
- package/standards-registry.json +203 -4
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Packaging Standards (AI-Optimized v1)
|
|
2
|
+
# Source: core/packaging-standards.md
|
|
3
|
+
|
|
4
|
+
standard:
|
|
5
|
+
id: packaging
|
|
6
|
+
name: Packaging Standards
|
|
7
|
+
description: Recipe-based packaging framework for user projects using UDS/DevAP toolchain
|
|
8
|
+
guidelines:
|
|
9
|
+
- "Recipe-based: use built-in or custom recipes for each packaging target"
|
|
10
|
+
- "Declarative: declare targets in .devap/packaging.yaml"
|
|
11
|
+
- "Customizable: override config, inject hooks, or write custom recipes"
|
|
12
|
+
- "Pipeline-integrated: packaging runs between Review and Deploy in VibeOps"
|
|
13
|
+
|
|
14
|
+
meta:
|
|
15
|
+
version: "1.0.0"
|
|
16
|
+
updated: "2026-04-15"
|
|
17
|
+
source: core/packaging-standards.md
|
|
18
|
+
|
|
19
|
+
principles:
|
|
20
|
+
core:
|
|
21
|
+
- recipe_based: "Every packaging target references a named Recipe; no ad-hoc scripts in pipeline YAML"
|
|
22
|
+
- declarative_targets: "Projects declare targets in .devap/packaging.yaml; DevAP resolves and executes"
|
|
23
|
+
- customizable: "Four customization layers allow config overrides, hook injection, custom Recipes, and escape hatches"
|
|
24
|
+
- pipeline_integrated: "Packaging runs as a named stage between Review and Deploy"
|
|
25
|
+
|
|
26
|
+
recipe_structure:
|
|
27
|
+
required_fields: [name, steps]
|
|
28
|
+
optional_fields: [description, requires, config, hooks]
|
|
29
|
+
step_fields:
|
|
30
|
+
required: [run]
|
|
31
|
+
optional: [description]
|
|
32
|
+
hook_points: [preBuild, postBuild, prePublish, postPublish]
|
|
33
|
+
config_variables:
|
|
34
|
+
- name: "{registry}"
|
|
35
|
+
source: "config.registry"
|
|
36
|
+
- name: "{name}"
|
|
37
|
+
source: "package.json#name or config.name"
|
|
38
|
+
- name: "{version}"
|
|
39
|
+
source: "package.json#version or config.version"
|
|
40
|
+
- name: "{platforms}"
|
|
41
|
+
source: "config.platforms"
|
|
42
|
+
- name: "{output_dir}"
|
|
43
|
+
source: "config.output_dir"
|
|
44
|
+
|
|
45
|
+
built_in_recipes:
|
|
46
|
+
npm_library:
|
|
47
|
+
file: recipes/npm-library.yaml
|
|
48
|
+
use_case: "npm package without a binary entry point"
|
|
49
|
+
requires: [package.json, tsconfig.json]
|
|
50
|
+
steps: [npm run build, npm pack, npm publish]
|
|
51
|
+
default_config:
|
|
52
|
+
registry: https://registry.npmjs.org
|
|
53
|
+
access: public
|
|
54
|
+
tag: latest
|
|
55
|
+
npm_cli:
|
|
56
|
+
file: recipes/npm-cli.yaml
|
|
57
|
+
use_case: "npm package with bin field (CLI tool)"
|
|
58
|
+
requires: [package.json, tsconfig.json]
|
|
59
|
+
steps: [npm run build, verify_bin_field, npm pack, npm publish]
|
|
60
|
+
default_config:
|
|
61
|
+
registry: https://registry.npmjs.org
|
|
62
|
+
access: public
|
|
63
|
+
tag: latest
|
|
64
|
+
docker_service:
|
|
65
|
+
file: recipes/docker-service.yaml
|
|
66
|
+
use_case: "Docker container image build and push"
|
|
67
|
+
requires: [Dockerfile]
|
|
68
|
+
steps: [docker buildx build, docker push, docker tag latest, docker push latest]
|
|
69
|
+
default_config:
|
|
70
|
+
registry: ghcr.io
|
|
71
|
+
platforms: linux/amd64,linux/arm64
|
|
72
|
+
push_latest: true
|
|
73
|
+
windows_installer:
|
|
74
|
+
file: recipes/windows-installer.yaml
|
|
75
|
+
use_case: "Windows installer (.msi or .exe) via user-provided build script"
|
|
76
|
+
requires: [package.json, "packaging/windows-build.sh"]
|
|
77
|
+
steps: [npm run build, bash packaging/windows-build.sh]
|
|
78
|
+
default_config:
|
|
79
|
+
output_dir: dist/installers
|
|
80
|
+
format: msi
|
|
81
|
+
|
|
82
|
+
customization_layers:
|
|
83
|
+
L1:
|
|
84
|
+
name: config_override
|
|
85
|
+
mechanism: "config: block in .devap/packaging.yaml"
|
|
86
|
+
when: "Change default values (registry URL, tag, output dir)"
|
|
87
|
+
L2:
|
|
88
|
+
name: hook_injection
|
|
89
|
+
mechanism: "hooks: block in .devap/packaging.yaml"
|
|
90
|
+
when: "Run extra commands before/after build or publish"
|
|
91
|
+
L3:
|
|
92
|
+
name: custom_recipe
|
|
93
|
+
mechanism: "New .yaml file in project's .devap/recipes/"
|
|
94
|
+
when: "Entirely different build process; built-ins don't apply"
|
|
95
|
+
L4:
|
|
96
|
+
name: escape_hatch
|
|
97
|
+
mechanism: "script: key replacing recipe: in target definition"
|
|
98
|
+
when: "Raw shell script when no Recipe abstraction is suitable"
|
|
99
|
+
|
|
100
|
+
acceptance_criteria:
|
|
101
|
+
success_conditions:
|
|
102
|
+
- condition: "All requires files exist"
|
|
103
|
+
threshold: "100%"
|
|
104
|
+
timing: "Before any step runs"
|
|
105
|
+
- condition: "All steps exit with code 0"
|
|
106
|
+
threshold: "100%"
|
|
107
|
+
timing: "Per step"
|
|
108
|
+
- condition: "postBuild artifact exists"
|
|
109
|
+
threshold: "Present in expected path"
|
|
110
|
+
timing: "After build step"
|
|
111
|
+
- condition: "Hook commands exit with code 0"
|
|
112
|
+
threshold: "100%"
|
|
113
|
+
timing: "Per hook"
|
|
114
|
+
- condition: "Published artifact is retrievable"
|
|
115
|
+
threshold: "HTTP 200 / registry query succeeds"
|
|
116
|
+
timing: "Post-publish smoke check"
|
|
117
|
+
failure_handling:
|
|
118
|
+
missing_requires: {action: "fail immediately", retry: false}
|
|
119
|
+
step_nonzero_exit: {action: "fail immediately, run postBuild hook if defined", retry: "configurable"}
|
|
120
|
+
hook_nonzero_exit: {action: "fail immediately", retry: false}
|
|
121
|
+
publish_unreachable: {action: "retry with exponential backoff", retry: true, max_retries: 3}
|
|
122
|
+
|
|
123
|
+
recipe_selection_guide:
|
|
124
|
+
decision_tree:
|
|
125
|
+
is_npm_package:
|
|
126
|
+
yes:
|
|
127
|
+
has_bin_field:
|
|
128
|
+
yes: npm-cli
|
|
129
|
+
no: npm-library
|
|
130
|
+
no:
|
|
131
|
+
is_container_image:
|
|
132
|
+
yes: docker-service
|
|
133
|
+
no:
|
|
134
|
+
is_windows_installer:
|
|
135
|
+
yes: windows-installer
|
|
136
|
+
no: custom-recipe-required
|
|
137
|
+
|
|
138
|
+
physical_spec:
|
|
139
|
+
type: custom_script
|
|
140
|
+
validator:
|
|
141
|
+
command: "test -f .devap/packaging.yaml"
|
|
142
|
+
rule: "packaging_config_declared"
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Recovery Recipe Registry Standard - AI Optimized
|
|
2
|
+
# Source: XSPEC-046 (claw-code ROADMAP Phase 3 Recovery Recipes, DEC-035)
|
|
3
|
+
|
|
4
|
+
standard:
|
|
5
|
+
id: recovery-recipe-registry
|
|
6
|
+
name: Recovery Recipe Registry Standard
|
|
7
|
+
description: 恢復食譜註冊表 — 將分散的恢復邏輯統一為 YAML 可配置的 Recipe,以 failureSource 為匹配鍵
|
|
8
|
+
|
|
9
|
+
meta:
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
updated: "2026-04-16"
|
|
12
|
+
source: XSPEC-046
|
|
13
|
+
description: >
|
|
14
|
+
各模組(Fix Loop、Circuit Breaker、Guardian 自動修復、Staging 重試)的恢復邏輯
|
|
15
|
+
統一為可外部化的 Recovery Recipe 格式。每個 Recipe 透過 failureSource(XSPEC-045)
|
|
16
|
+
匹配觸發條件,選擇對應的恢復策略,並定義升級路徑(escalation)。
|
|
17
|
+
無匹配 Recipe 時 fallback 到現有行為(向後相容)。
|
|
18
|
+
scope: universal
|
|
19
|
+
borrowed_from: "ultraworkers/claw-code ROADMAP Phase 3 Recovery Recipes (adapted to YAML format)"
|
|
20
|
+
depends_on: "failure-source-taxonomy.ai.yaml (XSPEC-045)"
|
|
21
|
+
|
|
22
|
+
guidelines:
|
|
23
|
+
- "每個 Recovery Recipe 必須有唯一 ID(RR-NNN 格式)"
|
|
24
|
+
- "match.failure_source 必須是 failure-source-taxonomy 中定義的 8 類之一"
|
|
25
|
+
- "escalation.on_exhaust 必須定義,不得無限循環(如 escalation 指向自身)"
|
|
26
|
+
- "無匹配 Recipe 時,系統必須 fallback 到現有預設行為(不得拋出錯誤)"
|
|
27
|
+
- "使用者自訂 Recipe 優先於內建 Recipe(同 failureSource 時,使用者配置的先匹配)"
|
|
28
|
+
- "Recipe config 格式錯誤時 fallback 到策略預設值(不中斷執行)"
|
|
29
|
+
|
|
30
|
+
strategies:
|
|
31
|
+
fix_loop:
|
|
32
|
+
description: "注入結構化錯誤回饋,重試任務(現有 Fix Loop)"
|
|
33
|
+
config:
|
|
34
|
+
max_attempts:
|
|
35
|
+
type: number
|
|
36
|
+
default: 3
|
|
37
|
+
budget_usd:
|
|
38
|
+
type: number
|
|
39
|
+
default: 0.50
|
|
40
|
+
best_for: [compilation, test_failure]
|
|
41
|
+
|
|
42
|
+
circuit_breaker:
|
|
43
|
+
description: "三態斷路器保護(XSPEC-036),連續失敗後開路避免雪崩"
|
|
44
|
+
config:
|
|
45
|
+
failure_threshold:
|
|
46
|
+
type: number
|
|
47
|
+
default: 3
|
|
48
|
+
cooldown_ms:
|
|
49
|
+
type: number
|
|
50
|
+
default: 30000
|
|
51
|
+
best_for: [tool_failure, prompt_delivery]
|
|
52
|
+
|
|
53
|
+
rebase_and_retry:
|
|
54
|
+
description: "先執行 git rebase 同步基底分支,再重試任務/迭代"
|
|
55
|
+
config:
|
|
56
|
+
max_attempts:
|
|
57
|
+
type: number
|
|
58
|
+
default: 1
|
|
59
|
+
base_branch:
|
|
60
|
+
type: string
|
|
61
|
+
default: "main"
|
|
62
|
+
best_for: [branch_divergence]
|
|
63
|
+
requires: "XSPEC-047 Branch Drift Detection"
|
|
64
|
+
|
|
65
|
+
model_switch:
|
|
66
|
+
description: "切換至備用模型後重試"
|
|
67
|
+
config:
|
|
68
|
+
fallback_models:
|
|
69
|
+
type: "string[]"
|
|
70
|
+
description: "按優先順序的備用模型列表"
|
|
71
|
+
max_attempts:
|
|
72
|
+
type: number
|
|
73
|
+
default: 2
|
|
74
|
+
best_for: [model_degradation, prompt_delivery]
|
|
75
|
+
|
|
76
|
+
degraded_mode:
|
|
77
|
+
description: "以降級模式繼續執行(如:跳過品質驗證、以部分結果繼續)"
|
|
78
|
+
config: {}
|
|
79
|
+
result_status: "done_with_concerns"
|
|
80
|
+
best_for: [resource_exhaustion, model_degradation]
|
|
81
|
+
|
|
82
|
+
human_checkpoint:
|
|
83
|
+
description: "暫停執行,等待人工介入(提供失敗細節供判斷)"
|
|
84
|
+
config:
|
|
85
|
+
message:
|
|
86
|
+
type: string
|
|
87
|
+
description: "通知使用者的訊息"
|
|
88
|
+
best_for: [policy_violation, branch_divergence]
|
|
89
|
+
note: "所有其他策略的最終升級路徑"
|
|
90
|
+
|
|
91
|
+
recipe_schema:
|
|
92
|
+
description: "Recovery Recipe YAML 格式定義"
|
|
93
|
+
fields:
|
|
94
|
+
id:
|
|
95
|
+
type: string
|
|
96
|
+
pattern: "RR-[0-9]+"
|
|
97
|
+
required: true
|
|
98
|
+
name:
|
|
99
|
+
type: string
|
|
100
|
+
required: true
|
|
101
|
+
match:
|
|
102
|
+
required: true
|
|
103
|
+
fields:
|
|
104
|
+
failure_source:
|
|
105
|
+
type: FailureSource
|
|
106
|
+
required: true
|
|
107
|
+
severity:
|
|
108
|
+
type: "string[]"
|
|
109
|
+
values: [critical, high, medium, low]
|
|
110
|
+
description: "空或省略表示匹配所有 severity"
|
|
111
|
+
strategy:
|
|
112
|
+
type: RecoveryStrategy
|
|
113
|
+
required: true
|
|
114
|
+
config:
|
|
115
|
+
type: object
|
|
116
|
+
description: "策略特定配置,覆蓋策略預設值"
|
|
117
|
+
escalation:
|
|
118
|
+
required: true
|
|
119
|
+
fields:
|
|
120
|
+
on_exhaust:
|
|
121
|
+
type: RecoveryStrategy
|
|
122
|
+
required: true
|
|
123
|
+
description: "嘗試耗盡後的下一步策略(不得指向自身)"
|
|
124
|
+
message:
|
|
125
|
+
type: string
|
|
126
|
+
description: "升級時的通知訊息"
|
|
127
|
+
|
|
128
|
+
default_recipes:
|
|
129
|
+
description: "安裝時隨附的 5 個預設 Recipe"
|
|
130
|
+
recipes:
|
|
131
|
+
- id: RR-001
|
|
132
|
+
name: "Fix Loop for Compilation Errors"
|
|
133
|
+
match: { failure_source: compilation }
|
|
134
|
+
strategy: fix_loop
|
|
135
|
+
config: { max_attempts: 3, budget_usd: 0.50 }
|
|
136
|
+
escalation: { on_exhaust: human_checkpoint }
|
|
137
|
+
|
|
138
|
+
- id: RR-002
|
|
139
|
+
name: "Fix Loop for Test Failures"
|
|
140
|
+
match: { failure_source: test_failure }
|
|
141
|
+
strategy: fix_loop
|
|
142
|
+
config: { max_attempts: 3, budget_usd: 0.50 }
|
|
143
|
+
escalation: { on_exhaust: human_checkpoint }
|
|
144
|
+
|
|
145
|
+
- id: RR-003
|
|
146
|
+
name: "Model Switch for Degradation"
|
|
147
|
+
match: { failure_source: model_degradation }
|
|
148
|
+
strategy: model_switch
|
|
149
|
+
config: { max_attempts: 2 }
|
|
150
|
+
escalation: { on_exhaust: degraded_mode }
|
|
151
|
+
|
|
152
|
+
- id: RR-004
|
|
153
|
+
name: "Rebase for Branch Divergence"
|
|
154
|
+
match: { failure_source: branch_divergence }
|
|
155
|
+
strategy: rebase_and_retry
|
|
156
|
+
config: { max_attempts: 1 }
|
|
157
|
+
escalation: { on_exhaust: human_checkpoint, message: "Rebase 衝突,需人工解決" }
|
|
158
|
+
|
|
159
|
+
- id: RR-005
|
|
160
|
+
name: "Degraded Mode for Resource Exhaustion"
|
|
161
|
+
match: { failure_source: resource_exhaustion }
|
|
162
|
+
strategy: degraded_mode
|
|
163
|
+
escalation: { on_exhaust: human_checkpoint }
|
|
164
|
+
|
|
165
|
+
types:
|
|
166
|
+
RecoveryStrategy:
|
|
167
|
+
description: "6 個內建恢復策略"
|
|
168
|
+
values:
|
|
169
|
+
- fix_loop
|
|
170
|
+
- circuit_breaker
|
|
171
|
+
- rebase_and_retry
|
|
172
|
+
- model_switch
|
|
173
|
+
- degraded_mode
|
|
174
|
+
- human_checkpoint
|
|
175
|
+
|
|
176
|
+
RecoveryRecipe:
|
|
177
|
+
description: "恢復食譜定義"
|
|
178
|
+
fields:
|
|
179
|
+
id: "string # RR-NNN 格式"
|
|
180
|
+
name: string
|
|
181
|
+
match:
|
|
182
|
+
failure_source: FailureSource
|
|
183
|
+
severity: "string[] (optional)"
|
|
184
|
+
strategy: RecoveryStrategy
|
|
185
|
+
config: "object (optional)"
|
|
186
|
+
escalation:
|
|
187
|
+
on_exhaust: RecoveryStrategy
|
|
188
|
+
message: "string (optional)"
|
|
189
|
+
|
|
190
|
+
integration_points:
|
|
191
|
+
devap:
|
|
192
|
+
files:
|
|
193
|
+
- "packages/core/src/types.ts — RecoveryRecipe / RecoveryStrategy type"
|
|
194
|
+
- "packages/core/src/recovery-registry.ts — Registry 實作與預設 recipe"
|
|
195
|
+
- "packages/core/src/orchestrator.ts — fix loop 前查詢 Registry"
|
|
196
|
+
vibeops:
|
|
197
|
+
files:
|
|
198
|
+
- "src/types/index.ts — 獨立定義 RecoveryRecipe(AGPL 隔離)"
|
|
199
|
+
- "src/runner/recovery-registry.ts — 獨立實作"
|
|
200
|
+
- "recovery-recipes.yaml — 預設 recipe 配置"
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Retry Standards - AI Optimized
|
|
2
|
+
# Source: XSPEC-067 (DEC-043 Wave 1 Reliability Pack)
|
|
3
|
+
|
|
4
|
+
standard:
|
|
5
|
+
id: retry-standards
|
|
6
|
+
name: Retry Standards
|
|
7
|
+
description: 重試策略標準 — 指數退避加抖動、重試上限、依 failure-source 分類的重試規則
|
|
8
|
+
|
|
9
|
+
meta:
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
updated: "2026-04-17"
|
|
12
|
+
status: trial
|
|
13
|
+
since: "2026-04-17"
|
|
14
|
+
expires: "2026-10-17"
|
|
15
|
+
source: XSPEC-067
|
|
16
|
+
borrowed_from: DEC-043
|
|
17
|
+
description: >
|
|
18
|
+
延伸既有 circuit-breaker 與 failure-source-taxonomy,補齊 retry 層的標準化規則。
|
|
19
|
+
避免各元件各自實作重試造成行為不一致(無上限重試、無 jitter 導致 thundering herd)。
|
|
20
|
+
與 failure-source-taxonomy 深度整合:依失敗類型決定是否重試、重試幾次、退避多久。
|
|
21
|
+
scope: universal
|
|
22
|
+
industry_reference: "Netflix Hystrix retry, Google SRE Book Ch.22, AWS Architecture Blog - exponential backoff and jitter"
|
|
23
|
+
|
|
24
|
+
guidelines:
|
|
25
|
+
- "所有重試邏輯必須使用 exponential + jitter,禁止固定間隔或無 jitter 的純指數"
|
|
26
|
+
- "重試必須有明確上限(max_attempts),禁止無限重試"
|
|
27
|
+
- "重試決策必須先參考 failure-source-taxonomy 分類,fail-fast 類別不得重試"
|
|
28
|
+
- "重試必須與 circuit-breaker 整合:OPEN 狀態下不得重試,直接 fail-fast"
|
|
29
|
+
- "每次重試都應透過遙測事件上報(retry_attempted / retry_exhausted),方便觀察無效重試"
|
|
30
|
+
|
|
31
|
+
backoff_formula:
|
|
32
|
+
name: "Exponential with full jitter"
|
|
33
|
+
formula: "wait_ms = min(cap_ms, base_ms * 2^attempt) * (0.5 + random() * 0.5)"
|
|
34
|
+
defaults:
|
|
35
|
+
base_ms: 100
|
|
36
|
+
cap_ms: 30000
|
|
37
|
+
max_attempts: 5
|
|
38
|
+
jitter_ratio: 0.5
|
|
39
|
+
rationale:
|
|
40
|
+
- "Exponential 隨重試次數指數退避,避免短時間大量請求"
|
|
41
|
+
- "Jitter ±50% 避免 thundering herd(所有 client 同時重試)"
|
|
42
|
+
- "cap_ms=30s 避免超長等待,與典型 request timeout 對齊"
|
|
43
|
+
|
|
44
|
+
failure_source_rules:
|
|
45
|
+
description: "依 failure-source-taxonomy 的 8 類 failureSource 決定重試策略"
|
|
46
|
+
rules:
|
|
47
|
+
transient_network:
|
|
48
|
+
retry: true
|
|
49
|
+
max_attempts: 5
|
|
50
|
+
base_ms: 100
|
|
51
|
+
note: "短暫網路抖動,指數退避通常可恢復"
|
|
52
|
+
rate_limit:
|
|
53
|
+
retry: true
|
|
54
|
+
max_attempts: 3
|
|
55
|
+
base_ms: 1000
|
|
56
|
+
note: "底數加大(1s)預留額度恢復時間;若 API 回傳 Retry-After 則優先採用"
|
|
57
|
+
upstream_unavailable:
|
|
58
|
+
retry: true
|
|
59
|
+
max_attempts: 3
|
|
60
|
+
base_ms: 500
|
|
61
|
+
note: "重試前先查 circuit-breaker;連續失敗觸發 OPEN 狀態"
|
|
62
|
+
tool_failure:
|
|
63
|
+
retry: true
|
|
64
|
+
max_attempts: 2
|
|
65
|
+
base_ms: 200
|
|
66
|
+
note: "工具層失敗通常非 transient,僅給 2 次機會"
|
|
67
|
+
prompt_delivery:
|
|
68
|
+
retry: true
|
|
69
|
+
max_attempts: 2
|
|
70
|
+
base_ms: 100
|
|
71
|
+
note: "多半是短暫 API 問題;超過 2 次改走 model_switch"
|
|
72
|
+
authentication:
|
|
73
|
+
retry: false
|
|
74
|
+
note: "fail-fast;憑證錯誤重試不會變對,只會浪費 quota"
|
|
75
|
+
validation:
|
|
76
|
+
retry: false
|
|
77
|
+
note: "fail-fast;input 錯誤重試結果不變"
|
|
78
|
+
policy_violation:
|
|
79
|
+
retry: false
|
|
80
|
+
note: "fail-fast;安全決策禁止繞過(對齊 security-decision 標準)"
|
|
81
|
+
quota_exhausted:
|
|
82
|
+
retry: false
|
|
83
|
+
note: "fail-fast;等 budget reset 或升級 tier,不應在同 session 內重試"
|
|
84
|
+
|
|
85
|
+
circuit_breaker_integration:
|
|
86
|
+
rule_1: "每次重試前檢查對應 breaker 的 state;若為 OPEN 立即回傳 CircuitOpenError,不消耗 max_attempts"
|
|
87
|
+
rule_2: "重試全部耗盡(retry_exhausted)計入 breaker 的 failure count"
|
|
88
|
+
rule_3: "HALF_OPEN 狀態下僅允許 1 次探針重試,不套用 max_attempts"
|
|
89
|
+
|
|
90
|
+
telemetry_events:
|
|
91
|
+
retry_attempted:
|
|
92
|
+
fields:
|
|
93
|
+
operation: string
|
|
94
|
+
attempt: number
|
|
95
|
+
max_attempts: number
|
|
96
|
+
failure_source: "FailureSource | null"
|
|
97
|
+
wait_ms: number
|
|
98
|
+
when: "每次重試前上傳(第 0 次原始呼叫不算)"
|
|
99
|
+
retry_exhausted:
|
|
100
|
+
fields:
|
|
101
|
+
operation: string
|
|
102
|
+
attempts: number
|
|
103
|
+
final_failure_source: FailureSource
|
|
104
|
+
when: "達到 max_attempts 仍失敗時上傳"
|
|
105
|
+
|
|
106
|
+
scenarios:
|
|
107
|
+
scenario_1_exponential_backoff:
|
|
108
|
+
given: "呼叫下游 API 失敗,failure_source=transient_network,已重試 2 次"
|
|
109
|
+
when: "計算第 3 次重試的等待時間"
|
|
110
|
+
then: "wait_ms = min(30000, 100 * 2^3) * (0.5 + random * 0.5) = 800 * [0.5..1.0] = 400~800ms"
|
|
111
|
+
note: "驗證退避公式正確套用 jitter"
|
|
112
|
+
|
|
113
|
+
scenario_2_fail_fast_on_auth:
|
|
114
|
+
given: "API 回傳 401 Unauthorized,偵測元件標記 failure_source=authentication"
|
|
115
|
+
when: "決定是否重試"
|
|
116
|
+
then: "立即 fail-fast,不進入退避,不計入 circuit-breaker failure count"
|
|
117
|
+
note: "authentication 類別 retry=false,避免浪費 quota"
|
|
118
|
+
|
|
119
|
+
scenario_3_circuit_open_skip:
|
|
120
|
+
given: "對應 breaker 為 OPEN 狀態,cooldown 剩 15s"
|
|
121
|
+
when: "發起重試"
|
|
122
|
+
then: "立即回傳 CircuitOpenError,不發起請求,不消耗 max_attempts"
|
|
123
|
+
note: "與 circuit-breaker 整合:OPEN 狀態下 fail-fast"
|
|
124
|
+
|
|
125
|
+
error_codes:
|
|
126
|
+
RETRY-001: "RETRY_EXHAUSTED — 達到 max_attempts 仍失敗"
|
|
127
|
+
RETRY-002: "RETRY_SKIPPED_NON_RETRYABLE — failure_source 屬 fail-fast 類別"
|
|
128
|
+
RETRY-003: "RETRY_SKIPPED_CIRCUIT_OPEN — breaker OPEN 狀態下跳過重試"
|
|
129
|
+
|
|
130
|
+
integration_points:
|
|
131
|
+
- "circuit-breaker.ai.yaml — OPEN 狀態下禁止重試,retry_exhausted 計入 failure count"
|
|
132
|
+
- "failure-source-taxonomy.ai.yaml — 依 failureSource 決定 retry/fail-fast"
|
|
133
|
+
- "timeout-standards.ai.yaml — 單次重試 timeout 不得超過剩餘 deadline"
|
|
134
|
+
- "recovery-recipe-registry.ai.yaml — retry 耗盡後交棒給 recovery recipe"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Security Decision Standard - AI Optimized
|
|
2
|
+
# Source: XSPEC-037 (claude-code-book Ch.4 deny>ask>allow pipeline)
|
|
3
|
+
|
|
4
|
+
standard:
|
|
5
|
+
id: security-decision
|
|
6
|
+
name: Security Decision Standard
|
|
7
|
+
description: 安全決策鐵律 — deny > ask > allow 三態優先級仲裁
|
|
8
|
+
|
|
9
|
+
meta:
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
updated: "2026-04-15"
|
|
12
|
+
source: XSPEC-037
|
|
13
|
+
description: >
|
|
14
|
+
多來源安全決策的仲裁規則:deny 永遠勝出,無論來源優先級。
|
|
15
|
+
三態語義(deny / ask / allow)比布林值更精確,支援「需使用者確認」的中間狀態。
|
|
16
|
+
scope: universal
|
|
17
|
+
borrowed_from: "claude-code-book Ch.4 four-stage permission pipeline, deny>ask>allow rule"
|
|
18
|
+
|
|
19
|
+
guidelines:
|
|
20
|
+
- "所有安全決策仲裁必須遵循 deny > ask > allow 優先級,無例外"
|
|
21
|
+
- "deny 的勝出不受規則來源優先級影響(低優先級的 deny 可以覆蓋高優先級的 allow)"
|
|
22
|
+
- "ask 狀態在 CI / 無人值守模式下必須等同 deny(無法互動確認)"
|
|
23
|
+
- "決策結果必須記錄來源規則列表(可追蹤性)"
|
|
24
|
+
- "projectSettings 來源的安全提升操作必須被拒絕(信任半徑保護)"
|
|
25
|
+
|
|
26
|
+
decision_types:
|
|
27
|
+
deny:
|
|
28
|
+
description: "明確拒絕,立即阻止操作"
|
|
29
|
+
priority: 1
|
|
30
|
+
notes: "任何來源的 deny 都使最終決策為 deny"
|
|
31
|
+
ask:
|
|
32
|
+
description: "需要使用者確認才能繼續"
|
|
33
|
+
priority: 2
|
|
34
|
+
ci_mode: "等同 deny(無法互動)"
|
|
35
|
+
allow:
|
|
36
|
+
description: "允許操作繼續"
|
|
37
|
+
priority: 3
|
|
38
|
+
notes: "所有規則都為 allow 時才能執行"
|
|
39
|
+
|
|
40
|
+
arbitration_rule:
|
|
41
|
+
logic: "deny 優先 → ask 次之 → 全 allow 才允許"
|
|
42
|
+
pseudocode: |
|
|
43
|
+
function arbitrate(rules: SecurityDecisionRule[]): SecurityDecision {
|
|
44
|
+
if (rules.some(r => r.decision === "deny")) return "deny";
|
|
45
|
+
if (rules.some(r => r.decision === "ask")) return "ask";
|
|
46
|
+
return "allow";
|
|
47
|
+
}
|
|
48
|
+
invariant: "deny 勝出不受 source 優先級影響"
|
|
49
|
+
|
|
50
|
+
interface:
|
|
51
|
+
SecurityDecision:
|
|
52
|
+
values: [deny, ask, allow]
|
|
53
|
+
|
|
54
|
+
SecurityDecisionRule:
|
|
55
|
+
fields:
|
|
56
|
+
source: string # 規則來源(user / project / policy / builtin)
|
|
57
|
+
decision: SecurityDecision
|
|
58
|
+
reason: string # 可選,用於日誌和使用者說明
|
|
59
|
+
|
|
60
|
+
SecurityDecisionResult:
|
|
61
|
+
fields:
|
|
62
|
+
final_decision: SecurityDecision
|
|
63
|
+
winning_rules: SecurityDecisionRule[] # 觸發最終決策的規則
|
|
64
|
+
all_rules: SecurityDecisionRule[] # 所有評估的規則(審計用)
|
|
65
|
+
ci_mode_override: boolean # true 時 ask → deny
|
|
66
|
+
|
|
67
|
+
trust_radius_protection:
|
|
68
|
+
description: "projectSettings 在安全敏感操作中被排除(防止惡意 repo 注入)"
|
|
69
|
+
blocked_operations:
|
|
70
|
+
- "將 requiresUserConfirmation 設為 false"
|
|
71
|
+
- "記憶體路徑重定向到專案目錄外(如 ~/.ssh)"
|
|
72
|
+
- "工具白名單擴充超出 userSettings 允許的範圍"
|
|
73
|
+
- "安全規則降級(deny → allow)"
|
|
74
|
+
log_on_rejection:
|
|
75
|
+
level: warn
|
|
76
|
+
message: "[WARN] projectSettings security override rejected: {operation}"
|
|
77
|
+
|
|
78
|
+
applicable_components:
|
|
79
|
+
- "DevAP Safety Hook"
|
|
80
|
+
- "VibeOps CommandPolicy"
|
|
81
|
+
- "VibeOps Governance Framework (SPEC-049)"
|
|
82
|
+
- "任何多來源規則合併的安全仲裁場景"
|
|
83
|
+
|
|
84
|
+
error_codes:
|
|
85
|
+
SD-001: "SECURITY_DENIED — deny 決策,操作被阻止"
|
|
86
|
+
SD-002: "SECURITY_ASK_CI — ask 在 CI 模式下被視為 deny"
|
|
87
|
+
SD-003: "TRUST_RADIUS_VIOLATION — projectSettings 嘗試安全提升,已拒絕"
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Skill-Standard Alignment Check - AI Optimized
|
|
2
|
+
# Source: XSPEC-070 (DEC-043 Wave 1 Governance Meta Pack)
|
|
3
|
+
|
|
4
|
+
standard:
|
|
5
|
+
id: skill-standard-alignment-check
|
|
6
|
+
name: Skill-Standard Alignment Check
|
|
7
|
+
description: Skill 必有 Standard 作為錨點,Standard 可無 Skill;定期識別孤兒 Skill
|
|
8
|
+
|
|
9
|
+
meta:
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
updated: "2026-04-17"
|
|
12
|
+
status: trial
|
|
13
|
+
since: "2026-04-17"
|
|
14
|
+
expires: "2026-10-17"
|
|
15
|
+
source: XSPEC-070
|
|
16
|
+
borrowed_from: DEC-043
|
|
17
|
+
description: >
|
|
18
|
+
Skill 是 UX 糖衣,Standard 是 standards-of-truth。若 Skill 無錨定 Standard,
|
|
19
|
+
其行為就沒有明文依據,會隨作者口味飄移。本標準規範 Skill 必須指明錨定哪個 Standard,
|
|
20
|
+
並定期識別「孤兒 Skill」(無對應 Standard),觸發補 Standard 的流程。
|
|
21
|
+
反向允許 Standard 無 Skill(不強制每個 Standard 都造 Skill)。
|
|
22
|
+
scope: universal
|
|
23
|
+
industry_reference: "AsiaOstrich DEC-043 七主題缺口分析(slo/runbook/observability 等 40+ Skill 部分無 Standard 錨點)"
|
|
24
|
+
|
|
25
|
+
guidelines:
|
|
26
|
+
- "所有 Skill 必須在 frontmatter 指明 anchor_standard(至少一個)"
|
|
27
|
+
- "anchor_standard 必須指向 Trial / Active / Deprecated 狀態的標準 id"
|
|
28
|
+
- "Skill 無 anchor_standard 視為 orphan,必須在下一版補上或降級為 Proposed"
|
|
29
|
+
- "Standard 無對應 Skill 是合法的(Standard 可獨立存在,Skill 僅為 UX 加速)"
|
|
30
|
+
- "定期(建議季度)執行 alignment check,產出 orphan Skill 清單"
|
|
31
|
+
|
|
32
|
+
alignment_rules:
|
|
33
|
+
skill_must_have_standard:
|
|
34
|
+
rule: "Skill 的 frontmatter 必須包含 anchor_standard 欄位"
|
|
35
|
+
format: "anchor_standard: <standard-id> 或 [<standard-id-1>, <standard-id-2>, ...]"
|
|
36
|
+
enforcement: "CI / pre-release check 強制,缺欄位視為 fail"
|
|
37
|
+
exception: "純 utility Skill(如 docs-generator)可標記 anchor_standard: none + 填 utility_reason"
|
|
38
|
+
|
|
39
|
+
standard_may_have_skill:
|
|
40
|
+
rule: "Standard 是否有對應 Skill 不強制"
|
|
41
|
+
rationale:
|
|
42
|
+
- "Standard 是 standards-of-truth,可被 QualityGate / Agent 直接消費"
|
|
43
|
+
- "Skill 僅是 UX 糖衣,不是 Standard 的必要條件"
|
|
44
|
+
- "強制每 Standard 都造 Skill 會導致 Skill 庫膨脹"
|
|
45
|
+
example: "immutability-first 標準無對應 Skill — 合法"
|
|
46
|
+
|
|
47
|
+
orphan_skill_detection:
|
|
48
|
+
rule: "沒有 anchor_standard 的 Skill 視為 orphan"
|
|
49
|
+
action_on_detected:
|
|
50
|
+
- "列入季度報告"
|
|
51
|
+
- "建立對應 Standard 的 XSPEC(循 admission-criteria 流程)"
|
|
52
|
+
- "若無法建立 Standard,降 Skill 為 Proposed 直到有錨點"
|
|
53
|
+
|
|
54
|
+
known_orphans_2026_04:
|
|
55
|
+
description: "本 XSPEC-070 識別的現存 orphan Skill(由 XSPEC-063~069 補齊)"
|
|
56
|
+
list:
|
|
57
|
+
- skill_id: "slo-assistant"
|
|
58
|
+
needs_standard: "slo-standards (XSPEC-063 規劃中)"
|
|
59
|
+
- skill_id: "runbook-assistant"
|
|
60
|
+
needs_standard: "runbook-standards (XSPEC-064 規劃中)"
|
|
61
|
+
- skill_id: "incident-response-assistant"
|
|
62
|
+
needs_standard: "incident-response-standards (XSPEC-063 規劃中)"
|
|
63
|
+
- skill_id: "observability-assistant"
|
|
64
|
+
needs_standard: "observability-standards (XSPEC-063 規劃中)"
|
|
65
|
+
- skill_id: "metrics-dashboard-assistant"
|
|
66
|
+
needs_standard: "metrics-dashboard-standards (XSPEC-063 規劃中)"
|
|
67
|
+
- skill_id: "ci-cd-assistant"
|
|
68
|
+
needs_standard: "ci-cd-standards (XSPEC-066 規劃中)"
|
|
69
|
+
note: "清單將隨 XSPEC-063~069 實作逐步清空"
|
|
70
|
+
|
|
71
|
+
alignment_check_workflow:
|
|
72
|
+
step_1: "掃描 skills/**/*.md 抽取 frontmatter anchor_standard"
|
|
73
|
+
step_2: "掃描 ai/standards/*.ai.yaml 抽取所有 standard.id"
|
|
74
|
+
step_3: "計算差集:Skill without anchor_standard → orphan 清單"
|
|
75
|
+
step_4: "計算反向差集:Standard without Skill → informational(非錯誤)"
|
|
76
|
+
step_5: "若 anchor_standard 指向不存在的 id 或已 Archived 的 id → 錯誤"
|
|
77
|
+
output: "alignment-report.json / alignment-report.md(含 orphan 清單、broken anchor 清單)"
|
|
78
|
+
|
|
79
|
+
scenarios:
|
|
80
|
+
scenario_1_skill_with_valid_anchor:
|
|
81
|
+
given: "retry-assistant Skill frontmatter 含 anchor_standard: retry-standards"
|
|
82
|
+
when: "執行 alignment check"
|
|
83
|
+
then: "retry-standards 存在且狀態為 Trial,檢查通過"
|
|
84
|
+
note: "典型的健康 Skill-Standard 對齊"
|
|
85
|
+
|
|
86
|
+
scenario_2_orphan_skill_detected:
|
|
87
|
+
given: "slo-assistant Skill 無 anchor_standard 欄位"
|
|
88
|
+
when: "執行 alignment check"
|
|
89
|
+
then: "列入 orphan 清單,狀態報告標註「需建立 slo-standards 或降級為 Proposed」"
|
|
90
|
+
note: "對齊 XSPEC-063 計畫補 slo-standards 的需求"
|
|
91
|
+
|
|
92
|
+
scenario_3_standard_without_skill_ok:
|
|
93
|
+
given: "immutability-first.ai.yaml 存在,但無對應 immutability-assistant Skill"
|
|
94
|
+
when: "執行 alignment check"
|
|
95
|
+
then: "standalone-standard 計數 +1,不視為錯誤"
|
|
96
|
+
note: "Standard 可獨立存在;強制每 Standard 造 Skill 不合理"
|
|
97
|
+
|
|
98
|
+
telemetry_events:
|
|
99
|
+
alignment_check_run:
|
|
100
|
+
fields:
|
|
101
|
+
total_skills: number
|
|
102
|
+
total_standards: number
|
|
103
|
+
orphan_skills_count: number
|
|
104
|
+
broken_anchors_count: number
|
|
105
|
+
standalone_standards_count: number
|
|
106
|
+
timestamp: string
|
|
107
|
+
when: "每次 alignment check 執行時上報"
|
|
108
|
+
|
|
109
|
+
error_codes:
|
|
110
|
+
ALIGN-001: "SKILL_MISSING_ANCHOR — Skill frontmatter 缺 anchor_standard"
|
|
111
|
+
ALIGN-002: "BROKEN_ANCHOR — anchor_standard 指向不存在的 standard id"
|
|
112
|
+
ALIGN-003: "ARCHIVED_ANCHOR — anchor_standard 指向已 Archived 的標準"
|
|
113
|
+
ALIGN-004: "UTILITY_MISSING_REASON — utility Skill 標 anchor_standard=none 但缺 utility_reason"
|
|
114
|
+
|
|
115
|
+
integration_points:
|
|
116
|
+
- "standard-admission-criteria.ai.yaml — orphan Skill 促成新 Standard 申請"
|
|
117
|
+
- "standard-lifecycle-management.ai.yaml — anchor 必須指向非 Archived 狀態標準"
|
|
118
|
+
- "pre-release-check.sh — alignment check 可整合為 release gate(選用)"
|
|
119
|
+
- "DEC-043 — XSPEC-063~069 的主要目的之一即是清空本標準識別的 orphan 清單"
|