ai-developer-skill-os 10.1.0 → 10.2.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 (98) hide show
  1. package/.agents/AGENTS.md +13 -0
  2. package/.agents/LICENSE +21 -21
  3. package/.agents/docs/ARCHITECTURE.md +56 -120
  4. package/.agents/docs/GOVERNANCE.md +3 -3
  5. package/.agents/docs/SPEC.md +137 -60
  6. package/.agents/docs/VERSIONING.md +25 -57
  7. package/.agents/docs/adr/0005-v10-platform-consolidation.md +50 -0
  8. package/.agents/docs/schemas/learning.schema.yml +22 -57
  9. package/.agents/docs/schemas/skill.schema.yml +116 -161
  10. package/.agents/docs/schemas/workflow.schema.yml +51 -26
  11. package/.agents/docs/skill-classification.md +1 -1
  12. package/.agents/registry/graph.json +171 -77
  13. package/.agents/registry/index.yaml +68 -35
  14. package/.agents/rules/coding.md +1 -1
  15. package/.agents/rules/command-safety.md +1 -1
  16. package/.agents/rules/global.md +1 -1
  17. package/.agents/rules/prompt-compiler.md +1 -1
  18. package/.agents/rules/safety.md +1 -1
  19. package/.agents/rules/security.md +1 -1
  20. package/.agents/rules/skill-quality.md +18 -3
  21. package/.agents/skills/_template/SKILL.md +238 -88
  22. package/.agents/skills/qk-api-data-discovery/SKILL.md +176 -190
  23. package/.agents/skills/qk-api-data-discovery/references/bronze-record-format.md +47 -0
  24. package/.agents/skills/qk-api-data-discovery/references/data-contract-yaml.md +72 -0
  25. package/.agents/skills/qk-api-data-discovery/references/discovery-report-template.md +110 -0
  26. package/.agents/skills/qk-backend-data/SKILL.md +150 -1
  27. package/.agents/skills/qk-bug-resolution/SKILL.md +153 -1
  28. package/.agents/skills/qk-bug-resolution/evals/scorecard.yaml +1 -1
  29. package/.agents/skills/qk-code-cleaner/SKILL.md +150 -1
  30. package/.agents/skills/qk-code-review/SKILL.md +195 -1
  31. package/.agents/skills/qk-code-review/evals/scorecard.yaml +1 -1
  32. package/.agents/skills/qk-code-review/references/ai/{v8-schema-validation.md → schema-validation.md} +2 -2
  33. package/.agents/skills/qk-code-review/references/cross-cutting/async-concurrency-patterns.md +515 -515
  34. package/.agents/skills/qk-code-review/references/cross-cutting/error-handling-principles.md +492 -492
  35. package/.agents/skills/qk-code-review/references/cross-cutting/n-plus-one-queries.md +309 -309
  36. package/.agents/skills/qk-code-review/references/cross-cutting/sql-injection-prevention.md +307 -307
  37. package/.agents/skills/qk-code-review/references/cross-cutting/xss-prevention.md +263 -263
  38. package/.agents/skills/qk-code-review/references/languages/angular.md +768 -768
  39. package/.agents/skills/qk-code-review/references/languages/c.md +890 -890
  40. package/.agents/skills/qk-code-review/references/languages/cpp.md +893 -893
  41. package/.agents/skills/qk-code-review/references/languages/css-less-sass.md +661 -661
  42. package/.agents/skills/qk-code-review/references/languages/django.md +985 -985
  43. package/.agents/skills/qk-code-review/references/languages/fastapi.md +580 -580
  44. package/.agents/skills/qk-code-review/references/languages/go.md +993 -993
  45. package/.agents/skills/qk-code-review/references/languages/java.md +409 -409
  46. package/.agents/skills/qk-code-review/references/languages/java8.md +586 -586
  47. package/.agents/skills/qk-code-review/references/languages/kotlin.md +1018 -1018
  48. package/.agents/skills/qk-code-review/references/languages/nestjs.md +593 -593
  49. package/.agents/skills/qk-code-review/references/languages/php.md +684 -684
  50. package/.agents/skills/qk-code-review/references/languages/python.md +1073 -1073
  51. package/.agents/skills/qk-code-review/references/languages/qt.md +757 -757
  52. package/.agents/skills/qk-code-review/references/languages/react.md +871 -871
  53. package/.agents/skills/qk-code-review/references/languages/ruby.md +964 -964
  54. package/.agents/skills/qk-code-review/references/languages/rust.md +846 -846
  55. package/.agents/skills/qk-code-review/references/languages/svelte.md +1064 -1064
  56. package/.agents/skills/qk-code-review/references/languages/swift.md +936 -936
  57. package/.agents/skills/qk-code-review/references/languages/typescript.md +1016 -1016
  58. package/.agents/skills/qk-code-review/references/languages/vue.md +924 -924
  59. package/.agents/skills/qk-code-review/references/languages/zig.md +440 -440
  60. package/.agents/skills/qk-devops-release/SKILL.md +150 -1
  61. package/.agents/skills/qk-feature-delivery/SKILL.md +153 -1
  62. package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +1 -1
  63. package/.agents/skills/qk-orchestrator/SKILL.md +187 -2
  64. package/.agents/skills/qk-orchestrator/evals/scorecard.yaml +1 -1
  65. package/.agents/skills/qk-orchestrator/references/routing-table.md +1 -1
  66. package/.agents/skills/qk-product-spec/SKILL.md +150 -1
  67. package/.agents/skills/qk-prompt-compiler/SKILL.md +188 -65
  68. package/.agents/skills/qk-ui-engineer/SKILL.md +150 -1
  69. package/.agents/workflows/_schema.yml +146 -146
  70. package/.agents/workflows/bug-resolution.yml +155 -121
  71. package/.agents/workflows/code-review.yml +127 -93
  72. package/.agents/workflows/context-discovery.yml +128 -94
  73. package/.agents/workflows/documentation.yml +124 -90
  74. package/.agents/workflows/feature-delivery.yml +158 -124
  75. package/.agents/workflows/production-release.yml +207 -173
  76. package/.agents/workflows/prompt-compilation.yml +126 -0
  77. package/.agents/workflows/refactor.yml +136 -102
  78. package/.agents/workflows/security-audit.yml +149 -115
  79. package/.agents/workflows/shared/quality-gate.yml +3 -1
  80. package/.agents/workflows/skin-governance.yml +149 -115
  81. package/.agents/workflows/spec-driven-development.yml +78 -71
  82. package/CHANGELOG.md +61 -0
  83. package/README.md +3 -3
  84. package/bin/install.js +38 -51
  85. package/package.json +68 -74
  86. package/tooling/build-registry.js +226 -208
  87. package/tooling/run-aar.js +55 -126
  88. package/tooling/sync-versions.js +2 -2
  89. package/tooling/validate-graph.js +100 -87
  90. package/tooling/validate-skills.js +32 -14
  91. package/.agents/docs/decisions/ADR-001-v8-migration.md +0 -58
  92. package/.agents/docs/decisions/ADR-002-workflow-separation.md +0 -50
  93. package/.agents/docs/decisions/ADR-003-registry-generated.md +0 -54
  94. package/.agents/docs/decisions/ADR-008-skill-boundary-review.md +0 -27
  95. package/.agents/registry/capability-graph.yml +0 -390
  96. package/.agents/registry/skills-index.yml +0 -305
  97. package/.agents/skills/_template/capability.yaml +0 -34
  98. package/.agents/skills/_template/evals/scorecard.yaml +0 -19
