|
| 1 | +# Ratificación del esquema `work_verb` / `design_provenance` |
| 2 | + |
| 3 | +> **De:** experimento Baton · **Estatus:** `ratified` · **Fecha:** 2026-06-27 · |
| 4 | +> **Desbloquea:** paso 2 de [#332](https://github.com/StrangeDaysTech/straymark/issues/332) |
| 5 | +> (graduación de los campos al framework). |
| 6 | +> **Trazabilidad:** #332 (decisión) · #331 (evidencia de adoptante E1/E2/E3) · |
| 7 | +> #328 (la palanca es la señal estructurada) · #321 (anti-patrón "calibrado a un stack"). |
| 8 | +
|
| 9 | +## Propósito |
| 10 | + |
| 11 | +El giro arquitectónico de Baton (#332, prototipo en #333) descontinuó el *title-scan* y dejó al |
| 12 | +**`work_verb` declarado en autoría** (+ `design_provenance`) como la **única señal autoritativa** de |
| 13 | +clasificación. La graduación de esos campos al framework (plantillas/schemas/validador) está |
| 14 | +condicionada por una restricción que el adoptante Sentinel puso explícita: *no instrumentar contra un |
| 15 | +esquema sin ratificar*. |
| 16 | + |
| 17 | +Este documento **es** esa ratificación. Fija el vocabulario, las reglas de determinación, el |
| 18 | +placement (incluido el grano fino) y la postura de enforcement. Una vez mergeado, el esquema queda |
| 19 | +ratificado y la graduación al framework (`fw-X.Y.Z`) queda desbloqueada como el siguiente PR. |
| 20 | + |
| 21 | +El esquema está calibrado contra el corpus de gobernanza real de Sentinel (762 unidades): |
| 22 | +[`proposal-declared-verb.md`](adopter-calibration-sentinel/proposal-declared-verb.md) + |
| 23 | +[`verbs.yml`](adopter-calibration-sentinel/verbs.yml). El prototipo ya implementa los enums base en |
| 24 | +[`src/signals.rs`](src/signals.rs) y los consume en [`src/classify.rs`](src/classify.rs). |
| 25 | + |
| 26 | +## 1. Los dos campos |
| 27 | + |
| 28 | +### `work_verb` — la señal autoritativa |
| 29 | + |
| 30 | +Enum **cerrado**, vocabulario controlado (lowercase). Es lo que el autor (humano + agente) declara al |
| 31 | +crear la unidad, porque lo sabe gratis y con certeza (costo ≈ 0 tokens). |
| 32 | + |
| 33 | +| valor | significado | ejemplos | |
| 34 | +|---|---|---| |
| 35 | +| `design` | Decisión de arquitectura/patrón/escalabilidad **abierta**; autoría de spec. | Decidir un patrón de partición; diseñar un contrato de salud cross-componente; autorar un spec/arquitectura. | |
| 36 | +| `implement` | Lógica de servicio; fix con diagnóstico; query compleja/optimización; tooling nuevo; **definir un contrato/interface fundacional acotado**. | Provider abstraction; fix de race READ COMMITTED; construir un analizador; escribir los 4 ports de un módulo. | |
| 37 | +| `audit` | Revisión / verificación / contraste **independiente** contra la realidad. | Smokes + WCAG audit; public-shape audit; contrastar un mock contra el contrato real. | |
| 38 | +| `operate` | Trabajo mecánico: tests/test-infra/migraciones, scaffolding, docs, cierre/ceremonia, bulk. | Autorar unit tests; bump de schema; bulk-approve; meta-nota de cierre; anotar un doc de arquitectura. | |
| 39 | + |
| 40 | +### `design_provenance` — la carga cognitiva residual |
| 41 | + |
| 42 | +Enum **cerrado** `{new, upstream}`. **Opcional**, default `new`. Captura si el pensamiento difícil ya |
| 43 | +se gastó aguas arriba: una unidad cuyo trabajo sólo *instrumenta un diseño ya hecho en otra etapa* es |
| 44 | +mecánica, aunque su `work_verb` aparente sea `implement`. |
| 45 | + |
| 46 | +- `new` — la decisión difícil ocurre **en esta unidad**. |
| 47 | +- `upstream` — el diseño ya existe; esta unidad sólo lo transcribe/cablea. |
| 48 | + |
| 49 | +## 2. Reglas de determinación |
| 50 | + |
| 51 | +Estas reglas cierran la ambigüedad que un enum por sí solo no resuelve. Son el corazón de la |
| 52 | +ratificación. |
| 53 | + |
| 54 | +1. **Regla del contrato fundacional.** "Definir un contrato/interface fundacional acotado" es |
| 55 | + **`implement`**, NO `design`. `design` se reserva a arquitectura **abierta** (patrón, |
| 56 | + escalabilidad) y autoría de spec. (Hallazgo del piloto, [`verbs.yml`](adopter-calibration-sentinel/verbs.yml#L11-L13); |
| 57 | + en la muestra calibrada hay 0 `design` real — consistente con E1, donde `planner` = 0.) |
| 58 | + |
| 59 | +2. **Carga cognitiva residual (degradación).** `implement` + `design_provenance: upstream` |
| 60 | + **degrada a `operator`** (instrumentar diseño previo = mecánico). Es lo que separó |
| 61 | + `CHARTER-28` (wire de métricas declaradas en CHARTER-18 → operator) y `CHARTER-13` batch-1 |
| 62 | + (queries ya generadas por CHARTER-07 → operator) de trabajo `implement` con diseño nuevo. |
| 63 | + |
| 64 | +3. **`design_provenance` sólo es significativo para `implement`.** Un `design` cuyo diseño "ya |
| 65 | + existe aguas arriba" es una contradicción (si el diseño ya está hecho, el trabajo no es diseñar, |
| 66 | + es implementar). Por eso la degradación se ancla en `implement`, no en `design`. `audit` y |
| 67 | + `operate` ignoran `design_provenance`. Esto **ratifica** la regla tal como la implementa el |
| 68 | + prototipo ([`classify.rs`](src/classify.rs#L59)), resolviendo el "implement|design" más laxo de la |
| 69 | + propuesta original. |
| 70 | + |
| 71 | +4. **No-trabajo → `operate`.** Higiene, ceremonia de cierre, meta-notas (p.ej. FU-136, FU-174): |
| 72 | + no se introduce un 5º valor. Se mapean a `operate` (rutea barato igual). El "en rigor NO-trabajo" |
| 73 | + del piloto es una observación de telemetría, no un tier. |
| 74 | + |
| 75 | +### Mapa verbo → tier (el resultado) |
| 76 | + |
| 77 | +| `work_verb` | tier | nota | |
| 78 | +|---|---|---| |
| 79 | +| `design` | planner | | |
| 80 | +| `implement` | implementer | degrada a **operator** si `design_provenance: upstream` | |
| 81 | +| `audit` | auditor | | |
| 82 | +| `operate` | operator | | |
| 83 | + |
| 84 | +## 3. Placement y regla de grano homogéneo |
| 85 | + |
| 86 | +El verbo se declara **al grano más fino que ya tiene slot de declaración** — sin introducir |
| 87 | +frontmatter nuevo en unidades que no lo tienen. |
| 88 | + |
| 89 | +| Unidad | Slot de declaración | |
| 90 | +|---|---| |
| 91 | +| **Charter** | Frontmatter: `work_verb:` / `design_provenance:`. | |
| 92 | +| **Follow-up** | Líneas en la entrada: `- **Work verb**:` / `- **Design provenance**:`. | |
| 93 | +| **Batch** | Línea `- **Work verb**:` en el AILOG ledger del batch (mismo formato que follow-up). | |
| 94 | +| **Task** (SpecKit) | **Sin slot propio.** Hereda del charter/spec padre. **Cero frontmatter nuevo en `tasks.md`.** | |
| 95 | + |
| 96 | +**Regla de grano homogéneo + herencia:** |
| 97 | + |
| 98 | +- Se declara una sola vez, al grano homogéneo más amplio. Batch y Task **heredan** el verbo del |
| 99 | + charter/follow-up padre por defecto. |
| 100 | +- **Override sólo por heterogeneidad:** si un charter mezcla, p.ej., diseño + parte mecánica, se |
| 101 | + declara el verbo al grano más fino que sí tenga slot (por batch, vía la línea del ledger). No se |
| 102 | + fragmenta artificialmente una unidad homogénea. |
| 103 | + |
| 104 | +**Nota de honestidad (estado del prototipo).** Hoy el prototipo **no** implementa la herencia: cosecha |
| 105 | +el verbo del charter frontmatter y de las líneas de follow-up, y deja batch/task como `undeclared` |
| 106 | +([`src/units.rs`](src/units.rs)). La herencia es una **regla ratificada aquí**, pendiente de |
| 107 | +implementar en la graduación al framework (o en un follow-on de Baton). Documentarla ahora evita que |
| 108 | +la graduación invente un mecanismo de declaración por-task que esta ratificación descarta. |
| 109 | + |
| 110 | +## 4. Undeclared = estado honesto |
| 111 | + |
| 112 | +Una unidad **sin verbo declarado es inclasificable** (`class = None`): se rutea conservadoramente |
| 113 | +hacia arriba (frontier) **y se emite un nudge** ("declara el verbo"), **nunca** una conjetura de baja |
| 114 | +confianza desde el título ([`src/classify.rs`](src/classify.rs#L51), [`src/route.rs`](src/route.rs)). |
| 115 | +El hueco se vuelve una *acción* de higiene, no un número fingido. La telemetría reporta |
| 116 | +`undeclared_fraction` (la métrica accionable), no un `conflict_fraction` artefacto del title-scan. |
| 117 | + |
| 118 | +## 5. Postura de enforcement (para la graduación) |
| 119 | + |
| 120 | +Cuando estos campos gradúen al framework: |
| 121 | + |
| 122 | +- **Campo opcional**, no requerido. (`charter.schema.v0.json` ya tiene `additionalProperties: true`, |
| 123 | + así que añadirlos es puramente aditivo.) |
| 124 | +- El validador marca **falta o invalidez** del verbo como **warning / nudge advisory** — al estilo |
| 125 | + de un check `coherence`, no un CI-gate (`exit ≠ 0`). |
| 126 | +- Coherente con v0 experimental y con la cautela del adoptante: el corpus legacy (100% undeclared en |
| 127 | + Sentinel) no debe romperse por declarar un esquema. `undeclared` es estado honesto, no un error. |
| 128 | + |
| 129 | +## 6. Anti-gaming y forward-validation |
| 130 | + |
| 131 | +- **El título degrada de oráculo a cross-check advisory**, y **sólo** en la herramienta de |
| 132 | + calibración periódica — **nunca** en la ruta de clasificación/ruteo. (`scan_cues`/`CUE_TABLE` ya se |
| 133 | + eliminaron del ruteo en #333.) |
| 134 | +- **Mitigación de deriva/gaming del verbo:** vocabulario pequeño + calibración periódica (el mismo |
| 135 | + loop E1) + el nudge de clasificabilidad. |
| 136 | +- **Forward-validation** (¿declaran bien los autores en un corpus variado post-adopción?) es el |
| 137 | + **paso 3 de #332**, responsabilidad de StrayMark, **fuera del alcance** de esta ratificación. |
| 138 | + |
| 139 | +## 7. Destino de graduación (mapeo — NO se aplica en este documento) |
| 140 | + |
| 141 | +Para el PR de graduación, ya desbloqueado por esta ratificación: |
| 142 | + |
| 143 | +- `dist/.straymark/schemas/charter.schema.v0.json` — añadir `work_verb` (enum) + `design_provenance` |
| 144 | + (enum, default `new`), opcionales (aditivo, sin tocar `required`). |
| 145 | +- Plantilla de charter + plantillas de follow-up — añadir los campos con el vocabulario y un |
| 146 | + comentario-guía. |
| 147 | +- Nudge del validador del CLI — "falta verbo / verbo inválido" como advisory. |
| 148 | +- Bump `fw-X.Y.Z` + actualización de docs (EN/es/zh-CN), por el flujo de release del framework. |
| 149 | + |
| 150 | +## 8. Lo que esta ratificación NO decide |
| 151 | + |
| 152 | +- **Forward-validation** sobre corpus variado (paso 3 de #332). |
| 153 | +- **Declaración por task con frontmatter propio** — descartada por la regla de grano homogéneo (§3). |
| 154 | +- **Pricing / ejecución real** de modelos (Fase 3 de Baton, diferida por la decisión #8). |
| 155 | +- **Reintroducir un 5º valor** para no-trabajo — descartado (§2.4); reconsiderar sólo si la |
| 156 | + calibración futura muestra que `operate` funde señal económicamente relevante. |
0 commit comments