easy-coding-harness 0.10.0-beta.1 → 0.10.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +151 -0
- package/README.md +50 -20
- package/dist/cli.js +478 -47
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/templates/claude/agents/ec-implementer.md +11 -0
- package/templates/claude/agents/ec-reviewer.md +6 -1
- package/templates/codex/agents/ec-implementer.toml +11 -0
- package/templates/codex/agents/ec-reviewer.toml +6 -1
- package/templates/common/bundled-skills/ec-init/SKILL.md +18 -6
- package/templates/common/bundled-skills/ec-meta/references/local-architecture/README.md +27 -12
- package/templates/common/bundled-skills/ec-meta/references/platform-files/README.md +1 -1
- package/templates/common/skills/ec-analysis/SKILL.md +141 -35
- package/templates/common/skills/ec-config/SKILL.md +24 -2
- package/templates/common/skills/ec-git/SKILL.md +7 -1
- package/templates/common/skills/ec-implementing/SKILL.md +61 -1
- package/templates/common/skills/ec-memory/SKILL.md +76 -6
- package/templates/common/skills/ec-reviewing/SKILL.md +21 -3
- package/templates/common/skills/ec-task-close/SKILL.md +4 -0
- package/templates/common/skills/ec-task-management/SKILL.md +7 -1
- package/templates/common/skills/ec-tdd-init/SKILL.md +101 -0
- package/templates/common/skills/ec-verification/SKILL.md +68 -26
- package/templates/common/skills/ec-workflow/SKILL.md +81 -22
- package/templates/main-constraint/AGENTS.md.tpl +49 -14
- package/templates/main-constraint/CLAUDE.md.tpl +46 -14
- package/templates/qoder/agents/ec-implementer.md +11 -0
- package/templates/qoder/agents/ec-reviewer.md +6 -1
- package/templates/runtime/templates/dev-spec-skeleton.md +8 -1
- package/templates/runtime/tools/easy_coding_tdd_readiness.py +306 -0
- package/templates/shared-hooks/easy_coding_state.py +3878 -259
- package/templates/shared-hooks/easy_dev_spec.py +444 -30
- package/templates/shared-hooks/easy_dev_spec_execution.py +1014 -0
- package/templates/shared-hooks/easy_dev_spec_protocol.py +1426 -18
package/package.json
CHANGED
|
@@ -16,6 +16,17 @@ complete exactly that unit. Your reply IS the return value, not a message to a h
|
|
|
16
16
|
file. All context you need is already in the task card.
|
|
17
17
|
- Make no workflow stage-transition decisions. You do not know the state machine exists.
|
|
18
18
|
- Follow the coding rules and architecture context embedded in the card.
|
|
19
|
+
- Follow the task card's `Local Baseline`: match nearby naming, control flow, null/error handling,
|
|
20
|
+
layering, object modeling, method granularity, literal usage, and comment style unless a stated
|
|
21
|
+
correctness, security, requirement, or hard-rule reason requires a deviation.
|
|
22
|
+
- Treat the task card's `Code Comments` author value and field/member/constant rules as mandatory.
|
|
23
|
+
- Do not add generic defensive null checks, speculative abstractions/layers, fragmented one-use
|
|
24
|
+
micro-methods, or a constant that exists only to hold one getter return.
|
|
25
|
+
- Local, obvious magic values are allowed when they match surrounding code; create constants for
|
|
26
|
+
reuse, stable domain/config/protocol semantics, or established project convention.
|
|
27
|
+
- Every method and field in a new core Java class, and every added or materially modified method
|
|
28
|
+
or field in an existing core Java class, must have meaningful Javadoc; comment complex logic
|
|
29
|
+
where intent or constraints are not obvious.
|
|
19
30
|
- Treat acceptance criteria, test points, contracts, and risks in the card as required inputs.
|
|
20
31
|
- Run the exact targeted checks requested by the card and report their real outcome.
|
|
21
32
|
- Preserve each existing file's original encoding; never silently convert.
|
|
@@ -15,7 +15,12 @@ dimension named in your task card. Your reply IS the return value.
|
|
|
15
15
|
- correctness → does the implementation match the dev-spec requirement? edge cases,
|
|
16
16
|
null/empty handling, races, off-by-one.
|
|
17
17
|
- compliance → does the code obey the RULES sections in the card? naming, format, comment
|
|
18
|
-
language, error handling.
|
|
18
|
+
language, error handling, and the evidenced Local Baseline.
|
|
19
|
+
- Do not request defensive null checks, abstraction, constant extraction, or legacy-wide comment
|
|
20
|
+
cleanup solely as generic best practice. Flag unjustified local-style deviations, speculative
|
|
21
|
+
layers, fragmented one-use micro-methods, constants created only for a getter return, and
|
|
22
|
+
missing Javadoc on any method/field in a new core Java class or any added/materially modified
|
|
23
|
+
method/field in an existing core Java class.
|
|
19
24
|
- `error` means a demonstrated acceptance, contract, security, or build failure. Use `warning`
|
|
20
25
|
for a credible risk and `info` for non-blocking maintainability advice.
|
|
21
26
|
|
|
@@ -15,6 +15,17 @@ Hard constraints:
|
|
|
15
15
|
the card.
|
|
16
16
|
- Make no workflow stage-transition decisions; you do not know the state machine exists.
|
|
17
17
|
- Follow the coding rules and architecture context embedded in the card.
|
|
18
|
+
- Follow the task card's "Local Baseline": match nearby naming, control flow, null/error handling,
|
|
19
|
+
layering, object modeling, method granularity, literal usage, and comment style unless a stated
|
|
20
|
+
correctness, security, requirement, or hard-rule reason requires a deviation.
|
|
21
|
+
- Treat the task card's "Code Comments" author value and field/member/constant rules as mandatory.
|
|
22
|
+
- Do not add generic defensive null checks, speculative abstractions/layers, fragmented one-use
|
|
23
|
+
micro-methods, or a constant that exists only to hold one getter return.
|
|
24
|
+
- Local, obvious magic values are allowed when they match surrounding code; create constants for
|
|
25
|
+
reuse, stable domain/config/protocol semantics, or established project convention.
|
|
26
|
+
- Every method and field in a new core Java class, and every added or materially modified method
|
|
27
|
+
or field in an existing core Java class, must have meaningful Javadoc; comment complex logic
|
|
28
|
+
where intent or constraints are not obvious.
|
|
18
29
|
- Treat acceptance criteria, test points, contracts, and risks in the card as required inputs.
|
|
19
30
|
- Run the exact targeted checks requested by the card and report their real outcome.
|
|
20
31
|
- Preserve each existing file's original encoding; never silently convert.
|
|
@@ -14,7 +14,12 @@ Stance:
|
|
|
14
14
|
- correctness -> does the implementation match the dev-spec requirement? edge cases,
|
|
15
15
|
null/empty handling, races, off-by-one.
|
|
16
16
|
- compliance -> does the code obey the RULES sections in the card? naming, format, comment
|
|
17
|
-
language, error handling.
|
|
17
|
+
language, error handling, and the evidenced Local Baseline.
|
|
18
|
+
- Do not request defensive null checks, abstraction, constant extraction, or legacy-wide comment
|
|
19
|
+
cleanup solely as generic best practice. Flag unjustified local-style deviations, speculative
|
|
20
|
+
layers, fragmented one-use micro-methods, constants created only for a getter return, and
|
|
21
|
+
missing Javadoc on any method/field in a new core Java class or any added/materially modified
|
|
22
|
+
method/field in an existing core Java class.
|
|
18
23
|
- error means a demonstrated acceptance, contract, security, or build failure. Use warning
|
|
19
24
|
for a credible risk and info for non-blocking maintainability advice.
|
|
20
25
|
|
|
@@ -85,9 +85,11 @@ initialization standard. Check each item:
|
|
|
85
85
|
and non-empty?
|
|
86
86
|
- **Project profile**: `project.yaml` exists with `mode` and `test` fields (ec-init owns it;
|
|
87
87
|
`config.yaml` is CLI-owned — not ec-init's concern)?
|
|
88
|
-
- **TDD runtime contract**: CLI-owned `config.yaml` has schema
|
|
89
|
-
`.easy-coding/tools/easy_coding_java_coverage.py`
|
|
90
|
-
|
|
88
|
+
- **TDD runtime contract**: CLI-owned `config.yaml` has schema 5 TDD defaults and both
|
|
89
|
+
`.easy-coding/tools/easy_coding_java_coverage.py` and
|
|
90
|
+
`.easy-coding/tools/easy_coding_tdd_readiness.py` exist? Missing fields or tools mean
|
|
91
|
+
`easy-coding upgrade` is required; ec-init must not repair them directly. Project-specific
|
|
92
|
+
JaCoCo/GitLab readiness remains owned by `ec-tdd-init`, not `ec-init`.
|
|
91
93
|
- **Platform hook config freshness**: for each installed platform in `.easy-coding/config.yaml`,
|
|
92
94
|
read the platform hook config and verify managed Easy Coding hook commands use the portable
|
|
93
95
|
relative hook launcher bound to this project root's `project.id`. If `project.id` is missing,
|
|
@@ -145,7 +147,14 @@ agent must be able to see what was generated and on what evidence.
|
|
|
145
147
|
- Naming conventions actually in use (scan representative files)
|
|
146
148
|
- Comment language: if more than 70% of existing comments are Chinese, the rule is
|
|
147
149
|
"comments in Chinese"; same logic for English; mixed → follow each file's dominant language
|
|
148
|
-
-
|
|
150
|
+
- Null/empty handling and error-handling style, including where the project intentionally
|
|
151
|
+
relies on upstream contracts instead of adding defensive checks
|
|
152
|
+
- Existing class/method extraction granularity and architecture boundaries; do not turn a
|
|
153
|
+
preference for single responsibility into a generic demand for many one-use helpers
|
|
154
|
+
- Literal and constant conventions, including when local magic values are accepted and when
|
|
155
|
+
a stable domain/config/protocol value is promoted to a named constant
|
|
156
|
+
- Javadoc/doc-comment coverage for core code and the inline-comment style used for complex logic
|
|
157
|
+
- Import ordering and formatter/linter in use (read their configs)
|
|
149
158
|
Structure as one section per language plus a General section. Every rule must be
|
|
150
159
|
mechanically checkable — "be clean" is not a rule; "exported functions carry explicit
|
|
151
160
|
return types" is.
|
|
@@ -159,7 +168,8 @@ agent must be able to see what was generated and on what evidence.
|
|
|
159
168
|
you verified exist (read package.json scripts or equivalent — do not guess).
|
|
160
169
|
If effective TDD is disabled, do not inspect JaCoCo or GitLab and do not add TDD-specific
|
|
161
170
|
requirements. If it is enabled for Java, additionally document JUnit/JaCoCo commands,
|
|
162
|
-
production/test source roots, XML report paths,
|
|
171
|
+
production/test source roots, XML report paths, the local acceptance gate, and the generated
|
|
172
|
+
GitLab TEST-stage job as non-blocking automation infrastructure.
|
|
163
173
|
5. **Memory migration probe** — Check for old-format memory files:
|
|
164
174
|
- `.easy-coding/memory/long/MEMORY.md` exists but lacks `memory_schema: 2` frontmatter
|
|
165
175
|
- `.easy-coding/memory/long/BUSINESS.md` or `TECHNICAL.md` missing
|
|
@@ -188,7 +198,9 @@ agent must be able to see what was generated and on what evidence.
|
|
|
188
198
|
- TEST_STRATEGY.md (skeleton for the chosen framework)
|
|
189
199
|
3. **Skip ABSTRACT.md** — no architecture exists yet. Note in init_log:
|
|
190
200
|
"ABSTRACT pending; ec-memory backfills after the first substantive task." (ec-memory
|
|
191
|
-
detects the missing file during MEMORY and
|
|
201
|
+
detects the missing file during MEMORY and uses the explicit `missing-abstract` assessment
|
|
202
|
+
exception to generate it from the then-current code. This one-time backfill does not enable
|
|
203
|
+
routine per-task architecture updates.)
|
|
192
204
|
4. Memory migration probe and memory init, same as iterative steps 5-7.
|
|
193
205
|
5. Recommend: design first with `{{skill_trigger}}ec-brainstorming`, then build via
|
|
194
206
|
`{{skill_trigger}}ec-workflow`.
|
|
@@ -49,17 +49,22 @@ automatic edges. A validated read-only `doc` / `analysis` / `report` task also a
|
|
|
49
49
|
from IMPLEMENT after its full deliverable is shown, without REVIEW, VERIFICATION, MEMORY, or
|
|
50
50
|
task memory. Approval mode controls non-mechanical edge waiting: approve confirms each edge,
|
|
51
51
|
guard confirms two critical gates, confirm waits only at ANALYSIS -> IMPLEMENT, and auto
|
|
52
|
-
advances every legal edge after mechanical gates.
|
|
52
|
+
advances every legal edge after mechanical gates. After green VERIFICATION, Harness freezes an
|
|
53
|
+
acceptance checkpoint. A later code diff temporarily pauses every mode so the exact digest can be
|
|
54
|
+
accepted; unchanged `confirm`/`auto` tasks remain automatic.
|
|
53
55
|
Workflow mode is independently configured as adaptive/fast/standard/strict; ANALYSIS freezes
|
|
54
56
|
adaptive to a concrete mode, and every new code task still enters REVIEW. REVIEW evidence is
|
|
55
57
|
bound to the final implementation fingerprint, VERIFICATION evidence is bound to implementation
|
|
56
|
-
and config fingerprints, and
|
|
58
|
+
and config fingerprints, and an accepted post-checkpoint diff records its authorization plus
|
|
59
|
+
carry-forward/targeted/waived policy without forcing a second REVIEW. MEMORY keeps the conditional
|
|
60
|
+
long-memory threshold gate.
|
|
57
61
|
|
|
58
62
|
Java TDD is a third independent, default-off control managed by `ec-config`. Session overrides
|
|
59
63
|
project configuration; ANALYSIS freezes enabled state and the 1..100 changed-line threshold
|
|
60
64
|
(default 90) on entry to IMPLEMENT. Disabled TDD changes no ordinary workflow test depth. Enabled
|
|
61
|
-
TDD adds lifecycle evidence, a TDD review dimension,
|
|
62
|
-
GitLab TEST-stage
|
|
65
|
+
TDD adds lifecycle evidence, a TDD review dimension, passed local unit-test evidence, and a local
|
|
66
|
+
JaCoCo diff gate. `ec-tdd-init` still generates the equivalent GitLab TEST-stage job, but remote
|
|
67
|
+
pipeline execution and status are not Harness acceptance dependencies.
|
|
63
68
|
|
|
64
69
|
The active task pointer lives in `sessions/{agent}-{session-id}.json` (with an agent-prefixed PPID fallback only
|
|
65
70
|
when a hook payload has no logical session ID);
|
|
@@ -77,35 +82,45 @@ stage in `task.json`; no data is lost. Each task folder is self-contained.
|
|
|
77
82
|
Each task is a folder. `task.json` is metadata, including the current stage, workflow proposal,
|
|
78
83
|
frozen concrete mode, and any `pending_transition`; `dev-spec.md` is the human-readable plan;
|
|
79
84
|
`execution.jsonl` is an append-only plan-and-log (one `plan` record, then `dispatch`/`result`
|
|
80
|
-
/`review`/`verify`/`handoff` records). Because plan and log live on disk, not in an agent's
|
|
85
|
+
/`review`/`verify`/`acceptance`/`handoff` records). Because plan and log live on disk, not in an agent's
|
|
81
86
|
context window, a task survives session end and agent switches with zero information loss.
|
|
82
87
|
|
|
83
88
|
## Canonical Spec integration
|
|
84
89
|
|
|
85
|
-
An `easy-dev-spec/v1` Canonical Spec
|
|
90
|
+
An `easy-dev-spec/v1` Canonical Spec separates frozen static design from a shared execution ledger.
|
|
86
91
|
`inspect-dev-spec` validates the document with the protocol implementation pinned from
|
|
87
92
|
`easy-dev-spec@7eb9b64`; after explicit task selection, `select-dev-spec-scope` returns one
|
|
88
93
|
deterministic producer-compatible closure per repository, and `create-task-from-spec` creates one
|
|
89
|
-
Harness task with
|
|
94
|
+
Harness task with source locator mode, ID/design revision and digest, document digest, execution
|
|
95
|
+
revision, selected task IDs, repository bindings,
|
|
90
96
|
baseline classifications, and dependency evidence.
|
|
91
97
|
|
|
92
98
|
ANALYSIS derives local `dev-spec.md`, `execution.jsonl`, and `test-strategy.md` for the selected
|
|
93
99
|
consumption closure. Canonical-backed units keep repository, source task/steps, files, symbols,
|
|
94
100
|
and test commands. Hard dependencies shape the Unit DAG, READY contracts can run in parallel,
|
|
95
|
-
and integration dependencies block end-to-end completion until evidence is recorded.
|
|
96
|
-
|
|
101
|
+
and integration dependencies block end-to-end completion until evidence is recorded. Harness
|
|
102
|
+
keeps detailed evidence locally and projects cross-application Task/Step/dependency outcomes into
|
|
103
|
+
`EDS:EXECUTION` through one CAS/idempotent writer. Static changes use revision + READY +
|
|
104
|
+
`sync-spec-design`; agents never hand-edit the machine ledger. Explicit external locators are
|
|
105
|
+
allowed and rebind only by exact Canonical identity. Source tasks stay `implemented` after local
|
|
106
|
+
checks and become `verified` only when VERIFICATION -> MEMORY is applied under explicit or
|
|
107
|
+
standing approval-mode authorization; the shared event includes the acceptance digest.
|
|
97
108
|
|
|
98
109
|
## Memory system
|
|
99
110
|
|
|
100
111
|
Short memory: one schema-v2 file per task, sliding window (max 10, keep 5). Long memory:
|
|
101
112
|
three files (index + business + technical), distilled from out-of-window short memories with
|
|
102
|
-
explicit conflict resolution.
|
|
103
|
-
|
|
113
|
+
explicit conflict resolution. Daily tasks only produce facts. When distillation runs, MEMORY
|
|
114
|
+
performs a separate, default-no-op architecture assessment and updates only affected ABSTRACT
|
|
115
|
+
sections when frozen evidence proves the architecture cognition is stale. A missing ABSTRACT
|
|
116
|
+
after the first substantive startup task is the only non-distillation backfill exception.
|
|
104
117
|
|
|
105
118
|
## Project knowledge — four layers
|
|
106
119
|
|
|
107
120
|
Identity (SOUL, rarely changes) · Constraints (RULES, stable) · Cognition (ABSTRACT, updated
|
|
108
|
-
|
|
121
|
+
only after evidence-backed architecture assessment) · Memory (short every task, long only on
|
|
122
|
+
distillation). Stable convention changes become RULES candidates in technical memory, never
|
|
123
|
+
silent RULES edits. ec-workflow always reads
|
|
109
124
|
SOUL + RULES + recent short memory; ec-analysis loads ABSTRACT and matching long memory on
|
|
110
125
|
demand.
|
|
111
126
|
|
|
@@ -14,7 +14,7 @@ What lives in each platform directory and how the three platforms differ.
|
|
|
14
14
|
| Sub-agent defs | `.claude/agents/*.md` | `.codex/agents/*.toml` | `.qoder/agents/*.md` |
|
|
15
15
|
| CN variant | — | — | `.qodercn/` |
|
|
16
16
|
|
|
17
|
-
Each skill is installed as `{skills-dir}/ec-{name}/SKILL.md`. The
|
|
17
|
+
Each skill is installed as `{skills-dir}/ec-{name}/SKILL.md`. The 15 skills are
|
|
18
18
|
platform-agnostic — one template, resolved per platform at write time. The agent's native
|
|
19
19
|
discovery surfaces them under `/ec-` or `$ec-`.
|
|
20
20
|
|
|
@@ -21,13 +21,25 @@ Communicate with the user in the user's language.
|
|
|
21
21
|
4. Inspect concrete code paths and tests. Expand context only when evidence reveals another
|
|
22
22
|
dependency or risk.
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
Apply a progressive cost budget while doing this work. A likely Fast task reads only the nearest
|
|
25
|
+
comparable implementation, its direct contracts, and targeted tests. Standard reads the affected
|
|
26
|
+
module closure. Expand into cross-module or repository-wide context only after concrete evidence
|
|
27
|
+
shows the compound high-risk and complexity signals required for Strict. Do not scan unrelated
|
|
28
|
+
repositories, the full Spec, broad Git history, or every architecture section merely to prove
|
|
29
|
+
that a bounded task might be complicated.
|
|
30
|
+
|
|
31
|
+
For a task with `task.json.spec_source`, re-run `inspect-dev-spec` against the stored source, exact
|
|
32
|
+
`selected_spec_tasks`, and only their stored `task.repo_paths` bindings. Schema, Spec ID, design
|
|
33
|
+
revision, and `design_sha256` must still match. A changed `document_sha256` with the same design is
|
|
34
|
+
normal shared progress; refresh `execution_revision` without invalidating plan/review/verify
|
|
35
|
+
evidence. An execution revision rollback is blocking. Then call the selector once for the exact
|
|
36
|
+
selection:
|
|
27
37
|
|
|
28
38
|
```bash
|
|
29
39
|
{{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py inspect-dev-spec \
|
|
30
|
-
--spec <stored-source>
|
|
40
|
+
--spec <stored-source> \
|
|
41
|
+
--spec-task <selected-task-id> [--spec-task <selected-task-id>]... \
|
|
42
|
+
[--repo-path <repo-id>=<stored-path>]...
|
|
31
43
|
|
|
32
44
|
{{PYTHON_CMD}} {{platform_config_dir}}/hooks/easy_coding_state.py select-dev-spec-scope \
|
|
33
45
|
--spec <stored-source> --spec-task <selected-task-id> [--spec-task <selected-task-id>]...
|
|
@@ -36,19 +48,66 @@ must still match. Then call the read-only selector for the exact stored selectio
|
|
|
36
48
|
Load only the returned per-repository consumption closures: manifest/global context, selected
|
|
37
49
|
task and repository sections, related contracts, direct dependency summaries, selected
|
|
38
50
|
changes/steps/tests, and relevant integration rows. Never replace the selector with a whole-file
|
|
39
|
-
read.
|
|
40
|
-
|
|
51
|
+
read. Treat the Canonical closure as frozen design, not as a prompt to design the task again:
|
|
52
|
+
|
|
53
|
+
- `exact` and `scope-unchanged` use the fast projection path. Confirm the selected paths, symbols,
|
|
54
|
+
and test entry points, then map the closure into Units, `test-strategy.md`, and the derived
|
|
55
|
+
`dev-spec.md` in one pass. Do not reselect interfaces, fields, task boundaries, Steps, or Tests,
|
|
56
|
+
and do not ask questions already answered by the source Spec.
|
|
57
|
+
- `scope-drifted` reads and analyzes only changed files and symbols in the selected task scope.
|
|
58
|
+
Escalate to a static design revision only when that evidence changes a frozen contract or task
|
|
59
|
+
boundary; unrelated repository or completed-task changes are background, not current drift.
|
|
60
|
+
- `baseline-unavailable` or unresolved selected-repository identity remains blocked in ANALYSIS.
|
|
61
|
+
|
|
62
|
+
Use shared execution dependency status directly. Do not inspect another local Harness task or Git
|
|
63
|
+
history to re-prove a completed hard dependency, and do not repeat dependency or baseline
|
|
64
|
+
explanations after the selected inspection has recorded them.
|
|
65
|
+
|
|
66
|
+
## Local implementation baseline
|
|
67
|
+
|
|
68
|
+
For every code unit, inspect the nearest same-module, same-role implementation before planning.
|
|
69
|
+
Record a concise `local_baseline` covering only evidenced conventions that affect this change:
|
|
70
|
+
naming and control flow, null/empty and error handling, layering and dependency direction, object
|
|
71
|
+
modeling, method extraction granularity, literal/constant usage, and comments/Javadoc. Prefer the
|
|
72
|
+
closest comparable code over a repository-wide average. Explicit requirements, correctness,
|
|
73
|
+
security, and project hard rules still take precedence; otherwise do not replace safe local
|
|
74
|
+
conventions with generic best practices.
|
|
75
|
+
|
|
76
|
+
Do not ask the user to choose a style already answered consistently by comparable code. Ask only
|
|
77
|
+
when local evidence conflicts or a deviation can change the contract, risk, or acceptance result.
|
|
41
78
|
|
|
42
79
|
## Analysis artifacts
|
|
43
80
|
|
|
44
81
|
Copy `.easy-coding/templates/dev-spec-skeleton.md` first, then replace every `[[EC_TODO:...]]`.
|
|
45
|
-
Keep every mandatory section. `### Workflow Mode`
|
|
82
|
+
Keep every mandatory section. The `### 决策闭环` (Decision Closure) and `### Workflow Mode`
|
|
83
|
+
sections are required. The decision section must contain exactly one standalone
|
|
84
|
+
`decision_status: closed` marker, and no other `decision_status` marker may appear elsewhere in
|
|
85
|
+
the document. Record every material question and its resolved conclusion in that section, or
|
|
86
|
+
record that no extra decision was needed.
|
|
87
|
+
|
|
88
|
+
## Decision closure before implementation
|
|
89
|
+
|
|
90
|
+
Treat uncertainty that can change the technical route, public or internal contract, data model,
|
|
91
|
+
state flow, edit scope, compatibility behavior, or acceptance criteria as a material open
|
|
92
|
+
question. While any such question remains:
|
|
93
|
+
|
|
94
|
+
1. stay in ANALYSIS and ask the user focused questions, preferably one decision at a time;
|
|
95
|
+
2. do not present a final analysis summary, propose the final Workflow Mode, request
|
|
96
|
+
ANALYSIS -> IMPLEMENT, or suggest that implementation can begin;
|
|
97
|
+
3. update the Dev-Spec with each confirmed answer and its evidence;
|
|
98
|
+
4. use `decision_status: open` while the artifact is still being developed, then replace it with
|
|
99
|
+
the single `decision_status: closed` marker only after every material question is resolved.
|
|
100
|
+
|
|
101
|
+
Risks, integration work that is intentionally deferred by a frozen Spec, and environmental
|
|
102
|
+
verification limits are not automatically open questions. Describe them as risks or explicit
|
|
103
|
+
acceptance boundaries. Never use `closed` to hide a decision that still needs the user.
|
|
46
104
|
|
|
47
105
|
Execution plan records use:
|
|
48
106
|
|
|
49
107
|
```json
|
|
50
108
|
{
|
|
51
109
|
"type": "plan",
|
|
110
|
+
"spec_design_sha256": "<Canonical design digest; omit for ordinary tasks>",
|
|
52
111
|
"strategy": "single|sequential|parallel",
|
|
53
112
|
"units": [{
|
|
54
113
|
"id": "U1",
|
|
@@ -62,6 +121,7 @@ Execution plan records use:
|
|
|
62
121
|
"test_points": ["targeted check"],
|
|
63
122
|
"contracts": ["input/output/invariant or none"],
|
|
64
123
|
"risks": ["known risk or none"],
|
|
124
|
+
"local_baseline": ["evidenced local convention and source path"],
|
|
65
125
|
"repo_id": "R1",
|
|
66
126
|
"source_task_id": "R1-T1",
|
|
67
127
|
"source_step_ids": ["S1"],
|
|
@@ -78,26 +138,39 @@ units together must cover every source step exactly once. Map selected hard depe
|
|
|
78
138
|
`parallel_groups`.
|
|
79
139
|
|
|
80
140
|
Canonical-backed `dev-spec.md`, `execution.jsonl`, and `test-strategy.md` are runtime-derived
|
|
81
|
-
evidence, not a second maintained Spec. Record the source path/ID/revision
|
|
141
|
+
evidence, not a second maintained Spec. Record the source path/path mode/ID/design revision and
|
|
142
|
+
digest, current document digest/execution revision/writeback status, selected tasks
|
|
82
143
|
and repositories, baseline/conflict result, Unit mapping, source test mapping, and pending
|
|
83
144
|
integration edges.
|
|
84
145
|
|
|
146
|
+
The required skeleton is a mechanical artifact schema. For a Canonical-backed task it is filled
|
|
147
|
+
from the selected closure and current-code delta; it must never become a second round of Spec
|
|
148
|
+
authoring.
|
|
149
|
+
|
|
85
150
|
Every source test command remains mandatory. Additional commands from the current repository are
|
|
86
151
|
allowed only when `test-strategy.md` records why the Canonical command alone is insufficient.
|
|
87
152
|
For every selected source test, `test-strategy.md` must spell out its Test ID, source task ID,
|
|
88
153
|
owning Unit ID, repository-relative test file, and exact Canonical command; the state gate checks
|
|
89
154
|
these markers mechanically.
|
|
90
155
|
|
|
91
|
-
Prefer one coherent unit over artificial file-level splitting.
|
|
92
|
-
|
|
156
|
+
Prefer one coherent unit over artificial file-level splitting. Do not split a class or method by
|
|
157
|
+
line count, or create many one-use helpers, merely to make the plan look modular. Extract only a
|
|
158
|
+
clear semantic boundary, reuse point, or independently testable responsibility. Use parallel only
|
|
159
|
+
for truly independent write scopes. Better unit contracts reduce later REVIEW rework.
|
|
93
160
|
|
|
94
161
|
Code tasks require `test-strategy.md`; explicit `doc`, `analysis`, and `report` tasks do not.
|
|
95
162
|
|
|
96
163
|
## Optional Java TDD analysis
|
|
97
164
|
|
|
98
165
|
Read `effective_tdd_enabled` and `effective_tdd_coverage_threshold` from the state snapshot.
|
|
166
|
+
For a `type=tdd-init` task, treat frozen TDD as off even if the project/session requests it. That
|
|
167
|
+
task is the sole exception allowed to inspect and plan build/CI coverage infrastructure while TDD
|
|
168
|
+
is off. Its scope is infrastructure only: never plan historical business-test backfill or a
|
|
169
|
+
repository-wide coverage target, and explicitly record `coverage scope: changed production lines`.
|
|
170
|
+
|
|
99
171
|
When TDD is disabled, stop here: do not inspect GitLab CI or JaCoCo, do not add TDD fields or
|
|
100
|
-
extra tests, and do not strengthen the selected Workflow Mode's ordinary acceptance depth.
|
|
172
|
+
extra tests, and do not strengthen the selected Workflow Mode's ordinary acceptance depth. This
|
|
173
|
+
zero-cost rule applies to ordinary tasks, not the explicit `tdd-init` infrastructure task above.
|
|
101
174
|
|
|
102
175
|
When TDD is enabled for a Java code task, make `test-strategy.md` record:
|
|
103
176
|
|
|
@@ -107,18 +180,24 @@ When TDD is enabled for a Java code task, make `test-strategy.md` record:
|
|
|
107
180
|
toward 100% while treating the threshold as the mechanical minimum;
|
|
108
181
|
- feature/bug RED -> GREEN -> REFACTOR evidence, or for pure refactors a pre-change
|
|
109
182
|
characterization GREEN -> post-change GREEN sequence without inventing a RED failure;
|
|
110
|
-
-
|
|
111
|
-
|
|
112
|
-
|
|
183
|
+
- the local unit-test command and local changed-line acceptance command. Record that
|
|
184
|
+
`ec-tdd-init` generated the GitLab TEST-stage job, but remote execution, pipeline identity, and
|
|
185
|
+
status are non-blocking and never require an intermediate commit or push. Include these exact,
|
|
186
|
+
language-independent contract markers: `local_test_gate: required` and
|
|
187
|
+
`remote_ci_acceptance: non-blocking`.
|
|
188
|
+
- current `tdd_readiness_status=ready`; if missing or drifted, stop before IMPLEMENT and route to
|
|
189
|
+
`ec-tdd-init`. Never plan to initialize CI inside an already-enabled TDD feature task.
|
|
113
190
|
|
|
114
191
|
The state API mechanically freezes current Git `HEAD` per repository into `task.tdd_baselines`
|
|
115
|
-
when ANALYSIS advances to IMPLEMENT. Plan
|
|
116
|
-
|
|
117
|
-
|
|
192
|
+
when ANALYSIS advances to IMPLEMENT. Plan the local command with that exact SHA and the frozen
|
|
193
|
+
threshold. The generated GitLab job remains parameterized for infrastructure parity, but the
|
|
194
|
+
Harness acceptance plan never waits for remote CI. Never use a mutable `HEAD` fallback at
|
|
195
|
+
verification time. Non-Canonical TDD is limited to one Git repository; multi-repository TDD must
|
|
196
|
+
use Canonical repository bindings.
|
|
118
197
|
|
|
119
198
|
Also append a `### TDD Mode` section to `dev-spec.md` with enabled state, frozen threshold,
|
|
120
|
-
baseline, local gate,
|
|
121
|
-
is disabled.
|
|
199
|
+
baseline, local unit-test gate, local coverage gate, generated GitLab job as non-blocking
|
|
200
|
+
infrastructure, and lifecycle evidence. Do not add this section when TDD is disabled.
|
|
122
201
|
|
|
123
202
|
If the task is not a Java project, explain that Java-only TDD cannot be activated and obtain a
|
|
124
203
|
mode decision before advancing. The CLI never installs JaCoCo or edits CI automatically.
|
|
@@ -140,19 +219,30 @@ Use its `minimum_mode` and `reasons` as the proposal floor. You may raise this r
|
|
|
140
219
|
uncertainty or user preference requires more rigor, but never lower or replace it with a
|
|
141
220
|
self-reported floor. The state API rechecks the floor when the proposal is saved and frozen.
|
|
142
221
|
|
|
143
|
-
The calculation
|
|
144
|
-
|
|
145
|
-
- `fast`: one
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
- `
|
|
150
|
-
|
|
151
|
-
|
|
222
|
+
The calculation is intentionally Standard-centered:
|
|
223
|
+
|
|
224
|
+
- `fast`: one coherent, non-parallel unit in one actually modified repository, at most five
|
|
225
|
+
changed files, no explicit high-risk signal, and no public or cross-repository contract impact.
|
|
226
|
+
Small parameter changes, bounded field/mapping edits, and a few ordinary model files should
|
|
227
|
+
normally remain Fast.
|
|
228
|
+
- `standard`: the default for ordinary business work. Multiple units/files, bounded compatibility
|
|
229
|
+
work, actual but contained multi-repository changes, broad low-risk work, and bounded high-risk
|
|
230
|
+
work remain Standard.
|
|
231
|
+
- `strict`: requires both an explicit high-risk signal and concrete complexity/blast-radius
|
|
232
|
+
evidence. Complexity means actual multi-repository edits, at least four units, at least ten
|
|
233
|
+
changed files, or a public/cross-repository contract. Parallel execution is a Standard signal
|
|
234
|
+
by itself. Generic domain words in a risk description, title, file path, Spec repository
|
|
235
|
+
catalog, or unselected task are never sufficient evidence of high risk.
|
|
236
|
+
|
|
237
|
+
Repository count comes only from repositories that own files in current plan units. Canonical
|
|
238
|
+
Spec metadata, unselected tasks, dependency summaries, unused `repo_paths`, and supermodule child
|
|
239
|
+
registrations do not raise the mode. A real multi-repository change is a Standard signal by
|
|
240
|
+
itself and reaches Strict only when an explicit high-risk signal is also present.
|
|
152
241
|
|
|
153
242
|
If configuration is concrete, it is also a floor. The selected mode may be raised by the user
|
|
154
|
-
but never placed below either floor.
|
|
155
|
-
|
|
243
|
+
but never placed below either floor. The Agent must not raise an adaptive proposal to Strict from
|
|
244
|
+
vague uncertainty or a domain keyword; cite both the explicit risk and the concrete complexity
|
|
245
|
+
signal. Explain the decision and state-specific effects in the dev-spec.
|
|
156
246
|
|
|
157
247
|
Persist the proposal before requesting ANALYSIS -> IMPLEMENT:
|
|
158
248
|
|
|
@@ -171,14 +261,22 @@ while still in ANALYSIS.
|
|
|
171
261
|
|
|
172
262
|
## User presentation and transition
|
|
173
263
|
|
|
174
|
-
|
|
264
|
+
After decision closure and before the boundary, present a concise session summary instead of
|
|
265
|
+
pasting the full `dev-spec.md`. The summary must contain:
|
|
175
266
|
|
|
176
|
-
-
|
|
177
|
-
- acceptance and test
|
|
267
|
+
- the core solution and affected scope/units;
|
|
268
|
+
- acceptance and test-strategy highlights;
|
|
178
269
|
- configured, minimum, and selected workflow modes with reasons;
|
|
179
|
-
-
|
|
270
|
+
- the material risks and explicit acceptance boundaries;
|
|
180
271
|
- explicit user ability to request a higher mode or a permitted lower mode.
|
|
181
272
|
|
|
273
|
+
End the summary with the absolute path to
|
|
274
|
+
`.easy-coding/tasks/<task-id>/dev-spec.md`. When the current client supports local-file Markdown
|
|
275
|
+
links, render `[View full Dev-Spec](</absolute/path/to/dev-spec.md>)`; otherwise print the
|
|
276
|
+
copyable absolute path. Do not dump the full artifact merely because the client cannot link it.
|
|
277
|
+
If the user asks to inspect the full plan, open or read that stored file on demand using the
|
|
278
|
+
current Agent's supported file capability.
|
|
279
|
+
|
|
182
280
|
Then request or auto-apply ANALYSIS -> IMPLEMENT according to `effective_approval_mode`.
|
|
183
281
|
The state API atomically freezes the proposal when the transition is applied. `approval_mode`
|
|
184
282
|
controls waiting; it never changes the selected execution depth.
|
|
@@ -189,6 +287,14 @@ controls waiting; it never changes the selected execution depth.
|
|
|
189
287
|
- No unresolved skeleton placeholders.
|
|
190
288
|
- No code task with an empty change scope.
|
|
191
289
|
- No unit without acceptance criteria, test points, contracts, and risks.
|
|
290
|
+
- No final summary, workflow proposal, or transition while a material decision is unresolved.
|
|
291
|
+
- No transition without exactly one `decision_status: closed` marker in `dev-spec.md`.
|
|
192
292
|
- No transition without a valid workflow proposal.
|
|
193
|
-
- No Canonical-backed transition with changed
|
|
293
|
+
- No Canonical-backed transition with changed design revision/digest, a backward execution
|
|
294
|
+
revision, pending/conflicted writeback, unresolved repository identity,
|
|
194
295
|
incomplete selected-task coverage, or an open Unit/Step/File/Symbol/Test traceability gap.
|
|
296
|
+
|
|
297
|
+
If evidence requires changing Canonical task boundaries, contracts, files, symbols, Steps, Tests,
|
|
298
|
+
or dependencies, remain/return to ANALYSIS, update the original static design with revision +1,
|
|
299
|
+
restore READY, and call `sync-spec-design --affected-task ...`. This invalidates the old local
|
|
300
|
+
plan. Never substitute edits to the derived `dev-spec.md`, and never edit `EDS:EXECUTION` by hand.
|
|
@@ -18,17 +18,32 @@ Call `snapshot` and show project, session, effective, and frozen task values for
|
|
|
18
18
|
|
|
19
19
|
Use the returned fields directly, including `project_tdd_enabled`, `session_tdd_enabled`,
|
|
20
20
|
`effective_tdd_enabled`, their threshold counterparts, `task_tdd_enabled`, and the task's
|
|
21
|
-
per-repository `task_tdd_baselines` frozen state.
|
|
21
|
+
per-repository `task_tdd_baselines` frozen state. When `tdd_readiness_status=not_checked` because
|
|
22
|
+
TDD is off, explicitly run the read-only readiness command below before showing readiness:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
python3 .easy-coding/tools/easy_coding_tdd_readiness.py --cwd . check
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
This explicit configuration-panel check is the only disabled-mode readiness scan; ordinary hooks
|
|
29
|
+
must not inspect build or CI files while TDD is off.
|
|
22
30
|
|
|
23
31
|
Explain precedence as `session override > project config > defaults`. Defaults are Approval
|
|
24
32
|
`guard`, Workflow `adaptive`, TDD disabled, and TDD changed-line coverage threshold 90%. An active
|
|
25
33
|
task freezes its effective TDD values when ANALYSIS advances to IMPLEMENT; later project/session
|
|
26
34
|
changes affect future tasks and ANALYSIS only.
|
|
27
35
|
|
|
36
|
+
Approval semantics stay independent from verification depth: `approve` waits at each
|
|
37
|
+
non-mechanical edge, `guard` waits at ANALYSIS -> IMPLEMENT and VERIFICATION -> MEMORY, `confirm`
|
|
38
|
+
waits only for the plan, and `auto` advances legal green edges immediately. Every mode temporarily
|
|
39
|
+
pauses only when code changes after the frozen VERIFICATION checkpoint, because the user must see
|
|
40
|
+
and accept that exact new diff; this exception does not convert `auto` into `guard`.
|
|
41
|
+
|
|
28
42
|
## Project configuration
|
|
29
43
|
|
|
30
44
|
Use `easy-coding config` for project settings. The CLI confirms one atomic update of Approval,
|
|
31
45
|
Workflow, TDD, and (when enabled) the threshold. The threshold must be an integer from 1 to 100.
|
|
46
|
+
Enabling TDD is rejected atomically unless `ec-tdd-init` readiness is currently `ready`.
|
|
32
47
|
|
|
33
48
|
## Session configuration
|
|
34
49
|
|
|
@@ -51,4 +66,11 @@ After explicit user selection, use the current logical session file:
|
|
|
51
66
|
Turning TDD off must preserve the existing Fast/Standard/Strict test depth exactly: do not inspect
|
|
52
67
|
CI, request JaCoCo, add TDD artifacts, run coverage commands, or strengthen acceptance criteria.
|
|
53
68
|
When TDD is on, explain that it applies only to Java code tasks and activates RED/GREEN/REFACTOR,
|
|
54
|
-
TDD review, local
|
|
69
|
+
TDD review, a passed local unit-test gate, and local changed-line JaCoCo coverage. `ec-tdd-init`
|
|
70
|
+
still generates the GitLab TEST-stage job, but Harness does not wait for or record remote pipeline
|
|
71
|
+
results as acceptance evidence.
|
|
72
|
+
|
|
73
|
+
Before any project/session enable action, require `tdd_readiness_status=ready`. If it is not ready,
|
|
74
|
+
offer only `ec-tdd-init` or cancellation; never offer or persist "enable now, initialize later".
|
|
75
|
+
Readiness means infrastructure can measure future changed production lines. It does not certify
|
|
76
|
+
repository-wide coverage and does not require tests for unchanged historical code.
|
|
@@ -62,7 +62,13 @@ with `.easy-coding/sessions/` always excluded. The CLI already added it to `.git
|
|
|
62
62
|
- Do not commit `spec/dev/` unless the user explicitly asks.
|
|
63
63
|
- Do not omit managed `easy-coding upgrade` changes merely because they were created outside
|
|
64
64
|
the current agent turn.
|
|
65
|
-
-
|
|
65
|
+
- Shared Canonical execution writeback and Git delivery are independent facts. Do not stage or
|
|
66
|
+
commit a project-external Spec automatically. For a Spec inside a Git repository, include it
|
|
67
|
+
only when the user's requested commit scope and normal repository rules include it; never claim
|
|
68
|
+
shared writeback merely because Git succeeded, or Git delivery merely because writeback
|
|
69
|
+
succeeded.
|
|
70
|
+
- Never hand-edit `EDS:EXECUTION`. Static Spec changes are valid only through design revision +
|
|
71
|
+
READY + `sync-spec-design`; runtime progress uses the shared writer commands.
|
|
66
72
|
- In a supermodule task launched from the parent root, parent `.easy-coding/` belongs to the
|
|
67
73
|
parent git. Child `.easy-coding/memory/` changes created by memory archive belong to the
|
|
68
74
|
owning child git and must be committed before the parent gitlink update.
|