@@ -1,87 +1,100 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import yaml from 'js-yaml';
4
-
5
- const GRAPH_FILE = path.resolve('.agents/registry/capability-graph.yml');
6
-
7
- function validateGraph() {
8
- if (!fs.existsSync(GRAPH_FILE)) {
9
- console.error('Không tìm thấy capability-graph.yml');
10
- process.exit(1);
11
- }
12
-
13
- const content = fs.readFileSync(GRAPH_FILE, 'utf8');
14
- const graph = yaml.load(content);
15
-
16
- const nodes = Object.keys(graph.nodes || {});
17
- const edges = graph.edges || [];
18
-
19
- let errors = [];
20
-
21
- // 1. Kiểm tra edge references (tồn tại node đích)
22
- let conflictsCount = 0;
23
- edges.forEach(e => {
24
- if (!nodes.includes(e.to)) {
25
- // Cảnh báo nhưng không luôn lỗi vì to có thể là tên workflow
26
- if (e.relation !== 'depends_on') {
27
- errors.push(`Edge error: '${e.from}' trỏ đến '${e.to}' không tồn tại trong nodes (${e.relation})`);
28
- }
29
- }
30
- if (e.relation === 'conflicts_with') conflictsCount++;
31
- });
32
-
33
- // 2. Kiểm tra reverse delegation (implementation -> architecture)
34
- // Logic giả định dựa trên keyword
35
- edges.forEach(e => {
36
- if (e.relation === 'delegates_to') {
37
- if (e.from.includes('ui-builder') && e.to.includes('architecture')) {
38
- errors.push(`Policy violation: Implementation skill '${e.from}' không được delegate cho Architecture skill '${e.to}'`);
39
- }
40
- }
41
- });
42
-
43
- // 3. Isolated nodes (Ngoại trừ qk-orchestrator, qk-product-specification)
44
- let orphanCount = 0;
45
- const allowedIsolated = ['qk-orchestrator', 'qk-product-specification'];
46
-
47
- const connectedNodes = new Set();
48
- edges.forEach(e => {
49
- connectedNodes.add(e.from);
50
- if (nodes.includes(e.to)) connectedNodes.add(e.to);
51
- });
52
-
53
- nodes.forEach(n => {
54
- if (!connectedNodes.has(n)) {
55
- if (!allowedIsolated.includes(n)) {
56
- errors.push(`Orphan node: '${n}' bị cô lập (không nối đi đâu, không ai nối tới).`);
57
- orphanCount++;
58
- }
59
- }
60
- });
61
-
62
- // Mock Cycles check
63
- let cyclesCount = 0; // Để đơn giản, giả lập 0 cycles. Trong thực tế dùng thuật toán DFS.
64
-
65
- const score = Math.max(0, 100 - (errors.length * 5));
66
-
67
- console.log('─────────────────────────────────────────────────');
68
- console.log('📊 Capability Graph Health');
69
- console.log('─────────────────────────────────────────────────');
70
- console.log(`Nodes: ${nodes.length}`);
71
- console.log(`Edges: ${edges.length}`);
72
- console.log(`Coverage: 100%`);
73
- console.log(`Conflicts: ${conflictsCount}`);
74
- console.log(`Orphan: ${orphanCount}`);
75
- console.log(`Cycles: ${cyclesCount}`);
76
- console.log(`\nScore: ${score}/100`);
77
-
78
- if (errors.length > 0) {
79
- console.log('\n⚠️ Cảnh báo & Lỗi:');
80
- errors.forEach(err => console.log(`- ${err}`));
81
- process.exit(1);
82
- } else {
83
- console.log('\n✅ Capability Graph hợp lệ.');
84
- }
85
- }
86
-
87
- validateGraph();
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+
4
+ const GRAPH_FILE = path.resolve('.agents/registry/graph.json');
5
+
6
+ function validateGraph() {
7
+ if (!fs.existsSync(GRAPH_FILE)) {
8
+ console.error('Không tìm thấy graph.json');
9
+ process.exit(1);
10
+ }
11
+
12
+ const content = fs.readFileSync(GRAPH_FILE, 'utf8');
13
+ const graph = JSON.parse(content);
14
+
15
+ const nodes = Object.keys(graph.nodes || {});
16
+ const edges = graph.edges || [];
17
+ const adjacency = graph.adjacency || {};
18
+
19
+ let errors = [];
20
+
21
+ // 1. Kiểm tra edge references (tồn tại node đích)
22
+ let conflictsCount = 0;
23
+ edges.forEach(e => {
24
+ if (!nodes.includes(e.to)) {
25
+ // Cảnh báo nhưng không luôn lỗi vì to có thể là tên workflow
26
+ if (e.relation !== 'depends_on') {
27
+ errors.push(`Edge error: '${e.from}' trỏ đến '${e.to}' không tồn tại trong nodes (${e.relation})`);
28
+ }
29
+ }
30
+ if (e.relation === 'conflicts_with') conflictsCount++;
31
+ });
32
+ // 2. Isolated nodes (Ngoại trừ qk-orchestrator)
33
+ let orphanCount = 0;
34
+ const allowedIsolated = ['qk-orchestrator'];
35
+
36
+ const connectedNodes = new Set();
37
+ edges.forEach(e => {
38
+ connectedNodes.add(e.from);
39
+ connectedNodes.add(e.to);
40
+ });
41
+
42
+ nodes.forEach(n => {
43
+ if (!connectedNodes.has(n)) {
44
+ if (!allowedIsolated.includes(n)) {
45
+ errors.push(`Orphan node: '${n}' bị cô lập.`);
46
+ orphanCount++;
47
+ }
48
+ }
49
+ });
50
+
51
+ // Cycle detection using DFS
52
+ let cyclesCount = 0;
53
+ const visited = {};
54
+ const recursionStack = {};
55
+
56
+ function detectCycle(node) {
57
+ visited[node] = true;
58
+ recursionStack[node] = true;
59
+ const neighbors = adjacency[node] || [];
60
+ for (const neighbor of neighbors) {
61
+ if (!visited[neighbor]) {
62
+ if (detectCycle(neighbor)) return true;
63
+ } else if (recursionStack[neighbor]) {
64
+ cyclesCount++;
65
+ return true;
66
+ }
67
+ }
68
+ recursionStack[node] = false;
69
+ return false;
70
+ }
71
+
72
+ for (const node of nodes) {
73
+ if (!visited[node]) {
74
+ detectCycle(node);
75
+ }
76
+ }
77
+
78
+ const score = Math.max(0, 100 - (errors.length * 5) - (cyclesCount * 2));
79
+
80
+ console.log('─────────────────────────────────────────────────');
81
+ console.log('📊 Capability Graph Health');
82
+ console.log('─────────────────────────────────────────────────');
83
+ console.log(`Nodes: ${nodes.length}`);
84
+ console.log(`Edges: ${edges.length}`);
85
+ console.log(`Coverage: 100%`);
86
+ console.log(`Conflicts: ${conflictsCount}`);
87
+ console.log(`Orphan: ${orphanCount}`);
88
+ console.log(`Cycles: ${cyclesCount}`);
89
+ console.log(`\nScore: ${score}/100`);
90
+
91
+ if (errors.length > 0) {
92
+ console.log('\n⚠️ Cảnh báo & Lỗi:');
93
+ errors.forEach(err => console.log(`- ${err}`));
94
+ process.exit(1);
95
+ } else {
96
+ console.log('\n✅ Capability Graph hợp lệ.');
97
+ }
98
+ }
99
+
100
+ validateGraph();
@@ -28,11 +28,13 @@ function parseFrontmatter(content) {
28
28
  };
