This is a formats and rules document. You do not need it to hand work to your agent; read it when you build a tool that handles the records or need the exact behavior. New here? Start with Understanding Jaekit.
On this page
- 1. Location and ownership
- 2. PLAN.md
- 2.1 Condition table (## 조건표)
- 2.1.1 Result contract (## 결과 계약)
- 2.1.2 Check inputs and observation
- 2.1.3 Final candidate evidence
- 2.2 Scope (## 범위)
- 2.3 Task list (## Task)
- 2.4 Budget (## 예산)
- 2.5 Time limits (## 시간 제한)
- 2.6 Execution environment (## 실행 환경)
- 3. tasks/T00n.md
- 4. REVIEW.md
- Assurance tier and review order
- Verification evidence and observation scope
- Assurance policy and counterexamples
- 5. PROGRESS.md
- 5.1 Timeline
- 5.2 Post-completion findings
- 5.3 PROGRESS with decision history
- 5.4 Review summary
- 6. Completion report
- 7. Example (a small goal, with its task merged into PLAN)
- 8. ha lint error codes
Contract: Execution bundle
한국어 · English
This is a translation of the Korean original. Where the two differ, the Korean original decides.
This document is the canonical definition of the execution bundle's files and fields. The execution bundle is Seal's output. The goal documents the execution bundle reads (Spec's output) are in goal-docs.md. The format of the run record (runs.jsonl) is in run-record.md.
The execution bundle holds one goal's changing plan and progress. It has one purpose: another agent, without the earlier conversation, must be able to read only this bundle and finish the work from what remains. Adding more documents is not the purpose.
1. Location and ownership
docs/specs/<goal>/
SPEC.md 목표 문서 진입점: 조건 ID, (선택) 작업 분해 제안 (Spec이 작성, 사용자 소유)
<보조 문서>.md SPEC.md가 링크한 목표 문서 (Spec, 사용자 소유)
amendments/ 수정안 문서 (Spec이 작성, 사용자가 정하기 전까지 목표 밖, goal-docs.md §6.6)
PLAN.md 조건표, 범위, task 목록, 예산
REVIEW.md 실행 전 검토
tasks/T001.md task별 상세 (작은 목표는 PLAN.md 안에 합쳐도 된다)
PROGRESS.md 현재 상태, task 상태, 타임라인, 계획 변경, 막힘, 완료 보고
runs.jsonl 실행 기록 (`ha`만 덧붙인다)
| File | Writer | When it may change |
|---|---|---|
Goal documents (SPEC.md and the auxiliary documents it links) |
The user (written with Spec) | Only when the user decides. A change changes the goal digest, and every record becomes stale. Seal only reads them. |
PLAN.md |
The executor | Any time. The condition table, however, refers to the goal documents' condition IDs, and plan changes are recorded in PROGRESS.md. |
REVIEW.md |
The executor (a review subagent may be used) | Before execution, and after a plan change with a large impact |
tasks/ |
The executor | Together with a plan change |
PROGRESS.md |
The executor | Any time |
runs.jsonl |
ha only |
Append only. |
Other files in the goal directory (verification scripts, fixtures and so on) are treated as code, not as bundle documents. They enter the freshness and scope checks as they are (run-record.md §2). Even when a file that affects verification sits in the goal directory, a change to it makes earlier results stale. Whether another goal's execution bundle files under the same parent enter the code state depends on the rules version (run-record.md §4.6). As an exception, the amendment documents in amendments/ are neither goal documents nor code. Even when SPEC.md links them, they are not part of the goal document set, and both this goal's and those of other goals under the same parent are left out of the code state whatever the rules version (goal-docs.md §6.6, run-record.md §2).
Every file is plain Markdown. Only the parts ha lint must read follow the table formats below. Other prose is free.
2. PLAN.md
2.1 Condition table (## 조건표)
| Column | Meaning |
|---|---|
ID |
The goal documents' AC-n. Do not rewrite the condition text. ha reads it from the goal documents. Whether the condition is required also follows the (선택) (optional) mark in the goal documents (goal-docs.md §2.1). Checks the executor adds are EX-n and are always optional. |
종류 |
change (new behavior), maintain (existing behavior kept), manual (cannot be checked by machine in this environment) |
검증 명령 |
The command to run from the repository root, written as one code span. ha runs it as argv without a shell, so do not use pipes (|), redirects, &, ;, $ or backquotes. Words are split on spaces and can be grouped with single or double quotes. When it is complex, point to a script in the repository. For manual, write — and the reason. |
검사 경로 |
Paths of the check files that judge this condition (no globs). Required for change conditions. The baseline check overlays only these files on the base. |
Task |
The list of task IDs that implement this condition |
The rules are as follows (ha lint checks them).
- Every
AC-nof the goal documents appears in the condition table exactly once. A missing ID, and anACID that is not in the goal documents, are errors. A condition without an ID in the goal documents is an error, and the executor tells the user instead of editing the goal documents. - Every condition has at least one task. Every task rests on a condition or on another task's prerequisite output. An orphan task is an error.
- A
changecondition has a verification command and check paths. Amaintaincondition has a verification command. Amanualcondition has a reason. - To use the whole existing test suite as a preservation condition, add one
maintaincondition. When the goal documents have no such condition, add it asEX-n.EX-nis the executor's extra check, so it does not block the status. Behavior that must be preserved must be a required condition in the goal documents (goal-docs.md §2.3). When there is no such condition but you see behavior that must not break, ask the user in the pre-execution review (중요한 미결정, important open decisions, in §4).
An optional baseline column may be added at the end; the five-column table remains valid. In run-rules/7, 요구 in the baseline column means that the change condition requires a baseline. An empty cell, —, or no column means no baseline is required. Check paths and the structured result contract remain required for every change condition, marked or not.
| ID | 종류 | 검증 명령 | 검사 경로 | Task | baseline |
| --- | --- | --- | --- | --- | --- |
| AC-1 | change | `python3 checks/greeting.py` | checks/greeting.py | T001 | 요구 |
| AC-2 | change | `python3 checks/format.py` | checks/format.py | T001 | — |
요구 on a row other than change, or a value other than 요구, — or empty, is a baseline_marker lint problem. The column and lint apply regardless of rule version, but run-rules/1 through run-rules/6 ignore marks for judgment and keep their baseline requirement, default selection, minimum and output. /7 judges by the current PLAN's marks. The report in Run record §4.10 shows marks removed since the start.
2.1.1 Result contract (## 결과 계약)
Link run-rules/3 change checks to the structured result contract. PLAN holds an ID | 선언 경로 table that maps each such change condition to a repository-relative JSON declaration path. Include the declaration and the producer and configuration files in the condition table's check paths as well. A plain nonzero exit alone is not an expected failure, and ordinary maintain, manual and task checks are not forced over to this contract. Existing /1 and /2 goals keep their earlier result semantics.
The declaration path may also point to a runner adapter declaration (check-adapter/v1) instead of a producer declaration (check-declaration/v1). Then each target is linked to one test that already exists, and the verification command is the runner command itself that uses go test -json … or JUnit XML. There are no producer files, so the check paths hold the declaration and the linked test files. The format, the output location ({HA_JUNIT_XML}) and the judgment are in §5 of change check results. Use it only when the actual executable's capabilities list check-adapter/v1.
2.1.2 Check inputs and observation
These rules apply to checks written or changed from Seal 0.1.14 on. Which Seal version started the goal does not matter. They never require rewriting or converting an existing goal's checks, records, PROGRESS or REVIEW for this rule alone. They add no user confirmation, approval or question step. The executor applies the rules and judges whether to fix existing checks.
- What a check reads. Every check in the condition table (
change,maintain,EX-n, task commands), and the producer, configuration and helper files its command runs or reads, judge only from the tree being checked and the external inputs the condition names. Do not put the goal's start or base commit, or any other fixed commit, into a check. The same goes for reading the base from the start record or Core output and using it. Do not judge by reading other commits, refs or objects of the repository. Examples are a diff against a past commit, a merge-base, a remote-tracking branch, a relative ref such asHEAD~n, a log range and another worktree. The general property is "a full clone and a history-less clone with the same tree give the same verdict". The history of a synthetic repository the check builds itself is not covered. - Maintain conditions. A
maintaincondition observes the property the goal documents require (content, output, format, behavior) in the tree being checked. Confirming "no change since the base commit" in check code is not an observation of that property. When a path must not change at all, leave it outside바꿀 수 있는 경로(paths that may change). Core then reports changes committed since the base asout_of_scope, and only the user resolves them. A check can look at the property the file must keep, or compare the file with expected content written in a tracked check file. - Change conditions and the baseline. A violation on the base commit is observed only by Core's baseline run. The baseline runs on a temporary worktree of the base commit with HEAD's check paths overlaid. Check code never imitates the baseline by checking out, reading or comparing the base commit. The same check observes the required property in the tree it runs on, so it gives a violation on the base and a pass after the change.
- When history itself is the condition. When a condition is about history or refs, such as a tag's type or a commit message format, the check reads only the range and refs the condition names. When that history is missing or cannot be read, the result is neither a violation nor a pass but an error or unobserved. A
changecheck that produces a structured result writes that state in its result report.maintain,EX-nand task commands are recorded by exit code only, and every nonzero exit is recorded as a failure. So beforeha check, the executor confirms that the named range and refs can be read. When they cannot, record no result. For a required condition or task, hold that condition and completion and continue independent work; when that is all the work left, record a block with causeenvironment. AnEX-ncheck stays unobserved and does not block completion. This distinction is the same as the distinction in §4 among unobserved, environment error, skip and actual violation. Write in the pre-execution review why such a check is needed and the range it reads. - Declared boundaries. A component the goal documents point to or intend to change may have declared its own scope or trust boundary. Examples are pinning to a specific version or release, preserving past verdicts, isolating imports and limited inputs. That declaration is current behavior, so keep it unless the goal documents explicitly say to change it. When the goal documents can be satisfied both by a reading that widens the component and by a reading that adds a separate component, choose the reading that keeps the declaration, leave it in the pre-execution review as an explicit assumption and repeat it in the report. Do not ask the user anew. When the goal documents explicitly say to change the component, keep new code inside the declared boundary. For example, a new import also goes through the same import boundary. When no reading satisfies both the declaration and the goal documents, follow the existing document-conflict rule.
2.1.3 Final candidate evidence
These are planning rules, not a fixed order. The executor chooses the method and the order.
- While exploring, use narrow checks that fit what changed. Their results are working information, not evidence.
- Write in PLAN that the expensive full verification that completion needs is obtained once with
ha checkon the final candidate. Running the full verification for development and then again for the record on the same candidate is a cost to avoid. ha checkruns each condition's command separately. When several required conditions need the same full regression, it is recommended that one condition owns that regression and the other conditions observe their own properties. This is a recommendation, not a required procedure. It only assigns the shared run; it does not drop or weaken a condition, and each condition needs its own recorded result.
2.2 Scope (## 범위)
바꿀 수 있는 경로(paths that may change): a list of globs. It is the basis of the scope check. Derive it from the SPEC's scope and non-goals, and write the SPEC section it rests on. Seal 0.1.23 or later puts the test and check files the plan will create, and their helper files, here from the start, so adding those files raises no scope question. Do not include paths the goal documents say must not change.테스트 경로(test paths): a list of globs treated as test definitions. It is the basis of the check for changes to existing test definitions. When it is empty,ha's defaults (tests/**,**/*_test.*,**/test_*.*,**/*.test.*,**/*.spec.*) are used.유지할 동작(behavior to keep): what must be kept, from the SPEC's non-goals and current behavior다른 목표 실행 묶음(other goals' execution bundles): optional. Add it only when this goal's checks read another goal's execution bundle files (PLAN.md,REVIEW.md,PROGRESS.md,runs.jsonl,tasks/) as input. The value is the single code span검사 입력(check input). Example:- 다른 목표 실행 묶음: `검사 입력` (이전 목표의 PROGRESS.md를 검사한다)- When it is declared, other goals' execution bundle files enter this goal's code state under
run-rules/2andrun-rules/3too. A change to those files alone makes earlier results stale, and changes to them also enter the scope check (run-record.md §4.6). hareads this declaration from PLAN as it is when computing the status and when recording. Added during the work, it applies from then on. Removed, it leaves other goals' execution bundles out again, and results that were stale because of them can become fresh again. Record adding or removing it as a plan change.- The item must start with exactly
다른 목표 실행 묶음:. When other words follow this name or the colon is missing, or the value is different or has no code span, it is the lint errorother_bundles_invalid. - In a
run-rules/1goal, other goals' execution bundles are code already, so the result does not change.
- When it is declared, other goals' execution bundle files enter this goal's code state under
Widening 바꿀 수 있는 경로 is a plan change. When the widened scope conflicts with the SPEC's non-goals or scope, however, it needs the user's decision.
2.3 Task list (## Task)
| Column | Meaning |
|---|---|
ID |
The T001 form |
목표 |
What behavior it completes. Avoid goals that are not behavior, such as "create a file" or "add a class". |
근거 |
The condition IDs it implements |
제안 |
The matching work breakdown proposal's W ID, or —. When the goal documents have a proposal and you planned differently, leave the reason in 요구사항 대응 (requirement mapping) of REVIEW.md. |
선행 |
Task IDs that must finish first |
필수 |
예 (yes) | 아니오 (no) |
문서 |
tasks/T001.md, or — (when merged into PLAN) |
A cycle in the dependencies is an error.
2.4 Budget (## 예산)
검증 실행(verification runs): the limit on the number ofha checkruns within the budget window (baselines included). When the value is written exactly as자동(automatic), as in검증 실행: 자동,ha startsets it tomax(50, ⌈필수 최소량 × 1.5⌉)(the larger of 50 and the required minimum × 1.5, rounded up), and when that exceeds the pre-approved limit written inha.jsonin the user configuration folder (50 without one), it refuses the start without a record. When the검증 실행item holds a number, that number is used (run-record.md §1.5)경과 시간(elapsed time): the limit on the time from the first record to the last record within the budget window. Write it like4시간,90분,1시간 30분or2h30m. It is measured by record times, not by the current time. So it does not grow while you only query the status during a wait, but when a record is added to the same window after the wait, the waited time counts too. Time passing after completion does not cancel the completion (run-record.md §5)비용(cost): the limit, if it can be known.미관측(unobserved) when there is no means to observe it
The budget window starts at ha start or at the last reopen (the user's rework request). The Seal Skill sets the defaults. When the user sets values in the request, those values are used. When the user sets no budget, Seal 0.1.20 or later writes 검증 실행: 자동; when the start stops because it needs the user's approval, Seal asks once, showing the computed value and the pre-approved limit, and writes the number the user approved in 검증 실행. It does not ask the same question again for the same PLAN. Seal never writes or changes the pre-approved limit setting. A budget can be lowered before the start; raising it needs the user's decision. Editing PLAN during the work does not by itself change the limits. Under /3, ha budget changes the total run-count limit of the same window and keeps the usage and the time limit. An increase records the user's original words and context; a decrease records a reason. An explicit resume under /3 carries over the latest run-count limit. /1 and /2 keep the original limit and the existing resume meaning (run-record.md §5.2).
In /4, /5, /6 and /7 goals, user waits the executor reports are left out of the elapsed time, and within the pre-approved limit the user set with a quote, the executor raises the run-count limit for a reason alone (run-record.md §4.7).
2.5 Time limits (## 시간 제한)
An optional section. It is read only in run-rules/4, run-rules/5, run-rules/6 and run-rules/7 goals; a goal started under other rules runs every command with 900 seconds even when this section exists. Write one per line in PLAN's ## 시간 제한 section, like - AC-3: 30분, - T002 명령 1: 20분 or - EX-4: 1시간 30분.
- A target is a condition ID that has a command (
AC-n,EX-n), or a task and a command number (T002 명령 1, the command order in the task document's## 완료 조건). - A value is a positive integer with the unit
시간(hours),분(minutes) or초(seconds), or a combination of them. The maximum is 7200 seconds (2 hours). - A value over the maximum, a malformed value, a target that does not exist and a second declaration for the same target are the lint problem
time_limit_invalid, soha startandha checkrefuse before running. - A command without a declaration gets 900 seconds. The baseline runs with that condition's limit. The applied limit is part of the command digest, so after a limit changes, earlier results are not fresh (run-record.md §4.7).
2.6 Execution environment (## 실행 환경)
An optional section. To confirm the tools that checks use before the start, put a ## 실행 환경 section in PLAN and write one tool per line in the form - <이름>: `<점검 명령>` (a name, a colon and the probe command). Example: - 브라우저: `node scripts/probe-browser.mjs`.
- The section's extent is the same as for other PLAN sections: from the heading line up to the next level-1 or level-2 heading outside a fenced code block. Blank lines are skipped, and every other line must be a list item in this form. A fenced code block in the section is not an item either, so it is a malformed line:
ha doctorreports the opening line of each block (also separately for a block that immediately follows another). - The name is the text before the first
:with leading and trailing spaces removed. It cannot be empty or contain a backtick, and the same name is used only once. - The probe command follows the same rules as the verification command of the condition table: one code span, no shell syntax, and quotes around words with spaces.
- Seal 0.1.20 or later lists the tools checks need (browser, database, container, external service and so on) in this section, and runs
ha doctorbefore recording any baseline and before the first check after a resume. It gathers unusable tools into one question, never widens permissions or settings on its own, and keeps doing independent work while it waits. - Before recording any baseline, Seal 0.1.23 or later gathers the decisions that can be known in advance from the goal documents, the plan, the project instructions and the code and that need the user's words, together with unusable tools and a budget that needs approval, and asks them in one message. When a condition can be met only by user confirmation, the same message names that condition and what the user will be asked to confirm at the end. When there is nothing to ask, it asks nothing.
- Only
ha doctorreads this section.ha doctorruns each probe with a fixed 60-second limit, shows사용 가능(available) or사용 불가(unavailable) with the reason for each tool, and leaves nothing in the record, the run count or the execution bundle (run-record.md §1.4). - A malformed line (
environment_item_invalid), shell syntax (shell_syntax), an empty command (command_empty), a command that cannot be split into words (command_parse), a duplicate name (environment_name_duplicate) and a second## 실행 환경section (environment_section_duplicate) are reported only byha doctor, with file and line, and then no probe runs. They are not lint errors: with or without the section, and whatever its content, the results ofha lint,ha start,ha checkandha statusare the same.
3. tasks/T00n.md
| Section | Content |
|---|---|
목표 (goal) |
The behavior this task completes |
근거 (basis) |
The condition IDs and the SPEC sections those conditions come from |
선행 조건 (prerequisites) |
The tasks needed and their outputs |
읽을 자료 (reading material) |
Written in the four groups below. The purpose is to let an agent that does not know the earlier conversation find the evidence it needs without rereading all the repository's documents. |
범위 (scope) |
What to change and the behavior that must be kept |
완료 조건 (completion criteria) |
Which conditions (AC-n) must pass. When the task step has its own commands to check, write each in a list item of the ## 완료 조건 section that holds only one code span (for example - `go test ./pkg/x`). ha check <goal> T001 runs these commands in order and records them. These records are not used to satisfy conditions. |
Groups in 읽을 자료
| Group | What to leave |
|---|---|
필수 맥락 (essential context) |
The relevant sections of documents and the code locations needed to understand the goal |
필요할 때 참고 (reference when needed) |
Detailed design, long background material |
판단 근거 (grounds for decisions) |
Which existing behavior or document a decision rests on |
충돌·미확인 (conflicts and unconfirmed) |
Where documents and code differ, facts not yet confirmed |
Use summaries only as a guide to the original. Write the document path and section with them, and never replace the original completion criteria with a summary. When a small goal merges its tasks into PLAN, put the same groups in the ## 읽을 자료 section of PLAN.md.
4. REVIEW.md
The result of the pre-execution review. Passing the review means "ready to execute", not that the implementation is right.
Its subject differs from Spec's consistency check (goal-docs.md §3).
- Spec's consistency check: is the goal itself clear?
- Pre-execution review (this document): are the plan and the verification method for implementing that goal sufficient?
When the review finds a contradiction or ambiguity in the goal documents, do not edit the goal documents. Ask the user.
| Section | What to check |
|---|---|
요구사항 대응 (requirement mapping) |
The ha lint result (missing, orphan, cycle). Whether the SPEC's scope and non-goals are reflected in the tasks. Whether the condition table covers the goal documents' user scenarios. Where the plan differs from the work breakdown proposal, and why |
불필요한 task (unneeded tasks) |
Tasks that contribute to no condition |
문서 충돌 (document conflicts) |
Conflicts among the SPEC, project documents and the actual code |
중요한 미결정 (important open decisions) |
Decisions left in the goal documents' ## Open Decisions, and outcome-changing decisions that came up newly during planning (public behavior, data, permissions, irreversible design). Close each item with the user's answer (quoted) or an "assumption". Assumptions appear again in the report. A reading that keeps a component's declared scope or trust boundary is not a question but such an assumption (§2.1.2). Use ### 사용자의 답, ### 실행자 가정 in that order. Under ### 사용자의 답, each item contains the decision, the user's quoted answer, and where that answer is recorded. Under ### 실행자 가정, each item contains the assumption and its reason; mark an assumption that reads a SPEC sentence. Readings that keep a declared scope or trust boundary go under ### 실행자 가정. With no decision at all, write only one line 없음. Otherwise keep both subheadings and write 없음 under an empty one. |
검증 방법과 환경 (verification method and environment) |
Whether each condition's command can run in this environment; the tools, data, network and repository history it needs (history only when the condition is about history, together with the range it reads). For a goal that connects several components, by what method the conditions checked across the boundary are verified |
독립 검토 (independent review) |
The SPEC's Assurance: tier (none when absent), the floor the project instructions require and the one followed, the planned review stages (plan, candidate, fixes, cumulative round) or the reason they were skipped under light, the product's invariants and decision rules the plan review will look at with the places that read or keep them ("Assurance tier and review order" below), and the supported input forms of the open-ended inputs a new contract or check covers. Once rounds run, point to those round and gate records and do not copy the list of findings |
결론 (conclusion) |
ready or needs_user (reason) |
The split REVIEW form applies to goals started with seal 0.1.29 or later. A goal started with an earlier Seal keeps the REVIEW form it started with. An existing REVIEW.md is never rewritten into the split form.
Assurance tier and review order
Seal 0.1.20 or later reads the SPEC's Assurance: line (goal-docs.md §2.5) and applies the independent review stages that match the tier. Spar decides how review runs (packet, reviewers, classification rules, stage caps); this contract decides only the timing and the disposition.
standard: takes a candidate stage on the final candidate whose narrow checks pass, a fixes stage after the review-fix commits, and a cumulative round beforeha done.strict: in addition tostandard, takes a plan stage before recording any baseline. It reviews the plan and the check declarations, and the product's invariants and decision rules that this change introduces or alters (target identification, location resolution, retries, caps and so on).light: may skip independent review; when it does, it leaves the reason inREVIEW.mdand the completion report. When it takes review, it follows the completion order below.- A goal without the line follows the selected assurance policy. The assurance requirements of project instructions (
AGENTS.mdand the like) are a floor. The tier can only raise it, never lower it; when the two differ, follow the one that asks for more review, and write in the completion report the review each required and the one followed. - When the tier changes during implementation and the user asks to continue, apply the changed tier. A stage that the raised tier requires but that was not taken is taken on the current head before completion, and the records of reviews already taken are not deleted.
- The cumulative round is a round that calls Spar's candidate stage again over the goal's base commit to the last head. A goal that needs independent review runs
ha doneonly after the cumulative round ends with no opendefectorrequirement-question. A fixes round that saw only the fixes cannot replace it; when there were no fixes after the candidate round, that round is the cumulative round. When the cumulative round hits a cap, ask the user; never go past the cap or skip the round without the user's words. - Every round receives all the user's decisions recorded before it that the goal documents do not hold: the user's answers that closed
REVIEW.md## 중요한 미결정items, confirmations (confirm) and inputs (input) that quote the user's words, and the user's answers to a review'srequirement-question. Each decision gives what it settles (theREVIEW.mditem or the confirmation's target) as--decisionand the recorded quote unchanged as--decision-quote. Round cap extensions, reviewer waivers andreopenare not passed. Decisions go to every round from the plan round to the cumulative round. Passing decisions applies to every round this Seal runs, whichever Seal started the goal. - For each product invariant and decision rule the change introduces or alters,
## 독립 검토lists the places that read or keep it: each place's repository path, and the name used there when it differs from the change's name. It includes places that keep the same invariant under another name, not only those found by name; when the change alters no invariant, it says so; and every round from the plan round to the cumulative round gets one--questionper place, asking whether that place still keeps the invariant at head; the list adds places for reviewers to look at and never narrows what they read. The list of places applies to goals whose start record names seal 0.1.25 or later, and existing goals'REVIEW.mdis never rewritten to the new form. - When a contract or check about open-ended input (sentences, paths, names, formats and so on) is added or changed, the plan writes the supported input forms before the plan review. Those forms cannot be narrower than the input that a SPEC condition, a contract or a protected path requires; narrowing them is for the user to decide. Ask the user about an open-ended condition whose forms are not written.
- Seal decides the disposition of findings. Fix a
defector rebut it with evidence; ask the user about arequirement-question(without editing the goal documents); never fix an automatically deferredhardeningwithout the user's words. A finding about input outside the supported forms ishardening; when it was classified as adefect, rebut it by citing where the contract wrote the supported forms. - A
standardorstrictgoal started withrun-rules/5,run-rules/6orrun-rules/7, after the cumulative round, makes aspar gatefor HEAD from that series' rounds, records it withha note <goal> review --gate <file>and then runsha done. The rounds get all goal documents as--criteria. When no gate is recorded, or the recorded gate is stale, Core does not record completion (run-record.md §4.8). When Spar is missing or cannot run, completion is held; to finish without review, the user decides a goal-document change that lowers the tier tolight. The acceptance of a separate review below does not apply to these goals. - When Spar is missing or cannot run and review is not required, proceed and write in the completion report that there was no independent review. In a goal started with
run-rules/4or earlier where review is required, hold completion and record the cause, the affected conditions, the missing evidence and the resolution condition. Another separate review that records its role, inputs, reviewed version, findings or no findings, limits and checkable references counts as the required review; the completion report states that Spar was not used and the method that was used, and that review too covers the whole last head beforeha done. - When the user asks to apply remote review after a completion record, proceed in this order:
reopenquoting that request, the fix, one cumulative round, re-recording stale required checks, andha done. - In goals started with
run-rules/4or earlier, the tier does not change the judgment or the output ofha statusandha done; in goals started withrun-rules/5,run-rules/6orrun-rules/7, the gate above becomes a completion condition. TheREVIEW.mdof a goal started with an earlier Seal keeps the format it started with.
Verification evidence and observation scope
New goals started with Seal 0.1.10 or later use the distinctions below in their existing review and completion report. Existing goals keep the format they started with, and the absence of the new items means unrecorded, not evidence of failure or non-execution. Do not convert existing records automatically or fill in past observations.
- Grounds for the expected result: the user's requirement, a public contract or an agreed invariant, and its location. When actual behavior or a reference implementation was taken as the standard, also state the contract and scope of that choice. An actual run or a fake's expected value is not in itself the authority on correctness.
- Boundary to observe: the boundary and scope of the actual shell, database, HTTP, model or other system to be checked. Write only the environments that affect the result, and distinguish planned, not performed and actually performed.
- Test method and substitute environment: what synthetic inputs, fakes, fault injection and comparison with a reference implementation control or stand in for. Do not stretch an example into the right answer for all inputs.
- Failure kinds not covered: gaps in the general property, the representative examples and the environment assumptions, and risky boundaries. Even a claim that no risk remains carries a scope, and the number of checks is not evidence of sufficiency.
Link every condition to these three axes and the gaps. A group of conditions that shares the same content may refer to one explanation; repetition per AC, or copies of the same table in several documents, are not required. When the expected grounds are undecided or conflicting, show that state, and do not write them as a finished answer.
Link what the review planned to the actual results in the report. When a condition, check or environment changes, also distinguish the version and the applicable scope of the evidence, and do not use earlier results as new observations. Distinguish facts confirmed by records from the executor's interpretation. Leave the scope where access or execution was blocked, and the reason, as unobserved.
While an important open decision at needs_user remains, do not execute; ask the user. Do not ask about what the implementer can decide, such as class names, file layout or implementation order (the same as Spec's questioning principle).
Assurance policy and counterexamples
New goals started with Seal 0.1.11 or later, and high-impact verification design changes the user requested, link to each condition or condition group the source of the assurance policy, whether it is required or optional, and the reason for the risk. Explain the impact of a false success, the relevant boundary and the gaps in the current evidence, and also record why high-risk candidates were excluded. Do not impose on every goal the same agent, model or pre-baseline-check order on risk level alone. Do not lower a required assurance the executor has already set; leave only undecided outcomes for the user's decision.
Keep the expected grounds, the observation boundary, and the method and substitute environment separate; an actual comparison links the results and differences for the same property, input range and environment. Obtain evidence at the actual boundary when the property or policy a condition claims needs it, and do not require a call for every condition only because a real system exists. When structured originals linked to their targets exist, do not replace them with incomplete inference from strings. Do not promote the success of a fake, a synthetic setup, a reference implementation or a single model run into a guarantee of the whole real contract.
Independent review is a separate review, and its initial input is the goal, the public contract, the checks and the expected grounds. It does not fix its starting point on the implementer's explanation of the solution, but it may also examine the implementation and integration code it needs. Record the condition, check and code versions, the context provided, the role, checkable evidence, what was found, not found or not performed, and the limits. A self-review with only a different role name attached is not independent review, and no claim is made of model diversity, certified identity or a guarantee of sufficiency.
Link a counterexample candidate to its input, the expected violation and why the check misses it, and distinguish reproduction, rejection, fix and remaining gaps. When a violation of the original condition is confirmed, do not complete. Do not close it by passing the existing checks again and only adding risk wording to the report; record which check and which fix evidence handled the missed general property. Leave a proposal that changes the scope for the user to decide.
A check that accepts evidence does not use inconclusive as success, and a prohibition check does not hide inconclusive as no execution. Preserve unobserved, environment error, skip and actual violation. Inconclusive is not evidence of an intended baseline violation either. Evidence sufficiency and whether the product accepts or rejects an input are separate matters.
When a required review or actual evidence is missing, record the cause, the affected conditions, the missing evidence and the resolution condition, leave that required work unfinished and hold completion. Unrelated work continues within the existing authority and budget, and an optional comparison may leave its unobserved scope and risk to a later evaluation. Do not fill the gap with automatic installation, increased cost, widened permissions or a review record without facts.
When the goal, checks, code, expected grounds, environment or policy change, preserve the reviewed version and scope, and distinguish the new applicable scope. Do not reuse a past review for new inputs, or create an unrecorded review retroactively. Core's determinism, local assurance, result distinctions, adverse history, budget and authority stay; the executor chooses the method, timing, reviewers, model and mutation.
5. PROGRESS.md
The format below is used for goals started with seal 0.1.20 or later. A goal started with an earlier Seal keeps the PROGRESS format it started with. The Skill version of the start record is on the skill: line of ha status. In a goal started with seal 0.1.6 to 0.1.19, ## 현재 is a short summary in which the check time (with time zone), the ha status and ha done judgment of that time and the record head are written by hand; each edit writes the check time and the record head as of then, and the check time is for reference. The other sections (## 타임라인, the time rules of the two tables) are as below.
| Section | Content |
|---|---|
## 현재 |
A short, current summary (about 5 to 8 lines). At the top, paste unchanged the values ha report <goal> shows as the ## 현재 stamp: the record head (seq and hash exactly as ha status shows them, for example seq 2 (0123456789ab); while there is no record yet (before ha start), none, as in ha status), the time stored in that record (with time zone), the state, and the completion record seq when there is a completion record. Do not write a check time by hand. Below it go the work in progress, the open problems, the next work and how to resume. Update it with a new stamp whenever the record head changes. Whoever takes over compares the record head with ha status to see whether it is stale. The same seq with a different hash is a different record. The stamp's time is for reference. Do not write past events; point to ## 타임라인. When a completion record is left, state that the summary is as of that completion record, and point to where to see what happens after the bundle's last commit and does not stay in the bundle (merge, PR replies, checks after the merge and so on). Do not write work to do after completion as if it were in progress. |
## 검수 요약 |
Review summary. For a goal started with seal 0.1.24 or later, written after the completion record. Where the user starts reviewing the finished goal. See 5.4 below. ha does not read this section. |
## Task 상태 |
Table: Task, 상태 (state: todo | doing | done | dropped | blocked), 메모 (note). done is a claim. dropped needs a plan change record. |
## 타임라인 |
Optional. A history to which events that changed a judgment or the next action are appended. See 5.1 below. ha does not read this section. |
## 계획 변경 |
Table: 시각 (time), 변경 (change), 이유 (reason), 영향 (impact), 다시 검토한 것 (what was reviewed again). A condition kind change (for example change → maintain) is recorded here too. 시각 includes the time zone. One row is one event. When the same event is also written in the timeline, the detailed description stays only in that timeline entry, and the row points to it with a one-line summary and that entry's time. |
## 막힘 |
Table: 시각 (time), 원인 종류 (cause kind: auth | permission | quota | environment | spec | other), 내용 (description), 해소 조건 (resolution condition). Terminal failures are not retried but recorded here. 시각 includes the time zone. One row is one event. When the same event is also written in the timeline, the detailed description stays only in that timeline entry, and the row points to it with a one-line summary and that entry's time. |
## 개선 메모 |
Optional. Problems with, and suggestions for, the Seal Skill, its templates and ha that the executor noticed. These are claims. The Skill and the templates are not changed inside this goal. |
## 완료 보고 |
Section 6 below |
5.1 Timeline
## 타임라인 is an optional section. Events that changed a judgment or the next action are appended in time order, so that someone taking over in another session can learn "why it was changed this way". Its content is the executor's claim.
- Entry heading:
### <시각> · seq <기록 head> — <종류> · <한 줄 요약>(time, record head, kind, one-line summary)- The time is ISO 8601 with the time zone (for example
2026-01-01T09:00:00+09:00, orZfor UTC). When you do not know the exact time, do not make one up. - The seq is the record head when the entry is written (the heading carries only the seq; the hash goes in
## 현재). While there is no record yet, writeseq none. An entry tied to a check run uses that run's seq. The seq is an order confirmed by the hash chain ofruns.jsonl, so it is easier to confirm than the time, which is a claim. - The kind is one of
관측(observation),원인(cause),결정(decision),조치(action),검증(verification),막힘(block) and재개(resume).
- The time is ISO 8601 with the time zone (for example
- Time source and judgment: distinguish the event time from the writing time, and record the time source. When the original event time is unknown, leave it unknown; the heading may use the actual writing time. Write the remaining conditions, new facts, the grounds for a hypothesis and the uncertainty to reduce next, as far as they apply. Do not record every tool call, and do not dress up the same result from the same code, environment and hypothesis as progress. After a repetition, a changed judgment must show, such as a separated cause, a different hypothesis or a blocked condition.
- Body marks: mark a
원인(cause) as가설(hypothesis),확정(confirmed) or기각(rejected); a조치(action) as예정(planned) or반영(applied); and a검증(verification) as대기(pending),통과(passed) or실패(failed) (for example원인 [확정]: …). Point to evidence by AC, commit and seq, and do not copy raw check output (section 6). - Append only. Do not edit earlier entries. That something was
대기(pending) at that point is history too. When a judgment changes, write in a new entry what was rejected and on what grounds. A small event that went from confirming the cause to verification at once may be one entry. - What to record: events that changed a judgment or the next action. These are a new problem, a cause confirmed or changed, a change of approach, an important verification result, and blocks and resumes. A resume is any case of starting work again. This covers a new session taking over, a block being cleared and an answer received to
needs_user. A재개entry notes where## 현재differed from the actual state, if it did. - What not to record: routine edits and reads, repeated runs of the same failure, progress reports with no change
- Length: an entry is about 3 to 6 lines and
## 현재about 5 to 8 lines. This is editing guidance, not a limit. A complex cause analysis may run longer.
Below is a hypothetical example to explain the format. It does not represent an actual run record.
### 2026-01-01T09:00:00+09:00 · seq 2 — 원인 · AC-1 빈 입력 처리
- 관측: 빈 입력을 읽는 검사에서 오류가 났다(seq 2).
- 원인 [확정]: 첫 항목이 항상 있다고 가정했다. 근거: `src/count.go`의 입력 처리
- 조치 [예정]: 빈 입력일 때 0을 반환한다.
5.2 Post-completion findings
New reports from Seal 0.1.12 on may write details in ## 완료 뒤 발견 or refer to details kept in one place. The format, completion report and run record of existing goals are not converted automatically, and a missing new section is read as unrecorded. Even when appending a new finding to an older goal, do not create past observations or overwrite the original completion report.
Link the finding identifier; the target code, goal and reference to the completion at the time; the related condition, or no condition included, or link undecided; and the description, source, reproduction evidence, observed scope, current confirmation claim and follow-up work. Leave unknown values as undecided or none, and do not fill in arbitrary versions, conditions or check results. Distinguish the event time from the recording time and record the time source. An unknown event time is unknown, and the writing time does not stand in for it.
Distinguish candidate, confirmed, duplicate, rejected and resolved, and tell a new requirement apart from a violation of an existing condition. When a judgment changes, preserve the original and append the correction target, the new judgment, the reason and the evidence. A duplicate points to the canonical finding, and a resolution records the fix and recheck evidence and the unconfirmed scope. Do not describe the number of reports as the number of unique confirmed defects. A document's state names do not guarantee a mechanically current state or the resolution of conflicts from concurrent edits.
The current summary distinguishes the completion at the time, the current findings, and rework requests and whether they are in progress. When a confirmed violation of an existing condition exists, do not put the completion record forward and describe things as if there were no current defect. Keep the details in one place and refer to them from the summary, and do not apply later fixes or checks retroactively as evidence for the past completion.
Recording, confirming, rejecting or resolving in documents does not change the existing completion, execution budget or user authority, and does not start rework. When there is an explicit rework request, link its original source, the target finding and the follow-up result, and distinguish requested, planned, in progress, complete and not requested. Raw logs and private conversations keep their existing storage boundaries and are referred to by permitted locations and identifiers. Public examples state that they are synthetic. This document format is not an implementation of Core's structured queries or state transitions, and does not replace a separate feature contract.
Review or PR findings received without the user's request are not authority to change the completed goal's code. Record them as post-completion findings in this format and report them. Changing the code needs the user's request and reopen.
5.3 PROGRESS with decision history
A goal started with Seal 0.1.13 or later may record detailed judgments once in the optional decision history and refer to them from PROGRESS by event ID (D<n>). A goal started with an earlier Seal keeps the PROGRESS format and documentation duties it started with. An environment that supports the feature may add an auxiliary history, but does not retroactively omit originally required explanations or convert past timelines. ha does not read the prose sections of PROGRESS, and an event ID reference does not change a task state or the completion judgment.
| Section | With decision history |
|---|---|
## 현재 |
Leaves the current state, important decisions with short reasons, the open problems and how to resume so that they are understandable without the history. Related event IDs are auxiliary references. |
## 타임라인 |
A short index of the important events a handover needs. It adds the event ID to the heading form of 5.1 above (time, seq, kind, one-line summary) to point to the detail, and does not copy every event. |
## 계획 변경, ## 막힘 |
Keep the existing columns and the needed summary, and refer to the detail by time and event ID. |
- Write the detailed reasons, evidence and relations once in the history, and read them with the Markdown query of
ha history. Do not save the query's Markdown as a separately maintained source, and do not generate the whole of PROGRESS automatically. No number of sentences or fixed writing order is set. - PROGRESS refers by ID only to events whose storage succeeded. For a judgment where the history was not used, the feature cannot be used, storage failed, or whether it was applied could not be confirmed, leave the explanation in Markdown in the form of 5.1. Required handover content must never remain only as an event ID.
- The decision history is local data in the Git common directory, so it does not follow to a new clone or another machine. There, the detailed reasons, evidence and relations are absent, and only the current state, the important decisions with short reasons and how to resume, kept in PROGRESS, partly make up for this loss. This is not a restoration of the detailed history.
- The executor decides which events to record and when, which relations to link, and how to group small events. The criteria for which events to record are the same as in 5.1. This feature has no human approval step or retrospective duty of its own.
5.4 Review summary
## 검수 요약 applies to goals whose start record names seal 0.1.24 or later. A goal started with an earlier Seal keeps the PROGRESS and report form it started with, and existing goals' PROGRESS.md is never converted to the new form.
This is where the user starts reviewing a finished goal, so that the user can see in one place what changed, why and on what evidence, and what a person must inspect directly. Written once ha done records completion, as of that completion record, and rewritten as of each new completion record after a reopen; not written before completion or when work stops at needs_user, blocked or budget_exhausted. Before that, the heading holds one line saying so, and at a stop ## 현재 and the completion report (section 6) carry the state as before. ha does not read this section.
When a goal with a completion record is reopened with reopen, the earlier content of this section stays unchanged until the next completion record. Add one line at its top saying which completion record (seq and commit) it is as of, that the goal was reopened so that completion record is no longer valid, and that this section will be rewritten after the next completion record. A stop in between (needs_user, blocked, budget_exhausted) leaves the earlier content and that line as they are. After the next completion record, rewrite this section as of that record; that line does not remain. For a reopened goal this rule applies instead of the one line kept before completion.
The section has the items below, all of them and in this order; write 없음 under a heading with nothing to list.
- Opening lines, with no heading: the completion record's seq and commit, the assurance tier, how many required conditions are satisfied, and the review gate result; one line on what the change does; where to start looking.
### 바뀐 동작과 파일(changed behavior and files): a table바뀐 동작 | 조건 | 파일(changed behavior, condition, files). Every file changed from the goal's base to the completion commit, goal documents excepted, appears in a row; this goal's check files have rows too.### 범위 밖이나 기존 것을 바꾼 곳(changes outside the scope or to existing things): one item each for files outside the SPEC scope, changes to existing tests, and changes to checks an earlier goal left, each with where the user's words allowing it are, or the reason.### 근거(evidence): for every condition, what the check that satisfied it observed and the commit where it passed, never by seq alone; and a table라운드 | 지적 | 끝(round, findings, ending) with one row for every review round, a round with no findings included. Every finding of the round ends in exactly one of고침(fixed),반박(rejected),중복(duplicate),사용자의 답(the user's answer),이슈로 보류(deferred to an issue),자동 보류(deferred automatically) and처리 없음(no disposition).### 누가 정했나(who decided): decisions in three groups: decided by the user, with where their words are; proposed by the agent and accepted by the user; executor assumptions nobody was asked about. Mark an assumption that reads a SPEC sentence.### 직접 볼 것(what to inspect directly): ordered by risk, the highest at the top, one or two lines each: every item the직접 볼 것line ofha reportlists and, whatever that line shows, every deferred finding with its issue; every finding left with no disposition; executor assumptions that read a SPEC sentence; conditions met by checks that observe fixed text only, whose documents a person must read;manualconditions; the changes under### 범위 밖이나 기존 것을 바꾼 곳.### 보지 않은 것(what was not observed): Unobserved scope and substitutes, assurancelocal, the fact that the executor wrote the checks, and the fact that the summary is not evidence of deployment, installation or a real model call.### 자세히(details): the documents and sections that hold the detail.
The judgment items of the completion report's item 2 (section 6) go here: the changed files and the condition each contributed to under ### 바뀐 동작과 파일; assumed open decisions under ### 누가 정했나; manual conditions under ### 직접 볼 것; the expected-result grounds, the actual observation boundary, the test method and the review stages actually taken (or why they were skipped, and, when the SPEC tier and the project instructions differed, the review each required and the one followed) under ### 근거; the unobserved scope and substitute environments under ### 보지 않은 것; where the independent review results are under ### 자세히; and whether the head to be sent or merged is the completion record's commit, with the fact that the completion does not cover a difference unless ha status at that head still names that completion record, in the opening lines.
The two parts of ### 근거 and the items of the opening lines are minimum lists; the items the judgment-item paragraph assigns join them in the same place.
The judgment items moved from item 2 of the completion report keep its qualifications: the executor's statements are marked as claims, and facts confirmed by records are kept apart from the executor's interpretation. When conditions, checks or environments differ from the plan, state the evidence's version and the scope that evidence covers.
Reading rules: write in the user's language; say what a record is, with its seq only as an aid; keep each item short; never copy check output or finding text; a finding is its ID, one line and its ending. The original text of a finding stays in the review records. At completion, the executor's judgment sentences are only in this section, and the completion report points to it (section 6).
Only when the user asked for a PR does the following guidance apply. This PR guidance applies only to a goal that has a ## 검수 요약. This guidance adds no authority to create, change or push a PR, or answer a review.
When writing or changing a completed goal's PR description, build it from that goal's ## 검수 요약. Include the completion record's commit, the changed behavior and files, and an evidence summary. Include every item of ### 직접 볼 것, including deferred findings with their issues and findings without a disposition; include ### 보지 않은 것. Add the items the project instructions require in a PR description, such as a list of deferred findings and check boundaries. Never drop a ### 직접 볼 것 item or rewrite it as resolved.
Leave out paths and links to goal documents, execution bundles and review records that Git does not track, since a PR reader cannot open them. Also leave out the raw user conversation; instead, describe the content briefly or say it is in local records.
6. Completion report
Written when ha done has left a completion record, or when work stops because it cannot go further (needs_user, blocked, budget_exhausted).
The completion report of a goal started with seal 0.1.20 or later has these two parts.
- The
ha report <goal>output of that moment. Run it with--lang kowhen the user's language is Korean and with--lang enotherwise, and paste it unchanged. It holds the five-line summary, the## 현재stamp, the evidence per condition, the completion coverage (the completion record's seq and commit, and whether it covers HEAD) and where the original output of unmet conditions is, and no raw verification output. Do not paste the rawha statusorha doneoutput. - Below it, add only the executor's judgment sentences: the changed files and the condition each contributed to (a claim); assumed open decisions and
manualconditions; the grounds for the expected result, the actual observation boundary, the test method and substitute environment, and the unobserved scope; the assurance tier and the review stages actually taken, or the reason they were skipped; where the independent review results are; when the SPEC tier and the project instructions differed, the review each required and the one followed; whether the head to be sent or merged is the completion record's commit and, when it differs, the fact that the completion does not cover the difference (it does cover it whenha statusat that head keeps showing the same completion record); the assurance levellocaland the fact that the executor wrote the checks; the fact that the report is not evidence of deployment, installation or a real model run; and, when not complete, how to continue.
For a goal started with seal 0.1.24 or later, at completion ## 완료 보고 holds item 1 and one line pointing to ## 검수 요약; item 2 lives only in ## 검수 요약 (5.4). When work stops, both parts stay as above.
A goal started with a Seal earlier than 0.1.20 keeps the report format it started with, in the order below.
- On completion, the output of
ha done; when stopping, the output ofha status --format md. Paste it unchanged and do not rewrite it. This output holds only the result, reasons, digests and record seqs, and no raw verification output. - Completion coverage (goals started with Seal 0.1.15 or later): the completion record's seq and commit, whether the head to be sent or merged is the same as that commit, and, when it differs, the fact that the completion does not cover the difference. When
ha statusat that head keeps showing the same completion record, however, the completion covers it. A goal started with an earlier Seal keeps the report format it started with. - Evidence per condition: condition, result, record seq. Omit it when the status output has it.
- The changed files and the condition each contributed to. This is the agent's explanation; mark it as a claim.
- Remaining limits: assumed open decisions,
manualconditions, the assurance level (local), the fact that the executor wrote the checks - In the new report format, link the review's expected grounds, planned boundary and method to what was actually performed, the results, the evidence and what was unobserved. Present what was confirmed, what could not be confirmed and the risky boundaries by condition or shared group. Also state the checks, environments and versions that differ from the plan, and the valid scope of the evidence. The report does not stand in for evidence of deployment, installation or a real model run.
- How to continue: when not complete, what remains and under what conditions the work starts again
When the user asks, after a completion record, to apply remote review or PR findings, that is a rework request. Record reopen quoting that request; after the fix, a goal that needs independent review takes one cumulative round; re-record the stale required checks on the final head; and before sending or merging, record completion again with ha done. Core's freshness decides which checks to re-record (run-record.md §3).
Never paste raw verification output anywhere in the execution bundle. The execution bundle is committed, and the user may share it with others. When a failure's cause needs explaining, summarize it, and let the raw output be viewed locally with ha log <goal> <seq>.
7. Example (a small goal, with its task merged into PLAN)
Below is an example of ordinary runner commands for /1 and /2. For a new /3 change, this pytest exit code alone is not enough. Link a declaration and a producer, as in the result contract's actual reference integration. A maintain condition that preserves all existing checks can keep using an ordinary runner.
# PLAN — empty-input
## 조건표
| ID | 종류 | 검증 명령 | 검사 경로 | Task |
| --- | --- | --- | --- | --- |
| AC-1 | change | `python -m pytest tests/test_empty.py -q` | tests/test_empty.py | T001 |
| AC-2 | maintain | `python -m pytest -q` | — | T001 |
## 범위
- 바꿀 수 있는 경로: `src/textstats/**`, `tests/test_empty.py` (SPEC: Proposed Behavior)
- 테스트 경로: (기본값)
- 유지할 동작: 비어 있지 않은 파일의 출력 형식 (SPEC: Non-goals)
## Task
| ID | 목표 | 근거 | 제안 | 선행 | 필수 | 문서 |
| --- | --- | --- | --- | --- | --- | --- |
| T001 | 빈 입력에서 0 0 0을 출력한다 | AC-1, AC-2 | — | — | 예 | — |
## 예산
- 검증 실행: 20
- 경과 시간: 2시간
- 비용: 미관측
8. ha lint error codes
ha lint prints one line per error with the code, the file and line, and a description. With no errors, it prints the single line ok: no lint problems, and when the goal documents have a valid Assurance: line (goal-docs.md §2.5), it adds assurance tier: <등급> (tier) on the next line. With even one error, ha start and ha check are refused, and ha status gives lint_error.
Goal documents (goal-docs.md)
| Code | Meaning |
|---|---|
spec_missing |
The goal directory has no SPEC.md |
criteria_missing |
There is no ## Acceptance Criteria section, or it has no conditions |
criterion_without_id |
A condition without an AC-n ID |
criterion_duplicate_id |
The same AC-n appears twice |
criteria_format |
The goal documents' list format value, or the position of its selection marker, is invalid |
criteria_format_duplicate |
The list format selection marker appears more than once in the goal documents |
assurance_format |
The value of the Assurance: line is not light, standard or strict, or the line is indented, or it comes after the first level-2 section |
assurance_format_duplicate |
The Assurance: line appears more than once |
criterion_indentation |
Indentation in the new list format is ambiguous or unsupported |
goal_doc_link_missing |
A document inside the goal directory that SPEC.md or an auxiliary document links does not exist |
proposal_invalid_id |
A work breakdown proposal's ID is not in the W1 form |
proposal_duplicate_id |
The same W ID appears twice |
proposal_unknown_criterion |
A proposal points to an AC-n that does not exist |
proposal_unknown_dependency |
A proposal depends on a W that does not exist |
proposal_cycle |
The proposals' dependencies have a cycle |
table_columns |
A contract table's column names differ (common to goal documents and execution bundles) |
Execution bundle
| Code | Meaning |
|---|---|
plan_missing |
There is no PLAN.md |
bundle_file_missing |
REVIEW.md or PROGRESS.md is missing |
plan_section_missing |
A section or table among ## 조건표, ## 범위, ## Task and ## 예산 is missing |
criterion_invalid_id |
An ID in the condition table is not in the AC-n or EX-n form |
criterion_duplicate_row |
The same condition appears twice in the condition table |
criterion_unknown |
An AC-n in the condition table is not in the goal documents |
criterion_not_in_plan |
An AC-n in the goal documents is not in the condition table |
invalid_kind |
The kind is not change, maintain or manual |
command_missing |
A change or maintain condition has no verification command |
command_multiple |
One cell holds more than one verification command |
shell_syntax |
A verification command contains shell syntax |
command_parse |
A verification command cannot be split into words (an unclosed quote and so on) |
check_paths_missing |
A change condition has no check paths |
baseline_marker |
A baseline cell is neither 요구, — nor empty, or a row that is not a change condition contains 요구 |
check_path_glob |
A check path is a glob |
manual_reason_missing |
A manual condition has no reason |
criterion_without_task |
A condition without a task |
scope_missing |
바꿀 수 있는 경로 is missing |
task_invalid_id |
A task ID is not in the T001 form |
task_duplicate_id |
The same task ID appears twice |
task_required_invalid |
필수 is not 예 or 아니오 |
task_unknown |
The condition table points to a task that does not exist |
task_unknown_criterion |
A task cites, as its basis, a condition that is not in the condition table |
task_unknown_dependency |
A task depends on a task that does not exist |
task_orphan |
A task that rests on no condition and is not a prerequisite of another task |
task_cycle |
The task dependencies have a cycle |
task_doc_missing |
The task document that the 문서 column points to does not exist |
proposal_unknown |
A task's 제안 is a W that is not in the goal documents |
budget_missing |
검증 실행 or 경과 시간 is missing or cannot be read |
time_limit_invalid |
A ## 시간 제한 item of a run-rules/4, run-rules/5, run-rules/6 or run-rules/7 goal is malformed, exceeds 7200 seconds, has a target that does not exist, or declares the same target twice |
evidence_invalid |
A condition, declaration or producer input in the result contract table is invalid |
evidence_overlay_missing |
A declaration or producer input is missing from that condition's check paths |
other_bundles_invalid |
The 다른 목표 실행 묶음 item in ## 범위 does not start with the exact key 다른 목표 실행 묶음:, or its value is not the single code span 검사 입력 |
progress_state_invalid |
A task state in PROGRESS.md is not an allowed value |
contracts/bundle.en.mdBuilt from bcaddb7603e8