orchestrix-skills 0.4.0 → 0.5.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/package.json +1 -1
- package/project-scaffold/core-config.yaml +5 -1
- package/project-scaffold/knowledge/taste/coding-standards.md +10 -7
- package/skills/brainstorm/SKILL.md +3 -2
- package/skills/draft-story/SKILL.md +9 -7
- package/skills/map-codebase/SKILL.md +6 -4
- package/skills/orchestrate/SKILL.md +52 -4
package/package.json
CHANGED
|
@@ -12,7 +12,11 @@ work: # work products — skills WRITE these (outputs:), humans review at gates
|
|
|
12
12
|
stories: docs/stories # <slug>.md (flat, origin tag)
|
|
13
13
|
research: docs/research # research briefs
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
# FIXED platform protocol — the orchestrate skill writes, and the platform polls,
|
|
16
|
+
# `.orchestrate/ledger.jsonl` + `.orchestrate/verify/` at this literal path. It is
|
|
17
|
+
# NOT a remappable namespace: changing it breaks live progress rendering. Listed
|
|
18
|
+
# here for transparency only.
|
|
19
|
+
runtime: .orchestrate # ledger + verify logs (ephemeral, gitignored)
|
|
16
20
|
|
|
17
21
|
# Org-level cascade (shared taste/standards across many products) is intentionally
|
|
18
22
|
# NOT enabled yet (YAGNI). When needed: add an `extends:` base that project paths
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
# taste/coding-standards
|
|
2
2
|
|
|
3
3
|
Rules `implement` and `review-code` read as their taste slice. Terse rules, each
|
|
4
|
-
with provenance. Not prose. Seed
|
|
4
|
+
with provenance. Not prose. Seed is empty — this is honest: no project
|
|
5
|
+
preferences exist yet. Rows enter via human seeding (orchestrate's first-run
|
|
6
|
+
preflight offers this) or the metabolism loop — never as unapproved defaults.
|
|
5
7
|
|
|
6
|
-
| id
|
|
7
|
-
|
|
|
8
|
-
| ts-strict | TypeScript strict mode on; no `any` without an inline justification | Catches runtime errors at compile time | human | 2026-06-27 | dorayo |
|
|
9
|
-
| named-exports | Named exports only; no default exports | Refactor-safe imports, better autocomplete | human | 2026-06-27 | dorayo |
|
|
10
|
-
| no-swallow | Never swallow errors; handle or rethrow with context | Silent failures are undebuggable | human | 2026-06-27 | dorayo |
|
|
11
|
-
| pure-io-split | Keep I/O at the edges; core logic pure and testable | Testability, fewer mocks | human | 2026-06-27 | dorayo |
|
|
8
|
+
| id | rule | rationale | source | added | approved_by |
|
|
9
|
+
| --- | ---- | --------- | ------ | ----- | ----------- |
|
|
12
10
|
|
|
13
11
|
<!--
|
|
12
|
+
Row shape (copy per rule — every row needs real provenance):
|
|
13
|
+
|
|
14
|
+
| ts-strict | TypeScript strict mode on; no `any` without inline justification | Catches runtime errors at compile time | human | <date> | <who> |
|
|
15
|
+
| named-exports | Named exports only; no default exports | Refactor-safe imports, better autocomplete | human | <date> | <who> |
|
|
16
|
+
|
|
14
17
|
Metabolism: when a human corrects taste at the accept gate, append or supersede a
|
|
15
18
|
row here (source: <skill or human>, with date + approver). Supersede, don't
|
|
16
19
|
delete — keep what the org learned visible.
|
|
@@ -29,8 +29,9 @@ but always presented and approved.
|
|
|
29
29
|
|
|
30
30
|
## Process
|
|
31
31
|
|
|
32
|
-
1. **Explore context.** Read the relevant
|
|
33
|
-
|
|
32
|
+
1. **Explore context.** Read the relevant knowledge slices (`taste/*`,
|
|
33
|
+
`architecture/*`, `registry/*` — physical paths from `core-config.yaml`,
|
|
34
|
+
default under `knowledge/`) and existing code before asking anything.
|
|
34
35
|
2. **Scope check first.** If the intent spans independent subsystems, say so and
|
|
35
36
|
help decompose into sub-projects — each gets its own spec → stories → build.
|
|
36
37
|
Don't refine details of something that should be split.
|
|
@@ -7,8 +7,8 @@ metadata:
|
|
|
7
7
|
contract:
|
|
8
8
|
inputs: [requirement, context]
|
|
9
9
|
reads: [taste/coding-standards, registry/api, registry/db, front-end-spec?]
|
|
10
|
-
outputs: [
|
|
11
|
-
authority: "Write one flat story file
|
|
10
|
+
outputs: [stories/<slug>.md]
|
|
11
|
+
authority: "Write one flat story file in the stories namespace (physical path from core-config.yaml; default docs/stories/). No folders. No source code. No production. No spend."
|
|
12
12
|
verify: "Every requirement maps to at least one acceptance criterion; constraints are copied verbatim; no placeholders (no TBD/TODO/'handle edge cases')."
|
|
13
13
|
accept:
|
|
14
14
|
when: "Always — this output sets the direction the whole build rests on."
|
|
@@ -25,7 +25,8 @@ implement it without guessing.
|
|
|
25
25
|
|
|
26
26
|
## Output
|
|
27
27
|
|
|
28
|
-
Write ONE flat Markdown file
|
|
28
|
+
Write ONE flat Markdown file in the stories namespace (physical path from
|
|
29
|
+
`core-config.yaml`, default `docs/stories/`): `<slug>.md` — `<slug>` is a kebab
|
|
29
30
|
handle from the title. No folders, no `epic.story` numbering. Produce exactly
|
|
30
31
|
these sections (with frontmatter) and nothing more.
|
|
31
32
|
|
|
@@ -76,9 +77,9 @@ What this story deliberately does NOT do.
|
|
|
76
77
|
## Rules
|
|
77
78
|
|
|
78
79
|
- **One story, one coherent deliverable.** If it spans independent subsystems,
|
|
79
|
-
split into separate stories — each its own
|
|
80
|
-
sharing the same `origin` so the set is queryable as one group.
|
|
81
|
-
- **Flat, no hierarchy.** One file per story
|
|
80
|
+
split into separate stories — each its own `<slug>.md` in the stories
|
|
81
|
+
namespace, all sharing the same `origin` so the set is queryable as one group.
|
|
82
|
+
- **Flat, no hierarchy.** One file per story in the stories dir. Grouping is
|
|
82
83
|
the `origin` field (a query the AI runs), never a folder. Order comes from
|
|
83
84
|
Interfaces (dependencies), never from a number.
|
|
84
85
|
- **No placeholders.** "Add validation", "handle errors", "TBD" are failures.
|
|
@@ -101,6 +102,7 @@ What this story deliberately does NOT do.
|
|
|
101
102
|
|
|
102
103
|
## Done
|
|
103
104
|
|
|
104
|
-
Write
|
|
105
|
+
Write the story file in the stories namespace. Hand off its path for direction
|
|
106
|
+
confirmation
|
|
105
107
|
(this skill's `accept` is `inline`): the human approves the direction, or sends
|
|
106
108
|
it back, before `implement` begins.
|
|
@@ -8,7 +8,7 @@ metadata:
|
|
|
8
8
|
inputs: [repo_path, focus?]
|
|
9
9
|
reads: []
|
|
10
10
|
outputs: [codebase_map, registry_updates]
|
|
11
|
-
authority: "Read-only on source; non-mutating commands only (ls, grep, git log, test discovery). Writes go ONLY to knowledge/registry
|
|
11
|
+
authority: "Read-only on source; non-mutating commands only (ls, grep, git log, test discovery). Writes go ONLY to the registry/* namespace (physical path from core-config.yaml; default knowledge/registry/)."
|
|
12
12
|
verify: "Every architectural claim in the map cites a file path you actually read; the traced flows exist in code, not in the README."
|
|
13
13
|
accept:
|
|
14
14
|
when: "never — informational; it feeds design and implement."
|
|
@@ -39,8 +39,10 @@ and the source describe what it is.
|
|
|
39
39
|
4. **Hazards.** Migrations and how they run; generated code and what generates
|
|
40
40
|
it; global state; areas with no test coverage; anything `git log` shows as
|
|
41
41
|
churn-heavy (bug-prone) or untouched-for-years (fragile assumptions).
|
|
42
|
-
5. **Write back to `
|
|
43
|
-
|
|
42
|
+
5. **Write back to the `registry/*` namespace** (physical path from
|
|
43
|
+
`core-config.yaml`; default `knowledge/registry/`) following the metabolism
|
|
44
|
+
governance in `orchestrate` (read-before-write, update-don't-append, facts
|
|
45
|
+
only):
|
|
44
46
|
- `registry/architecture.md` — the traced structure
|
|
45
47
|
- `registry/conventions.md` — the evidenced conventions
|
|
46
48
|
Registry holds FACTS about this codebase. Opinions and preferences belong
|
|
@@ -67,7 +69,7 @@ and the source describe what it is.
|
|
|
67
69
|
- Repeating a README/document claim without spot-checking it in code
|
|
68
70
|
- A "convention" cited from zero examples
|
|
69
71
|
- Writing preferences/judgments into `registry/` (facts only)
|
|
70
|
-
- Editing anything outside `
|
|
72
|
+
- Editing anything outside the `registry/*` namespace
|
|
71
73
|
|
|
72
74
|
## Done
|
|
73
75
|
|
|
@@ -4,10 +4,10 @@ description: Use when a goal must be delivered end-to-end by composing skills, w
|
|
|
4
4
|
license: MIT
|
|
5
5
|
allowed-tools: [Read, Write, Edit, Bash, Grep, Glob, Task]
|
|
6
6
|
metadata:
|
|
7
|
-
version:
|
|
7
|
+
version: 5
|
|
8
8
|
contract:
|
|
9
9
|
inputs: [intent, constraints?]
|
|
10
|
-
reads: [skill-registry, taste/*]
|
|
10
|
+
reads: [core-config, skill-registry, taste/*]
|
|
11
11
|
outputs: [accepted_deliverable, run_ledger]
|
|
12
12
|
authority: "Dispatch leaf skills, each within its own authority. Do not directly touch source, production, or spend — leaf skills do that, gated. Enforce every accept gate."
|
|
13
13
|
verify: "Every dispatched skill's verify passed; final review is clean; all inline accepts were obtained."
|
|
@@ -32,14 +32,17 @@ no step above intent.
|
|
|
32
32
|
## The loop
|
|
33
33
|
|
|
34
34
|
1. **Bind intent.** Read the human's goal and constraints. This is the only
|
|
35
|
-
place intent enters.
|
|
35
|
+
place intent enters. Then run the first-run preflight (below) before any
|
|
36
|
+
wiring.
|
|
36
37
|
2. **Select.** Read the skill registry. Pick skills by their `description`
|
|
37
38
|
(when-to-use). Load a skill's full `contract` only when it is a candidate —
|
|
38
39
|
never load every contract at once.
|
|
39
40
|
3. **Wire (emergent, not hardcoded).** Build the path by matching one skill's
|
|
40
41
|
`outputs` to the next skill's `inputs`. Skills do not know each other; only
|
|
41
42
|
you do. Do not assume a fixed pipeline — wire what this intent needs.
|
|
42
|
-
4. **Dispatch.** Hand the skill exactly the `inputs` it declares, as files
|
|
43
|
+
4. **Dispatch.** Hand the skill exactly the `inputs` it declares, as files —
|
|
44
|
+
resolving each logical namespace it reads/writes to a physical path via
|
|
45
|
+
`core-config.yaml` (see Namespace resolution). Run
|
|
43
46
|
it as a fresh subagent for isolation. Choose the cheapest model that can do
|
|
44
47
|
the step. **Dispatch independent steps in PARALLEL** (whose `inputs` don't
|
|
45
48
|
depend on each other) — as concurrent FOREGROUND subagents awaited together in
|
|
@@ -66,6 +69,49 @@ no step above intent.
|
|
|
66
69
|
8. **Final acceptance.** Present the batched deferred accepts and a final review
|
|
67
70
|
to the human, once. Apply corrections (see Metabolism), then deliver.
|
|
68
71
|
|
|
72
|
+
## Namespace resolution (`core-config.yaml`)
|
|
73
|
+
|
|
74
|
+
Skill contracts address knowledge and work products by **logical namespace**
|
|
75
|
+
(`taste/*`, `architecture/*`, `registry/*`, `specs/*`, `stories/*`,
|
|
76
|
+
`research/*`), never by physical path. At run start, read `core-config.yaml`
|
|
77
|
+
once and build the logical→physical map. When you dispatch a skill, resolve
|
|
78
|
+
every namespace in its `reads:` / `outputs:` / `updates:` to a real path via
|
|
79
|
+
that map, and hand the resolved files as its inputs. If `core-config.yaml` is
|
|
80
|
+
absent, fall back to the scaffold defaults (`knowledge/taste`,
|
|
81
|
+
`knowledge/architecture`, `knowledge/registry`, `docs/specs`, `docs/stories`,
|
|
82
|
+
`docs/research`).
|
|
83
|
+
|
|
84
|
+
This is what makes brownfield work: a project keeps its brain wherever it
|
|
85
|
+
already lives, the mapping changes, the skills do not.
|
|
86
|
+
|
|
87
|
+
**Exception — the ledger/verify path is a FIXED platform protocol, not a
|
|
88
|
+
namespace.** Always write to `.orchestrate/ledger.jsonl` and
|
|
89
|
+
`.orchestrate/verify/…` literally. The platform polls that exact path to render
|
|
90
|
+
live progress; it is NOT resolved through `core-config.yaml` and must not be
|
|
91
|
+
remapped.
|
|
92
|
+
|
|
93
|
+
## First-run preflight (brownfield guard)
|
|
94
|
+
|
|
95
|
+
Emergent wiring alone can silently skip brownfield entry. So after binding
|
|
96
|
+
intent, run two DETERMINISTIC checks (cheap: one `ls`/`test -d` each on the
|
|
97
|
+
resolved paths):
|
|
98
|
+
|
|
99
|
+
1. **Empty registry + existing code → map-codebase is MANDATORY.** If the
|
|
100
|
+
resolved `registry/*` namespace is empty or missing AND the repo already
|
|
101
|
+
contains source code, wire `map-codebase` before any design or build skill.
|
|
102
|
+
This is a hard rule, not a description-match: building on an unmapped
|
|
103
|
+
codebase produces changes that fight it.
|
|
104
|
+
2. **Empty taste → surface it once.** If the resolved `taste/*` namespace is
|
|
105
|
+
empty — no project-specific entries; file headers, shape comments, and
|
|
106
|
+
unedited scaffold examples do NOT count — tell the human at the front gate: the brain has no preferences yet;
|
|
107
|
+
offer to draft `taste/coding-standards` from existing material (CLAUDE.md,
|
|
108
|
+
lint configs, review conventions) for their approval. Never seed taste
|
|
109
|
+
without human sign-off (opinions enter the brain only through a human —
|
|
110
|
+
same rule as Metabolism). If they decline, proceed with defaults and do not
|
|
111
|
+
ask again this run.
|
|
112
|
+
|
|
113
|
+
Both checks are per-run and idempotent: a populated brain makes them no-ops.
|
|
114
|
+
|
|
69
115
|
## Accept gate
|
|
70
116
|
|
|
71
117
|
| Skill's `accept.timing` | Skill's `authority` | Action |
|
|
@@ -169,4 +215,6 @@ a false claim.
|
|
|
169
215
|
- A 4th rework attempt on the same step (cap is 3 — stop and gate)
|
|
170
216
|
- A second rework attempt with no `investigate` when the failure isn't understood
|
|
171
217
|
- Appending to `taste/*` without reading it first (duplicate/contradiction risk)
|
|
218
|
+
- Dispatching a design/build skill in an existing codebase while `registry/*`
|
|
219
|
+
is empty (first-run preflight skipped)
|
|
172
220
|
- Marking the run complete without every step's `verify` evidence
|