pumuki 6.3.128 → 6.3.129

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.
@@ -63,6 +63,9 @@ export const normalizeSnapshotRulesCoverage = (
63
63
  const matchedRuleIds = normalizeStringArray(value.matched_rule_ids);
64
64
  const unevaluatedRuleIds = normalizeStringArray(value.unevaluated_rule_ids);
65
65
  const unsupportedAutoRuleIds = normalizeStringArray(value.unsupported_auto_rule_ids ?? []);
66
+ const unsupportedDetectorRuleIds = normalizeStringArray(
67
+ value.unsupported_detector_rule_ids ?? []
68
+ );
66
69
  const stageApplicableAutoRuleIds = normalizeStringArray(
67
70
  value.stage_applicable_auto_rule_ids ?? []
68
71
  );
@@ -80,6 +83,10 @@ export const normalizeSnapshotRulesCoverage = (
80
83
  unsupportedAutoRuleIds.length,
81
84
  normalizeCount(value.counts?.unsupported_auto ?? 0)
82
85
  );
86
+ const unsupportedDetectorCount = Math.max(
87
+ unsupportedDetectorRuleIds.length,
88
+ normalizeCount(value.counts?.unsupported_detector ?? 0)
89
+ );
83
90
 
84
91
  const counts: SnapshotRulesCoverage['counts'] = {
85
92
  active: Math.max(derivedCounts.active, normalizeCount(value.counts?.active ?? 0)),
@@ -103,6 +110,9 @@ export const normalizeSnapshotRulesCoverage = (
103
110
  if (unsupportedAutoCount > 0) {
104
111
  counts.unsupported_auto = unsupportedAutoCount;
105
112
  }
113
+ if (unsupportedDetectorCount > 0) {
114
+ counts.unsupported_detector = unsupportedDetectorCount;
115
+ }
106
116
 
107
117
  const ratioFromCounts = createCoverageRatio(counts.active, counts.evaluated);
108
118
  const coverageRatio = normalizeCoverageRatio(
@@ -146,6 +156,9 @@ export const normalizeSnapshotRulesCoverage = (
146
156
  if (unsupportedAutoRuleIds.length > 0 || unsupportedAutoCount > 0) {
147
157
  normalized.unsupported_auto_rule_ids = unsupportedAutoRuleIds;
148
158
  }
159
+ if (unsupportedDetectorRuleIds.length > 0 || unsupportedDetectorCount > 0) {
160
+ normalized.unsupported_detector_rule_ids = unsupportedDetectorRuleIds;
161
+ }
149
162
 
150
163
  return normalized;
151
164
  };
@@ -54,6 +54,7 @@ export type SnapshotRulesCoverage = {
54
54
  matched_rule_ids: string[];
55
55
  unevaluated_rule_ids: string[];
56
56
  unsupported_auto_rule_ids?: string[];
57
+ unsupported_detector_rule_ids?: string[];
57
58
  registry_totals?: {
58
59
  total: number;
59
60
  auto: number;
@@ -72,6 +73,7 @@ export type SnapshotRulesCoverage = {
72
73
  registry_declarative?: number;
73
74
  stage_applicable_auto?: number;
74
75
  unsupported_auto?: number;
76
+ unsupported_detector?: number;
75
77
  };
76
78
  coverage_ratio: number;
77
79
  };
@@ -220,13 +220,25 @@ const toRulesCoverageBlockingFinding = (params: {
220
220
 
221
221
  const toSkillsUnsupportedAutoRulesBlockingFinding = (params: {
222
222
  stage: 'PRE_COMMIT' | 'PRE_PUSH' | 'CI';
223
+ filesScanned: number;
223
224
  unsupportedAutoRuleIds: ReadonlyArray<string>;
225
+ unsupportedDetectorRuleIds?: ReadonlyArray<string>;
224
226
  }): Finding | undefined => {
225
- if (params.unsupportedAutoRuleIds.length === 0) {
227
+ if (params.filesScanned === 0) {
226
228
  return undefined;
227
229
  }
228
230
 
229
- const unsupportedAutoRuleIds = [...params.unsupportedAutoRuleIds].sort().join(', ');
231
+ const unsupportedRuleIds = [
232
+ ...new Set([
233
+ ...params.unsupportedAutoRuleIds,
234
+ ...(params.unsupportedDetectorRuleIds ?? []),
235
+ ]),
236
+ ].sort();
237
+ if (unsupportedRuleIds.length === 0) {
238
+ return undefined;
239
+ }
240
+
241
+ const unsupportedRuleIdsToken = unsupportedRuleIds.join(', ');
230
242
 
231
243
  return {
232
244
  ruleId: 'governance.skills.detector-mapping.incomplete',
@@ -234,8 +246,8 @@ const toSkillsUnsupportedAutoRulesBlockingFinding = (params: {
234
246
  code: 'SKILLS_DETECTOR_MAPPING_INCOMPLETE_HIGH',
235
247
  message:
236
248
  `Skills detector mapping incomplete at ${params.stage}: ` +
237
- `unsupported_auto_rule_ids=[${unsupportedAutoRuleIds}]. ` +
238
- 'Map every AUTO skill rule to an AST detector before proceeding.',
249
+ `unsupported_detector_rule_ids=[${unsupportedRuleIdsToken}]. ` +
250
+ 'Map every skill rule to an intelligent AST detector before proceeding; DECLARATIVE is not an acceptable final coverage state.',
239
251
  filePath: '.ai_evidence.json',
240
252
  matchedBy: 'SkillsDetectorMappingGuard',
241
253
  source: 'skills-detector-mapping',
@@ -993,7 +1005,9 @@ export async function runPlatformGate(params: {
993
1005
  params.policy.stage === 'CI'
994
1006
  ? toSkillsUnsupportedAutoRulesBlockingFinding({
995
1007
  stage: params.policy.stage,
1008
+ filesScanned,
996
1009
  unsupportedAutoRuleIds: skillsRuleSet.unsupportedAutoRuleIds ?? [],
1010
+ unsupportedDetectorRuleIds: skillsRuleSet.unsupportedDetectorRuleIds ?? [],
997
1011
  })
998
1012
  : undefined;
999
1013
  const effectiveUnsupportedSkillsMappingFinding = applySkillsFindingEnforcement(
@@ -1138,6 +1152,13 @@ export async function runPlatformGate(params: {
1138
1152
  unsupported_auto_rule_ids: [...(skillsRuleSet.unsupportedAutoRuleIds ?? [])],
1139
1153
  }
1140
1154
  : {}),
1155
+ ...((skillsRuleSet.unsupportedDetectorRuleIds?.length ?? 0) > 0
1156
+ ? {
1157
+ unsupported_detector_rule_ids: [
1158
+ ...(skillsRuleSet.unsupportedDetectorRuleIds ?? []),
1159
+ ],
1160
+ }
1161
+ : {}),
1141
1162
  counts: {
1142
1163
  active: coverage.activeRuleIds.length,
1143
1164
  evaluated: coverage.evaluatedRuleIds.length,
@@ -1158,6 +1179,12 @@ export async function runPlatformGate(params: {
1158
1179
  unsupported_auto: (skillsRuleSet.unsupportedAutoRuleIds ?? []).length,
1159
1180
  }
1160
1181
  : {}),
1182
+ ...((skillsRuleSet.unsupportedDetectorRuleIds?.length ?? 0) > 0
1183
+ ? {
1184
+ unsupported_detector:
1185
+ (skillsRuleSet.unsupportedDetectorRuleIds ?? []).length,
1186
+ }
1187
+ : {}),
1161
1188
  },
1162
1189
  coverage_ratio:
1163
1190
  coverage.activeRuleIds.length === 0
@@ -50,8 +50,8 @@ export const resolveGitAtomicityEnforcement = (): GitAtomicityEnforcementResolut
50
50
  };
51
51
  }
52
52
  return {
53
- mode: 'advisory',
53
+ mode: 'strict',
54
54
  source: 'default',
55
- blocking: false,
55
+ blocking: true,
56
56
  };
57
57
  };
@@ -58,8 +58,8 @@ export const resolveHeuristicsEnforcement = (): HeuristicsEnforcementResolution
58
58
  };
59
59
  }
60
60
  return {
61
- mode: 'advisory',
61
+ mode: 'strict',
62
62
  source: 'default',
63
- blocking: false,
63
+ blocking: true,
64
64
  };
65
65
  };
@@ -50,8 +50,8 @@ export const resolveSddCompletenessEnforcement = (): SddCompletenessEnforcementR
50
50
  };
51
51
  }
52
52
  return {
53
- mode: 'advisory',
53
+ mode: 'strict',
54
54
  source: 'default',
55
- blocking: false,
55
+ blocking: true,
56
56
  };
57
57
  };
@@ -48,8 +48,8 @@ export const resolveSkillsEnforcement = (): SkillsEnforcementResolution => {
48
48
  };
49
49
  }
50
50
  return {
51
- mode: 'advisory',
51
+ mode: 'strict',
52
52
  source: 'default',
53
- blocking: false,
53
+ blocking: true,
54
54
  };
55
55
  };
@@ -52,9 +52,9 @@ export const resolveTddBddEnforcement = (): TddBddEnforcementResolution => {
52
52
  };
53
53
  }
54
54
  return {
55
- mode: 'advisory',
55
+ mode: 'strict',
56
56
  source: 'default',
57
- blocking: false,
57
+ blocking: true,
58
58
  };
59
59
  };
60
60
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.128",
3
+ "version": "6.3.129",
4
4
  "description": "Enterprise-grade AST Intelligence System with multi-platform support (iOS, Android, Backend, Frontend) and Feature-First + DDD + Clean Architecture enforcement. Includes dynamic violations API for intelligent querying.",
5
5
  "main": "index.js",
6
6
  "bin": {