29
29
 
30
30
  const name = extract('name');
31
- const version = extract('version') || '7.5.0';
31
+ const version = extract('version') || '10.2.0';
32
32
  let status = extract('status');
33
33
 
34
34
  if (!status && (version.startsWith('8.') || version.startsWith('9.'))) {
35
35
  status = 'stable';
36
+ } else if (!status && version.startsWith('10.')) {
37
+ status = 'stable';
36
38
  } else if (!status) {
37
39
  status = 'legacy';
38
40
  }
@@ -41,10 +43,16 @@ function parseFrontmatter(content) {
41
43
  name,
42
44
  version,
43
45
  status,
44
- hasIntent: yamlString.includes('intent:'),
45
46
  hasWorkflow: yamlString.includes('workflow:'),
46
- hasVerification: yamlString.includes('verification:'),
47
- hasSelection: yamlString.includes('selection:')
47
+ hasTriggers: yamlString.includes('triggers:'),
48
+ hasRules: yamlString.includes('rules:'),
49
+ hasClassification: yamlString.includes('classification:'),
50
+ hasReferences: yamlString.includes('references:'),
51
+ isV10Frontmatter: yamlString.includes('classification:'),
52
+ isLegacyFrontmatter: yamlString.includes('workflow:') && !yamlString.includes('classification:'),
53
+ isV10Format: (yamlString.includes('classification:') && yamlString.includes('references:')) ||
54
+ (yamlString.includes('workflow:') && !yamlString.includes('classification:')),
55
+ hasPlatforms: yamlString.includes('platforms:')
48
56
  };
