Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ospec-workflow",
"description": "Spec-Driven Development workflow for VS Code Agent Customization with OpenSpec, strict TDD, phase agents, skills, hooks, and verification contracts.",
"version": "2.50.0",
"version": "2.51.0",
"author": {
"name": "Manuel Michael Retamozo García"
},
Expand Down
2 changes: 1 addition & 1 deletion .plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ospec-workflow",
"description": "Spec-Driven Development workflow for VS Code Agent Customization with OpenSpec, strict TDD, phase agents, skills, hooks, and verification contracts.",
"version": "2.50.0",
"version": "2.51.0",
"author": {
"name": "Manuel Michael Retamozo García"
},
Expand Down
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ All notable changes to this project are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.51.0] - 2026-08-27

### Added
- **Remediación de integridad K6b (`k6b-verification-integrity-remediation`)**:
- PASS exige evidencia admisible por cada obligación MUST del Execution Graph; `strategy satisfied ≠ Execution Graph satisfied`.
- Contrato aditivo `assessment/v1` (`ospec://schemas/kernel/assessment/v1`): binding persistible EvidenceId ↔ role ↔ obligation_id ↔ node_id ↔ policy, sin mutar `evidence/v2` ni K1 v1.
- Provenance fuerte derivada del canal del harness (`input.collector` / `input.collectors[]`); `collector` en el sobre del worker falla cerrado (`UNTRUSTED_COLLECTOR`). Desacuerdo claim↔canal simétrico; weak+allowlist no escala a clase fuerte.
- `graph_id` fingerprinta inputs canónicos; proyección fail-closed (`GRAPH_PROJECTION_FAILED` / `GRAPH_DIVERGENCE`); `rejectForbidden` por kind/namespace.
- ADRs `docs/adr/adr-20260827-007` a `010`. Specs `independent-verification`, `assurance-graph` y `kernel-contract-schemas`.
- K6b queda `done`; K6c pasa a `next-eligible`. Ciclo SDD completo (ruta standard, high-risk, size:exception, 4R successor approved). Verify: 2754 pass, 0 fail. Archivado en `openspec/changes/archive/2026-08-27-k6b-verification-integrity-remediation/`.

## [2.50.0] - 2026-08-27

### Added
Expand Down
23 changes: 23 additions & 0 deletions docs/adr/adr-20260827-007-additive-assessment-family-id.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# ADR-001: Additive assessment family `$id`

- Status: proposed
- Change: k6b-verification-integrity-remediation
- Date: 2026-08-27

## Context

Assumption `sdd-propose-001` left the persistable binding `$id` to design. Intent forbids in-place mutation of `evidence/v2` and K1 v1. Assessment identity must include `role` and `obligation_id` without collapsing physical `EvidenceId`.

## Decision

Publish family `assessment` at `$id` `ospec://schemas/kernel/assessment/v1`, `kind: "assessment/v1"`, path `schemas/kernel/assessment/v1.schema.json`, `schema_version: 1`. Register additively in `manifest.json` and `contract-claims.json`. Keep `evidence/v2`, `verification/v2`, and K1 v1 bytes/pins frozen.

## Alternatives

- Mutate `evidence/v2` to carry role/obligation: rejected; observation identity would absorb evaluation identity.
- Evolve `verification/v3` with embedded bindings: rejected; verdict unique-sort of `evidence_ids` still hides distinct roles.
- `$id` `ospec://schemas/kernel/assessment-binding/v1`: rejected; breaks the `{noun}/vN` kernel `$id` pattern.

## Consequences

Consumers pin a third K6b-era family without migrating evidence. Rollback deletes the additive family. Four roles over one observation become four `assessment_id` values by construction.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# ADR-002: MUST walk after strategy; assessment identity ≠ EvidenceId

- Status: proposed
- Change: k6b-verification-integrity-remediation
- Date: 2026-08-27

## Context

`evaluateStrategy()` only checks role minimums. PASS was therefore possible without Obligation Manifest coverage. `obligation_ids` on classified evidence are ephemeral, so `satisfies` edges cannot be replayed from `evidence/v2`.

## Decision

Keep `evaluateStrategy` as the role-shape gate. After it succeeds, walk every non-deferred `must` obligation, emit `assessment/v1` records, and require those assessments for PASS. `computeEvidenceId` stays observation-only. `assessment_id` fingerprints `evidence_id`, `role`, `obligation_id`, `node_id`, `candidate_id`, and `policy_snapshot_id`.

## Alternatives

- Fold MUST coverage into `evaluateStrategy`: rejected; mixes strategy policy with graph obligations and reason codes.
- Walk obligations before strategy: rejected; delays cheap role failures.
- Treat unique-sort of `verification.evidence_ids` as binding identity: rejected; one EvidenceId used as four roles would collapse.

