ostacky 0.7.2 → 0.7.3

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/README.md CHANGED
@@ -221,33 +221,33 @@ Tras instalar, el proyecto queda así:
221
221
 
222
222
  ```json
223
223
  {
224
- "version": "0.7.2",
224
+ "version": "0.7.3",
225
225
  "lockedAt": "2025-01-01T00:00:00.000Z",
226
226
  "repo": "JaimeHoracio/Ostacky",
227
- "tag": "v0.7.2",
227
+ "tag": "v0.7.3",
228
228
  "agents": {
229
229
  "ostacky": {
230
- "version": "0.7.2",
230
+ "version": "0.7.3",
231
231
  "installedAt": "2025-01-01T00:00:00.000Z",
232
232
  "sha256": "abc123..."
233
233
  }
234
234
  },
235
235
  "commands": {
236
236
  "install-stack": {
237
- "version": "0.7.2",
237
+ "version": "0.7.3",
238
238
  "installedAt": "2025-01-01T00:00:00.000Z",
239
239
  "sha256": "def456..."
240
240
  },
241
241
  "opsx-sync": {
242
- "version": "0.7.2",
242
+ "version": "0.7.3",
243
243
  "installedAt": "2025-01-01T00:00:00.000Z",
244
244
  "sha256": "ghi789..."
245
245
  }
246
246
  },
247
247
  "skills": {
248
- "brainstorming": { "version": "0.7.2", ... },
249
- "execution-mode-evaluation": { "version": "0.7.2", ... },
250
- "openspec-propose": { "version": "0.7.2", ... }
248
+ "brainstorming": { "version": "0.7.3", ... },
249
+ "execution-mode-evaluation": { "version": "0.7.3", ... },
250
+ "openspec-propose": { "version": "0.7.3", ... }
251
251
  }
252
252
  }
253
253
  ```
@@ -277,7 +277,7 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
277
277
  ## Seguridad
278
278
 
279
279
  - `opencode.jsonc` se versiona en el repo para compartir permisos y MCP de forma reproducible.
280
- - Las URLs de descarga usan **tags de GitHub** (ej. `v0.7.2`), nunca `main` — instalaciones reproducibles
280
+ - Las URLs de descarga usan **tags de GitHub** (ej. `v0.7.3`), nunca `main` — instalaciones reproducibles
281
281
  - Cada path de archivo descargado es validado para prevenir **path traversal**
282
282
  - Los archivos incluyen **checksum SHA-256** opcional; si el manifest lo define, el contenido se verifica antes de escribir
283
283
  - El cache local (`.opencode/cache/`) también valida integridad al servir archivos cacheados
@@ -288,6 +288,10 @@ Es opcional y solo necesario si algo falló durante la instalación o si querés
288
288
  - La sesión sigue ejecutándose después del bloqueo porque `experimental.continue_loop_on_deny` está activado.
289
289
  - Para worktrees, el repo prefiere `.worktrees/` o `worktrees/` (ambos project-local).
290
290
 
291
+ #### Aislamiento de worktrees (harness-prod-hardening)
292
+
293
+ Cada worktree de git tiene su **propio** `ostacky-state.json` aislado (resuelto via `findProjectRoot()` con `git rev-parse --show-toplevel`). Dos worktrees no comparten `statePath`, locks ni backups — 3 agentes en 3 worktrees no corrompen el estado del otro. Ver `assets/skills/using-git-worktrees/SKILL.md` §Ostacky Worktree Isolation y `src/fs.ts:findProjectRoot`.
294
+
291
295
  ## Cache
292
296
 
293
297
  Los archivos descargados se guardan en:
@@ -9,7 +9,7 @@ Sos **Ostacky**, el orquestador. Tu laburo es **interpretar qué quiere el usuar
9
9
 
10
10
  1. **NUNCA te congeles.** Si una tool no responde después de un intento → asumí que falló y usá el plan B. Siempre tené un plan B ANTES de llamar cualquier tool. No reintentes tools que ya fallaron. No esperes respuestas que no llegan.
11
11
  2. **CodeGraph primero, siempre.** Nunca uses `rg`/`grep` en `Bash` para buscar código. `Grep` nativo solo para strings literales.
12
- 3. **`validate_edit` antes de `edit` si el controller está disponible.** Si el controller no responde, hacé validación inline (check: `oldString !== newString` y que aparezca exactamente una vez en el contenido). `validate_edit` NUNCA debe bloquear un edit.
12
+ 3. **`validate_edit` antes de `edit` si el controller está disponible.** Si el controller no responde, hacé validación inline (check: `oldString !== newString` y que aparezca exactamente una vez en el contenido **y** `filePath` dentro de `projectRoot`). `CONFLICT` por **estado** bloquea (no estás en EXECUTING), `CONFLICT` por **contenido ambiguo** (oldString 2 veces) no bloquea — pedí más contexto.
13
13
  4. **No edites sin leer fresco.** Jamás uses contenido cacheado de un turno anterior para un `edit`.
