@nac3/forge-cli 1.23.6 → 1.24.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 (166) hide show
  1. package/dist/bin/yf.js +0 -0
  2. package/dist/chat/claude.d.ts +8 -0
  3. package/dist/chat/claude.d.ts.map +1 -1
  4. package/dist/chat/claude.js.map +1 -1
  5. package/dist/chat/claude_cli.d.ts +23 -0
  6. package/dist/chat/claude_cli.d.ts.map +1 -1
  7. package/dist/chat/claude_cli.js +76 -2
  8. package/dist/chat/claude_cli.js.map +1 -1
  9. package/dist/chat/doctrine_digest.d.ts.map +1 -1
  10. package/dist/chat/doctrine_digest.js +2 -1
  11. package/dist/chat/doctrine_digest.js.map +1 -1
  12. package/dist/chat/server.d.ts.map +1 -1
  13. package/dist/chat/server.js +11 -0
  14. package/dist/chat/server.js.map +1 -1
  15. package/dist/chat/tools/pending.d.ts +11 -0
  16. package/dist/chat/tools/pending.d.ts.map +1 -1
  17. package/dist/chat/tools/pending.js +55 -8
  18. package/dist/chat/tools/pending.js.map +1 -1
  19. package/dist/chat/tools/shell.d.ts +39 -4
  20. package/dist/chat/tools/shell.d.ts.map +1 -1
  21. package/dist/chat/tools/shell.js +167 -7
  22. package/dist/chat/tools/shell.js.map +1 -1
  23. package/dist/chat/tools/urazuke.d.ts.map +1 -1
  24. package/dist/chat/tools/urazuke.js +8 -5
  25. package/dist/chat/tools/urazuke.js.map +1 -1
  26. package/dist/chat/urazuke_section.d.ts +26 -4
  27. package/dist/chat/urazuke_section.d.ts.map +1 -1
  28. package/dist/chat/urazuke_section.js +115 -9
  29. package/dist/chat/urazuke_section.js.map +1 -1
  30. package/dist/commands/pending.d.ts.map +1 -1
  31. package/dist/commands/pending.js +116 -12
  32. package/dist/commands/pending.js.map +1 -1
  33. package/dist/commands/urazuke.d.ts +3 -0
  34. package/dist/commands/urazuke.d.ts.map +1 -1
  35. package/dist/commands/urazuke.js +80 -3
  36. package/dist/commands/urazuke.js.map +1 -1
  37. package/dist/core/ascii_purity.d.ts +69 -0
  38. package/dist/core/ascii_purity.d.ts.map +1 -0
  39. package/dist/core/ascii_purity.js +141 -0
  40. package/dist/core/ascii_purity.js.map +1 -0
  41. package/dist/core/battery_stamp.d.ts +85 -0
  42. package/dist/core/battery_stamp.d.ts.map +1 -0
  43. package/dist/core/battery_stamp.js +237 -0
  44. package/dist/core/battery_stamp.js.map +1 -0
  45. package/dist/core/ci_gaps.d.ts +129 -0
  46. package/dist/core/ci_gaps.d.ts.map +1 -0
  47. package/dist/core/ci_gaps.js +352 -0
  48. package/dist/core/ci_gaps.js.map +1 -0
  49. package/dist/core/doc_citations.d.ts +133 -0
  50. package/dist/core/doc_citations.d.ts.map +1 -0
  51. package/dist/core/doc_citations.js +271 -0
  52. package/dist/core/doc_citations.js.map +1 -0
  53. package/dist/core/turn_classifier.d.ts +4 -3
  54. package/dist/core/turn_classifier.d.ts.map +1 -1
  55. package/dist/core/turn_classifier.js +65 -20
  56. package/dist/core/turn_classifier.js.map +1 -1
  57. package/dist/docs/doctrine/urazuke.md +173 -2
  58. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  59. package/dist/nac3/internal_manifest.js +28 -2
  60. package/dist/nac3/internal_manifest.js.map +1 -1
  61. package/dist/pending/store.d.ts +29 -0
  62. package/dist/pending/store.d.ts.map +1 -1
  63. package/dist/pending/store.js +51 -1
  64. package/dist/pending/store.js.map +1 -1
  65. package/dist/pending/types.d.ts +23 -0
  66. package/dist/pending/types.d.ts.map +1 -1
  67. package/dist/pending/types.js.map +1 -1
  68. package/dist/telemetry/usage.d.ts +18 -0
  69. package/dist/telemetry/usage.d.ts.map +1 -1
  70. package/dist/telemetry/usage.js +16 -1
  71. package/dist/telemetry/usage.js.map +1 -1
  72. package/dist/urazuke/announce.d.ts +7 -0
  73. package/dist/urazuke/announce.d.ts.map +1 -1
  74. package/dist/urazuke/announce.js +20 -0
  75. package/dist/urazuke/announce.js.map +1 -1
  76. package/dist/urazuke/catalog.d.ts +1 -1
  77. package/dist/urazuke/catalog.d.ts.map +1 -1
  78. package/dist/urazuke/catalog.js.map +1 -1
  79. package/dist/urazuke/close_gate.d.ts +31 -4
  80. package/dist/urazuke/close_gate.d.ts.map +1 -1
  81. package/dist/urazuke/close_gate.js +70 -13
  82. package/dist/urazuke/close_gate.js.map +1 -1
  83. package/dist/urazuke/current.d.ts +28 -0
  84. package/dist/urazuke/current.d.ts.map +1 -1
  85. package/dist/urazuke/current.js +18 -5
  86. package/dist/urazuke/current.js.map +1 -1
  87. package/dist/urazuke/cycle.d.ts +3 -0
  88. package/dist/urazuke/cycle.d.ts.map +1 -1
  89. package/dist/urazuke/cycle.js +5 -3
  90. package/dist/urazuke/cycle.js.map +1 -1
  91. package/dist/urazuke/evidence.d.ts +58 -1
  92. package/dist/urazuke/evidence.d.ts.map +1 -1
  93. package/dist/urazuke/evidence.js +203 -27
  94. package/dist/urazuke/evidence.js.map +1 -1
  95. package/dist/urazuke/evidence_env.d.ts +78 -0
  96. package/dist/urazuke/evidence_env.d.ts.map +1 -0
  97. package/dist/urazuke/evidence_env.js +341 -0
  98. package/dist/urazuke/evidence_env.js.map +1 -0
  99. package/dist/urazuke/freeze.d.ts.map +1 -1
  100. package/dist/urazuke/freeze.js +16 -9
  101. package/dist/urazuke/freeze.js.map +1 -1
  102. package/dist/urazuke/gate.d.ts +48 -0
  103. package/dist/urazuke/gate.d.ts.map +1 -1
  104. package/dist/urazuke/gate.js +251 -25
  105. package/dist/urazuke/gate.js.map +1 -1
  106. package/dist/urazuke/gates_data.d.ts +30 -3
  107. package/dist/urazuke/gates_data.d.ts.map +1 -1
  108. package/dist/urazuke/gates_data.js +51 -5
  109. package/dist/urazuke/gates_data.js.map +1 -1
  110. package/dist/urazuke/gates_pull.d.ts +40 -0
  111. package/dist/urazuke/gates_pull.d.ts.map +1 -1
  112. package/dist/urazuke/gates_pull.js +118 -8
  113. package/dist/urazuke/gates_pull.js.map +1 -1
  114. package/dist/urazuke/manual_cases.d.ts +11 -1
  115. package/dist/urazuke/manual_cases.d.ts.map +1 -1
  116. package/dist/urazuke/manual_cases.js +1 -0
  117. package/dist/urazuke/manual_cases.js.map +1 -1
  118. package/dist/urazuke/overrides.d.ts +107 -0
  119. package/dist/urazuke/overrides.d.ts.map +1 -0
  120. package/dist/urazuke/overrides.js +128 -0
  121. package/dist/urazuke/overrides.js.map +1 -0
  122. package/dist/urazuke/probes.d.ts.map +1 -1
  123. package/dist/urazuke/probes.js +51 -0
  124. package/dist/urazuke/probes.js.map +1 -1
  125. package/dist/urazuke/profiles.d.ts +135 -0
  126. package/dist/urazuke/profiles.d.ts.map +1 -0
  127. package/dist/urazuke/profiles.js +470 -0
  128. package/dist/urazuke/profiles.js.map +1 -0
  129. package/dist/urazuke/receipt_audit.d.ts +67 -0
  130. package/dist/urazuke/receipt_audit.d.ts.map +1 -0
  131. package/dist/urazuke/receipt_audit.js +103 -0
  132. package/dist/urazuke/receipt_audit.js.map +1 -0
  133. package/dist/urazuke/receipts.d.ts +22 -0
  134. package/dist/urazuke/receipts.d.ts.map +1 -1
  135. package/dist/urazuke/receipts.js +44 -0
  136. package/dist/urazuke/receipts.js.map +1 -1
  137. package/dist/urazuke/report.d.ts +30 -0
  138. package/dist/urazuke/report.d.ts.map +1 -1
  139. package/dist/urazuke/report.js +39 -0
  140. package/dist/urazuke/report.js.map +1 -1
  141. package/dist/urazuke/reset.d.ts +35 -0
  142. package/dist/urazuke/reset.d.ts.map +1 -0
  143. package/dist/urazuke/reset.js +150 -0
  144. package/dist/urazuke/reset.js.map +1 -0
  145. package/dist/urazuke/retro.d.ts +5 -1
  146. package/dist/urazuke/retro.d.ts.map +1 -1
  147. package/dist/urazuke/retro.js +21 -8
  148. package/dist/urazuke/retro.js.map +1 -1
  149. package/dist/urazuke/section.d.ts.map +1 -1
  150. package/dist/urazuke/section.js +17 -2
  151. package/dist/urazuke/section.js.map +1 -1
  152. package/dist/urazuke/semantics.d.ts +173 -0
  153. package/dist/urazuke/semantics.d.ts.map +1 -0
  154. package/dist/urazuke/semantics.js +232 -0
  155. package/dist/urazuke/semantics.js.map +1 -0
  156. package/dist/urazuke/start.d.ts +8 -0
  157. package/dist/urazuke/start.d.ts.map +1 -1
  158. package/dist/urazuke/start.js +10 -2
  159. package/dist/urazuke/start.js.map +1 -1
  160. package/dist/version.d.ts +1 -1
  161. package/dist/version.js +1 -1
  162. package/dist/workflow/orchestrator.d.ts.map +1 -1
  163. package/dist/workflow/orchestrator.js +6 -7
  164. package/dist/workflow/orchestrator.js.map +1 -1
  165. package/docs/doctrine/urazuke.md +173 -2
  166. package/package.json +24 -20
