Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,17 @@ when closing.
`.sdlc/work/<slug>/harvest.md` (templates/harvest.md), never to the
shared files. At close, merge harvest into lessons/INDEX/DOMAIN and
delete it; `close.sh` blocks while harvest.md exists.
**A loop that never closes must not hide its knowledge.** An unmerged
harvest is readable before close — `tools/kb.sh show <slug>` and the
contents page print its candidates, `tools/kb.sh harvest` lists every
open feature that holds one with its idle time — and a feature idle 30
days or more (`--stale <days>` changes the threshold) may have its
harvest merged WITHOUT closing: the same procedure, the same one merge
at a time in the owning checkout, harvest.md deleted afterwards, the
feature stays open. Reporting is not merging: nothing in `kb.sh` writes
`memory/`. The feature's `summary.md` (templates/summary.md) is the one
record meant to be rewritten as the work moves — it is bound by no
approval — and is what `kb.sh show` prints first.
**Recency wins on merge, three guards.** A contradicting candidate
replaces the old entry with a fresh `[verified: how — YYYY-MM-DD]`;
date every fact. Guards: weaker evidence never supersedes stronger (a
Expand Down
7 changes: 4 additions & 3 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,8 @@ agent APPROVED: intent of claims-status (.sdlc/work/claims-status/intent.md)
│ ├── deviations.md # 빌드 중 편차 기록
│ ├── progress.md # 하트비트: 살아있는 한 줄 (규칙 9)
│ ├── baseline.txt # 브라운필드의 변경 전 동작
│ ├── harvest.md # 루프 중 교훈·도메인 후보, close에서 병합
│ ├── summary.md # 읽는 사람용 페이지: 문제·원인·변경·결과·교훈·태그, 승인에 묶이지 않아 계속 갱신
│ ├── harvest.md # 루프 중 교훈·도메인 후보, close에서 병합(그 전에도 kb.sh show / harvest로 읽힘)
│ └── scratch/ # 대용량 로그 · 캡처 · 트레이스
└── archive/<slug>/ # 닫힌 피처, close.sh가 여기로 옮김
├── CLOSED # shipped · abandoned · dead-end · handed-off
Expand All @@ -167,7 +168,7 @@ agent APPROVED: intent of claims-status (.sdlc/work/claims-status/intent.md)

**기록을 어디에 둘지는 사용자가 정합니다.** 기본값은 프로젝트 작업 사본 안이고, `init.sh . --area ~/knowledge`를 쓰면 사용자가 고른 폴더 아래 `<area>/<단위이름>-<체크아웃 식별자>/`에 저장하고 `.sdlc`를 그곳으로 연결합니다. 체크아웃마다 저장소가 하나씩이므로 워크트리 두 개가 승인 상태를 공유하는 일이 없습니다. 영역이 프로젝트 안에 있거나 프로젝트가 영역 안에 있을 때, 다른 체크아웃이 이미 그 저장소를 소유할 때, 실제 `.sdlc` 디렉터리가 이미 있을 때(자동으로 옮기지 않습니다), 링크를 만들 수 없을 때는 아무것도 쓰지 않고 분명히 실패합니다. 이 소유권은 init 시점뿐 아니라 실행 시점에도 다시 확인합니다. `<store>/PROJECT`에 적힌 체크아웃이 지금 실행 중인 체크아웃과 다르면 `check-gate.sh`, `approve.sh`, `close.sh`, `status.sh`, `tools/auto.sh`, `tools/verify.sh`, `tools/handoff.sh`가 판정을 내리거나 상태를 쓰기 전에 거부하므로, 심볼릭 링크를 그대로 복사한 작업 사본(`cp -R`, rsync, 대부분의 백업 복원)이 다른 체크아웃의 게이트를 열거나 그 피처를 닫을 수 없습니다. 읽기는 이 제약을 받지 않아 `tools/kb.sh show|search|list`는 그대로 쓸 수 있고, 소유권을 자동으로 옮기거나 다시 묶는 일은 없습니다. 어느 쪽을 고르든 **저장소 백업은 사용자의 몫입니다.** git이 더 이상 대신해 주지 않습니다.

**기록을 다시 읽는 도구는 `tools/kb.sh`입니다.** `index`는 목차 페이지를 다시 만들고(`init.sh`와 `close.sh`가 자동으로 실행합니다), `show <slug>`는 피처 하나의 목표·문서·교훈을 보여주며, `search "<문자열>"`은 열린 피처와 닫힌 피처, 지속 메모리를 대상으로 출력량을 제한한 문자열 검색을 합니다. `--area <폴더>`를 붙이면 그 폴더 안의 모든 저장소를 대상으로 같은 일을 하며, 원래 체크아웃이 사라진 피처도 읽을 수 있습니다. 종료 코드는 `0` 찾음, `1` 없음, `2` 사용법 오류 또는 거부입니다.
**기록을 다시 읽는 도구는 `tools/kb.sh`입니다.** `index`는 목차 페이지를 다시 만듭니다(`init.sh`와 `close.sh`가 자동으로 실행합니다). 페이지는 상태·날짜·태그를 담은 개요 표(최신순), 아직 close가 병합하지 않은 harvest 목록, 피처별 절 순서입니다. `show <slug>`는 피처 하나를 요약본으로 보여줍니다. 목표, `summary.md`(문제·원인·변경·결과·교훈을 담는, 계속 갱신하도록 만든 유일한 기록), 배포 상태, 병합되지 않은 harvest 후보, 교훈 제목이 먼저 나오고 파일 경로는 마지막입니다. `search "<문자열>"`은 열린 피처와 닫힌 피처, 지속 메모리를 대상으로 출력량을 제한한 문자열 검색을 하고, `harvest [--stale <일수>]`는 harvest.md가 아직 memory/에 들어가지 않은 열린 피처를 유휴 기간과 함께 나열합니다(유휴 상태가 오래된 피처는 close 없이 병합할 수 있습니다 — AGENTS.md 규칙 4). `--area <폴더>`를 붙이면 그 폴더 안의 모든 저장소를 대상으로 같은 일을 하며, 원래 체크아웃이 사라진 피처도 읽을 수 있습니다. `index --obsidian`(또는 저장소 config.md의 `index_style: obsidian`)은 Obsidian 볼트용 frontmatter와 인라인 `#태그`를 덧붙입니다. 생성 시각은 절대 쓰지 않으므로 내용이 같으면 diff도 생기지 않습니다. 종료 코드는 `0` 찾음, `1` 없음, `2` 사용법 오류 또는 거부입니다.

공개 sdlc-kit 저장소는 프레임워크만 담습니다. 기록은 작성된 자리, 즉 프로젝트 작업 사본이나 사용자가 고른 영역에 남아 그대로 읽힙니다.

Expand Down Expand Up @@ -257,7 +258,7 @@ tools/auto.sh intent-check <slug> # 이 intent.md를 무인으로 실행해
tools/auto.sh checkpoint <slug> … # 대기 중인 단계, 제한된 재시도, 완료된 외부 효과
tools/verify.sh run|check <slug> # 프로젝트의 검증 레시피 실행(python3 필요), 소스에 결합된 영수증 기록
tools/handoff.sh push|check <slug> # 리뷰용 브랜치가 원격에 실제로 있음을 증명
tools/kb.sh index|show|search|list # 지난 피처와 교훈 찾기(--area로 영역 전체)
tools/kb.sh index|show|search|list|harvest # 지난 피처와 교훈 찾기(--area로 영역 전체; harvest = 아직 병합되지 않은 지식)
```

호스트가 에이전트를 깨우면, 에이전트는 `next`를 읽고 단계 지시서에 따라 그 액션 하나를
Expand Down
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,8 @@ Per feature, inside the **target project**:
│ ├── deviations.md # build-time differences
│ ├── progress.md # heartbeat: ONE live line (rule 9)
│ ├── baseline.txt # brownfield behavior before the change
│ ├── harvest.md # mid-loop lesson/domain candidates; merged at close
│ ├── summary.md # the reader's page: Problem/Cause/Change/Result/Lesson, Tags; kept current, bound by no approval
│ ├── harvest.md # mid-loop lesson/domain candidates; merged at close (readable before: kb.sh show / harvest)
│ └── scratch/ # bulk logs, captures, traces
└── archive/<slug>/ # closed features; close.sh moves them here
├── CLOSED # shipped · abandoned · dead-end · handed-off
Expand All @@ -167,7 +168,7 @@ Per feature, inside the **target project**:

**Where the records live is your choice.** By default they sit in the project's working copy. `init.sh . --area ~/knowledge` puts them in a folder you choose instead — `<area>/<unit>-<checkout-id>/`, with `.sdlc` linked to it, one store per checkout so two worktrees never share approvals. The area is refused if it sits inside the project (or the project inside it), if another checkout already owns that store, if a real `.sdlc` directory is already there (nothing is ever relocated for you), or if the link cannot be made. That ownership is re-checked at RUNTIME, not only at init: `check-gate.sh`, `approve.sh`, `close.sh`, `status.sh`, `tools/auto.sh`, `tools/verify.sh` and `tools/handoff.sh` refuse before any verdict or write when `<store>/PROJECT` names a different checkout, so a copied working copy (`cp -R`, rsync and most restores keep the symlink) can neither open another checkout's gate nor close its features. Reading is never bound that way: `tools/kb.sh show|search|list` still works, and nothing is ever re-bound or moved for you. Whichever you choose, **the store is yours to back up** — git no longer does it for you.

**Reading the records back** is `tools/kb.sh`: `index` regenerates the contents page (`init.sh` and `close.sh` do it for you), `show <slug>` prints one feature's goal, documents and lessons, `search "<text>"` does a bounded literal search over open and closed features plus durable memory, and `--area <folder>` does either across every store in that folder — including features whose checkout no longer exists. Exit codes: `0` found, `1` nothing found, `2` usage error or refusal.
**Reading the records back** is `tools/kb.sh`: `index` regenerates the contents page (`init.sh` and `close.sh` do it for you) — an overview table by state, date and tags, newest first, the harvests no close has merged yet, then one section per feature; `show <slug>` prints one feature as a digest — goal, its `summary.md` (Problem/Cause/Change/Result/Lesson, the one record meant to be kept current), delivery, unmerged harvest candidates, lesson titles, then the paths; `search "<text>"` does a bounded literal search over open and closed features plus durable memory; `harvest [--stale <days>]` lists open features whose harvest.md is not in memory yet, with idle time (a stale one may be merged without closing — AGENTS.md rule 4); and `--area <folder>` does any of these across every store in that folder — including features whose checkout no longer exists. `index --obsidian` (or `index_style: obsidian` in the store's config.md) adds frontmatter and inline `#tags` for a vault; no timestamp is ever written, so an unchanged page produces no diff. Exit codes: `0` found, `1` nothing found, `2` usage error or refusal.

The public sdlc-kit repository stays framework-only. The records live and stay readable where they were written — in the project's working copy, or in the area you chose.

Expand Down Expand Up @@ -256,7 +257,7 @@ tools/auto.sh intent-check <slug> # is this intent.md safe to run unattende
tools/auto.sh checkpoint <slug> … # pending step, bounded attempts, completed effects
tools/verify.sh run|check <slug> # run the project's verification recipe (needs python3); receipt bound to the source
tools/handoff.sh push|check <slug> # the review branch, proven to be on the remote
tools/kb.sh index|show|search|list # find past features and lessons (--area for every store)
tools/kb.sh index|show|search|list|harvest # find past features and lessons (--area for every store; harvest = knowledge not merged yet)
```

The host wakes an agent; the agent reads `next`, performs that ONE stage action
Expand Down
3 changes: 2 additions & 1 deletion SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ they do it under this contract (gates, artifacts, memory), not beside it.
| ticket too big or foggy for one intent pass | `map.md` in the same slug dir first (skills/1-intent "Chart a map first"); one Unknown per session, six sessions max. |
| "continue <slug>" / "what's next" | Run `gates/status.sh <slug>` from the project root. Its `next →` line names the stage skill or gate command. |
| "where are we" / "sdlc status" | `gates/status.sh` (open features; `--all` adds the newest 20 archived) + `gates/stats.sh` (open + recent closed). Full-archive sweeps: `ls`/`grep .sdlc/archive/`, never the whole listing into context. |
| "has this been done before" / "why is X like this" / debugging an old area | `tools/kb.sh search "<text>"` then `tools/kb.sh show <slug>` — open and closed features plus durable memory, bounded output (`--area <folder>` covers every store, even one whose checkout is gone). Exit 0 found · 1 nothing · 2 usage/refusal. |
| "has this been done before" / "why is X like this" / debugging an old area | `tools/kb.sh search "<text>"` then `tools/kb.sh show <slug>` — a digest (goal, summary.md, delivery, unmerged harvest candidates, lesson titles, then the paths) over open and closed features plus durable memory, bounded output (`--area <folder>` covers every store, even one whose checkout is gone). Exit 0 found · 1 nothing · 2 usage/refusal. |
| "what did we learn that is not in memory yet" / many open features, few closes | `tools/kb.sh harvest [--stale <days>]` — open features whose harvest.md no close has merged, with idle time; a STALE one may be merged without closing (AGENTS.md rule 4). The contents page (`tools/kb.sh index`; `--obsidian` or `index_style: obsidian` in config.md for a vault) shows the same candidates and an overview table by state, date and tags. |
| a host/scheduler drives the loop, or you need machine state | `gates/status.sh --json` (= `tools/auto.sh status --json`) and `tools/auto.sh next <slug>` (exit 0 ready · 10 needs-human · 20 blocked · 30 complete). Verification receipts: `tools/verify.sh`; review handoff: `tools/handoff.sh`. Contract: `docs/automation.md`. These report and record — they run no stage. |
| gate request answered "approve" in chat | `gates/approve.sh <stage> <artifact> --delegated` per AGENTS.md rule 3. |
| incident / bug / alert on a shipped feature | Read `skills/6-maintain/SKILL.md`. |
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v0.12.0
v0.13.0
Loading
Loading