pumuki 6.3.85 → 6.3.87
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.
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
## 2026-04-20 (v6.3.87)
|
|
2
|
+
- Cierra el segundo tramo de PUM-026: si PRE_WRITE solo arregla el receipt MCP y el gate pasa a verde, fuerza un refresh de paridad contra PRE_COMMIT antes del veredicto final.
|
|
3
|
+
- Rollout recomendado: actualizar Flux_training y repetir la repro mínima de validate/pre-commit/.ai_evidence.
|
|
4
|
+
|
|
1
5
|
# Release Notes (v2.x line)
|
|
2
6
|
|
|
3
7
|
This file tracks the active deterministic framework line used in this repository.
|
|
@@ -6,6 +10,12 @@ This file keeps only the operational highlights and rollout notes that matter wh
|
|
|
6
10
|
|
|
7
11
|
## 2026-04 (CLI stability and macOS notifications)
|
|
8
12
|
|
|
13
|
+
### 2026-04-20 (v6.3.86)
|
|
14
|
+
|
|
15
|
+
- **Paridad de gate real**: `pumuki sdd validate --stage=PRE_WRITE --json` deja de devolver verde falso cuando el hook real bloquearía por evidencia o findings staged; ahora fuerza refresh de evidencia incluso si el `aiGate` inicial llega en `ALLOWED`.
|
|
16
|
+
- **Evidencia consistente**: el envelope final de `validate` usa el resultado refrescado y `.ai_evidence.json` queda en `BLOCK` cuando el rojo real del consumer persiste.
|
|
17
|
+
- **Rollout recomendado**: publicar `pumuki@6.3.86`, repin inmediato en `Flux_training` y revalidar con un rojo frontend staged (`validate PRE_WRITE`, `pre-commit`, `.ai_evidence.json`, `status`, `doctor`).
|
|
18
|
+
|
|
9
19
|
### 2026-04-20 (v6.3.85)
|
|
10
20
|
|
|
11
21
|
- **Tracking con viñeta reconocido**: el enforcement ya cuenta correctamente `- [🚧] - tarea` como única tarea activa válida en el MD canónico, eliminando falsos `count=0` en consumers que usan ese formato.
|
|
@@ -35,7 +35,6 @@ import {
|
|
|
35
35
|
type PreWriteOpenSpecBootstrapTrace,
|
|
36
36
|
buildPreWriteExperimentalDisabledResult,
|
|
37
37
|
buildSddExperimentalEnableAdvisoryCommand,
|
|
38
|
-
runRawPreWriteAiGateCheck,
|
|
39
38
|
PRE_WRITE_ENABLE_STRICT_COMMAND,
|
|
40
39
|
} from './cli';
|
|
41
40
|
|
|
@@ -196,15 +195,9 @@ export const runSddCommand = async (parsed: ParsedArgs, activeDependencies: Life
|
|
|
196
195
|
automationTrace.attempted = auto.trace.attempted;
|
|
197
196
|
automationTrace.actions = auto.trace.actions;
|
|
198
197
|
}
|
|
199
|
-
const rawPreWriteAiGate = result.stage === 'PRE_WRITE' && aiGate
|
|
200
|
-
? runRawPreWriteAiGateCheck({
|
|
201
|
-
repoRoot: process.cwd(),
|
|
202
|
-
requireMcpReceipt: true,
|
|
203
|
-
})
|
|
204
|
-
: null;
|
|
205
198
|
const nextAction = resolvePreWriteNextAction({
|
|
206
199
|
sdd: result,
|
|
207
|
-
aiGate
|
|
200
|
+
aiGate,
|
|
208
201
|
});
|
|
209
202
|
const sddExperimentalNextAction =
|
|
210
203
|
!aiGate && result.decision.code === 'SDD_EXPERIMENTAL_DISABLED'
|
|
@@ -216,10 +209,10 @@ export const runSddCommand = async (parsed: ParsedArgs, activeDependencies: Life
|
|
|
216
209
|
if (parsed.json) {
|
|
217
210
|
writeInfo(
|
|
218
211
|
JSON.stringify(
|
|
219
|
-
(
|
|
212
|
+
(aiGate)
|
|
220
213
|
? buildPreWriteValidationEnvelope(
|
|
221
214
|
result,
|
|
222
|
-
|
|
215
|
+
aiGate!,
|
|
223
216
|
preWriteEnforcement,
|
|
224
217
|
experimentalFeatures,
|
|
225
218
|
policyValidation,
|
|
@@ -98,7 +98,7 @@ export const buildPreWriteAutomationTrace = async (params: {
|
|
|
98
98
|
attempted: false,
|
|
99
99
|
actions: [],
|
|
100
100
|
};
|
|
101
|
-
if (params.sdd.stage !== 'PRE_WRITE'
|
|
101
|
+
if (params.sdd.stage !== 'PRE_WRITE') {
|
|
102
102
|
return {
|
|
103
103
|
aiGate: params.aiGate,
|
|
104
104
|
trace,
|
|
@@ -106,6 +106,42 @@ export const buildPreWriteAutomationTrace = async (params: {
|
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
let aiGate = params.aiGate;
|
|
109
|
+
if (aiGate.allowed) {
|
|
110
|
+
trace.attempted = true;
|
|
111
|
+
try {
|
|
112
|
+
const gateExitCode = await params.runPlatformGate({
|
|
113
|
+
policy: {
|
|
114
|
+
stage: 'PRE_COMMIT',
|
|
115
|
+
blockOnOrAbove: 'ERROR',
|
|
116
|
+
warnOnOrAbove: 'WARN',
|
|
117
|
+
},
|
|
118
|
+
scope: {
|
|
119
|
+
kind: 'workingTree',
|
|
120
|
+
},
|
|
121
|
+
auditMode: 'gate',
|
|
122
|
+
dependencies: {
|
|
123
|
+
printGateFindings: () => {},
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
trace.actions.push({
|
|
127
|
+
action: 'refresh_evidence',
|
|
128
|
+
status: 'OK',
|
|
129
|
+
details: `stage=PRE_COMMIT runPlatformGate exit_code=${gateExitCode} parity_probe=allowed_initial`,
|
|
130
|
+
});
|
|
131
|
+
aiGate = activeDependencies.runEnterpriseAiGateCheck({
|
|
132
|
+
repoRoot: params.repoRoot,
|
|
133
|
+
stage: 'PRE_WRITE',
|
|
134
|
+
requireMcpReceipt: true,
|
|
135
|
+
}).result;
|
|
136
|
+
} catch (error) {
|
|
137
|
+
trace.actions.push({
|
|
138
|
+
action: 'refresh_evidence',
|
|
139
|
+
status: 'FAILED',
|
|
140
|
+
details: error instanceof Error ? error.message : 'Unknown PRE_COMMIT parity refresh error',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
109
145
|
if (hasAutoFixableEvidenceViolation(aiGate)) {
|
|
110
146
|
trace.attempted = true;
|
|
111
147
|
try {
|
|
@@ -202,6 +238,32 @@ export const buildPreWriteAutomationTrace = async (params: {
|
|
|
202
238
|
stage: 'PRE_WRITE',
|
|
203
239
|
requireMcpReceipt: true,
|
|
204
240
|
}).result;
|
|
241
|
+
if (aiGate.allowed) {
|
|
242
|
+
const gateExitCode = await params.runPlatformGate({
|
|
243
|
+
policy: {
|
|
244
|
+
stage: 'PRE_COMMIT',
|
|
245
|
+
blockOnOrAbove: 'ERROR',
|
|
246
|
+
warnOnOrAbove: 'WARN',
|
|
247
|
+
},
|
|
248
|
+
scope: {
|
|
249
|
+
kind: 'workingTree',
|
|
250
|
+
},
|
|
251
|
+
auditMode: 'gate',
|
|
252
|
+
dependencies: {
|
|
253
|
+
printGateFindings: () => {},
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
trace.actions.push({
|
|
257
|
+
action: 'refresh_evidence',
|
|
258
|
+
status: 'OK',
|
|
259
|
+
details: `stage=PRE_COMMIT runPlatformGate exit_code=${gateExitCode} parity_probe=allowed_after_mcp_receipt_refresh`,
|
|
260
|
+
});
|
|
261
|
+
aiGate = activeDependencies.runEnterpriseAiGateCheck({
|
|
262
|
+
repoRoot: params.repoRoot,
|
|
263
|
+
stage: 'PRE_WRITE',
|
|
264
|
+
requireMcpReceipt: true,
|
|
265
|
+
}).result;
|
|
266
|
+
}
|
|
205
267
|
} catch (error) {
|
|
206
268
|
trace.actions.push({
|
|
207
269
|
action: 'refresh_mcp_receipt',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pumuki",
|
|
3
|
-
"version": "6.3.
|
|
3
|
+
"version": "6.3.87",
|
|
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": {
|