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
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ If `plan.md` has a `Target Stage`, plain `hyper run` keeps moving packet by pack

The goal is simple: start from a tiny MVP and keep upgrading it until it can behave like a real service, without every AI session losing the project thread.

Current release: `v0.6.9`. It can continue packet by packet toward a target stage, stop and write review notes when evidence is weak, require approval before changing stages, compare Service Quality work against category references, verify release downloads, and recover stale stage state with `hyper migrate`.
Current release: `v0.6.10`. It can continue packet by packet toward a target stage, stop and write review notes when evidence is weak, record command execution through Verified Evidence, require approval before changing stages, compare Service Quality work against category references, verify release downloads, and recover stale stage state with `hyper migrate`.

## First Run

Expand All @@ -47,6 +47,14 @@ What happens:
5. The agent runs the finish gate internally to check the packet.
6. `.hyper/next-packet.md` tells Codex whether to continue, fix the same packet, advance stage, or stop.

When a repeatable command proves the packet, the agent should prefer:

```bash
hyper verify --axis validation_coverage --name "go tests" -- go test ./...
```

This records exit code, stdout/stderr hashes, commit SHA, worktree status hash, run ID, and goal ID under `.hyper/verified-evidence/`. `evidence.md` should cite the Verified Evidence ID and explain what decision it supports.

## Why It Helps