@@ -0,0 +1,107 @@
1
+ /**
2
+ * EL MOTIVO TIPADO DE UN CIERRE FORZADO -- M-02 (decision del dueno,
3
+ * 2026-11-01).
4
+ *
5
+ * DE DONDE SALE. El experimento midio que un pendiente de DOCUMENTACION no
6
+ * puede cerrar: la compuerta del cierre exige rojo + verde + regresion, y un
7
+ * documento no tiene conducta que un test distinga, asi que el unico camino
8
+ * es el `force_reason`. El pedido original era una clase de pendiente que se
9
+ * autorizara sola. Eso se descarto a proposito: la garantia de que un
10
+ * pendiente de CODIGO no se declare "de documentacion" no se puede dar hoy
11
+ * con un mecanismo, y una clase que se autoriza sola es un agujero con mejor
12
+ * nombre. Un cierre forzado honesto es mejor.
13
+ *
14
+ * LA CONDICION QUE LO HACE SERVIR, y es del dueno: "el motivo tipado tiene
15
+ * que ser un NUMERO en el reporte. Que se pueda preguntar cuantos cierres se
16
+ * forzaron por `documentacion_sin_rojo_posible` y que haya una respuesta. Si
17
+ * el tipo existe pero nadie lo cuenta, es el mismo agujero con mejor nombre
18
+ * -- y peor, porque suena resuelto."
19
+ *
20
+ * Asi que este modulo trae las dos mitades y ninguna sirve sin la otra:
21
+ *
22
+ * 1. EL TIPO, de un catalogo CERRADO. `force_reason` sigue siendo la prosa
23
+ * del dueno (es su decision y su firma), y `force_kind` la clasifica.
24
+ * Un tipo que no esta en el catalogo se RECHAZA nombrando los que hay:
25
+ * aceptar uno libre volveria el contador una nube de sinonimos, que es
26
+ * no contar.
27
+ *
28
+ * 2. EL CONTADOR. El override se guarda ESTRUCTURADO en el history del
29
+ * item (`entry.override`), no como prosa, y la retrospectiva lo cuenta
30
+ * por tipo. Antes se contaba con un `/OVERRIDE/` sobre el texto de la
31
+ * nota: un numero total y ninguna pregunta contestable. Los viejos
32
+ * siguen contandose, en su propia fila (`sin_tipo`): descontarlos haria
33
+ * BAJAR el total el dia del arreglo, que es la peor forma de medir una
34
+ * deuda -- parece que se arreglo algo.
35
+ *
36
+ * Y el dia que el numero de un tipo crezca, se ve. Si no crece, el problema
37
+ * era chico y nos ahorramos el mecanismo.
38
+ *
39
+ * ASCII-only.
40
+ */
41
+ /** Que compuerta se saltea el override. Se guarda porque son exigencias
42
+ * distintas: "faltan recibos" y "el peldano esta en rojo" se arreglan de
43
+ * maneras distintas, y un contador que las sume es un contador que no
44
+ * sirve para decidir nada. */
45
+ export type OverrideGate = 'evidence' | 'step' | 'order';
46
+ /** EL CATALOGO CERRADO. Cada entrada es un motivo por el que un cierre
47
+ * forzado puede ser legitimo; el texto es lo que ve quien tiene que
48
+ * elegir, asi que dice el caso y no la categoria. */
49
+ export declare const OVERRIDE_KINDS: Readonly<Record<string, string>>;
50
+ export declare const OVERRIDE_KIND_NAMES: readonly string[];
51
+ /** El minimo de la prosa. 15 caracteres era el numero del `force_reason`
52
+ * antes de esto y se mantiene: el tipo clasifica, no reemplaza al motivo. */
53
+ export declare const OVERRIDE_REASON_MIN = 15;
54
+ /** Lo que se guarda en el history, estructurado. Es lo que el contador lee:
55
+ * prosa no, nunca mas. */
56
+ export interface OverrideRecord {
57
+ gate: OverrideGate;
58
+ kind: string;
59
+ /** Cuantas exigencias quedaron sin cumplir (recibos faltantes, o 1 para
60
+ * un peldano en rojo). Le da peso al numero: forzar sobre un faltante y
61
+ * forzar sobre tres no es lo mismo. */
62
+ missing: number;
63
+ }
64
+ /** El catalogo como texto, para el mensaje que lo pide. Una sola redaccion:
65
+ * el verbo, el CLI y el manifiesto la comparten. */
66
+ export declare function renderOverrideCatalogue(): string;
67
+ export interface OverrideCheck {
68
+ ok: boolean;
69
+ /** El problema, listo para mostrar. Vacio cuando ok. */
70
+ error?: string;
71
+ kind?: string;
72
+ }
73
+ /** Validar el par (motivo, tipo) de un cierre forzado.
74
+ *
75
+ * El tipo es OBLIGATORIO cuando se fuerza. Es la unica forma de que el
76
+ * contador exista: un campo opcional en un verbo es un campo que nadie
77
+ * manda -- medido en este mismo registro, 106 cierres con `shipped` y UNO
78
+ * con expediente, hasta que el verbo se nego sin el. */
79
+ export declare function checkOverride(reason: string, kind: unknown): OverrideCheck;
80
+ export interface OverrideCounts {
81
+ total: number;
82
+ /** Por tipo del catalogo. Solo aparecen los que tienen al menos uno: una
83
+ * tabla con seis ceros no es informacion. */
84
+ by_kind: Record<string, number>;
85
+ /** Por compuerta salteada. */
86
+ by_gate: Record<string, number>;
87
+ /** Los anteriores al tipo (prosa suelta con "OVERRIDE" en la nota). Se
88
+ * cuentan: descontarlos haria bajar el total el dia del arreglo. */
89
+ untyped: number;
90
+ }
91
+ /** La forma minima de una entrada de history que este contador necesita.
92
+ * Local a proposito: el contador no tiene que importar el store para
93
+ * contar, y asi se puede probar con datos a mano. */
94
+ export interface CountableHistoryEntry {
95
+ at?: unknown;
96
+ note?: string;
97
+ override?: OverrideRecord;
98
+ }
99
+ /** Contar los overrides de una lista de items. `inWindow` decide la
100
+ * ventana (la retrospectiva usa la suya); sin ella cuenta todo. */
101
+ export declare function countOverrides(items: ReadonlyArray<{
102
+ history?: CountableHistoryEntry[];
103
+ }>, inWindow?: (at: unknown) => boolean): OverrideCounts;
104
+ /** Las filas del reporte, en orden de mas a menos. Vive aca y no en el
105
+ * renderizador para que el numero y su etiqueta no puedan separarse. */
106
+ export declare function renderOverrideRows(c: OverrideCounts): Array<[string, number]>;
107
+ //# sourceMappingURL=overrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.d.ts","sourceRoot":"","sources":["../../src/urazuke/overrides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;+BAG+B;AAC/B,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD;;sDAEsD;AACtD,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAa3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAgC,CAAC;AAElF;8EAC8E;AAC9E,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;2BAC2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb;;4CAEwC;IACxC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;qDACqD;AACrD,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;yDAKyD;AACzD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,aAAa,CAsB1E;AAMD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd;kDAC8C;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC;yEACqE;IACrE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;sDAEsD;AACtD,MAAM,WAAW,qBAAqB;IACpC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;oEACoE;AACpE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,CAAC;IAAE,OAAO,CAAC,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC,EAC3D,QAAQ,GAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAoB,GAC9C,cAAc,CAoBhB;AAED;yEACyE;AACzE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAU7E"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * EL MOTIVO TIPADO DE UN CIERRE FORZADO -- M-02 (decision del dueno,
3
+ * 2026-11-01).
4
+ *
5
+ * DE DONDE SALE. El experimento midio que un pendiente de DOCUMENTACION no
6
+ * puede cerrar: la compuerta del cierre exige rojo + verde + regresion, y un
7
+ * documento no tiene conducta que un test distinga, asi que el unico camino
8
+ * es el `force_reason`. El pedido original era una clase de pendiente que se
9
+ * autorizara sola. Eso se descarto a proposito: la garantia de que un
10
+ * pendiente de CODIGO no se declare "de documentacion" no se puede dar hoy
11
+ * con un mecanismo, y una clase que se autoriza sola es un agujero con mejor
12
+ * nombre. Un cierre forzado honesto es mejor.
13
+ *
14
+ * LA CONDICION QUE LO HACE SERVIR, y es del dueno: "el motivo tipado tiene
15
+ * que ser un NUMERO en el reporte. Que se pueda preguntar cuantos cierres se
16
+ * forzaron por `documentacion_sin_rojo_posible` y que haya una respuesta. Si
17
+ * el tipo existe pero nadie lo cuenta, es el mismo agujero con mejor nombre
18
+ * -- y peor, porque suena resuelto."
19
+ *
20
+ * Asi que este modulo trae las dos mitades y ninguna sirve sin la otra:
21
+ *
22
+ * 1. EL TIPO, de un catalogo CERRADO. `force_reason` sigue siendo la prosa
23
+ * del dueno (es su decision y su firma), y `force_kind` la clasifica.
24
+ * Un tipo que no esta en el catalogo se RECHAZA nombrando los que hay:
25
+ * aceptar uno libre volveria el contador una nube de sinonimos, que es
26
+ * no contar.
27
+ *
28
+ * 2. EL CONTADOR. El override se guarda ESTRUCTURADO en el history del
29
+ * item (`entry.override`), no como prosa, y la retrospectiva lo cuenta
30
+ * por tipo. Antes se contaba con un `/OVERRIDE/` sobre el texto de la
31
+ * nota: un numero total y ninguna pregunta contestable. Los viejos
32
+ * siguen contandose, en su propia fila (`sin_tipo`): descontarlos haria
33
+ * BAJAR el total el dia del arreglo, que es la peor forma de medir una
34
+ * deuda -- parece que se arreglo algo.
35
+ *
36
+ * Y el dia que el numero de un tipo crezca, se ve. Si no crece, el problema
37
+ * era chico y nos ahorramos el mecanismo.
38
+ *
39
+ * ASCII-only.
40
+ */
41
+ /** EL CATALOGO CERRADO. Cada entrada es un motivo por el que un cierre
42
+ * forzado puede ser legitimo; el texto es lo que ve quien tiene que
43
+ * elegir, asi que dice el caso y no la categoria. */
44
+ export const OVERRIDE_KINDS = {
45
+ documentacion_sin_rojo_posible: 'es documentacion (o configuracion): no hay conducta que un test pueda distinguir, asi que no hay rojo que producir',
46
+ rojo_imposible_en_este_entorno: 'el rojo necesita hardware, un servicio externo o una credencial que no esta en esta maquina',
47
+ evidencia_fuera_de_forge: 'la evidencia existe pero la produjo otra herramienta (una corrida de CI, un informe de un tercero) y no hay recibo',
48
+ insumo_del_dueno_pendiente: 'el peldano espera un insumo mio que todavia no prepare, y decido avanzar igual',
49
+ cierre_fuera_de_orden_a_sabiendas: 'cierro fuera del orden obligatorio a sabiendas, por un motivo que escribo',
50
+ deuda_asumida_por_urgencia: 'decido entregar ahora y asumir la deuda, que queda contada aca',
51
+ };
52
+ export const OVERRIDE_KIND_NAMES = Object.keys(OVERRIDE_KINDS);
53
+ /** El minimo de la prosa. 15 caracteres era el numero del `force_reason`
54
+ * antes de esto y se mantiene: el tipo clasifica, no reemplaza al motivo. */
55
+ export const OVERRIDE_REASON_MIN = 15;
56
+ /** El catalogo como texto, para el mensaje que lo pide. Una sola redaccion:
57
+ * el verbo, el CLI y el manifiesto la comparten. */
58
+ export function renderOverrideCatalogue() {
59
+ return OVERRIDE_KIND_NAMES.map((k) => '`' + k + '` (' + OVERRIDE_KINDS[k] + ')').join('; ');
60
+ }
61
+ /** Validar el par (motivo, tipo) de un cierre forzado.
62
+ *
63
+ * El tipo es OBLIGATORIO cuando se fuerza. Es la unica forma de que el
64
+ * contador exista: un campo opcional en un verbo es un campo que nadie
65
+ * manda -- medido en este mismo registro, 106 cierres con `shipped` y UNO
66
+ * con expediente, hasta que el verbo se nego sin el. */
67
+ export function checkOverride(reason, kind) {
68
+ const prose = String(reason ?? '').trim();
69
+ if (prose.length < OVERRIDE_REASON_MIN) {
70
+ return { ok: false, error: 'el motivo escrito tiene que tener al menos ' + OVERRIDE_REASON_MIN + ' caracteres' };
71
+ }
72
+ const k = String(kind ?? '').trim();
73
+ if (!k) {
74
+ return {
75
+ ok: false,
76
+ error: 'falta `force_kind`: un cierre forzado se CUENTA por tipo, y un motivo sin tipo no entra'
77
+ + ' en ningun numero del reporte. Elegi uno de: ' + renderOverrideCatalogue(),
78
+ };
79
+ }
80
+ if (!OVERRIDE_KIND_NAMES.includes(k)) {
81
+ return {
82
+ ok: false,
83
+ error: '`force_kind` "' + k + '" no esta en el catalogo. El catalogo es CERRADO a proposito:'
84
+ + ' un tipo libre convierte el contador en una nube de sinonimos. Elegi uno de: '
85
+ + renderOverrideCatalogue(),
86
+ };
87
+ }
88
+ return { ok: true, kind: k };
89
+ }
90
+ /** Contar los overrides de una lista de items. `inWindow` decide la
91
+ * ventana (la retrospectiva usa la suya); sin ella cuenta todo. */
92
+ export function countOverrides(items, inWindow = () => true) {
93
+ const out = { total: 0, by_kind: {}, by_gate: {}, untyped: 0 };
94
+ for (const it of items) {
95
+ for (const h of it.history ?? []) {
96
+ if (!inWindow(h.at))
97
+ continue;
98
+ const ov = h.override;
99
+ if (ov && typeof ov.kind === 'string') {
100
+ out.total++;
101
+ out.by_kind[ov.kind] = (out.by_kind[ov.kind] ?? 0) + 1;
102
+ out.by_gate[ov.gate] = (out.by_gate[ov.gate] ?? 0) + 1;
103
+ continue;
104
+ }
105
+ /* El camino viejo: prosa. Se cuenta y se marca como sin tipo. */
106
+ if (typeof h.note === 'string' && /OVERRIDE/.test(h.note)) {
107
+ out.total++;
108
+ out.untyped++;
109
+ }
110
+ }
111
+ }
112
+ return out;
113
+ }
114
+ /** Las filas del reporte, en orden de mas a menos. Vive aca y no en el
115
+ * renderizador para que el numero y su etiqueta no puedan separarse. */
116
+ export function renderOverrideRows(c) {
117
+ const rows = [['Overrides de compuertas (total)', c.total]];
118
+ for (const [k, n] of Object.entries(c.by_kind).sort((a, b) => b[1] - a[1])) {
119
+ rows.push([' por motivo `' + k + '`', n]);
120
+ }
121
+ if (c.untyped)
122
+ rows.push([' sin tipo (anteriores a M-02)', c.untyped]);
123
+ for (const [g, n] of Object.entries(c.by_gate).sort((a, b) => b[1] - a[1])) {
124
+ rows.push([' compuerta salteada: ' + g, n]);
125
+ }
126
+ return rows;
127
+ }
128
+ //# sourceMappingURL=overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/urazuke/overrides.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAQH;;sDAEsD;AACtD,MAAM,CAAC,MAAM,cAAc,GAAqC;IAC9D,8BAA8B,EAC5B,oHAAoH;IACtH,8BAA8B,EAC5B,6FAA6F;IAC/F,wBAAwB,EACtB,oHAAoH;IACtH,0BAA0B,EACxB,gFAAgF;IAClF,iCAAiC,EAC/B,2EAA2E;IAC7E,0BAA0B,EACxB,gEAAgE;CACnE,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAsB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAElF;8EAC8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAatC;qDACqD;AACrD,MAAM,UAAU,uBAAuB;IACrC,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9F,CAAC;AASD;;;;;yDAKyD;AACzD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAa;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,GAAG,mBAAmB,GAAG,aAAa,EAAE,CAAC;IACnH,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,yFAAyF;kBAC5F,+CAA+C,GAAG,uBAAuB,EAAE;SAChF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,gBAAgB,GAAG,CAAC,GAAG,+DAA+D;kBACzF,+EAA+E;kBAC/E,uBAAuB,EAAE;SAC9B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/B,CAAC;AA2BD;oEACoE;AACpE,MAAM,UAAU,cAAc,CAC5B,KAA2D,EAC3D,WAAqC,GAAG,EAAE,CAAC,IAAI;IAE/C,MAAM,GAAG,GAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC/E,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,SAAS;YAC9B,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;YACtB,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACZ,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACvD,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBACvD,SAAS;YACX,CAAC;YACD,iEAAiE;YACjE,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,KAAK,EAAE,CAAC;gBACZ,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,CAAiB;IAClD,MAAM,IAAI,GAA4B,CAAC,CAAC,iCAAiC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,CAAC,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,gCAAgC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,CAAC,wBAAwB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/urazuke/probes.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA8CtD;AAED;0BAC0B;AAC1B,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,OAAO,CAInG;AAED;;2DAE2D;AAC3D,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ9E"}
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/urazuke/probes.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAyFtD;AAED;0BAC0B;AAC1B,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,OAAO,CAInG;AAED;;2DAE2D;AAC3D,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ9E"}
@@ -47,6 +47,57 @@ export function realProbes(slug) {
47
47
  return { with_report: 0, without_report: 0 };
48
48
  }
