@surlymochan/evalid 0.0.0-stage → 0.4.1
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 +94 -0
- package/LICENSE +21 -0
- package/README.md +315 -2
- package/RELEASE_NOTES.md +124 -0
- package/atoms/registry.json +758 -0
- package/bin/xflow.js +7261 -0
- package/docs/adoption/README.md +128 -0
- package/docs/adoption/openflow-release-hardening.md +61 -0
- package/docs/benchmark-openflow-vs-gstack-superpowers-openspec-2026-05-25.md +81 -0
- package/docs/compatibility.md +52 -0
- package/docs/competitive-benchmark.md +108 -0
- package/docs/corps-operator-guide.md +75 -0
- package/docs/demo-proof.md +126 -0
- package/docs/examples-gallery.md +115 -0
- package/docs/fixtures/tracker-item.json +7 -0
- package/docs/goal-vs-codex.md +129 -0
- package/docs/gstack-comparison.md +88 -0
- package/docs/install-upgrade.md +133 -0
- package/docs/integrations.md +49 -0
- package/docs/launch-demo.md +123 -0
- package/docs/launch-dossier.md +180 -0
- package/docs/methodology.md +149 -0
- package/docs/npm-publish-handoff.md +96 -0
- package/docs/openspec-migration.md +106 -0
- package/docs/public-benchmark.md +68 -0
- package/docs/public-release.md +145 -0
- package/docs/quality-assessment.md +139 -0
- package/docs/quickstart.md +156 -0
- package/docs/reviewer-guide.md +43 -0
- package/docs/spec-kit-benchmark.md +73 -0
- package/docs/super-assistant-comparison.md +106 -0
- package/docs/superpowers-comparison.md +82 -0
- package/docs/team-adoption.md +123 -0
- package/docs/tooling-matrix.md +91 -0
- package/docs/walkthrough.md +76 -0
- package/docs/workflow-manual.md +1130 -0
- package/package.json +83 -4
- package/prompts/pencil-draft.md +46 -0
- package/prompts/pencil-refine.md +46 -0
- package/prompts/phase-artifact.md +24 -0
- package/prompts/phase-execution.md +32 -0
- package/schemas/competitor-reconstruction-contract.schema.json +91 -0
- package/schemas/llm-design-review-aggregate.schema.json +83 -0
- package/schemas/visual-benchmark.schema.json +978 -0
- package/schemas/workflow.schema.json +100 -0
- package/scripts/run-tests.mjs +23 -0
- package/scripts/takein_digest.py +139 -0
- package/specs/README.md +118 -0
- package/specs/architecture.md +36 -0
- package/specs/product.md +33 -0
- package/specs/workflow.md +349 -0
- package/src/agent_team/atoms/codex-app-bridge.js +8 -0
- package/src/agent_team/atoms/design/competitor-reconstruction-review.js +44 -0
- package/src/agent_team/atoms/design/contract-freeze.js +8 -0
- package/src/agent_team/atoms/design/generation-contract.js +442 -0
- package/src/agent_team/atoms/design/reconstruction-pack.js +246 -0
- package/src/agent_team/atoms/design/reference-surface-lock.js +49 -0
- package/src/agent_team/atoms/patch-challenge.js +19 -0
- package/src/agent_team/atoms/pencil/accept.js +9 -0
- package/src/agent_team/atoms/pencil/draft.js +365 -0
- package/src/agent_team/atoms/pencil/refine.js +229 -0
- package/src/agent_team/atoms/phase-run-dispatch.js +8 -0
- package/src/agent_team/atoms/team-run.js +380 -0
- package/src/agent_team/atoms/visual/aesthetic-review.js +231 -0
- package/src/agent_team/atoms/visual/benchmark-repair-plan.js +291 -0
- package/src/agent_team/atoms/visual/benchmark.js +1652 -0
- package/src/agent_team/atoms/visual/design-selection.js +23 -0
- package/src/agent_team/atoms/visual/direction-synthesis.js +124 -0
- package/src/agent_team/atoms/visual/dom-rect-export.js +129 -0
- package/src/agent_team/atoms/visual/image-diff.js +186 -0
- package/src/agent_team/atoms/visual/layout-competition.js +8 -0
- package/src/agent_team/atoms/visual/page-evidence-capture.js +806 -0
- package/src/agent_team/atoms/visual/playwright-runtime.js +8 -0
- package/src/agent_team/atoms/visual/review-aggregate.js +87 -0
- package/src/agent_team/atoms/visual/review.js +77 -0
- package/src/agent_team/atoms/visual/visual-report.js +197 -0
- package/src/agent_team/atoms/visual/visual-token-export.js +417 -0
- package/src/agent_team/common.js +311 -0
- package/src/core/atoms/agent-invoke.js +684 -0
- package/src/core/atoms/event/ingest.js +30 -0
- package/src/core/atoms/experience/digest.js +55 -0
- package/src/core/atoms/gate/artifact-verify.js +83 -0
- package/src/core/atoms/gate/competitor-contract-validate.js +119 -0
- package/src/core/atoms/gate/evidence-collect.js +64 -0
- package/src/core/atoms/gate/payload-from-phase-run.js +78 -0
- package/src/core/atoms/gate/visual-benchmark-validate.js +183 -0
- package/src/core/atoms/gate/workbench.js +79 -0
- package/src/core/atoms/intake/classify.js +15 -0
- package/src/core/atoms/intake/design-skill-select.js +16 -0
- package/src/core/atoms/intake/preview-or-refine.js +19 -0
- package/src/core/atoms/intake/recommend.js +20 -0
- package/src/core/atoms/intake/research-same-category.js +19 -0
- package/src/core/atoms/intervention/create.js +30 -0
- package/src/core/atoms/memory/manage.js +27 -0
- package/src/core/atoms/memory/mount.js +13 -0
- package/src/core/atoms/mission/create.js +19 -0
- package/src/core/atoms/mission/list.js +14 -0
- package/src/core/atoms/mission/show.js +26 -0
- package/src/core/atoms/notify/checkpoint.js +46 -0
- package/src/core/atoms/phase-run/complete.js +42 -0
- package/src/core/atoms/phase-run/fail.js +40 -0
- package/src/core/atoms/phase-run/persist.js +39 -0
- package/src/core/atoms/phase-run/start.js +30 -0
- package/src/core/atoms/plugin/run.js +76 -0
- package/src/core/atoms/policy/gate.js +90 -0
- package/src/core/atoms/policy/resolve.js +11 -0
- package/src/core/atoms/storage/sync.js +57 -0
- package/src/core/atoms/workflow/advance.js +25 -0
- package/src/core/atoms/workflow/guard.js +127 -0
- package/src/core/atoms/workflow/state-load.js +37 -0
- package/src/core/bindings.js +37 -0
- package/src/core/change-artifacts.js +134 -0
- package/src/core/competitive-score.js +265 -0
- package/src/core/concurrency-policy.js +35 -0
- package/src/core/execution-log.js +108 -0
- package/src/core/intake-recommendation.js +134 -0
- package/src/core/memory-state.js +62 -0
- package/src/core/mission-state.js +780 -0
- package/src/core/pending-gates.js +66 -0
- package/src/core/phase-cost.js +116 -0
- package/src/core/phase-run-read.js +27 -0
- package/src/core/policy-overlay.js +180 -0
- package/src/core/state-store.js +201 -0
- package/src/core/workflow-executor.js +1014 -0
- package/src/core/workflow-integrity.js +111 -0
- package/src/core/workflow-loader.js +163 -0
- package/src/core/workflow-rerun.js +84 -0
- package/src/core/workflow-state.js +119 -0
- package/src/server.js +1307 -0
- package/workflows/corps.yaml +481 -0
- package/workflows/yolo.yaml +241 -0
- package/xflow/README.md +76 -0
- package/xflow/aha/SKILL.md +82 -0
- package/xflow/aha/scripts/append_aha.py +50 -0
- package/xflow/archive/scripts/archive_change.py +338 -0
- package/xflow/archive/templates/merge-design.md +54 -0
- package/xflow/archive/templates/merge-workflow.md +26 -0
- package/xflow/atoms/__init__.py +6 -0
- package/xflow/atoms/a1_issue_create_or_patch.py +70 -0
- package/xflow/atoms/a2_branch_create_and_link.py +42 -0
- package/xflow/atoms/a3_repo_doctor.py +11 -0
- package/xflow/atoms/a4_project_set_status.py +11 -0
- package/xflow/atoms/a5_archive_commit_push_close.py +11 -0
- package/xflow/atoms/a6_pr_create.py +72 -0
- package/xflow/atoms/b1_change_scaffold.py +11 -0
- package/xflow/atoms/b2_status_read.py +16 -0
- package/xflow/atoms/b2b_status_write.py +20 -0
- package/xflow/atoms/b3_status_transition.py +27 -0
- package/xflow/atoms/b4_handoff_scaffold_or_refresh.py +11 -0
- package/xflow/atoms/b5_aha_append.py +11 -0
- package/xflow/atoms/b6_takein_digest.py +11 -0
- package/xflow/atoms/b6b_lookback_digest.py +11 -0
- package/xflow/atoms/b7_change_mission_bind.py +43 -0
- package/xflow/atoms/c1_mem.py +54 -0
- package/xflow/atoms/e6_gate_local_precheck.py +23 -0
- package/xflow/atoms/h1_design_lite_gate.py +74 -0
- package/xflow/atoms/i6a_tdd_run.py +107 -0
- package/xflow/atoms/i6b_tdd_proof_validate.py +184 -0
- package/xflow/atoms/i6c_tdd_quality_review.py +372 -0
- package/xflow/atoms/j1_tests_run.py +129 -0
- package/xflow/atoms/j4a_spec_consistency_structural.py +105 -0
- package/xflow/atoms/j4b_spec_delta_review.py +316 -0
- package/xflow/atoms/j4c_openspec_migration_map.py +121 -0
- package/xflow/atoms/j4d_spec_clarify_gate.py +373 -0
- package/xflow/atoms/j6_cr_review.py +443 -0
- package/xflow/atoms/k1_artifacts_complete_check.py +39 -0
- package/xflow/atoms/k2_merge_snippets_apply.py +11 -0
- package/xflow/atoms/k3_handoff_refresh.py +14 -0
- package/xflow/atoms/k4_mem_lesson_persist.py +65 -0
- package/xflow/atoms/k5_archive_publish.py +21 -0
- package/xflow/atoms/k6_aha_merge.py +42 -0
- package/xflow/atoms/tdd_lib.py +956 -0
- package/xflow/corps/SKILL.md +109 -0
- package/xflow/exec/scripts/set_issue_in_progress.py +159 -0
- package/xflow/goal/SKILL.md +150 -0
- package/xflow/handoff/SKILL.md +95 -0
- package/xflow/handoff/scripts/scaffold_handoff.py +304 -0
- package/xflow/lookback/SKILL.md +66 -0
- package/xflow/lookback/scripts/lookback_digest.py +46 -0
- package/xflow/openissue/scripts/open_issue_flow.py +438 -0
- package/xflow/plan/SKILL.md +47 -0
- package/xflow/ralph/SKILL.md +123 -0
- package/xflow/scripts/check_installed_xflow_skill_sync.sh +44 -0
- package/xflow/scripts/common.py +483 -0
- package/xflow/scripts/doctor.py +278 -0
- package/xflow/scripts/sync_installed_xflow_skill.sh +134 -0
- package/xflow/takein/SKILL.md +81 -0
- package/xflow/takein/scripts/takein_digest.py +88 -0
- package/xflow/yolo/SKILL.md +75 -0
- package/xflow/yolo/scripts/scaffold_specs_change.py +673 -0
- package/xflow/yolo/scripts/yolo_gate.py +312 -0
- package/xflow/yolo/templates/DESIGN.md +179 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# Canonical Phase Catalog
|
|
2
|
+
|
|
3
|
+
This is the single source of truth for all workflow phases in evalid.
|
|
4
|
+
|
|
5
|
+
Both `workflows/yolo.yaml` and `workflows/corps.yaml` are **subsets** of this catalog.
|
|
6
|
+
No workflow may define a phase not listed here. Phase IDs here are authoritative.
|
|
7
|
+
|
|
8
|
+
## Rules
|
|
9
|
+
|
|
10
|
+
- Phase order within each workflow is the workflow file's responsibility.
|
|
11
|
+
- Every phase must declare its atom list, artifacts, and gate type.
|
|
12
|
+
- `lite` track phases may not invoke `heavy` atoms (enforced by the loader).
|
|
13
|
+
- Phase granularity is kept at maximum — no folding — because gate rerun
|
|
14
|
+
granularity is one phase. Folding two phases loses independent retry.
|
|
15
|
+
- `xflow:plan` is the only planning entry point. It writes `plan.md` only and
|
|
16
|
+
must not create `tasks.md` or decide track routing.
|
|
17
|
+
- For research-heavy or long-running changes, `findings.md` and `progress.md`
|
|
18
|
+
may accompany `plan.md` as optional working notes. They are auxiliary
|
|
19
|
+
artifacts, not source of truth.
|
|
20
|
+
- When a change shifts workflow semantics or capability boundaries, record the
|
|
21
|
+
durable delta in `merge-workflow.md` with an explicit capability section.
|
|
22
|
+
- `set-in-progress` and `execute` should only run once `doctor` reports
|
|
23
|
+
`branch-worktree-ready` for the linked branch and checkout.
|
|
24
|
+
- For `evalid`, phase `openissue` files the issue into the explicitly configured tracker repo, not the current code repo.
|
|
25
|
+
- For `evalid`, `openissue` issue title/body must be Chinese.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase Catalog (27 phases)
|
|
30
|
+
|
|
31
|
+
### Front-end / Intake
|
|
32
|
+
|
|
33
|
+
| # | ID | Source | Description |
|
|
34
|
+
|---|----|--------|-------------|
|
|
35
|
+
| 01 | `change-init` | yolo | Scaffold `specs/changes/<change_id>/` + optional mission.create for corps binding |
|
|
36
|
+
| 02 | `explore` | agentos | Same-category evidence: competitor patterns, IA, interaction + visual references |
|
|
37
|
+
| 03 | `brainstorm` | both | Generate multiple plausible product paths from available evidence |
|
|
38
|
+
| 04 | `risk_review` | agentos | Identify uncertainties that would change scope, validation, autonomy, or implementation |
|
|
39
|
+
| 05 | `clarify` | agentos | Ask only questions that still materially change the path (driven by ambiguity) |
|
|
40
|
+
| 06 | `proposal` | both | Converge one believable primary journey and module split (= yolo proposal-freeze) |
|
|
41
|
+
| 07 | `proposal-consistency-check` | yolo | Diff frozen proposal against `specs/*`, `AHA.md`, `DESIGN.md` — deterministic structural scan |
|
|
42
|
+
|
|
43
|
+
### Design
|
|
44
|
+
|
|
45
|
+
| # | ID | Source | Description |
|
|
46
|
+
|---|----|--------|-------------|
|
|
47
|
+
| 08 | `design_contract_freeze` | agentos heavy | Lock journey, module boundaries, visual direction, acceptance bar |
|
|
48
|
+
| 09 | `design-check-lite` | yolo | Optional DESIGN.md sanity: Reference Anchors, Beauty Contract, Layout Premise sections present |
|
|
49
|
+
| 10 | `visual_direction_synthesis` | agentos heavy | Generate + compare multiple visual directions against frozen contract and design-system practice pack |
|
|
50
|
+
| 11 | `layout_competition` | agentos heavy | Compare multiple materially different first-fold compositions |
|
|
51
|
+
| 12 | `design_selection` | agentos heavy | Freeze winner + runner-up + rationale + Pencil handoff |
|
|
52
|
+
| 13 | `ux_design_brief` | agentos | Translate frozen contract + selected direction into design brief |
|
|
53
|
+
| 14 | `pencil_draft` | agentos heavy | Create first editable `.pen` artifact through strict `agent_invoke` / Pencil runtime |
|
|
54
|
+
| 15 | `llm_design_review` | agentos heavy | Review product logic, UX taste, continuity, same-category fit |
|
|
55
|
+
| 16 | `pencil_refine` | agentos heavy | Apply targeted refinements through strict `agent_invoke` / Pencil runtime |
|
|
56
|
+
| 17 | `design_accept` | agentos | Approve or reject design against frozen contract + Pencil attestation |
|
|
57
|
+
|
|
58
|
+
### Plan
|
|
59
|
+
|
|
60
|
+
| # | ID | Source | Description |
|
|
61
|
+
|---|----|--------|-------------|
|
|
62
|
+
| 18 | `plan` | both | Turn accepted scope/design into a reusable `plan.md` |
|
|
63
|
+
|
|
64
|
+
### Issue / Branch Lifecycle
|
|
65
|
+
|
|
66
|
+
| # | ID | Source | Description |
|
|
67
|
+
|---|----|--------|-------------|
|
|
68
|
+
| 19 | `openissue` | yolo | Configured GitHub issue routing + code-branch linkage + project context discovery |
|
|
69
|
+
| 20 | `set-in-progress` | yolo | Move linked issue/project item to In Progress |
|
|
70
|
+
|
|
71
|
+
### Execution
|
|
72
|
+
|
|
73
|
+
| # | ID | Source | Description |
|
|
74
|
+
|---|----|--------|-------------|
|
|
75
|
+
| 21 | `tdd` | yolo | Red → green → refactor with structured proof capture |
|
|
76
|
+
| 22 | `execute` | both | Implement artifact on linked branch within frozen scope |
|
|
77
|
+
|
|
78
|
+
### Verification / Review
|
|
79
|
+
|
|
80
|
+
| # | ID | Source | Description |
|
|
81
|
+
|---|----|--------|-------------|
|
|
82
|
+
| 23 | `verify-consistency` | yolo | Impl vs proposal/plan/specs/AHA.md structural drift check + deterministic CR gate (`J6.cr.review`: spec alignment, test follow, assertion balance, loop budget) |
|
|
83
|
+
| 24 | `review` | agentos | Adversarial code review + patch-challenge |
|
|
84
|
+
| 25 | `qa` | agentos | Behavior + visual verification, screenshot-backed for strict UI work; runs the same `J6.cr.review` gate (verdict record `cr/review-0.json`) |
|
|
85
|
+
| 26 | `gate_final` | agentos | Mirror frozen contract; decide pass / fail / needs-human |
|
|
86
|
+
|
|
87
|
+
### Archive
|
|
88
|
+
|
|
89
|
+
| # | ID | Source | Description |
|
|
90
|
+
|---|----|--------|-------------|
|
|
91
|
+
| 27 | `archive` | yolo | Artifact completeness check + merge snippets + commit + push + close issue + project Done |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Workflow Subsets
|
|
96
|
+
|
|
97
|
+
### yolo (lite, 12 phases)
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
01 change-init
|
|
101
|
+
03 brainstorm
|
|
102
|
+
09 design-check-lite (optional, skip for backend/docs/infra)
|
|
103
|
+
06 proposal
|
|
104
|
+
07 proposal-consistency-check
|
|
105
|
+
18 plan
|
|
106
|
+
19 openissue
|
|
107
|
+
20 set-in-progress
|
|
108
|
+
21 tdd
|
|
109
|
+
22 execute
|
|
110
|
+
23 verify-consistency
|
|
111
|
+
27 archive
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### corps (heavy, 26 phases — skips 09 because 08 is the full contract)
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
01 change-init
|
|
118
|
+
02 explore
|
|
119
|
+
03 brainstorm
|
|
120
|
+
04 risk_review
|
|
121
|
+
05 clarify
|
|
122
|
+
06 proposal
|
|
123
|
+
07 proposal-consistency-check
|
|
124
|
+
08 design_contract_freeze
|
|
125
|
+
10 visual_direction_synthesis
|
|
126
|
+
11 layout_competition
|
|
127
|
+
12 design_selection
|
|
128
|
+
13 ux_design_brief
|
|
129
|
+
14 pencil_draft
|
|
130
|
+
15 llm_design_review
|
|
131
|
+
16 pencil_refine
|
|
132
|
+
17 design_accept
|
|
133
|
+
18 plan
|
|
134
|
+
19 openissue
|
|
135
|
+
20 set-in-progress
|
|
136
|
+
21 tdd
|
|
137
|
+
22 execute
|
|
138
|
+
24 review
|
|
139
|
+
25 qa
|
|
140
|
+
26 gate_final
|
|
141
|
+
27 archive
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## Change: timeline-analytics
|
|
146
|
+
|
|
147
|
+
Source: `specs/changes/timeline-analytics/merge-workflow.md`
|
|
148
|
+
Archived: 2026-04-16T15:52:04Z
|
|
149
|
+
|
|
150
|
+
- `xflow:yolo` openissue handoff writes `current_stage=openissue`, and the canonical status machine must allow `openissue -> tdd` so `set-in-progress` can enter execution without manual status repair.
|
|
151
|
+
- `verify-consistency` must record `current_stage=verify` before archive. `pre-archive` only accepts a stage that can advance to `archive`, so the workflow data must include `B3.status.transition --to-stage verify`.
|
|
152
|
+
- The yolo workflow definition, status transition table, and workflow-loader tests are treated as one contract: changing one requires updating the others in the same change.
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
## Change: handoff-current-state
|
|
156
|
+
|
|
157
|
+
Source: `specs/changes/handoff-current-state/merge-workflow.md`
|
|
158
|
+
Archived: 2026-04-16T16:09:18Z
|
|
159
|
+
|
|
160
|
+
- `K3.handoff.refresh` / `scaffold_handoff.py --refresh --change-id <id>` now updates a managed Current State block in `HANDOFF.md` instead of returning without touching existing files.
|
|
161
|
+
- The managed block is bounded by `<!-- xflow:handoff-current:start -->` and `<!-- xflow:handoff-current:end -->`; repeated refreshes replace the block idempotently.
|
|
162
|
+
- The block records git branch, change id, stage/status, verification status, archival status, issue reference, and next action from `status.json`. It intentionally omits commit hash because committing a file that records its own current HEAD makes that value stale immediately.
|
|
163
|
+
- Refresh preserves the rest of `HANDOFF.md`; only the `## Current State` section or existing managed block is replaced.
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
## Change: archive-staging-guard
|
|
167
|
+
|
|
168
|
+
Source: `specs/changes/archive-staging-guard/merge-workflow.md`
|
|
169
|
+
Archived: 2026-04-16T16:29:24Z
|
|
170
|
+
|
|
171
|
+
- `A5.archive.commit_push_close` must refuse archive publish when `git diff --name-only` reports unstaged tracked files. Intended implementation/test changes must be staged before archive so the close-out commit cannot silently contain only handoff/spec updates.
|
|
172
|
+
- The dirty-worktree guard runs before terminal archive state is written to `status.json`; a rejected publish must leave the change in its pre-archive stage/status so the operator can stage or clean files and rerun safely.
|
|
173
|
+
- Ignored change workspaces under `specs/changes/` remain excluded from archive commits; the guard is specifically about tracked worktree changes.
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
## Change: openissue-preserve-frozen-docs
|
|
177
|
+
|
|
178
|
+
Source: `specs/changes/openissue-preserve-frozen-docs/merge-workflow.md`
|
|
179
|
+
Archived: 2026-04-16T16:36:34Z
|
|
180
|
+
|
|
181
|
+
- The plan phase is track-neutral. `xflow:plan` produces `plan.md` only and must not choose yolo versus corps.
|
|
182
|
+
- If yolo or corps starts without a preexisting plan, it may create one inline once and then reuse it. If a current plan already exists, it should be reused.
|
|
183
|
+
- Openissue may still update issue/branch/status metadata after branch creation, but it must not erase frozen scope, risks, tasks, or verification commands from change artifacts.
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
## Change: yolo-archive-phase-order
|
|
187
|
+
|
|
188
|
+
Source: `specs/changes/yolo-archive-phase-order/merge-workflow.md`
|
|
189
|
+
Archived: 2026-04-16T16:44:09Z
|
|
190
|
+
|
|
191
|
+
- The yolo archive phase treats `A5.archive.commit_push_close` as the single full archive publisher: it merges `merge-*.md` snippets, writes terminal archive status, refreshes final handoff state, commits, pushes, and closes the linked issue when configured.
|
|
192
|
+
- `K2.merge_snippets.apply`, `K5.archive.publish`, and a follow-up terminal `B3.status.transition` must not run in the yolo archive phase before/after A5 because they duplicate A5 side effects and can make archive non-idempotent.
|
|
193
|
+
- `A6.pr.create` runs after A5 so the PR is opened from a branch that already contains the archive commit.
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
## Change: yolo-archive-e2e-mocks
|
|
197
|
+
|
|
198
|
+
Source: `specs/changes/yolo-archive-e2e-mocks/merge-workflow.md`
|
|
199
|
+
Archived: 2026-04-16T16:54:59Z
|
|
200
|
+
|
|
201
|
+
- Yolo archive ordering is now covered by an offline e2e that loads the real `workflows/yolo.yaml` archive phase and replaces archive/publish atoms with local mock JS implementations.
|
|
202
|
+
- The mock A5 writes `.as-xflow/mock-archive-publish.json`; mock A6 fails unless it can read that archive publish marker. The test also asserts execution log order, so A6-before-A5 regressions fail without requiring GitHub CLI or network access.
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
## Change: skill-sync-wrapper-handoff-verify
|
|
206
|
+
|
|
207
|
+
Source: `specs/changes/skill-sync-wrapper-handoff-verify/merge-workflow.md`
|
|
208
|
+
Archived: 2026-04-16T17:14:18Z
|
|
209
|
+
|
|
210
|
+
- `xflow/scripts/sync_installed_xflow_skill.sh` is the repo-owned safe entrypoint for refreshing the installed `xflow` skill from evalid. It invokes the shared skillhub sync with evalid as `SKILLHUB` and as-skillhub `skills/` as an extra source so prune can still resolve unrelated managed skills.
|
|
211
|
+
- `K3.handoff.refresh` now updates a managed `## Latest Verified Commands` block from `specs/changes/<change-id>/verify_proof.json`, replacing stale manual command claims while preserving the rest of `HANDOFF.md`.
|
|
212
|
+
- `J1.tests.run` removes its orchestration-layer `CHANGE_ID` from child verification commands. Verification commands that intentionally need a change id should set it explicitly in the command itself.
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
## Change: sync-release-checklist-handoff-slim
|
|
216
|
+
|
|
217
|
+
Source: `specs/changes/sync-release-checklist-handoff-slim/merge-workflow.md`
|
|
218
|
+
Archived: 2026-04-16T17:22:53Z
|
|
219
|
+
|
|
220
|
+
- Local xflow skill release is now exposed through package scripts: `npm run skill:sync` runs the safe installed-skill sync wrapper, and `npm run release:local` runs repository verification before syncing the installed `xflow` skill.
|
|
221
|
+
- The workflow manual's local release checklist is the canonical human-facing sequence for local release: run `npm run verify`, then `npm run skill:sync`, or use `npm run release:local`.
|
|
222
|
+
- `HANDOFF.md` should stay concise: keep managed current-state and latest-verification blocks plus active commands and first-check files; avoid retaining old completed-change execution logs or stale next-step prose.
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
## Change: manual-corps-archive-handoff-focus
|
|
226
|
+
|
|
227
|
+
Source: `specs/changes/manual-corps-archive-handoff-focus/merge-workflow.md`
|
|
228
|
+
Archived: 2026-04-16T17:32:23Z
|
|
229
|
+
|
|
230
|
+
- `workflows/corps.yaml` now uses the same archive publish boundary as yolo: `K1.artifacts.complete_check`, `K6.aha.merge`, `K3.handoff.refresh`, `K4.mem.lesson_persist`, `A5.archive.commit_push_close --push --close-issue`, then `A6.pr.create`.
|
|
231
|
+
- The corps archive phase must not run `K2.merge_snippets.apply`, `K5.archive.publish`, `A4.project.set_status`, or a terminal `B3.status.transition` around A5; those duplicate A5 publish/terminal close-out side effects.
|
|
232
|
+
- `docs/workflow-manual.md` is covered by currentness tests for registry atom count, yolo gate names, archive ordering, and H atom count. Manual drift should fail locally instead of surfacing during real archive.
|
|
233
|
+
- `HANDOFF.md` current focus should be structured as `操作入口` and `近期风险`, not a mixed freeform `Current Focus` section.
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
## Change: drop-legacy-preopenissue-partial
|
|
237
|
+
|
|
238
|
+
Source: `specs/changes/drop-legacy-preopenissue-partial/merge-workflow.md`
|
|
239
|
+
Archived: 2026-04-16T17:37:57Z
|
|
240
|
+
|
|
241
|
+
- The legacy partial pre-openissue yolo gate name is no longer accepted in workflow-loader gate currentness checks. The active gate name is `pre-openissue`.
|
|
242
|
+
- Currentness tests avoid embedding the legacy gate literal directly, so grep-based drift checks can confirm the old name is absent from workflow/manual/test/spec entry points.
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
## Change: active-surface-drift-scan
|
|
246
|
+
|
|
247
|
+
Source: `specs/changes/active-surface-drift-scan/merge-workflow.md`
|
|
248
|
+
Archived: 2026-04-16T17:55:20Z
|
|
249
|
+
|
|
250
|
+
- `npm run drift:scan` is the targeted active-surface drift scan for xflow workflow currentness. It runs `test/workflow-drift-scan.test.js` and is included in the normal `npm test` path.
|
|
251
|
+
- The scan distinguishes active narrative/code surfaces from historical `specs/changes/**` audit artifacts. Retired gate literals, stale atom counts, and old archive-order phrases should be checked in active surfaces without rewriting historical change records.
|
|
252
|
+
- Release verification should run `npm run drift:scan` for fast feedback before the broader `npm run verify` / `npm run release:local` path.
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
## Change: takein-skill-drift-currentness
|
|
256
|
+
|
|
257
|
+
Source: `specs/changes/takein-skill-drift-currentness/merge-workflow.md`
|
|
258
|
+
Archived: 2026-04-16T18:03:00Z
|
|
259
|
+
|
|
260
|
+
- `xflow:takein` treats `npm run drift:scan` as a lightweight repo-state preflight when the project exposes that script; for evalid it is required before substantial implementation in a new thread.
|
|
261
|
+
- Active xflow skill docs are part of the workflow currentness surface. The drift scan checks that the primary skill docs reflect the current registry atom count instead of stale catalog totals.
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
## Change: split-subskill-phase-currentness
|
|
265
|
+
|
|
266
|
+
Source: `specs/changes/split-subskill-phase-currentness/merge-workflow.md`
|
|
267
|
+
Archived: 2026-04-16T18:12:56Z
|
|
268
|
+
|
|
269
|
+
- Split subskill documentation should describe coverage by canonical phase names, not local step numbers or ad hoc numeric ranges. Use `change-init` through `archive`, `set-in-progress` through `verify-consistency`, and the shared `xflow:plan` contract for planning.
|
|
270
|
+
- `npm run drift:scan` checks active split subskill docs for retired local numeric range phrases so yolo phase coverage stays aligned with `specs/workflow.md`.
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
## Change: archive-atom-boundary-currentness
|
|
274
|
+
|
|
275
|
+
Source: `specs/changes/archive-atom-boundary-currentness/merge-workflow.md`
|
|
276
|
+
Archived: 2026-04-16T18:20:32Z
|
|
277
|
+
|
|
278
|
+
- K2 and K5 are standalone archive helpers, not the workflow archive publish path. `K2.merge_snippets.apply` is the merge-snippets-only helper; `K5.archive.publish` is a terminal status helper.
|
|
279
|
+
- Workflow archive publish ownership remains with `A5.archive.commit_push_close`; active registry descriptions and atom docstrings should not describe K5 as the final archive publisher.
|
|
280
|
+
- `npm run drift:scan` covers the K2/K5 registry and docstring boundary so this responsibility split stays current.
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
## Change: archive-runtime-boundary-guards
|
|
284
|
+
|
|
285
|
+
Source: `specs/changes/archive-runtime-boundary-guards/merge-workflow.md`
|
|
286
|
+
Archived: 2026-04-16T18:31:20Z
|
|
287
|
+
|
|
288
|
+
- `archive_change.py` reports its runtime boundary mode explicitly: `Mode: merge-snippets-only` for K2-style snippet merges and `Mode: full-publish` for A5-style archive publishing.
|
|
289
|
+
- Merge-snippets-only archive runtime must not mutate terminal archive status; full publish owns terminal `archive` / `done` / `archived` state and final handoff refresh.
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
## Change: skill-sync-diff-command
|
|
293
|
+
|
|
294
|
+
Source: `specs/changes/skill-sync-diff-command/merge-workflow.md`
|
|
295
|
+
Archived: 2026-04-16T18:37:35Z
|
|
296
|
+
|
|
297
|
+
- `npm run skill:diff` is the canonical read-only installed `xflow` skill drift check after local release sync.
|
|
298
|
+
- The installed `xflow` skill may retain `.skillhub-source` as source metadata; any other diff between repo `xflow/` and `~/.agents/skills/xflow` is unexpected drift.
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
## Change: xflow-cli-executable-bit
|
|
302
|
+
|
|
303
|
+
Source: `specs/changes/xflow-cli-executable-bit/merge-workflow.md`
|
|
304
|
+
Archived: 2026-04-16T18:48:58Z
|
|
305
|
+
|
|
306
|
+
- `bin/xflow.js` is an executable CLI entry point and must retain executable mode (`100755`) so npm global bin links such as `/opt/homebrew/bin/xflow` can run the CLI directly.
|
|
307
|
+
- The canonical smoke proof for the global CLI entry is `which xflow`, `xflow --help`, and `xflow workflow validate workflows/yolo.yaml`.
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
## Change: global-cli-currentness
|
|
311
|
+
|
|
312
|
+
Source: `specs/changes/global-cli-currentness/merge-workflow.md`
|
|
313
|
+
Archived: 2026-04-16T18:55:56Z
|
|
314
|
+
|
|
315
|
+
- `HANDOFF.md` should present the global `xflow` CLI as the normal operator entrypoint now that `bin/xflow.js` is executable and npm-linked.
|
|
316
|
+
- Keep direct `node bin/xflow.js` subprocess calls available inside tests where avoiding dependence on the user's PATH is useful, but do not describe the project handoff as if `xflow` is unavailable by default.
|
|
317
|
+
- Currentness tests cover `package.json` `bin.xflow`, the executable bit on `bin/xflow.js`, and handoff commands such as `xflow workflow validate workflows/yolo.yaml` and `xflow serve`.
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
## Change: serve-help-no-start
|
|
321
|
+
|
|
322
|
+
Source: `specs/changes/serve-help-no-start/merge-workflow.md`
|
|
323
|
+
Archived: 2026-04-16T19:02:13Z
|
|
324
|
+
|
|
325
|
+
- `xflow serve --help` and `xflow serve -h` must print serve-specific help and exit without starting the HTTP control plane.
|
|
326
|
+
- The CLI serve help regression test uses a timeout and asserts no server-listening output, preventing help lookups from leaving a process on port 8787.
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
## Change: cli-subcommand-help
|
|
330
|
+
|
|
331
|
+
Source: `specs/changes/cli-subcommand-help/merge-workflow.md`
|
|
332
|
+
Archived: 2026-04-16T19:11:49Z
|
|
333
|
+
|
|
334
|
+
## cli-subcommand-help
|
|
335
|
+
|
|
336
|
+
- `xflow workflow --help`, `xflow atom --help`, and `xflow gate --help` print command-specific usage and exit 0 instead of reporting unknown subcommands.
|
|
337
|
+
- Subcommand help accepts `--help`, `-h`, and `help` consistently across `workflow`, `atom`, `gate`, and `serve`.
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
## Change: stable-node-test-runner
|
|
341
|
+
|
|
342
|
+
Source: `specs/changes/stable-node-test-runner/merge-workflow.md`
|
|
343
|
+
Archived: 2026-04-16T19:19:48Z
|
|
344
|
+
|
|
345
|
+
## stable-node-test-runner
|
|
346
|
+
|
|
347
|
+
- Local release uses a serial Node test runner: `npm test` runs `node --test --test-concurrency=1 test/**/*.test.js`.
|
|
348
|
+
- The serial runner avoids Node v23.11.0 default-concurrency worker IPC flake observed as `Unable to deserialize cloned data due to invalid or unsupported version` while preserving the existing `npm run verify` and `npm run release:local` entrypoints.
|
|
349
|
+
- `test/release-checklist.test.js` locks the package script so release verification cannot silently drift back to the flaky default concurrency path.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { synthesizePhaseArtifact } from '../../common.js';
|
|
2
|
+
|
|
3
|
+
export async function competitorReconstructionReview(input = {}, context = {}) {
|
|
4
|
+
const targetSurfaces = Array.isArray(input.target_surfaces) ? input.target_surfaces : [];
|
|
5
|
+
const requiredModules = Array.isArray(input.required_modules) ? input.required_modules : [];
|
|
6
|
+
const primaryJourneys = Array.isArray(input.primary_journeys) ? input.primary_journeys : [];
|
|
7
|
+
const businessLogicInvariants = Array.isArray(input.business_logic_invariants) ? input.business_logic_invariants : [];
|
|
8
|
+
const primaryReferenceSurface = typeof input.primary_reference_surface === 'string' && input.primary_reference_surface.trim()
|
|
9
|
+
? input.primary_reference_surface.trim()
|
|
10
|
+
: (targetSurfaces[0] || null);
|
|
11
|
+
const supportingReferenceSurfaces = targetSurfaces.filter((surface) => surface && surface !== primaryReferenceSurface);
|
|
12
|
+
|
|
13
|
+
return synthesizePhaseArtifact(input, context, {
|
|
14
|
+
phase: 'competitor_reconstruction_review',
|
|
15
|
+
summary: 'Competitor reconstruction contract was frozen with a locked primary reference surface, explicit decomposition scope, and business-logic invariants.',
|
|
16
|
+
findings: [
|
|
17
|
+
{ summary: 'Competitor product, target surfaces, and a single primary reference surface were named explicitly.' },
|
|
18
|
+
{ summary: 'Required modules and IA were mapped beyond a single visible page slice and prepared for structured decomposition.' },
|
|
19
|
+
{ summary: 'Primary journeys and business-logic invariants were frozen before visual execution and benchmark repair.' },
|
|
20
|
+
],
|
|
21
|
+
extraEnvelope: {
|
|
22
|
+
competitor_reconstruction_contract: {
|
|
23
|
+
status: 'frozen',
|
|
24
|
+
competitor_product: input.competitor_product || 'required',
|
|
25
|
+
target_surfaces: targetSurfaces,
|
|
26
|
+
primary_reference_surface: primaryReferenceSurface,
|
|
27
|
+
supporting_reference_surfaces: supportingReferenceSurfaces,
|
|
28
|
+
required_modules: requiredModules,
|
|
29
|
+
primary_journeys: primaryJourneys,
|
|
30
|
+
business_logic_invariants: businessLogicInvariants,
|
|
31
|
+
decomposition_requirements: {
|
|
32
|
+
surface_map_required: true,
|
|
33
|
+
layout_map_required: true,
|
|
34
|
+
component_inventory_required: true,
|
|
35
|
+
state_inventory_required: true,
|
|
36
|
+
visual_token_map_required: true,
|
|
37
|
+
reference_intermediate_model_required: true,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export default competitorReconstructionReview;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { synthesizePhaseArtifact } from '../../common.js';
|
|
2
|
+
|
|
3
|
+
export async function designContractFreeze(input = {}, context = {}) {
|
|
4
|
+
return synthesizePhaseArtifact(input, context, {
|
|
5
|
+
phase: 'design_contract_freeze',
|
|
6
|
+
summary: 'Journey, module boundaries, and visual direction were frozen for the heavy track.',
|
|
7
|
+
});
|
|
8
|
+
}
|