Long AI coding sessions often drift:
Expand Down Expand Up @@ -74,6 +82,8 @@ What stays in your repo:
| `hyper run` | Creates the next focused packet from the plan and prior evidence. |
| `goal.md` / `tasks.md` | What the AI should do now. |
| `evidence.md` | What changed and how it was checked. |
| `hyper verify -- <command>` | Runs a validation command and records machine-readable proof. |
| `.hyper/verified-evidence/` | Verified command records, stdout/stderr logs, hashes, commit SHA, and goal/run metadata. |
| `review.md` | What must be fixed if the packet is not good enough yet. |
| `next.md` | One next step and reusable lessons. |
| Agent finish gate (`hyper complete`) | Agent/runtime check that closes the packet and prepares the next action. |
Expand Down Expand Up @@ -102,6 +112,7 @@ You do not need these terms to start, but they explain what Hyper Run is doing:
| --- | --- |
| Runtime packet | The next AI work bundle. |
| Evidence | Proof that the work was done and checked. |
| Verified Evidence | Machine-recorded command proof from `hyper verify`, including exit code, log hashes, commit SHA, and goal/run metadata. |
| Proof Contract | The packet's proof checklist. |
| Learn | Extracting reusable lessons from `evidence.md` and `next.md`. Not a summary. |
| Pressure Ledger | A list of repeated needs, gaps, or failures the project keeps showing. |
Expand Down Expand Up @@ -138,6 +149,8 @@ For Service Quality benchmark examples, see [Reference Benchmark Evidence Exampl
- While an explicit override is active, `hyper status` shows both the active override target and the `plan.md` target when they differ.
- If you change or remove `Target Stage`, the next status/run/migrate cycle follows the updated plan target.
- The agent finish gate runs before learning from the packet. If evidence is weak, it writes `review.md` findings and keeps the agent in the same packet. The underlying recovery command is `hyper complete`.
- `hyper verify` can run repeatable command checks directly and store machine-readable Verified Evidence. Finish gates and readiness can use those records instead of relying only on Markdown claims.
- `hyper status` and `hyper doctor` summarize the current packet's Verified Evidence records, including counts, newest record ID, command, status, and failed exit code when one exists.
- If the same finish-gate findings repeat, Hyper Run records the repeat count and warns the agent to stop the auto loop unless the next fix directly addresses those findings.
- `hyper run --auto --until <stage>` still works as an explicit override. It still requires ready proof before stage advancement.
- `hyper advance` applies a stage change only after `hyper status` says the gate is ready. In an active auto target, `.hyper/next-packet.md` can carry that advancement after the Stage Advancement Review; outside auto mode, user acceptance is still required.
Expand All @@ -156,6 +169,7 @@ hyper init

hyper run
# agent implements the generated packet
# agent records repeatable command proof with hyper verify when available
# agent updates evidence.md/next.md and runs the finish gate internally

hyper status --short
Expand Down
16 changes: 15 additions & 1 deletion README_ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ hyper run

목표는 단순합니다. 작은 MVP에서 시작해, AI 세션이 바뀌어도 문맥을 잃지 않고 실제 서비스처럼 다룰 수 있는 수준까지 계속 개선하는 것입니다.

현재 릴리즈는 `v0.6.9`입니다. 목표 stage까지 packet 단위로 이어가고, evidence가 약하면 멈춰서 review를 남기며, stage 변경은 사용자가 승인할 때만 적용합니다. Service Quality에서는 비슷한 reference와 비교할 수 있고, 설치/업데이트를 검증하며, 오래된 stage 상태는 `hyper migrate`로 복구합니다.
현재 릴리즈는 `v0.6.10`입니다. 목표 stage까지 packet 단위로 이어가고, evidence가 약하면 멈춰서 review를 남기며, 명령 실행은 Verified Evidence로 기록할 수 있고, stage 변경은 사용자가 승인할 때만 적용합니다. Service Quality에서는 비슷한 reference와 비교할 수 있고, 설치/업데이트를 검증하며, 오래된 stage 상태는 `hyper migrate`로 복구합니다.

## 첫 실행

Expand All @@ -47,6 +47,14 @@ $hyper run
5. agent가 finish gate를 내부적으로 실행해 packet을 확인합니다.
6. `.hyper/next-packet.md`가 계속할지, 같은 packet을 고칠지, stage를 올릴지, 멈출지 알려줍니다.

반복 가능한 명령이 packet을 증명한다면 agent는 가능한 한 이렇게 기록합니다.

```bash
hyper verify --axis validation_coverage --name "go tests" -- go test ./...
```

이 명령은 exit code, stdout/stderr hash, commit SHA, worktree status hash, run ID, goal ID를 `.hyper/verified-evidence/` 아래에 저장합니다. `evidence.md`는 Verified Evidence ID를 인용하고, 그 기록이 어떤 판단을 뒷받침하는지 설명하는 사람이 읽는 요약 역할을 합니다.

## 왜 도움이 되나요

AI 코딩을 오래 이어가면 이런 문제가 생깁니다.
Expand Down Expand Up @@ -74,6 +82,8 @@ repo 안에 남는 것은 이 정도입니다.
| `hyper run` | 계획과 이전 evidence를 읽고 다음 packet을 만듭니다. |
| `goal.md` / `tasks.md` | AI가 지금 해야 할 작업입니다. |
| `evidence.md` | 무엇을 바꿨고 어떻게 확인했는지 남기는 파일입니다. |
| `hyper verify -- <command>` | 검증 명령을 실행하고 기계가 읽을 수 있는 proof를 저장합니다. |
| `.hyper/verified-evidence/` | 검증된 명령 기록, stdout/stderr 로그, hash, commit SHA, goal/run metadata입니다. |
| `review.md` | packet이 아직 부족하면 고칠 내용을 남기는 파일입니다. |
| `next.md` | 다음 작업 하나와 재사용 가능한 배운 점을 남기는 파일입니다. |
| Agent finish gate (`hyper complete`) | agent/runtime이 packet을 닫고 다음 행동을 준비하는 확인 단계입니다. |
Expand Down Expand Up @@ -102,6 +112,7 @@ Hyper Run은 첫날부터 하네스를 만들라고 하지 않습니다.
| --- | --- |
| Runtime packet | 다음 AI 작업 묶음입니다. |
| Evidence | 작업이 됐고 확인했다는 증거입니다. |
| Verified Evidence | `hyper verify`가 남기는 기계 기록입니다. exit code, log hash, commit SHA, goal/run metadata를 포함합니다. |
| Proof Contract | 이번 packet의 증명 체크리스트입니다. |
| Learn | `evidence.md`와 `next.md`에서 다음 작업에 다시 쓸 신호만 뽑는 단계입니다. 단순 요약이 아닙니다. |
| Pressure Ledger | 프로젝트가 반복해서 보여준 필요, gap, 실패를 모아둔 목록입니다. |
Expand Down Expand Up @@ -138,6 +149,8 @@ Service Quality benchmark 예시는 [Reference Benchmark Evidence 예시](docs/e
- 명시 override가 켜져 있고 `plan.md` 목표와 다르면 `hyper status`가 현재 override 목표와 `plan.md` 목표를 같이 보여줍니다.
- `Target Stage`를 바꾸거나 제거하면 다음 status/run/migrate 흐름이 수정된 plan target을 따릅니다.
- Agent finish gate는 packet을 학습하기 전에 실행됩니다. evidence가 약하면 `review.md`에 보강할 내용을 남기고 agent가 같은 packet에 머무릅니다. 내부 복구 명령은 `hyper complete`입니다.
- `hyper verify`는 반복 가능한 명령 검증을 직접 실행하고 기계가 읽는 Verified Evidence를 저장합니다. Finish gate와 readiness는 Markdown 주장만이 아니라 이 기록도 근거로 사용할 수 있습니다.
- `hyper status`와 `hyper doctor`는 현재 packet의 Verified Evidence record 수, 최신 record ID, command, status, 실패한 exit code를 요약해 보여줍니다.
- 같은 finish-gate finding이 반복되면 반복 횟수를 기록하고, 다음 수정이 그 finding을 직접 해결하지 않는 한 auto loop를 멈추도록 경고합니다.
- `hyper run --auto --until <stage>`는 명시적인 override로 계속 사용할 수 있습니다. stage advancement 전에는 여전히 ready proof가 필요합니다.
- `hyper advance`는 `hyper status`가 gate ready라고 말할 때만 적용합니다. active auto target 안에서는 `.hyper/next-packet.md`가 Stage Advancement Review 뒤의 advancement를 이어갈 수 있고, auto mode 밖에서는 사용자 승인이 필요합니다.
Expand All @@ -156,6 +169,7 @@ hyper init

hyper run
# agent가 생성된 packet을 구현합니다
# 반복 가능한 명령 proof가 있으면 agent가 hyper verify로 기록합니다
# agent가 evidence.md/next.md를 업데이트하고 finish gate를 내부 실행합니다

hyper status --short
Expand Down
7 changes: 7 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

## Unreleased

## v0.6.10 - 2026-06-19

- Add `hyper verify [--axis axis] [--name name] -- <command>` to run validation commands directly and record exit code, stdout/stderr hashes, commit SHA, worktree status hash, run ID, and goal ID under `.hyper/verified-evidence/`.
- Let packet completion, finish gates, readiness evidence, and active validator checks consume passed Verified Evidence records instead of relying only on Markdown validation claims.
- Update generated packet templates, Codex routing docs, `plan.md`, README, and README_ko so command proof is machine-recorded while humans stay focused on approval and policy boundaries.
- Show the current packet's Verified Evidence summary in `hyper status` and `hyper doctor`, including record counts, newest command record, and failed exit code when a failed record exists.

## v0.6.9 - 2026-06-19

- Treat `Sustained Service Quality` as an ongoing operating target so a plan target at that stage keeps planning focused quality packets instead of stopping as target-proof-complete.
Expand Down
7 changes: 7 additions & 0 deletions docs/CHANGELOG_ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

## Unreleased

## v0.6.10 - 2026-06-19

- `hyper verify [--axis axis] [--name name] -- <command>`를 추가했습니다. 검증 명령을 직접 실행하고 exit code, stdout/stderr hash, commit SHA, worktree status hash, run ID, goal ID를 `.hyper/verified-evidence/` 아래에 기록합니다.
- Packet 완료 판정, finish gate, readiness evidence, active validator check가 Markdown validation 주장만 보지 않고 통과한 Verified Evidence record도 근거로 사용할 수 있게 했습니다.
- Command proof는 기계 기록으로 남기고, 인간은 승인과 정책 경계에 집중하도록 generated packet template, Codex routing 문서, `plan.md`, README, README_ko를 갱신했습니다.
- `hyper status`와 `hyper doctor`에서 현재 packet의 Verified Evidence 요약을 보여줍니다. record 수, 최신 command record, 실패 record의 exit code를 확인할 수 있습니다.

## v0.6.9 - 2026-06-19

- `Sustained Service Quality`를 계속 운영하는 target으로 처리해, 해당 stage를 plan target으로 둔 경우 target-proof-complete로 멈추지 않고 focused quality packet을 계속 계획하게 했습니다.
Expand Down
15 changes: 15 additions & 0 deletions internal/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ func runCLI(args []string, fsys fsRoot, updater updater) (commandOutput, *hyperE
return stdout(commandUsage("status")), nil
}
return statusHyper(fsys, rest)
case "verify":
if helpRequested(rest) {
return stdout(commandUsage("verify")), nil
}
return verifyHyper(fsys, rest)
case "doctor":
if helpRequested(rest) {
return stdout(commandUsage("doctor")), nil
Expand Down Expand Up @@ -147,6 +152,7 @@ func usage() string {
" hyper advance",
" hyper status",
" hyper status --short",
" hyper verify [--axis axis] [--name name] -- <command> [args...]",
" hyper doctor",
" hyper repair",
" hyper resume",
Expand All @@ -159,6 +165,7 @@ func usage() string {
" Edit plan.md, set `Target Stage` when you want continuation, then use plain `hyper run` to create the next runtime packet.",
" Use `hyper run --auto --until service-quality [focus]` only when you need to override the plan target from the command line.",
" The agent updates evidence.md and next.md, then runs the finish gate internally before another packet starts.",
" Use `hyper verify -- <command>` when command proof should be recorded with exit code, log hashes, commit SHA, and worktree state.",
" When `hyper status` says the stage gate is ready, use `hyper advance` after user acceptance or an active auto-target review.",
"",
"Advanced/recovery:",
Expand Down Expand Up @@ -203,6 +210,14 @@ func commandUsage(command string) string {
"",
"Shows current stage, gate, proof, pressure, next action, and blocking gaps.",
},
"verify": {
"Usage:",
" hyper verify [--axis axis] [--name name] -- <command> [args...]",
"",
"Runs a validation command directly and records verified evidence under `.hyper/verified-evidence/`.",
"Captured metadata includes exit code, stdout/stderr hashes, commit SHA, worktree status hash, duration, run ID, and goal ID.",
"Use `--axis` to attach the proof to a readiness axis such as validation_coverage, core_ux, or sustained_quality.",
},
"doctor": {
"Usage:",
" hyper doctor",
Expand Down
17 changes: 17 additions & 0 deletions internal/app/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -448,14 +448,31 @@ func statusHyper(fsys fsRoot, args []string) (commandOutput, *hyperError) {
refresh := statusRefreshFor(root, state)
if short {
lines := statusShortLinesWithRefresh(state, derived, readiness, growth, refresh)
lines = appendStatusVerifiedEvidence(lines, root, state.CurrentGoalID, true)
lines = appendStatusReviewFindings(lines, root, state.CurrentGoalID, derived)
return stdout(strings.Join(lines, "\n")), nil
}
lines := statusDashboardLinesWithRefresh(state, derived, readiness, growth, runs, goals, refresh)
lines = appendStatusVerifiedEvidence(lines, root, state.CurrentGoalID, false)
lines = appendStatusReviewFindings(lines, root, state.CurrentGoalID, derived)
return stdout(strings.Join(lines, "\n")), nil
}

func appendStatusVerifiedEvidence(lines []string, root, goalID string, short bool) []string {
if strings.TrimSpace(goalID) == "" {
return lines
}
if len(lines) > 0 && strings.TrimSpace(lines[len(lines)-1]) == "" {
lines = lines[:len(lines)-1]
}
if short {
lines = append(lines, verifiedEvidenceShortLine(root, goalID))
return append(lines, "")
}
lines = append(lines, verifiedEvidenceDashboardLines(root, goalID)...)
return append(lines, "")
}

func appendStatusReviewFindings(lines []string, root, goalID string, derived goalState) []string {
if !isFailedFinishGateReason(derived.Reason) {
return lines
Expand Down
3 changes: 3 additions & 0 deletions internal/app/doctor.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ func doctorHyper(fsys fsRoot) (commandOutput, *hyperError) {
checks = append(checks, doctorStateChecks(root)...)
checks = append(checks, doctorGrowthMigrationCheck(root))
checks = append(checks, doctorReadinessStateCheck(root))
checks = append(checks, doctorVerifiedEvidenceCheck(root))
checks = append(checks, doctorNextPacketPlanCheck(root))
checks = append(checks, doctorSignatureCheck())
checks = append(checks, doctorDBCheck(root))
Expand Down Expand Up @@ -516,6 +517,8 @@ func doctorActionForCheck(check doctorCheck) string {
return "Run `hyper repair`, then run `hyper doctor` again."
}
return "Run `hyper migrate`, then run `hyper doctor` again."
case "verified evidence":
return "Inspect the failed Verified Evidence record, fix the command or implementation, then rerun `hyper verify -- <command>`."
case "signature verification":
return "Install `cosign` or unset `HYPER_RUN_VERIFY_SIGNATURE`."
case "sqlite":
Expand Down
14 changes: 9 additions & 5 deletions internal/app/finish_gate.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,19 @@ func runFinishGate(root string, state projectState, derived goalState, readiness
result.Status = "failed"
result.Findings = append(result.Findings, "Runtime packet is not completed yet: "+derived.Reason)
}
if !hasNonPendingSection(evidenceText, "Validation") {
if !hasNonPendingSection(evidenceText, "Validation") && !goalHasPassedVerifiedEvidence(root, state.CurrentGoalID) {
result.Status = "failed"
result.Findings = append(result.Findings, "Add concrete command, smoke, browser, or manual validation output under `## Validation`.")
}
if !hasNonPendingSection(nextText, "Recommended Next Goal") {
result.Status = "failed"
result.Findings = append(result.Findings, "Add the next recommended runtime episode under `## Recommended Next Goal` in `next.md`.")
}
if finding := readinessFinishGateFinding(state, evidenceText, readiness); finding != "" {
if finding := readinessFinishGateFinding(root, state, evidenceText, readiness); finding != "" {
result.Status = "failed"
result.Findings = append(result.Findings, finding)
}
if finding := activeCapabilityFinishGateFinding(root, evidenceText); finding != "" {
if finding := activeCapabilityFinishGateFinding(root, state.CurrentGoalID, evidenceText); finding != "" {
result.Status = "failed"
result.Findings = append(result.Findings, finding)
}
Expand Down Expand Up @@ -128,13 +128,14 @@ func isFailedFinishGateReason(reason string) bool {
return strings.Contains(strings.ToLower(strings.TrimSpace(reason)), "finish gate failed")
}

func readinessFinishGateFinding(state projectState, evidenceText string, readiness readinessState) string {
func readinessFinishGateFinding(root string, state projectState, evidenceText string, readiness readinessState) string {
axis := strings.TrimSpace(readiness.NextPressure.Axis)
axisName := strings.TrimSpace(readiness.NextPressure.AxisName)
if axis == "" || axisName == "" || axis == "stage_advancement" || axis == "product_completeness" || axis == "reference_benchmark" {
return ""
}
records := readinessEvidenceRecordsFromGoalText(state.CurrentGoalID, evidenceText)
records = append(records, verifiedReadinessEvidenceRecords(root, state.CurrentGoalID, readinessDimensionDefs())...)
if axis == "sustained_quality" {
for _, record := range records {
if record.Axis == axis {
Expand Down Expand Up @@ -211,7 +212,7 @@ func readinessFinishGateHint(axis string) string {
}
}

func activeCapabilityFinishGateFinding(root, evidenceText string) string {
func activeCapabilityFinishGateFinding(root, goalID, evidenceText string) string {
capabilities, err := activeCapabilities(root)
if err != nil || len(capabilities) == 0 {
return ""
Expand All @@ -225,6 +226,9 @@ func activeCapabilityFinishGateFinding(root, evidenceText string) string {
if activeValidatorValidationCovers(capability, evidenceText) {
continue
}
if activeValidatorVerifiedEvidenceCovers(root, goalID, capability) {
continue
}
missing = append(missing, capability.Name)
}
if len(missing) == 0 {
Expand Down
Loading
Loading