@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.
- package/.agent-context/prompts/init-project.md +5 -5
- package/.agent-context/prompts/refactor.md +2 -1
- package/.agent-context/prompts/review-code.md +3 -2
- package/.agent-context/review-checklists/pr-checklist.md +8 -1
- package/.agent-context/rules/architecture.md +11 -0
- package/.agent-context/rules/frontend-architecture.md +2 -2
- package/.agent-context/state/architecture-map.md +1 -1
- package/.agent-context/state/memory-continuity-benchmark.json +1 -1
- package/.agents/workflows/init-project.md +3 -3
- package/.agents/workflows/refactor.md +1 -1
- package/.agents/workflows/review-code.md +4 -5
- package/.cursorrules +27 -71
- package/.gemini/instructions.md +6 -7
- package/.github/copilot-instructions.md +5 -6
- package/.windsurfrules +27 -71
- package/AGENTS.md +7 -9
- package/CONTRIBUTING.md +18 -31
- package/README.md +21 -4
- package/bin/agentic-senior-core.js +0 -6
- package/lib/cli/commands/init.mjs +113 -650
- package/lib/cli/commands/launch.mjs +1 -23
- package/lib/cli/commands/rollback.mjs +1 -1
- package/lib/cli/commands/upgrade.mjs +1 -23
- package/lib/cli/compiler.mjs +77 -72
- package/lib/cli/constants.mjs +84 -26
- package/lib/cli/init-architecture-flow.mjs +231 -0
- package/lib/cli/init-detection-flow.mjs +123 -0
- package/lib/cli/init-options.mjs +344 -0
- package/lib/cli/init-selection.mjs +100 -0
- package/lib/cli/preflight.mjs +1 -1
- package/lib/cli/profile-packs.mjs +15 -1
- package/lib/cli/project-scaffolder.mjs +18 -154
- package/lib/cli/utils.mjs +16 -12
- package/mcp.json +19 -19
- package/package.json +5 -2
- package/scripts/context-triggered-audit.mjs +18 -18
- package/scripts/documentation-boundary-audit.mjs +92 -5
- package/scripts/forbidden-content-check.mjs +1 -1
- package/scripts/frontend-usability-audit.mjs +21 -28
- package/scripts/governance-weekly-report.mjs +29 -15
- package/scripts/llm-judge.mjs +2 -5
- package/scripts/mcp-server.mjs +389 -5
- package/scripts/release-gate.mjs +121 -145
- package/scripts/sync-thin-adapters.mjs +161 -0
- package/scripts/v3-purge-audit.mjs +231 -0
- package/scripts/validate-evidence-bundle.mjs +1 -1
- package/scripts/validate.mjs +224 -272
- package/.agent-context/blueprints/api-nextjs.md +0 -184
- package/.agent-context/blueprints/aspnet-api.md +0 -247
- package/.agent-context/blueprints/ci-github-actions.md +0 -226
- package/.agent-context/blueprints/ci-gitlab.md +0 -200
- package/.agent-context/blueprints/fastapi-service.md +0 -210
- package/.agent-context/blueprints/go-service.md +0 -217
- package/.agent-context/blueprints/graphql-grpc-api.md +0 -51
- package/.agent-context/blueprints/infrastructure-as-code.md +0 -62
- package/.agent-context/blueprints/kubernetes-manifests.md +0 -76
- package/.agent-context/blueprints/laravel-api.md +0 -233
- package/.agent-context/blueprints/mobile-app.md +0 -91
- package/.agent-context/blueprints/nestjs-logic.md +0 -247
- package/.agent-context/blueprints/observability.md +0 -227
- package/.agent-context/blueprints/spring-boot-api.md +0 -218
- package/.agent-context/profiles/platform.md +0 -13
- package/.agent-context/profiles/regulated.md +0 -13
- package/.agent-context/profiles/startup.md +0 -13
- package/.agent-context/review-checklists/frontend-excellence-rubric.md +0 -73
- package/.agent-context/review-checklists/frontend-skill-parity.md +0 -29
- package/.agent-context/review-checklists/frontend-usability.md +0 -35
- package/.agent-context/review-checklists/marketplace-acceptance.md +0 -60
- package/.agent-context/review-checklists/performance-audit.md +0 -71
- package/.agent-context/review-checklists/release-operations.md +0 -33
- package/.agent-context/review-checklists/security-audit.md +0 -119
- package/.agent-context/skills/README.md +0 -63
- package/.agent-context/skills/backend/README.md +0 -68
- package/.agent-context/skills/backend/architecture.md +0 -361
- package/.agent-context/skills/backend/compatibility-manifest.json +0 -8
- package/.agent-context/skills/backend/data-access.md +0 -231
- package/.agent-context/skills/backend/errors.md +0 -138
- package/.agent-context/skills/backend/validation.md +0 -117
- package/.agent-context/skills/backend.md +0 -29
- package/.agent-context/skills/cli/.evidence/compatibility-manifest.json +0 -5
- package/.agent-context/skills/cli/.evidence/sbom-excerpt.json +0 -10
- package/.agent-context/skills/cli/.evidence/test-report.json +0 -8
- package/.agent-context/skills/cli/CHANGELOG.md +0 -6
- package/.agent-context/skills/cli/README.md +0 -56
- package/.agent-context/skills/cli/compatibility-manifest.json +0 -8
- package/.agent-context/skills/cli/init.md +0 -38
- package/.agent-context/skills/cli/output.md +0 -36
- package/.agent-context/skills/cli/package.json +0 -5
- package/.agent-context/skills/cli/safety-telemetry.md +0 -39
- package/.agent-context/skills/cli/tests/.gitkeep +0 -1
- package/.agent-context/skills/cli/upgrade.md +0 -38
- package/.agent-context/skills/cli.md +0 -32
- package/.agent-context/skills/distribution/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/distribution/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/distribution/.evidence/test-report.json +0 -8
- package/.agent-context/skills/distribution/CHANGELOG.md +0 -7
- package/.agent-context/skills/distribution/README.md +0 -27
- package/.agent-context/skills/distribution/compatibility-manifest.json +0 -8
- package/.agent-context/skills/distribution/compatibility.md +0 -32
- package/.agent-context/skills/distribution/package.json +0 -5
- package/.agent-context/skills/distribution/provenance-attestation.md +0 -47
- package/.agent-context/skills/distribution/publish.md +0 -37
- package/.agent-context/skills/distribution/rollback.md +0 -32
- package/.agent-context/skills/distribution/tests/.gitkeep +0 -1
- package/.agent-context/skills/distribution.md +0 -32
- package/.agent-context/skills/frontend/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/frontend/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/frontend/.evidence/test-report.json +0 -8
- package/.agent-context/skills/frontend/CHANGELOG.md +0 -7
- package/.agent-context/skills/frontend/README.md +0 -50
- package/.agent-context/skills/frontend/accessibility.md +0 -107
- package/.agent-context/skills/frontend/compatibility-manifest.json +0 -8
- package/.agent-context/skills/frontend/conversion-clarity.md +0 -51
- package/.agent-context/skills/frontend/motion.md +0 -67
- package/.agent-context/skills/frontend/package.json +0 -5
- package/.agent-context/skills/frontend/performance.md +0 -63
- package/.agent-context/skills/frontend/responsive-delivery.md +0 -41
- package/.agent-context/skills/frontend/tests/.gitkeep +0 -1
- package/.agent-context/skills/frontend/ui-architecture.md +0 -128
- package/.agent-context/skills/frontend.md +0 -40
- package/.agent-context/skills/fullstack/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/fullstack/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/fullstack/.evidence/test-report.json +0 -8
- package/.agent-context/skills/fullstack/CHANGELOG.md +0 -7
- package/.agent-context/skills/fullstack/README.md +0 -27
- package/.agent-context/skills/fullstack/compatibility-manifest.json +0 -8
- package/.agent-context/skills/fullstack/contracts.md +0 -53
- package/.agent-context/skills/fullstack/end-to-end.md +0 -42
- package/.agent-context/skills/fullstack/feature-slicing.md +0 -65
- package/.agent-context/skills/fullstack/package.json +0 -5
- package/.agent-context/skills/fullstack/release-coordination.md +0 -51
- package/.agent-context/skills/fullstack/tests/.gitkeep +0 -1
- package/.agent-context/skills/fullstack.md +0 -30
- package/.agent-context/skills/index.json +0 -107
- package/.agent-context/skills/review-quality/.evidence/compatibility-manifest.json +0 -9
- package/.agent-context/skills/review-quality/.evidence/sbom-excerpt.json +0 -6
- package/.agent-context/skills/review-quality/.evidence/test-report.json +0 -8
- package/.agent-context/skills/review-quality/CHANGELOG.md +0 -7
- package/.agent-context/skills/review-quality/README.md +0 -27
- package/.agent-context/skills/review-quality/benchmark.md +0 -30
- package/.agent-context/skills/review-quality/compatibility-manifest.json +0 -8
- package/.agent-context/skills/review-quality/package.json +0 -5
- package/.agent-context/skills/review-quality/planning.md +0 -38
- package/.agent-context/skills/review-quality/release-decision.md +0 -49
- package/.agent-context/skills/review-quality/security.md +0 -34
- package/.agent-context/skills/review-quality/tests/.gitkeep +0 -1
- package/.agent-context/skills/review-quality.md +0 -34
- package/.agent-context/stacks/csharp.md +0 -149
- package/.agent-context/stacks/flutter.md +0 -16
- package/.agent-context/stacks/go.md +0 -181
- package/.agent-context/stacks/java.md +0 -135
- package/.agent-context/stacks/php.md +0 -192
- package/.agent-context/stacks/python.md +0 -153
- package/.agent-context/stacks/react-native.md +0 -16
- package/.agent-context/stacks/ruby.md +0 -80
- package/.agent-context/stacks/rust.md +0 -86
- package/.agent-context/stacks/typescript.md +0 -317
- package/.agent-context/state/skill-platform.json +0 -38
- package/lib/cli/skill-selector.mjs +0 -232
- package/lib/cli/templates/api-contract.md.id.tmpl +0 -143
- package/lib/cli/templates/api-contract.md.tmpl +0 -143
- package/lib/cli/templates/architecture-decision-record.md.id.tmpl +0 -106
- package/lib/cli/templates/architecture-decision-record.md.tmpl +0 -145
- package/lib/cli/templates/database-schema.md.id.tmpl +0 -74
- package/lib/cli/templates/database-schema.md.tmpl +0 -74
- package/lib/cli/templates/flow-overview.md.id.tmpl +0 -118
- package/lib/cli/templates/flow-overview.md.tmpl +0 -131
- package/lib/cli/templates/project-brief.md.id.tmpl +0 -55
- package/lib/cli/templates/project-brief.md.tmpl +0 -79
- package/scripts/init-project.ps1 +0 -105
- package/scripts/init-project.sh +0 -131
- package/scripts/skill-tier-policy.mjs +0 -76
- package/scripts/trust-scorer.mjs +0 -119
package/scripts/validate.mjs
CHANGED
|
@@ -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/
|
|
143
|
-
'.agent-context/review-checklists/
|
|
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/
|
|
154
|
-
snippet: '
|
|
155
|
-
label: '
|
|
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,
|
|
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
|
-
'
|
|
428
|
-
'
|
|
429
|
-
'
|
|
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
|
|
464
|
-
console.log('\nChecking
|
|
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
|
|
524
|
-
const
|
|
525
|
-
|
|
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
|
-
|
|
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
|
-
|
|
566
|
-
|
|
567
|
-
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
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
|
|
1224
|
-
console.log('\nChecking
|
|
1245
|
+
async function validateSkillPurgeSurface() {
|
|
1246
|
+
console.log('\nChecking skill and tier purge surface...');
|
|
1225
1247
|
|
|
1226
|
-
const
|
|
1227
|
-
|
|
1228
|
-
|
|
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
|
-
|
|
1252
|
+
pass('Skills directory removed: .agent-context/skills');
|
|
1262
1253
|
}
|
|
1263
1254
|
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
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
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
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
|
|
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
|
|
1345
|
-
await validateEvidenceBundles();
|
|
1297
|
+
await validateSkillPurgeSurface();
|
|
1346
1298
|
|
|
1347
1299
|
console.log('\n===============================================');
|
|
1348
1300
|
console.log(' RESULTS');
|