## Consequences

Reason codes split cleanly (`MISSING_STRATEGY_MINIMUM` vs `UNFULFILLED_MUST` / `UNKNOWN_OBLIGATION_ID` / `WRONG_IMPLEMENTING_NODE`). Projector `satisfies` edges consume assessments only. Existing tests that omit obligation bindings will fail closed until updated.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# ADR-003: Strong provenance from collector/transport allowlist

- Status: proposed
- Change: k6b-verification-integrity-remediation
- Date: 2026-08-27

## Context

`normalizeEvidence` currently copies `raw.provenance` into `evidence/v2`. A worker can claim `runtime-observed`. PKI is out of scope. Payload digest identifies bytes, not origin.

## Decision

Derive strong classes (`runtime-observed`, `host-attested`, `tool-produced`) from harness-supplied `collector.id` + `transport` via a fail-closed allowlist (`node-test`/`npm-test`/`node:test` → runtime-observed; `tool-execution` → tool-produced; `host-adapter` → host-attested). Worker/absent/unknown collectors cannot produce a strong class. Store the derived class on `evidence/v2`; never copy collector metadata onto that record.

## Alternatives

- Trust the payload provenance string: rejected; this is the verified defect.
- Require signatures or PKI: rejected; out of scope for this change.
- Treat payload digest as origin: rejected; digest is content identity only.

## Consequences

Callers that claim a strong class must pass allowlisted collector metadata (tests included). Mis-mapped collector ids fail closed rather than silently weakening provenance.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# ADR-004: Canonical graph_id fingerprint and fail-closed projection

- Status: proposed
- Change: k6b-verification-integrity-remediation
- Date: 2026-08-27

## Context

`graph_id` currently hashes only `candidate_id` plus canonical nodes/edges. Contract or policy changes do not diverge. `verifyCandidate` returns `ok: true` when projection fails, omitting the graph. `rejectForbidden` substring-matches `id`, so `REQ-add-authorization-header` is rejected.

## Decision

Fingerprint `contract_digest`, `policy_snapshot_id`, Execution Graph digest, canonical OpenSpec input, `candidate_id`, and canonical nodes/edges in `graph_id`. Persist those digests as optional `canonical_inputs` on `assurance-graph/v1`. `verifyCandidate` requires a successful projection before `ok: true`. Match forbidden subjects by `kind`/`namespace`, never by `id` substring.

## Alternatives

- Keep the current `graph_id` preimage: rejected; replay cannot detect contract/policy drift.
- Leave projection optional on the facade: rejected; PASS without a graph is the integrity hole.
- Continue substring markers on `id`: rejected; legitimate requirement ids containing `authorization` fail.

## Consequences

Existing runtime `graph_id` values change. Replay becomes possible from persistable outputs. Facade tests that ignored projector failure must assert `GRAPH_PROJECTION_FAILED` / `GRAPH_DIVERGENCE`.
6 changes: 3 additions & 3 deletions docs/architecture/harness-evolution.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Arquitectura objetivo — harness gobernado por kernel, grafo y evidencia

