@tacuchi/agent-workflow-cli 12.8.0 → 12.9.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.
@@ -4,6 +4,14 @@ import { type CheckpointFields } from "./checkpoint-service.js";
4
4
  import type { PathsService } from "./paths-service.js";
5
5
  export interface SessionResumeInput {
6
6
  code?: string;
7
+ /**
8
+ * Reactivate a closed session being resumed (remove its `.closed` sentinel).
9
+ * Default false = read-only resume. This is the inter-turn continuity move
10
+ * (operating context, row 2): a related bare prompt reopens the most-recent
11
+ * session so new work — scripts into its SCRIPTS.sql, a re-close at
12
+ * convergence — lands in an *active* session, not a closed one.
13
+ */
14
+ reopen?: boolean;
7
15
  }
8
16
  export interface SessionResumeOutput {
9
17
  code: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"session-resume-service.d.ts","sourceRoot":"","sources":["../../src/application/session-resume-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,CAwBnD"}
1
+ {"version":3,"file":"session-resume-service.d.ts","sourceRoot":"","sources":["../../src/application/session-resume-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,cAAc,EAClB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,CAkCnD"}
@@ -1,12 +1,21 @@
1
+ import { join } from "node:path";
1
2
  import { readLatestCheckpoint } from "./checkpoint-service.js";
2
3
  import { relpath } from "./paths.js";
3
4
  import { findArtifact } from "./session-artifacts.js";
4
- import { resolveSession } from "./session-resolver.js";
5
+ import { CLOSED_MARKER, resolveSession } from "./session-resolver.js";
5
6
  export async function runSessionResume(fs, env, paths, input) {
6
7
  const session = await resolveSession(fs, env, paths, input.code, true);
7
8
  if (!session) {
8
9
  return { error: "session_not_found", code: input.code ?? null };
9
10
  }
11
+ // Inter-turn continuity (operating context, row 2): when explicitly resuming
12
+ // to continue, a closed session is REOPENED — drop the `.closed` sentinel so
13
+ // it becomes active again. `remove` is idempotent; a no-op when already active.
14
+ let state = session.state;
15
+ if (input.reopen === true && state === "closed") {
16
+ await fs.remove(join(session.path, CLOSED_MARKER));
17
+ state = "active";
18
+ }
10
19
  const cwd = env.cwd();
11
20
  // Dual-read: new-model SESSION.md first, legacy OBJECTIVE.md as fallback.
12
21
  const objetivoPath = (await findArtifact(session.path, "session", fs)) ??
@@ -18,7 +27,7 @@ export async function runSessionResume(fs, env, paths, input) {
18
27
  code: session.code,
19
28
  folder: session.folder,
20
29
  path: relpath(session.path, cwd),
21
- state: session.state,
30
+ state,
22
31
  objetivo: objetivoText,
23
32
  objetivo_text: objetivoText,
24
33
  checkpoint,
@@ -1 +1 @@
1
- {"version":3,"file":"session-resume-service.js","sourceRoot":"","sources":["../../src/application/session-resume-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAqBvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,KAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IACtB,0EAA0E;IAC1E,MAAM,YAAY,GAChB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3E,mFAAmF;IACnF,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,YAAY;QACtB,aAAa,EAAE,YAAY;QAC3B,UAAU;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"session-resume-service.js","sourceRoot":"","sources":["../../src/application/session-resume-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAyB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AA6BtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,GAAY,EACZ,KAAmB,EACnB,KAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,gFAAgF;IAChF,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;QACnD,KAAK,GAAG,QAAQ,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC;IACtB,0EAA0E;IAC1E,MAAM,YAAY,GAChB,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3E,mFAAmF;IACnF,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QAChC,KAAK;QACL,QAAQ,EAAE,YAAY;QACtB,aAAa,EAAE,YAAY;QAC3B,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -1,10 +1,14 @@
1
1
  import { runSessionResume } from "../../application/session-resume-service.js";
2
2
  export const sessionResumeCommand = {
3
3
  name: "session-resume",
4
- describe: "Load resume payload for a session (objetivo + checkpoint from session folder).",
4
+ describe: "Load resume payload for a session (objetivo + checkpoint). With --reopen, reactivate it if closed (inter-turn continuity).",
5
5
  async execute(args, ctx) {
6
6
  const code = args.values.get("code");
7
- const data = await runSessionResume(ctx.fs, ctx.env, ctx.paths, code !== undefined ? { code } : {});
7
+ const reopen = args.flags.has("--reopen");
8
+ const data = await runSessionResume(ctx.fs, ctx.env, ctx.paths, {
9
+ ...(code !== undefined ? { code } : {}),
10
+ ...(reopen ? { reopen: true } : {}),
11
+ });
8
12
  return { ok: true, data, exitCode: 0 };
9
13
  },
10
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"session-resume.js","sourceRoot":"","sources":["../../../src/cli/commands/session-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAM/E,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,gFAAgF;IAC1F,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CACjC,GAAG,CAAC,EAAE,EACN,GAAG,CAAC,GAAG,EACP,GAAG,CAAC,KAAK,EACT,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"session-resume.js","sourceRoot":"","sources":["../../../src/cli/commands/session-resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAM/E,MAAM,CAAC,MAAM,oBAAoB,GAAe;IAC9C,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EACN,4HAA4H;IAC9H,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE;YAC9D,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tacuchi/agent-workflow-cli",
3
- "version": "12.8.0",
3
+ "version": "12.9.0",
4
4
  "description": "Agnostic runtime CLI for AI development workflows — a stages + loops + artifacts harness. Bundles the universal `w` skill set under `skills/w/` (slash commands `/w:*`: spec-new/spec-refine, plan-new/plan-exec, quick, workspace-init, export-*); `self install --target <host>` copies SKILL + commands + hooks into the host. Pluggable capability skills via `.workflow/skills.toml`. Multi-empresa parametrization via `profile.json` cascade. Namespace auto-detected from any `.<ns>/sessions/` dir in CWD; default `workflow`.",
5
5
  "type": "module",
6
6
  "bin": {
package/skills/w/SKILL.md CHANGED
@@ -65,6 +65,19 @@ USUARIO invoca
65
65
 
66
66
  Cadena típica: prompt → `spec-new` genera `docs/specs/NNN-spec-<slug>.md` → `spec-refine` corre el loop y refina **ese mismo spec in place** → `plan-new` → `docs/plans/PPP-plan-<slug>.md` → `plan-exec` ejecuta y actualiza el plan (living doc) + artefactos en sesiones. La promoción del resto a `docs/` es **siempre** un paso aparte vía `export-*`.
67
67
 
68
+ ### Contexto operativo — dónde aterriza cada cosa
69
+
70
+ Antes de cualquier loop, la IA resuelve su **contexto operativo** en **cada prompt** con dos detecciones: **¿workspace?** (existe `.<ns>/sessions/`) + **¿sesión a continuar?** (una activa, o una reciente que este prompt continúa). Eso decide el comportamiento y **dónde aterrizan los artefactos** (SQL, scripts, decisiones, …):
71
+
72
+ | ¿Workspace? | Trigger | → Comportamiento + ruteo |
73
+ |---|---|---|
74
+ | **Sí** | **comando de flujo** (`quick`·`spec-*`·`plan-*`) | crea sesión **nueva**, arranca el loop → artefactos a **esa** sesión (`SCRIPTS.sql`, …) |
75
+ | **Sí** | **prompt sin comando** (relacionado) | **continúa/reabre la sesión más reciente** → los scripts editan **su** `SCRIPTS.sql` (no crea otra) |
76
+ | **Sí** | **prompt sin comando** (no-relacionado / sin sesión) | **sin flujo**: trabajo directo → escribe en `docs/` por convención + numeración (`aw next-number`) |
77
+ | **No** | cualquiera | **vanilla** — sin workspace ni flujo, la IA es libre (nativo) |
78
+
79
+ **Regla de continuidad:** el **comando** señala "nueva línea de trabajo" (sesión nueva); un **prompt sin comando** es "sigo en la misma" → por default continúa/reabre la más reciente (la *última iniciada*); solo si es claramente no-relacionado ofrece elegir (`continuar NNN` | `trabajo nuevo`) o cae a "sin flujo". Convergencia cierra la sesión; un prompt relacionado posterior la **reabre** (el resume quita `.closed`). Es la cara **inter-turno** del *objetivo persistente* (mismo `CHECKPOINT`+resume, aplicado al próximo prompt) — **doctrina agnóstica**, no un hook del host. Aplica a **todo artefacto** (`SCRIPTS.sql` es el ejemplo trabajado); ver `loops/quick-loop/SKILL.md` para el caso QUICK.
80
+
68
81
  ### The commands (`/w:` namespace)
69
82
 
70
83
  - `/w:workspace-init` — inicializa el workspace.
@@ -166,6 +179,8 @@ Las únicas `must` para el ciclo de un loop son **structured-choice** y **compac
166
179
  5. **Git seguro** — rama esperada verificada antes de editar; commits propuestos por fuente; nunca `push`/`--amend`/`--no-verify`.
167
180
  6. **Chasis de loops** — **objetivo persistente + verification-first** (persigue `SESSION.Objective` hasta que sus `SESSION.Success criteria` —sembrados al inicio, TDD generalizado— están en verde) · gap-driven convergente · una sola session por run (research inline) · **structured-choice** con ≤3 preguntas de contenido + 1 control `flow` (`Compactar`/`Cerrar`) siempre · compactación/resume · artefactos como log vivo **artifact-first** (sembrar `Pending`/`Next` antes, `Completed` después; `CHECKPOINT` siempre; `BACKLOG` solo si difiere).
168
181
 
182
+ > **Alcance de #1/#2:** gobiernan el plano **sesión → `docs/`** (solo `export-*` lo cruza). El *authoring directo sin flujo* (ver § *Contexto operativo*) es **otro plano**: sin sesión activa, `docs/` es la única superficie gestionada → la IA escribe ahí por convención + numeración. No es auto-export (no hay sesión de la cual graduar).
183
+
169
184
  ## Output
170
185
 
171
186
  Ninguno. Es orientación pura: no escribe documentos ni artefactos.
@@ -19,6 +19,8 @@ Central distinction of the model:
19
19
 
20
20
  > An artifact may be **promoted** to a `docs/` document (e.g. `SCRIPTS.sql` → `docs/scripts/`) — but **only via dedicated `export-*` skills**, **never** automatically by the loops. The spec and the plan **are not** artifacts: they are documents.
21
21
 
22
+ > **Routing by operating context.** *Where* an artifact is written is decided by the operating context (see [`../SKILL.md`](../SKILL.md) § *Contexto operativo*): **inside a flow** → the **active/continued** session — a prompt with no command edits the `SCRIPTS.sql` (or `DECISION`, …) of the **most recent** session, it does not spawn a new one; **in a workspace but with no flow** → directly into `docs/` by convention + numbering (`aw next-number`), since there is no session to hold it (and it is **not** auto-export); **no workspace** → the AI is free (vanilla). Session→`docs/` promotion is still **only** via `export-*`.
23
+
22
24
  ---
23
25
 
24
26
  ## Sessions & their artifacts
@@ -12,7 +12,7 @@ Un loop es una **skill** que le enseña a la IA *cómo iterar* hasta producir un
12
12
 
13
13
  Propiedades comunes a **los 4 loops**:
14
14
 
15
- 1. **Objetivo persistente + verification-first** — el loop persigue su `SESSION.Objective` y solo finaliza cuando sus `SESSION.Success criteria` están **en verde** (o el humano aborta vía `flow` `Cerrar`). Esos criterios —la condición de término— se **siembran al inicio** (*verification-first*, TDD generalizado: tests ejecutables para código, rúbrica falsable para análisis/diseño), no se improvisan al final. Modelado en el `/goal` de Claude Code pero como **doctrina agnóstica** (sin depender de ningún host) y con registro durable. El "no parar hasta converger" es del loop, no del arnés.
15
+ 1. **Objetivo persistente + verification-first** — el loop persigue su `SESSION.Objective` y solo finaliza cuando sus `SESSION.Success criteria` están **en verde** (o el humano aborta vía `flow` `Cerrar`). Esos criterios —la condición de término— se **siembran al inicio** (*verification-first*, TDD generalizado: tests ejecutables para código, rúbrica falsable para análisis/diseño), no se improvisan al final. Modelado en el `/goal` de Claude Code pero como **doctrina agnóstica** (sin depender de ningún host) y con registro durable. El "no parar hasta converger" es del loop, no del arnés. **Entre turnos**, el mismo `CHECKPOINT`+resume hace que un prompt **sin comando** **continúe/reabra la sesión más reciente** en vez de arrancar trabajo suelto — la cara *inter-turno* del objetivo persistente (ver [`../SKILL.md`](../SKILL.md) § *Contexto operativo*).
16
16
  2. **Gap-driven convergente** — el *cómo* del objetivo persistente: cada ciclo `detect_gaps` → resolver (humano o research) → integrar → repetir hasta que no queden gaps materiales. Los gaps "agotados" (límite `MAX` de intentos) no se re-disparan → garantiza convergencia.
17
17
  3. **Una sola session por run + research inline** — el loop crea **una** session en `.workflow/sessions/` (la dueña del run) y maneja **sus** artefactos. La **investigación es inline**: una actividad dentro de esa misma session que escribe `ANALYSIS-FILE`/`CONCLUSIONS` (+ `SCRIPTS.sql` read-only si consulta BD) en su propia carpeta — ya no es una session aparte. **El usuario nunca crea sessions.** Los artefactos son el **registro vivo** del run — **ciclo artifact-first**: sembrar `CHECKPOINT.Pending/Next` (la intención) antes de ejecutar, llevar a `Completed`/DECISION después; CHECKPOINT actualizado en cada límite de gap/fase, BACKLOG solo si difiere. El spec/plan es la base guía.
18
18
  4. **Structured-choice con dos planos** (capacidad del arnés — ver [`../harness/SKILL.md`](../harness/SKILL.md); en **Claude Code** es `AskUserQuestion`, máx 4 preguntas/llamada → **≤3 + 1 control `flow`**; sin elección estructurada degrada a markdown numerado):
@@ -61,6 +61,16 @@ QUICK
61
61
  - los artefactos (`DECISION`, `SCRIPTS.sql`) **quedan en la session quick** como contexto referenciable por la nueva session (no se migran);
62
62
  - **asimetría**: escalar a **PLAN** puede **absorber** el avance (plan-exec retoma el working tree existente); escalar a **SPEC** **reinicia** el ciclo de diseño y trata el código a medias como **contexto/referencia**, no como trabajo ya ingerido.
63
63
 
64
+ ## Continuidad entre prompts (contexto operativo)
65
+
66
+ `quick` es donde la **regla de continuidad** (ver [`../../SKILL.md`](../../SKILL.md) § *Contexto operativo*) se ve más claro. Dentro de un workspace:
67
+
68
+ 1. `/w:quick "primer prompt"` (**comando**) → crea la session `NNN-<slug>-quick`, arranca el loop. Los scripts van a **su** `SCRIPTS.sql`.
69
+ 2. `"segundo prompt"` (**sin comando**, trabajo relacionado) → **no** crea otra session: **continúa/reabre la más reciente** (la del paso 1) y agrega los nuevos scripts a **esa misma** `SCRIPTS.sql`.
70
+ 3. `/w:quick "tercer prompt"` (**comando** otra vez) → **nueva** session, nuevo loop.
71
+
72
+ > El **comando** señala "nueva línea de trabajo"; un **prompt pelado** es "sigo en la misma" → por default continúa/reabre la más reciente (la *última iniciada*). Si es claramente no-relacionado, ofrece elegir (`continuar NNN` | `trabajo nuevo`) o cae a la rama **sin flujo** (escribe en `docs/` por convención + numeración). Sin workspace → comportamiento **vanilla**.
73
+
64
74
  ## Sequence
65
75
 
66
76
  ```
@@ -49,10 +49,12 @@ Está **modelado en cómo se comporta el `/goal` de Claude Code** (declarás un
49
49
  | no parar hasta cumplirlo | `repeat:` gap-driven hasta `gaps == ∅` |
50
50
  | objetivo cumplido → auto-clear | **convergence gate** pasa → `finalize` |
51
51
  | `/goal clear` (abortar antes) | control `flow` `Cerrar` |
52
- | la directiva sobrevive el contexto | `CHECKPOINT` + resume |
52
+ | la directiva sobrevive el contexto | `CHECKPOINT` + resume (compactación **y próximo prompt**) |
53
53
 
54
54
  > Los heirs heredan el frame: `plan-new`/`plan-exec` persiguen el plan hasta su gate; `quick-loop` es la encarnación más directa (el prompt *es* el objetivo) — el "símil a `/goal`" del modelo.
55
55
 
56
+ > **Continuidad inter-turno (contexto operativo).** El mismo `CHECKPOINT`+resume que sobrevive la compactación gobierna también el **próximo prompt**: dentro de un workspace, un prompt **sin comando** **continúa/reabre la sesión más reciente** (la *última iniciada*) en vez de arrancar trabajo suelto — el objetivo persiste **entre turnos**, no solo dentro del run. Un **comando de flujo** señala "nueva línea de trabajo" (sesión nueva); la convergencia cierra la sesión y un prompt relacionado posterior la **reabre** (resume quita `.closed`). Es la fila 2 de la matriz de contexto operativo (ver [`../../SKILL.md`](../../SKILL.md) § *Contexto operativo*) — doctrina agnóstica que la IA evalúa en cada turno, no un Stop hook del host.
57
+
56
58
  ## Verification-first (chasis — heredado por todos los loops)
57
59
 
58
60
  El objetivo persistente necesita una **condición de término checkable** — si no, el loop no sabe cuándo cumplió (o persigue un blanco que inventó). Esa condición se **siembra ANTES de ejecutar**, no se improvisa al final: es **TDD generalizado**. Junto con artifact-first (sección siguiente) son los **dos sembrados** de cada gap/fase: *cómo sabré que funcionó* + *qué voy a hacer*.
@@ -106,6 +108,7 @@ El **CLI es dueño del número**: `aw session-create` antepone un `NNN` **global
106
108
  - `aw session-create --type refine --name spec-refine` → crea `NNN-spec-refine` / `aw session-resume --code <…>` (detecta `CHECKPOINT`).
107
109
  - `aw checkpoint-write` / `aw checkpoint-read` para el resume.
108
110
  - `aw session-close` al cerrar (con razón); `aw session-artifacts` para inspeccionar.
111
+ - **Reabrir para continuar** (contexto operativo, fila 2): `aw session-resume --code <NNN> --reopen` reactiva una sesión **cerrada** (quita `.closed` → activa) para seguir trabajando en ella; sin `--reopen`, el resume es read-only. Para detectar cuál es la más reciente cerrada: `aw resume-summary --include-recent-closed` (o `aw sessions --state all`).
109
112
 
110
113
  ## Composes
111
114