@ryuenn3123/agentic-senior-core 2.5.22 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/.agent-context/prompts/init-project.md +5 -5
  2. package/.agent-context/prompts/refactor.md +2 -1
  3. package/.agent-context/prompts/review-code.md +3 -2
  4. package/.agent-context/review-checklists/pr-checklist.md +8 -1
  5. package/.agent-context/rules/architecture.md +11 -0
  6. package/.agent-context/rules/frontend-architecture.md +2 -2
  7. package/.agent-context/state/architecture-map.md +1 -1
  8. package/.agent-context/state/memory-continuity-benchmark.json +1 -1
  9. package/.agents/workflows/init-project.md +3 -3
  10. package/.agents/workflows/refactor.md +1 -1
  11. package/.agents/workflows/review-code.md +4 -5
  12. package/.cursorrules +27 -71
  13. package/.gemini/instructions.md +6 -7
  14. package/.github/copilot-instructions.md +5 -6
  15. package/.windsurfrules +27 -71
  16. package/AGENTS.md +7 -9
  17. package/CONTRIBUTING.md +18 -31
  18. package/README.md +21 -4
  19. package/bin/agentic-senior-core.js +0 -6
  20. package/lib/cli/commands/init.mjs +113 -650
  21. package/lib/cli/commands/launch.mjs +1 -23
  22. package/lib/cli/commands/rollback.mjs +1 -1
  23. package/lib/cli/commands/upgrade.mjs +1 -23
  24. package/lib/cli/compiler.mjs +77 -72
  25. package/lib/cli/constants.mjs +84 -26
  26. package/lib/cli/init-architecture-flow.mjs +231 -0
  27. package/lib/cli/init-detection-flow.mjs +123 -0
  28. package/lib/cli/init-options.mjs +344 -0
  29. package/lib/cli/init-selection.mjs +100 -0
  30. package/lib/cli/preflight.mjs +1 -1
  31. package/lib/cli/profile-packs.mjs +15 -1
  32. package/lib/cli/project-scaffolder.mjs +18 -154
  33. package/lib/cli/utils.mjs +16 -12
  34. package/mcp.json +19 -19
  35. package/package.json +5 -2
  36. package/scripts/context-triggered-audit.mjs +18 -18
  37. package/scripts/documentation-boundary-audit.mjs +92 -5
  38. package/scripts/forbidden-content-check.mjs +1 -1
  39. package/scripts/frontend-usability-audit.mjs +21 -28
  40. package/scripts/governance-weekly-report.mjs +29 -15
  41. package/scripts/llm-judge.mjs +2 -5
  42. package/scripts/mcp-server.mjs +389 -5
  43. package/scripts/release-gate.mjs +121 -145
  44. package/scripts/sync-thin-adapters.mjs +161 -0
  45. package/scripts/v3-purge-audit.mjs +231 -0
  46. package/scripts/validate-evidence-bundle.mjs +1 -1
  47. package/scripts/validate.mjs +224 -272
  48. package/.agent-context/blueprints/api-nextjs.md +0 -184
  49. package/.agent-context/blueprints/aspnet-api.md +0 -247
  50. package/.agent-context/blueprints/ci-github-actions.md +0 -226
  51. package/.agent-context/blueprints/ci-gitlab.md +0 -200
  52. package/.agent-context/blueprints/fastapi-service.md +0 -210
  53. package/.agent-context/blueprints/go-service.md +0 -217
  54. package/.agent-context/blueprints/graphql-grpc-api.md +0 -51
  55. package/.agent-context/blueprints/infrastructure-as-code.md +0 -62
  56. package/.agent-context/blueprints/kubernetes-manifests.md +0 -76
  57. package/.agent-context/blueprints/laravel-api.md +0 -233
  58. package/.agent-context/blueprints/mobile-app.md +0 -91
  59. package/.agent-context/blueprints/nestjs-logic.md +0 -247
  60. package/.agent-context/blueprints/observability.md +0 -227
  61. package/.agent-context/blueprints/spring-boot-api.md +0 -218
  62. package/.agent-context/profiles/platform.md +0 -13
  63. package/.agent-context/profiles/regulated.md +0 -13
  64. package/.agent-context/profiles/startup.md +0 -13
  65. package/.agent-context/review-checklists/frontend-excellence-rubric.md +0 -73
  66. package/.agent-context/review-checklists/frontend-skill-parity.md +0 -29
  67. package/.agent-context/review-checklists/frontend-usability.md +0 -35
  68. package/.agent-context/review-checklists/marketplace-acceptance.md +0 -60
  69. package/.agent-context/review-checklists/performance-audit.md +0 -71
  70. package/.agent-context/review-checklists/release-operations.md +0 -33
  71. package/.agent-context/review-checklists/security-audit.md +0 -119
  72. package/.agent-context/skills/README.md +0 -63
  73. package/.agent-context/skills/backend/README.md +0 -68
  74. package/.agent-context/skills/backend/architecture.md +0 -361
  75. package/.agent-context/skills/backend/compatibility-manifest.json +0 -8
  76. package/.agent-context/skills/backend/data-access.md +0 -231
  77. package/.agent-context/skills/backend/errors.md +0 -138
  78. package/.agent-context/skills/backend/validation.md +0 -117
  79. package/.agent-context/skills/backend.md +0 -29
  80. package/.agent-context/skills/cli/.evidence/compatibility-manifest.json +0 -5
  81. package/.agent-context/skills/cli/.evidence/sbom-excerpt.json +0 -10
  82. package/.agent-context/skills/cli/.evidence/test-report.json +0 -8
  83. package/.agent-context/skills/cli/CHANGELOG.md +0 -6
  84. package/.agent-context/skills/cli/README.md +0 -56
  85. package/.agent-context/skills/cli/compatibility-manifest.json +0 -8
  86. package/.agent-context/skills/cli/init.md +0 -38
  87. package/.agent-context/skills/cli/output.md +0 -36
  88. package/.agent-context/skills/cli/package.json +0 -5
  89. package/.agent-context/skills/cli/safety-telemetry.md +0 -39
  90. package/.agent-context/skills/cli/tests/.gitkeep +0 -1
  91. package/.agent-context/skills/cli/upgrade.md +0 -38
  92. package/.agent-context/skills/cli.md +0 -32
  93. package/.agent-context/skills/distribution/.evidence/compatibility-manifest.json +0 -9
  94. package/.agent-context/skills/distribution/.evidence/sbom-excerpt.json +0 -6
  95. package/.agent-context/skills/distribution/.evidence/test-report.json +0 -8
  96. package/.agent-context/skills/distribution/CHANGELOG.md +0 -7
  97. package/.agent-context/skills/distribution/README.md +0 -27
  98. package/.agent-context/skills/distribution/compatibility-manifest.json +0 -8
  99. package/.agent-context/skills/distribution/compatibility.md +0 -32
  100. package/.agent-context/skills/distribution/package.json +0 -5
  101. package/.agent-context/skills/distribution/provenance-attestation.md +0 -47
  102. package/.agent-context/skills/distribution/publish.md +0 -37
  103. package/.agent-context/skills/distribution/rollback.md +0 -32
  104. package/.agent-context/skills/distribution/tests/.gitkeep +0 -1
  105. package/.agent-context/skills/distribution.md +0 -32
  106. package/.agent-context/skills/frontend/.evidence/compatibility-manifest.json +0 -9
  107. package/.agent-context/skills/frontend/.evidence/sbom-excerpt.json +0 -6
  108. package/.agent-context/skills/frontend/.evidence/test-report.json +0 -8
  109. package/.agent-context/skills/frontend/CHANGELOG.md +0 -7
  110. package/.agent-context/skills/frontend/README.md +0 -50
  111. package/.agent-context/skills/frontend/accessibility.md +0 -107
  112. package/.agent-context/skills/frontend/compatibility-manifest.json +0 -8
  113. package/.agent-context/skills/frontend/conversion-clarity.md +0 -51
  114. package/.agent-context/skills/frontend/motion.md +0 -67
  115. package/.agent-context/skills/frontend/package.json +0 -5
  116. package/.agent-context/skills/frontend/performance.md +0 -63
  117. package/.agent-context/skills/frontend/responsive-delivery.md +0 -41
  118. package/.agent-context/skills/frontend/tests/.gitkeep +0 -1
  119. package/.agent-context/skills/frontend/ui-architecture.md +0 -128
  120. package/.agent-context/skills/frontend.md +0 -40
  121. package/.agent-context/skills/fullstack/.evidence/compatibility-manifest.json +0 -9
  122. package/.agent-context/skills/fullstack/.evidence/sbom-excerpt.json +0 -6
  123. package/.agent-context/skills/fullstack/.evidence/test-report.json +0 -8
  124. package/.agent-context/skills/fullstack/CHANGELOG.md +0 -7
  125. package/.agent-context/skills/fullstack/README.md +0 -27
  126. package/.agent-context/skills/fullstack/compatibility-manifest.json +0 -8
  127. package/.agent-context/skills/fullstack/contracts.md +0 -53
  128. package/.agent-context/skills/fullstack/end-to-end.md +0 -42
  129. package/.agent-context/skills/fullstack/feature-slicing.md +0 -65
  130. package/.agent-context/skills/fullstack/package.json +0 -5
  131. package/.agent-context/skills/fullstack/release-coordination.md +0 -51
  132. package/.agent-context/skills/fullstack/tests/.gitkeep +0 -1
  133. package/.agent-context/skills/fullstack.md +0 -30
  134. package/.agent-context/skills/index.json +0 -107
  135. package/.agent-context/skills/review-quality/.evidence/compatibility-manifest.json +0 -9
  136. package/.agent-context/skills/review-quality/.evidence/sbom-excerpt.json +0 -6
  137. package/.agent-context/skills/review-quality/.evidence/test-report.json +0 -8
  138. package/.agent-context/skills/review-quality/CHANGELOG.md +0 -7
  139. package/.agent-context/skills/review-quality/README.md +0 -27
  140. package/.agent-context/skills/review-quality/benchmark.md +0 -30
  141. package/.agent-context/skills/review-quality/compatibility-manifest.json +0 -8
  142. package/.agent-context/skills/review-quality/package.json +0 -5
  143. package/.agent-context/skills/review-quality/planning.md +0 -38
  144. package/.agent-context/skills/review-quality/release-decision.md +0 -49
  145. package/.agent-context/skills/review-quality/security.md +0 -34
  146. package/.agent-context/skills/review-quality/tests/.gitkeep +0 -1
  147. package/.agent-context/skills/review-quality.md +0 -34
  148. package/.agent-context/stacks/csharp.md +0 -149
  149. package/.agent-context/stacks/flutter.md +0 -16
  150. package/.agent-context/stacks/go.md +0 -181
  151. package/.agent-context/stacks/java.md +0 -135
  152. package/.agent-context/stacks/php.md +0 -192
  153. package/.agent-context/stacks/python.md +0 -153
  154. package/.agent-context/stacks/react-native.md +0 -16
  155. package/.agent-context/stacks/ruby.md +0 -80
  156. package/.agent-context/stacks/rust.md +0 -86
  157. package/.agent-context/stacks/typescript.md +0 -317
  158. package/.agent-context/state/skill-platform.json +0 -38
  159. package/lib/cli/skill-selector.mjs +0 -232
  160. package/lib/cli/templates/api-contract.md.id.tmpl +0 -143
  161. package/lib/cli/templates/api-contract.md.tmpl +0 -143
  162. package/lib/cli/templates/architecture-decision-record.md.id.tmpl +0 -106
  163. package/lib/cli/templates/architecture-decision-record.md.tmpl +0 -145
  164. package/lib/cli/templates/database-schema.md.id.tmpl +0 -74
  165. package/lib/cli/templates/database-schema.md.tmpl +0 -74
  166. package/lib/cli/templates/flow-overview.md.id.tmpl +0 -118
  167. package/lib/cli/templates/flow-overview.md.tmpl +0 -131
  168. package/lib/cli/templates/project-brief.md.id.tmpl +0 -55
  169. package/lib/cli/templates/project-brief.md.tmpl +0 -79
  170. package/scripts/init-project.ps1 +0 -105
  171. package/scripts/init-project.sh +0 -131
  172. package/scripts/skill-tier-policy.mjs +0 -76
  173. package/scripts/trust-scorer.mjs +0 -119