> **Autoridad:** fuente conceptual y estratégica del harness (responsabilidades y límites).
> **Corte documental:** v2.50.0, 2026-08-27 (estado alineado al roadmap; la dirección conceptual no cambia).
> **Estado verificado:** O3, O4+O5/O4.1, O4.2, O6A, O2B, **K1**, **K2**, **K2.1**, **K2a**, **K3**, **`k3-readiness-remediation`**, **K4a**, **K5**, **K6a**, **K4b** y **K6b** están entregados y archivados. OpenSpec/Git/Candidate siguen siendo la única autoridad semántica; el Assurance Graph es proyección. **K6c** es la siguiente iniciativa elegible.
> **Corte documental:** v2.51.0, 2026-08-27 (estado alineado al roadmap; la dirección conceptual no cambia).
> **Estado verificado:** O3, O4+O5/O4.1, O4.2, O6A, O2B, **K1**, **K2**, **K2.1**, **K2a**, **K3**, **`k3-readiness-remediation`**, **K4a**, **K5**, **K6a**, **K4b** y **K6b** (archivado v2.50.0; integridad cerrada en v2.51.0). OpenSpec/Git/Candidate siguen siendo la única autoridad semántica; el Assurance Graph es proyección. **K6c** es `next-eligible`.
> **Roadmap:** orden, estado operativo y done criteria viven en [`../roadmaps/harness-evolution.md`](../roadmaps/harness-evolution.md).
> **Precedencia documental:** ante diferencias de **orden o estado**, prevalece el roadmap; ante diferencias **conceptuales**, reconciliar antes de iniciar el slice.
> **Investigación no normativa:** la trazabilidad completa P0–P27 vive en [`research/harness-kernel-graph-evidence-roadmap-fusion.md`](research/harness-kernel-graph-evidence-roadmap-fusion.md). La proporcionalidad de proceso y el programa de changes viven en [`research/proportional-process-and-change-program.md`](research/proportional-process-and-change-program.md).
Expand Down Expand Up @@ -855,7 +855,7 @@ Repositorios fixture reciben 10–30 cambios consecutivos. Se miden duplicación
8. ~~K5: budgets (incl. autoridad/efectos) / failure / recovery~~ — hecho: archivado y publicado en v2.45.13 (remediaciones v2.45.7→v2.45.13).
9. ~~K6a: primitivas de ejecución aislada (`CreateWorkspace`…`DisposeWorkspace`); no conoce Repair~~ — hecho: archivado y publicado en v2.46.7; frontera de procesos cerrada en v2.47.1; endurecimiento de frontera (política inmutable, fs mutante, live-identity, `worker_threads`) en v2.47.2.
10. ~~K4b: orquesta Repair shadow (consume K6a; freeze Candidate vía K3)~~ — hecho: publicado en v2.48.0; corrección en v2.48.1; invariantes de integración en v2.48.2; cierre mode-only/baseline en v2.48.3.
11. ~~K6b: verifier + provenance + Assurance Graph (proyección)~~ — verifier, strategies/provenance y proyección implementados; autoridad del grafo, K6c ChallengePlan y K6d complexity delta siguen pendientes.
11. ~~K6b: verifier + provenance + Assurance Graph (proyección)~~ — hecho: publicado en v2.50.0; integridad (MUST, assessment/v1, collector, graph_id canónico, proyección fail-closed) cerrada en v2.51.0. K6c ChallengePlan es `next-eligible`; K6d complexity delta sigue pendiente.
12. K7: ReviewAdapter + ReviewReducer + lineage; K8: CandidateEvaluationAttestation (emisión CAS).
13. K9: shadow/replay/A-B; promoción de **un** profile (checkpoints intermedios ya validados).
14. K10-delivery: DeliveryAuthorization **solo** del profile promovido; relación Candidate por etapas; resto fixed/deferred.
Expand Down
14 changes: 8 additions & 6 deletions docs/roadmaps/harness-evolution.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Roadmap general — kernel, grafo y evidencia

