From 70c86ca5a13c1f7c1845ab87f9f06aeabd7365bd Mon Sep 17 00:00:00 2001 From: Wibo van der Sluis Date: Sat, 10 Oct 2026 14:03:10 +0200 Subject: [PATCH] feat: absorb unlazy completion rules as wording only (0.6.0) Finish every in-scope part of a request, ban placeholders and deferred remainder, report met/unmet parts, re-measure reported numbers, and make verify re-read the original request. Informed by unlazy (MIT); no code bundled. See ADR-005. Co-Authored-By: Claude Opus 5.5 --- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- THIRD_PARTY_NOTICES.md | 1 + docs/changelogs/CHANGELOG.md | 9 +++++++++ docs/tracking/DECISIONS.md | 28 ++++++++++++++++++++++++++++ skills/ai-native-build/SKILL.md | 4 ++-- skills/ai-native-sdlc/SKILL.md | 3 ++- skills/ai-native-verify/SKILL.md | 4 ++-- 8 files changed, 46 insertions(+), 7 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 0ade586..6c7a898 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "ai-native-sdlc", "displayName": "AI-Native SDLC", - "version": "0.5.1", + "version": "0.6.0", "description": "Lean, risk-sized, artifact-driven software delivery for Claude Code.", "author": { "name": "AI-Native SDLC Contributors" diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 6e8d082..345d6c1 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "ai-native-sdlc", - "version": "0.5.1", + "version": "0.6.0", "description": "Lean, risk-sized, artifact-driven software delivery for Codex and Claude Code.", "author": { "name": "AI-Native SDLC Contributors" diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 3466740..d2522eb 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -11,5 +11,6 @@ This plugin uses original wording and implementation-neutral workflow ideas info - Dietrich Gebert and contributors, [Ponytail](https://github.com/dietrichgebert/ponytail), MIT License. - Julius Brussee and contributors, [Caveman](https://github.com/juliusbrussee/caveman), MIT License for skills and adoption surfaces. Engine-linked runtime components use BSL-1.1 and are not bundled here. - Samir Sawarkar, [asd-ste100-skill](https://github.com/samirsawarkar/asd-ste100-skill), MIT License. Clarity rules are informed by ASD-STE100 Simplified Technical English, a specification of ASD (AeroSpace and Defence Industries Association of Europe); this plugin does not claim ASD-STE100 compliance. +- Leonxlnx, [unlazy](https://github.com/Leonxlnx/unlazy), MIT License. The plugin is not affiliated with or endorsed by those projects. No third-party code is bundled. diff --git a/docs/changelogs/CHANGELOG.md b/docs/changelogs/CHANGELOG.md index 2bafb32..a2040a4 100644 --- a/docs/changelogs/CHANGELOG.md +++ b/docs/changelogs/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.6.0 - Unreleased + +- Added completion rules informed by unlazy (MIT License). Wording only; no scripts or hooks bundled. See ADR-005. + - Router invariant: finish every in-scope part of the request, with no placeholders, stubs, `TODO`s, elided code, or silently deferred remainder. Minimal means the least code per part, not fewer parts. A part that cannot be finished is reported as unmet with its reason. + - Router output: mark each requested part met or unmet, and re-measure every reported number or label it `not measured`. + - Build: each checkpoint is implemented completely, and self-review also hunts defects, placeholders, and unhandled cases. + - Verify: step 8 re-reads the original request and maps every requested part to a supported claim or a reported unmet item; the evidence report ends with met and unmet counts. +- Not yet verified: the 12-case behavior suite has not run on this release. + ## 0.5.1 - 2026-10-08 - Verification: the full 12-case behavior suite ran with independent transcript review on three hosts: Claude Code 2.1.294 with `claude-sonnet-5` and `claude-sonnet-5-5`, and Codex 0.160.1 with `gpt-6.1-sol`. Codex used `gpt-6.1-sol`, not the `gpt-6-astra` used for 0.5.0. Results were 9/12, 12/12, and 12/12. All filesystem and executable acceptance checks passed. Reviewers attributed none of the three `claude-sonnet-5` failures to this release: diff --git a/docs/tracking/DECISIONS.md b/docs/tracking/DECISIONS.md index 75763ee..56ea29a 100644 --- a/docs/tracking/DECISIONS.md +++ b/docs/tracking/DECISIONS.md @@ -145,3 +145,31 @@ Compliance is instruction-only and therefore probabilistic (see ADR-003). No new ### Revisit when A behavior transcript shows a vague acceptance criterion or an upgraded hedge passing a gate. Then add a non-blocking check to `hooks/edit_guard.py` on writes to `.sdlc/changes/*/spec.md`. + +## ADR-005: Absorb unlazy completion rules as wording only (2026-10-10) + +### Status + +Accepted (2026-10-10). + +### Context + +Agents stop short: they leave placeholders, drop parts of multi-part requests, and report unmeasured numbers. The unlazy repo (MIT, Leonxlnx) addresses this with acceptance gates written before work, a Depth Tree of leaf ledgers, a four-pass leaf loop, a final-report audit, and an optional Claude Code Stop hook backed by about 400 KB of Node scripts. This plugin already writes acceptance criteria before building, treats a worker report as unproven, requires fresh evidence, and nudges once at Stop for unfinished Standard and Controlled changes. The remaining gaps were: no explicit ban on placeholders or deferred remainder, verify re-read the acceptance map but not the original request, no met/unmet report, and reported numbers were not re-measured. + +### Decision + +Add the missing rules as wording only, in original text: one router invariant (finish every in-scope part; no placeholders, stubs, `TODO`s, elided code, or deferred remainder; minimal means least code per part, not fewer parts; report unfinished parts as unmet), a router output rule (met/unmet per part; re-measure numbers or label them `not measured`), a completeness clause and defect hunt in build self-review, and an original-request re-read with met/unmet counts in verify. + +### Consequences + +Compliance is instruction-only and therefore probabilistic (see ADR-003). The rules apply to every lane, including Fast. No new runtime dependency, and the "No third-party code is bundled" notice stays true. + +### Alternatives rejected + +- **(a) Vendoring unlazy's gate-check, dispatch, and stop-hook scripts** — bundles third-party code, adds a surface where agents approve arbitrary shell `CHECK:` commands, and duplicates `ai-native-verify`. +- **(b) A Stop hook that blocks several times until gates are met** — loop risk, and the hook-guard design is still an open decision; the existing one-nudge `decideStop` stays. +- **(c) The Depth Tree with per-leaf ledgers** — ceremony that overlaps the existing plan checkpoints. + +### Revisit when + +A behavior transcript shows a dropped request part or a placeholder passing verify. Then add a behavior case to `scripts/behavior_check.py`. diff --git a/skills/ai-native-build/SKILL.md b/skills/ai-native-build/SKILL.md index b18e0d1..9133976 100644 --- a/skills/ai-native-build/SKILL.md +++ b/skills/ai-native-build/SKILL.md @@ -20,8 +20,8 @@ Stop before editing when the selected lane's required artifact or approval is ab - feature: add a focused acceptance-level check first when the repository supports it; - unsuitable test-first work such as generated files or pure configuration: state the alternative observable check; - Controlled: a separate test-author worker writes the checks from the spec and Reference oracle when the host supports it. The implementer does not edit or dismiss those checks; disputes go to the reviewers or the human. - 4. Implement the first solution-ladder rung that satisfies the checkpoint. Follow existing style. Remove only imports or code orphaned by this change. - 5. Run gates cheapest first: the focused check, then the nearest relevant suite; the visual gate in `../ai-native-verify/SKILL.md` only when the checkpoint changes UI; then self-review the checkpoint diff against its acceptance IDs. Controlled also invokes the `ai-native-review` skill in checkpoint mode: two context-isolated reviewers, and both must approve. Dispatching a reviewer agent without that skill does not satisfy this gate. Fix production code when a valid test fails; do not weaken acceptance to make it pass. + 4. Implement the first solution-ladder rung that satisfies the checkpoint completely, with no placeholder or deferred part. Follow existing style. Remove only imports or code orphaned by this change. + 5. Run gates cheapest first: the focused check, then the nearest relevant suite; the visual gate in `../ai-native-verify/SKILL.md` only when the checkpoint changes UI; then self-review the checkpoint diff against its acceptance IDs and hunt for defects, placeholders, and unhandled cases. Controlled also invokes the `ai-native-review` skill in checkpoint mode: two context-isolated reviewers, and both must approve. Dispatching a reviewer agent without that skill does not satisfy this gate. Fix production code when a valid test fails; do not weaken acceptance to make it pass. 6. A fix re-runs every gate it affects; a visible change re-runs the visual gate. A round is one pass through all of the checkpoint's gates. After three rounds without convergence, stop and reassess with the user. 7. When Git checkpoints are authorized, apply `../ai-native-sdlc/references/checkpoints.md`: commit the checked checkpoint and push for CI, feedback, or handoff within the permitted scope. Do not defer every commit until the build finishes or confuse a branch push with merge readiness. 8. Controlled: stop for human approval after checkpoint 1, even when the request already authorizes implementation. Before stopping, set `status: blocked`, `blocker: awaiting checkpoint approval n/total`, and `next_action: obtain checkpoint approval n/total`. Record the resulting `checkpoint` approval with its scope, then set `status: building` and `blocker: null`. Before starting any later checkpoint, confirm a recorded approval covers it; otherwise stop again. The stop after checkpoint 1 is the only mandatory approval stop: do not ask for approval to start a later checkpoint that a recorded `checkpoint` approval already covers, nor to start the full review and verification after the last checkpoint. Record human feedback in `state.md` and set `next_action` to the next checkpoint. diff --git a/skills/ai-native-sdlc/SKILL.md b/skills/ai-native-sdlc/SKILL.md index 3115f77..262bb5e 100644 --- a/skills/ai-native-sdlc/SKILL.md +++ b/skills/ai-native-sdlc/SKILL.md @@ -38,6 +38,7 @@ When a leaf skill opened this file, use only its lane and invariants. Do not rou - Update `state.md` only when a durable artifact exists. Record facts, decisions, evidence, deviations, and the next action, not chat history. - Never commit, push, open a PR, deploy, roll back, message people, or modify external systems without authorization already present in the request. - Completion claims require fresh evidence. Standard and Controlled work use `ai-native-verify`; Fast work may verify inline. +- Finish every in-scope part of the request. Leave no placeholders, stubs, `TODO`s, elided code such as `// rest unchanged`, or silently deferred remainder. Minimal means the least code per part, not fewer parts. Report a part you cannot finish as unmet with its reason, never as done. For artifact shapes, read [artifact-contracts.md](references/artifact-contracts.md) only when creating or updating lifecycle files. @@ -47,4 +48,4 @@ For authorized Git checkpoints, including Fast work, apply [checkpoints.md](refe ## Output -Lead with the result. State lane, evidence, risk, next action, and blocker once. Preserve exact code, commands, paths, errors, numbers, and negation. +Lead with the result. State lane, evidence, risk, next action, and blocker once. Preserve exact code, commands, paths, errors, numbers, and negation. Mark each requested part met or unmet. Re-measure every number you report; label any other number `not measured`. diff --git a/skills/ai-native-verify/SKILL.md b/skills/ai-native-verify/SKILL.md index a2fd4eb..ae80239 100644 --- a/skills/ai-native-verify/SKILL.md +++ b/skills/ai-native-verify/SKILL.md @@ -23,12 +23,12 @@ When invoked directly, first read `../ai-native-sdlc/SKILL.md` and confirm the l - For a written oracle or Reference oracle `none`, inspect the rendered implementation against the stated requirements at the viewport and interaction states the spec names. 6. For production claims, verify the intended live endpoint or deployment, not a preview. 7. Record gaps and limitations plainly. Partial proof supports only a partial claim. -8. Re-read the diff and acceptance map. If any claim lacks evidence, return to the correct earlier skill. +8. Re-read the original request, the diff, and the acceptance map. Map every requested part to a supported claim or a reported unmet item; a part with neither is a dropped requirement. If any claim lacks evidence or any part was dropped, return to the correct earlier skill. 9. When every accepted claim passes, stop. Do not add unrequested hardening, cleanup, tests, or documentation. 10. Update `state.md` to `verified` only when all required claims are supported. Then invoke `ai-native-ship` if release is in scope. ## Evidence format -For each claim report: `claim -> command/observation -> result -> context/limitation`. +For each claim report: `claim -> command/observation -> result -> context/limitation`. End with the count of met and unmet claims. Never rely on an earlier run, another agent's assertion, or "should."