From 8c1cda61e17d68d924d7d5c1ca4220c46e096a66 Mon Sep 17 00:00:00 2001 From: Agent IX Date: Fri, 7 Aug 2026 09:47:31 -0700 Subject: [PATCH] spec: convert prose Acceptance Criteria to the asserted table shape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit spec-artifacts-iso#11. An FR/NFR `## Acceptance Criteria` section must now be absent or well-formed — a present-but-prose section fails. The asserted shape is `ID | Criteria | Verification` with `{id}-AC-N` ids. Converted rather than dropped. Where a bullet already declared its own id (`- **NFR-001-AC-3**: ...`), that id becomes the row id, so anything tracing it keeps resolving; #11 permits omitting the section for a measurable NFR, but several repos trace these ids from spec/tests.md and deleting the section would silently break the coverage claim. Criterion text is preserved verbatim apart from stripping the id prefix that becomes the ID cell. Only `Verification` is new, derived from what the criterion describes: a committed file or static check -> Inspection, an executing test -> Test, a measured threshold -> Analysis, an operational outcome -> Demonstration. The converter refuses anything that is not a clean bullet list, so a prose paragraph is never split. Every FR and NFR document in this repo validates clean against spec-artifacts-iso. Refs agent-ix/spec-artifacts-iso#11 Co-Authored-By: Claude Opus 5 (1M context) --- .../local/NFR-001-output-via-ix-ui-cli.md | 17 ++++++++++------- ...FR-002-destructive-operation-confirmation.md | 12 ++++++++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/spec/non-functional/local/NFR-001-output-via-ix-ui-cli.md b/spec/non-functional/local/NFR-001-output-via-ix-ui-cli.md index 5b74a52..4d1c87f 100644 --- a/spec/non-functional/local/NFR-001-output-via-ix-ui-cli.md +++ b/spec/non-functional/local/NFR-001-output-via-ix-ui-cli.md @@ -42,13 +42,16 @@ ix-ui-cli is the design system. Centralizing visual decisions there means a sing ## Acceptance Criteria -- **NFR-001-AC-1**: A static grep for `console\.log\|console\.error\|console\.warn\|process\.stderr\.write` across `packages/*/src/` and `apps/*/src/` returns zero matches. -- **NFR-001-AC-2**: Every command handler that opens a frame uses `startListing` imported from `@agent-ix/ix-ui-cli`. No command handler defines its own `intro`/`outro` style helpers. -- **NFR-001-AC-3**: Multi-service progress uses `PhaseTable` imported from `@agent-ix/ix-ui-cli`, not a locally defined display class. -- **NFR-001-AC-4**: A static grep for the deprecated framing API (`introCommand|outroSuccess|outroError|outroWarning|outroInfo|runTaskList`) across `packages/*/src/` and `apps/*/src/` returns zero matches. -- **NFR-001-AC-5**: A static grep for inline ANSI escape sequences (`\\x1b\[`, `\\u001b\[`) and inline box-drawing connectors (`└──┐`, `└──•`, `└──`) across `packages/*/src/` and `apps/*/src/` returns zero matches outside test files. (All such tokens come from `@agent-ix/ix-ui-cli`.) -- **NFR-001-AC-6**: Live Ink command wrappers delegate Helm, Kubernetes, and long-running process orchestration to controller modules; React components own rendering state only. -- **NFR-001-AC-7**: Shared phase-row state is modeled outside command wrappers and emits immutable snapshots for live Ink renderers. + +| ID | Criteria | Verification | +|----|----------|--------------| +| NFR-001-AC-1 | A static grep for `console\.log\\|console\.error\\|console\.warn\\|process\.stderr\.write` across `packages/*/src/` and `apps/*/src/` returns zero matches. | Inspection | +| NFR-001-AC-2 | Every command handler that opens a frame uses `startListing` imported from `@agent-ix/ix-ui-cli`. No command handler defines its own `intro`/`outro` style helpers. | Demonstration | +| NFR-001-AC-3 | Multi-service progress uses `PhaseTable` imported from `@agent-ix/ix-ui-cli`, not a locally defined display class. | Demonstration | +| NFR-001-AC-4 | A static grep for the deprecated framing API (`introCommand\|outroSuccess\|outroError\|outroWarning\|outroInfo\|runTaskList`) across `packages/*/src/` and `apps/*/src/` returns zero matches. | Inspection | +| NFR-001-AC-5 | A static grep for inline ANSI escape sequences (`\\x1b\[`, `\\u001b\[`) and inline box-drawing connectors (`└──┐`, `└──•`, `└──`) across `packages/*/src/` and `apps/*/src/` returns zero matches outside test files. (All such tokens come from `@agent-ix/ix-ui-cli`.) | Test | +| NFR-001-AC-6 | Live Ink command wrappers delegate Helm, Kubernetes, and long-running process orchestration to controller modules; React components own rendering state only. | Demonstration | +| NFR-001-AC-7 | Shared phase-row state is modeled outside command wrappers and emits immutable snapshots for live Ink renderers. | Demonstration | ## Measurement and Evaluation diff --git a/spec/non-functional/local/NFR-002-destructive-operation-confirmation.md b/spec/non-functional/local/NFR-002-destructive-operation-confirmation.md index 849d9ae..b08bd8c 100644 --- a/spec/non-functional/local/NFR-002-destructive-operation-confirmation.md +++ b/spec/non-functional/local/NFR-002-destructive-operation-confirmation.md @@ -35,7 +35,11 @@ regression. ## Acceptance Criteria -- **NFR-002-AC-1**: The confirmation prompt MUST include the literal cluster name (e.g. `'ix'`) in its message text. -- **NFR-002-AC-2**: Declined or cancelled confirmation MUST exit 0 with no destructive action taken. -- **NFR-002-AC-3**: `--yes` flag bypasses the prompt; the destructive action proceeds immediately. -- **NFR-002-AC-4**: No other cluster teardown command (future additions) may skip this constraint without an explicit NFR exemption. + +| ID | Criteria | Verification | +|----|----------|--------------| +| NFR-002-AC-1 | The confirmation prompt MUST include the literal cluster name (e.g. `'ix'`) in its message text. | Demonstration | +| NFR-002-AC-2 | Declined or cancelled confirmation MUST exit 0 with no destructive action taken. | Demonstration | +| NFR-002-AC-3 | `--yes` flag bypasses the prompt; the destructive action proceeds immediately. | Demonstration | +| NFR-002-AC-4 | No other cluster teardown command (future additions) may skip this constraint without an explicit NFR exemption. | Demonstration | +