@@ -17,8 +17,6 @@ import { readdir, readFile, stat } from 'node:fs/promises';
17
17
  import { dirname, join, relative, resolve } from 'node:path';
18
18
  import { fileURLToPath } from 'node:url';
19
19
  import { createHash } from 'node:crypto';
20
- import { validateSkillTopicContent } from './skill-tier-policy.mjs';
21
- import { calculateTrustScore } from './trust-scorer.mjs';
22
20
 
23
21
  const SCRIPT_FILE_PATH = fileURLToPath(import.meta.url);
24
22
  const ROOT_DIR = resolve(dirname(SCRIPT_FILE_PATH), '..');
@@ -29,11 +27,9 @@ const CHANGELOG_PATH = join(ROOT_DIR, 'CHANGELOG.md');
29
27
  const README_PATH = join(ROOT_DIR, 'README.md');
30
28
  const POLICY_FILE_PATH = join(ROOT_DIR, '.agent-context', 'policies', 'llm-judge-threshold.json');
31
29
  const OVERRIDE_FILE_PATH = join(ROOT_DIR, '.agent-override.md');
32
- const SKILLS_DIR = join(AGENT_CONTEXT_DIR, 'skills');
33
30
  const GENERATED_RULE_FILES = ['.cursorrules', '.windsurfrules'];