49
57
  }
50
58
 
@@ -58,8 +66,8 @@ function validate() {
58
66
  .filter(d => !d.startsWith('_') && fs.statSync(path.join(SKILLS_DIR, d)).isDirectory());
59
67
 
60
68
  let totalScanned = 0;
61
- let stableValid = 0;
62
- let stableTotal = 0;
69
+ let v10Valid = 0;
70
+ let v10Total = 0;
63
71
  let legacyIgnored = 0;
64
72
  let missingRequiredCount = 0;
65
73
 
@@ -73,13 +81,23 @@ function validate() {
73
81
 
74
82
  totalScanned++;
75
83
 
76
- if (meta.status === 'stable' || meta.status === 'experimental') {
77
- stableTotal++;
78
- if (meta.hasIntent && meta.hasWorkflow && meta.hasVerification && meta.hasSelection) {
79
- stableValid++;
84
+ if (meta.version && meta.version.startsWith('10.')) {
85
+ v10Total++;
86
+ const hasExitCodes = content.includes('Thoái Ra Mã') || content.includes('Exit Codes');
87
+ const hasCompliance = content.includes('Compliance');
88
+ const hasConfidence = content.includes('Confidence Model') || content.includes('Độ Tin Cậy');
89
+ const hasEvidence = content.includes('Bằng Chứng') || content.includes('Evidence Format');
90
+ const hasAllV10Sections = hasExitCodes && hasCompliance && hasConfidence && hasEvidence && meta.hasPlatforms;
91
+ if (hasAllV10Sections) {
92
+ v10Valid++;
80
93
  } else {
81
94
  missingRequiredCount++;
82
- console.warn(`[WARN] ${meta.name} is missing required V8 fields`);
95
+ const missing = [];
96
+ if (!hasExitCodes) missing.push('Exit Codes');
97
+ if (!hasCompliance) missing.push('Compliance');
98
+ if (!hasConfidence) missing.push('Confidence Model');
99
+ if (!hasEvidence) missing.push('Evidence Format');
100
+ console.warn(`[WARN] ${meta.name} is missing V10 sections: ${missing.join(', ')}`);
83
101
  }
84
102
  } else {
85
103
  legacyIgnored++;
@@ -87,9 +105,9 @@ function validate() {
87
105
  }
88
106
 
89
107
  console.log(`\nSkills scanned: ${totalScanned}`);
90
- console.log(`\nStable/Experimental:`);
91
- console.log(`${stableValid}/${stableTotal} valid`);
92
- console.log(`\nLegacy:`);
108
+ console.log(`\nV10 Format:`);
109
+ console.log(`${v10Valid}/${v10Total} valid`);
110
+ console.log(`\nLegacy (pre-V10):`);
93
111
  console.log(`${legacyIgnored}/${legacyIgnored} ignored`);
94
112
  console.log(`\nMissing required:`);
95
113
  console.log(`${missingRequiredCount}`);
@@ -1,58 +0,0 @@
1
- # ADR-001: V8 Architecture Migration Strategy
2
-
3
- **Date:** 2026-07
4
- **Status:** Accepted
5
- **Deciders:** Quang Khánh
6
-
7
- ---
8
-
9
- ## Context
10
-
11
- V7 (7.5.1) had 22 skills, each a monolithic SKILL.md containing:
12
- - Routing logic
13
- - Execution workflow
14
- - Verification steps
15
- - Rules and policies
16
-
17
- This made skills hard to reuse, workflows inconsistent across skills, and AI agents often confused about which skill to choose.
18
-
19
- ---
20
-
21
- ## Decision
22
-
23
- Migrate to V8 **Agent Knowledge System** using **Structured Monolith** approach:
24
-
25
- 1. **Keep skills** — don't split SKILL.md into multiple files
26
- 2. **Add schema** — new frontmatter fields (intent, triggers, workflow ref, verification)
27
- 3. **Extract workflows** — move execution pipelines to shared `workflows/*.yml`
28
- 4. **Extract rules** — move global policies to `rules/*.md`
29
- 5. **Add registry** — generated `registry/skills-index.yml` for AI retrieval
30
-
31
- ---
32
-
33
- ## Rationale
34
-
35
- **Why not split SKILL.md into separate files?**
36
- - Migration cost too high (22 skills × 4 extractions = 88 operations)
37
- - Risk of losing embedded knowledge in the split
38
- - Structured Monolith achieves the same retrieval benefit via references
39
-
40
- **Why pilot 5 skills first?**
41
- - Schema may need adjustment based on real agent behavior
42
- - Safer to validate on 5 before committing to 22
43
-
44
- **Why keep git history instead of `archive/` folder?**
45
- - V7.5.1 tagged at git → complete history available
46
- - Archive folder in repo creates noise for AI agents
47
- - Clean break is cleaner than carrying historical artifacts
48
-
49
- ---
50
-
51
- ## Consequences
52
-
53
- - ✅ Workflows are now reusable (shared across skills)
54
- - ✅ AI retrieval is faster (registry index)
55
- - ✅ Rules are explicit and non-duplicated
56
- - ✅ Verification is mandatory and standardized
57
- - ⚠️ New schema requires migration of all 22 skills (3 weeks)
58
- - ⚠️ `skills.json` is now generated, not authoritative
@@ -1,50 +0,0 @@
1
- # ADR-002: Workflow Separation from Skills
2
-
3
- **Date:** 2026-07
4
- **Status:** Accepted
5
-
6
- ---
7
-
8
- ## Context
9
-
10
- In V7, each SKILL.md contained its own workflow embedded in the body. This meant:
11
- - Workflow for bug-fixing existed in `qk-bug-resolution/SKILL.md`
12
- - Similar steps were duplicated across multiple skills
13
- - No way to reuse or compose workflows
14
-
15
- ---
16
-
17
- ## Decision
18
-
19
- Extract workflows into dedicated `workflows/*.yml` files. Skills reference workflows by name:
20
-
21
- ```yaml
22
- # In SKILL.md frontmatter:
23
- workflow: bug-resolution # → workflows/bug-resolution.yml
24
- ```
25
-
26
- Each workflow step MUST define `inputs` and `outputs` (not just `actions`) so agents understand what a step achieves, not just how to do it.
27
-
28
- ---
29
-
30
- ## Rationale
31
-
32
- **Why YAML instead of Markdown?**
33
- - Machine-readable: easier for agents to parse step inputs/outputs
34
- - Structured: enforces schema compliance
35
- - If found to be too rigid, can switch to Markdown+frontmatter without breaking skill references
36
-
37
- **Why inputs/outputs per step?**
38
- - Agents need to know WHAT each step achieves, not just HOW
39
- - Enables future: step skipping based on already-available outputs
40
- - Better debugging: "step X failed because output Y was not produced"
41
-
42
- ---
43
-
44
- ## Consequences
45
-
46
- - ✅ Workflows are reusable across skills
47
- - ✅ Each step has clear contract (inputs → outputs)
48
- - ✅ Easier to add new skills that reuse existing workflows
49
- - ⚠️ YAML can be verbose — acceptable tradeoff for clarity
50
- - ⚠️ If workflow changes, all referencing skills remain valid (they only reference by name)
@@ -1,54 +0,0 @@
1
- # ADR-003: Registry as Generated Artifact
2
-
3
- **Date:** 2026-07
4
- **Status:** Accepted
5
-
6
- ---
7
-
8
- ## Context
9
-
10
- V7 had `skills.json` as the primary manifest — manually maintained, often drifting from actual SKILL.md content. This created two sources of truth.
11
-
12
- V8 needs a retrieval index for AI agents to find the right skill without reading all 22 SKILL.md files.
13
-
14
- ---
15
-
16
- ## Decision
17
-
18
- `registry/skills-index.yml` is a **generated file**. It is produced by `tooling/generate-registry.js` by reading all `SKILL.md` frontmatter.
19
-
20
- `SKILL.md` is the single source of truth. The registry is a derivative.
21
-
22
- ```
23
- SKILL.md (source of truth)
24
- ↓
25
- tooling/generate-registry.js
26
- ↓
27
- registry/skills-index.yml (DO NOT EDIT MANUALLY)
28
- ```
29
-
30
- `skills.json` is kept as a compatibility manifest for platforms that expect it (e.g., Antigravity v7 convention). It is also generated, not manually maintained.
31
-
32
- ---
33
-
34
- ## Rationale
35
-
36
- **Why not edit the registry manually?**
37
- - Two sources of truth always drift
38
- - Triggers, intent, complexity are already defined in SKILL.md
39
- - Generator can be run as a pre-commit hook or on demand
40
-
41
- **Why keep skills.json?**
42
- - Antigravity and some platforms discover skills via `skills.json`
43
- - Backward compatibility for v7 skill consumers
44
- - It's generated, so no maintenance burden
45
-
46
- ---
47
-
48
- ## Consequences
49
-
50
- - ✅ Single source of truth: SKILL.md
51
- - ✅ No drift between skill and registry
52
- - ✅ Registry update is automatic when skills are updated
53
- - ⚠️ Requires running generator after any SKILL.md change
54
- - ⚠️ If generator is not run, registry may be stale (mitigated by pre-commit hook)
@@ -1,27 +0,0 @@
1
- # ADR 008: Skill Boundary Review (V8.1.3)
2
-
3
- ## Tiêu đề
4
- Định hướng tương lai cho ranh giới của `qk-validation-gate` và `qk-ai-builder`.
5
-
6
- ## Bối cảnh
7
- Trong quá trình hoàn thiện Agent Engineering OS (V8.1.3), quá trình kiểm toán phát hiện rằng một số skill ban đầu có phạm vi hoạt động (scope) quá rộng hoặc chưa phân vai rõ ràng, dễ dẫn đến conflict. Tuy nhiên, để không làm vỡ kiến trúc (scope creep) trong giai đoạn chốt Control Plane, chúng ta quyết định giữ nguyên nhưng ghi chú định hướng cho V8.2.
8
-
9
- ## Quyết định
10
-
11
- ### 1. Về `qk-validation-gate`
12
- - **Hiện trạng:** Đang đóng vai trò validation coordinator.
13
- - **Định hướng (V8.2):** Sẽ được định hình rõ thành `release decision orchestrator`.
14
- - **Ranh giới tương lai:** Không trực tiếp chạy test, không trực tiếp scan security, không audit quality. Nhiệm vụ của nó là tổng hợp kết quả từ `qk-test-engineering`, `qk-security-audit`, và `qk-web-quality-gate` để ra quyết định cuối cùng (gate decision).
15
-
16
- ### 2. Về `qk-ai-builder`
17
- - **Hiện trạng:** Đang quá rộng (gồm cả frontend AI apps, general AI coding, prompt writing...).
18
- - **Định hướng (V8.2):** Đổi tên (rename semantic) thành `qk-agent-platform-engineering`.
19
- - **Ranh giới tương lai:**
20
- - **Owns:** agent architecture, MCP integration, skill generation, agent runtime patterns.
21
- - **Does not own:** frontend AI apps, general AI coding, prompt writing.
22
-
23
- ## Trạng thái
24
- Đề xuất được chấp nhận (Deferred to V8.2).
25
-
26
- ## Hệ quả
27
- Ngăn chặn các kỹ năng này bị phình to trong quá trình triển khai thực tế. Chuẩn bị sẵn sàng cấu trúc cho giai đoạn V8.2 (Self-Improving Agent).