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
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

**PRD·저장 가능한 작업 계획·요구사항 검증·Git 작업을 위한 선택형 스킬 모음.**

![Version](https://img.shields.io/badge/version-0.5.5-6C5CE7?style=for-the-badge)
![Version](https://img.shields.io/badge/version-0.5.6-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,19 @@ release-readiness ──── 안전한 커밋·푸시·PR

---

## v0.5.6: 요구사항 원문 보존과 단일 문서 범위 수정

- 요구사항 importer가 `unit_price`, `ROUND_HALF_UP`, 곱셈 기호와 본문 내부 공백을 보존합니다. 서로 다른 본문을 같게 정규화해 이전 검증을 재사용하던 문제를 수정했습니다.
- 단일 화면 명세·개발 인계는 요청한 파일과 형식에 맞춰 작성합니다. WIGTN 묶음 검증기는 해당 묶음과 의존 산출물을 요청한 경우에만 사용합니다.
- 기존 Core 9개 스킬과 명시 호출형 `verified-delivery`는 유지합니다. Knowledge Wiki는 공동 버전 정책에 따른 manifest 변경만 포함합니다.
- 이전에 가져온 원문이 손상됐다면 소스를 다시 import하고 검증해야 합니다. 서식 보존으로 자동 생성 ID나 이전 검증의 재사용 여부가 달라질 수 있습니다.

[변경 내용과 검증 범위](docs/RELEASE-v0.5.6-KO.md) · [English release notes](docs/RELEASE-v0.5.6.md)

이번 패치는 정확성과 요청 범위를 수정합니다. 수정본의 GPT-6 성능 향상을 주장하지 않습니다.

---

## v0.5.5: WorkGraph 선택 조회와 실측 보고서

- `inspect --task TASK-ID`로 지정한 작업·선행 작업과 연결된 기록을 조회합니다. 전체 검증·소스 변경 감지·릴리스 게이트와 생략 개수는 유지합니다.
Expand Down
39 changes: 39 additions & 0 deletions docs/RELEASE-v0.5.6-KO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# v0.5.6 — 요구사항 원문 보존과 단일 문서 범위 수정

요구사항을 가져오는 과정에서 본문이 손상되던 문제와, 단일 화면 명세·개발 인계에
전체 묶음 검증을 적용하던 문제를 수정했습니다.

## 요구사항 원문 보존

기존 importer는 본문의 밑줄·별표·backtick을 제거하고 공백을 합쳤습니다.
예를 들어 `unit_price * quantity`가 `unitprice quantity`로 바뀔 수 있었습니다.
이 정규화를 이전 근거의 재사용 판단에도 적용해 서로 다른 요구사항을 같은 것으로
취급할 수 있었습니다.

이제 본문의 식별자·연산자·기호·내부 공백을 보존합니다. 목록·표 입력, 음수,
공백을 포함한 리터럴, 본문 변경 시 검증 무효화와 동일 본문의 검증 재사용에 대한
회귀 검사를 추가했습니다. 기존 형식별 import와 재개 검사는 유지합니다.

이미 저장된 원문이 손상됐다면 소스를 다시 import하고 검증해야 합니다.
저장된 WorkGraph를 자동으로 다시 쓰지는 않습니다. 원문 보존으로 명시 ID가 없는
형식의 자동 생성 ID가 바뀌거나, 서식 변경만으로도 이전 근거가 무효화될 수 있습니다.

## 요청한 문서만 작성·검토

screen-spec은 사용자가 요청한 산출물·경로·형식을 따릅니다. 기존 문서는 입력으로
참조하고 템플릿은 필요할 때 사용합니다. 단일 채팅 답변이나 사용자 지정 Markdown은
관련 요구사항을 직접 검토하며, 묶음 검증기를 통과시키려고 다른 문서를 추가하지 않습니다.

번호가 붙은 WIGTN 산출물 묶음과 의존 문서가 요청 범위에 있는 경우에는 기존
묶음 검증기를 사용합니다. 이 검증기의 구조 검사와 회귀 테스트는 유지합니다.

## 호환성과 검증 범위

- 기존 Core 9개 스킬과 명시 호출형 `verified-delivery`를 유지합니다.
실험 브랜치의 스킬 삭제는 포함하지 않습니다.
- Knowledge Wiki는 공동 버전 정책에 따라 manifest 버전만 올립니다.
- `bash scripts/validate.sh`의 저장소·플러그인·스킬·정적 회귀 검사가 통과했습니다.
기존 importer에서 버그를 재현했고 실제 WorkGraph CLI의 원문 보존도 확인했습니다.
릴리스 검사 로그는 [release-v0.5.6-validation.log](release-v0.5.6-validation.log)에 보존합니다.
- 수정본의 추가 모델 벤치마크는 수행하지 않았습니다. GPT-6 속도·토큰·코딩 품질
향상을 주장하는 릴리스가 아닙니다.
45 changes: 45 additions & 0 deletions docs/RELEASE-v0.5.6.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# v0.5.6 — Preserve requirement text and respect standalone document scope

This patch fixes requirement-text corruption during import and unnecessary
bundle validation for standalone screen specifications and developer handoffs.

## Requirement imports

The importer previously removed underscores, asterisks and backticks and
collapsed whitespace in requirement bodies. For example, `unit_price * quantity`
could become `unitprice quantity`, changing the meaning of the requirement.
The same normalization could treat different requirement bodies as identical
when deciding whether to retain earlier verification evidence.

Requirement bodies now preserve these characters and internal whitespace.
Regression checks cover list/table inputs, identifiers, operators, negative
values, literal spaces, unchanged evidence reuse and invalidation after a
meaningful text change. Existing format and resume checks remain in place.

Re-import affected source documents and rerun verification to repair previously
saved records. This update does not rewrite saved WorkGraphs automatically.
Preserving text can change generated IDs in formats without explicit IDs and
can conservatively invalidate evidence after formatting-only changes.

## Standalone screen specifications and handoffs

The screen-spec skill now follows the requested artifact, path and format.
Existing documents are inputs, and templates are optional references.
For standalone chat or custom Markdown output, the skill reviews the relevant
requirements directly instead of running the numbered WIGTN bundle validator.
That validator remains available when the numbered artifact set and its
companion files are in scope; its existing structural checks are unchanged.

## Compatibility and validation

- All nine Core skills remain available, including explicit-only
`verified-delivery`. Experimental skill removal is not part of this release.
- Knowledge Wiki receives only the matching manifest version under the
repository's shared-version policy.
- `bash scripts/validate.sh` passed repository, plugin, skill and deterministic
regression validation. A negative control reproduced the old importer defect,
and a WorkGraph CLI smoke check preserved literal requirement text. The
release log is stored as `release-v0.5.6-validation.log`.
- These are correctness and scope fixes. The patched release has not undergone
a new model benchmark, and no GPT-6 speed, token or coding-quality improvement
is claimed.
141 changes: 141 additions & 0 deletions docs/release-v0.5.6-validation.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
Repository contract: PASS
Plugin validation passed: /private/tmp/wigtn-release-v0.5.6-20260920/plugins/wigtn-plugins-with-codex
Plugin validation passed: /private/tmp/wigtn-release-v0.5.6-20260920/plugins/wigtn-knowledge-wiki
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Skill is valid!
Verified-delivery routing: PASS (10 contracts)
External paired results: PASS (8 confirmatory runs, 4 pairs, 2 exploratory replication runs)
FeatureBench selection: PASS (4 pilot, 8 frozen candidates)
featurebench-results: ok (4 pairs, 0 eligible positive, 0 replicated positive)
Knowledge wiki checks: PASS
run-evals.sh is the compatibility entrypoint for deterministic static contracts.
Use scripts/run-behavior-evals.sh --execute for model behavior smoke runs.
Lexical trigger fixture: PASS (49 cases; model routing not tested)
Plugin resource integrity: PASS (40 markdown files)
Visual contracts: PASS (diagram/html/presentation-routing)
Evidence contract: PASS (10 cases)
Evidence inspector: PASS (health/drift)
Project context: PASS (valid/invalid)
PRD contracts: PASS (4 cases)
Screen contract: PASS (selected/closure/multilingual-ia/bundle/anchor/requirement)
Release state: PASS (paths, bounded diffs, whitespace checks)
Requirement import: PASS (3 formats + literal preservation + resume/drift)
test_acceptance_section_preserves_underscore_ids (__main__.SymbolicIDs.test_acceptance_section_preserves_underscore_ids) ... ok
test_contracts_accept_same_symbolic_id (__main__.SymbolicIDs.test_contracts_accept_same_symbolic_id) ... ok
test_explicit_import_preserves_complete_ids (__main__.SymbolicIDs.test_explicit_import_preserves_complete_ids) ... ok
test_markdown_lists_and_checkboxes_remain_supported (__main__.SymbolicIDs.test_markdown_lists_and_checkboxes_remain_supported) ... ok
test_prose_and_incomplete_ids_are_not_requirements (__main__.SymbolicIDs.test_prose_and_incomplete_ids_are_not_requirements) ... ok
test_workgraph_import_plan_and_source_drift (__main__.SymbolicIDs.test_workgraph_import_plan_and_source_drift) ... ok

----------------------------------------------------------------------
Ran 6 tests in 0.454s

OK
WorkGraph contract: PASS (67 deterministic cases)
Evaluation schedule: PASS (deterministic/block-balanced/paired)
Ablation builder: PASS (core4/placebo4/full8/full9)
Ordinary corpus: PASS (12 tasks, 3 languages, fault/reference)
Ordinary scorer: PASS (positive + hidden-regression rejection)
Explicit pricing: PASS (unpriced/partial/explicit/nonfinite)
Codex usage: PASS (JSONL fields + API-equivalent cost)
test_absent_optional_is_unknown (__main__.UsageMissing.test_absent_optional_is_unknown) ... ok
test_cli_has_no_assumed_prices (__main__.UsageMissing.test_cli_has_no_assumed_prices) ... ok
test_explicit_zero_is_known (__main__.UsageMissing.test_explicit_zero_is_known) ... ok
test_impossible_breakdown_rejected (__main__.UsageMissing.test_impossible_breakdown_rejected) ... ok
test_invalid_optional_counters_rejected (__main__.UsageMissing.test_invalid_optional_counters_rejected) ... ok
test_invalid_required_counters_rejected (__main__.UsageMissing.test_invalid_required_counters_rejected) ... ok
test_missing_cache_prevents_cache_adjusted_price (__main__.UsageMissing.test_missing_cache_prevents_cache_adjusted_price) ... ok
test_missing_one_turn_propagates (__main__.UsageMissing.test_missing_one_turn_propagates) ... ok
test_summary_preserves_unknown_without_crashing (__main__.UsageMissing.test_summary_preserves_unknown_without_crashing) ... ok

----------------------------------------------------------------------
Ran 9 tests in 0.080s

OK
Token ablation scorer: PASS (positive + canonical regression)
Eval packet: PASS (sanitize/hash/tamper)
Research harness: PASS (8 acceptance, 4 implement, 10 release, 12 WorkGraph + resume, 12 ordinary)
test_activation_needs_real_trace_reference (__main__.EvidenceTests.test_activation_needs_real_trace_reference) ... ok
test_adjudicated_packet_passes (__main__.EvidenceTests.test_adjudicated_packet_passes) ... ok
test_changed_events_rejected (__main__.EvidenceTests.test_changed_events_rejected) ... ok
test_changed_implementation_is_rejected (__main__.EvidenceTests.test_changed_implementation_is_rejected) ... ok
test_early_stop_retains_observed_consumption (__main__.EvidenceTests.test_early_stop_retains_observed_consumption) ... ok
test_empty_schedule_rejected (__main__.EvidenceTests.test_empty_schedule_rejected) ... ok
test_extra_work_file_rejected (__main__.EvidenceTests.test_extra_work_file_rejected) ... ok
test_failed_turn_consumption_is_retained (__main__.EvidenceTests.test_failed_turn_consumption_is_retained) ... ok
test_failure_cost_retained (__main__.EvidenceTests.test_failure_cost_retained) ... ok
test_input_snapshot_mutation_rejected (__main__.EvidenceTests.test_input_snapshot_mutation_rejected) ... ok
test_invalid_turn_telemetry_is_not_complete (__main__.EvidenceTests.test_invalid_turn_telemetry_is_not_complete) ... ok
test_missing_seal_rejected (__main__.EvidenceTests.test_missing_seal_rejected) ... ok
test_missing_usage_leaves_incomplete_total (__main__.EvidenceTests.test_missing_usage_leaves_incomplete_total) ... ok
test_new_contract_cases_and_complete_criteria (__main__.EvidenceTests.test_new_contract_cases_and_complete_criteria) ... ok
test_offline_runner_to_scorer_integration (__main__.EvidenceTests.test_offline_runner_to_scorer_integration) ... ok
test_oracle_catches_vacuous_test_and_passes_fix (__main__.EvidenceTests.test_oracle_catches_vacuous_test_and_passes_fix) ... ok
test_review_pending_is_not_pass (__main__.EvidenceTests.test_review_pending_is_not_pass) ... ok
test_skill_name_without_body_is_not_activation (__main__.EvidenceTests.test_skill_name_without_body_is_not_activation) ... ok
test_stale_review_rejected (__main__.EvidenceTests.test_stale_review_rejected) ... ok
test_symlinked_evidence_rejected (__main__.EvidenceTests.test_symlinked_evidence_rejected) ... ok
test_unknown_reasoning_is_null (__main__.EvidenceTests.test_unknown_reasoning_is_null) ... ok

----------------------------------------------------------------------
Ran 21 tests in 1.845s

OK
test_corrupt_evidence_withholds_eligible_tasks (__main__.Inspect.test_corrupt_evidence_withholds_eligible_tasks) ... ok
test_drift_propagates_to_dependent_tasks_without_mutation (__main__.Inspect.test_drift_propagates_to_dependent_tasks_without_mutation) ... ok
test_fresh_readonly_and_no_saved_command_execution (__main__.Inspect.test_fresh_readonly_and_no_saved_command_execution) ... ok
test_invalid_global_evidence_still_blocks_selection (__main__.Inspect.test_invalid_global_evidence_still_blocks_selection) ... ok
test_invalid_graph_fails_closed (__main__.Inspect.test_invalid_graph_fails_closed) ... ok
test_invalid_project_withholds_eligible_tasks (__main__.Inspect.test_invalid_project_withholds_eligible_tasks) ... ok
test_missing_source_has_explicit_drift (__main__.Inspect.test_missing_source_has_explicit_drift) ... ok
test_repeated_selection_deduplicates (__main__.Inspect.test_repeated_selection_deduplicates) ... ok
test_selected_drift_is_visible_and_saved_revision_is_not_preview (__main__.Inspect.test_selected_drift_is_visible_and_saved_revision_is_not_preview) ... ok
test_selection_omits_dependents_but_keeps_global_summary_and_gates (__main__.Inspect.test_selection_omits_dependents_but_keeps_global_summary_and_gates) ... ok
test_selection_preserves_dependency_records_and_linked_context (__main__.Inspect.test_selection_preserves_dependency_records_and_linked_context) ... ok
test_transitive_dependencies_and_shared_checks (__main__.Inspect.test_transitive_dependencies_and_shared_checks) ... ok
test_unknown_selection_fails (__main__.Inspect.test_unknown_selection_fails) ... ok
test_unrelated_source_drift_is_not_hidden (__main__.Inspect.test_unrelated_source_drift_is_not_hidden) ... ok

----------------------------------------------------------------------
Ran 14 tests in 2.059s

OK
test_absolute_inside_allowed_outside_rejected_without_mutation (__main__.ImportRoot.test_absolute_inside_allowed_outside_rejected_without_mutation) ... ok
test_relative_source_uses_root_and_preserves_dry_run (__main__.ImportRoot.test_relative_source_uses_root_and_preserves_dry_run) ... ok
test_symlink_escape_rejected_without_mutation (__main__.ImportRoot.test_symlink_escape_rejected_without_mutation) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.517s

OK
test_dry_run_does_not_create_lock_or_change_state (__main__.Concurrency.test_dry_run_does_not_create_lock_or_change_state) ... ok
test_killed_writer_releases_lock (__main__.Concurrency.test_killed_writer_releases_lock) ... ok
test_no_revision_second_writer_merges_latest (__main__.Concurrency.test_no_revision_second_writer_merges_latest) ... ok
test_same_revision_second_writer_rejected (__main__.Concurrency.test_same_revision_second_writer_rejected) ... ok

----------------------------------------------------------------------
Ran 4 tests in 2.066s

OK
test_invalid_context_preserves_graph_for_preview_and_apply (__main__.ProjectGuard.test_invalid_context_preserves_graph_for_preview_and_apply) ... ok

----------------------------------------------------------------------
Ran 1 test in 1.752s

OK
Static contracts: PASS
Static validation: PASS

Additional release checks:
PASS: new literal regression rejected the released importer and passed with the patch.
CLI smoke setup initially omitted the required init; corrected to init -> import without product changes.
PASS: WorkGraph CLI init -> import preserves identifiers and operator end to end
PASS: only intended patch paths changed; nine skills retained; verified-delivery unchanged; manifest changes version-only
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.5",
"version": "0.5.6",
"description": "Opt-in, gated Codex session knowledge capture for an explicitly authorized personal wiki namespace.",
"author": {
"name": "WIGTN"
Expand Down
2 changes: 1 addition & 1 deletion plugins/wigtn-plugins-with-codex/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wigtn-plugins-with-codex",
"version": "0.5.5",
"version": "0.5.6",
"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 @@ -44,8 +44,10 @@ def detect_format(path: Path, text: str) -> str:


def clean_text(value: str) -> str:
value = re.sub(r"[*_`]+", "", value)
return re.sub(r"\s+", " ", value).strip(" |:-")
# Markdown markers can also be identifier characters, operators or literal
# data. Preserve requirement content; structural prefixes are parsed by the
# caller. Formatting changes may conservatively invalidate old evidence.
return value.strip()


def derived_id(prefix: str, source: str, used: set[str]) -> str:
Expand Down
Loading
Loading