From e50e6e59577822a620eba0fd0116db87ac6022e3 Mon Sep 17 00:00:00 2001 From: cskwork <76669236+cskwork@users.noreply.github.com> Date: Thu, 8 Oct 2026 09:23:28 +0900 Subject: [PATCH 1/2] feat: stores cover their tree, history names undone attempts (v0.25.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 저장소가 없는 하위 단위도 상위 저장소 루프로 처리하고, 이력 조사에 되돌림 검색 명령과 기록 줄을 추가한다. --- AGENTS.md | 5 ++++- README.ko.md | 2 +- README.md | 2 +- SKILL.md | 3 ++- VERSION | 2 +- log/changelog-v0.25.0.md | 22 ++++++++++++++++++++++ skills/1-intent/SKILL.md | 7 ++++++- templates/intent.md | 1 + 8 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 log/changelog-v0.25.0.md diff --git a/AGENTS.md b/AGENTS.md index b32569a..0df0a7d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -373,7 +373,10 @@ baseline captured before changes, and a "what stays untouched" spec section. dispatch contract still apply. 4. **Monorepos.** One `.sdlc/` per shipping unit — usually the service or package, not the repo root; a root `.sdlc/` only for cross-unit changes. - intent.md names the owning unit. + intent.md names the owning unit. A store covers its whole tree: a change + in a unit without its own `.sdlc/` runs the loop in the nearest store + above it, with gates run from that store's directory. A unit without a + store is never outside the loop. ## If your harness lacks a feature diff --git a/README.ko.md b/README.ko.md index 43ca467..5e9883e 100644 --- a/README.ko.md +++ b/README.ko.md @@ -322,7 +322,7 @@ sdlc-kit은 프로세스 계층이지 프로젝트 규칙의 대체물이 아닙 - 프로세스는 sdlc-kit이 이깁니다. 단계, 승인 게이트, 증거, 메모리. - 기존 지식이 이깁니다. `DOMAIN.md`는 기존 용어집, `CONTEXT.md`, ADR을 복사하지 않고 가리킵니다. - 기존 에이전트가 이깁니다. 로컬 QA, 브라우저, API, 리뷰어, DB 전문 에이전트가 킷의 역할 계약을 실행합니다. -- 모노레포는 범위를 지킵니다. 배포 단위마다 `.sdlc/` 하나, 루트는 단위를 가로지르는 변경에만. +- 모노레포는 범위를 지킵니다. 배포 단위마다 `.sdlc/` 하나, 루트는 단위를 가로지르는 변경에만. 자기 저장소가 없는 단위는 가장 가까운 상위 저장소에서 루프를 돌며, 루프 밖에 두지 않습니다. 진짜 규칙 충돌은 양쪽 원문을 인용해 사람에게 보여줍니다. 에이전트가 조용히 해소하지 않습니다. diff --git a/README.md b/README.md index aad136f..e2a1957 100644 --- a/README.md +++ b/README.md @@ -322,7 +322,7 @@ sdlc-kit is a process layer, not a replacement for the project's existing rules: - **sdlc-kit wins on process:** stages, approval gates, evidence, memory. - **Existing knowledge wins:** `DOMAIN.md` points to existing glossaries, `CONTEXT.md`, and ADRs instead of copying them. - **Existing agents win:** local QA, browser, API, reviewer, or DB specialists execute the kit's role contract. -- **Monorepos stay scoped:** use one `.sdlc/` per shipping unit; root only for cross-unit changes. +- **Monorepos stay scoped:** use one `.sdlc/` per shipping unit; root only for cross-unit changes. A unit without its own store runs in the nearest one above it, never outside the loop. A genuine rule conflict is shown to the human with both texts quoted. The agent does not resolve it silently. diff --git a/SKILL.md b/SKILL.md index 7a5ec49..3c7bceb 100644 --- a/SKILL.md +++ b/SKILL.md @@ -14,7 +14,8 @@ before the first stage of a session, then return here. ## When this skill runs -In a project with `.sdlc/`, any request that CHANGES the product runs through +In a project with `.sdlc/` — in the changed files' directory or any directory +above it (AGENTS.md "Monorepos") — any request that CHANGES the product runs through this loop — "add a filter to the report", "fix the login redirect", "make the export faster". No SDLC vocabulary is required; the words the human used are not the trigger, the change is. diff --git a/VERSION b/VERSION index 2094a10..d21d277 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.24.0 +0.25.0 diff --git a/log/changelog-v0.25.0.md b/log/changelog-v0.25.0.md new file mode 100644 index 0000000..cc2e55b --- /dev/null +++ b/log/changelog-v0.25.0.md @@ -0,0 +1,22 @@ +# v0.25.0 — no unit outside the loop, and history that names its undone attempts + +Two gaps let a change skip the kit's checks. A unit in a monorepo with no +`.sdlc/` of its own was read as "no loop here", and the History probe said +"read reverts" without saying how, so an earlier attempt that was rolled back +for a side effect went unread. No new gate or check; no script-read line +changed. + +## Changes + +- **AGENTS.md "Monorepos", SKILL.md "When this skill runs":** a store covers + its whole tree. A change in a unit without its own `.sdlc/` runs the loop in + the nearest store above it, gates run from that store's directory. +- **skills/1-intent "History":** run `git log --no-merges -i -E + --grep='revert|rollback|back out' -- ` on the shipping branch, plus + the project's own words for an undo; read each hit's ticket for the side + effect that forced it. +- **templates/intent.md:** Researcher findings opens with a `History:` line — + the search run and its hits, or `none found` with the command. +- **README.md, README.ko.md:** the monorepo line says the same. + +Nothing to migrate. diff --git a/skills/1-intent/SKILL.md b/skills/1-intent/SKILL.md index 93a3cf9..ab51f69 100644 --- a/skills/1-intent/SKILL.md +++ b/skills/1-intent/SKILL.md @@ -36,7 +36,12 @@ in parallel, then start the interview: - **History** for brownfield work. Check whether this was tried before. Read reverts, related tickets, prior fixes, and why they failed in git history - and commit messages. + and commit messages. At minimum run `git log --no-merges -i -E + --grep='revert|rollback|back out' -- ` on the + branch that ships, adding the words the project's commits use for an undo + in their own language. Each hit names an attempt that was undone: read its + ticket for the side effect that forced it. intent.md's History line + records the command and the hits, or `none found` with the command. - **Affected area**: entry points, data shapes, callers, side effects of the code the request touches. - **Existing analogous flow**: before any option exists, find a flow the diff --git a/templates/intent.md b/templates/intent.md index 982921d..ac42804 100644 --- a/templates/intent.md +++ b/templates/intent.md @@ -80,4 +80,5 @@ else the human's. Name a command or test where possible.> - ## Researcher findings +- History: From 6d790541dcd65cacd130f86d89ec8170c7920a3e Mon Sep 17 00:00:00 2001 From: cskwork <76669236+cskwork@users.noreply.github.com> Date: Thu, 8 Oct 2026 09:35:47 +0900 Subject: [PATCH 2/2] feat: Intent match blocks a build that contradicts the origin (v0.25.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기획 원문과 다른 규칙으로 구현한 경우를 '반대로 구현'으로 분류하고, 원문 주인의 결정 기록이 없으면 명세·검증 단계에서 차단한다. --- log/changelog-v0.25.0.md | 21 ++++++++++++++++----- roles/adversary.md | 3 +++ roles/verifier.md | 12 +++++++++--- templates/evidence.md | 2 +- templates/spec.md | 6 ++++++ 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/log/changelog-v0.25.0.md b/log/changelog-v0.25.0.md index cc2e55b..e4992ad 100644 --- a/log/changelog-v0.25.0.md +++ b/log/changelog-v0.25.0.md @@ -1,9 +1,12 @@ -# v0.25.0 — no unit outside the loop, and history that names its undone attempts +# v0.25.0 — no unit outside the loop, undone attempts read, contradicted origins blocked -Two gaps let a change skip the kit's checks. A unit in a monorepo with no -`.sdlc/` of its own was read as "no loop here", and the History probe said -"read reverts" without saying how, so an earlier attempt that was rolled back -for a side effect went unread. No new gate or check; no script-read line +Three gaps let a change skip the kit's checks. A unit in a monorepo with no +`.sdlc/` of its own was read as "no loop here". The History probe said "read +reverts" without saying how, so an earlier attempt that was rolled back for a +side effect went unread. And the Intent match lens counted Covered, Missing +and Beyond only, so a build that handled an origin detail with the opposite +rule (origin: expired coupons greyed out; build: hidden) could pass as +Covered. No new gate or check; no script-read line changed. ## Changes @@ -17,6 +20,14 @@ changed. effect that forced it. - **templates/intent.md:** Researcher findings opens with a `History:` line — the search run and its hits, or `none found` with the command. +- **roles/verifier.md Lens 3, templates/evidence.md:** a fourth class, + **Contradicts** — an origin detail built with a different rule. Blocking + unless the origin owner's decision is recorded; an agent-proposed rule is + not an override. The evidence line gains `Contradicts: `. +- **templates/spec.md:** new **Origin overrides** section (R → origin text → + owner's decision: who, date, words; `none` by default). +- **roles/adversary.md Traceability:** the same contradiction is blocking at + the spec gate, before anything is built. - **README.md, README.ko.md:** the monorepo line says the same. Nothing to migrate. diff --git a/roles/adversary.md b/roles/adversary.md index 220bc46..90de949 100644 --- a/roles/adversary.md +++ b/roles/adversary.md @@ -12,6 +12,9 @@ Attack, in order: 1. **Traceability.** Does every element trace to the upstream artifact — every spec R to an intent O-item, every O-item to an R or a flagged concern? Flag added features and dropped requirements or questions. + A spec R that states a different rule than the origin.md text it traces + to is blocking at the spec gate unless spec.md's **Origin overrides** + records the origin owner's decision. 2. **Domain and data shapes.** Check that schemas, contracts, migrations, and serialized data use the same shapes end to end. 3. **User claims.** Do `[assumed]` claims carry enough risk to block? Does the diff --git a/roles/verifier.md b/roles/verifier.md index 7cdbe67..e761d4a 100644 --- a/roles/verifier.md +++ b/roles/verifier.md @@ -132,8 +132,14 @@ the origin text names — screens, fields, messages, roles, limits, error cases: 2. **Missing** — an O-item or origin detail absent from the build. A detail dropped between the origin and spec.md is a finding even though spec.md was approved without it. -3. **Beyond** — behavior no O-item asked for. -4. intent.md's Goal line, checked the same way. +3. **Contradicts** — an origin detail the build carries with a different + rule than the origin states: the origin says expired coupons show greyed + out, the build hides them. It is blocking unless spec.md's **Origin + overrides** (compact route: an intent.md Evidence line) records the origin + owner's decision — who, when, their words. + A rule the agent proposed is not an override. +4. **Beyond** — behavior no O-item asked for. +5. intent.md's Goal line, checked the same way. No origin.md → check O-items alone and report `origin NOT VERIFIED — none snapshotted`; live source unreachable → say so, the snapshot stands. @@ -162,7 +168,7 @@ human's explicit call, recorded in evidence.md. - Baseline diff: clean | differences: · untouched: · neighbouring flows: - Data consistency: → → consistent | skew: - AS-IS → TO-BE: → · unlisted changes: -- Origin: · live: unchanged | drifted: | unreachable · O1 → R1 → … · Covered / · Missing: · Beyond: +- Origin: · live: unchanged | drifted: | unreachable · O1 → R1 → … · Covered / · Missing: · Contradicts: · Beyond: VERDICT: PASS | FAIL (findings, each with evidence) | PASS WITH GAP () ``` diff --git a/templates/evidence.md b/templates/evidence.md index 1456e15..ae5ae09 100644 --- a/templates/evidence.md +++ b/templates/evidence.md @@ -41,7 +41,7 @@ VERDICT: VERDICT: ### Intent match - O1 → R1 → · O2 → → MISSING: -- Covered: / · Missing: · Beyond: +- Covered: / · Missing: · Contradicts: · Beyond: VERDICT: ### Fix loop - round 1/3: · accepted · declined · re-check: resolved | open: diff --git a/templates/spec.md b/templates/spec.md index 175c8d3..92a254e 100644 --- a/templates/spec.md +++ b/templates/spec.md @@ -16,6 +16,12 @@ concerns alone.> with no R is a flagged concern, never a silent drop.> - R1: (O1) +## Origin overrides + +- none + ## Data shapes