> **Autoridad:** única fuente operativa del backlog transversal.
> **Versión de referencia:** v2.50.0, 2026-08-27.
> **Versión de referencia:** v2.51.0, 2026-08-27.
> **Arquitectura:** [`../architecture/harness-evolution.md`](../architecture/harness-evolution.md).
> **Investigación no normativa:** [`../architecture/research/harness-kernel-graph-evidence-roadmap-fusion.md`](../architecture/research/harness-kernel-graph-evidence-roadmap-fusion.md) (P0–P27). Proporcionalidad de proceso y Change Program: [`../architecture/research/proportional-process-and-change-program.md`](../architecture/research/proportional-process-and-change-program.md).
> **Regla de estado:** los hechos se contrastan con código/OpenSpec; este roadmap no cambia el estado de un change ni sustituye sus artefactos.
Expand Down Expand Up @@ -78,7 +78,7 @@ Las iniciativas anteriores no se descartan. O20A, O13A–C, O15, O18, O19A/B y R
| `done` | **K5** | Budgets (incl. autoridad/efectos), failures y recovery; remediaciones v2.45.7→v2.45.13 (authoritative enforcement, authority boundary/CAS concurrency, reconciliación, remediación técnica del núcleo y blindaje de concurrencia); archivado y publicado en v2.45.13 |
| `done` | **K6a** | Worker isolation y work-order capsule; primitivas de ejecución aislada, integración con WorkerTransport, contención de filesystem y WorkResult canónico; archivado en v2.46.0, frontera de procesos cerrada en v2.47.1 y endurecida en v2.47.2 |
| `done` | **K4b** | Repair shadow execution (WO→WR→integrate→Candidate); despacho exclusivo K6a, integración estricta, cápsula mínima, base derivada y registro 1:N; remediación de invariantes en v2.48.2 y cierre mode-only/baseline en v2.48.3 (`2026-08-26-k4b-mode-only-and-baseline-projection`) |
| `done` | **K6b** | Verifier independiente, evidence strategies/provenance y Assurance Graph como proyección derivada (no autoridad); archivado y publicado en v2.50.0 (`2026-08-27-k6b-verifier-evidence-assurance-graph`) |
| `done` | **K6b** | Verifier independiente, evidence strategies/provenance y Assurance Graph; integridad cerrada en v2.51.0 (`k6b-verification-integrity-remediation`) |
| `next-eligible` | **K6c** | ChallengePlan policy-selected |
| `pending` | K6d–K8 | Complexity delta, review authority, **Evaluation Attestation** |
| `pending` | K9 | Gate de promoción shadow/replay/A-B (checkpoints intermedios ya validados) |
Expand Down Expand Up @@ -186,7 +186,7 @@ Campo canónico de binding al candidato: **`candidate_id`** (no `candidate_diges
Entregado:
G0/G0.1 ─ O2A ─ O3 ─ O4+O5/O4.1 ─ O4.2 ─ O6A ─ O2B → K1 → K2 → K2.1 → K2a → K3 → K4a → K5 → K6a → K4b → K6b
Next-eligible: K6c
Next: K6c (next-eligible)
Pending: K6d → K7 → K8
Expand Down Expand Up @@ -1011,7 +1011,7 @@ Vertical Repair shadow produce Candidate congelado. Gate de invariantes cerrado

**Dependencias:** K4b + K6a + K3.

**Estado:** `done`. Change OpenSpec `k6b-verifier-evidence-assurance-graph` archivado y publicado en v2.50.0: verifier independiente, strategies/provenance y Assurance Graph como proyección derivada. OpenSpec/Git/Candidate siguen siendo la única autoridad semántica. El grafo no concede lifecycle, approval ni delivery. K6c es next-eligible.
**Estado:** `done`. Publicado en v2.50.0 (`k6b-verifier-evidence-assurance-graph`); integridad cerrada en v2.51.0 (`k6b-verification-integrity-remediation`): cobertura MUST del Obligation Manifest, assessments persistibles `assessment/v1`, provenance de collector del harness, `graph_id` canónico y proyección fail-closed. Este change no reabre el macro-slice. OpenSpec/Git/Candidate siguen siendo la única autoridad semántica. El grafo no concede lifecycle, approval ni delivery. **K6c es `next-eligible`.**

**Absorbe/rebasa:** P12/P16; O15; separación apply/verify vigente.

Expand Down Expand Up @@ -1103,9 +1103,9 @@ external-unverified
- equivalence manifest queda listo para K9;
- ningún consumer trata el Assurance Graph como segunda fuente de verdad frente a OpenSpec/Git/Candidate.

**Gate terminal:** verifier, strategy selector, provenance y Assurance Graph (proyección) conformes; checkpoint evidencia/challenges → `continue` | `revise` | `reject`. K6c no empieza antes.
**Gate terminal:** verifier, strategy selector, provenance y Assurance Graph (proyección) conformes; checkpoint evidencia/challenges → `continue` | `revise` | `reject`. Cerrado en v2.51.0. Desbloquea K6c.

### K6c — adversarial challenges (policy-selected) — **pending**
### K6c — adversarial challenges (policy-selected) — **next-eligible**

**Dependencias:** K6b (+ `PolicySnapshot` / strategy de evidencia).

Expand Down Expand Up @@ -2060,3 +2060,5 @@ Un Change Program (objetivo → children OpenSpec + cursor, ver investigación `
- 2026-08-27: reconciliación aditiva (sin mover ruta crítica ni next-eligible): se nombra la distinción proceso intra-change vs Change Program inter-change; first-match de la tabla viva es compatibilidad, no K10; K6b/R4/K10 no absorben ese hueco. Investigación no normativa `docs/architecture/research/proportional-process-and-change-program.md`. Arquitectura: corte conceptual de la misma fecha; deuda stale K3/K4a/K5/K6a/K4b reconciliada.
- 2026-08-27: K6b (`k6b-verifier-evidence-assurance-graph`) entra en apply: verifier independiente, evidence strategies/provenance y Assurance Graph proyección `implemented`; autoridad independiente del grafo, K6c/K7/K8 permanecen `target`. K6c queda next-eligible.
- 2026-08-27: K6b cierra con verify PASS, 4R approved y archive transaccional; publicado en v2.50.0. K6c queda next-eligible.
- 2026-08-27: K6b entra en `revise` (`k6b-verification-integrity-remediation`): cobertura MUST, assessments persistibles, provenance de collector, `graph_id` canónico y proyección fail-closed. K6c pasa a `blocked-by-K6b-remediation` hasta archive de esa remediación.
- 2026-08-27: K6b (`k6b-verification-integrity-remediation`) cierra integridad con verify PASS, 4R successor approved y archive transaccional; publicado en v2.51.0. K6b queda `done`; K6c queda next-eligible.
Loading