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
35 changes: 31 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

# WIGTN Plugin for Codex

**Codex의 자율성은 그대로. PRD·작업 계획·검증·Git 권한은 필요한 순간에만.**
**PRD·저장 가능한 작업 계획·요구사항 검증·Git 작업을 위한 선택형 스킬 모음.**

![Version](https://img.shields.io/badge/version-0.5.3-6C5CE7?style=for-the-badge)
![Version](https://img.shields.io/badge/version-0.5.4-6C5CE7?style=for-the-badge)
![Skills](https://img.shields.io/badge/core_skills-9-00B894?style=for-the-badge)
![Platform](https://img.shields.io/badge/platform-Codex-111827?style=for-the-badge)
![License](https://img.shields.io/badge/license-Apache--2.0-0984E3?style=for-the-badge)
Expand Down Expand Up @@ -120,6 +120,18 @@ release-readiness ──── 안전한 커밋·푸시·PR

---

## v0.5.4: Astra 지침 정리·검증 정확성·WorkGraph 복구

- 요청 범위에 맞게 스킬·참조 문서를 정리하고, 명시 호출형 Verified Delivery와 일반 코딩의 경계를 유지했습니다.
- 요구사항 ID·Markdown 목록 처리, 실제 제약 위반 판정, 저장 증거와 보고서 충돌 처리를 개선했습니다.
- WorkGraph inspect와 import 경로 처리를 개선하고, 동시 CLI 저장의 변경 유실과 잘못된 프로젝트 설정의 계획 저장을 수정했습니다.
- CLI usage의 미보고 항목을 0으로 채우지 않고, 측정 가능한 항목과 비용 추정의 한계를 구분합니다.
- 추가 축약 실험본은 채택하지 않았습니다. Knowledge Wiki는 공동 버전 정책에 따른 manifest 변경이며 기능은 그대로입니다.

[변경 내용과 검증 범위](docs/RELEASE-v0.5.4-KO.md). 모델 비교 결과와 최종 runtime의 로컬 검증을 구분하며 일반 성능·비용 우위를 주장하지 않습니다.

---

## v0.5.3: 하네스 경량화·스택 중립화

- 항상 노출되는 Core 스킬 설명 합계를 2,980자에서 2,162자로 줄여
Expand Down Expand Up @@ -230,12 +242,15 @@ python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json init
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json init --apply
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json import docs/PRD.md --apply
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json plan --apply
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json inspect
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json status
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json next
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json diff --check
python3 plugins/wigtn-plugins-with-codex/scripts/wigtn.py --json doctor
```

`inspect`는 저장 파일을 검증하고 source drift와 다음 작업을 읽기 전용으로 조회합니다. 저장된 검사 명령을 실행하거나 변경을 적용하지 않습니다. `import`의 상대경로는 `--root` 기준입니다.

mutation 명령은 `--apply`가 없으면 dry-run이며, 동일한 import·plan·drift
적용은 revision을 올리지 않습니다. 자세한 상태 의미는
[WorkGraph lifecycle](docs/WORKGRAPH-LIFECYCLE.md)을 참고하세요.
Expand Down Expand Up @@ -345,8 +360,10 @@ Claude 전용 도구 이름, 고정 서브에이전트 fan-out, 자동 모델
```

이 suite에는 plugin resource 무결성, 다이어그램·HTML 발표 계약,
responsive wireframe portability, WorkGraph lifecycle·drift·migration·CLI의
67개 결정론적 케이스와 paired schedule 무결성 검사도 포함됩니다.
한국어/영어 화면 제목과 artifact 선택 형식을 포함한 screen contract,
untracked 내용을 읽지 않는 bounded release diff, WorkGraph
lifecycle·drift·migration·CLI의 67개 결정론적 케이스와 paired schedule
무결성 검사도 포함됩니다.

신규 `work-planner`의 모델 기반 capability pilot은 12개 격리 저장소에서
별도로 실행합니다.
Expand Down Expand Up @@ -382,6 +399,16 @@ effect는 [일반 코딩 비간섭 보고서](docs/ORDINARY-NONINTERFERENCE-GATE
./scripts/run-behavior-evals.sh --execute
```

커밋된 `HEAD`와 현재 worktree의 Compact PRD·근거 부족 acceptance 경로를
3회씩 비교하려면 focused ablation을 실행합니다. JSONL에서 input, cached
input, cache-write, output, reasoning, tool-item을 분리하며 비용은 실제
구독 청구가 아닌 API 환산 비교치입니다.

```bash
WIGTN_TOKEN_ABLATION_ROOT=/tmp/fresh-token-ablation \
./scripts/run-token-ablation.sh --execute
```

Core 4의 내용 효과와 catalog 길이 효과를 분리하는 package ablation은:

```bash
Expand Down
48 changes: 46 additions & 2 deletions docs/EVALS.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ like proof of model quality.
- optional project context rejects unsafe paths and unknown configuration
- screen bundles reject missing artifacts, unresolved template values, broken
wireframe anchors, remote resources, missing viewport metadata, and
cross-artifact requirement drift
cross-artifact requirement drift; validation accepts comma/space artifact
selections and English or Korean screen headings
- release-state inspection distinguishes staged, unstaged, untracked,
conflicted, detached, and in-progress Git states without mutation
conflicted, detached, and in-progress Git states without mutation; optional
bounded patches include whitespace checks but never untracked contents
- sanitized eval packets redact run roots and secrets, hash membership, exclude
auth/work homes, and detect tampering
- WorkGraph schema, ID/reference integrity, dependency cycles, false
Expand Down Expand Up @@ -94,6 +96,37 @@ and a results file outside the repository by default. Its four prompts cover
PRD creation, uncertain acceptance evidence, IA-only scope, and an ordinary
coding request. This is deliberately not full skill-router coverage.

Runs use Codex JSONL events to report input, cached input, cache-write input,
output, reasoning output, and tool-item counts in `TOKEN-EFFICIENCY.md` and
`TOKEN-EFFICIENCY.json`. API-equivalent cost uses explicit, overridable rate
variables and is only a normalized comparison metric; it is not a ChatGPT
subscription charge. The report includes observed cache pricing and a cold
comparison that prices all input as uncached, so arm order and cache hits are
visible rather than silently deciding the conclusion. Keep quality gates
separate from this cost report.

For a focused before/after check, compare the committed `HEAD` plugin with the
current worktree candidate. The default is three repetitions over Compact PRD
and evidence-poor acceptance prompts, for 12 model calls:

```bash
./scripts/run-token-ablation.sh
WIGTN_TOKEN_ABLATION_ROOT=/tmp/fresh-token-ablation \
./scripts/run-token-ablation.sh --execute
```

The scorer requires preserved Compact PRD shape, exact `not-verifiable`, zero
tools where the prompt prohibits commands, and lower candidate PRD median tool
items and input tokens. This is a targeted development ablation, not a general
plugin-efficiency claim.

For new token work, inspect command-execution traces before editing prose.
Prefer one bounded deterministic collector when the model repeatedly fetches
related state, while keeping judgment in the model. If a path already uses no
tools or combines its reads in one call, do not claim that shortening files
alone improves token efficiency; measure a quality-preserving alternative
first.

The smoke scorer checks execution health only. It deliberately does not turn
output keywords into a quality score. Publication claims require frozen
task-specific scorers, repeated runs, and human review.
Expand Down Expand Up @@ -242,3 +275,14 @@ The current release policy is:
- keep product/screen contracts and validators,
- use the optional Evidence Contract for explicit cross-workflow handoffs,
- block release on any unauthorized Git mutation.

## GPT-6 Astra migration pilot

Use `scripts/run-model-migration-eval.py --baseline SNAPSHOT --root FRESH_PATH` to inspect the 24-call plan; add `--execute` only with authorization for model execution and plugin-file transfer. This snapshots the pre-change dirty worktree instead of comparing against HEAD. Run `scripts/score-model-migration-eval.py RUN_ROOT` afterward. Completeness is separate from semantic quality review. The default is Astra/medium; no dollar costs are estimated. See [the release verification scope](RELEASE-v0.5.4-KO.md). The legacy token ablation runner remains Sol-only because its rates are pinned.

The second-pass evaluator adds `--suite targeted` (30 calls at two repetitions) for explicit verified-delivery activation. It uses a fixed implementation oracle, records unexpected worktree changes, rejects empty schedules and failed/duplicate turns, and leaves unknown telemetry as null. This remains a development pilot; consult the report for untested authority and long-running scenarios. No additional external execution is authorized by choosing a suite.


## Schema v2 evidence and adjudication

The current migration evaluator verifies sealed inputs and per-run evidence, retains measured consumption from failed attempts, and separates schedule, integrity, execution, review and task pass states. Use `--review-template` to export review forms and `--reviews FILE --require-pass` for the final gate. The new `--suite contracts` adds direct Compact/external-PRD/six-conflict cases (30 calls at repeat=2). See [the release verification scope](RELEASE-v0.5.4-KO.md). Old unsealed packets remain historical data, not v2-qualified results.
33 changes: 33 additions & 0 deletions docs/RELEASE-v0.5.4-KO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# v0.5.4 변경 내용과 검증 범위

GPT-6 Astra에 맞춰 선택형 지침을 정리하고, 요구사항 판정과 WorkGraph 저장의 실패 경계를 수정했다. Core와 Knowledge Wiki manifest를 공동 버전 정책에 따라 0.5.4로 맞췄다. Wiki 기능 변경은 없다.

## 사용자에게 달라지는 동작

- 일반 코딩에 Verified Delivery를 자동 적용하지 않는다. 요청한 작업에 비례하는 검증을 유지하며 불필요한 고정 절차와 중복 참조를 줄였다.
- Compact PRD와 외부 PRD는 해당 문서의 계약으로 검토한다. 중대한 결함을 고정된 개수 제한 때문에 누락하지 않는다.
- acceptance 판정에서 실제 제약 위반과 검증 불가능을 구분하고, 저장된 증거와 보고서가 충돌하면 그 차이를 보존한다.
- 숫자형 요구사항 ID와 함께 `REQ-A` 같은 대문자 기호형 ID를 import·WorkGraph·evidence에서 일관되게 처리한다. Markdown 목록의 ID와 문장 속 참조를 구분한다.
- 화면 검증은 한국어 `화면:` 제목과 쉼표 또는 공백으로 구분한 artifact 선택을 받는다.
- `wigtn.py inspect`는 저장 상태를 검증하고 source drift와 다음 작업을 읽기 전용으로 보여준다. 저장된 명령은 실행하지 않는다. import의 상대경로는 `--root` 기준으로 해석한다.
- 동시 CLI 저장은 read→revision 검사→save 전체를 OS advisory lock으로 보호한다. 최신 상태를 읽어 두 변경을 보존하거나, 명시한 revision이 오래되면 충돌로 거부한다.
- 잘못된 프로젝트 설정은 plan 저장 전에 거부한다. 오류 응답은 exit 2이며 기존 그래프 내용은 보존한다.
- release-state의 선택적 diff 조회는 크기를 제한하고 잘림 여부를 표시한다. untracked 파일의 내용은 읽지 않는다.

## 검증

필수 검증 명령은 `bash scripts/validate.sh`다. 모델 서비스를 호출하지 않는 저장소 계약·회귀 검사이며 CI에서도 실행한다.

추가 검사는 기호형 ID, 화면 계약, bounded release diff, usage 누락, 평가 증거 무결성, WorkGraph inspect와 import 경로를 포함한다. 동시성 검사 네 개는 실제 CLI 프로세스를 사용해 변경 보존, 오래된 revision 거부, dry-run 무변경, 종료된 writer의 잠금 해제를 확인한다. 프로젝트 설정 검사는 잘못된 설정 네 종류를 preview/apply 각각에 적용한다.

실험 실행기와 채점기를 포함하되 모델 호출은 명시 실행 시에만 수행한다. 기록되지 않은 usage는 0으로 추정하지 않는다. API 환산값과 실제 구독 청구액은 서로 다른 값이다.

## 실측 해석과 남은 경계

개발 과정에서는 GPT-6 Astra/medium, Codex CLI 0.153.4에서 기본 Codex·선택형 C8·추가 축약 조건을 비교했다. 42개 작업 단위에 인계·재개 단계를 포함한 CLI 호출은 48회였다. 최종 C9 runtime 자체를 별도 모델 비교 조건으로 실행하지는 않았다.

추가 축약 조건은 채택하지 않았다. 작업은 개발자가 구성한 작은 표본이며, 사후 채점 정정과 미완료 실행을 포함한다. 이 PR은 일반 코딩 우위, 보편적 비용 절감률, 최종 0.5.4의 독립적인 모델 성능 개선을 주장하지 않는다.

잠금은 협력하는 CLI writer 사이에서 작동한다. 직접 JSON을 편집하는 프로그램은 참여하지 않으며 Windows 잠금 경로는 실측하지 않았다. inspect의 구조 검증은 실제 코드 실행이나 요구사항 충족의 증명이 아니다.

상세 기술보고서 초안과 원시 세션 자료는 로컬 연구 자료로 별도 보존한다. 이 PR에는 공개용 정리가 끝나지 않은 원시 로그·실험 작업 폴더를 포함하지 않는다. 본 문서는 그 자료를 독립 재현할 수 있는 공개 증거 묶음이 아니다.
2 changes: 1 addition & 1 deletion plugins/wigtn-knowledge-wiki/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wigtn-knowledge-wiki",
"version": "0.5.3",
"version": "0.5.4",
"description": "Opt-in, gated Codex session knowledge capture for an explicitly authorized personal wiki namespace.",
"author": {
"name": "WIGTN"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wigtn-plugins-with-codex",
"version": "0.5.3",
"version": "0.5.4",
"description": "Selective product contracts for Codex: compact PRDs, saved WorkGraphs, scoped screen artifacts, acceptance evidence, explicit verified delivery, and safe release actions.",
"author": {
"name": "WIGTN"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,20 @@ python3 <plugin-root>/scripts/validate-evidence.py <artifact.json>
- `verified`: precise implementation evidence and a referenced passing check
- `implemented-not-executed`: implementation evidence exists; no relevant
passing check was executed
- `partially-verified`: only part of the observable requirement is supported
- `not-satisfied`: evidence shows the requirement is absent or contradicted
- `partially-verified`: part is supported, the rest is unresolved, and no required
behavior is demonstrated false
- `not-satisfied`: evidence shows required behavior is absent or contradicted;
this takes precedence over passing other examples
- `not-verifiable`: available evidence cannot support a conclusion
- `not-applicable`: the requirement does not apply to this scope

Never mark a requirement `verified` from documentation, model narration, an
unexecuted test, a check that is not referenced by ID, or a green-only check
written by the same agent during the implementation. An agent-authored check
can support `verified` only when the artifact or accompanying trace records its
pre-change failure and post-change pass. Until check provenance is represented
in the machine-readable schema, record that distinction in `limitations` and
use `partially-verified` when independent evidence is absent.
Never mark a requirement `verified` from documentation, narration, an
unexecuted or unrelated test, or a check that is not referenced by ID.
Judge executed checks by their coverage of the current requirement. Record
whether they were pre-existing, supplied externally, or authored for this work;
after-change-only checks are not red/green evidence. Their authorship alone
neither proves coverage nor requires a downgrade. Use `partially-verified` for
an actual unresolved subclaim, and `not-satisfied` for a demonstrated violation.

## Portability and authority

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Z][A-Z0-9_-]*-[0-9]{2,}$"
"pattern": "^[A-Z][A-Z0-9_]*(?:-[A-Z0-9_]+)+$"
},
"text": {
"type": "string",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Z][A-Z0-9_-]*-[0-9]{2,}$"
"pattern": "^[A-Z][A-Z0-9_]*(?:-[A-Z0-9_]+)+$"
},
"source_id": {
"type": "string",
Expand Down
25 changes: 16 additions & 9 deletions plugins/wigtn-plugins-with-codex/scripts/import-requirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@


FORMATS = {"auto", "wigtn", "spec-kit", "openspec", "bmad", "generic"}
STABLE_ID = re.compile(r"^[A-Z][A-Z0-9_-]*-[0-9]{2,}$", re.I)
# Symbolic IDs are uppercase labels; legacy numeric IDs remain case-insensitive.
# Anchor labels to the start and require a text separator to avoid extracting
# references inside prose or splitting an ID into an ID plus requirement text.
ID_TOKEN = r"(?:[A-Z][A-Z0-9_]*(?:-[A-Z0-9_]+)+|(?i:[A-Z][A-Z0-9_]*(?:-[A-Z0-9_]+)*-[0-9]{2,}))"
STABLE_ID = re.compile(rf"^{ID_TOKEN}$")
INLINE_ID = re.compile(
r"(?:\*\*|`)?(?P<id>[A-Z][A-Z0-9_-]*-[0-9]{2,})(?:\*\*|`)?"
r"\s*(?::|[-–—])?\s*(?P<text>.+)",
re.I,
rf"^(?:\*\*|`)?(?P<id>{ID_TOKEN})(?:\*\*|`)?"
r"(?:\s*[:–—]\s*|\s+-\s+|\s+)(?P<text>\S.*)$"
)


Expand Down Expand Up @@ -59,11 +62,15 @@ def explicit_requirements(text: str) -> list[tuple[str, str]]:
for line in text.splitlines():
stripped = line.strip()
if stripped.startswith("|"):
cells = [clean_text(cell) for cell in stripped.strip("|").split("|")]
if len(cells) >= 2 and STABLE_ID.fullmatch(cells[0]):
results.append((cells[0].upper(), cells[1]))
cells = [cell.strip() for cell in stripped.strip("|").split("|")]
label = re.sub(r"^(\*\*|__|\*|_|`)(.+)\1$", r"\2", cells[0])
if len(cells) >= 2 and STABLE_ID.fullmatch(label):
results.append((label.upper(), clean_text(cells[1])))
continue
match = INLINE_ID.search(stripped.lstrip("#-+ 0123456789."))
# Remove Markdown structure, not arbitrary prose before a requirement.
label_line = re.sub(r"^(?:#{1,6}\s+|(?:[-*+]|\d+[.)])\s+)", "", stripped)
label_line = re.sub(r"^\[[ xX]\]\s+", "", label_line)
match = INLINE_ID.search(label_line)
if match:
results.append(
(match.group("id").upper(), clean_text(match.group("text")))
Expand Down Expand Up @@ -131,7 +138,7 @@ def derived_acceptance(
requirement = clean_text(match.group(1))
if not requirement or set(requirement) <= {"-", ":"}:
continue
explicit = INLINE_ID.search(requirement)
explicit = INLINE_ID.search(match.group(1).strip())
if explicit:
requirement_id = explicit.group("id").upper()
requirement = clean_text(explicit.group("text"))
Expand Down
Loading
Loading