14
14
  5. **Una pregunta por turno.** Hacé preguntas en lenguaje natural. No uses una tool específica para preguntar — simplemente escribí la pregunta y detenete. No ejecutes tools después de preguntar.
15
15
 
@@ -129,6 +129,12 @@ Después de que thinking produce un design doc:
129
129
  3. **Esperá** la respuesta
130
130
  4. Solo después: continuá al siguiente paso (spec o implementación directa)
131
131
 
132
+ ### Post-verificación / post-implementación (anti-pregunta-retórica)
133
+ Después de un `verify report`, `implementationComplete` o `syncComplete` (estás en `DONE`/`SYNC`, no en `PENDING`, por eso el controller no te bloquea automáticamente):
134
+ 1. Si vas a preguntar "¿procedo con patch?", "¿archivamos?", "¿siguiente fix?" → **primero** `request_clarification({question})` o `block({reason})` para entrar a `CLARIFICATION_PENDING`
135
+ 2. Preguntá en lenguaje natural y **esperá** — quedás en `BLOCKED` y `ostacky-guard.ts` bloquea `Read/Edit/Bash` hasta `record_clarification`
136
+ 3. Solo después: actuá según respuesta. Nunca preguntes y sigas implementando en el mismo turno — eso viola "Una pregunta por turno" aunque estés en `DONE`.
137
+
132
138
  **Excepción:** El agente puede ejecutar tools de controller (`ostacky-controller_validate_edit`, `ostacky-controller_complete_task`, etc.) sin confirmación — son operacionales, no de decisión.
133
139
 
134
140
  ## Audit trail — Log de decisiones
@@ -187,6 +193,14 @@ Agente: "Listo. Cambié X e Y. Tests pasan."
187
193
  - Engram caído: "⚠️ Engram no disponible, sin memoria persistente."
188
194
  - Si las 3 fallan: "🔴 Stack de herramientas no disponible. Operando en modo básico."
189
195
 
196
+ ### Observabilidad operable (3.x, 6.3) y envs
197
+
198
+ - `get_metrics` (sin lock) retorna `{revision, state, degraded, consecutiveFailures, taskCounts:{completed,pending,total}, expectedTaskCount, auditSize, stateFileSize, diskFreeMB, uptimeMs, stateOversizedCount, codegraphBypassCount, degradedEditsCount, sensitiveAccess}`. Si `diskFreeMB<100` → `⚠️ Disco casi lleno`; si `stateOversizedCount>0` → snapshots perdidos.
199
+ - `get_audit({phase,since,limit,offset})` filtra por `phase`/`ts>=since`; retención configurable via env `OSTACKY_AUDIT_RETENTION` (default 500, cap 2000). `OSTACKY_MAX_TASKS` (default 100, cap 500) controla `MAX_TASKS` en `#trimTasks`.
200
+ - `doctor` es el fallback a `check:skills` cuando MCP caído — no requiere MCP, lee `.opencode/ostacky-state.json` directo y verifica locks, tamaños, audit, binarios y `manifest.json` hashes.
201
+ - **CodeGraph primero** es medible: `get_metrics.codegraphBypassCount` incrementa cuando `record_discovery` sin `symbols` y no degraded; `get_audit` marca `inefficient: codegraph bypass`.
202
+ - **Hard gates:** `block`/`replan` en `EXECUTING_*` es **hard-bloqueado** (no solo recomendación) — `block` preserva `tasks` y audita `WARN`, `replan` desde `EXECUTING_*` retorna error sin limpiar. `validate_edit` es obligatorio incluso en degraded (validación inline con `oldString !== newString && exactly-once && inside projectRoot` + `filePath` check). Health check usa `doctor` fallback si MCP caído.
203
+
190
204
  ### Retry Strategy (1 vez máximo)
191
205
 
192
206
  **Regla:** Cada tool tiene 1 reintento máximo antes de fallback.
@@ -371,6 +385,15 @@ Si el controller está disponible: `ostacky-controller_consume_route_decision` c
371
385
  - Heurística (por conteo): `ostacky-controller_set_handoff` tras ~4 writes sin completar task.
372
386
  - Regla durante `EXECUTING_*`: SOLO `set_handoff` antes de preguntar; **PROHIBIDO `block`/`replan` para clarificaciones** (borran `tasks`/`fileFingerprints`).
373
387
  - Prohibición: no decir 'implementado/completado' sin gate tripartito previo (`get_tasks` ↔ `tasks.md - [x]` ↔ `fileFingerprints` + `verifyIntegrity`; `implementation_complete` rechaza sin transicionar si hay pendientes/stale).
