@ikon85/agent-workflow-kit 0.42.1 → 0.44.0
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/.agents/skills/grill-me/SKILL.md +3 -1
- package/.agents/skills/grill-with-docs/SKILL.md +3 -1
- package/.agents/skills/kit-update/SKILL.md +9 -11
- package/.agents/skills/orchestrate-wave/SKILL.md +8 -8
- package/.agents/skills/setup-workflow/SKILL.md +20 -18
- package/.agents/skills/setup-workflow/board-sync.md +4 -1
- package/.agents/skills/setup-workflow/workflow-advisories.md +3 -2
- package/.agents/skills/setup-workflow/worktree-lifecycle.md +36 -31
- package/.agents/skills/to-issues/SKILL.md +43 -0
- package/.agents/skills/wrapup/SKILL.md +98 -54
- package/.claude/skills/grill-me/SKILL.md +3 -1
- package/.claude/skills/grill-me-codex/SKILL.md +3 -1
- package/.claude/skills/grill-with-docs/SKILL.md +3 -1
- package/.claude/skills/grill-with-docs-codex/SKILL.md +3 -1
- package/.claude/skills/kit-update/SKILL.md +9 -11
- package/.claude/skills/orchestrate-wave/SKILL.md +8 -8
- package/.claude/skills/setup-workflow/SKILL.md +20 -18
- package/.claude/skills/setup-workflow/board-sync.md +4 -1
- package/.claude/skills/setup-workflow/workflow-advisories.md +3 -2
- package/.claude/skills/setup-workflow/worktree-lifecycle.md +36 -31
- package/.claude/skills/to-issues/SKILL.md +43 -0
- package/.claude/skills/wrapup/SKILL.md +98 -54
- package/README.md +268 -7
- package/agent-workflow-kit.package.json +42 -42
- package/package.json +16 -2
- package/scripts/marker_lib.py +3 -0
- package/scripts/profile_globs.py +26 -45
- package/scripts/release-delta-guard.mjs +29 -4
- package/scripts/worktree-lifecycle/README.md +57 -154
- package/scripts/worktree-lifecycle/capabilities.json +2 -3
- package/scripts/worktree-lifecycle/classify.py +480 -0
- package/scripts/worktree-lifecycle/cleanup.py +9 -29
- package/scripts/worktree-lifecycle/core.py +68 -1289
- package/scripts/worktree-lifecycle/ignore_seed.py +1 -1
- package/scripts/worktree-lifecycle/profile.py +46 -29
- package/scripts/worktree-lifecycle/setup.py +7 -19
- package/scripts/wrapup-land.py +1292 -545
- package/src/consumer-migrations.json +1 -16
- package/src/lib/bundle.mjs +31 -1
- package/docs/adr/0001-consumer-divergence-policy.md +0 -53
- package/docs/adr/0002-capability-gated-orchestration.md +0 -70
- package/docs/adr/0003-kit-core-and-project-extension-lifecycle.md +0 -63
- package/docs/adr/0004-release-intent-is-a-version-tag.md +0 -64
- package/docs/adr/0005-to-issues-is-the-planning-facade.md +0 -42
- package/docs/adr/0006-routing-knowledge-access-and-policy-are-separate.md +0 -95
- package/docs/adr/0007-session-teardown-requires-provenance-bound-ownership.md +0 -88
- package/docs/adr/0008-planning-ignore-rules-are-offered-never-installed.md +0 -84
- package/docs/adr/0009-teardown-authority-is-stateless-repository-classification.md +0 -101
- package/docs/adr/0010-model-roster-replaces-the-optimization-dial.md +0 -87
- package/docs/agents/board-sync.md +0 -74
- package/docs/agents/code-review.md +0 -14
- package/docs/agents/domain.md +0 -7
- package/docs/agents/issue-tracker.md +0 -23
- package/docs/agents/skills/local-ci.md +0 -90
- package/docs/agents/skills/orchestrate-wave.md +0 -166
- package/docs/agents/skills/spec-self-critique.md +0 -18
- package/docs/agents/triage-labels.md +0 -10
- package/docs/agents/workflow-capabilities.json +0 -28
- package/docs/conventions/spec-completeness.md +0 -23
- package/docs/research/agent-task-taxonomy-benchmark-coverage.md +0 -451
- package/docs/research/benchlm-routing-source.md +0 -198
- package/docs/research/consumer-owned-protocol-files.md +0 -238
- package/docs/research/frontend-agent-benchmarks.md +0 -282
- package/docs/research/model-effort-routing-benchmarks.md +0 -261
- package/docs/research/provider-neutral-agent-routing.md +0 -207
- package/docs/research/wave-152-consumer-acceptance.md +0 -98
- package/docs/research/wave-43-script-hook-census.md +0 -128
- package/scripts/build-kit.mjs +0 -117
- package/scripts/build-kit.test.mjs +0 -204
- package/scripts/census/census.test.mjs +0 -252
- package/scripts/census/state.test.mjs +0 -15
- package/scripts/census/transaction.test.mjs +0 -103
- package/scripts/census-contract.test.mjs +0 -227
- package/scripts/check-kit-staleness.mjs +0 -45
- package/scripts/check-kit-staleness.test.mjs +0 -19
- package/scripts/codex-exec-scenarios/fake-codex.mjs +0 -152
- package/scripts/codex-exec.test.mjs +0 -871
- package/scripts/grill-census-wiring-guard.mjs +0 -87
- package/scripts/grill-census-wiring-guard.test.mjs +0 -107
- package/scripts/kit-release.test.mjs +0 -273
- package/scripts/kit-update-pr.test.mjs +0 -151
- package/scripts/lib/audit-refs.mjs +0 -146
- package/scripts/lib/scrub.mjs +0 -113
- package/scripts/lib/scrub.test.mjs +0 -187
- package/scripts/memory-lifecycle/memory-lifecycle.test.mjs +0 -170
- package/scripts/portability_profile_scan.py +0 -53
- package/scripts/release-delta-guard.test.mjs +0 -151
- package/scripts/release-parity.test.mjs +0 -90
- package/scripts/release-state.test.mjs +0 -360
- package/scripts/test_anchor_table.py +0 -69
- package/scripts/test_board_bootstrap.py +0 -348
- package/scripts/test_board_sync.py +0 -208
- package/scripts/test_board_sync_create_idempotency.py +0 -117
- package/scripts/test_board_sync_wave_title.py +0 -120
- package/scripts/test_census_backstop.py +0 -712
- package/scripts/test_census_forward_contract.py +0 -91
- package/scripts/test_census_update_contract.test.mjs +0 -454
- package/scripts/test_codex_adapter_sync_contract.py +0 -169
- package/scripts/test_dist_kit_smoke.py +0 -220
- package/scripts/test_drift_guard_diagnostics.py +0 -295
- package/scripts/test_issue_claim_contract.py +0 -169
- package/scripts/test_kit_docs_language_census.py +0 -178
- package/scripts/test_marker_lib.py +0 -162
- package/scripts/test_orchestrate_wave_contract.py +0 -381
- package/scripts/test_pr_body_check.py +0 -264
- package/scripts/test_profile_globs.py +0 -280
- package/scripts/test_program_planning_contract.py +0 -133
- package/scripts/test_release_authorization_contract.py +0 -101
- package/scripts/test_render_anchor.py +0 -267
- package/scripts/test_retro_wrapup_contract.py +0 -153
- package/scripts/test_skill_code_review_seed.py +0 -89
- package/scripts/test_skill_codex_exec_lifecycle.py +0 -123
- package/scripts/test_skill_frontmatter_lint.py +0 -234
- package/scripts/test_skill_gh_lint.py +0 -124
- package/scripts/test_skill_language_census.py +0 -254
- package/scripts/test_skill_optional_readiness.py +0 -171
- package/scripts/test_skill_portability_lint.py +0 -866
- package/scripts/test_skill_precommit_template.py +0 -30
- package/scripts/test_skill_publish_audit.py +0 -358
- package/scripts/test_skill_readiness_contract.py +0 -264
- package/scripts/test_skill_readiness_preflight.py +0 -180
- package/scripts/test_skill_required_readiness.py +0 -233
- package/scripts/test_skill_selfcontainment_lint.py +0 -255
- package/scripts/test_skill_setup_workflow_seeds.py +0 -691
- package/scripts/test_skill_stale_name_lint.py +0 -126
- package/scripts/test_skill_surface_refs.py +0 -300
- package/scripts/test_skill_trailing_artifact_lint.py +0 -71
- package/scripts/test_tdd_contract.py +0 -78
- package/scripts/test_worktree_ignore_seed.py +0 -320
- package/scripts/test_worktree_setup_base_guard.py +0 -140
- package/scripts/test_worktree_wrapup_contract.py +0 -1648
- package/scripts/test_wrapup_land.py +0 -428
- package/scripts/worktree-lifecycle/session.py +0 -1857
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# Teardown authority is stateless repository classification
|
|
2
|
-
|
|
3
|
-
Status: accepted (2026-07-27, #320) — supersedes
|
|
4
|
-
[ADR-0007](./0007-session-teardown-requires-provenance-bound-ownership.md)
|
|
5
|
-
|
|
6
|
-
ADR-0007 derived teardown authority from persisted lifecycle evidence:
|
|
7
|
-
ownership-proof refs acquired in atomic git transactions, frozen
|
|
8
|
-
landing-attempt journals, baseline digests, no-follow identity binding, and a
|
|
9
|
-
post-merge reload of the canonical cleanup policy. Every piece was locally
|
|
10
|
-
justified, and the aggregate failed in practice: fifteen teardown/cleanup
|
|
11
|
-
issues in two weeks (#245–#319), ~5,600 lines of lifecycle code, two recovery
|
|
12
|
-
flags for the machinery's own bookkeeping, a legacy receipt contract, and
|
|
13
|
-
refusals that did not name their cause (#319: 68,856 paths, 7.4 MB, zero
|
|
14
|
-
actionable lines). The protection was aimed at narrow races between assessment
|
|
15
|
-
and deletion; the cost was that ordinary sessions could no longer finish.
|
|
16
|
-
|
|
17
|
-
We decided that teardown authority comes from the repository's **current
|
|
18
|
-
state**, read at the moment of action, and from nothing else:
|
|
19
|
-
|
|
20
|
-
1. **Git's own classification is the file taxonomy.** A tracked modification
|
|
21
|
-
blocks teardown. An untracked, non-ignored file blocks with a bounded
|
|
22
|
-
report (count plus top directories — never an unbounded path dump). An
|
|
23
|
-
ignored file is Scratch: the repository declared it not-work, and it is
|
|
24
|
-
deletable. "Ignored" means git's standard exclude sources
|
|
25
|
-
(`--exclude-standard`: repository `.gitignore` files, `.git/info/exclude`,
|
|
26
|
-
the global excludes file) — whatever the repository's own tooling treats as
|
|
27
|
-
ignored is deletion authority here too.
|
|
28
|
-
2. **One hardcoded exception: `.env*` (basename glob).** Ignored yet
|
|
29
|
-
potentially irreplaceable. Before removal each `.env*` regular file is
|
|
30
|
-
compared byte-wise with its counterpart at the same relative path in the
|
|
31
|
-
main checkout, both opened no-follow: identical → derived copy, deletable;
|
|
32
|
-
divergent, absent in the main checkout, or either side not a regular file →
|
|
33
|
-
block with the exact files named. The check is a present-state comparison,
|
|
34
|
-
not a receipt.
|
|
35
|
-
3. **The platform PR record authorizes branch deletion.** Force-deletion
|
|
36
|
-
requires exactly one PR matching the full tuple — this repository as base
|
|
37
|
-
repo, head repository equal to the base repo (no fork heads), head ref
|
|
38
|
-
equal to the branch name, base ref equal to the configured protected
|
|
39
|
-
branch, state merged — whose head SHA equals the branch tip OID; the OID
|
|
40
|
-
is re-read immediately before deletion, and zero matches, multiple
|
|
41
|
-
matches, an open PR on the same head, or any drift retains the branch.
|
|
42
|
-
Ancestry-merged branches (against a freshly fetched configured protected
|
|
43
|
-
branch — stale ancestry stops rather than guesses) delete normally. A
|
|
44
|
-
branch with neither stays and is reported. Without platform access this
|
|
45
|
-
degrades to ancestry-only, reported honestly.
|
|
46
|
-
4. **Idempotency by re-check, not journal.** An interrupted landing is resumed
|
|
47
|
-
by re-running it; every step verifies present state (PR exists? merged?
|
|
48
|
-
worktree present?) and skips or proceeds. There is no persisted attempt
|
|
49
|
-
state to validate, archive, or recover.
|
|
50
|
-
5. **A direct `/wrapup` invocation is the teardown authorization.** It lands
|
|
51
|
-
and tears down the worktree it runs in — including worktrees created by
|
|
52
|
-
external tools under foreign names and paths. The kit never conditions
|
|
53
|
-
teardown on its own naming or location conventions; the four classification
|
|
54
|
-
rules above are the only protection.
|
|
55
|
-
6. **Deletion policy has exactly one configuration surface: the ignore
|
|
56
|
-
mechanism.** The consumer profile keeps structural facts only (worktree
|
|
57
|
-
root, templates, protected branches, sweep opt-in). `scratchPatterns` and
|
|
58
|
-
`landingGeneratedArtifactPatterns` are removed without migration —
|
|
59
|
-
including the shipped consumer migration that seeded them; making a file
|
|
60
|
-
deletable means ignoring it (ADR-0008's offered seeding remains the
|
|
61
|
-
supported way; its consequence about deriving `scratchPatterns` from the
|
|
62
|
-
seeded rules is obsolete with this decision).
|
|
63
|
-
|
|
64
|
-
## Considered options
|
|
65
|
-
|
|
66
|
-
- **Keep ADR-0007's provenance machinery:** rejected on empirical grounds. The
|
|
67
|
-
races it closes (a foreign file occupying an assessed path between
|
|
68
|
-
assessment and deletion, a same-name branch created concurrently) are rare
|
|
69
|
-
and low-harm next to the observed failure mode: routine teardown becoming
|
|
70
|
-
impossible and each repair adding machinery. The branch race is additionally
|
|
71
|
-
closed cheaper by the tip-SHA/PR comparison.
|
|
72
|
-
- **Shipping default scratch patterns:** rejected. A default allowlist of the
|
|
73
|
-
deletable restarts the pattern catalog and its seeding, sync, and dialect
|
|
74
|
-
problems; `.gitignore` already encodes the same fact with universal
|
|
75
|
-
tooling.
|
|
76
|
-
- **Migrating existing profiles and receipts:** rejected. The green-slate cut
|
|
77
|
-
is deliberate (#320): old keys are ignored, journaled attempts are inert
|
|
78
|
-
files, and no code path reads either. Maintaining both models would preserve
|
|
79
|
-
the complexity this decision removes.
|
|
80
|
-
- **Location heuristic for externally created worktrees (land, don't tear
|
|
81
|
-
down):** rejected by the user. `/wrapup` means tear down; splitting the
|
|
82
|
-
outcome by worktree origin reintroduces an ownership notion.
|
|
83
|
-
|
|
84
|
-
## Consequences
|
|
85
|
-
|
|
86
|
-
- A worktree whose only untracked content is ignored dependency or build
|
|
87
|
-
output is removable with zero configuration. #319's failure class cannot
|
|
88
|
-
occur.
|
|
89
|
-
- Refusals are bounded and name their cause; the fix is always visible
|
|
90
|
-
(commit the tracked change, handle the named `.env*`, ignore or remove the
|
|
91
|
-
named untracked files).
|
|
92
|
-
- The accepted residual risk is explicit: between assessment and deletion a
|
|
93
|
-
file could in principle be replaced; a valuable file a consumer keeps
|
|
94
|
-
gitignored outside `.env*` is deletable at teardown. We trade these narrow
|
|
95
|
-
windows for a lifecycle that ordinary sessions can actually complete.
|
|
96
|
-
- Planning sessions stop being a special case: durable content lands through
|
|
97
|
-
wrapup's Content route as ordinary work, scratch dies with the worktree,
|
|
98
|
-
and worktree creation binds to implementation, not planning.
|
|
99
|
-
- The lifecycle implementation shrinks from a transaction protocol to a
|
|
100
|
-
classification function plus plumbing; its tests shift from race
|
|
101
|
-
choreography to classification truth tables.
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# A Model roster replaces the optimization dial
|
|
2
|
-
|
|
3
|
-
Status: accepted (2026-07-27, Program #287, Welle 18 / #294) — supersedes the
|
|
4
|
-
Routing-policy clause of
|
|
5
|
-
[ADR-0006](./0006-routing-knowledge-access-and-policy-are-separate.md)
|
|
6
|
-
|
|
7
|
-
ADR-0006 made "optimization goals and optional advanced overrides" inputs of
|
|
8
|
-
the Routing policy, and setup asked the user to pick Balanced, Quality, or
|
|
9
|
-
Cost. That dial cannot be made to work. The goal is always the right model for
|
|
10
|
-
the job, and a cheap-but-weak model can cost more per completed task than a
|
|
11
|
-
strong one — so a Cost dial does not express a preference the resolver can act
|
|
12
|
-
on without knowing cost per *completed* task, which no benchmark owner
|
|
13
|
-
publishes. Meanwhile the dial was never read: `readRoutingProfile` has zero
|
|
14
|
-
callers and `resolveRoute` always returns `routing-infrastructure-missing`.
|
|
15
|
-
|
|
16
|
-
We decided the user control is a **Model roster** — a positive list of
|
|
17
|
-
model-and-effort pairs the user authorizes — plus three **Standard routes**
|
|
18
|
-
that decide when no decisive evidence covers the resolved Routing intent.
|
|
19
|
-
|
|
20
|
-
1. **The optimization dial is removed everywhere it appears, not only from the
|
|
21
|
-
Routing policy.** The Routing intent loses its optimization goal too. What a
|
|
22
|
-
user is willing to spend is a Routing profile choice, not a property of the
|
|
23
|
-
work; leaving the field in the intent while the resolver ignores it would
|
|
24
|
-
leave a dead concept in the domain language. The glossary entry and the
|
|
25
|
-
intent schema both drop it.
|
|
26
|
-
2. **`unreachable` and `missingInfrastructure` are kept.** They are unrelated to
|
|
27
|
-
the dial, and the resolver's fallback semantics depend on them.
|
|
28
|
-
3. **Transport authorization belongs to the Routing profile.** Selecting Claude
|
|
29
|
-
Code and Codex does not authorize either to drive the other's CLI. ADR-0006
|
|
30
|
-
is already explicit that a detected transport is not an approved one; this
|
|
31
|
-
ADR names where the approval is stored — the global profile document, as its
|
|
32
|
-
own interview answer, narrowable per project by intersection only.
|
|
33
|
-
4. **The Routing policy is derived, not stored.** The profile is the stored
|
|
34
|
-
personal choice and carries no revision. The policy is the constraint object
|
|
35
|
-
derived from profile plus inventory for one dispatch, and it carries the
|
|
36
|
-
composed revision so a Dispatch receipt can prove which constraints applied.
|
|
37
|
-
5. **Cost is displayed and used as a tiebreak inside a cohort of identical
|
|
38
|
-
currency and unit — never as the ranking motor.** This is what the Cost dial
|
|
39
|
-
was reaching for, at the only altitude where it is honest.
|
|
40
|
-
6. **The Kit ships no opinion about which models are good.** Excluding a model
|
|
41
|
-
is one user's preference under one subscription, not a default truth. The
|
|
42
|
-
inventory stays unfiltered per ADR-0006; the roster authorizes.
|
|
43
|
-
|
|
44
|
-
## `inherit` is retained, and the condition that would have removed it
|
|
45
|
-
|
|
46
|
-
This ADR was drafted to remove `inherit` entirely if verify-spike 18c (#296)
|
|
47
|
-
could not prove that the session-default model-and-effort pair is readable back
|
|
48
|
-
and identifiable against the roster. **The spike came back positive, so
|
|
49
|
-
`inherit` is retained** in the constrained form: inheritance is permitted only
|
|
50
|
-
when the session-default pair is attested *and* inside the effective roster,
|
|
51
|
-
and otherwise blocks.
|
|
52
|
-
|
|
53
|
-
The condition under which `inherit` is removed entirely therefore stands as a
|
|
54
|
-
standing test, not a settled negative: **if the session-default pair ceases to
|
|
55
|
-
be readable back on a surface, `inherit` is removed for that surface rather
|
|
56
|
-
than left as an unprovable path.** A receipt that cannot name the pair it
|
|
57
|
-
inherited is not proof of anything.
|
|
58
|
-
|
|
59
|
-
The spike qualifies the retention with an identification requirement. One and
|
|
60
|
-
the same Claude Code session reports its default model under three different
|
|
61
|
-
identifiers — `opus[1m]` in `~/.claude/settings.json`, `claude-opus-5[1m]` in
|
|
62
|
-
the session's init event, and `claude-opus-5` in the server-returned
|
|
63
|
-
`message.model`. The attested channel is the one that drops the context
|
|
64
|
-
variant. Roster identification therefore requires an explicit normalization
|
|
65
|
-
rule and a decision on whether the context variant is part of pair identity;
|
|
66
|
-
until that rule exists, "identified against the roster" is not a check a
|
|
67
|
-
receipt may claim to have made.
|
|
68
|
-
|
|
69
|
-
## Consequences
|
|
70
|
-
|
|
71
|
-
- ADR-0006's Routing-policy clause (item 3, "optimization goals and optional
|
|
72
|
-
advanced overrides") and its closing sentence "Model preferences and
|
|
73
|
-
optimization overrides remain optional advanced settings" no longer describe
|
|
74
|
-
the system. The rest of ADR-0006 — the separation of Evidence catalog, Access
|
|
75
|
-
graph, and Routing policy; detection is not authorization; the surface
|
|
76
|
-
adapter capability declaration; the Dispatch receipt requirement — stands
|
|
77
|
-
unchanged and remains the foundation this ADR builds on.
|
|
78
|
-
- `advanced.optimization` is removed from the Routing profile schema, and
|
|
79
|
-
`optimization` from the Routing policy schema, each with a deterministic
|
|
80
|
-
version-aware decoder that records the drop rather than silently discarding a
|
|
81
|
-
choice the user made.
|
|
82
|
-
- Setup's Balanced / Quality / Cost prompt is replaced by roster admission and
|
|
83
|
-
Standard-route nomination.
|
|
84
|
-
- Model-and-effort is pair identity. Effort domains are per model — some models
|
|
85
|
-
support an effort level others do not, and some carry no effort axis at all —
|
|
86
|
-
so a pair is authorized as a pair, never as a model with an effort attached
|
|
87
|
-
afterwards.
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled; mode=github-projects-v2 -->
|
|
2
|
-
# Board sync — GitHub Projects field IDs
|
|
3
|
-
|
|
4
|
-
The workflow board is [Agent Workflow Kit](https://github.com/users/iKon85/projects/3). Board-managed skills address it through the profile below and `scripts/board-sync.py`.
|
|
5
|
-
|
|
6
|
-
<!-- board-sync:profile -->
|
|
7
|
-
```json
|
|
8
|
-
{
|
|
9
|
-
"repo": "iKon85/agent-workflow-kit",
|
|
10
|
-
"project": {
|
|
11
|
-
"number": 3,
|
|
12
|
-
"owner": "iKon85",
|
|
13
|
-
"nodeId": "PVT_kwHOAuH31M4BdM5V"
|
|
14
|
-
},
|
|
15
|
-
"fields": {
|
|
16
|
-
"status": {
|
|
17
|
-
"id": "PVTSSF_lAHOAuH31M4BdM5VzhXwFOk",
|
|
18
|
-
"options": {
|
|
19
|
-
"Idea": "357a9b54",
|
|
20
|
-
"Triaged": "463d3f21",
|
|
21
|
-
"Spec": "1cd0343b",
|
|
22
|
-
"In Progress": "35e6c509",
|
|
23
|
-
"Review": "51f16b28",
|
|
24
|
-
"Done": "491150b6"
|
|
25
|
-
},
|
|
26
|
-
"roles": {
|
|
27
|
-
"idea": "Idea",
|
|
28
|
-
"triaged": "Triaged",
|
|
29
|
-
"spec": "Spec",
|
|
30
|
-
"inProgress": "In Progress",
|
|
31
|
-
"review": "Review",
|
|
32
|
-
"done": "Done"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
"wave": "PVTF_lAHOAuH31M4BdM5VzhXwFWg",
|
|
36
|
-
"cluster": "PVTF_lAHOAuH31M4BdM5VzhXwFWk",
|
|
37
|
-
"specPath": "PVTF_lAHOAuH31M4BdM5VzhXwFWo",
|
|
38
|
-
"planPath": "PVTF_lAHOAuH31M4BdM5VzhXwFWs",
|
|
39
|
-
"phase": {
|
|
40
|
-
"id": "PVTSSF_lAHOAuH31M4BdM5VzhXwFWw",
|
|
41
|
-
"options": {
|
|
42
|
-
"P1": "9c8c93e0",
|
|
43
|
-
"P2": "cf741bec",
|
|
44
|
-
"P3": "8a69a61e"
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
"labels": {
|
|
49
|
-
"readyForAgent": "ready-for-agent",
|
|
50
|
-
"typePrefix": "type:",
|
|
51
|
-
"clusterType": "type:cluster",
|
|
52
|
-
"waveStub": "wave-stub",
|
|
53
|
-
"programType": "type:program"
|
|
54
|
-
},
|
|
55
|
-
"branchPrefixes": ["feat", "fix", "chore", "docs"],
|
|
56
|
-
"prMarkers": {
|
|
57
|
-
"partOf": "Part of",
|
|
58
|
-
"retroMarker": "**Retro:**",
|
|
59
|
-
"retroValues": ["ran", "skipped"]
|
|
60
|
-
},
|
|
61
|
-
"headings": {
|
|
62
|
-
"vorBau": "Clarify Before Build"
|
|
63
|
-
},
|
|
64
|
-
"titles": {
|
|
65
|
-
"wavePrefix": "Welle"
|
|
66
|
-
},
|
|
67
|
-
"wrapup": {
|
|
68
|
-
"remoteBranchSweep": true
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
The Program route uses phases `P1`, `P2`, and `P3`. Saved board views remain a GitHub UI concern; the machine profile above is the workflow SSOT.
|
|
74
|
-
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
# Code-review project layer
|
|
3
|
-
|
|
4
|
-
## Standards sources in this repo
|
|
5
|
-
|
|
6
|
-
- `CLAUDE.md` and `AGENTS.md`
|
|
7
|
-
- `docs/conventions/`
|
|
8
|
-
- The originating issue or PRD for the Spec axis
|
|
9
|
-
|
|
10
|
-
## Adjacent review tooling
|
|
11
|
-
|
|
12
|
-
- `spec-self-critique` reviews plans before code exists; it does not replace diff review.
|
|
13
|
-
- Security audits and simplification passes remain narrower complementary checks.
|
|
14
|
-
|
package/docs/agents/domain.md
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
# Domain docs
|
|
3
|
-
|
|
4
|
-
This is a single-context repository. Before design work, read root `CONTEXT.md` when present and the relevant decisions under `docs/adr/`. Their absence is non-blocking: `grill-with-docs` creates them when the product language or a durable decision first needs recording.
|
|
5
|
-
|
|
6
|
-
Use glossary terms consistently in issues, tests, and skill text. Surface conflicts with an existing ADR instead of silently replacing its decision.
|
|
7
|
-
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
# Issue tracker: GitHub
|
|
3
|
-
|
|
4
|
-
Issues and PRDs for this repo live in `iKon85/agent-workflow-kit` as GitHub issues.
|
|
5
|
-
|
|
6
|
-
## Conventions
|
|
7
|
-
|
|
8
|
-
- Use `gh` for issue reads and comments; infer the repository from the remote.
|
|
9
|
-
- Write multi-line issue and PR bodies through a temporary file and `--body-file`.
|
|
10
|
-
- Route board writes, status/wave/cluster field edits, dependencies, and sub-issue links through `scripts/board-sync.py`, not bare `gh project` commands.
|
|
11
|
-
- Board state is authoritative for workflow status; GitHub issues remain the durable content source.
|
|
12
|
-
|
|
13
|
-
## Pickup claim
|
|
14
|
-
|
|
15
|
-
Used by `/implement`, `/diagnose`, and `/orchestrate-wave` before the first
|
|
16
|
-
edit. Board status `In Progress` is the human-facing signal; the claim below is
|
|
17
|
-
the machine-readable one, and it is the only one that names the branch and
|
|
18
|
-
worktree a colliding session would have to find.
|
|
19
|
-
|
|
20
|
-
- **Check**: `gh issue view <n> --json assignees,comments --jq '{assignees: [.assignees[].login], claims: [.comments[].body | select(contains("<!-- agent-claim:"))]}'` — a foreign assignee or a marker this session did not plant is a foreign claim: stop, report the claimed branch/worktree, and leave it alone.
|
|
21
|
-
- **Claim**: `gh issue edit <n> --add-assignee @me`, then `gh issue comment <n> --body '<!-- agent-claim: branch=<branch>; worktree=<absolute-path>; date=<YYYY-MM-DD> -->'`. Board status stays a `scripts/board-sync.py` write, never a bare `gh project` call.
|
|
22
|
-
- **Release**: the slice PR (`closes #<n>` / `Part of #<anchor>`) supersedes the claim, so `/wrapup` needs no extra step. On abandon: `gh issue edit <n> --remove-assignee @me` plus a `claim released` comment.
|
|
23
|
-
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
<!-- agent-workflow-kit: project-extension/v1; skill=local-ci -->
|
|
3
|
-
# Project layer — local-ci
|
|
4
|
-
|
|
5
|
-
This repo is a Node + stdlib-Python repo with no database, no dev server and no
|
|
6
|
-
typecheck step, so the two generic profiles map onto a short command set. Run the
|
|
7
|
-
two commands below; do not infer others.
|
|
8
|
-
|
|
9
|
-
Prerequisite once per clone (worktrees inherit it):
|
|
10
|
-
|
|
11
|
-
```sh
|
|
12
|
-
git config core.hooksPath .githooks
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Fast static guards
|
|
16
|
-
|
|
17
|
-
The skill/manifest lints, ~3s, no network, no DB. This is exactly what
|
|
18
|
-
`.githooks/pre-commit` runs, so a normal commit already covers it:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
python3 -m unittest discover -s scripts -p 'test_skill_*.py' -q
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Full gate
|
|
25
|
-
|
|
26
|
-
Mirrors the `test` job in `.github/workflows/ci.yml` step for step. Run it from
|
|
27
|
-
the branch's worktree root before opening a PR:
|
|
28
|
-
|
|
29
|
-
```sh
|
|
30
|
-
npm test
|
|
31
|
-
npm run kit:staleness
|
|
32
|
-
npm run release:guard -- --base "$(git merge-base origin/main HEAD)"
|
|
33
|
-
npm pack --dry-run
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Notes on the individual steps:
|
|
37
|
-
|
|
38
|
-
- `npm test` is `test:node` (`node --test`) plus `test:python`
|
|
39
|
-
(`python3 -m unittest discover -s scripts -p 'test_*.py'`). Several negative-path
|
|
40
|
-
tests print `[FAIL] …` lines by design; only the runner's own summary and exit
|
|
41
|
-
code decide red or green.
|
|
42
|
-
- CI runs `npm install --ignore-scripts` first. Locally that is only needed after
|
|
43
|
-
a dependency change.
|
|
44
|
-
- `release:guard` runs in CI on `pull_request` only, against
|
|
45
|
-
`github.event.pull_request.base.sha`. `git merge-base origin/main HEAD` is the
|
|
46
|
-
local equivalent; `git fetch origin main` first if `origin/main` is stale.
|
|
47
|
-
- `npm pack --dry-run` catches packaging drift (a file added outside the
|
|
48
|
-
published set) without publishing anything.
|
|
49
|
-
|
|
50
|
-
## Enforcement
|
|
51
|
-
|
|
52
|
-
Since #220 the host **does** enforce: the `main protection` ruleset makes the CI
|
|
53
|
-
job `test` a required status check on `main`, with no bypass actor. So the
|
|
54
|
-
generic skill's "When the host CAN enforce" branch applies to this repo — the
|
|
55
|
-
local gate is a pre-flight that shortens the feedback loop, not the only thing
|
|
56
|
-
standing between a red branch and `main`.
|
|
57
|
-
|
|
58
|
-
Layered, from cheapest to strongest:
|
|
59
|
-
|
|
60
|
-
| Layer | Runs | Scope |
|
|
61
|
-
| --- | --- | --- |
|
|
62
|
-
| `pre-commit` | automatic, every commit | fast skill/manifest lints |
|
|
63
|
-
| `pre-push` | automatic, every push | full `npm test` |
|
|
64
|
-
| this full gate | explicit, before a PR | `npm test` + staleness + release guard + pack |
|
|
65
|
-
| CI `test` | automatic, on the PR | the same set, machine-enforced at merge |
|
|
66
|
-
|
|
67
|
-
Never bypass a hook with `--no-verify`.
|
|
68
|
-
|
|
69
|
-
**Drift rule.** The full gate above and `.github/workflows/ci.yml` are two copies
|
|
70
|
-
of one list. Change one, change the other in the same PR — otherwise the local
|
|
71
|
-
gate goes green on a set the required check does not accept.
|
|
72
|
-
|
|
73
|
-
## Contention
|
|
74
|
-
|
|
75
|
-
Not applicable here. This repo has no dev server and the suites are process-level
|
|
76
|
-
(`node --test`, `unittest`), so the generic boot-contention false-red guidance has
|
|
77
|
-
no target. A red is a real red until an isolated re-run of that one test proves
|
|
78
|
-
otherwise.
|
|
79
|
-
|
|
80
|
-
## On a red
|
|
81
|
-
|
|
82
|
-
1. Read the failing assertion — the guards print the exact drift (`file:line`,
|
|
83
|
-
the offending token, the missing manifest key).
|
|
84
|
-
2. Fix the source. A guard that legitimately cannot be satisfied yet gets a
|
|
85
|
-
documented allowlist entry with a reason; never widen a guard silently.
|
|
86
|
-
3. Re-run the single failing suite, then the full gate for sign-off.
|
|
87
|
-
|
|
88
|
-
`kit:staleness` red almost always means the generated kit artefacts lag the
|
|
89
|
-
skill sources — run `npm run kit:build` and commit the result rather than
|
|
90
|
-
editing the generated output by hand.
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
<!-- agent-workflow-kit: project-extension/v1; skill=orchestrate-wave -->
|
|
3
|
-
# Project layer — orchestrate-wave
|
|
4
|
-
|
|
5
|
-
Filled 2026-07-27 after Welle 18 (#289) ran the whole loop end-to-end — recon,
|
|
6
|
-
build, integrate, verify, land, tag, publish — and proved the recipe below. The
|
|
7
|
-
sections were deliberately empty until then; the generic fallback carried that
|
|
8
|
-
run and cost it a `degraded` start plus a hand-derivation of every command here.
|
|
9
|
-
|
|
10
|
-
This repo has **no database, no dev server, no typecheck step and no browser
|
|
11
|
-
surface**, so several generic phases collapse to very little. Where that is the
|
|
12
|
-
case the section says so rather than inventing a command.
|
|
13
|
-
|
|
14
|
-
## §Setup
|
|
15
|
-
|
|
16
|
-
Nothing to start. No DB, no tunnel, no service, no dev server — Phase 0's
|
|
17
|
-
"start what live-verify needs" is a no-op here.
|
|
18
|
-
|
|
19
|
-
Two things that are *not* no-ops:
|
|
20
|
-
|
|
21
|
-
- `git config core.hooksPath .githooks` once per clone (worktrees inherit it).
|
|
22
|
-
- `npm install` in the wave worktree after fast-forwarding to `origin/main` —
|
|
23
|
-
the lockfile is untracked, so dependencies do not travel with the branch.
|
|
24
|
-
|
|
25
|
-
## §Builder Commands
|
|
26
|
-
|
|
27
|
-
Per-slice gate, run by the implementer before reporting back:
|
|
28
|
-
|
|
29
|
-
```sh
|
|
30
|
-
npm test # test:node (node --test) + test:python (unittest)
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
The fast pre-commit lints run automatically via `.githooks/pre-commit`
|
|
34
|
-
(~3 s, skill/manifest lints). A slice is not "green" on the fast lints alone.
|
|
35
|
-
|
|
36
|
-
## §Builder Hard Rules
|
|
37
|
-
|
|
38
|
-
- **Never `--no-verify`.** pre-commit and pre-push are the backstop, not an
|
|
39
|
-
obstacle.
|
|
40
|
-
- **English-first prose** in every published skill; the language census in the
|
|
41
|
-
maintainer suite enforces it.
|
|
42
|
-
- **No hardcoded board values** — labels, headings, field IDs and status names
|
|
43
|
-
come from `docs/agents/board-sync.md`; the portability lint blocks literals.
|
|
44
|
-
- **Dual-surface mirror in the same PR.** A changed `.claude/skills/<s>/SKILL.md`
|
|
45
|
-
needs its `.agents/skills/<s>/SKILL.md` mirror via `codex-adapter-sync` in the
|
|
46
|
-
same PR, never after merge.
|
|
47
|
-
- **Shipped-file changes must preserve the manifest/reconcile contract.**
|
|
48
|
-
|
|
49
|
-
## §Integration Suites
|
|
50
|
-
|
|
51
|
-
Both frameworks, every time — `npm test` runs both and a red in either is a red:
|
|
52
|
-
|
|
53
|
-
```sh
|
|
54
|
-
npm test
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
- `test:node` — `node --test` (665 tests as of 0.42.0)
|
|
58
|
-
- `test:python` — `python3 -m unittest discover -s scripts -p 'test_*.py'`
|
|
59
|
-
(522 tests as of 0.42.0)
|
|
60
|
-
|
|
61
|
-
There is no typecheck step in this repo; do not look for one. Several
|
|
62
|
-
negative-path tests print `[FAIL] …` lines **by design** — only the runner's own
|
|
63
|
-
summary and exit code decide red or green.
|
|
64
|
-
|
|
65
|
-
## §Verify Recipe
|
|
66
|
-
|
|
67
|
-
Central verify is the `/local-ci` full gate, run from the wave worktree root.
|
|
68
|
-
It mirrors the CI `test` job step for step:
|
|
69
|
-
|
|
70
|
-
```sh
|
|
71
|
-
git fetch origin main
|
|
72
|
-
npm test
|
|
73
|
-
npm run kit:staleness
|
|
74
|
-
npm run release:guard -- --base "$(git merge-base origin/main HEAD)"
|
|
75
|
-
npm pack --dry-run
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
- **No branch-name-derived guard exists here**, so the generic skill's warning
|
|
79
|
-
about an integrated verify branch blocking with no baseline does not apply.
|
|
80
|
-
No skip or override is needed.
|
|
81
|
-
- **No browser, no headless login, no screenshots, no console check, no DB
|
|
82
|
-
compare, no design/brand check.** This repo ships text; "assert the AC as a
|
|
83
|
-
user-visible outcome" means reading the artefact the slice produced (an ADR,
|
|
84
|
-
a skill body, a script's output) and the tests that pin it.
|
|
85
|
-
- **`release:guard` red with "shipped delta has no version bump" is not a
|
|
86
|
-
failure of the wave** — it means the wave touched the shipped consumer set and
|
|
87
|
-
the release metadata is missing. See §Landing.
|
|
88
|
-
- **A flaky red is possible.** `scripts/codex-exec.test.mjs` contains
|
|
89
|
-
timing-sensitive tests that fail under CPU contention (#345). Re-run the single
|
|
90
|
-
test in isolation before treating it as a real red; a test that is green in
|
|
91
|
-
isolation and red under load is contention, not the wave.
|
|
92
|
-
|
|
93
|
-
## §Headless Login
|
|
94
|
-
|
|
95
|
-
Not applicable. No application, no browser surface, no authenticated session.
|
|
96
|
-
Never invent a login recipe for this repo.
|
|
97
|
-
|
|
98
|
-
## §Landing
|
|
99
|
-
|
|
100
|
-
**One PR for the whole wave**, base `main`. `main` is protected by the
|
|
101
|
-
`main protection` ruleset: a PR is required, the CI job **`test`** (job name, not
|
|
102
|
-
the workflow name `CI`) must be green with the branch up to date, and there are
|
|
103
|
-
no bypass actors — `gh pr merge --admin` does not help.
|
|
104
|
-
|
|
105
|
-
- `Closes #<n>` on its own line per leaf; `Part of #<anchor>` for the anchor,
|
|
106
|
-
never `closes`.
|
|
107
|
-
- Body via temp file + `--body-file`, and **run `gh` from the repo** (it resolves
|
|
108
|
-
the target repo from the cwd).
|
|
109
|
-
|
|
110
|
-
**Anchor reconcile, on PR create and on merge:**
|
|
111
|
-
|
|
112
|
-
```sh
|
|
113
|
-
python3 scripts/board-sync.py anchor-sync <anchor#> --dry-run # review first
|
|
114
|
-
python3 scripts/board-sync.py anchor-sync <anchor#>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
`anchor-sync` only works on a **promoted** anchor whose body carries a slice
|
|
118
|
-
table between `<!-- slice-table:start -->` and `<!-- slice-table:end -->`. A
|
|
119
|
-
stub-shaped anchor (a bullet list of slices, `wave-stub` label) makes it a no-op
|
|
120
|
-
that exits 1 with "no slice table found — nothing to sync". That is a promotion
|
|
121
|
-
gap, not a sync failure: install the table with the columns
|
|
122
|
-
`| # | Status | Slice | Sub-Issue | Gate | closes/refs |`, drop the `wave-stub`
|
|
123
|
-
label, then re-run. Do not hand-maintain the Status cells afterwards — they are
|
|
124
|
-
regenerated from the board.
|
|
125
|
-
|
|
126
|
-
**Completion, after merge:**
|
|
127
|
-
|
|
128
|
-
```sh
|
|
129
|
-
python3 scripts/board-sync.py add --issue <anchor#> --status-role done
|
|
130
|
-
gh issue close <anchor#> --reason completed --comment "…"
|
|
131
|
-
python3 scripts/board-sync.py item-of --issue <anchor#> # re-read: status must be Done
|
|
132
|
-
python3 scripts/board-sync.py parent-of <anchor#> # Program-PRD?
|
|
133
|
-
python3 scripts/board-sync.py program-sync <prd#> # after the anchor is Done
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
Closing the issue does **not** move the board field — set the field, then re-read
|
|
137
|
-
both.
|
|
138
|
-
|
|
139
|
-
**New issues** go through `python3 scripts/board-sync.py create --title … --body-file …`,
|
|
140
|
-
never a bare `gh issue create`.
|
|
141
|
-
|
|
142
|
-
### Release lockstep
|
|
143
|
-
|
|
144
|
-
There is no deploy and no migration, but there **is** a publication gate, and a
|
|
145
|
-
wave that touches the shipped consumer set (anything in the kit manifest —
|
|
146
|
-
including `docs/adr/*` and `docs/research/*`) drags it along.
|
|
147
|
-
|
|
148
|
-
1. `npm run release:prepare -- --base origin/main` reports the delta and a
|
|
149
|
-
`recommendedBump` without writing anything.
|
|
150
|
-
2. **The confirmed Semver is the one human gate.** Ask, unless an explicit
|
|
151
|
-
end-to-end mandate covers release preparation. That confirmed version then
|
|
152
|
-
authorizes metadata, merge, tag *and* publish — do not ask again after merge.
|
|
153
|
-
3. `npm run release:prepare -- --version <x.y.z>`, commit the bump.
|
|
154
|
-
4. Merge the PR. Merging **integrates only**; it cannot publish.
|
|
155
|
-
5. Verify on canonical `main`: tip == merge commit, `package.json` version
|
|
156
|
-
matches, no existing tag. Then `git tag -a v<x.y.z> <main-tip> -m "…"` and
|
|
157
|
-
push. The annotated tag on the `main` tip is the sole publication intent.
|
|
158
|
-
6. **A red release run does not prove nothing was published.** Read
|
|
159
|
-
`npm view @ikon85/agent-workflow-kit version` and `gh release view v<x.y.z>`
|
|
160
|
-
directly, plus `npm run release:status` (cache-bypassing), before reacting.
|
|
161
|
-
7. **Recovery is `gh workflow run release.yml -f tag=v<x.y.z>` on the existing
|
|
162
|
-
tag** — the reconciler is idempotent. **Never recover by bumping the version.**
|
|
163
|
-
|
|
164
|
-
The release workflow runs the full suite *after* the tag is pushed, so a flaky
|
|
165
|
-
test strands an already-published tag. That is the recovery path above, not a
|
|
166
|
-
reason to re-tag.
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
<!-- agent-workflow-kit: project-extension/v1; skill=spec-self-critique -->
|
|
3
|
-
# Project layer — spec-self-critique
|
|
4
|
-
|
|
5
|
-
The generic checklist owns the checks; `/retro` appends project-specific incidents below these stable anchors.
|
|
6
|
-
|
|
7
|
-
## Point 1
|
|
8
|
-
## Point 2
|
|
9
|
-
## Point 3
|
|
10
|
-
## Point 4
|
|
11
|
-
## Point 5
|
|
12
|
-
## Point 6
|
|
13
|
-
## Point 7
|
|
14
|
-
## Point 8
|
|
15
|
-
## Point 9
|
|
16
|
-
## Point 10
|
|
17
|
-
## Point 11
|
|
18
|
-
## Point 12
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
# Triage labels
|
|
3
|
-
|
|
4
|
-
| Canonical role | Label in this repository | Meaning |
|
|
5
|
-
|---|---|---|
|
|
6
|
-
| `needs-info` | `needs-info` | Waiting for information from the reporter |
|
|
7
|
-
| `ready-for-agent` | `ready-for-agent` | Fully specified and safe for an AFK agent |
|
|
8
|
-
|
|
9
|
-
The board Status field owns `Idea`, `Triaged`, `Spec`, `In Progress`, `Review`, and `Done`. Close rejected work instead of adding a separate `wontfix` workflow label.
|
|
10
|
-
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"worktreeLifecycle": {
|
|
3
|
-
"enabled": true,
|
|
4
|
-
"worktreeRoot": ".worktrees",
|
|
5
|
-
"branchTemplate": "{type}/{issue}-{slug}",
|
|
6
|
-
"pathTemplate": "{issue}-{slug}",
|
|
7
|
-
"branchRegex": "^(?:feat|fix|chore|docs)/(?P<issue>\\d+)-",
|
|
8
|
-
"mainBranches": ["main"],
|
|
9
|
-
"protectedBranches": ["main"],
|
|
10
|
-
"scratchPatterns": [
|
|
11
|
-
"PLAN.md",
|
|
12
|
-
"PLAN-REVIEW-LOG.md",
|
|
13
|
-
".claude/logs/**"
|
|
14
|
-
],
|
|
15
|
-
"setupEntry": "python3 scripts/worktree-lifecycle/setup.py",
|
|
16
|
-
"setupSteps": [],
|
|
17
|
-
"riskyCommandPatterns": [
|
|
18
|
-
"\\b(?:npm|pnpm|yarn)\\s+(?:run\\s+)?(?:test|typecheck|build)\\b",
|
|
19
|
-
"\\bgit\\s+(?:commit|push)\\b"
|
|
20
|
-
]
|
|
21
|
-
},
|
|
22
|
-
"wrapup": {
|
|
23
|
-
"landingGeneratedArtifactPatterns": [
|
|
24
|
-
"dist-kit/**",
|
|
25
|
-
"**/__pycache__/**"
|
|
26
|
-
]
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<!-- setup-workflow: state=filled -->
|
|
2
|
-
# Convention — Spec completeness before implementation
|
|
3
|
-
|
|
4
|
-
## Self-Critique-Check
|
|
5
|
-
|
|
6
|
-
**Trigger:** A spec states a concrete count, quantity, or `N of M` claim.
|
|
7
|
-
|
|
8
|
-
**Check:** Is each number freshly derived from the source rather than estimated or recalled?
|
|
9
|
-
|
|
10
|
-
**Korrektur:** Recount from code and replace the claim, or mark it explicitly as an implementation-time assumption.
|
|
11
|
-
|
|
12
|
-
## Vertical-slice completeness
|
|
13
|
-
|
|
14
|
-
Every user-facing slice is an outcome tracer, carries at least one acceptance criterion, names its estimated blast radius, and identifies seam ownership. Every prep slice names the omitted half and the later slice that closes it. `to-issues` must re-derive this readiness rather than trusting a pre-cut table.
|
|
15
|
-
|
|
16
|
-
## Self-Critique-Check
|
|
17
|
-
|
|
18
|
-
**Trigger:** A spec contains a wave/slice table or decomposes into multiple issues.
|
|
19
|
-
|
|
20
|
-
**Check:** Are rows outcomes rather than layer names, and do enablers name the outcome wave that closes them?
|
|
21
|
-
|
|
22
|
-
**Korrektur:** Reword or split layer-only rows and make every deferred half explicit.
|
|
23
|
-
|