@nac3/forge-cli 1.23.7 → 1.24.1
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/dist/chat/claude.d.ts +8 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts +23 -0
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +76 -2
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/doctrine_digest.d.ts.map +1 -1
- package/dist/chat/doctrine_digest.js +2 -1
- package/dist/chat/doctrine_digest.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +11 -0
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/pending.d.ts +11 -0
- package/dist/chat/tools/pending.d.ts.map +1 -1
- package/dist/chat/tools/pending.js +55 -8
- package/dist/chat/tools/pending.js.map +1 -1
- package/dist/chat/tools/shell.d.ts +39 -4
- package/dist/chat/tools/shell.d.ts.map +1 -1
- package/dist/chat/tools/shell.js +167 -7
- package/dist/chat/tools/shell.js.map +1 -1
- package/dist/chat/tools/urazuke.d.ts.map +1 -1
- package/dist/chat/tools/urazuke.js +8 -5
- package/dist/chat/tools/urazuke.js.map +1 -1
- package/dist/chat/urazuke_section.d.ts +26 -4
- package/dist/chat/urazuke_section.d.ts.map +1 -1
- package/dist/chat/urazuke_section.js +115 -9
- package/dist/chat/urazuke_section.js.map +1 -1
- package/dist/commands/pending.d.ts.map +1 -1
- package/dist/commands/pending.js +116 -12
- package/dist/commands/pending.js.map +1 -1
- package/dist/commands/urazuke.d.ts +3 -0
- package/dist/commands/urazuke.d.ts.map +1 -1
- package/dist/commands/urazuke.js +80 -3
- package/dist/commands/urazuke.js.map +1 -1
- package/dist/core/ascii_purity.d.ts +69 -0
- package/dist/core/ascii_purity.d.ts.map +1 -0
- package/dist/core/ascii_purity.js +141 -0
- package/dist/core/ascii_purity.js.map +1 -0
- package/dist/core/battery_stamp.d.ts +111 -0
- package/dist/core/battery_stamp.d.ts.map +1 -0
- package/dist/core/battery_stamp.js +287 -0
- package/dist/core/battery_stamp.js.map +1 -0
- package/dist/core/ci_gaps.d.ts +130 -0
- package/dist/core/ci_gaps.d.ts.map +1 -0
- package/dist/core/ci_gaps.js +353 -0
- package/dist/core/ci_gaps.js.map +1 -0
- package/dist/core/doc_citations.d.ts +133 -0
- package/dist/core/doc_citations.d.ts.map +1 -0
- package/dist/core/doc_citations.js +271 -0
- package/dist/core/doc_citations.js.map +1 -0
- package/dist/core/hook_budget.d.ts +60 -0
- package/dist/core/hook_budget.d.ts.map +1 -0
- package/dist/core/hook_budget.js +163 -0
- package/dist/core/hook_budget.js.map +1 -0
- package/dist/docs/doctrine/urazuke.md +173 -2
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +28 -2
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/pending/store.d.ts +29 -0
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +51 -1
- package/dist/pending/store.js.map +1 -1
- package/dist/pending/types.d.ts +23 -0
- package/dist/pending/types.d.ts.map +1 -1
- package/dist/pending/types.js.map +1 -1
- package/dist/telemetry/usage.d.ts +18 -0
- package/dist/telemetry/usage.d.ts.map +1 -1
- package/dist/telemetry/usage.js +16 -1
- package/dist/telemetry/usage.js.map +1 -1
- package/dist/urazuke/announce.d.ts +7 -0
- package/dist/urazuke/announce.d.ts.map +1 -1
- package/dist/urazuke/announce.js +20 -0
- package/dist/urazuke/announce.js.map +1 -1
- package/dist/urazuke/catalog.d.ts +1 -1
- package/dist/urazuke/catalog.d.ts.map +1 -1
- package/dist/urazuke/catalog.js.map +1 -1
- package/dist/urazuke/close_gate.d.ts +31 -4
- package/dist/urazuke/close_gate.d.ts.map +1 -1
- package/dist/urazuke/close_gate.js +70 -13
- package/dist/urazuke/close_gate.js.map +1 -1
- package/dist/urazuke/current.d.ts +28 -0
- package/dist/urazuke/current.d.ts.map +1 -1
- package/dist/urazuke/current.js +18 -5
- package/dist/urazuke/current.js.map +1 -1
- package/dist/urazuke/cycle.d.ts +3 -0
- package/dist/urazuke/cycle.d.ts.map +1 -1
- package/dist/urazuke/cycle.js +5 -3
- package/dist/urazuke/cycle.js.map +1 -1
- package/dist/urazuke/evidence.d.ts +14 -1
- package/dist/urazuke/evidence.d.ts.map +1 -1
- package/dist/urazuke/evidence.js +88 -2
- package/dist/urazuke/evidence.js.map +1 -1
- package/dist/urazuke/evidence_env.d.ts +78 -0
- package/dist/urazuke/evidence_env.d.ts.map +1 -0
- package/dist/urazuke/evidence_env.js +341 -0
- package/dist/urazuke/evidence_env.js.map +1 -0
- package/dist/urazuke/freeze.d.ts.map +1 -1
- package/dist/urazuke/freeze.js +16 -9
- package/dist/urazuke/freeze.js.map +1 -1
- package/dist/urazuke/gate.d.ts +48 -0
- package/dist/urazuke/gate.d.ts.map +1 -1
- package/dist/urazuke/gate.js +251 -25
- package/dist/urazuke/gate.js.map +1 -1
- package/dist/urazuke/gates_data.d.ts +30 -3
- package/dist/urazuke/gates_data.d.ts.map +1 -1
- package/dist/urazuke/gates_data.js +51 -5
- package/dist/urazuke/gates_data.js.map +1 -1
- package/dist/urazuke/gates_pull.d.ts +40 -0
- package/dist/urazuke/gates_pull.d.ts.map +1 -1
- package/dist/urazuke/gates_pull.js +118 -8
- package/dist/urazuke/gates_pull.js.map +1 -1
- package/dist/urazuke/manual_cases.d.ts +11 -1
- package/dist/urazuke/manual_cases.d.ts.map +1 -1
- package/dist/urazuke/manual_cases.js +1 -0
- package/dist/urazuke/manual_cases.js.map +1 -1
- package/dist/urazuke/overrides.d.ts +107 -0
- package/dist/urazuke/overrides.d.ts.map +1 -0
- package/dist/urazuke/overrides.js +128 -0
- package/dist/urazuke/overrides.js.map +1 -0
- package/dist/urazuke/probes.d.ts.map +1 -1
- package/dist/urazuke/probes.js +51 -0
- package/dist/urazuke/probes.js.map +1 -1
- package/dist/urazuke/profiles.d.ts +135 -0
- package/dist/urazuke/profiles.d.ts.map +1 -0
- package/dist/urazuke/profiles.js +470 -0
- package/dist/urazuke/profiles.js.map +1 -0
- package/dist/urazuke/receipt_audit.d.ts +67 -0
- package/dist/urazuke/receipt_audit.d.ts.map +1 -0
- package/dist/urazuke/receipt_audit.js +103 -0
- package/dist/urazuke/receipt_audit.js.map +1 -0
- package/dist/urazuke/receipts.d.ts +22 -0
- package/dist/urazuke/receipts.d.ts.map +1 -1
- package/dist/urazuke/receipts.js +44 -0
- package/dist/urazuke/receipts.js.map +1 -1
- package/dist/urazuke/report.d.ts +30 -0
- package/dist/urazuke/report.d.ts.map +1 -1
- package/dist/urazuke/report.js +39 -0
- package/dist/urazuke/report.js.map +1 -1
- package/dist/urazuke/reset.d.ts +35 -0
- package/dist/urazuke/reset.d.ts.map +1 -0
- package/dist/urazuke/reset.js +150 -0
- package/dist/urazuke/reset.js.map +1 -0
- package/dist/urazuke/retro.d.ts +5 -1
- package/dist/urazuke/retro.d.ts.map +1 -1
- package/dist/urazuke/retro.js +21 -8
- package/dist/urazuke/retro.js.map +1 -1
- package/dist/urazuke/section.d.ts.map +1 -1
- package/dist/urazuke/section.js +17 -2
- package/dist/urazuke/section.js.map +1 -1
- package/dist/urazuke/semantics.d.ts +173 -0
- package/dist/urazuke/semantics.d.ts.map +1 -0
- package/dist/urazuke/semantics.js +232 -0
- package/dist/urazuke/semantics.js.map +1 -0
- package/dist/urazuke/start.d.ts +8 -0
- package/dist/urazuke/start.d.ts.map +1 -1
- package/dist/urazuke/start.js +10 -2
- package/dist/urazuke/start.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/orchestrator.d.ts.map +1 -1
- package/dist/workflow/orchestrator.js +6 -7
- package/dist/workflow/orchestrator.js.map +1 -1
- package/docs/doctrine/urazuke.md +173 -2
- package/package.json +9 -2
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EL EJE DE LOS PERFILES -- los tres evaluadores que faltaban (Pieza 6,
|
|
3
|
+
* D-044).
|
|
4
|
+
*
|
|
5
|
+
* La definicion publicada (schema 2) declara doce evaluadores y esta
|
|
6
|
+
* instalacion contaba nueve. Los tres que faltaban son el eje de los perfiles,
|
|
7
|
+
* y son REQUERIDOS en tres anclas del lazo de construccion: `pendings_profiles`
|
|
8
|
+
* en el peldano 5, `profile_matrix` en el 8 y `manual_cases_per_profile` en el
|
|
9
|
+
* 10. Mientras no existan, adoptar la definicion publicada congela tres
|
|
10
|
+
* peldanos permanentemente inmedibles.
|
|
11
|
+
*
|
|
12
|
+
* LA REGLA QUE COMPARTEN LOS TRES, y que decidio cada eleccion de abajo
|
|
13
|
+
* (dueno, 2026-11-01): lo que sostiene cada condicion es que LA MATRIZ SEA
|
|
14
|
+
* EL PRODUCTOR. Un evaluador que se conforma con que el artefacto exista
|
|
15
|
+
* certifica que alguien escribio un archivo, no que la matriz lo produjo. De
|
|
16
|
+
* ahi que la huella de la navegacion se RECALCULE y nunca se lea, y de ahi
|
|
17
|
+
* que la lista de alcanzado se compare contra la fila en las DOS
|
|
18
|
+
* direcciones.
|
|
19
|
+
*
|
|
20
|
+
* LO QUE ESTA DECLARADO POR EL METODO (y aca solo se implementa):
|
|
21
|
+
* profile_matrix "the functionality-by-profile matrix exists and
|
|
22
|
+
* is consistent: every functionality has at least
|
|
23
|
+
* one profile, every profile has at least one
|
|
24
|
+
* functionality and its entry point, and
|
|
25
|
+
* navigation is derived from the matrix rather
|
|
26
|
+
* than hand-written. And for every profile, the
|
|
27
|
+
* end-to-end test compares what is reachable
|
|
28
|
+
* against its row: neither less nor more."
|
|
29
|
+
* manual_cases_per_profile "every manual test case was run once per
|
|
30
|
+
* affected profile, derived from the matrix. A
|
|
31
|
+
* case run with a single profile does not count
|
|
32
|
+
* as executed."
|
|
33
|
+
* pendings_profiles "every pending item that touches a screen
|
|
34
|
+
* declares its functional convergence group, the
|
|
35
|
+
* profiles that have it and one acceptance
|
|
36
|
+
* criterion per profile. Without that declaration
|
|
37
|
+
* the pending item does not pass the step."
|
|
38
|
+
* Y las cuatro columnas de la matriz las fija el Anexo H B2: funcionalidad,
|
|
39
|
+
* hogar, perfiles, ruta de entrada, "nada mas".
|
|
40
|
+
*
|
|
41
|
+
* LO QUE ES CONVENCION DE FORGE, dicho para que no se lea como del metodo:
|
|
42
|
+
* las RUTAS de los dos artefactos derivados (.forge/profile-navigation.json
|
|
43
|
+
* y .forge/profile-reachability.json) y la forma de sus campos. El metodo
|
|
44
|
+
* declara QUE hay que comparar, no donde lo deja el proyecto. Los mensajes
|
|
45
|
+
* rojos nombran la ruta para que nadie tenga que adivinarla.
|
|
46
|
+
*
|
|
47
|
+
* ASCII-only.
|
|
48
|
+
*/
|
|
49
|
+
import fs from 'node:fs/promises';
|
|
50
|
+
import path from 'node:path';
|
|
51
|
+
import { createHash } from 'node:crypto';
|
|
52
|
+
export const MATRIX_REL = 'docs/PROFILE_MATRIX.md';
|
|
53
|
+
export const NAVIGATION_REL = '.forge/profile-navigation.json';
|
|
54
|
+
export const REACHABILITY_REL = '.forge/profile-reachability.json';
|
|
55
|
+
const COLUMN_SYNONYMS = [
|
|
56
|
+
['functionality', /funcionalidad|functionality/i],
|
|
57
|
+
['home', /hogar|home/i],
|
|
58
|
+
['profiles', /perfil|profile/i],
|
|
59
|
+
['entry_point', /ruta de entrada|entry ?point|entrada/i],
|
|
60
|
+
];
|
|
61
|
+
function splitRow(line) {
|
|
62
|
+
return line.replace(/^\s*\|/, '').replace(/\|\s*$/, '').split('|').map((c) => c.trim());
|
|
63
|
+
}
|
|
64
|
+
/** La matriz, leida de la tabla markdown que trae las cuatro columnas.
|
|
65
|
+
*
|
|
66
|
+
* Se busca por CABECERA y no por posicion: una tabla con las columnas en
|
|
67
|
+
* otro orden es la misma matriz, y una tabla cualquiera del documento no lo
|
|
68
|
+
* es. Si ninguna tabla tiene las cuatro, eso es un problema nombrado -- no
|
|
69
|
+
* una matriz vacia. */
|
|
70
|
+
export function parseProfileMatrix(markdown) {
|
|
71
|
+
const lines = markdown.split(/\r?\n/);
|
|
72
|
+
const problems = [];
|
|
73
|
+
for (let i = 0; i < lines.length; i++) {
|
|
74
|
+
const line = lines[i];
|
|
75
|
+
if (!line.includes('|'))
|
|
76
|
+
continue;
|
|
77
|
+
const header = splitRow(line);
|
|
78
|
+
if (header.length < 4)
|
|
79
|
+
continue;
|
|
80
|
+
const index = {};
|
|
81
|
+
for (const [key, re] of COLUMN_SYNONYMS) {
|
|
82
|
+
const at = header.findIndex((h) => re.test(h));
|
|
83
|
+
if (at >= 0 && index[key] == null)
|
|
84
|
+
index[key] = at;
|
|
85
|
+
}
|
|
86
|
+
const missing = COLUMN_SYNONYMS.filter(([k]) => index[k] == null).map(([k]) => k);
|
|
87
|
+
if (missing.length)
|
|
88
|
+
continue;
|
|
89
|
+
/* La linea siguiente tiene que ser el separador de la tabla. */
|
|
90
|
+
const sep = lines[i + 1] ?? '';
|
|
91
|
+
if (!/^\s*\|?\s*:?-{2,}/.test(sep))
|
|
92
|
+
continue;
|
|
93
|
+
const rows = [];
|
|
94
|
+
for (let j = i + 2; j < lines.length; j++) {
|
|
95
|
+
const body = lines[j];
|
|
96
|
+
if (!body.includes('|'))
|
|
97
|
+
break;
|
|
98
|
+
const cells = splitRow(body);
|
|
99
|
+
if (cells.length < 4)
|
|
100
|
+
break;
|
|
101
|
+
const get = (k) => (cells[index[k]] ?? '').trim();
|
|
102
|
+
const functionality = get('functionality');
|
|
103
|
+
if (!functionality)
|
|
104
|
+
continue;
|
|
105
|
+
rows.push({
|
|
106
|
+
functionality,
|
|
107
|
+
home: get('home'),
|
|
108
|
+
profiles: get('profiles').split(/[,;/]/).map((p) => p.trim()).filter(Boolean),
|
|
109
|
+
entry_point: get('entry_point'),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (!rows.length)
|
|
113
|
+
problems.push('la matriz tiene las cuatro columnas y ninguna fila');
|
|
114
|
+
return { rows, problems };
|
|
115
|
+
}
|
|
116
|
+
problems.push('ninguna tabla de ' + MATRIX_REL + ' trae las cuatro columnas del Anexo H B2'
|
|
117
|
+
+ ' (funcionalidad, hogar, perfiles, ruta de entrada)');
|
|
118
|
+
return { rows: [], problems };
|
|
119
|
+
}
|
|
120
|
+
/** Los perfiles que la matriz nombra, ordenados. */
|
|
121
|
+
export function profilesOf(m) {
|
|
122
|
+
return [...new Set(m.rows.flatMap((r) => r.profiles))].sort();
|
|
123
|
+
}
|
|
124
|
+
/** Las funcionalidades que un perfil tiene, segun su fila. */
|
|
125
|
+
export function functionalitiesFor(m, profile) {
|
|
126
|
+
return m.rows.filter((r) => r.profiles.includes(profile)).map((r) => r.functionality).sort();
|
|
127
|
+
}
|
|
128
|
+
/* ---------------- la huella de la navegacion (UX-10) ---------------- */
|
|
129
|
+
/** La huella, AUTODESCRIPTA. Misma regla que el congelado y que el sello de
|
|
130
|
+
* la bateria: una huella que no se puede reproducir desde afuera no es
|
|
131
|
+
* evidencia, asi que la definicion viaja con el dato.
|
|
132
|
+
*
|
|
133
|
+
* Y la condicion que decide si sirve (dueno, 2026-11-01): la huella se
|
|
134
|
+
* RECALCULA desde la matriz y se compara contra la que el artefacto
|
|
135
|
+
* declara. Leer la declarada y compararla consigo misma daria verde sobre
|
|
136
|
+
* cualquier archivo. */
|
|
137
|
+
export const NAVIGATION_FINGERPRINT_SPEC = {
|
|
138
|
+
algorithm: 'sha256',
|
|
139
|
+
encoding: 'utf8',
|
|
140
|
+
canonical_form: 'una linea por fila, "<funcionalidad>|<hogar>|<perfil,perfil>|<ruta de entrada>",'
|
|
141
|
+
+ ' perfiles ordenados alfabeticamente, filas ordenadas por funcionalidad, unidas por \\n',
|
|
142
|
+
covers: 'las cuatro columnas de cada fila de ' + MATRIX_REL,
|
|
143
|
+
excludes: 'el orden de las filas en el documento, la prosa alrededor de la tabla,'
|
|
144
|
+
+ ' el formato del markdown y todo lo que el artefacto generado agregue por su cuenta',
|
|
145
|
+
};
|
|
146
|
+
export function navigationCanonicalForm(m) {
|
|
147
|
+
return [...m.rows]
|
|
148
|
+
.map((r) => [r.functionality, r.home, [...r.profiles].sort().join(','), r.entry_point].join('|'))
|
|
149
|
+
.sort()
|
|
150
|
+
.join('\n');
|
|
151
|
+
}
|
|
152
|
+
export function navigationFingerprint(m) {
|
|
153
|
+
return createHash('sha256').update(navigationCanonicalForm(m), 'utf8').digest('hex');
|
|
154
|
+
}
|
|
155
|
+
export async function readJsonArtifact(root, rel) {
|
|
156
|
+
try {
|
|
157
|
+
return JSON.parse(await fs.readFile(path.join(root, rel), 'utf8'));
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export async function readProfileMatrix(root) {
|
|
164
|
+
try {
|
|
165
|
+
return parseProfileMatrix(await fs.readFile(path.join(root, MATRIX_REL), 'utf8'));
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return { rows: [], problems: ['falta ' + MATRIX_REL + ': sin matriz no hay de donde derivar'
|
|
169
|
+
+ ' la navegacion, los perfiles de un pendiente ni los perfiles afectados de un caso'] };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** `profile_matrix` -- el peldano 8. */
|
|
173
|
+
export function checkProfileMatrix(input) {
|
|
174
|
+
const { matrix } = input;
|
|
175
|
+
const out = [];
|
|
176
|
+
if (matrix.problems.length || !matrix.rows.length) {
|
|
177
|
+
return [{
|
|
178
|
+
label: 'la matriz de funcionalidad por perfil',
|
|
179
|
+
status: 'fail',
|
|
180
|
+
path: MATRIX_REL,
|
|
181
|
+
detail: matrix.problems.join('; ') || 'la matriz no tiene filas',
|
|
182
|
+
}];
|
|
183
|
+
}
|
|
184
|
+
out.push({
|
|
185
|
+
label: 'la matriz de funcionalidad por perfil',
|
|
186
|
+
status: 'ok',
|
|
187
|
+
path: MATRIX_REL,
|
|
188
|
+
detail: matrix.rows.length + ' funcionalidades, ' + profilesOf(matrix).length + ' perfiles',
|
|
189
|
+
});
|
|
190
|
+
/* 1. consistencia, en los dos sentidos que el metodo nombra. */
|
|
191
|
+
const noProfile = matrix.rows.filter((r) => !r.profiles.length).map((r) => r.functionality);
|
|
192
|
+
out.push(noProfile.length
|
|
193
|
+
? {
|
|
194
|
+
label: 'cada funcionalidad tiene al menos un perfil',
|
|
195
|
+
status: 'fail', path: MATRIX_REL,
|
|
196
|
+
detail: 'sin perfil: ' + noProfile.join(', '),
|
|
197
|
+
}
|
|
198
|
+
: { label: 'cada funcionalidad tiene al menos un perfil', status: 'ok', detail: 'las ' + matrix.rows.length });
|
|
199
|
+
const profiles = profilesOf(matrix);
|
|
200
|
+
const noEntry = profiles.filter((p) => !matrix.rows
|
|
201
|
+
.some((r) => r.profiles.includes(p) && r.entry_point.trim() !== ''));
|
|
202
|
+
out.push(noEntry.length
|
|
203
|
+
? {
|
|
204
|
+
label: 'cada perfil tiene funcionalidad y ruta de entrada',
|
|
205
|
+
status: 'fail', path: MATRIX_REL,
|
|
206
|
+
detail: 'sin ruta de entrada: ' + noEntry.join(', '),
|
|
207
|
+
}
|
|
208
|
+
: { label: 'cada perfil tiene funcionalidad y ruta de entrada', status: 'ok', detail: profiles.join(', ') });
|
|
209
|
+
/* 2. la navegacion DERIVADA de la matriz (UX-10). */
|
|
210
|
+
const expected = navigationFingerprint(matrix);
|
|
211
|
+
const nav = input.navigation;
|
|
212
|
+
if (!nav) {
|
|
213
|
+
out.push({
|
|
214
|
+
label: 'la navegacion se deriva de la matriz',
|
|
215
|
+
status: 'fail', path: NAVIGATION_REL,
|
|
216
|
+
detail: 'falta ' + NAVIGATION_REL + ': lo que esta condicion protege es que la matriz sea'
|
|
217
|
+
+ ' el PRODUCTOR, y una navegacion escrita a mano no se distingue de una generada sin'
|
|
218
|
+
+ ' el artefacto y su huella. Huella esperada ahora: ' + expected.slice(0, 12),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
else if (!nav.fingerprint?.value) {
|
|
222
|
+
out.push({
|
|
223
|
+
label: 'la navegacion se deriva de la matriz',
|
|
224
|
+
status: 'fail', path: NAVIGATION_REL,
|
|
225
|
+
detail: NAVIGATION_REL + ' no declara ninguna huella: sin huella no hay forma de ver la deriva',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const spec = nav.fingerprint;
|
|
230
|
+
const missingSpec = ['algorithm', 'encoding', 'canonical_form', 'covers', 'excludes']
|
|
231
|
+
.filter((k) => !String(spec[k] ?? '').trim());
|
|
232
|
+
if (missingSpec.length) {
|
|
233
|
+
out.push({
|
|
234
|
+
label: 'la huella de la navegacion es autodescripta',
|
|
235
|
+
status: 'fail', path: NAVIGATION_REL,
|
|
236
|
+
detail: 'la huella no declara ' + missingSpec.join(', ')
|
|
237
|
+
+ ': una huella que no se puede reproducir desde afuera no es evidencia',
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
out.push({ label: 'la huella de la navegacion es autodescripta', status: 'ok', detail: spec.algorithm });
|
|
242
|
+
}
|
|
243
|
+
/* RECALCULADA, nunca leida: comparar la declarada consigo misma daria
|
|
244
|
+
* verde sobre cualquier archivo. */
|
|
245
|
+
out.push(spec.value === expected
|
|
246
|
+
? {
|
|
247
|
+
label: 'la navegacion se deriva de la matriz',
|
|
248
|
+
status: 'ok', path: NAVIGATION_REL,
|
|
249
|
+
detail: 'huella recalculada ' + expected.slice(0, 12) + ' = la declarada',
|
|
250
|
+
}
|
|
251
|
+
: {
|
|
252
|
+
label: 'la navegacion se deriva de la matriz',
|
|
253
|
+
status: 'fail', path: NAVIGATION_REL,
|
|
254
|
+
detail: 'la huella declarada (' + String(spec.value).slice(0, 12) + ') no es la que la matriz'
|
|
255
|
+
+ ' produce ahora (' + expected.slice(0, 12) + '): la navegacion quedo de una version'
|
|
256
|
+
+ ' anterior de la matriz, o no salio de la matriz',
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/* 3. lo alcanzable por perfil, en las DOS direcciones (UX-12). */
|
|
260
|
+
const reach = input.reachability;
|
|
261
|
+
if (!reach?.per_profile) {
|
|
262
|
+
out.push({
|
|
263
|
+
label: 'el e2e compara lo alcanzable contra la fila de cada perfil',
|
|
264
|
+
status: 'fail', path: REACHABILITY_REL,
|
|
265
|
+
detail: 'falta ' + REACHABILITY_REL + ': con un test que solo nombra el perfil pasa un test'
|
|
266
|
+
+ ' que no verifica nada. El artefacto lista lo ALCANZADO por perfil, con el id del recibo',
|
|
267
|
+
});
|
|
268
|
+
return out;
|
|
269
|
+
}
|
|
270
|
+
for (const profile of profiles) {
|
|
271
|
+
const entry = reach.per_profile[profile];
|
|
272
|
+
const expectedFns = functionalitiesFor(matrix, profile);
|
|
273
|
+
if (!entry) {
|
|
274
|
+
out.push({
|
|
275
|
+
label: 'perfil ' + profile + ': corrida e2e',
|
|
276
|
+
status: 'fail', kind: 'missing', path: REACHABILITY_REL,
|
|
277
|
+
detail: 'sin resultado para ' + profile + ': la matriz le da ' + expectedFns.length
|
|
278
|
+
+ ' funcionalidades y nadie midio que las alcance',
|
|
279
|
+
});
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
/* El recibo: el artefacto declara el id y el evaluador lo contrasta
|
|
283
|
+
* contra el registro. Un artefacto sin recibo es prosa. */
|
|
284
|
+
if (!entry.receipt) {
|
|
285
|
+
out.push({
|
|
286
|
+
label: 'perfil ' + profile + ': recibo e2e',
|
|
287
|
+
status: 'fail', kind: 'missing', path: REACHABILITY_REL,
|
|
288
|
+
detail: 'el resultado de ' + profile + ' no declara ningun recibo',
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
else if (!input.receipts) {
|
|
292
|
+
out.push({
|
|
293
|
+
label: 'perfil ' + profile + ': recibo e2e',
|
|
294
|
+
status: 'unknown',
|
|
295
|
+
detail: 'el artefacto declara ' + entry.receipt + ' y el registro de recibos no se'
|
|
296
|
+
+ ' consulto en esta corrida: no se pudo mirar, y eso no es verde',
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
const rc = input.receipts.find((r) => r.id === entry.receipt);
|
|
301
|
+
out.push(rc && rc.kind === 'e2e' && rc.verdict === 'ok'
|
|
302
|
+
? { label: 'perfil ' + profile + ': recibo e2e', status: 'ok', detail: entry.receipt }
|
|
303
|
+
: {
|
|
304
|
+
label: 'perfil ' + profile + ': recibo e2e',
|
|
305
|
+
status: 'fail', kind: 'missing',
|
|
306
|
+
detail: !rc
|
|
307
|
+
? 'el artefacto declara el recibo ' + entry.receipt + ' y el registro no lo tiene'
|
|
308
|
+
: 'el recibo ' + entry.receipt + ' es kind=' + rc.kind + ' verdict=' + rc.verdict
|
|
309
|
+
+ ': hace falta un e2e en verde',
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
const reached = [...new Set(entry.reached ?? [])];
|
|
313
|
+
const less = expectedFns.filter((f) => !reached.includes(f));
|
|
314
|
+
const more = reached.filter((f) => !expectedFns.includes(f));
|
|
315
|
+
/* LAS DOS DIRECCIONES NO SON LO MISMO, y no se juntan en un rojo que
|
|
316
|
+
* diga "la fila no coincide" (dueno, 2026-11-01). */
|
|
317
|
+
if (less.length) {
|
|
318
|
+
out.push({
|
|
319
|
+
label: 'perfil ' + profile + ': alcanza su fila',
|
|
320
|
+
status: 'fail', kind: 'missing', path: REACHABILITY_REL,
|
|
321
|
+
detail: 'FALTANTE -- la construccion esta incompleta: ' + profile + ' no alcanza '
|
|
322
|
+
+ less.join(', '),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
if (more.length) {
|
|
326
|
+
out.push({
|
|
327
|
+
label: 'perfil ' + profile + ': no alcanza mas que su fila',
|
|
328
|
+
status: 'fail', kind: 'authorization', path: REACHABILITY_REL,
|
|
329
|
+
detail: 'DEFECTO DE AUTORIZACION (gravedad ALTA por definicion escrita) -- ' + profile
|
|
330
|
+
+ ' llega a donde no debe: ' + more.join(', ') + '. No es "la fila no coincide"',
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
if (!less.length && !more.length) {
|
|
334
|
+
out.push({
|
|
335
|
+
label: 'perfil ' + profile + ': ni menos ni mas que su fila',
|
|
336
|
+
status: 'ok',
|
|
337
|
+
detail: reached.length + ' funcionalidades, exactamente las de la fila',
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return out;
|
|
342
|
+
}
|
|
343
|
+
/** `pendings_profiles` -- el peldano 5. */
|
|
344
|
+
export function checkPendingsProfiles(p) {
|
|
345
|
+
if (!p) {
|
|
346
|
+
return [{
|
|
347
|
+
label: 'pendientes con su eje de perfiles',
|
|
348
|
+
status: 'unknown',
|
|
349
|
+
detail: 'el registro de pendientes no se consulto en esta corrida (no se inyecto la sonda):'
|
|
350
|
+
+ ' no se pudo mirar, y eso no es ni verde ni la firma del dueno',
|
|
351
|
+
}];
|
|
352
|
+
}
|
|
353
|
+
const out = [];
|
|
354
|
+
if (p.undeclared.length) {
|
|
355
|
+
/* Tri-estado a proposito: un pendiente que no declara si toca pantalla
|
|
356
|
+
* no se lee como "no toca". Es la misma regla del cero: no mirar no es
|
|
357
|
+
* no haber. */
|
|
358
|
+
out.push({
|
|
359
|
+
label: 'cada pendiente declara si toca pantalla',
|
|
360
|
+
status: 'unknown',
|
|
361
|
+
detail: p.undeclared.length + ' pendientes no declaran touches_screen ('
|
|
362
|
+
+ p.undeclared.slice(0, 8).join(', ') + (p.undeclared.length > 8 ? ', ...' : '')
|
|
363
|
+
+ '): sin esa declaracion no se sabe a cuales les corresponde el eje de perfiles',
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
const incomplete = p.touching.filter((t) => t.missing.length);
|
|
367
|
+
if (incomplete.length) {
|
|
368
|
+
out.push({
|
|
369
|
+
label: 'cada pendiente que toca pantalla declara grupo, perfiles y criterio por perfil',
|
|
370
|
+
status: 'fail',
|
|
371
|
+
detail: incomplete.map((t) => t.id + ' (falta ' + t.missing.join(', ') + ')').join('; ')
|
|
372
|
+
+ ' -- sin esa declaracion el pendiente no pasa el peldano',
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
else if (p.touching.length) {
|
|
376
|
+
out.push({
|
|
377
|
+
label: 'cada pendiente que toca pantalla declara grupo, perfiles y criterio por perfil',
|
|
378
|
+
status: 'ok',
|
|
379
|
+
detail: p.touching.length + ' pendientes de pantalla, los ' + p.touching.length + ' completos',
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
else if (!p.undeclared.length) {
|
|
383
|
+
out.push({
|
|
384
|
+
label: 'cada pendiente que toca pantalla declara grupo, perfiles y criterio por perfil',
|
|
385
|
+
status: 'ok',
|
|
386
|
+
detail: 'ningun pendiente abierto declara tocar pantalla (plan de ' + p.plan + ' items)',
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
return out;
|
|
390
|
+
}
|
|
391
|
+
/** `manual_cases_per_profile` -- el peldano 10. */
|
|
392
|
+
export function checkManualCasesPerProfile(input) {
|
|
393
|
+
const { matrix, cases } = input;
|
|
394
|
+
if (matrix.problems.length || !matrix.rows.length) {
|
|
395
|
+
return [{
|
|
396
|
+
label: 'los casos manuales, una corrida por perfil afectado',
|
|
397
|
+
status: 'fail', path: MATRIX_REL,
|
|
398
|
+
detail: 'sin matriz no se pueden derivar los perfiles afectados: '
|
|
399
|
+
+ (matrix.problems.join('; ') || 'la matriz no tiene filas'),
|
|
400
|
+
}];
|
|
401
|
+
}
|
|
402
|
+
if (!cases.length) {
|
|
403
|
+
return [{
|
|
404
|
+
label: 'los casos manuales, una corrida por perfil afectado',
|
|
405
|
+
status: 'fail',
|
|
406
|
+
detail: 'el registro de casos manuales esta vacio: nadie firmo ningun caso',
|
|
407
|
+
}];
|
|
408
|
+
}
|
|
409
|
+
const out = [];
|
|
410
|
+
const noLink = [...new Set(cases.filter((c) => !c.functionality?.trim()).map((c) => c.rule))];
|
|
411
|
+
if (noLink.length) {
|
|
412
|
+
out.push({
|
|
413
|
+
label: 'cada caso dice que funcionalidad ejercita',
|
|
414
|
+
status: 'fail',
|
|
415
|
+
detail: 'sin funcionalidad: ' + noLink.join(', ') + ' -- los perfiles afectados se DERIVAN'
|
|
416
|
+
+ ' de la matriz, y sin el eslabon caso -> funcionalidad habria que confiar en un campo'
|
|
417
|
+
+ ' escrito a mano',
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
const byKey = new Map();
|
|
421
|
+
for (const c of cases) {
|
|
422
|
+
const fn = c.functionality?.trim();
|
|
423
|
+
if (!fn)
|
|
424
|
+
continue;
|
|
425
|
+
const key = c.rule + '|' + fn;
|
|
426
|
+
const entry = byKey.get(key) ?? { rule: c.rule, functionality: fn, profiles: new Set() };
|
|
427
|
+
if (c.profile)
|
|
428
|
+
entry.profiles.add(c.profile);
|
|
429
|
+
byKey.set(key, entry);
|
|
430
|
+
}
|
|
431
|
+
const unknownFn = [];
|
|
432
|
+
const missing = [];
|
|
433
|
+
let complete = 0;
|
|
434
|
+
for (const entry of byKey.values()) {
|
|
435
|
+
const row = matrix.rows.find((r) => r.functionality === entry.functionality);
|
|
436
|
+
if (!row) {
|
|
437
|
+
unknownFn.push(entry.rule + ' -> ' + entry.functionality);
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
const pending = row.profiles.filter((p) => !entry.profiles.has(p));
|
|
441
|
+
if (pending.length) {
|
|
442
|
+
missing.push(entry.rule + ' (' + entry.functionality + '): falta ' + pending.join(', ')
|
|
443
|
+
+ (entry.profiles.size <= 1
|
|
444
|
+
? ' -- un caso corrido con un solo perfil NO cuenta como ejecutado'
|
|
445
|
+
: ''));
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
complete++;
|
|
449
|
+
}
|
|
450
|
+
if (unknownFn.length) {
|
|
451
|
+
out.push({
|
|
452
|
+
label: 'la funcionalidad de cada caso esta en la matriz',
|
|
453
|
+
status: 'fail', path: MATRIX_REL,
|
|
454
|
+
detail: 'la matriz no tiene esa funcionalidad: ' + unknownFn.join('; '),
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
out.push(missing.length
|
|
458
|
+
? {
|
|
459
|
+
label: 'los casos manuales, una corrida por perfil afectado',
|
|
460
|
+
status: 'fail', kind: 'missing',
|
|
461
|
+
detail: missing.join(' | '),
|
|
462
|
+
}
|
|
463
|
+
: {
|
|
464
|
+
label: 'los casos manuales, una corrida por perfil afectado',
|
|
465
|
+
status: 'ok',
|
|
466
|
+
detail: complete + ' casos con una corrida por cada perfil afectado',
|
|
467
|
+
});
|
|
468
|
+
return out;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/urazuke/profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AUDITORIA DE RECIBOS YA PRODUCIDOS -- F-02c (pedido del dueno,
|
|
3
|
+
* 2026-11-01, segunda vuelta).
|
|
4
|
+
*
|
|
5
|
+
* LA PREGUNTA. El defecto F-02c era el runner de evidencia spawneando por
|
|
6
|
+
* cmd.exe sin las dos guardas: un comando con un salto de linea salia VERDE
|
|
7
|
+
* habiendo corrido solo la primera linea, y uno por encima del tope de
|
|
8
|
+
* cmd.exe se truncaba. Arreglado. Queda saber si algun recibio YA PRODUCIDO
|
|
9
|
+
* paso por ese camino, porque si paso, hay retrabajo.
|
|
10
|
+
*
|
|
11
|
+
* Y LA PREGUNTA DE LA PREGUNTA, que es la que decide si el numero vale.
|
|
12
|
+
* Palabras del dueno: "una medicion que puede informar cero tiene que
|
|
13
|
+
* distinguir cero porque no hay de cero porque no mire". La marca que se
|
|
14
|
+
* busca es el COMANDO TEXTUAL guardado en el recibo. Entonces un cero sobre
|
|
15
|
+
* 821 recibos solo significa "no hay" si los 821 registran el comando. Los
|
|
16
|
+
* que no lo registran NO son limpios: son no auditables por esta via, y eso
|
|
17
|
+
* se informa como un numero propio.
|
|
18
|
+
*
|
|
19
|
+
* Por eso esto es un modulo con casos y no un grep: el numero va a un
|
|
20
|
+
* paper.
|
|
21
|
+
*
|
|
22
|
+
* ASCII-only.
|
|
23
|
+
*/
|
|
24
|
+
/** El tope de una linea de comando en cmd.exe, medido en esta maquina el
|
|
25
|
+
* 2026-11-01: 8150 caracteres pasan, 8180 fallan. El limite documentado
|
|
26
|
+
* por Microsoft es 8191 incluyendo el `cmd /c `. */
|
|
27
|
+
export declare const CMD_LINE_CEILING = 8150;
|
|
28
|
+
export interface ReceiptAuditRow {
|
|
29
|
+
store: string;
|
|
30
|
+
id: string;
|
|
31
|
+
/** El recibo registra el comando textual (la marca que esta auditoria
|
|
32
|
+
* busca). `false` -> este recibo no se puede auditar por esta via. */
|
|
33
|
+
has_command: boolean;
|
|
34
|
+
/** El comando lleva un salto de linea: el camino que corria solo la
|
|
35
|
+
* primera linea y salia verde. */
|
|
36
|
+
multiline: boolean;
|
|
37
|
+
/** El comando pasa el tope de cmd.exe: el camino que se truncaba. */
|
|
38
|
+
over_ceiling: boolean;
|
|
39
|
+
length: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ReceiptAuditReport {
|
|
42
|
+
stores: number;
|
|
43
|
+
total: number;
|
|
44
|
+
/** Los que registran el comando: el denominador REAL de la auditoria. */
|
|
45
|
+
auditable: number;
|
|
46
|
+
/** Los que NO lo registran: el numero que acompana al cero. */
|
|
47
|
+
not_auditable: number;
|
|
48
|
+
multiline: ReceiptAuditRow[];
|
|
49
|
+
over_ceiling: ReceiptAuditRow[];
|
|
50
|
+
/** El recibo mas largo que se encontro, para que el margen contra el tope
|
|
51
|
+
* sea un dato y no una impresion. */
|
|
52
|
+
longest: ReceiptAuditRow | null;
|
|
53
|
+
/** Lo que no se pudo leer: un store ilegible no se cuenta como limpio. */
|
|
54
|
+
unreadable: Array<{
|
|
55
|
+
store: string;
|
|
56
|
+
reason: string;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
export interface RawStore {
|
|
60
|
+
store: string;
|
|
61
|
+
/** El JSON ya parseado, o el error de lectura. */
|
|
62
|
+
items?: Array<Record<string, unknown>>;
|
|
63
|
+
error?: string;
|
|
64
|
+
}
|
|
65
|
+
export declare function auditReceipts(stores: RawStore[]): ReceiptAuditReport;
|
|
66
|
+
export declare function renderReceiptAudit(r: ReceiptAuditReport): string;
|
|
67
|
+
//# sourceMappingURL=receipt_audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt_audit.d.ts","sourceRoot":"","sources":["../../src/urazuke/receipt_audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;qDAEqD;AACrD,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX;2EACuE;IACvE,WAAW,EAAE,OAAO,CAAC;IACrB;uCACmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC;0CACsC;IACtC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,0EAA0E;IAC1E,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAsCpE;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAiChE"}
|