34
31
  const ALLOWED_SEVERITIES = new Set(['critical', 'high', 'medium', 'low']);
35
32
  const OVERRIDE_WARNING_WINDOW_DAYS = 30;
36
- const SUPPORTED_COMPATIBILITY_PLATFORMS = new Set(['windows', 'linux', 'macos']);
37
33
  const THIN_ADAPTER_PATHS = [
38
34
  'AGENTS.md',
39
35
  '.github/copilot-instructions.md',
@@ -47,7 +43,6 @@ const FORMAL_ARTIFACT_PATHS = [
47
43
  '.agent-context/rules/api-docs.md',
48
44
  '.agent-context/review-checklists/pr-checklist.md',
49
45
  '.agent-context/prompts/review-code.md',
50
- '.agent-context/skills/review-quality.md',
51
46
  'AGENTS.md',
52
47
  '.github/copilot-instructions.md',
53
48
  '.gemini/instructions.md',
@@ -139,9 +134,8 @@ const REQUIRED_DEVELOPER_FIRST_MENTION_PATTERNS = [
139
134
  },
140
135
  ];
141
136
  const COMPLIANCE_TERMINOLOGY_BOUNDARY_PATHS = [
142
- '.agent-context/review-checklists/security-audit.md',
143
- '.agent-context/review-checklists/performance-audit.md',
144
- '.agent-context/review-checklists/release-operations.md',
137
+ '.agent-context/review-checklists/pr-checklist.md',
138
+ '.agent-context/review-checklists/architecture-review.md',
145
139
  'scripts/release-gate.mjs',
146
140
  'scripts/forbidden-content-check.mjs',
147
141
  ];
@@ -150,9 +144,9 @@ const COMPLIANCE_ALIAS_TERMS = [
150
144
  ];
151
145
  const REQUIRED_COMPLIANCE_CANONICAL_SNIPPETS = [
152
146
  {
153
- path: '.agent-context/review-checklists/release-operations.md',
154
- snippet: 'Federated Governance',
155
- label: 'release operations checklist keeps canonical term Federated Governance',
147
+ path: '.agent-context/review-checklists/pr-checklist.md',
148
+ snippet: '### 15. Universal SOP Consolidation',
149
+ label: 'PR checklist keeps consolidated Universal SOP section',
156
150
  },
157
151
  ];
158
152
  const REQUIRED_DETECTION_TRANSPARENCY_SNIPPETS = [
@@ -203,6 +197,96 @@ const REQUIRED_STACK_RESEARCH_ENGINE_SNIPPETS = [
203
197
  ],
204
198
  },
205
199
  ];