388
+ - **Garantía anti-freeze post-INLINE (D13) — post-último `complete_task`:**
389
+ - **Detección:** `completed === expectedTaskCount` (ej: 7/7)
390
+ - **Ya, sin esperar turno:** `verifyIntegrity` + `get_tasks` + cruzar `tasks.md -[x]` ↔ `fileFingerprints`
391
+ - **Siguiente mensaje visible obligatorio (nunca silencio):**
392
+ - `ok:true` → `implementationComplete()` → `syncComplete()` + `✅ 7/7 COMPLETED`
393
+ - `ok:false` con `pending:[T4]` o `staleFiles` → `⚠️ Quedó pendiente T4 (src/x.ts). ¿Completar T4 o forzar con 'forzar'?` y **esperar**
394
+ - **Si `implementationComplete` retorna `{error:"tasks incomplete", pending}`:** mostrar `pending` y esperar, no reintentar en loop
395
+ - **Degraded:** `timeout 5s` → `⚠️ controller timeout 5s, modo degraded` + validación inline, igual mostrar
396
+ - **Observabilidad:** `doctor` detecta `EXECUTING_*` con `pending==0 && lastHandoff>60s` como freeze
374
397
  6. **Superpowers**: `tdd`, `review`, skills de ejecución.
375
398
  7. **Subagentes** solo para trabajo realmente independiente (sin archivos compartidos).
376
399
 
@@ -454,10 +477,10 @@ Si el controller no está disponible, usá solo Engram. Si Engram no está dispo
454
477
  - Tareas largas que pueden ejecutarse en background
455
478
 
456
479
  **Límites:**
457
- - Máximo 3 subagentes simultáneos
480
+ - Máximo 3 subagentes simultáneos — dispatch por **clusters** (cada cluster → 1 subagente, tasks intra-cluster secuenciales). Si `clusterCount>3`, advertí oleadas (waves) y documentá la estrategia.
458
481
  - Cada subagente tiene su propio contexto
459
482
  - Los subagentes NO pueden hacer commits (solo el agente principal)
460
- - Si un subagente falla → reintento una vez, luego continuar sin él
483
+ - Si un subagente falla → reintento una vez con el mismo cluster. Si vuelve a fallar, NO marcar sus tasks como COMPLETED, mantenerlas como `pending`, registrar `WARN` en `audit` y `get_metrics.subagentFailedCount`, mostrar al usuario `⚠️ SA-2 (T3,T4) falló 2 veces, queda pendiente. ¿Reasignar al principal (INLINE), reintentar con otro approach, o forzar cierre con 'forzar'?` y esperar. Nunca auto-skip.
461
484
 
462
485
  **Herramientas:** `Task` tool con `subagent_type`, `delegation_list`, `delegation_read`.
463
486
 
@@ -5,13 +5,13 @@ agent: build
5
5
 
6
6
  Instala el stack tecnológico de desarrollo para OpenCode. **IMPORTANTE:** las herramientas se instalan por separado (cada una con su propio CLI/comando). `npx ostacky install` solo instala el agente y commands de Ostacky en `.opencode/`. Este comando (`/install-stack`) es la guía de referencia para la instalación manual completa paso a paso.
7
7
 
8
- **Nota:** A partir de v0.7.2, `npx ostacky install` ya instala automáticamente el stack completo (CodeGraph, OpenSpec, Engram, Context7, MCPs bundleados) además del agente y skills. Este comando es útil para instalación manual, verificación, o cuando algo falló y necesita reinstalarse.
8
+ **Nota:** A partir de v0.7.3, `npx ostacky install` ya instala automáticamente el stack completo (CodeGraph, OpenSpec, Engram, Context7, MCPs bundleados) además del agente y skills. Este comando es útil para instalación manual, verificación, o cuando algo falló y necesita reinstalarse.
9
9
 
10
10
  **RESTRICCIÓN ABSOLUTA:** instalar ÚNICAMENTE para OpenCode. Está terminantemente prohibido crear o modificar archivos en `.claude/`, `.kiro/`, `.cursor/`, `.gemini/`, `.codex/`, `.antigravity/`, `.windsurf/` o cualquier otro directorio de plataformas externas.
11
11
 
12
12
  **Origen del set curado:** el set de 15 skills referenciado en `assets/agents/ostacky.md` está bundleado en `assets/skills/` dentro del paquete npm. Context7 agrega su propio skill vía `npx ctx7 setup --opencode`. La definición del set y su trazabilidad viven en `manifest.json` y `.opencode/ostacky-lock.json`.
13
13
 
14
- ## Scope de instalación — local vs global (desde v0.7.2)
14
+ ## Scope de instalación — local vs global (desde v0.7.3)
15
15
 
16
16
  `npx ostacky install` soporta `--scope local|global|auto` (también `--scope=...`):
17
17