From e7ec875eba6c2c967afc9034c1c06c0cdc014bae Mon Sep 17 00:00:00 2001 From: cskwork <76669236+cskwork@users.noreply.github.com> Date: Mon, 12 Oct 2026 13:32:49 +0900 Subject: [PATCH 1/2] docs: show every way back in the loop (README diagram, site SVG) Readers could not see where work returns: the phase list read one way, the build review loop was only "three FAILs stop", and QA routing lived in a table after Evidence. - README.md, README.ko.md: a mermaid flowchart with the plan gap-check loop, the build review loop, Evidence back to Plan (plan wrong or the same failure twice) and to Build (code failed), and the deliver and human exits; the phase table now says when each phase goes back. - docs/index.html: an inline SVG of the same loop with translated labels and an accessible name replaces the routing table; the Build and Evidence cards say where failures go. The loop section is 64-154 px shorter in every view; i18n keys match both ways. --- README.ko.md | 42 +++++----- README.md | 41 ++++++---- docs/index.html | 205 ++++++++++++++++++++++++++---------------------- 3 files changed, 161 insertions(+), 127 deletions(-) diff --git a/README.ko.md b/README.ko.md index fccf431..b51eaf2 100644 --- a/README.ko.md +++ b/README.ko.md @@ -30,24 +30,30 @@ Intent → Plan → Build → Evidence. 코드를 쓰기 전에는 여러 탐색 ## 루프 -| # | 단계 | 하는 일 | 끝나는 시점 | -|---|---|---|---| -| 1 | **Intent** | 요청한 것, 에이전트가 이해한 것, 그 이해에 숨은 위험을 적습니다. 사람이 확인합니다. | intent 승인 | -| 2 | **Plan** | 여러 scout가 나란히 정본·데이터·로직·사용자 흐름을 조사해 `refs/`에 남깁니다. `PLAN.md` 한 장에 AS-IS → TO-BE, 부작용, QA가 돌릴 시나리오를 담습니다. | plan 승인 | -| 3 | **Build** | 가장 작은 완전한 변경을 만들고, 별도 리뷰어가 공격적으로 검토합니다. FAIL이 세 번이면 멈춥니다. | 리뷰 PASS | -| 4 | **Evidence** | 통합·E2E 검사 뒤, 모든 시나리오를 각 페르소나로 실제 인터페이스에서 돌립니다. 점수와 다음 경로는 스크립트가 정합니다. | 납품 | - -**Evidence 뒤 라우팅**은 에이전트 판단이 아니라 `sdlc.sh score`가 계산합니다. - -1. 계획 때문에 생긴 실패, 또는 같은 코드 실패의 반복 → **Plan**으로 -2. must 시나리오가 전부 통과하고 전체의 95% 이상 통과 → **납품** -3. 환경이 없어 시나리오를 못 돌렸고, 그 때문에 납품이 막힘 → **사람**에게 -4. 나머지 → **Build**로 - -되돌아가는 횟수는 경로마다 세 번까지이고, 넘으면 사람이 정합니다. 루프는 -`sdlc.sh approve plan --human`으로만 다시 시작합니다. 못 돌린 시나리오는 실패로 -칩니다. 시나리오를 지우는 것은 사람만 할 수 있습니다. PASS에는 반드시 로그가 -붙어야 합니다. +```mermaid +flowchart LR + I["1 Intent"] -->|사람 승인| P["2 Plan"] + P -. 빈틈 발견 .-> P + P -->|계획 승인| B["3 Build"] + B -. 리뷰 FAIL: 고치고 다시 리뷰 .-> B + B -->|리뷰 PASS| E["4 Evidence"] + E -. 계획이 틀렸거나 같은 실패 반복 .-> P + E -. 코드 실패 .-> B + E -->|must 전부 통과, 전체 95% 이상| D(["납품"]) + E -->|돌릴 환경 없음| H(["사람이 결정"]) +``` + +| 단계 | 하는 일 | 되돌아가는 때 | +|---|---|---| +| **1 Intent** | 요청한 것, 에이전트가 이해한 것, 그 이해에 숨은 위험을 적습니다. 사람이 확인합니다. | — | +| **2 Plan** | 여러 scout가 나란히 정본·데이터·로직·사용자 흐름을 조사해 `refs/`에 남깁니다. `PLAN.md` 한 장에 AS-IS → TO-BE, 부작용, QA가 돌릴 시나리오를 담습니다. | 누락 점검에서 빈틈이 나올 때 | +| **3 Build** | 가장 작은 완전한 변경을 만들어 커밋하고, 별도 리뷰어가 공격적으로 검토합니다. | 리뷰 FAIL: 고치고 다시 리뷰 | +| **4 Evidence** | 실제 검사 뒤, 모든 시나리오를 각 페르소나로 실제 인터페이스에서 돌립니다. 점수와 다음 경로는 에이전트가 아니라 `sdlc.sh score`가 정합니다. | 계획이 틀렸거나 같은 실패 반복 → Plan, 코드 실패 → Build | + +되돌아가는 횟수는 리뷰 FAIL, Plan 복귀, Build 복귀마다 세 번까지입니다. 넘으면 +루프가 멈추고 사람이 정하며, `sdlc.sh approve plan --human`으로만 다시 시작합니다. +못 돌린 시나리오는 실패로 칩니다. 시나리오를 지우는 것은 사람만 할 수 있고, +PASS에는 반드시 로그가 붙어야 합니다. ## 빠른 시작 diff --git a/README.md b/README.md index b5cb542..2d88bce 100644 --- a/README.md +++ b/README.md @@ -30,23 +30,30 @@ and needs no particular harness: it is Markdown plus one shell script. ## The loop -| # | Phase | What happens | Leaves when | -|---|---|---|---| -| 1 | **Intent** | What you asked, what the agent understood, and the risks in that understanding. You confirm it. | intent approved | -| 2 | **Plan** | Parallel scouts map source of truth, data, logic and user flow into `refs/`; one `PLAN.md` holds AS-IS → TO-BE, side effects and the scenarios QA will run. | plan approved | -| 3 | **Build** | The smallest complete change, then a separate adversarial reviewer. Three FAILs stop the loop. | review PASS | -| 4 | **Evidence** | Integration and E2E checks, then every scenario run as its persona through the real interface. A script scores it and routes it. | delivered | - -**Routing after Evidence** — computed by `sdlc.sh score`, not judged by the agent: - -1. a failure the plan caused, or the same code failure twice → back to **Plan** -2. every must scenario passes and ≥ 95% of all scenarios pass → **deliver** -3. scenarios could not run (no environment) and that is what blocks delivery → **the human** -4. otherwise → back to **Build** - -Each kind of return is capped at three; then the human decides, and only -`sdlc.sh approve plan --human` resumes the loop. A scenario that could not run -counts as failed, only you can remove a scenario, and every PASS needs its log. +```mermaid +flowchart LR + I["1 Intent"] -->|you approve| P["2 Plan"] + P -. gap found .-> P + P -->|plan approved| B["3 Build"] + B -. FAIL: fix, re-review .-> B + B -->|review PASS| E["4 Evidence"] + E -. plan was wrong, or same failure twice .-> P + E -. code failed .-> B + E -->|every must passes, 95%+ overall| D(["deliver"]) + E -->|no environment to run it| H(["you decide"]) +``` + +| Phase | What happens | Goes back when | +|---|---|---| +| **1 Intent** | What you asked, what the agent understood, and the risks in it. You confirm it. | — | +| **2 Plan** | Parallel scouts map source of truth, data, logic and user flow into `refs/`; one `PLAN.md` holds AS-IS → TO-BE, side effects and the scenarios QA will run. | the gap check finds holes | +| **3 Build** | The smallest complete change, committed, then a separate adversarial reviewer. | the review FAILs: fix it, review again | +| **4 Evidence** | Real checks, then every scenario as its persona through the real interface. `sdlc.sh score` scores and routes it; the agent does not judge. | the plan was wrong or the same failure came twice → Plan; code failed → Build | + +Every way back is capped at three — three review FAILs, three returns to Plan, +three to Build — then the loop stops for you, and only +`sdlc.sh approve plan --human` resumes it. A scenario that could not run counts +as failed, only you can remove a scenario, and every PASS needs its log. ## Quick start diff --git a/docs/index.html b/docs/index.html index 501b0fd..70595f2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -131,7 +131,28 @@ .band-alt { background: linear-gradient(rgba(255, 251, 240, 0.016), rgba(255, 251, 240, 0.016)); } /* ---------- the loop ---------- */ - .flow { list-style: none; margin: 0 0 2.75rem; padding: 0; display: flex; flex-direction: column; gap: 0.55rem; } + .loopmap { display: grid; gap: 2rem; align-items: start; } + .loopmap > * { min-width: 0; } + @media (min-width: 900px) { .loopmap { grid-template-columns: minmax(0, 30rem) 1fr; gap: 3rem; } } + .loopsvg { display: block; width: 100%; max-width: 30rem; height: auto; margin-inline: auto; } + .loopsvg .box rect { fill: var(--bg-raised); stroke: var(--line-strong); stroke-width: 1.2; } + .loopsvg .box text { font: 600 16px var(--slab); fill: var(--text); text-anchor: middle; } + .loopsvg path { fill: none; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; } + .loopsvg .go path { stroke: var(--accent); marker-end: url(#ah-go); } + .loopsvg .back path { stroke: var(--danger); stroke-dasharray: 5 4; marker-end: url(#ah-back); } + .loopsvg .trunk { stroke: var(--line-strong); } + .loopsvg .stop { stroke: var(--text-2); marker-end: url(#ah-out); } + .loopsvg .mk-go { fill: var(--accent); } + .loopsvg .mk-back { fill: var(--danger); } + .loopsvg .mk-out { fill: var(--text-2); } + .loopsvg .dots circle { fill: var(--line-strong); } + .loopsvg .pill { fill: none; stroke: var(--text-2); stroke-width: 1.2; } + .loopsvg .pill.done { fill: var(--accent); stroke: var(--accent); } + .loopsvg .pill-t { font: 600 13px var(--sans); fill: var(--text); text-anchor: middle; } + .loopsvg .pill-t.done { fill: var(--accent-ink); } + .loopsvg .lbl text { font: 400 13.5px var(--sans); fill: var(--text-2); } + .loopsvg .lbl.end text { text-anchor: end; } + .flow { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.75rem; } .flow .stage { background: var(--bg-raised); border: 1px solid var(--line); border-radius: 10px; padding: 1rem 1.15rem 1.1rem; } .flow h3 { margin: 0 0 0.3rem; font-size: 1.08rem; display: flex; align-items: baseline; gap: 0.6rem; flex-wrap: wrap; } .flow h3 .art { @@ -140,36 +161,8 @@ padding: 0.14rem 0.5rem; border-radius: 99px; letter-spacing: 0; } .flow .what { margin: 0; color: var(--text-2); font-size: 0.86rem; line-height: 1.55; } - .flow .edge { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; padding-block: 0.15rem; } - .flow .edge .lbl { - font-family: var(--mono); font-size: 0.66rem; letter-spacing: 0.02em; text-align: center; - color: var(--text-2); border: 1px dashed var(--line-strong); border-radius: 99px; padding: 0.2rem 0.7rem; - } - .flow .edge.gate .lbl { color: var(--accent); border-color: rgba(234, 176, 77, 0.45); } - .flow .edge svg { color: var(--line-strong); } - .flow .edge.gate svg { color: var(--accent); } - .loopnote { margin: 1rem 0 0; max-width: 62ch; color: var(--text-2); font-size: 0.86rem; } + .loopnote { margin: 1.5rem 0 0; max-width: 62ch; color: var(--text-2); font-size: 0.86rem; } .loopnote b { color: var(--text); font-weight: 600; } - @media (min-width: 900px) { - .flow { - display: grid; gap: 1.1rem 0.5rem; align-items: stretch; - grid-template-columns: 1fr 5.2rem 1fr; - grid-template-areas: "s1 e12 s2" ". . e23" "s4 e34 s3"; - } - .s1 { grid-area: s1; } .s2 { grid-area: s2; } .s3 { grid-area: s3; } .s4 { grid-area: s4; } - .e12 { grid-area: e12; } .e23 { grid-area: e23; } .e34 { grid-area: e34; } - .flow .edge { justify-content: center; } - } - @media (max-width: 899.98px) { .flow .edge .d { display: none; } } - - /* ---------- routing table ---------- */ - .tablewrap { overflow-x: auto; } - table.how { width: 100%; border-collapse: collapse; font-size: 0.9rem; } - table.how caption { text-align: left; font-family: var(--slab); font-weight: 600; font-size: 1.12rem; padding-bottom: 0.8rem; } - table.how th, table.how td { text-align: left; padding: 0.75rem 1rem 0.75rem 0; border-top: 1px solid var(--line); vertical-align: top; } - table.how thead th { font-family: var(--mono); font-size: 0.7rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-2); } - table.how tbody th { font-weight: 600; white-space: nowrap; font-family: var(--mono); font-size: 0.84rem; } - table.how td { color: var(--text-2); } /* ---------- what you get (ledger) ---------- */ .ledger { margin: 0; border-bottom: 1px solid var(--line); } @@ -249,54 +242,77 @@
Each phase writes down what it found or did, and the next one starts only when its checkpoint opens. By default a person confirms the request. A plan with a risk flag also waits for a person, and you can choose to approve every plan yourself.
+Each phase writes down what it did, and the next one starts only when its checkpoint opens. The red arrows show where work goes back when something fails.
-The AI writes down what you asked, what it understood, and the risks in that understanding. It asks only the questions whose answers would change what gets built.
-Several helper AIs explore at the same time: the rules that decide the behaviour, the data, the logic, and how users reach it today. Each writes notes. One plan page holds before and after, side effects, and the scenarios that will be tested. A separate AI checks it for gaps.
-The AI makes the smallest change that fully does what the plan says. A separate AI then reviews it, assuming it is wrong. After three failed reviews the work stops for a person.
-The project's real checks run first. Then every scenario is played as its user, through the same screens and commands that user really works with. A script scores the result, so the AI cannot grade its own work.
-| Goes to | When |
|---|---|
| Plan | The plan was wrong or missed something, or the same failure happened twice. |
| Deliver | Every must-pass scenario passed, and at least 95% of all scenarios passed. |
| A person | Scenarios could not be run, because there was nowhere to run them, and that is what stops delivery. |
| Build | Anything else. |
The AI writes down what you asked, what it understood, and the risks in that understanding. It asks only the questions whose answers would change what gets built.
+Helper AIs explore the rules, the data, the logic and how users reach it today. One plan page holds before and after, side effects and the scenarios to test. A separate AI checks it for gaps.
+The AI makes the smallest change that fully does what the plan says. A separate AI reviews it, assuming it is wrong. A failed review sends it back to be fixed and reviewed again; after three failures the work stops for a person.
+The project's real checks run first, then every scenario is played as its user. A script scores the result, so the AI cannot grade its own work. Failures go back to Plan or Build, depending on the cause.
+The rules are checked in this order. Each kind of return happens at most three times, then a person decides. A scenario that could not run counts as failed, and only a person can remove a scenario.
+The score is checked from top to bottom. Each kind of return happens at most three times, then a person decides. A scenario that could not run counts as failed, and only a person can remove a scenario.