200
+ const REQUIRED_UNIVERSAL_SOP_SNIPPETS = [
201
+ {
202
+ path: '.agent-context/rules/architecture.md',
203
+ snippets: [
204
+ '## Universal SOP Baseline (Mandatory)',
205
+ 'Security and testing are non-negotiable baseline requirements.',
206
+ 'If required project context docs are missing, stop implementation and bootstrap docs before writing application code.',
207
+ ],
208
+ },
209
+ {
210
+ path: '.agent-context/review-checklists/pr-checklist.md',
211
+ snippets: [
212
+ '### 15. Universal SOP Consolidation',
213
+ 'Coding flow is blocked if `docs/architecture-decision-record.md` (or `docs/Architecture-Decision-Record.md`) is missing',
214
+ 'UI implementation flow is blocked if `docs/DESIGN.md` is missing',
215
+ ],
216
+ },
217
+ {
218
+ path: '.agent-context/prompts/review-code.md',
219
+ snippets: [
220
+ 'Enforce Universal SOP hard gate: block coding flow when required project docs are missing (`docs/architecture-decision-record.md`, and for UI scope `docs/DESIGN.md`).',
221
+ ],
222
+ },
223
+ {
224
+ path: '.agent-context/prompts/refactor.md',
225
+ snippets: [
226
+ '6. Enforce Universal SOP hard gate: stop implementation if `docs/architecture-decision-record.md` is missing, and for UI scope stop if `docs/DESIGN.md` is missing.',
227
+ ],
228
+ },
229
+ {
230
+ path: 'lib/cli/compiler.mjs',
231
+ snippets: [
232
+ 'Universal SOP hard block policy:',
233
+ 'Hard block: do not write application code until docs/project-brief.md and docs/architecture-decision-record.md exist.',
234
+ 'For UI scope: if docs/DESIGN.md is missing, execute bootstrap-design prompt before implementing UI surfaces.',
235
+ ],
236
+ },
237
+ ];
238
+ const REQUIRED_TEMPLATE_FREE_BOOTSTRAP_SNIPPETS = [
239
+ {
240
+ path: 'lib/cli/project-scaffolder.mjs',
241
+ snippets: [
242
+ 'resolveProjectDocTargets',
243
+ 'Write project context docs from scratch (no template rendering, no placeholder boilerplate).',
244
+ 'For any research-backed claim, include citation metadata (source + fetchedAt timestamp) from the Architect Engine Snapshot.',
245
+ "bootstrapMode: 'ai-synthesis'",
246
+ ],
247
+ },
248
+ {
249
+ path: 'lib/cli/commands/init.mjs',
250
+ snippets: [
251
+ 'Project docs will be authored dynamically by your IDE assistant from these prompts.',
252
+ 'bootstrap-project-context.md',
253
+ 'I prepared dynamic synthesis bootstrap prompts',
254
+ ],
255
+ },
256
+ ];
257
+ const FORBIDDEN_TEMPLATE_BOOTSTRAP_SNIPPETS = [
258
+ {
259
+ path: 'lib/cli/project-scaffolder.mjs',
260
+ snippets: [
261
+ '.tmpl',
262
+ ],
263
+ },
264
+ ];
265
+ const REQUIRED_DETERMINISTIC_BOUNDARY_ENFORCEMENT_SNIPPETS = [
266
+ {
267
+ path: 'scripts/documentation-boundary-audit.mjs',
268
+ snippets: [
269
+ 'reportVersion',
270
+ 'violations',
271
+ 'suggestedActions',
272
+ 'diagnosticCode',
273
+ 'autoDocsSyncScope',
274
+ 'rolloutMetrics',
275
+ 'precision',
276
+ 'recall',
277
+ ],
278
+ },
279
+ {
280
+ path: 'scripts/release-gate.mjs',
281
+ snippets: [
282
+ 'documentation-boundary-hard-rule',
283
+ 'documentation-boundary-diagnostics-machine-readable',
284
+ 'diagnostics.documentationBoundaryAudit',
285
+ 'auto-docs-sync-scope-phase1',
286
+ 'auto-docs-sync-rollout-metrics',
287
+ ],
288
+ },
289
+ ];
206
290
 
