@kaydash9999/banker-plugins 0.26.0 → 0.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +13 -0
- package/README.md +1 -1
- package/codex/manifest.json +1 -1
- package/codex/transform-matrix.md +1 -1
- package/package.json +1 -1
- package/skills/make-evidence/SKILL.md +207 -131
- package/skills/make-evidence/scripts/evidence.mjs +162 -0
- package/skills/make-evidence/scripts/me-check.mjs +125 -0
- package/skills/make-evidence/scripts/me-commit.mjs +48 -0
- package/skills/make-evidence/scripts/me-git.mjs +63 -0
- package/skills/make-evidence/scripts/me-oracle.mjs +244 -0
- package/skills/make-evidence/scripts/me-precheck.mjs +122 -0
- package/skills/make-evidence/scripts/me-run.mjs +214 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "banker",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.1",
|
|
4
4
|
"description": "Claude Code plugin: QA/audit/docs/architecture skills + commands, a /banker:setup installer for OS dependencies (playwright, etc.), and wiki compaction.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "smallOpenSource",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.26.1] - 2026-11-05
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- `make-evidence`: 검토 6회와 시험용 서비스에서 세 번 실제로 돌려 본 결과를 반영해 다시 만든다. 절차 글만으로는 거짓 증거를 막지 못하는 자리를 Node 도우미 `scripts/evidence.mjs` 로 기계화한다(의존성 없음, 네트워크 없음).
|
|
7
|
+
- `run`: 명령을 로그로 남긴다. 다시 돌릴 수 있게 인용한 명령 줄, HEAD, 종료 코드를 남기고 그 코드를 그대로 돌려준다. 입력은 닫고, 시간 제한에 걸리면 프로세스 트리를 끝낸다. 출력을 쥔 채 떨어져 나간 자손은 기다리지 않는다. 흔한 비밀값 꼴은 가린다. 시험 통과 수(node --test, pytest, jest)를 METRIC 줄로 찍는다.
|
|
8
|
+
- `check`: 문서의 `` `이름=값` `` 을 그 줄이 가리킨 로그의 `METRIC 이름=값` 줄과 정확히 대조한다. `run` 이 만든 로그만 받고, 상수를 찍는 명령의 로그는 거부한다. 그 밖의 손 숫자는 경고하고, 오류나 경고가 있으면 종료 1. `count` 는 trace 표의 상태 칸을 머리 줄로 찾아 센다.
|
|
9
|
+
- `room`, `collect`: 판정기 작성자(새 맥락 하위 에이전트)에게 저장소 밖 임시 폴더를 주고 요구 문서와 담당자 사실만 넣는다. 방에 다른 파일이 생겼거나 입력이 바뀌었으면 가져오지 않는다.
|
|
10
|
+
- `worktree`, `bug`: 버그 셋을 HEAD 의 별도 작업 트리에서만 넣고, 끝나면 작업 트리를 지운다. 사용자 작업 트리와 링크한 의존 폴더가 그대로인지 확인한다. 판정기의 ERROR 줄, 기준선과 다른 사례, 기준선에 PASS 가 없는 종류, 원래 트리를 가리키는 링크는 `caught` 가 아니라 `undecidable` 이다. 빌드 결과 폴더는 링크하지 않는다.
|
|
11
|
+
- `precheck`: 스테이징된 변경, 커밋하지 않은 변경, 이 컴퓨터 밖 DB 와 서비스 주소를 찾는다. 설정 파일은 네 단계 아래까지 보고, 환경 변수는 저장소가 부르는 것과 프레임워크와 DB 라이브러리가 스스로 읽는 이름을 본다. 비로컬이면 구현을 띄우기 전에 묻는다.
|
|
12
|
+
- `commit`: 증거 경로만 커밋한다. `.env`, 큰 파일, 비밀값 꼴이 남은 파일은 거부하고, 커밋 훅은 우회하지 않는다.
|
|
13
|
+
- `make-evidence`: `--oracle-only` 로 구현 전에 판정기를 먼저 커밋한다. 구현 뒤에 쓴 판정기는 `verify.md` 첫 줄에 `요구 미충족` 으로 적는다. 구현 코드를 찾지 못하면 판정기만 쓰고 멈출지 묻는다. 요구 미충족이면 다음 프로젝트에서 할 일을 알린다.
|
|
14
|
+
- `make-evidence`: 구현을 고치지 않고, 설치하거나 내려받지 않고, 운영 서버와 운영 DB 에 보내지 않는다는 원칙을 명시한다. 판정 실행의 DB 는 일회용이어야 한다.
|
|
15
|
+
|
|
3
16
|
## [0.26.0] - 2026-11-05
|
|
4
17
|
|
|
5
18
|
### Added
|
package/README.md
CHANGED
|
@@ -158,7 +158,7 @@ Claude Code 2.1.296 은 Claude 5 모델(Opus 5.5 등)에 작업 목록 도구(Ta
|
|
|
158
158
|
| `smart-compact` | 컨텍스트 임계 초과 시 위키·resume 저장 게이트 자동 무장 |
|
|
159
159
|
| `deep-research` | 다중 소스 팬아웃 + 적대적 검증 인용 리서치 |
|
|
160
160
|
| `lfm` | learn from master. 그 분야 최고 전문가 그룹이 일하는 방식을 1차 자료로 조사해 계획 적용 항목으로 정리(ultra-interview, ultra-chain, deep-research, rfp-author 의 리서치에서도 씀) |
|
|
161
|
-
| `make-evidence` | 구현한 서비스의 증거 문서 여섯(optimize, verify, flow, scale, decisions, trace)을 실제 실행으로 만들어 `docs/evidence/` 에 커밋.
|
|
161
|
+
| `make-evidence` | 구현한 서비스의 증거 문서 여섯(optimize, verify, flow, scale, decisions, trace)을 실제 실행으로 만들어 `docs/evidence/` 에 커밋. 도우미 `evidence.mjs` 가 명령을 로그로 남기고(종료 코드, 시간 제한, 비밀값 가림), 문서의 수치를 로그의 `METRIC` 줄과 대조하고, 증거 경로만 커밋. 판정기는 저장소 밖 방에서 README 와 담당자 사실만 받은 새 맥락 하위 에이전트가 쓰고(새 프로젝트는 구현 전에 `--oracle-only` 로 먼저 불러 판정기를 앞서 커밋, 구현 전으로 보이면 스킬이 물음), 버그 셋은 별도 작업 트리에서만 넣고 지움. 구현을 고치지 않고, 설치와 push 는 안 함 |
|
|
162
162
|
| `ultra-interview` | 리서치 선행으로 사람 질문 최소화, 모호성 3% 이하까지 인터뷰 |
|
|
163
163
|
| `interval-report` | 장기 수행 중간 보고를 `docs/intermission.md` 로 갱신(경과·잔여·단일 표) |
|
|
164
164
|
| `summary-wiki` | 위키를 `docs/` 단일 파일 개조식으로 요약(지식 동기화 검토용, 읽기 전용) |
|
package/codex/manifest.json
CHANGED
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
{ "name": "git-init", "type": "skill", "target": "both", "reason": "makes the first commit of a folder that is not a git repository yet, so worktrees and other parallel work can start from it: writes a .gitignore that keeps secrets and local state out, scans the files to track for secrets by name and content (payload-scan.mjs, file:line:kind only, never the value), then runs git init, git add . and git commit -m init; a hit stops it before any .git exists; pure Node, no deps, no network", "supportingFiles": ["scripts/git-init.mjs","scripts/marker-block.mjs","scripts/payload-scan.mjs"], "caveat": "needs git on PATH (before git 2.28 the first branch is set with git symbolic-ref) and a commit identity (user.name and user.email, or --local-identity, written to .git/config only); an existing .gitignore keeps its bytes and gets one marked block at its end, the first original kept in .gitignore.git-init.bak, which the block itself ignores; a .gitignore symbolic link is refused unless --follow-symlink; key file names cannot be accepted, a content hit only by its exact file:line:kind with --accept; commit hooks are not skipped; it never adds a remote or pushes; on Codex run asks for sandbox_permissions require_escalated, since the default sandbox may block writes to .git" },
|
|
81
81
|
{ "name": "build-testbox", "type": "skill", "target": "both", "reason": "a test environment this machine builds from its own resources: a browser matrix (Playwright Chromium and WebKit, desktop and mobile device emulation) against a loopback URL and container OSes (Rocky Linux 8, 9; macOS only as a Tart VM on Apple Silicon) run in parallel, every requested cell kept as a pass, fail, unverified or unsupported row with a reason, results.json and summary.md; detect, run, setup; pure Node, no deps", "supportingFiles": ["scripts/testbox.mjs","scripts/args.mjs","scripts/detect.mjs","scripts/browsers.mjs","scripts/browser-cell.mjs","scripts/containers.mjs","scripts/setup.mjs","scripts/report.mjs","scripts/proc.mjs"], "caveat": "Playwright (a global install, or the project's with --playwright-from-project) and docker or podman are optional; a missing one leaves its cells unverified with the reason; run downloads nothing (a missing image or browser build is unverified, never pulled); setup only lists what it would fetch and its rough size, and fetches after the user confirms and it runs again with --yes (exit 4 and network needed when the sources are unreachable); macOS runs only as a Tart VM on an Apple Silicon host (other hosts are unsupported under the Apple SLA), and the skill never downloads or starts the VM; on Codex detect and run ask for sandbox_permissions require_escalated for the container engine and the headless browsers, the server under test on a 127.0.0.1 port is the user's own (approved where it is started), and setup --yes, or a container command that uses the network, asks for network access (--network host lifts that cell's isolation, and the user is told)" },
|
|
82
82
|
{ "name": "tune-tmux", "type": "skill", "target": "both", "reason": "adds or removes one marked block in the tmux or psmux config file so mouse drag copies to the OS clipboard and PageUp/PageDown scroll inside tmux, without taking keys or the mouse from full-screen apps; status shows the chosen file, the lines and why any are left out, conflicts in other files tmux reads, and per-app behavior (Claude Code, Codex); first original kept, off removes only the block, --reload applies it to a running server; pure Node, no deps, no network", "supportingFiles": ["scripts/tune-tmux.mjs","scripts/tmux-config.mjs","scripts/app-notes.mjs","scripts/marker-block.mjs","scripts/psmux-caps.json"], "caveat": "needs tmux or psmux (install with setup-tmux; status alone works without them); it writes the user's config file outside the workspace (~/.tmux.conf or the XDG tmux.conf, ~/.psmux.conf for psmux), keeping the first original as <conf>.tune-tmux.bak, so on Codex on, off and --reload ask for sandbox_permissions require_escalated (no --add-dir); a config file that is a symbolic link is refused unless --follow-symlink; psmux gets a block of zero lines today (its defaults give mouse, set-clipboard and wheel copy-mode; drag to the Windows clipboard and PageUp/PageDown inside full-screen apps are unverified; outside apps PageUp needs the prefix, PageDown does not leave copy-mode at the bottom and #{alternate_on} is always 0), so on reports the unverified and broken counts with exit 0 and only takes out an old tune-tmux block left in that file; inside full-screen apps (Claude Code fullscreen, Codex Fullscreen) the app keeps PageUp/PageDown and the mouse, and tmux copy-mode cannot scroll Codex history, a limit tmux config cannot fix; it never changes Claude Code or Codex settings" },
|
|
83
|
-
{ "name": "make-evidence", "type": "skill", "target": "both", "reason": "writes six evidence documents for a built service from real runs and commits them under docs/evidence/ (optimize
|
|
83
|
+
{ "name": "make-evidence", "type": "skill", "target": "both", "reason": "writes six evidence documents for a built service from real runs and commits them under docs/evidence/ (optimize, verify, flow, scale, decisions, trace) with scripts/evidence.mjs: run records each command (quoted command line, HEAD and dirty count, both streams with common secret forms masked, exit code passed through, stdin closed, a time limit that ends the process tree, no overwrite), measured numbers are METRIC name=value lines that check matches exactly against the log a document line names, room and collect give the oracle writer (a fresh-context sub-agent with a fixed prompt) a folder outside the repository holding only the requirement document and the owner facts, worktree and bug put each seeded bug (constraint, objective, permission) into a separate worktree of HEAD and judge it by ORACLE lines against a baseline (caught, missed, undecidable) while the user's work tree is left as it was, precheck stops on staged changes and asks about uncommitted ones and config hosts that are not this machine, commit takes only docs/evidence and tests/oracle (ignored logs included, hooks not skipped); --oracle-only writes the oracle before implementation; never edits the implementation, installs, downloads or pushes", "supportingFiles": ["scripts/evidence.mjs", "scripts/me-git.mjs", "scripts/me-run.mjs", "scripts/me-precheck.mjs", "scripts/me-check.mjs", "scripts/me-oracle.mjs", "scripts/me-commit.mjs"], "caveat": "the project supplies the server, its tests and the tools; a missing tool, a server that cannot be reached or a non-local config is written as unverified, never filled from unit tests; the sub-agent's list of files read is its own report, and context the runtime adds (the session folder's CLAUDE.md or AGENTS.md, memory) is written down as a limit; on Codex worktree, bug, commit, serve, stop and runs that reach a local server or DB ask for sandbox_permissions require_escalated" },
|
|
84
84
|
|
|
85
85
|
{ "name": "front-qa", "type": "command", "target": "both", "reason": "ralplan->ralph frontend-QA pipeline; Claude=OMC, Codex=OMX", "supportingFiles": [] },
|
|
86
86
|
{ "name": "setup", "type": "command", "target": "both", "reason": "installer orchestrator; Claude AskUserQuestion multi-select, Codex prompt-based selection", "supportingFiles": [], "codexDescription": "구성요소와 의존성을 여러 개 골라 설치하는 오케스트레이터. 런타임(Node, Python, Java), LSP, tmux, MCP, 샌드박스, OMX, Playwright 등. 권한 확인 끄기는 따로 묻고 기본으로 고르지 않으며, 골라도 실행하지 않고 직접 입력할 명령만 안내." },
|
|
@@ -54,7 +54,7 @@ The generator (`banker setup --codex`) applies the rules below for `target: both
|
|
|
54
54
|
- `init-dir` — the same procedure in both runtimes; the engine is `scripts/init-dir.mjs` (Codex npm install: `~/.codex/skills/banker-init-dir/scripts/init-dir.mjs`; plugin install: `~/.codex/plugins/cache/<marketplace>/banker/<version>/skills/init-dir/scripts/init-dir.mjs`), run with `--runtime claude|codex`. It writes one marked block (`<!-- banker:init-dir:start -->` to `<!-- banker:init-dir:end -->`) into whichever of `AGENTS.md` and `CLAUDE.md` exist (Codex with neither: `AGENTS.md`), the `AGENTS.md` block inside its own `USER:OMX:POLICY` pair; `AGENTS.override.md` is never written, only warned about when it has content of its own. The block editor `scripts/marker-block.mjs` is the source of truth for its future copies (`scripts/sync-adapter.js`). Pure Node with no network. On Codex a `--root` outside the workspace, or starting a generated service that must outlive the session, asks for `sandbox_permissions: "require_escalated"`.
|
|
55
55
|
- `motion-sites` — the same procedure in both runtimes; the engine is `scripts/motion-sites.mjs` (Codex npm install: `~/.codex/skills/banker-motion-sites/scripts/motion-sites.mjs`; plugin install: `~/.codex/plugins/cache/<marketplace>/banker/<version>/skills/motion-sites/scripts/motion-sites.mjs`). `status --runtime codex` finds the original plugin through `config.toml` (`[plugins."motionsites-web-builder@motionsites"]`) and `plugins/cache/motionsites/`; `setup --runtime codex` runs `codex plugin marketplace add Motionsites-AI/claude-skill` and `codex plugin add motionsites-web-builder@motionsites` where Claude Code runs `claude plugin marketplace add` and `claude plugin install`. The hand-over is `$motionsites-web-builder:motionsites-web-builder` once the plugin shows in the session, else the original `SKILL.md` read and followed. `setup` needs the network and asks for `sandbox_permissions: "require_escalated"`.
|
|
56
56
|
- `git-init` — the same procedure in both runtimes; the engine is `scripts/git-init.mjs` (Codex npm install: `~/.codex/skills/banker-git-init/scripts/git-init.mjs`; plugin install: `~/.codex/plugins/cache/<marketplace>/banker/<version>/skills/git-init/scripts/git-init.mjs`). `check` (the default) writes nothing; `run` writes the `.gitignore` block (`# banker:git-init:start` to `# banker:git-init:end`, through `scripts/marker-block.mjs`, a byte-identical copy of init-dir's), scans the files to track with `scripts/payload-scan.mjs` (a byte-identical copy of ralph-qa's; both kept by `scripts/sync-adapter.js`) and only then runs `git init`, `git add .` and `git commit -m "init"`. Needs `git`; no network, no remote, no push. On Codex `run` asks for `sandbox_permissions: "require_escalated"`, as the default sandbox may block writes to `.git`.
|
|
57
|
-
- `make-evidence` — the same procedure in both runtimes
|
|
57
|
+
- `make-evidence` — the same procedure in both runtimes; the engine is `scripts/evidence.mjs` (Codex npm install: `~/.codex/skills/banker-make-evidence/scripts/evidence.mjs`; plugin install: `~/.codex/plugins/cache/<marketplace>/banker/<version>/skills/make-evidence/scripts/evidence.mjs`). Pure Node with no network; `--shell` runs one line in PowerShell on Windows and `/bin/sh` elsewhere. The oracle is written by a fresh-context sub-agent in a room outside the repository (`room`, `collect`): Claude Code uses the Agent tool as `general-purpose` with no `model`; Codex uses `spawn_agent` with no `agent_type` or `model` and without the author's conversation (`fork_turns="none"` on multi-agent v2, no `fork_context` on v1), then `close_agent`. On Codex `worktree`, `bug` and `commit` (writes to `.git`), `serve`, `stop`, and runs that reach a local server or DB ask for `sandbox_permissions: "require_escalated"`, as the default sandbox may block `.git` writes, 127.0.0.1 connections and opening a port.
|
|
58
58
|
- `build-testbox` — the same procedure in both runtimes; the engine is `scripts/testbox.mjs` (Codex npm install: `~/.codex/skills/banker-build-testbox/scripts/testbox.mjs`; plugin install: `~/.codex/plugins/cache/<marketplace>/banker/<version>/skills/build-testbox/scripts/testbox.mjs`) with `detect`, `run` and `setup`; `scripts/browser-cell.mjs` is copied into the Playwright image and runs there alone for `--browser-in-container`. Playwright and docker or podman are optional: a missing one leaves its cells `unverified` with the reason. `run` downloads nothing; `setup` without `--yes` only lists what it would fetch, and the skill confirms with the user (Claude Code `AskUserQuestion`, Codex `request_user_input`) before running it again with `--yes`. macOS runs only as a Tart VM on an Apple Silicon host; other hosts get `unsupported(apple-sla)`. On Codex `detect` and `run` ask for `sandbox_permissions: "require_escalated"` (container engine, headless browsers, copies under the OS temp folder), `setup --yes` and container commands that use the network ask for network access, and the server under test is the user's own on a 127.0.0.1 port; a cell stopped by a permission error is `unverified(sandbox)`.
|
|
59
59
|
- `tune-tmux` — the same procedure in both runtimes; the engine is `scripts/tune-tmux.mjs` (Codex npm install: `~/.codex/skills/banker-tune-tmux/scripts/tune-tmux.mjs`; plugin install: `~/.codex/plugins/cache/<marketplace>/banker/<version>/skills/tune-tmux/scripts/tune-tmux.mjs`) with `status` (the default), `on` and `off`. It writes one marked block (`# banker:tune-tmux:start` to `# banker:tune-tmux:end`) through `scripts/marker-block.mjs`, a byte-identical copy of init-dir's kept by `scripts/sync-adapter.js`, into the user's tmux config (`~/.tmux.conf` or the XDG `tmux.conf`) or psmux config (`~/.psmux.conf` and the rest of psmux's order); psmux gets zero lines today, as `scripts/psmux-caps.json` verifies nothing beyond its defaults. The conditional `#{||:}` is probed on a private `tmux -L` server, never the user's. A symbolic-link config is refused unless `--follow-symlink`. No network. On Codex `on`, `off` and `--reload` ask for `sandbox_permissions: "require_escalated"`, as the config file and the tmux socket are outside the workspace; Claude Code and Codex settings are never changed, and Codex Fullscreen history cannot be scrolled by tmux copy-mode (only the user's `--no-alt-screen` or `tui.alternate_screen = "never"` changes that).
|
|
60
60
|
- `/graceful-pause` — in Claude Code a function-hooks command (`hooks/register.mjs`, 2.1.289+, not a manifest surface) registered `immediate`, so it runs mid-turn; it appends one hidden user row the running turn reads at its next model request. In Codex the `codex-only` skill `graceful-pause` (`$banker-graceful-pause`): a message sent with Enter while a turn runs is held as "Messages to be submitted after next tool call" and put into the same turn when the running tool call ends, so the session stops after the current step (Codex 0.144.5: verified with `sleep 40` in a real TUI).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaydash9999/banker-plugins",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.1",
|
|
4
4
|
"description": "banker — Claude Code + Codex CLI plugin (QA, audit, docs, architecture, wiki skills). Install via Claude Code marketplace, or `npm i -g @kaydash9999/banker-plugins` then `banker setup`.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"banker": "bin/banker.js"
|
|
@@ -1,182 +1,258 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: make-evidence
|
|
3
|
-
description: "구현한 서비스의 증거 문서 여섯(optimize, verify, flow, scale, decisions, trace)을 실제 실행으로 만들어 docs/evidence/ 에 커밋. 수치는 실행
|
|
4
|
-
argument-hint: "[--host <host>] [--port <port>] [--only <문서,...>] [--no-commit]"
|
|
3
|
+
description: "구현한 서비스의 증거 문서 여섯(optimize, verify, flow, scale, decisions, trace)을 실제 실행으로 만들어 docs/evidence/ 에 커밋. 수치는 실행 로그의 METRIC 줄에서만 옮기고 도우미가 대조함. 판정기는 저장소 밖 방에서 README 와 담당자 사실만 받은 새 맥락 하위 에이전트가 씀. 버그 셋은 별도 작업 트리에서만 넣고 지움. 미구현은 숨기지 않음. 새 프로젝트는 구현 전에 --oracle-only 로 먼저 불러야 판정기가 구현보다 앞섬. 'make-evidence'/'증거 문서'/'evidence 만들어'/'검증 근거 문서' 시 사용."
|
|
4
|
+
argument-hint: "[--host <host>] [--port <port>] [--only <문서,...>] [--oracle-only] [--no-commit]"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# make-evidence: 실행으로 만드는 증거 문서 여섯
|
|
8
8
|
|
|
9
9
|
구현한 서비스가 README 의 요구를 지키는지, 실제로 실행한 결과로 보이는 문서 여섯을 만든다.
|
|
10
|
-
문서는 `docs/evidence/` 에 쓰고 커밋한다. 답변은 한글.
|
|
10
|
+
문서는 `docs/evidence/` 에, 판정기는 `tests/oracle/` 에 쓰고 커밋한다. 답변은 한글.
|
|
11
11
|
|
|
12
12
|
## 원칙
|
|
13
13
|
|
|
14
|
-
- **수치는 손으로 쓰지 않는다.** 시간, 목적값,
|
|
15
|
-
-
|
|
16
|
-
-
|
|
14
|
+
- **수치는 손으로 쓰지 않는다.** 시간, 목적값, 차이, 통과 수, 건수는 스크립트가 로그에 `METRIC <이름>=<값>` 줄로 찍고, 문서는 그 값을 `` `<이름>=<값>` `` 으로 자릿수 그대로 옮긴다.
|
|
15
|
+
- 이름에는 점이 하나 이상 있다(예: `scale.x5.median_s`). 점 없는 `exit=0` 같은 코드 표기는 수치로 보지 않는다.
|
|
16
|
+
- 반올림이나 단위 바꾸기는 스크립트가 해서 찍는다. 측정 스크립트는 상수를 찍지 않는다. 로그를 손으로 쓰거나 고치지 않는다.
|
|
17
|
+
- 시험 통과 수와 종료 코드는 `run` 이 로그 끝에 `METRIC run.exit=`, `METRIC run.tests.pass=` 처럼 찍는다(node --test, pytest, jest).
|
|
18
|
+
- METRIC 을 찍는 코드는 `docs/evidence/scripts/` 의 파일에 둔다. 명령 줄에 `METRIC` 글이 든 로그(`node -e "console.log('METRIC ...')"` 등)는 `check` 가 거부한다.
|
|
19
|
+
- **문서마다 실행 명령과 로그 경로를 적는다.** 수를 적은 줄에는 그 로그 경로를 함께 적는다. 도우미 `check` 가 그 로그에서 같은 줄을 찾는다.
|
|
20
|
+
- **실행하지 못한 것은 `미검증` 과 까닭이다.** 추정값, 예상값, 다른 시험의 결과로 채우지 않는다.
|
|
17
21
|
- **미구현을 숨기지 않는다.** README 요구 가운데 구현하지 않은 것은 `trace.md` 에 `미구현` 과 이유로 남긴다.
|
|
18
|
-
-
|
|
22
|
+
- **구현을 고치지 않는다.** 결함을 찾으면 그대로 기록하고 사용자에게 알린다. 고칠지는 사용자가 정한다. 고친 뒤 다시 부르면 고치기 전 로그도 남긴다.
|
|
23
|
+
- **설치하거나 내려받지 않는다.** 없는 도구(브라우저, DB 클라이언트, 시험 도구)가 필요한 칸은 `미검증(<도구> 없음)` 이다. `npm install`, `pip install`, `npx playwright install`, 이미지 받기를 하지 않는다.
|
|
24
|
+
- **운영 서버, 운영 DB, 남의 서비스에 보내거나 쓰지 않는다.** 로컬 서버라도 설정이나 환경 변수가 그런 곳을 가리키면 먼저 사용자에게 묻는다. 구현을 띄우는 모든 실행(판정기 기준선과 버그 셋, 종단 시험, 규모 측정)에 같다.
|
|
25
|
+
- **사용자의 작업 트리를 건드리지 않는다.** 버그는 별도 작업 트리에서만 넣는다. `git checkout --`, `git restore`, `git stash`, `git clean`, `git reset --hard` 를 쓰지 않는다.
|
|
26
|
+
- 로그와 문서에 비밀값을 넣지 않는다. 도우미가 명령 줄과 출력의 흔한 비밀값 꼴(`DB_PASSWORD=`, `--token`, URL 의 비밀번호, 개인 키 등)을 `***` 로 가리고 그 수를 `# redacted=<n>` 로 남긴다. `commit` 은 비밀값 꼴이 남은 파일을 거부한다. METRIC 이름에 password, secret, token, key 를 쓰지 않는다(가림에 걸림).
|
|
27
|
+
|
|
28
|
+
## 런타임
|
|
29
|
+
|
|
30
|
+
| 항목 | Claude Code | Codex |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| 스킬 디렉터리 `<S>` | 스킬 맨 위 "Base directory for this skill:" 경로 | 이 SKILL.md 의 폴더. npm 설치는 `~/.codex/skills/banker-make-evidence/`, 플러그인 설치는 `~/.codex/plugins/cache/<마켓플레이스>/banker/<판>/skills/make-evidence/`. 절대경로로 씀 |
|
|
33
|
+
| 부르기 | `/banker:make-evidence` | `$banker-make-evidence`, 플러그인 `$banker:make-evidence` |
|
|
34
|
+
| 확인 질문 | `AskUserQuestion` | `request_user_input`. 없으면 번호 붙인 평문 선택지 |
|
|
35
|
+
| 판정기 하위 에이전트 | Agent 도구, `general-purpose`, `model` 없이 | `spawn_agent` 를 `agent_type` 과 `model` 없이. 대화를 넘기지 않음(multi-agent v2 `fork_turns="none"`, v1 은 `fork_context` 를 주지 않음). 결과를 받으면 `close_agent` |
|
|
36
|
+
| 샌드박스 | 없음 | 아래 명령은 `sandbox_permissions: "require_escalated"` 로 승인을 청함: `worktree`, `bug`, `commit`(`.git` 쓰기), `serve`, `stop`, 로컬 서버와 DB 에 닿는 `run`(기본 샌드박스는 127.0.0.1 연결과 포트 열기도 막을 수 있음), 브라우저 실행. 권한 오류로 닿지 못하면 `미검증` 으로 적기 전에 승인을 청하고 다시 돈다. 승인할 수 없는 실행이면 `미검증(sandbox)` |
|
|
37
|
+
| 셸 | bash | Windows 는 PowerShell. 도우미는 Node 라 두 셸에서 같다. `--shell` 은 Windows 에서 PowerShell, 그 밖에서 `/bin/sh` 로 한 줄을 돌림. 로그 이름의 `{ts}` 는 예시처럼 작은따옴표로 감싼다(PowerShell 은 따옴표 없는 `{...}` 를 지움). `@TS@` 도 같은 뜻. `wt=$(node "$E" worktree)` 는 PowerShell 에서 `$wt = node $E worktree` |
|
|
38
|
+
| 명령 시간 | Bash 도구의 `timeout` 을 도우미 `--timeout` 보다 30초 길게 준다(최대 600000). 더 길면 `run_in_background` 로 돌린다 | `timeout_ms` 를 같은 값으로 준다 |
|
|
39
|
+
|
|
40
|
+
물을 수 없는 실행(`codex exec`, 다른 스킬의 연쇄)에서 질문이 필요한 칸은 `미검증(질문 불가)` 로 두고 진행한다.
|
|
19
41
|
|
|
20
42
|
## 인자
|
|
21
43
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
44
|
+
| 인자 | 뜻 |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `--host <host>`, `--port <port>` | `flow.md` 의 종단 시험이 요청을 보낼 서버. 없으면 직접 띄운 서버의 시작 로그, README, `.env.example`, 시작 스크립트에서 찾고, 그래도 없으면 묻는다. 찾은 값과 출처를 `flow.md` 에 적는다. 화면과 API 의 포트가 다르면 둘 다 적는다 |
|
|
47
|
+
| `--only <문서,...>` | 일부만 만든다. 이름은 `optimize`, `verify`, `flow`, `scale`, `decisions`, `trace`. 빠진 문서에 기대는 칸(판정기 결과, 시험 로그)은 `미검증(선행 문서 없음)` |
|
|
48
|
+
| `--oracle-only` | 구현을 시작하기 전에 부른다. 담당자 사실, 판정기, 판정기 커밋까지만 한다. "판정기를 구현 전에 씀" 을 지키는 길은 이것뿐이다 |
|
|
49
|
+
| `--no-commit` | 파일은 쓰고 아무것도 커밋하지 않는다(판정기 커밋도). `verify.md` 첫 줄에 `판정기 미커밋: 구현 전에 썼다는 순서를 보일 수 없음` |
|
|
25
50
|
|
|
26
|
-
##
|
|
51
|
+
## 도우미
|
|
27
52
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
53
|
+
`E="<S>/scripts/evidence.mjs"`. Node 만 쓰고 네트워크를 쓰지 않는다. `node "$E" --help` 가 전체 사용법이다.
|
|
54
|
+
|
|
55
|
+
| 명령 | 하는 일 |
|
|
56
|
+
|---|---|
|
|
57
|
+
| `run --log <파일> [--timeout <초>] [--cwd <폴더>] [--shell] -- <명령...>` | 명령을 돌려 로그를 남긴다. 첫 줄은 다시 돌릴 수 있게 인용한 명령, 둘째 줄은 `# head= dirty= at= node= os= cwd=`, 끝은 `exit=<코드>` 와 `METRIC run.exit=`. 명령의 종료 코드를 그대로 돌려준다. 입력은 닫혀 있고, 시간 제한(기본 300초)에 걸리면 프로세스 트리를 끝내고 `exit=timeout(<초>s)`, 종료 124. 출력을 쥔 채 떨어져 나간 자손은 기다리지 않는다(`# orphan-output=yes`) |
|
|
58
|
+
| `serve --log <파일> --pid <파일> --ready <URL> -- <명령...>` / `stop --pid <파일>` | 서버를 띄워 URL 이 답할 때까지 기다리고, 끝에 트리째 내린다. URL 이 이미 답하면 띄우지 않고, 기다리는 동안 서버가 끝나면 `not-ready(exited <코드>)`. 먼저 죽은 서버는 `exit=gone-before-stop` |
|
|
59
|
+
| `precheck` | 스테이징된 변경(`STOP`), 증거 밖의 바뀐 파일(`ASK dirty`), 이 컴퓨터 밖 주소(`ASK host`, 값은 안 보임)를 보인다. 주소는 네 단계 아래까지의 설정 파일과 환경 변수에서 찾는다. 환경 변수는 저장소가 이름을 부르는 것과, 프레임워크와 DB, 메시지 라이브러리가 스스로 읽는 이름(`SPRING_*`, `QUARKUS_*`, `ConnectionStrings__*`, `PG*`, `MYSQL_*`, `DATABASE_*`, `REDIS*`, `MONGO*`, `KAFKA_*` 등)을 묻고, 그 밖은 `NOTE host` 로만 보인다. 비밀번호와 토큰 이름의 변수는 값을 읽지 않는다. compose 서비스 이름 밖의 점 없는 이름도 묻는다. 결정할 것이 있으면 종료 3 |
|
|
60
|
+
| `room`, `collect --room <폴더> [--replace]` | 판정기 작성용 방(저장소 밖 임시 폴더)에 요구 문서와 담당자 사실만 넣고(방의 기록 파일은 방 밖), 끝나면 방의 `tests/oracle/` 만 가져온다. 방에 다른 파일이 생겼거나 입력이 바뀌었으면 거부(종료 1). 이미 판정기가 있으면 `--replace` 때만 바꾸고 이전 판정기 커밋을 찍는다 |
|
|
61
|
+
| `worktree [--link <폴더>]...`, `worktree --remove <폴더>`, `bug --worktree <폴더> --name <이름> [--kind <종류> --baseline <로그>] -- <판정기 명령...>` | HEAD 의 별도 작업 트리를 만들고(추적되지 않는 의존 폴더는 `--link` 로 이음, 빌드 결과와 `.env` 는 거부), 거기서 판정기를 돌리고, 패치와 로그를 남기고, 작업 트리를 지운다(거부돼도 지움). 사용자 작업 트리(추적 파일의 내용과 추적되지 않는 파일)와 링크한 폴더가 그대로인지 확인한다. 무시된 파일과 DB 는 확인 범위 밖이다 |
|
|
62
|
+
| `check [--tracked]`, `count --doc <파일>` | 문서의 `` `이름=값` `` 을 가리킨 로그의 `METRIC 이름=값` 줄과 정확히 대조한다. `run` 이 만든 로그만 받는다. `` `이름=값` `` 밖의 숫자는 로그 경로가 있든 없든 `WARN` 이고, 오류나 경고가 하나라도 있으면 종료 1. `count` 는 trace 표의 `상태` 칸(머리 줄로 찾음)을 세어 METRIC 줄로 찍고, 넷 가운데 하나가 아닌 행이 있으면 종료 1 |
|
|
63
|
+
| `commit --message <글> [--paths <경로>]... [--accept <파일:줄>]...` | 기본 `docs/evidence`, `tests/oracle` 만 커밋한다. 다른 스테이징된 변경이 있으면 거부. `.gitignore` 에 걸린 파일은 `docs/evidence/logs/` 의 `.log`, `.patch`, `.md` 만 넣는다. `.env`, 5MB 넘는 파일, 비밀값 꼴이 남은 줄(`--accept` 로 사용자가 확인한 자리는 빼고)이 있으면 거부. 커밋 훅은 우회하지 않는다 |
|
|
64
|
+
|
|
65
|
+
로그 이름은 `docs/evidence/logs/<문서>-<무엇>-{ts}.log` 다. `{ts}` 는 밀리초까지의 UTC 시각이고, 같은 이름은 덮어쓰지 않는다. 문서가 가리키는 로그가 결과를 내는 로그이고, 다시 돌린 로그도 지우지 않는다.
|
|
66
|
+
|
|
67
|
+
판정기는 판정마다 `ORACLE <constraint|objective|permission> <PASS|FAIL|ERROR> <사례 이름> [설명]` 한 줄을 찍는다. 사례 이름은 공백 없는 한 낱말이다. `bug` 는 이 줄로 판정한다.
|
|
68
|
+
|
|
69
|
+
## 진행
|
|
70
|
+
|
|
71
|
+
순서가 중요하다. 판정기 작성자에게 구현 정보가 가지 않도록, 구현을 읽기 전에 0~3 을 한다.
|
|
72
|
+
|
|
73
|
+
`git ls-files tests/oracle` 이 비어 있지 않으면(앞서 `--oracle-only` 로 판정기를 커밋함) 1~3 의 작성은 건너뛴다. 3 의 순서 로그만 남기고, 판정기 커밋 뒤 요구 문서나 담당자 사실이 바뀌었는지 `git diff <판정기 커밋> -- README.md docs/evidence/owner-facts.md` 를 `run` 으로 남긴다. 바뀌었으면 그 사실을 `verify.md` 에 적는다.
|
|
35
74
|
|
|
36
|
-
|
|
37
|
-
- 로그는 명령의 표준 출력과 표준 오류를 함께 담고, 첫 줄에 실행한 명령, 마지막 줄에 종료 코드를 남긴다.
|
|
75
|
+
### 0. 사전 확인
|
|
38
76
|
|
|
39
77
|
```bash
|
|
40
|
-
|
|
41
|
-
mkdir -p "$(dirname "$1")"; f=$1; shift
|
|
42
|
-
{ echo "\$ $*"; "$@"; echo "exit=$?"; } > "$f" 2>&1
|
|
43
|
-
}
|
|
78
|
+
node "$E" run --log 'docs/evidence/logs/precheck-{ts}.log' -- node "$E" precheck
|
|
44
79
|
```
|
|
45
80
|
|
|
46
|
-
|
|
81
|
+
- `STOP staged`: 사용자가 스테이징한 변경이 있다. 이 스킬은 스테이징을 풀지 않는다. 사용자에게 알리고 멈춘다.
|
|
82
|
+
- `ASK dirty`: 커밋하지 않은 변경이 있다. 묻는다: 사용자가 커밋한 뒤 다시 부름(권장), 또는 그대로 진행. 그대로 진행하면 문서마다 "커밋하지 않은 변경 위에서 실행함(precheck 로그)" 을 적는다. 판정기와 버그 시험은 늘 HEAD 의 별도 작업 트리에서 돈다.
|
|
83
|
+
- `ASK host`: 설정이나 환경 변수가 이 컴퓨터 밖의 DB 나 서비스를 가리킨다. 묻는다. 허락이 없으면 구현을 띄우지 않는다. 판정기 기준선과 버그 셋, `flow.md`, `scale.md` 의 측정이 모두 `미검증(비로컬 설정)` 이다.
|
|
84
|
+
- `NOTE host`: 저장소가 이름을 부르지 않는 환경 변수의 주소다. 서비스나 그 라이브러리가 그 변수를 읽는다면 `ASK host` 와 같이 묻는다.
|
|
85
|
+
- **구현 전인지 본다.** `--oracle-only` 없이 불렀는데 README 의 요구를 처리하는 코드(최적화, API 라우트, CLI 나 배치의 진입점)를 하나도 찾지 못하면 구현 전으로 보고 묻는다: 판정기만 쓰고 멈춤(`--oracle-only` 와 같음, 권장), 또는 그대로 진행. 물을 수 없으면 판정기만 쓰고 멈춘다. 구현 전에 판정기를 커밋해야 "판정기를 구현 전에 씀" 이 지켜지기 때문이다.
|
|
86
|
+
- `precheck` 는 흔한 설정 꼴만 본다. 시작 스크립트와 설정 로더가 읽는 곳(코드 안의 기본값, 다른 이름의 설정 파일, 프레임워크가 환경에서 덮어쓰는 이름)도 직접 읽어 확인한다.
|
|
87
|
+
|
|
88
|
+
### 1. 담당자 사실
|
|
89
|
+
|
|
90
|
+
- 담당자(사용자)가 준 업무 규칙, 수치 기준, 권한 규칙을 `docs/evidence/owner-facts.md` 에 옮긴다. 항목마다 출처(사용자 메시지 인용과 날짜, 또는 담당자가 준 문서의 경로)를 붙인다.
|
|
91
|
+
- 구현에서 읽은 것, 스스로 짐작한 것은 넣지 않는다. 담당자 사실이 없으면 묻는다. 그래도 없으면 `담당자 사실 없음` 한 줄로 두고 그 사실을 `verify.md` 에 적는다.
|
|
92
|
+
- 요구가 README 가 아닌 문서(사용자가 준 명세)에 있으면 그 경로를 `room` 의 `--req` 로 준다.
|
|
93
|
+
|
|
94
|
+
### 2. 판정기(구현 보기 전)
|
|
95
|
+
|
|
96
|
+
1. 방을 만든다: `node "$E" room [--req <요구 문서>]`. 출력의 `room: <폴더>` 가 방 `R` 이다.
|
|
97
|
+
2. 아래 지시문의 `{R}` 만 채워 `docs/evidence/logs/verify-oracle-prompt-{ts}.md` 에 그대로 저장하고, 그 글 그대로 하위 에이전트를 띄운다. 구현에서 알게 된 이름, 형식, 식, 경로를 더하지 않는다.
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
당신은 판정기(oracle) 작성자입니다. 작업 폴더는 {R} 입니다.
|
|
101
|
+
- 읽어도 되는 파일은 {R} 안의 파일뿐입니다(요구 문서와 docs/evidence/owner-facts.md). {R} 밖의 경로는 읽지도, 목록을 보지도, 실행하지도 않습니다.
|
|
102
|
+
- 쓸 곳은 {R}/tests/oracle/ 뿐입니다.
|
|
103
|
+
- 만들 것:
|
|
104
|
+
1. 판정기: 입력과 출력만 보고 세 가지를 판정합니다. 제약을 모두 지키는가(constraint), 보고된 목적값이 입력과 출력으로 다시 계산한 값과 같은가(objective), 권한 규칙을 지키는가(permission). 판정마다 한 줄 `ORACLE <constraint|objective|permission> <PASS|FAIL|ERROR> <사례 이름> [설명]` 을 표준 출력에 찍습니다. 사례 이름은 공백 없는 한 낱말입니다. 구현이 뜨지 않았거나, 응답이 없거나, 출력을 읽지 못해 판정할 수 없으면 FAIL 이 아니라 ERROR 를 찍습니다. 요구 문서와 담당자 사실에 권한 규칙이 없으면 permission 은 만들지 않고 그 사실을 RUN.md 에 적습니다.
|
|
105
|
+
2. 판정기 자체 시험: 손으로 만든 입력과 출력(맞는 것과 틀린 것)으로 판정기만 시험합니다. 구현을 부르지 않습니다. RUN.md 에 자체 시험 명령도 한 줄 적습니다. 목적값 계산과 제약 판정 함수는 다른 스크립트가 불러 쓸 수 있게 내보내고, 그 이름을 RUN.md 에 적습니다.
|
|
106
|
+
3. RUN.md: 판정기로 구현을 판정하는 명령 한 줄. 명령은 프로젝트 맨 위 폴더(요구 문서가 있는 폴더)에서 돕니다. 구현을 부르는 방법이 요구 문서에 있으면(실행 방법, API) 판정기가 그 폴더에서 구현을 직접 띄워 부르고 끝에 내립니다. 빈 포트를 쓰고, 이미 떠 있는 서버는 쓰지 않습니다. 방법이 없으면 IO.md 에 입력 파일과 출력 파일의 형식을 정해 그 파일을 읽게 합니다. 명령은 파일을 하나하나 이름으로 줍니다(폴더 인자는 판에 따라 시험을 하나도 돌리지 않습니다).
|
|
107
|
+
4. REQUIREMENTS.md: 요구 문서의 요구를 빠짐없이 번호(R1, R2...), 요구 문서:줄, 원문 문장으로 적습니다.
|
|
108
|
+
- 시험은 돌리지 않습니다. 끝에 읽은 파일 목록(명령으로 본 것 포함)과 만든 파일 목록을 보고합니다.
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
3. 띄울 수 없으면(이미 하위 에이전트 안, 다중 에이전트 기능이 꺼짐, 비대화 실행) 같은 맥락이 판정기를 쓰지 않는다. `verify.md` 는 `작성 안 함(하위 에이전트를 띄울 수 없음: <까닭>)` 으로 두고 끝 보고에 올린다.
|
|
112
|
+
4. 돌아오면 `node "$E" run --log 'docs/evidence/logs/verify-collect-{ts}.log' -- node "$E" collect --room <R>`. 거부되면(종료 1) 그 판정기를 버리고 새 방으로 다시 띄운다. 두 번 더 실패하면 멈추고 알린다. 보고된 읽은 파일 목록에 방 밖의 경로가 있어도 같다.
|
|
113
|
+
5. 판정기 자체 시험을 RUN.md 의 명령으로 `run` 해 로그를 남긴다(구현은 부르지 않으므로 HEAD 에서 돌려도 된다). 실패하면 판정기를 고치지 않고, 그 사실을 적은 뒤 새 방으로 다시 띄운다.
|
|
114
|
+
6. `verify.md` 의 "격리" 절에 적는다. 방은 읽을 파일을 줄일 뿐, 하위 에이전트가 방 밖을 읽지 못하게 막지는 않는다. 그 사실도 적는다.
|
|
115
|
+
- 지시문 로그 경로
|
|
116
|
+
- 하위 에이전트가 보고한 읽은 파일 목록. 자기 보고라는 사실도 적는다
|
|
117
|
+
- 자동으로 들어갔을 수 있는 맥락: 세션 폴더(저장소)의 `CLAUDE.md`, `AGENTS.md`, 사용자 전역 지시 파일(`~/.claude/CLAUDE.md`, `~/.claude/rules/`, `~/.codex/AGENTS.md`), 자동 메모리, Claude Code 가 붙이는 git 상태(최근 커밋 제목). 그 가운데 구현 구조나 식을 설명하는 것이 있으면 그 사실을 한계로 적는다
|
|
118
|
+
|
|
119
|
+
### 3. 판정기 커밋
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
node "$E" commit --paths tests/oracle --paths docs/evidence/owner-facts.md --paths docs/evidence/logs --message "test(oracle): README 와 담당자 사실만으로 쓴 판정기"
|
|
123
|
+
```
|
|
47
124
|
|
|
48
|
-
|
|
49
|
-
|
|
125
|
+
- 구현 커밋보다 앞서는지 `git log --format='%h %ad %s' --date=iso -- tests/oracle <구현 경로>` 를 `run` 으로 남긴다.
|
|
126
|
+
- 담당자 사실, 지시문 로그, collect 로그가 판정기와 같은 커밋에 들어가, 판정기가 무엇을 보고 언제 쓰였는지 git 으로 보인다.
|
|
127
|
+
- 구현이 이미 있었으면 `verify.md` 첫 줄에 `요구 미충족: 판정기가 구현 뒤에 쓰임(<순서 로그>)` 을 쓰고 끝 보고에도 올린다. 순서를 꾸미지 않는다.
|
|
128
|
+
- `--oracle-only` 면 여기서 멈추고, 구현한 뒤 다시 부르라고 알린다.
|
|
50
129
|
|
|
51
|
-
###
|
|
130
|
+
### 4. optimize.md
|
|
52
131
|
|
|
53
132
|
| 항목 | 내용 |
|
|
54
133
|
|---|---|
|
|
55
134
|
| 목적 함수 | 최소화 또는 최대화하는 값과 식 |
|
|
56
135
|
| 제약 | 제약마다 한 줄. 강한 제약과 약한 제약(벌점)을 나눔 |
|
|
57
|
-
| 알고리즘 이름 | 쓴 알고리즘의
|
|
58
|
-
| 핵심 함수 |
|
|
59
|
-
| 의사코드 | 10
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
###
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
6. **일부러 넣은 버그 셋을 판정기가 잡는지 본다.**
|
|
86
|
-
|
|
87
|
-
| 버그 | 넣는 방법의 예 |
|
|
136
|
+
| 알고리즘 이름 | 쓴 알고리즘의 이름. 라이브러리면 이름과 판(잠금 파일이나 매니페스트에서 읽음, 그 경로를 적음) |
|
|
137
|
+
| 핵심 함수 | `파일:줄`. 목적값 계산, 제약 검사, 탐색 본체를 각각 |
|
|
138
|
+
| 의사코드 | 10줄. 코드 펜스(```) 안에 씀 |
|
|
139
|
+
| 실행 명령, 로그 | 줄 번호를 확인한 명령(예: `git grep -n "def objective"`)을 `run` 으로 남긴 로그 |
|
|
140
|
+
|
|
141
|
+
`파일:줄` 은 그 로그가 보인 줄만 쓴다. 로그 둘째 줄의 `head=` 가 확인한 커밋이다.
|
|
142
|
+
|
|
143
|
+
### 5. verify.md (판정 실행과 버그 셋)
|
|
144
|
+
|
|
145
|
+
1. **잇기**: RUN.md 가 IO.md 형식을 요구하면, 구현을 그 형식으로 잇는 어댑터 `docs/evidence/scripts/oracle-adapter.*` 를 쓴다. 어댑터는 구현을 부르고 형식만 바꾼다. 목적값이나 제약을 스스로 계산하지 않는다. 판정기 파일은 고치지 않는다.
|
|
146
|
+
2. **DB 격리**: 판정기는 구현을 띄워 요청을 보낸다. 버그를 넣은 구현이 쓰는 DB 는 일회용이어야 한다(작업 트리 안의 파일 DB, 임시 SQLite, 시험 전용 스키마나 컨테이너). 그렇게 돌리는 환경 변수를 RUN.md 명령 앞에 주고 `verify.md` 에 적는다. 일회용으로 돌릴 수 없으면 묻고, 허락이 없으면 `미검증(DB 격리 불가)` 이다.
|
|
147
|
+
3. **기준선**: 판정기는 HEAD 의 별도 작업 트리에서, 그 작업 트리의 구현을 직접 띄워 돈다. 이미 떠 있는 서버를 쓰면 넣은 버그가 반영되지 않는다. 빈 포트를 쓴다.
|
|
148
|
+
```bash
|
|
149
|
+
wt=$(node "$E" worktree [--link <의존 폴더>])
|
|
150
|
+
node "$E" bug --worktree "$wt" --name baseline -- <RUN.md 의 명령>
|
|
151
|
+
```
|
|
152
|
+
- 구현이 추적되지 않는 의존 폴더(`node_modules`, `.venv`)를 쓰면 `--link` 로 이어 준다. 빌드 결과(`dist`, `build`, `target` 등)는 잇지 않는다. 버그를 넣은 빌드가 사용자 폴더에 써지기 때문이다. 빌드가 필요하면 RUN.md 명령 앞에서 작업 트리 안에 새로 빌드한다. 별도 작업 트리에 없는 것을 받으려고 설치하지 않는다.
|
|
153
|
+
- 링크한 폴더가 원래 트리의 코드를 가리키면(작업 공간 패키지 링크, editable 설치) `bug` 가 `WARN` 과 `links_to_repo=` 를 찍고 결과를 `undecidable(link-to-main)` 으로 둔다. 넣은 버그 대신 사용자 코드가 돌기 때문이다. Python 은 링크 대신 `PYTHONPATH=<작업 트리>/src` 를 명령 앞에 줄 수 있다. 그래도 안 되면 버그 셋은 `미검증(의존 폴더가 원래 트리를 가리킴)` 이다.
|
|
154
|
+
- 로그 끝의 `METRIC baseline.<종류>.pass=`, `fail=`, `error=` 이 지금 구현의 판정 결과다. 실패가 있으면 그것이 찾은 결함이다. 고치지 않고 적는다.
|
|
155
|
+
- 기준선이 판정 줄을 하나도 내지 않았거나 ERROR 가 있으면 판정기나 RUN.md 명령이 구현을 부르지 못한 것이다. 버그 셋으로 가지 않고 그 로그를 적은 뒤, 명령(환경 변수, 포트, 빌드)을 고쳐 기준선을 다시 돈다. 판정기 파일은 고치지 않는다.
|
|
156
|
+
4. **버그 셋**: 종류마다 새 작업 트리를 만들고, 그 작업 트리의 구현 파일만 고친 뒤 돌린다. 사용자 작업 트리의 파일은 고치지 않는다.
|
|
157
|
+
```bash
|
|
158
|
+
wt=$(node "$E" worktree [--link <의존 폴더>])
|
|
159
|
+
# "$wt" 안의 구현 파일을 고침(예: 제약 검사를 건너뜀)
|
|
160
|
+
node "$E" bug --worktree "$wt" --name constraint --kind constraint --baseline <기준선 로그> -- <RUN.md 의 명령>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
| 종류 `--kind` | 넣는 방법의 예 |
|
|
88
164
|
|---|---|
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
93
|
-
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
165
|
+
| `constraint` | 해를 고르는 단계나 검사에서 제약 하나를 빼서, 실제로 위반한 해가 나오게 함 |
|
|
166
|
+
| `objective` | 목적값 합산에서 항 하나를 빼거나 부호를 바꿈 |
|
|
167
|
+
| `permission` | 권한 확인을 늘 통과하게 바꿈 |
|
|
168
|
+
|
|
169
|
+
- `bug` 가 남기는 것: 패치(`verify-bug-<이름>-*.patch`), 로그, 그리고 로그 끝의 `METRIC bug.<이름>.result=`, `reason=`, `collateral=`, `tree_unchanged=`, `links_unchanged=`.
|
|
170
|
+
- `bug` 는 기준선이 지금 HEAD 와 지금 판정기의 것인지 본다. 아니면 거부하므로 기준선을 다시 돈다.
|
|
171
|
+
- `caught`: 기준선과 같은 사례를 모두 판정했고 ERROR 가 없으며, 기준선에 없던 그 종류의 FAIL 이 나옴.
|
|
172
|
+
- `missed`: 같은 조건에서 그 종류의 새 FAIL 이 없음.
|
|
173
|
+
- `undecidable`: 시간 초과(`timeout`), ERROR 가 있음(`oracle-error`), 판정한 사례가 기준선과 다름(`cases-differ`, 충돌로 중간에 끝남), 기준선에 그 종류의 PASS 가 없음(`baseline-no-pass`, 잡을 수 없음), 링크가 원래 트리를 가리킴(`link-to-main`). 잡음으로 세지 않는다. 버그를 고쳐 넣어 다시 돌리고 두 로그를 다 적는다.
|
|
174
|
+
- `collateral` 이 0 이 아니면(다른 종류에도 새 FAIL) 그 사실을 표에 적는다.
|
|
175
|
+
- `missed` 면 그 버그가 판정기의 입력에서 실제로 출력을 바꾸는지 확인한다(같은 패치를 새 작업 트리에 `git apply` 해 구현이나 어댑터를 돌린 로그). 출력이 같으면 `버그가 출력을 바꾸지 않음` 으로 적고 다른 자리에 넣어 다시 돈다. 출력이 바뀌는데 놓쳤으면 판정기의 빈틈이다.
|
|
176
|
+
- 판정기의 빈틈은 구현을 본 이 맥락이 고치지 않는다. 고치려면 새 방과 새 하위 에이전트에 요구 수준의 한 문장(넣은 버그나 구현 내용 없이)만 더해 다시 쓰게 하고, `collect --replace` 로 가져와 새 커밋으로 남긴다. 처음 결과 `missed` 는 지우지 않고, 고친 뒤 결과는 다른 열에 적는다. `verify.md` 에 처음 판정기 커밋과 바꾼 판정기 커밋, 각각이 구현보다 앞서는지를 따로 적는다.
|
|
177
|
+
- 출력 비교 같은 확인용 작업 트리는 `bug --name probe-<이름>` 으로 돌리거나 `worktree --remove` 로 지운다.
|
|
178
|
+
- `tree_unchanged=no` 나 `links_unchanged=no` 면 멈추고 사용자에게 알린다. 이 확인은 추적 파일의 내용, 추적되지 않는 파일, 링크한 폴더를 본다. 무시된 다른 파일과 DB 는 보지 못한다는 사실을 `verify.md` 에 적는다.
|
|
179
|
+
- 권한 규칙이 요구 문서와 담당자 사실에 없으면 permission 행은 `해당 없음(권한 규칙 없음)` 이다.
|
|
180
|
+
5. 표에는 버그마다 패치 경로, 결과 `` `bug.<이름>.result=...` `` 와 `reason`, 로그 경로를 적는다.
|
|
181
|
+
|
|
182
|
+
### 6. flow.md
|
|
183
|
+
|
|
184
|
+
- 순서는 화면, API, 최적화, DB, 내보내기다. 단계마다 처리하는 `파일:줄` 을 적는다.
|
|
185
|
+
- **서버**: 떠 있지 않으면 `serve` 로 띄운다. 시작 스크립트가 마이그레이션, 시드, 초기화를 함께 하면 그 사실을 보이고 허락을 받은 뒤에만 띄운다. 이미 떠 있던 서버는 내리지 않고, 띄운 서버는 끝에 `stop` 으로 내린다.
|
|
186
|
+
```bash
|
|
187
|
+
node "$E" serve --log 'docs/evidence/logs/flow-server-{ts}.log' --pid <임시폴더>/server.pid --ready http://{host}:{port}/ -- <시작 명령>
|
|
188
|
+
```
|
|
189
|
+
- **종단 시험**: 스크립트 `docs/evidence/scripts/e2e-flow.*` 가 다섯 단계를 실제 요청으로 지나며 단계마다 METRIC 줄을 찍는다(예: `flow.api.status=200`, `flow.api.ms=`, `flow.db.rows=`, `flow.export.bytes=`). `run --timeout 300` 으로 돌린다.
|
|
190
|
+
- 화면 단계: 이미 설치된 브라우저 도구가 있으면 실제로 누르고, 없으면 화면 URL 의 응답과 화면이 부르는 API 요청을 보낸다. 어느 쪽인지 적고, HTTP 로 대신했으면 `trace.md` 의 화면 요구는 `부분(화면 조작 미검증)` 이다.
|
|
191
|
+
- DB 확인은 읽기(SELECT)만 하고 로컬이나 일회용 DB 에서만 한다. 시험이 만든 행은 표식을 달고, 끝에 지우거나 남긴 사실을 적는다. 서버가 사용자 폴더에 파일 DB 를 새로 만들었으면 그 경로와 남긴 사실도 적는다.
|
|
192
|
+
- 로그에는 시험이 만든 행만 찍는다.
|
|
112
193
|
- 서버에 닿지 못하면 종단 시험 칸은 `미검증` 과 오류 문구다. 단위 시험으로 대신하지 않는다.
|
|
113
|
-
- 운영 서버나 남의 서버에는 보내지 않는다. 대상이 로컬이나 개발 서버가 아니면 사용자에게 먼저 확인한다.
|
|
114
194
|
|
|
115
|
-
###
|
|
195
|
+
### 7. scale.md
|
|
116
196
|
|
|
117
|
-
-
|
|
118
|
-
- 배수마다 최적화를 돌려
|
|
119
|
-
-
|
|
120
|
-
- 사례마다 구현의
|
|
121
|
-
-
|
|
122
|
-
- 차이도 스크립트가 계산해 로그에 찍는다.
|
|
123
|
-
- 표의 칸마다 로그 경로를 단다. 시간 제한에 걸린 배수는 `시간 초과(제한 N초)` 로 적는다.
|
|
197
|
+
- **배수 데이터**: `docs/evidence/scripts/gen-scale.*` 가 기준 데이터(README 의 예시나 시험 고정물)를 1배, 5배, 10배로 늘린다. 시드를 고정해 적는다. 기준 데이터가 작아 10배도 요구의 상한에 못 미치면 상한 근처 사례를 하나 더 만들고 그 사실을 적는다. 기준 데이터가 없으면 `미검증(기준 데이터 없음)`.
|
|
198
|
+
- **측정**: `docs/evidence/scripts/measure.*` 가 배수마다 최적화를 3회 돌려 각 시간과 중앙값, 목적값을 METRIC 줄로 찍는다(예: `scale.x5.median_s=`, `scale.x5.objective=`). 무엇을 쟀는지(함수 호출만, HTTP 포함) 적는다. 시간 제한은 실행 전에 정해 문서와 `run --timeout` 에 같게 준다. 걸리면 `시간 초과(제한 N초)` 다. 배수마다 판정기의 제약 판정을 돌려 `scale.x5.feasible=` 을 찍는다.
|
|
199
|
+
- **완전 탐색**: 작은 사례 다섯을 `docs/evidence/scripts/brute-force.*` 로 푼다. 목적값과 실행 가능성은 `tests/oracle/` 의 판정기가 내보낸 함수로 계산하고 구현 코드를 부르지 않는다. 판정기가 그런 함수를 내보내지 않으면 완전 탐색 스크립트가 요구 문서와 담당자 사실만으로 직접 계산하고, 그 사실을 적는다. 크기는 완전 탐색이 제한 안에 끝나는 가장 큰 쪽으로 한다.
|
|
200
|
+
- 사례마다 구현의 목적값, 정해, 차이를 스크립트가 찍는다. 차이(%)는 부호를 지킨다: `(구현 - 정해) / |정해| x 100`. 정해가 0 이면 두 값만 찍는다.
|
|
201
|
+
- 구현이 정해보다 좋으면(최대화에서 크거나 최소화에서 작으면) `gap.c<n>.flag=better-than-optimal` 을 찍고, 제약 위반이나 완전 탐색 오류로 보고 조사한다.
|
|
124
202
|
|
|
125
|
-
###
|
|
203
|
+
### 8. decisions.md
|
|
126
204
|
|
|
127
|
-
|
|
205
|
+
| 결정 | 고른 것 | 버린 것 | 이유 | 출처 | 확인하는 시험 | 결과 로그 |
|
|
206
|
+
|---|---|---|---|---|---|---|
|
|
128
207
|
|
|
129
|
-
|
|
130
|
-
|
|
208
|
+
- 출처는 코드, 커밋 메시지, README, ADR, 이 세션의 대화(날짜) 가운데 실제로 그렇게 말한 곳이다.
|
|
209
|
+
- 출처가 말하지 않는 "버린 것" 과 "이유" 는 `기록 없음` 이다. 지어내지 않는다.
|
|
210
|
+
- 확인하는 시험은 실제로 있는 시험 이름이다. 결과는 통과와 실패 그대로다. 없으면 `없음`.
|
|
131
211
|
|
|
132
|
-
|
|
133
|
-
- 확인하는 시험은 실제로 있는 시험의 이름이다. 이름마다 통과 로그 경로를 단다. 그 결정을 확인하는 시험이 없으면 `없음` 으로 적는다. 이름을 지어내지 않는다.
|
|
212
|
+
### 9. trace.md
|
|
134
213
|
|
|
135
|
-
|
|
214
|
+
| 번호 | 요구 | 출처 | 상태 | 시험 이름 | 로그 경로 |
|
|
215
|
+
|---|---|---|---|---|---|
|
|
136
216
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
-
|
|
143
|
-
- 상태는 셋 가운데 하나다.
|
|
144
|
-
- `완료`: 그 요구를 확인하는 시험이 있고 통과함
|
|
145
|
-
- `부분`: 일부만 구현했거나 시험이 일부만 확인함. 빠진 부분을 적음
|
|
217
|
+
- 요구 뽑기: 요구 문서의 요구 절의 목록 항목 전부와 "해야", "한다", "must", "should" 가 든 문장 전부다. 한 문장의 나열은 항목마다 한 행이다. 출처는 `README.md:<줄>` 이다. 요구 칸은 원문을 줄이지 않고 큰따옴표 안에 옮긴다(`|` 는 `\|`). 나열을 나눈 행은 원문 전체를 옮기고 그 행이 맡은 항목을 뒤에 적는다.
|
|
218
|
+
- 판정기 작성자의 `tests/oracle/REQUIREMENTS.md` 와 대조해 한쪽에만 있는 요구를 표 아래에 적는다.
|
|
219
|
+
- 담당자 사실은 요구 문서의 요구가 아니므로 행으로 넣지 않는다. 판정기가 담당자 사실을 판정한 결과는 `verify.md` 에 있다.
|
|
220
|
+
- 상태는 넷 가운데 하나다.
|
|
221
|
+
- `완료`: 그 요구를 확인하는 시험이 있고 통과함. 건너뜀이나 0개 실행은 통과가 아니다
|
|
222
|
+
- `부분`: 일부만 구현, 시험이 일부만 확인, 시험이 실패, 시험이 없음. 빠진 것을 적음
|
|
146
223
|
- `미구현`: 이유를 적음
|
|
147
|
-
-
|
|
148
|
-
-
|
|
224
|
+
- `미검증`: 시험을 돌릴 수 없었음(서버, 도구, 샌드박스). 까닭을 적음
|
|
225
|
+
- 개수는 손으로 세지 않는다: `node "$E" run --log 'docs/evidence/logs/trace-count-{ts}.log' -- node "$E" count --doc docs/evidence/trace.md`. 그 METRIC 값을 표 아래에 옮긴다. 종료 1(상태를 알 수 없는 행)이면 표를 고치고 다시 센다.
|
|
149
226
|
|
|
150
|
-
|
|
227
|
+
### 10. 수치 대조
|
|
151
228
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
- 로그에서 찾지 못한 수는 지우거나, 그 수를 찍는 명령을 다시 돌려 로그를 만든다.
|
|
156
|
-
- 대조 결과(확인한 수의 개수, 못 찾은 수)를 각 문서 끝의 `수치 대조` 줄에 적는다.
|
|
229
|
+
```bash
|
|
230
|
+
node "$E" run --log 'docs/evidence/logs/check-{ts}.log' -- node "$E" check
|
|
231
|
+
```
|
|
157
232
|
|
|
158
|
-
|
|
233
|
+
- `ERROR` 는 모두 고친다. 로그에 없는 수는 지우거나 그 수를 찍는 명령을 다시 돌린다.
|
|
234
|
+
- `WARN`(`이름=값` 밖의 숫자)도 0 이 될 때까지 고친다. 측정값이면 METRIC 으로 바꾼다. 측정값이 아니면 도우미가 빼는 꼴로 쓴다: 코드 펜스나 백틱 안, URL, `/`, `./`, `~/` 로 시작하는 경로와 확장자로 끝나는 경로, 확장자가 있는 `파일:줄`, 글자가 든 해시, 날짜, 판, `R1`, `c3` 같은 번호, 배수 데이터 이름(`5배 데이터`처럼 뒤에 데이터나 입력이 오거나 표 행의 첫 칸에 홀로 있을 때, 또는 `x5`), `10줄`, `3단계`, 끝에 점이 있는 절 번호(`## 5. `)와 목록 번호, 세 자리 이하의 표 행 번호. 큰따옴표 안의 인용은 `trace.md` 의 요구 칸에서만 빠진다. 제목 줄의 다른 수, `시간도 10배` 나 표의 `약 5배` 같은 비율, `120ms`, `p50/p95=120/340ms`, `1200req/s` 같은 수는 측정값이므로 METRIC 으로 바꾼다.
|
|
235
|
+
- 문서마다 마지막 줄은 `수치 대조: <check 로그 경로>` 한 줄이다(이 꼴의 줄만 대조에서 빠짐). `{ts}` 같은 이름 꼴이 아니라 실제 로그를 가리켜야 한다. 마지막 대조의 로그 이름을 먼저 정해(예: `docs/evidence/logs/check-final-20261105-0930.log`) 문서에 쓰고, 그 이름 그대로 `run --log` 로 check 를 돌린다. `run` 이 로그 머리를 먼저 쓰므로 check 가 그 로그를 찾는다. 그 대조가 실패하면 고친 뒤 새 이름으로 다시 한다.
|
|
159
236
|
|
|
160
|
-
|
|
161
|
-
- 증거를 만들다 구현을 고쳤다면 그 수정은 따로 커밋하고 사용자에게 알린다.
|
|
162
|
-
- 판정기 커밋은 2번의 4단계에서 이미 했다.
|
|
163
|
-
- 커밋 전에 비밀값을 찾는다. 걸린 값은 가린다. 커밋 메시지는 `docs(evidence): ...` 다.
|
|
164
|
-
- push 하지 않는다. 사용자가 요청할 때만 한다.
|
|
165
|
-
- `--no-commit` 이면 쓸 파일 목록만 보이고 커밋하지 않는다.
|
|
237
|
+
### 11. 커밋
|
|
166
238
|
|
|
167
|
-
|
|
239
|
+
```bash
|
|
240
|
+
node "$E" commit --message "docs(evidence): 증거 문서 여섯"
|
|
241
|
+
node "$E" check --tracked
|
|
242
|
+
```
|
|
168
243
|
|
|
169
|
-
-
|
|
170
|
-
-
|
|
171
|
-
|
|
172
|
-
|
|
244
|
+
- `ERROR 비밀값 꼴이 남음` 이면 값을 가린다. 비밀값이 아니라고 사용자가 확인한 자리만 `--accept <파일:줄>` 로 넘긴다.
|
|
245
|
+
- 커밋 훅이 막으면 우회하지 않고 알린다.
|
|
246
|
+
- 커밋 뒤 `check --tracked` 로 문서가 가리킨 로그가 모두 커밋에 들었는지 본다.
|
|
247
|
+
- push 하지 않는다. 사용자가 요청할 때만 한다.
|
|
173
248
|
|
|
174
249
|
## 보고
|
|
175
250
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
| 문서 | 상태 | 로그 수 | 미검증이나 미구현 |
|
|
251
|
+
| 문서 | 상태 | 미검증이나 미구현 | 핵심 결과 |
|
|
179
252
|
|---|---|---|---|
|
|
180
253
|
|
|
181
254
|
- 상태는 `작성`, `일부 미검증`, `작성 안 함(까닭)` 가운데 하나다.
|
|
182
|
-
-
|
|
255
|
+
- 핵심 결과에는 판정기 기준선의 실패 수, 버그 셋의 결과와 까닭, trace 의 상태별 개수, 수치 대조의 오류와 경고 수를 METRIC 값 그대로 적는다.
|
|
256
|
+
- `요구 미충족`(판정기가 구현 뒤에 쓰임), 찾은 결함, 띄운 서버를 내렸는지, 커밋 해시를 적는다. push 는 하지 않았다고 적는다.
|
|
257
|
+
- `요구 미충족` 이면 마지막 줄에 다음 행동을 적는다: 다음 프로젝트는 구현을 시작하기 전에 `/banker:make-evidence --oracle-only`(Codex 는 `$banker-make-evidence --oracle-only`, 플러그인 설치면 `$banker:make-evidence --oracle-only`)로 판정기를 먼저 커밋한다.
|
|
258
|
+
- `--oracle-only` 로 멈췄으면 마지막 줄에 다음 행동을 적는다: 구현을 마친 뒤 같은 스킬을 인자 없이 다시 부른다.
|