Skip to content

Commit 08337b8

Browse files
montfortclaude
andauthored
docs(baton): ratify work_verb/design_provenance schema (#332 step 2) (#334)
Ratifies the declared-classification schema that the Sentinel adopter gated ("don't instrument against an unratified schema"), unblocking the framework graduation (step 2 of #332) as the next PR. Settles the open design questions: - Fine grain: homogeneous-grain + inheritance rule; zero new frontmatter on SpecKit tasks. Batch/Task inherit from the parent charter/follow-up. - Vocabulary: 4 verbs (design|implement|audit|operate); non-work folds into operate (no 5th value). - Enforcement: optional field, advisory warning/nudge — never a CI-gate in v0 (the 100%-undeclared legacy corpus must not break). Ratifies design_provenance as significant only for implement (implement+upstream -> operator), matching classify.rs and resolving the laxer "implement|design" of the original proposal. No code change; cargo test -p straymark-baton stays green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 98eaa0c commit 08337b8

1 file changed

Lines changed: 156 additions & 0 deletions

File tree

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
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

Comments
 (0)