207
291
  const validationResult = {
208
292
  passed: 0,
@@ -299,10 +383,10 @@ async function validateRequiredFiles() {
299
383
  'scripts/rules-guardian-audit.mjs',
300
384
  'scripts/explain-on-demand-audit.mjs',
301
385
  'scripts/single-source-lazy-loading-audit.mjs',
386
+ 'scripts/sync-thin-adapters.mjs',
387
+ 'scripts/v3-purge-audit.mjs',
302
388
  'scripts/release-gate.mjs',
303
389
  'scripts/generate-sbom.mjs',
304
- 'scripts/init-project.sh',
305
- 'scripts/init-project.ps1',
306
390
  '.cursorrules',
307
391
  '.windsurfrules',
308
392
  '.agent-override.md',
@@ -326,8 +410,6 @@ async function validateRequiredFiles() {
326
410
  '.agent-context/state/stack-research-snapshot.json',
327
411
  '.agent-context/state/memory-schema-v1.json',
328
412
  '.agent-context/state/memory-adapter-contract.json',
329
- '.agent-context/state/skill-platform.json',
330
- '.agent-context/skills/index.json',
331
413
  '.vscode/mcp.json',
332
414
  '.github/workflows/release-gate.yml',
333
415
  '.github/workflows/sbom-compliance.yml',
@@ -340,7 +422,6 @@ async function validateRequiredFiles() {
340
422
  'tests/enterprise-ops.test.mjs',
341
423
  'LICENSE',
342
424
  '.gitignore',
343
- '.agent-context/marketplace/trust-tiers.json',
344
425
  ];
345
426
 
346
427
  for (const requiredFilePath of requiredFiles) {
@@ -374,7 +455,7 @@ async function validateMarkdownFiles() {
374
455
  }
375
456
 
376
457
  async function validateRuleFiles() {
377
- console.log('\nChecking rule, stack, blueprint, checklist, and state files...');
458
+ console.log('\nChecking rule, checklist, prompt, and state files...');
378
459
 
379
460
  const expectedPaths = [
380
461
  'rules/naming-conv.md',
@@ -392,52 +473,11 @@ async function validateRuleFiles() {
392
473
  'rules/realtime.md',
393
474
  'rules/frontend-architecture.md',
394
475
  'rules/docker-runtime.md',
395
- 'stacks/typescript.md',
396
- 'stacks/python.md',
397
- 'stacks/java.md',
398
- 'stacks/php.md',
399
- 'stacks/go.md',
400
- 'stacks/csharp.md',
401
- 'stacks/rust.md',
402
- 'stacks/ruby.md',
403
- 'blueprints/api-nextjs.md',
404
- 'blueprints/nestjs-logic.md',
405
- 'blueprints/fastapi-service.md',
406
- 'blueprints/laravel-api.md',
407
- 'blueprints/spring-boot-api.md',
408
- 'blueprints/go-service.md',
409
- 'blueprints/aspnet-api.md',
410
- 'blueprints/ci-github-actions.md',
411
- 'blueprints/ci-gitlab.md',
412
- 'blueprints/observability.md',
413
- 'blueprints/graphql-grpc-api.md',
414
- 'blueprints/infrastructure-as-code.md',
415
- 'blueprints/kubernetes-manifests.md',
416
- 'profiles/startup.md',
417
- 'profiles/regulated.md',
418
- 'profiles/platform.md',
419
476
  'review-checklists/pr-checklist.md',
420
- 'review-checklists/frontend-usability.md',
421
- 'review-checklists/frontend-skill-parity.md',
422
- 'review-checklists/frontend-excellence-rubric.md',
423
- 'review-checklists/release-operations.md',
424
- 'review-checklists/security-audit.md',
425
- 'review-checklists/performance-audit.md',
426
477
  'review-checklists/architecture-review.md',
427
- 'review-checklists/marketplace-acceptance.md',
428
- 'skills/README.md',
429
- 'skills/frontend/README.md',
430
- 'skills/backend/README.md',
431
- 'skills/fullstack/README.md',
432
- 'skills/cli/README.md',
433
- 'skills/distribution/README.md',
434
- 'skills/review-quality/README.md',
435
- 'skills/frontend.md',
436
- 'skills/backend.md',
437
- 'skills/fullstack.md',
438
- 'skills/cli.md',
439
- 'skills/distribution.md',
440
- 'skills/review-quality.md',
478
+ 'prompts/init-project.md',
479
+ 'prompts/refactor.md',
480
+ 'prompts/review-code.md',
441
481
  'state/architecture-map.md',
442
482
  'state/dependency-map.md',
443
483
  ];
@@ -460,129 +500,30 @@ async function validateRuleFiles() {
460
500
  }
461
501
  }
462
502
 
463
- async function validateSkillTierQuality() {
464
- console.log('\nChecking skill tier quality...');
465
-
466
- const skillMarkdownFiles = await collectFiles(SKILLS_DIR, (fileName) => fileName.endsWith('.md'));
467
- const scopedSkillTopicFiles = skillMarkdownFiles.filter((skillFilePath) => {
468
- if (skillFilePath.endsWith('README.md') || skillFilePath.endsWith('CHANGELOG.md')) {
469
- return false;
470
- }
471
-
472
- const relativeSkillPath = relative(SKILLS_DIR, skillFilePath);
473
- return /[\\/]/.test(relativeSkillPath);
474
- });
475
-
476
- for (const skillTopicPath of scopedSkillTopicFiles) {
477
- const skillTopicContent = await readTextFile(skillTopicPath);
478
- const relativeSkillTopicPath = relative(ROOT_DIR, skillTopicPath);
479
- const validationResult = validateSkillTopicContent(skillTopicContent);
480
-
481
- if (!validationResult.isValid) {
482
- if (validationResult.reason === 'missing-tier') {
483
- fail(`${relativeSkillTopicPath} is missing explicit Tier metadata`);
484
- continue;
485
- }
486
-
487
- if (validationResult.reason === 'unsupported-tier') {
488
- fail(`${relativeSkillTopicPath} has unsupported tier: ${validationResult.detectedTier}`);
489
- continue;
490
- }
491
-
492
- if (validationResult.reason === 'word-count') {
493
- fail(`${relativeSkillTopicPath} tier ${validationResult.detectedTier} must include at least ${validationResult.minimumRules.minWords} words (found ${validationResult.wordCount})`);
494
- continue;
495
- }
496
-
497
- if (validationResult.reason === 'heading-count') {
498
- fail(`${relativeSkillTopicPath} tier ${validationResult.detectedTier} must include at least ${validationResult.minimumRules.minHeadings} section headings (found ${validationResult.headingCount})`);
499
- continue;
500
- }
501
-
502
- if (validationResult.reason === 'checklist-count') {
503
- fail(`${relativeSkillTopicPath} tier ${validationResult.detectedTier} must include at least ${validationResult.minimumRules.minChecklistItems} checklist item(s) (found ${validationResult.checklistCount})`);
504
- continue;
505
- }
506
-
507
- if (validationResult.reason === 'code-block-count') {
508
- fail(`${relativeSkillTopicPath} tier ${validationResult.detectedTier} must include at least ${validationResult.minimumRules.minCodeBlocks} code block(s) (found ${validationResult.codeBlockCount})`);
509
- continue;
510
- }
511
-
512
- fail(`${relativeSkillTopicPath} failed tier validation`);
513
- continue;
514
- }
515
-
516
- pass(`${relativeSkillTopicPath} tier ${validationResult.detectedTier} quality gate passed`);
517
- }
518
- }
519
-
520
- async function validateSkillCompatibilityManifests() {
521
- console.log('\nChecking skill compatibility manifests...');
503
+ async function validateChecklistConsolidation() {
504
+ console.log('\nChecking review checklist consolidation...');
522
505
 
523
- const skillDomainEntries = await readdir(SKILLS_DIR, { withFileTypes: true });
524
- const skillDomainDirectoryNames = skillDomainEntries
525
- .filter((entry) => entry.isDirectory())
506
+ const reviewChecklistDirectoryPath = join(AGENT_CONTEXT_DIR, 'review-checklists');
507
+ const checklistEntries = await readdir(reviewChecklistDirectoryPath, { withFileTypes: true });
508
+ const checklistFileNames = checklistEntries
509
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
526
510
  .map((entry) => entry.name)
527
511
  .sort((leftName, rightName) => leftName.localeCompare(rightName));
528
512
 
529
- let validManifestCount = 0;
530
-
531
- for (const skillDomainDirectoryName of skillDomainDirectoryNames) {
532
- const compatibilityManifestPath = join(
533
- SKILLS_DIR,
534
- skillDomainDirectoryName,
535
- 'compatibility-manifest.json'
536
- );
537
-
538
- if (!(await fileExists(compatibilityManifestPath))) {
539
- fail(`Missing compatibility manifest: .agent-context/skills/${skillDomainDirectoryName}/compatibility-manifest.json`);
540
- continue;
541
- }
542
-
543
- let parsedCompatibilityManifest;
544
- try {
545
- parsedCompatibilityManifest = JSON.parse(await readTextFile(compatibilityManifestPath));
546
- } catch (error) {
547
- fail(`Invalid JSON compatibility manifest for ${skillDomainDirectoryName}: ${error.message}`);
548
- continue;
549
- }
550
-
551
- if (!Array.isArray(parsedCompatibilityManifest.ides) || parsedCompatibilityManifest.ides.length === 0) {
552
- fail(`Compatibility manifest for ${skillDomainDirectoryName} must include non-empty "ides" array`);
553
- continue;
554
- }
555
-
556
- if (!Array.isArray(parsedCompatibilityManifest.platforms) || parsedCompatibilityManifest.platforms.length === 0) {
557
- fail(`Compatibility manifest for ${skillDomainDirectoryName} must include non-empty "platforms" array`);
558
- continue;
559
- }
560
-
561
- const unsupportedPlatform = parsedCompatibilityManifest.platforms.find(
562
- (platformName) => !SUPPORTED_COMPATIBILITY_PLATFORMS.has(platformName)
563
- );
513
+ const expectedChecklistFileNames = ['architecture-review.md', 'pr-checklist.md'];
564
514
 
565
- if (unsupportedPlatform) {
566
- fail(`Compatibility manifest for ${skillDomainDirectoryName} has unsupported platform: ${unsupportedPlatform}`);
567
- continue;
568
- }
569
-
570
- if (
571
- typeof parsedCompatibilityManifest.nodeMin !== 'string'
572
- || !/^\d+(\.\d+)?$/.test(parsedCompatibilityManifest.nodeMin)
573
- ) {
574
- fail(`Compatibility manifest for ${skillDomainDirectoryName} must include string nodeMin (for example "18" or "18.0")`);
575
- continue;
576
- }
577
-
578
- validManifestCount += 1;
579
- pass(`Compatibility manifest validated: .agent-context/skills/${skillDomainDirectoryName}/compatibility-manifest.json`);
515
+ if (checklistFileNames.length <= 2) {
516
+ pass(`Checklist count is consolidated (${checklistFileNames.length}/2)`);
517
+ } else {
518
+ fail(`Checklist count exceeds limit (${checklistFileNames.length}/2): ${checklistFileNames.join(', ')}`);
580
519
  }
581
520
 
582
- if (validManifestCount >= 6) {
583
- pass(`Compatibility manifest coverage is valid (${validManifestCount} skill domains)`);
584
- } else {
585
- fail(`Compatibility manifest coverage is insufficient (${validManifestCount}/6 skill domains)`);
521
+ for (const expectedChecklistFileName of expectedChecklistFileNames) {
522
+ if (checklistFileNames.includes(expectedChecklistFileName)) {
523
+ pass(`Checklist exists: .agent-context/review-checklists/${expectedChecklistFileName}`);
524
+ } else {
525
+ fail(`Missing consolidated checklist: .agent-context/review-checklists/${expectedChecklistFileName}`);
526
+ }
586
527
  }
587
528
  }
588
529
 
@@ -833,9 +774,6 @@ async function validateDocumentationFlow() {
833
774
 
834
775
  const readmeContent = await readTextFile(README_PATH);
835
776
  const requiredReadmeSnippets = [
836
- 'GitHub Template',
837
- 'scripts/init-project.ps1',
838
- 'scripts/init-project.sh',
839
777
  'npx @ryuenn3123/agentic-senior-core init',
840
778
  'npm run validate',
841
779
  'docs/faq.md',
@@ -1021,6 +959,90 @@ async function validateStackResearchEngineCoverage() {
1021
959
  }
1022
960
  }
1023
961
 
962
+ async function validateUniversalSopConsolidationCoverage() {
963
+ console.log('\nChecking Universal SOP consolidation coverage...');
964
+
965
+ for (const coverageRule of REQUIRED_UNIVERSAL_SOP_SNIPPETS) {
966
+ const absoluteCoveragePath = join(ROOT_DIR, coverageRule.path);
967
+
968
+ if (!(await fileExists(absoluteCoveragePath))) {
969
+ fail(`Missing Universal SOP source: ${coverageRule.path}`);
970
+ continue;
971
+ }
972
+
973
+ const coverageContent = await readTextFile(absoluteCoveragePath);
974
+ for (const requiredSnippet of coverageRule.snippets) {
975
+ if (coverageContent.includes(requiredSnippet)) {
976
+ pass(`${coverageRule.path} includes Universal SOP snippet: ${requiredSnippet}`);
977
+ } else {
978
+ fail(`${coverageRule.path} is missing Universal SOP snippet: ${requiredSnippet}`);
979
+ }
980
+ }
981
+ }
982
+ }
983
+
984
+ async function validateTemplateFreeBootstrapCoverage() {
985
+ console.log('\nChecking template-free dynamic bootstrap coverage...');
986
+
987
+ for (const coverageRule of REQUIRED_TEMPLATE_FREE_BOOTSTRAP_SNIPPETS) {
988
+ const absoluteCoveragePath = join(ROOT_DIR, coverageRule.path);
989
+
990
+ if (!(await fileExists(absoluteCoveragePath))) {
991
+ fail(`Missing template-free bootstrap source: ${coverageRule.path}`);
992
+ continue;
993
+ }
994
+
995
+ const coverageContent = await readTextFile(absoluteCoveragePath);
996
+ for (const requiredSnippet of coverageRule.snippets) {
997
+ if (coverageContent.includes(requiredSnippet)) {
998
+ pass(`${coverageRule.path} includes template-free bootstrap snippet: ${requiredSnippet}`);
999
+ } else {
1000
+ fail(`${coverageRule.path} is missing template-free bootstrap snippet: ${requiredSnippet}`);
1001
+ }
1002
+ }
1003
+ }
1004
+
1005
+ for (const forbiddenRule of FORBIDDEN_TEMPLATE_BOOTSTRAP_SNIPPETS) {
1006
+ const absoluteForbiddenPath = join(ROOT_DIR, forbiddenRule.path);
1007
+
1008
+ if (!(await fileExists(absoluteForbiddenPath))) {
1009
+ fail(`Missing template-free bootstrap source: ${forbiddenRule.path}`);
1010
+ continue;
1011
+ }
1012
+
1013
+ const forbiddenContent = await readTextFile(absoluteForbiddenPath);
1014
+ for (const forbiddenSnippet of forbiddenRule.snippets) {
1015
+ if (forbiddenContent.includes(forbiddenSnippet)) {
1016
+ fail(`${forbiddenRule.path} must not include active template snippet: ${forbiddenSnippet}`);
1017
+ } else {
1018
+ pass(`${forbiddenRule.path} excludes active template snippet: ${forbiddenSnippet}`);
1019
+ }
1020
+ }
1021
+ }
1022
+ }
1023
+
1024
+ async function validateDeterministicBoundaryEnforcementCoverage() {
1025
+ console.log('\nChecking deterministic boundary enforcement coverage...');
1026
+
1027
+ for (const coverageRule of REQUIRED_DETERMINISTIC_BOUNDARY_ENFORCEMENT_SNIPPETS) {
1028
+ const absoluteCoveragePath = join(ROOT_DIR, coverageRule.path);
1029
+
1030
+ if (!(await fileExists(absoluteCoveragePath))) {
1031
+ fail(`Missing deterministic boundary source: ${coverageRule.path}`);
1032
+ continue;
1033
+ }
1034
+
1035
+ const coverageContent = await readTextFile(absoluteCoveragePath);
1036
+ for (const requiredSnippet of coverageRule.snippets) {
1037
+ if (coverageContent.includes(requiredSnippet)) {
1038
+ pass(`${coverageRule.path} includes deterministic boundary snippet: ${requiredSnippet}`);
1039
+ } else {
1040
+ fail(`${coverageRule.path} is missing deterministic boundary snippet: ${requiredSnippet}`);
1041
+ }
1042
+ }
1043
+ }
1044
+ }
1045
+
1024
1046
  function isNormalizedMetricValue(value) {
1025
1047
  return Number.isFinite(Number(value)) && Number(value) >= 0 && Number(value) <= 1;
1026
1048
  }
@@ -1220,100 +1242,29 @@ async function validateInstructionAdapters() {
1220
1242
  }
1221
1243
  }
1222
1244
 
1223
- async function validateTrustTierSchema() {
1224
- console.log('\nChecking marketplace trust tier schema...');
1245
+ async function validateSkillPurgeSurface() {
1246
+ console.log('\nChecking skill and tier purge surface...');
1225
1247
 
1226
- const trustTierPath = join(AGENT_CONTEXT_DIR, 'marketplace', 'trust-tiers.json');
1227
- const trustTierContent = await readTextFile(trustTierPath);
1228
- const trustTierSchema = JSON.parse(trustTierContent);
1229
-
1230
- const expectedTierNames = ['verified', 'community', 'experimental'];
1231
- for (const expectedTierName of expectedTierNames) {
1232
- if (trustTierSchema.tiers?.[expectedTierName]) {
1233
- pass(`Trust tier "${expectedTierName}" is defined`);
1234
- } else {
1235
- fail(`Trust tier "${expectedTierName}" is missing from trust-tiers.json`);
1236
- }
1237
- }
1238
-
1239
- const scorecardDimensions = trustTierSchema.scorecard?.dimensions;
1240
- if (!scorecardDimensions || typeof scorecardDimensions !== 'object') {
1241
- fail('Trust tier scorecard must define dimensions');
1242
- return;
1243
- }
1244
-
1245
- const dimensionNames = Object.keys(scorecardDimensions);
1246
- let totalWeight = 0;
1247
-
1248
- for (const dimensionName of dimensionNames) {
1249
- const dimensionWeight = scorecardDimensions[dimensionName].weight;
1250
- if (typeof dimensionWeight !== 'number' || dimensionWeight <= 0) {
1251
- fail(`Scorecard dimension "${dimensionName}" must have a positive weight`);
1252
- continue;
1253
- }
1254
- totalWeight += dimensionWeight;
1255
- pass(`Scorecard dimension "${dimensionName}" weight: ${dimensionWeight}`);
1256
- }
1257
-
1258
- if (totalWeight === 100) {
1259
- pass(`Scorecard weights sum to 100`);
1248
+ const skillDirectoryPath = join(AGENT_CONTEXT_DIR, 'skills');
1249
+ if (await fileExists(skillDirectoryPath)) {
1250
+ fail('Skills directory must be removed: .agent-context/skills');
1260
1251
  } else {
1261
- fail(`Scorecard weights must sum to 100 (got ${totalWeight})`);
1252
+ pass('Skills directory removed: .agent-context/skills');
1262
1253
  }
1263
1254
 
1264
- for (const dimensionName of dimensionNames) {
1265
- const gates = scorecardDimensions[dimensionName].gates;
1266
- if (!Array.isArray(gates) || gates.length === 0) {
1267
- fail(`Scorecard dimension "${dimensionName}" must define at least one gate`);
1268
- continue;
1269
- }
1270
- pass(`Scorecard dimension "${dimensionName}" has ${gates.length} gates`);
1271
- }
1255
+ const retiredFiles = [
1256
+ join(ROOT_DIR, 'lib', 'cli', 'skill-selector.mjs'),
1257
+ join(ROOT_DIR, 'scripts', 'skill-tier-policy.mjs'),
1258
+ join(ROOT_DIR, 'scripts', 'trust-scorer.mjs'),
1259
+ ];
1272
1260
 
1273
- for (const [tierName, tierDefinition] of Object.entries(trustTierSchema.tiers)) {
1274
- if (typeof tierDefinition.minimumScore !== 'number') {
1275
- fail(`Tier "${tierName}" must define a numeric minimumScore`);
1276
- continue;
1261
+ for (const retiredFilePath of retiredFiles) {
1262
+ const relativeRetiredPath = relative(ROOT_DIR, retiredFilePath).replace(/\\/g, '/');
1263
+ if (await fileExists(retiredFilePath)) {
1264
+ fail(`Retired file still present: ${relativeRetiredPath}`);
1265
+ } else {
1266
+ pass(`Retired file removed: ${relativeRetiredPath}`);
1277
1267
  }
1278
- pass(`Tier "${tierName}" minimumScore: ${tierDefinition.minimumScore}`);
1279
- }
1280
- }
1281
-
1282
- async function validateEvidenceBundles() {
1283
- console.log('\nChecking skill evidence bundles and trust scores...');
1284
-
1285
- const skillsDir = join(AGENT_CONTEXT_DIR, 'skills');
1286
- const skillDirs = (await readdir(skillsDir, { withFileTypes: true }))
1287
- .filter(dirent => dirent.isDirectory())
1288
- .map(dirent => dirent.name);
1289
-
1290
- const requiredVerifiedSkillNames = new Set([
1291
- 'cli',
1292
- 'frontend',
1293
- 'fullstack',
1294
- 'distribution',
1295
- 'review-quality',
1296
- ]);
1297
-
1298
- for (const skillName of skillDirs) {
1299
- try {
1300
- const result = await calculateTrustScore(join(skillsDir, skillName));
1301
-
1302
- if (requiredVerifiedSkillNames.has(skillName)) {
1303
- if (result.tier === 'verified') {
1304
- pass(`Skill "${skillName}" achieved Verified trust tier (Score: ${result.score})`);
1305
- } else {
1306
- fail(`Skill "${skillName}" failed to reach Verified tier. Got ${result.tier} (Score: ${result.score})`);
1307
- continue;
1308
- }
1309
-
1310
- continue;
1311
- }
1312
-
1313
- pass(`Skill "${skillName}" parses successfully as ${result.tier} tier`);
1314
- } catch (err) {
1315
- fail(`Skill "${skillName}" scorer crashed: ${err.message}`);
1316
- }
1317
1268
  }
1318
1269
  }
1319
1270
 
@@ -1325,8 +1276,7 @@ async function main() {
1325
1276
  await validateRequiredFiles();
1326
1277
  await validateMarkdownFiles();
1327
1278
  await validateRuleFiles();
1328
- await validateSkillTierQuality();
1329
- await validateSkillCompatibilityManifests();
1279
+ await validateChecklistConsolidation();
1330
1280
  await validateOverrideGovernance();
1331
1281
  await validateAgentsManifest();
1332
1282
  await validateCrossReferences();
@@ -1337,12 +1287,14 @@ async function main() {
1337
1287
  await validateTerminologyMapping();
1338
1288
  await validateDetectionTransparencyCoverage();
1339
1289
  await validateStackResearchEngineCoverage();
1290
+ await validateUniversalSopConsolidationCoverage();
1291
+ await validateTemplateFreeBootstrapCoverage();
1292
+ await validateDeterministicBoundaryEnforcementCoverage();
1340
1293
  await validateStackResearchSnapshotState();
1341
1294
  await validateMcpConfiguration();
1342
1295
  await validateHumanWritingGovernance();
1343
1296
  await validateInstructionAdapters();
1344
- await validateTrustTierSchema();
1345
- await validateEvidenceBundles();
1297
+ await validateSkillPurgeSurface();
1346
1298
 
1347
1299
  console.log('\n===============================================');
1348
1300
  console.log(' RESULTS');