49
49
  },
50
+ pendingsProfiles: async () => {
51
+ /* Peldano 5, Pieza 6. La fuente es el REGISTRO (decision del dueno,
52
+ * 2026-11-01): `PendingSpec` y no docs/PENDING.md, porque una
53
+ * compuerta no puede medir prosa y porque el otro evaluador del mismo
54
+ * peldano ya mide aca. */
55
+ try {
56
+ const { listPending } = await import('../pending/store.js');
57
+ const open = await listPending(slug, { status: 'open' });
58
+ const plan = open.filter((p) => !p.workflow || p.workflow.ad_hoc);
59
+ const touching = [];
60
+ const undeclared = [];
61
+ for (const item of plan) {
62
+ const spec = item.spec;
63
+ if (!spec || spec.touches_screen == null) {
64
+ undeclared.push(item.id);
65
+ continue;
66
+ }
67
+ if (spec.touches_screen !== true)
68
+ continue;
69
+ const missing = [];
70
+ if (!String(spec.convergence_group ?? '').trim())
71
+ missing.push('convergence_group');
72
+ const profiles = Array.isArray(spec.profiles) ? spec.profiles.filter((x) => String(x).trim()) : [];
73
+ if (!profiles.length)
74
+ missing.push('profiles');
75
+ const per = spec.acceptance_per_profile ?? {};
76
+ const missingPer = profiles.filter((p) => !String(per[p] ?? '').trim());
77
+ if (!profiles.length || missingPer.length) {
78
+ missing.push('acceptance_per_profile' + (missingPer.length ? ' (' + missingPer.join(', ') + ')' : ''));
79
+ }
80
+ touching.push({ id: item.id, missing });
81
+ }
82
+ return { plan: plan.length, touching, undeclared };
83
+ }
84
+ catch {
85
+ /* Fail-closed: un registro que no se pudo leer no dice "no hay
86
+ * pendientes de pantalla". Se devuelve el plan en cero y todos sin
87
+ * declarar, que es lo que el evaluador reporta como no mirado. */
88
+ return { plan: 0, touching: [], undeclared: [] };
89
+ }
90
+ },
91
+ receiptIndex: async () => {
92
+ try {
93
+ const { readReceipts } = await import('./receipts.js');
94
+ const f = await readReceipts(slug);
95
+ return f.items.map((r) => ({ id: r.id, kind: r.kind, verdict: r.verdict }));
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ },
50
101
  receipts: async () => {
51
102
  try {
52
103
  const { readReceipts, summarizeReceipts } = await import('./receipts.js');
@@ -1 +1 @@
1
- {"version":3,"file":"probes.js","sourceRoot":"","sources":["../../src/urazuke/probes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"probes.js","sourceRoot":"","sources":["../../src/urazuke/probes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ export declare const MATRIX_REL = "docs/PROFILE_MATRIX.md";
2
+ export declare const NAVIGATION_REL = ".forge/profile-navigation.json";
3
+ export declare const REACHABILITY_REL = ".forge/profile-reachability.json";
4
+ /** Una fila de la matriz: las cuatro columnas del Anexo H B2 y nada mas. */
5
+ export interface MatrixRow {
6
+ functionality: string;
7
+ /** El "hogar" de la funcionalidad: donde vive. */
8
+ home: string;
9
+ profiles: string[];
10
+ entry_point: string;
11
+ }
12
+ export interface ProfileMatrix {
13
+ rows: MatrixRow[];
14
+ /** Lo que impide leer la matriz. Con problemas, `rows` puede estar vacio y
15
+ * eso NO se lee como "no hay funcionalidades". */
16
+ problems: string[];
17
+ }
18
+ /** La matriz, leida de la tabla markdown que trae las cuatro columnas.
19
+ *
20
+ * Se busca por CABECERA y no por posicion: una tabla con las columnas en
21
+ * otro orden es la misma matriz, y una tabla cualquiera del documento no lo
22
+ * es. Si ninguna tabla tiene las cuatro, eso es un problema nombrado -- no
23
+ * una matriz vacia. */
24
+ export declare function parseProfileMatrix(markdown: string): ProfileMatrix;
25
+ /** Los perfiles que la matriz nombra, ordenados. */
26
+ export declare function profilesOf(m: ProfileMatrix): string[];
27
+ /** Las funcionalidades que un perfil tiene, segun su fila. */
28
+ export declare function functionalitiesFor(m: ProfileMatrix, profile: string): string[];
29
+ /** La huella, AUTODESCRIPTA. Misma regla que el congelado y que el sello de
30
+ * la bateria: una huella que no se puede reproducir desde afuera no es
31
+ * evidencia, asi que la definicion viaja con el dato.
32
+ *
33
+ * Y la condicion que decide si sirve (dueno, 2026-11-01): la huella se
34
+ * RECALCULA desde la matriz y se compara contra la que el artefacto
35
+ * declara. Leer la declarada y compararla consigo misma daria verde sobre
36
+ * cualquier archivo. */
37
+ export declare const NAVIGATION_FINGERPRINT_SPEC: {
38
+ readonly algorithm: "sha256";
39
+ readonly encoding: "utf8";
40
+ readonly canonical_form: string;
41
+ readonly covers: string;
42
+ readonly excludes: string;
43
+ };
44
+ export declare function navigationCanonicalForm(m: ProfileMatrix): string;
45
+ export declare function navigationFingerprint(m: ProfileMatrix): string;
46
+ /** El artefacto de navegacion generado, como lo deja el proyecto. */
47
+ export interface NavigationArtifact {
48
+ version?: number;
49
+ generated_at?: string;
50
+ fingerprint?: {
51
+ value?: string;
52
+ algorithm?: string;
53
+ encoding?: string;
54
+ canonical_form?: string;
55
+ covers?: string;
56
+ excludes?: string;
57
+ };
58
+ /** Lo generado. No se interpreta: lo que la condicion protege es que la
59
+ * matriz sea el productor, y eso lo dice la huella. */
60
+ routes?: unknown[];
61
+ }
62
+ /** El resultado alcanzado por perfil (UX-12), como lo deja la corrida e2e.
63
+ *
64
+ * `reached` lista lo que se ALCANZO, no lo que se intento: esa es la
65
+ * diferencia entre un artefacto de resultado y una lista de deseos. */
66
+ export interface ReachabilityArtifact {
67
+ version?: number;
68
+ per_profile?: Record<string, {
69
+ reached?: string[];
70
+ receipt?: string;
71
+ }>;
72
+ }
73
+ export declare function readJsonArtifact<T>(root: string, rel: string): Promise<T | undefined>;
74
+ export declare function readProfileMatrix(root: string): Promise<ProfileMatrix>;
75
+ export type ProfileCheckStatus = 'ok' | 'fail' | 'unknown';
76
+ export interface ProfileCheck {
77
+ label: string;
78
+ status: ProfileCheckStatus;
79
+ detail: string;
80
+ /** La clase del defecto, cuando el metodo le da una. `authorization` es
81
+ * gravedad alta POR DEFINICION ESCRITA: un perfil que llega a donde no
82
+ * debe no es "la fila no coincide". El mensaje nombra la clase porque,
83
+ * medido en el experimento, cuando la gravedad se deja a interpretacion
84
+ * el que lee la subcalifica (cuatro pases calificaron 3 lo que la
85
+ * definicion pone en 1). */
86
+ kind?: 'missing' | 'authorization';
87
+ path?: string;
88
+ }
89
+ /** `profile_matrix` -- el peldano 8. */
90
+ export declare function checkProfileMatrix(input: {
91
+ matrix: ProfileMatrix;
92
+ navigation?: NavigationArtifact;
93
+ reachability?: ReachabilityArtifact;
94
+ /** Los recibos de evidencia del proyecto, por id. Sin el indice, la
95
+ * verificacion del recibo es `unknown` y no un aprobado. */
96
+ receipts?: Array<{
97
+ id: string;
98
+ kind: string;
99
+ verdict: string;
100
+ }>;
101
+ }): ProfileCheck[];
102
+ /** Lo que una sonda del registro de pendientes tiene que devolver para
103
+ * `pendings_profiles`. */
104
+ export interface PendingsProfilesProbe {
105
+ /** Pendientes abiertos del plan (sin las tareas canonicas del metodo). */
106
+ plan: number;
107
+ /** Los que declaran `touches_screen: true`. */
108
+ touching: Array<{
109
+ id: string;
110
+ missing: string[];
111
+ }>;
112
+ /** Los que NO declaran el campo: no se puede saber si tocan pantalla, y
113
+ * eso no es "no toca". */
114
+ undeclared: string[];
115
+ }
116
+ /** `pendings_profiles` -- el peldano 5. */
117
+ export declare function checkPendingsProfiles(p: PendingsProfilesProbe | undefined): ProfileCheck[];
118
+ /** Un caso del registro manual, con el eslabon nuevo. */
119
+ export interface ManualCaseView {
120
+ rule: string;
121
+ verdict: 'passed' | 'failed';
122
+ profile?: string;
123
+ /** EL ESLABON QUE FALTABA (dueno, 2026-11-01): la funcionalidad que el
124
+ * caso ejercita. "Derived from the matrix" exige caso -> funcionalidad;
125
+ * sin el, los perfiles afectados solo pueden salir de un campo escrito a
126
+ * mano, y un evaluador que confia en ese campo da verde con su insumo
127
+ * ausente. */
128
+ functionality?: string;
129
+ }
130
+ /** `manual_cases_per_profile` -- el peldano 10. */
131
+ export declare function checkManualCasesPerProfile(input: {
132
+ matrix: ProfileMatrix;
133
+ cases: ManualCaseView[];
134
+ }): ProfileCheck[];
135
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/urazuke/profiles.ts"],"names":[],"mappings":"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"}