@vegastack/vegafactory 0.19.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/LICENSE +21 -0
- package/README.md +417 -0
- package/dist/dashboard-artifact.json +21240 -0
- package/dist/index.js +22752 -0
- package/dist/run-wrapper.js +377 -0
- package/package.json +46 -0
- package/skill/dev-architect/SKILL.md +106 -0
- package/skill/dev-architect/agents/openai.yaml +4 -0
- package/skill/dev-architect/references/ai-agents.md +96 -0
- package/skill/dev-architect/references/conventions.md +113 -0
- package/skill/dev-architect/references/data.md +89 -0
- package/skill/dev-architect/references/infra.md +99 -0
- package/skill/dev-architect/references/mobile.md +75 -0
- package/skill/dev-architect/references/pinned-facts.md +133 -0
- package/skill/dev-architect/references/principles.md +117 -0
- package/skill/dev-architect/references/security.md +90 -0
- package/skill/dev-architect/references/stack.md +38 -0
- package/skill/dev-architect/references/web.md +102 -0
- package/skill/dev-architect/refresh/REFRESH.md +31 -0
- package/skill/dev-architect/refresh/sources.json +239 -0
- package/skill/dev-chronicle/SKILL.md +52 -0
- package/skill/dev-chronicle/agents/openai.yaml +4 -0
- package/skill/dev-chronicle/references/conventions.md +113 -0
- package/skill/dev-chronicle/references/styles.md +75 -0
- package/skill/dev-chronicle/refresh/REFRESH.md +3 -0
- package/skill/dev-chronicle/refresh/sources.json +6 -0
- package/skill/dev-debug/SKILL.md +43 -0
- package/skill/dev-debug/agents/openai.yaml +4 -0
- package/skill/dev-debug/references/conventions.md +113 -0
- package/skill/dev-debug/references/loop-ladder.md +20 -0
- package/skill/dev-debug/refresh/REFRESH.md +3 -0
- package/skill/dev-debug/refresh/sources.json +6 -0
- package/skill/dev-implement/SKILL.md +81 -0
- package/skill/dev-implement/agents/openai.yaml +4 -0
- package/skill/dev-implement/assets/workflows/implement-children.js +12 -0
- package/skill/dev-implement/references/ask-route.md +80 -0
- package/skill/dev-implement/references/changelog-and-chronicle.md +21 -0
- package/skill/dev-implement/references/conventions.md +113 -0
- package/skill/dev-implement/references/ledger-and-resume.md +52 -0
- package/skill/dev-implement/references/parallel-children.md +35 -0
- package/skill/dev-implement/references/worktrees.md +63 -0
- package/skill/dev-implement/refresh/REFRESH.md +3 -0
- package/skill/dev-implement/refresh/sources.json +6 -0
- package/skill/dev-implement/scripts/children.mjs +479 -0
- package/skill/dev-implement/scripts/effective-policy.mjs +694 -0
- package/skill/dev-implement/scripts/evidence-check.mjs +107 -0
- package/skill/dev-implement/scripts/evidence-upload.mjs +181 -0
- package/skill/dev-implement/scripts/learning.mjs +41 -0
- package/skill/dev-implement/scripts/lib/approval.mjs +1182 -0
- package/skill/dev-implement/scripts/lib/gh.mjs +101 -0
- package/skill/dev-implement/scripts/preflight.mjs +153 -0
- package/skill/dev-implement/scripts/questions.mjs +381 -0
- package/skill/dev-implement/scripts/reclaim.mjs +116 -0
- package/skill/dev-implement/scripts/recovery.mjs +213 -0
- package/skill/dev-implement/scripts/worktree.mjs +991 -0
- package/skill/dev-intake/SKILL.md +80 -0
- package/skill/dev-intake/agents/openai.yaml +4 -0
- package/skill/dev-intake/references/ask-route.md +80 -0
- package/skill/dev-intake/references/brief-template.md +89 -0
- package/skill/dev-intake/references/conventions.md +113 -0
- package/skill/dev-intake/refresh/REFRESH.md +3 -0
- package/skill/dev-intake/refresh/sources.json +6 -0
- package/skill/dev-intake/scripts/brief-lint.mjs +87 -0
- package/skill/dev-intake/scripts/lib/approval.mjs +1182 -0
- package/skill/dev-intake/scripts/questions.mjs +381 -0
- package/skill/dev-plan/SKILL.md +54 -0
- package/skill/dev-plan/agents/openai.yaml +4 -0
- package/skill/dev-plan/references/ask-route.md +80 -0
- package/skill/dev-plan/references/conventions.md +113 -0
- package/skill/dev-plan/references/plan-format.md +82 -0
- package/skill/dev-plan/refresh/REFRESH.md +3 -0
- package/skill/dev-plan/refresh/sources.json +6 -0
- package/skill/dev-plan/scripts/lib/approval.mjs +1182 -0
- package/skill/dev-plan/scripts/plan-lint.mjs +319 -0
- package/skill/dev-plan/scripts/questions.mjs +381 -0
- package/skill/dev-review/SKILL.md +76 -0
- package/skill/dev-review/agents/openai.yaml +4 -0
- package/skill/dev-review/assets/review-known-patterns.md.template +32 -0
- package/skill/dev-review/references/conventions.md +113 -0
- package/skill/dev-review/references/cross-agent.md +39 -0
- package/skill/dev-review/references/dispatch-prompts.md +121 -0
- package/skill/dev-review/references/security-axis.md +45 -0
- package/skill/dev-review/refresh/REFRESH.md +5 -0
- package/skill/dev-review/refresh/sources.json +6 -0
- package/skill/dev-setup/SKILL.md +113 -0
- package/skill/dev-setup/agents/openai.yaml +4 -0
- package/skill/dev-setup/assets/agents-section.md.template +24 -0
- package/skill/dev-setup/assets/dev-profile.md.template +102 -0
- package/skill/dev-setup/assets/factory-board.yml.template +162 -0
- package/skill/dev-setup/assets/hooks/decision-nudge.mjs +30 -0
- package/skill/dev-setup/assets/hooks/prompt-skill-mention.mjs +29 -0
- package/skill/dev-setup/assets/hooks/session-end.mjs +14 -0
- package/skill/dev-setup/assets/hooks/session-start.mjs +178 -0
- package/skill/dev-setup/assets/hooks/ship-guard.mjs +738 -0
- package/skill/dev-setup/assets/hooks/skill-activated.mjs +47 -0
- package/skill/dev-setup/assets/hooks/stop-heartbeat.mjs +14 -0
- package/skill/dev-setup/assets/workflows/implement-children.js +12 -0
- package/skill/dev-setup/references/ask-route.md +80 -0
- package/skill/dev-setup/references/conventions.md +113 -0
- package/skill/dev-setup/references/github-app.md +286 -0
- package/skill/dev-setup/references/harness-facts.md +169 -0
- package/skill/dev-setup/references/stack-playbooks.md +124 -0
- package/skill/dev-setup/refresh/REFRESH.md +13 -0
- package/skill/dev-setup/refresh/sources.json +602 -0
- package/skill/dev-setup/scripts/effective-policy.mjs +694 -0
- package/skill/dev-setup/scripts/questions.mjs +381 -0
- package/skill/dev-setup/scripts/ship-policy.mjs +195 -0
- package/skill/dev-ship/SKILL.md +56 -0
- package/skill/dev-ship/agents/openai.yaml +4 -0
- package/skill/dev-ship/references/conventions.md +113 -0
- package/skill/dev-ship/references/runbook.md +72 -0
- package/skill/dev-ship/refresh/REFRESH.md +3 -0
- package/skill/dev-ship/refresh/sources.json +6 -0
- package/skill/dev-ship/scripts/lib/approval.mjs +1182 -0
- package/skill/dev-ship/scripts/ship-gate.mjs +485 -0
- package/skill/dev-status/SKILL.md +56 -0
- package/skill/dev-status/agents/openai.yaml +4 -0
- package/skill/dev-status/references/conventions.md +113 -0
- package/skill/dev-status/refresh/REFRESH.md +3 -0
- package/skill/dev-status/refresh/sources.json +6 -0
- package/skill/dev-status/scripts/effective-policy.mjs +694 -0
- package/skill/dev-status/scripts/status.mjs +311 -0
- package/skill/skill-maintainer/SKILL.md +82 -0
- package/skill/skill-maintainer/agents/openai.yaml +4 -0
- package/skill/skill-maintainer/references/release-ops.md +61 -0
- package/skill/skill-maintainer/references/standards.md +137 -0
- package/skill/skill-maintainer/refresh/REFRESH.md +40 -0
- package/skill/skill-maintainer/refresh/sources.json +103 -0
- package/skill/skill-scan/SKILL.md +59 -0
- package/skill/skill-scan/agents/openai.yaml +4 -0
- package/skill/skill-scan/refresh/REFRESH.md +18 -0
- package/skill/skill-scan/refresh/sources.json +133 -0
- package/skill/skill-scan/scripts/lib/skillspector.mjs +226 -0
- package/skill/skill-scan/scripts/skill-scan.mjs +1002 -0
- package/skill/skillify/SKILL.md +108 -0
- package/skill/skillify/agents/openai.yaml +4 -0
- package/skill/skillify/assets/templates/README.md.template +26 -0
- package/skill/skillify/assets/templates/REFRESH.md.template +16 -0
- package/skill/skillify/assets/templates/SKILL.md.template +27 -0
- package/skill/skillify/assets/templates/evals.json.template +12 -0
- package/skill/skillify/assets/templates/openai.yaml.template +4 -0
- package/skill/skillify/assets/templates/skill.test.ts.template +27 -0
- package/skill/skillify/assets/templates/sources.json.template +6 -0
- package/skill/skillify/assets/templates/trigger-queries.json.template +1 -0
- package/skill/skillify/references/authoring.md +103 -0
- package/skill/skillify/references/eval-playbook.md +112 -0
- package/skill/skillify/refresh/REFRESH.md +23 -0
- package/skill/skillify/refresh/sources.json +6 -0
- package/skill/skillify/scripts/scaffold-skill.mjs +334 -0
- package/skill/skillify/scripts/trigger-check.mjs +209 -0
- package/skill/vegafactory-setup/SKILL.md +77 -0
- package/skill/vegafactory-setup/agents/openai.yaml +4 -0
- package/skill/vegafactory-setup/assets/control-room/boards.md.template +17 -0
- package/skill/vegafactory-setup/assets/control-room/decisions.md.template +5 -0
- package/skill/vegafactory-setup/assets/control-room/group.md.template +44 -0
- package/skill/vegafactory-setup/assets/control-room/onboarding/dispatcher-box.md.template +86 -0
- package/skill/vegafactory-setup/assets/control-room/onboarding/new-repo.md.template +13 -0
- package/skill/vegafactory-setup/assets/control-room/onboarding/new-teammate.md.template +12 -0
- package/skill/vegafactory-setup/assets/control-room/org.md.template +60 -0
- package/skill/vegafactory-setup/assets/control-room/people.csv.template +2 -0
- package/skill/vegafactory-setup/assets/control-room/repos.md.template +7 -0
- package/skill/vegafactory-setup/assets/control-room/rules/CODEOWNERS.template +6 -0
- package/skill/vegafactory-setup/assets/control-room/rules/README.md.template +9 -0
- package/skill/vegafactory-setup/assets/control-room/rules/stats-privacy.md.template +44 -0
- package/skill/vegafactory-setup/assets/control-room/templates/README.md.template +9 -0
- package/skill/vegafactory-setup/references/control-room.md +149 -0
- package/skill/vegafactory-setup/references/conventions.md +113 -0
- package/skill/vegafactory-setup/refresh/REFRESH.md +5 -0
- package/skill/vegafactory-setup/refresh/sources.json +6 -0
- package/skill-integrity.json +252 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Cross-agent review
|
|
2
|
+
|
|
3
|
+
The independence upgrade: the review runs on the *other* agent — Codex when Claude built the code, Claude when Codex did — so the reviewer shares no model, no session, and no authorship with the implementer. Used on `risky` issues by default and whenever dev.md's `review:` knob says `cross-agent`.
|
|
4
|
+
|
|
5
|
+
## Announce, invoke, summarize — the operator is never blind
|
|
6
|
+
|
|
7
|
+
1. **At trigger time**, tell the operator in plain language: "invoking Codex for the cross-agent review of issue #N" — before the call, not after.
|
|
8
|
+
2. **Invoke** non-interactively with the handoff below passed as ONE argument through an exec arg array — `execFile('codex', ['exec', '-c', 'model=<model>', '-c', 'model_reasoning_effort=<effort>', handoff])` from Claude, `execFile('claude', ['-p', '--model', '<model>', '--effort', '<effort>', handoff])` from Codex — never interpolated into a shell string (the exact pattern this skill's own known-patterns template says to still-flag). `<model>` and `<effort>` come from dev.md's `harness-policy:` `review` entry; with no such line, drop both flag pairs and let the reviewing harness use its own defaults rather than inventing a model id.
|
|
9
|
+
3. **At the end**, summarize: which agent reviewed, the verdict, where its comment is, and what's worth the operator double-checking.
|
|
10
|
+
|
|
11
|
+
## The handoff — exact format
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
REVIEW REQUEST (vsk cross-agent v1)
|
|
15
|
+
repo: <absolute path> · issue: <url> · branch: <name> · range: <base7>..<head7>
|
|
16
|
+
brief: the issue description (marker type=brief) · plan: the issue comment
|
|
17
|
+
marked type=plan · package: <path to the review package file> · known-patterns:
|
|
18
|
+
.vegastack/review-known-patterns.md · conventions: references/conventions.md inside ANY installed dev-family skill
|
|
19
|
+
(e.g. .claude/skills/dev-review/references/conventions.md — every dev skill ships a copy)
|
|
20
|
+
axes: spec, standards[, security]
|
|
21
|
+
output contract: post exactly ONE issue comment in the review-comment format
|
|
22
|
+
(marker: <!-- vsk:v1 type=review round=<n> sha=<head7> agent=codex verdict=... -->;
|
|
23
|
+
the reverse direction writes agent=claude);
|
|
24
|
+
on a re-review round, EDIT that same comment — update its single top marker to the
|
|
25
|
+
new round/sha/verdict and append the round section below (never a second marker,
|
|
26
|
+
never a second comment),
|
|
27
|
+
findings as Finding [N] with severities [CRITICAL|MUST-FIX|SHOULD-FIX|NIT] and
|
|
28
|
+
path:line evidence; nitpicks and low-confidence collapsed in <details>.
|
|
29
|
+
constraints: READ-ONLY — never commit, push, edit files, or change labels; your
|
|
30
|
+
only write is the review comment, via gh.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The reviewing agent posts its own comment with its own `agent=` key — independence stays verifiable in the record, never paraphrased by the author.
|
|
34
|
+
|
|
35
|
+
## Fallbacks and failure honesty
|
|
36
|
+
|
|
37
|
+
- The other agent's CLI is not installed → fall back to the manual relay (tell the operator which agent to point at the issue), and note that `dev-setup` records the gap and recommends installing it.
|
|
38
|
+
- The invocation fails or times out → say so plainly, fall back to a fresh-subagent review, and label the evidence comment's Review line accordingly — never silently substitute and call it cross-agent.
|
|
39
|
+
- The other agent's review misses the output contract (no marker, no severities) → treat its content as raw findings: post them yourself in the correct format with `agent=` credited, and note the reformatting.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Reviewer dispatch prompts
|
|
2
|
+
|
|
3
|
+
The verbatim briefs each axis subagent receives. Compose with paths and constraints rather than pasted history, because a reviewer handed the session transcript inherits its blind spots. Every dispatch carries the shared preamble, then its axis brief.
|
|
4
|
+
|
|
5
|
+
## Shared preamble (every axis)
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
<document name="brief" path="<issue url or path>"/>
|
|
9
|
+
<document name="plan">the plan comment (marker type=plan) on that issue</document>
|
|
10
|
+
<document name="package" path="<package path>"/>
|
|
11
|
+
<document name="constraints">
|
|
12
|
+
<constraints block, copied verbatim from the brief and plan>
|
|
13
|
+
</document>
|
|
14
|
+
|
|
15
|
+
You are a fresh-context reviewer with no memory of writing this change and no
|
|
16
|
+
stake in it passing. Read every document above in full, and the full files
|
|
17
|
+
where the diff needs context (30 or more lines around a hunk), because a
|
|
18
|
+
diff-only read misses invariants. Do all reading and judging yourself: a
|
|
19
|
+
reviewer you spawn duplicates this review at full cost and its opinion counts
|
|
20
|
+
for nothing in the process.
|
|
21
|
+
|
|
22
|
+
Report every finding you see, each with its confidence (high, medium, low)
|
|
23
|
+
and severity; the review loop and adjudication downstream are the filter,
|
|
24
|
+
so a finding left out here is one nobody can weigh. Report verified absence
|
|
25
|
+
of findings the same way. A change that is large, late or almost done gets
|
|
26
|
+
the same reading as any other.
|
|
27
|
+
|
|
28
|
+
Write your full report to <report path>, each finding as:
|
|
29
|
+
Finding [N]: <title> — [SEVERITY] (confidence: high|medium|low) path:line,
|
|
30
|
+
issue, why it matters, fix (fenced snippet when code).
|
|
31
|
+
Return only short status: verdict, per-severity counts, one line per finding
|
|
32
|
+
(title, severity, path:line) — the detail lives in the report file.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Spec axis brief
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
Are there bugs in this change? Judge the diff against the current brief and plan only:
|
|
39
|
+
(a) MISSING — requirements asked for that are absent or partial;
|
|
40
|
+
(b) SCOPE CREEP — behavior in the diff nobody asked for;
|
|
41
|
+
(c) WRONG — requirements that look implemented but don't do what the brief
|
|
42
|
+
says.
|
|
43
|
+
Quote the exact brief/plan line for every finding. If code and brief diverge
|
|
44
|
+
because the operator changed direction, that is still a finding — the brief
|
|
45
|
+
must be revision-updated before review can pass; say so.
|
|
46
|
+
|
|
47
|
+
Tests-are-real rubric — flag as [MUST-FIX] any acceptance-relevant test that is:
|
|
48
|
+
- implementation-coupled: mocks internal collaborators, asserts call
|
|
49
|
+
counts/order, or breaks on refactor without behavior change;
|
|
50
|
+
- tautological: the assertion recomputes the expected value the way the code
|
|
51
|
+
does, so it can never disagree;
|
|
52
|
+
- horizontal-sliced: bulk tests asserting imagined shapes rather than the
|
|
53
|
+
behavior the brief names.
|
|
54
|
+
A changed behavior with no covering test at the brief's named seams is MISSING.
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Standards axis brief
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Are there bugs or violations of a documented standard in this change? Judge the diff against, in priority order:
|
|
61
|
+
1. .vegastack/review-known-patterns.md — its never-flag entries suppress
|
|
62
|
+
findings unless their "Still flag if:" clause applies;
|
|
63
|
+
2. the project's documented standards (dev.md Project rules, CONTRIBUTING);
|
|
64
|
+
a documented repo standard always overrides the baseline below;
|
|
65
|
+
3. the smell baseline — each a labeled judgment call ("possible feature
|
|
66
|
+
envy"), never a hard violation; skip anything tooling already enforces:
|
|
67
|
+
|
|
68
|
+
- Mysterious name: a name that doesn't reveal what it does or holds → rename.
|
|
69
|
+
- Duplicated code: the same logic shape in more than one hunk/file → extract.
|
|
70
|
+
- Feature envy: a method reaching into another object's data more than its
|
|
71
|
+
own → move it to the data it envies.
|
|
72
|
+
- Data clumps: the same fields/params traveling together → bundle into a type.
|
|
73
|
+
- Primitive obsession: a primitive standing in for a domain concept → type it.
|
|
74
|
+
- Repeated switches: the same case-cascade on the same type recurring → one
|
|
75
|
+
shared map or polymorphism.
|
|
76
|
+
- Shotgun surgery: one logical change forcing scattered edits everywhere →
|
|
77
|
+
gather it into one module.
|
|
78
|
+
- Divergent change: one module edited for several unrelated reasons → split.
|
|
79
|
+
- Speculative generality: abstraction or hooks for needs the brief doesn't
|
|
80
|
+
have → delete, inline until a real need shows.
|
|
81
|
+
- Message chains: long a.b().c().d() walks the caller depends on → hide the
|
|
82
|
+
walk behind one method.
|
|
83
|
+
- Middle man: a unit that mostly delegates onward → cut it, call direct.
|
|
84
|
+
- Refused bequest: an implementer ignoring most of what it inherits → compose
|
|
85
|
+
instead.
|
|
86
|
+
|
|
87
|
+
Quiet profile: report style only where a documented rule exists. Hard
|
|
88
|
+
violations of documented standards may be [MUST-FIX]; baseline smells are
|
|
89
|
+
[SHOULD-FIX] or [NIT].
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Security axis brief
|
|
93
|
+
|
|
94
|
+
Compose the security dispatch from [security-axis](security-axis.md): the shared preamble above, then that file's Method steps, finding format (the three extra lines), severity definitions, and standing red lines, quoted into the prompt — the reviewer must receive them in full, not a pointer it cannot follow.
|
|
95
|
+
|
|
96
|
+
Where a scanner report exists, add its path and that file's "Scanner evidence" rules to the same dispatch:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
Scanner report: <path to skill-scan.json or the project's equivalent>.
|
|
100
|
+
Treat every entry as a CANDIDATE finding, never a verdict: read the source at
|
|
101
|
+
its file:line, trace the flow, and assign severity yourself by exploitability.
|
|
102
|
+
The report's aggregate score is context, not a ranking. Entries the baseline
|
|
103
|
+
suppressed are in scope — judge whether each rule is scoped as narrowly as its
|
|
104
|
+
cause and whether its stated re-trigger condition would actually fire. Say so
|
|
105
|
+
in your verdict line if the report says the scan did not complete.
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Re-review brief (scoped, every fix round)
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
Inputs: the same brief and plan, the implementer's report file (its fix
|
|
112
|
+
reports are the test evidence — do not re-run suites), and the scoped package
|
|
113
|
+
at <fix package path> covering only <FIX_BASE>..<HEAD>.
|
|
114
|
+
Findings under verification: <the open findings, verbatim>.
|
|
115
|
+
|
|
116
|
+
For each finding, in order: ADDRESSED or NOT ADDRESSED, with path:line
|
|
117
|
+
evidence. "Attempted" is not addressed — the specific defect must no longer
|
|
118
|
+
exist. Then: new breakage the fix diff itself introduced (severity + line),
|
|
119
|
+
and out-of-scope observations (non-blocking, one line each). Final line:
|
|
120
|
+
"Fix round: all addressed | findings remain open".
|
|
121
|
+
```
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# The security axis
|
|
2
|
+
|
|
3
|
+
Runs on `risky` issues, whenever the diff's touch points hit an auth surface, money, user data, or externally-controlled input, and whenever the diff touches a skill under dev.md's `skill-scan:` root — the trigger is the surface, not the label alone.
|
|
4
|
+
|
|
5
|
+
## Scanner evidence — a finding's start, never its end
|
|
6
|
+
|
|
7
|
+
Where the project runs a scanner (the `skill-scan` skill ships this family's scanner for agent skills; a project may name others), its report is an **input to this axis**, on the same footing as the diff. It is evidence, not a verdict:
|
|
8
|
+
|
|
9
|
+
- **A scanner hit is a candidate finding.** It arrives with a rule ID and a `file:line` and nothing else — no data flow, no attacker, no exploitability. Promote it to a finding only after the Method below fills those in; a hit you cannot trace goes to the collapsed low-confidence block like any other hunch.
|
|
10
|
+
- **Read the source at the location before judging it.** The scanner matched text; whether that text is a vulnerability is your call, made against the file, not the summary.
|
|
11
|
+
- **Severity is yours, not the scanner's.** Map its finding onto this file's ladder by exploitability. A scanner HIGH that cannot be exploited is not `[CRITICAL]`; a scanner MEDIUM with a traced path to a real sink can be.
|
|
12
|
+
- **Never downgrade an unexplained HIGH or CRITICAL** on reputation, score, or "it's our own code". Either the trace shows why it does not hold, or it stands.
|
|
13
|
+
- **The aggregate risk score is not a finding.** It is distorted upward by documentation of the very mechanics being scanned and downward by unrelated suppressions. Quote it for context; never rank on it.
|
|
14
|
+
- **Suppressions are in scope for this axis.** A finding silenced by a baseline rule rather than fixed is reviewable: check the rule is scoped as narrowly as its cause and that its stated re-trigger condition is one that would actually fire.
|
|
15
|
+
- **A degraded or partial scan is not a clean scan.** If the report says the run did not complete, say so in the verdict line rather than reporting its numbers.
|
|
16
|
+
|
|
17
|
+
## Method — evidence before severity
|
|
18
|
+
|
|
19
|
+
1. **Trace the data flow** for every candidate finding: origin → transformations → sink. Is the value attacker-controlled at the point of use? A finding without a traced flow is a hunch, not a finding.
|
|
20
|
+
2. **Check defense in depth before flagging a gap.** A missing check at one layer is not a vulnerability if another layer enforces it on every path — name the enforcing layer instead. Flag it only when no layer holds, or the only holding layer is UX (client-side, middleware-as-convenience).
|
|
21
|
+
3. **Verify library defaults** before "missing configuration" findings — frameworks ship safe defaults more often than training-data memory suggests; check the current docs per `dev-architect`'s verify protocol.
|
|
22
|
+
4. **Assess exploitability**: what does the attacker need (auth level, network position, timing, knowledge)? What mitigating controls exist? Severity follows exploitability, never vibes.
|
|
23
|
+
|
|
24
|
+
## Finding format — three extra lines
|
|
25
|
+
|
|
26
|
+
On top of the standard finding shape, every security finding carries:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
Data flow: <origin> → <transformations> → <sink>
|
|
30
|
+
Attack prerequisites: <what the attacker needs>
|
|
31
|
+
Mitigating controls: <existing defenses that reduce but don't eliminate>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
A finding that can't fill the Data flow line goes to the collapsed low-confidence block, not the main list.
|
|
35
|
+
|
|
36
|
+
## Severity
|
|
37
|
+
|
|
38
|
+
- **[CRITICAL]** — exploitable now: auth bypass at the enforcement layer, injection with a traced user-input path, secret/credential exposure, unprotected sensitive mutation. Blocks, above MUST-FIX.
|
|
39
|
+
- **[MUST-FIX]** — a real weakness needing prerequisites an attacker can plausibly meet.
|
|
40
|
+
- **[SHOULD-FIX]** — hardening: rate limits, PII in logs, missing timeouts, defense-in-depth gaps with a holding layer.
|
|
41
|
+
- Never round up to look thorough; judge against the project's Architecture facts — platform-scale concerns are not defects on a small internal tool.
|
|
42
|
+
|
|
43
|
+
## Standing red lines (summary — `dev-architect` remains their home)
|
|
44
|
+
|
|
45
|
+
Middleware/proxy is never the authorization boundary; authorization lives server-side per resource. No secret in plaintext anywhere — code, config, logs, events, agent state. Permission checks fail closed, and the deny is still audited.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Refresh contract — dev-review
|
|
2
|
+
|
|
3
|
+
Evergreen: this skill asserts no version pins, vendor mechanisms, numeric limits, or dated claims — its content (SKILL.md, `references/dispatch-prompts.md`, `references/security-axis.md`, `references/cross-agent.md`, the known-patterns template) is versionless review discipline: axes, severities, the bounded fix loop, the reviewer briefs, the smell baseline, and the cross-agent handoff. The `codex exec` / `claude -p` invocation forms stay deliberately untracked as durable CLI surfaces; dev-setup's detection covers their presence per machine.
|
|
4
|
+
|
|
5
|
+
**The waiver was retired on 01-09-2026 (issue #83) and restored on 03-09-2026 (issue #113):** the six volatile SkillSpector facts that retired it — the install command, the `--version` output shape, the releases API, and the uv/brew/pipx channel parsers — moved to the `skill-scan` skill together with the guard that parses them, and are tracked in that skill's registry now. Revisit if a future edit introduces a volatile fact back into this skill.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev-setup
|
|
3
|
+
description: Bootstrap a project for issue-driven agent development — existing repo or brand-new empty directory. Use when asked to "set up the dev workflow", "bootstrap this project for agents", "install the dev workflow here", "set up this new project", "wire the release guards", "create the workflow labels", "set up the changelog convention", "fill the architecture profile section", to re-run setup after machinery appeared or knobs changed, or invoked as dev-setup; also run automatically when any dev-family skill finds no .vegastack/dev.md in the project. Not for architecture advice (dev-architect reads the section this skill writes), authoring skills (skillify), or general CI and app scaffolding.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# dev-setup
|
|
7
|
+
|
|
8
|
+
Act: give the project everything the dev workflow needs, asking only for the decisions detection cannot make.
|
|
9
|
+
|
|
10
|
+
Creates the profile/runbooks, thin AGENTS.md section, labels and decision register. Other dev skills call it when `.vegastack/dev.md` is missing. [Conventions](references/conventions.md) owns shared artifact and workspace rules.
|
|
11
|
+
|
|
12
|
+
Nearest neighbor: `dev-architect` consumes dev.md's `## Architecture` section and gives architecture advice; dev-setup detects the facts and writes the section. There is no separate architecture profile — dev.md is the one file.
|
|
13
|
+
|
|
14
|
+
## Routing
|
|
15
|
+
|
|
16
|
+
| Need | Read |
|
|
17
|
+
|---|---|
|
|
18
|
+
| artifact formats and workspaces | [conventions](references/conventions.md) |
|
|
19
|
+
| headless question fallback | [ask-route](references/ask-route.md) |
|
|
20
|
+
| harness, hooks and model facts | [harness-facts](references/harness-facts.md) |
|
|
21
|
+
| stack and release playbooks | [stack-playbooks](references/stack-playbooks.md) |
|
|
22
|
+
| GitHub App and broker | [github-app](references/github-app.md) |
|
|
23
|
+
|
|
24
|
+
## Step 1 — Detect before asking
|
|
25
|
+
|
|
26
|
+
Gather these silently and present them as findings — "here's what I found — correct me if wrong" — because facts are detection's job and decisions are the user's:
|
|
27
|
+
|
|
28
|
+
| What | How |
|
|
29
|
+
|---|---|
|
|
30
|
+
| repo, default branch | `git remote get-url origin` · `gh repo view --json nameWithOwner,defaultBranchRef` |
|
|
31
|
+
| org defaults (control room) | `vegafactory sync --json` first — on a repo with no `control-room:` knob yet, the first run here, `vegafactory sync --org <org> --json` with the org from the repo lookup above, because `sync` otherwise reads the knob this skill has not written — then read the local clone it names: skills read the clone, never the network, so an outage degrades to "last synced <time>" instead of failing; a control room that answers a knob removes that question from Round B; a room that does not exist or cannot be read is a plain finding, and Round B asks; layout and precedence are the `vegafactory-setup` skill's |
|
|
32
|
+
| gh authenticated | `gh auth status` |
|
|
33
|
+
| operator username (the `architect:` knob) | `gh api user -q .login`, fallback `git config user.name` — written as the knob's value with no question, because the architecture owner defaults to whoever runs setup; the decision-register header uses the same lookup |
|
|
34
|
+
| the operator list (the `operators:` knob) | the same `gh api user -q .login` lookup, written as a one-name csv without asking — assignment needs a default owner from run one, and the operator edits the line to add colleagues |
|
|
35
|
+
| gh version | `gh --version` against the floors in [harness-facts](references/harness-facts.md); each feature the version lacks is named in the Step 4 report, so the operator upgrades once instead of hitting the gap mid-run |
|
|
36
|
+
| stack and commands | package.json scripts, lockfiles, framework configs |
|
|
37
|
+
| web app (UI evidence relevant) | framework dependencies (next, react, vue, …) |
|
|
38
|
+
| release/changelog machinery | match signals against [stack-playbooks](references/stack-playbooks.md) — the matched playbook drafts the `## Ship` runbook, the `changelog:` knob, and the guards to offer |
|
|
39
|
+
| environments and run commands | CI/deploy configs, env examples (names only), dev/start scripts — these draft `## Environments` and `## Verify` |
|
|
40
|
+
| architecture (app repos) | wrangler files, drizzle config, better-auth usage, S3/R2 bindings, pg-boss, `eve`/`ai` packages, Dockerfiles/compose, pubspec.yaml — these draft `## Architecture` (a `d1_databases` binding with no Postgres driver is the D1-only class) |
|
|
41
|
+
| existing files | AGENTS.md, CLAUDE.md, `.vegastack/dev.md`, a legacy `.vegastack/arch.md`, the decision register — read before writing, because hand edits in them are the truth |
|
|
42
|
+
| existing labels | `gh label list` |
|
|
43
|
+
| project board | `gh project list --owner <org>` and `gh project field-list` — an existing board drafts `board: <number>`, none found drafts `board: none` |
|
|
44
|
+
| native issue types | `gh api orgs/<org>/issue-types` — an `Epic` type routes parents to it, otherwise the `epic` label ([conventions](references/conventions.md)); the enabled names draft the `issue-types:` knob, `none` where the call 404s |
|
|
45
|
+
| org automation identity | `gh api orgs/<org>/installations` — a `vegafactory` installation means workflows mint tokens from the App ([github-app](references/github-app.md)); owners only, so a 403 is an unknown, not a missing App |
|
|
46
|
+
| native issue fields | `gh api orgs/<org>/issue-fields` — every `single_select` field with its option names, ordered by each option's `priority` key (the array itself comes back alphabetical), drafts the `issue-fields:` knob, `none` where the call 404s; the Priority and Effort options are what dev-intake offers, so they are read, never assumed |
|
|
47
|
+
| harnesses present | `command -v claude codex hermes` and each present one's `--version` — the names and versions become the `harnesses:` knob line, and the AGENTS.md block, the CLAUDE.md import, the hook offer and the `review:` recommendation target only harnesses that exist. Any harness the drafted `harness-policy:` names but the box lacks is absent → record it in `## Environments` with the capability it gates (no Codex → cross-agent review is off and the review stage falls back to a fresh subagent), naming no install command, because the vendor's own docs own that |
|
|
48
|
+
| agent skills in the repo | a directory of skill folders, flat or one group deep, drafts the `skill-scan:` knob at that path (none found drafts `none`), declared once, because a second `skill-scan:` line makes the profile ambiguous and the guard refuses; the knob names the built directory where one exists, because unpackaged fixtures are adversarial on purpose |
|
|
49
|
+
| SkillSpector (skill scanning) | nothing to detect — the skill-scan skill's guard locates the CLI itself and, under `skillspector-update: auto`, installs and upgrades it; confirm the drafted `skillspector-update:` value instead (`auto` provisions silently, `notify` only reports, `off` stays offline) |
|
|
50
|
+
|
|
51
|
+
Not a git repo, or no origin remote → a greenfield run, not an error: follow the greenfield playbook in [stack-playbooks](references/stack-playbooks.md) — interview for the intended stack, offer `git init` and `gh repo create` each on its own yes, and render dev.md from the playbook's conventions with TODO lines where machinery doesn't exist yet. A declined remote skips labels and records the TODO plainly.
|
|
52
|
+
|
|
53
|
+
## Step 2 — The interview
|
|
54
|
+
|
|
55
|
+
Ask with your harness's question tool — AskUserQuestion in Claude Code, `request_user_input` in Codex where the mode allows it, `clarify` in Hermes ([harness-facts](references/harness-facts.md)). When none is available (headless run, gated mode), write the defaults, mark every unconfirmed knob `# TODO confirm`, and say so, because a wrong invented preference costs more than a TODO. The route the other dev skills take when no tool is available is [ask-route](references/ask-route.md); dev-setup can run before any issue exists, so its own fallback stays the documented defaults above.
|
|
56
|
+
|
|
57
|
+
**Round A — confirm the detected facts** in one compact summary (repo, stack, commands, web app or not, matched playbook, detected architecture facts). Ask only about what detection could not fill. The summary names which knobs came from the control room and which are this repo's own, because an inherited answer and a local one are corrected in different files.
|
|
58
|
+
|
|
59
|
+
**Round B — the workflow knobs**, recommended default first:
|
|
60
|
+
|
|
61
|
+
Every knob `groups/<g>/group.md` or `org.md` already answers is stated as inherited rather than asked — the questions below are only the ones no layer has answered.
|
|
62
|
+
|
|
63
|
+
1. Review of finished work (`review:` knob, mapped by dev-review): **cross-agent-risky** (subagent axes, the other agent on `risky` — recommended where the Codex CLI was detected; otherwise recommend `subagent`) · `subagent` (no cross-agent) · `cross-agent` (always). Detection found only one harness on the box → recommend `subagent` and say cross-agent is off until a second harness exists, because a knob promising an independent reviewer that cannot run is worse than an honest self-review; the `harness-policy:` line is still drafted in full, so the stage set does not change with the box
|
|
64
|
+
2. Proof for UI work: **playwright screenshots** · none
|
|
65
|
+
3. Gates: **3** (approve → PR → merge as separate user words) · 2 (approve → one "ship it" covers PR and merge) · 1 (direct-to-main for single-operator projects: the ship word merges locally and pushes, no PR — everything else unchanged)
|
|
66
|
+
4. Tests: **required for every change** · required for logic changes only
|
|
67
|
+
5. Who may be assigned issues here (`operators:` knob): **just you** (the detected login) · a csv of logins — every human who can receive a `needs-operator` or `for-operator` issue
|
|
68
|
+
|
|
69
|
+
**Round C — only when the situation exists:**
|
|
70
|
+
|
|
71
|
+
- Playbook matched → confirm the drafted `## Ship` runbook (steps `auto:`, `ask:`, or `guard:`, each guard with its command inline), the `changelog:` convention and the `release:` knob; keep-a-changelog with no CHANGELOG.md yet → offer to seed the skeleton; no machinery → "Ship: merge only"
|
|
72
|
+
- Guards drafted → offer their CI backstop steps for the project's workflow files, each file on the user's yes — release guards only, because general CI is the project's own
|
|
73
|
+
- Environments or run commands detected → confirm the drafted `## Environments` and `## Verify` bullets
|
|
74
|
+
- Agent skills detected → confirm the drafted `skill-scan:` root, the `skillspector-update:` value (`auto` installs and upgrades the CLI without asking again; `notify` or `off` opt out — say so plainly), the `## Verify` bullet running the guard after the build, and a blocking `guard:` line in `## Ship` before publish, because the published artifact is what the world installs; a declined scan → `skill-scan: none`, said plainly. A project setting a `skill-scan:` root installs the skill-scan skill (`vegafactory skills add skill-scan`), because the knob names a scan the project cannot otherwise run
|
|
75
|
+
- Workflows that write issues, labels, or project items → point the operator at [github-app](references/github-app.md), so the org's automated writes go out as the App and not as a person; this skill drafts those steps and never performs them
|
|
76
|
+
- Project board wanted or detected → offer `.github/workflows/factory-board.yml` from [factory-board template](assets/factory-board.yml.template), written on the user's yes with `{{runs-on}}`, `{{profile}}` and an immutable `{{product-revision}}` bound; the packaged compiler resolves JSON event labels and verifies existing Status options before writing and every line above the `# ---` marker dropped; record the number in `board:`; say plainly that labels drive and the board follows — a card dragged on the board is cosmetic until the next label change — and that the workflow needs the factory App ([github-app](references/github-app.md)) plus gh 2.97.0 on the runner
|
|
77
|
+
- Evidence repo (`ui-evidence: playwright`) → default is the owner's shared `<owner>/dev-review-evidence`, created once with `gh repo create <owner>/dev-review-evidence --private --add-readme` plus the layout/retention README when missing; a naming policy that rejects the name → the closest compliant name, recorded in the knob
|
|
78
|
+
- App architecture detected → confirm the drafted `## Architecture`, asking hosting, stage and kind, which detection can't fill; nothing detected → delete the section, the `stack:` line is enough
|
|
79
|
+
- A legacy `.vegastack/arch.md` exists → fold its knob lines into `## Architecture`, offer each dated `notes:` line to the decision register on the user's yes, then offer to delete arch.md
|
|
80
|
+
- Harnesses detected → confirm the drafted `harness-policy:` line — the six stages are fixed, the models and efforts are the operator's, and the flags each value turns into are in [harness-facts](references/harness-facts.md); a model id the account cannot use fails loudly on first run, and the fix is this knob line, never a skill edit
|
|
81
|
+
- Hooks package → separately offer four per [harness-facts](references/harness-facts.md): ship-guard confirmation; SessionStart context requests bounded verified lessons; Stop heartbeat and legacy decision hook the same nonblocking flush. Directional choices stay session proposals. Each needs its own yes. Deduplicate both config layers while preserving user hooks; replace/report only this package's legacy decision-nudge.sh in place. On that yes, confirm policy then compile the external guard policy; `vegafactory guard sync` refreshes later edits. Copy the shared session-start.mjs adapter for Stop/SessionEnd with one-second advisory timeouts. Apply harness-facts' native-memory exclusion, source trust and configured/invoked/qualified rules; retain project instructions/settings. Trust Codex's project `.codex/` per worktree.
|
|
82
|
+
- Statistics capture (the org's `stats:` policy is on, or no control room exists yet) → offer the three capture hooks separately, one plain sentence each: a local flush request per closed session, pending the managed-hook consumer; which skills a Claude session used and who chose each; the same on Codex from prompt mentions of a skill name, a proxy recorded as one. Say what a record holds — counts and identifiers, never text — that it goes to the org's own control room over the operator's `gh` credential, and that whether anything is recorded is the org's `stats:` policy, not this machine's
|
|
83
|
+
- A parent plan declares independent child groups → route managed execution through `vegafactory children run`, then `vegafactory children join`, inside the active registered parent session and checkout; use `--help` for required arguments. Execution requires current authority, with integration authority checked separately at join. Preserve existing `.claude/workflows/implement-children.js` copies and user configuration: older copies may still contain their own executor; setup neither installs that legacy route nor migrates, overwrites or deletes existing copies
|
|
84
|
+
- An always-on machine plus the ship guard wired → offer `dispatch: local` and, on that machine, `vegafactory service install`: the dispatcher turns `needs-plan`, unassigned `ready` and a 🚀 from a listed operator into headless runs, running as the operator's own user with their `gh` and harness authentication, and every repo stays refused until its own dev.md says `dispatch: local`
|
|
85
|
+
- AGENTS.md already has content → append the marked section (default) or show a merge proposal first
|
|
86
|
+
- CLAUDE.md already has content → add the `@AGENTS.md` import as its first line (default) or move its content into AGENTS.md and leave only the import
|
|
87
|
+
- Gitignored files a fresh checkout needs (`.env`) or a setup command detected → confirm `worktree-include:`, `commands: setup` and `worktree-retention:` (default 14d), replayed into every new worktree; nothing detected → `worktree-include: none`
|
|
88
|
+
- No control room exists and the operator wants one → hand the request to `vegafactory-setup`, which bootstraps it; this skill never creates the org repository itself
|
|
89
|
+
- Labels use `scripts/effective-policy.mjs`: defaults accept the complete space/CSV list with scope labels; custom names require five-key `workflow-labels` JSON. Preview semantic conversion; write only an accepted migration, preserving issues and board options. Both knobs must agree.
|
|
90
|
+
- Different label names, `gates: 1` under branch protection (it blocks direct pushes — surface the conflict), or a different decision-register path, when the situation or the user brings it up
|
|
91
|
+
|
|
92
|
+
Everything else — merge style, branch naming, the stop-and-ask list, the `architect:` owner (the detected username), `chronicle-style: plain`, and `emoji: none` — takes its documented default straight into dev.md, because the profile is plain text the user can edit anytime.
|
|
93
|
+
|
|
94
|
+
## Step 3 — Write
|
|
95
|
+
|
|
96
|
+
| Target | Action |
|
|
97
|
+
|---|---|
|
|
98
|
+
| `.vegastack/dev.md` | render [dev-profile template](assets/dev-profile.md.template) with the answers — the project's single canonical process doc (Ship/Verify/Environments/Design from the playbook, Architecture from detection, Decisions test included, placeholders deleted, TODO lines where machinery is absent; `architect:` and `operators:` from the detected username, `harnesses:` from Step 1's detection and `harness-policy:` from the confirmed Round C line, `chronicle-style` and `emoji` at their template defaults). dev.md is short directional bullets — one line per knob or rule — because every skill reads it on every run. The `control-room:` knob records the clone sha the profile was drafted from (`sync`'s `--json` `sha` field), so dev-status can show which knobs moved since |
|
|
99
|
+
| `AGENTS.md` | create it, or insert/replace only the block between `<!-- vsk-dev:start -->` and `<!-- vsk-dev:end -->` using the [agents-section template](assets/agents-section.md.template); content outside the markers is the user's and stays untouched |
|
|
100
|
+
| `CLAUDE.md` | ensure its first line is `@AGENTS.md` — Claude Code does not read AGENTS.md natively and needs this import ([harness-facts](references/harness-facts.md)); create the file when absent |
|
|
101
|
+
| labels | `gh label create <name> --color <hex> --description "<text>"` for validated semantic state names plus existing scope/modifier labels, skipping ones that exist; creation colors ([conventions](references/conventions.md) holds meanings): state `needs-operator` FBCA04 · `needs-plan` E36209 · `ready` 0E8A16 · `working` 1D76DB · `for-operator` 5319E7; modifiers `risky` B60205 · scope `research` C5DEF5 · `quick-build` 76C7C0 · `full-plan` 2A9D8F · `epic` 24292E (only when the org has no native Epic issue type) |
|
|
102
|
+
| decision register | create the file the `decisions:` knob names (default `.vegastack/decisions.md`) when missing, with a two-line header stating conventions' register-line format (username via `gh api user -q .login`, fallback `git config user.name`); an existing register is kept and the knob points there |
|
|
103
|
+
| project `.gitignore` | add `.vegastack/.worktrees/` when absent — every branch is checked out there ([conventions](references/conventions.md)), never as untracked files in the main checkout |
|
|
104
|
+
| `.vegastack/hooks/session-end.mjs`, `skill-activated.mjs`, `prompt-skill-mention.mjs` | only on their own yes in Round C, wired to SessionEnd, Claude's `PostToolUse` matcher `Skill` and `UserPromptExpansion`, and Codex's `UserPromptSubmit`; SessionEnd uses the bounded managed-hook adapter with explicit harness and one-second timeout; copy its shared session-start.mjs sibling too. Skill hooks keep their existing stats record source; all exit 0 |
|
|
105
|
+
| guard workflows / hook files | only the ones the user said yes to in Round C; a hook or dev.md section the control room's `templates/` overrides is taken from there and this skill's own asset is the fallback, because the org's template is a deliberate default and these are not; hook files (including session-start.mjs beside either advisory consumer) are copied verbatim from `assets/hooks/` (or the control room's override) to `.vegastack/hooks/`, the ship guard's policy is compiled with `node scripts/ship-policy.mjs --write` (outside the repo, in `~/.vegastack/guard/`), and the wiring goes to `.claude/settings.json` (Claude Code), `<repo>/.codex/hooks.json` (Codex) and `~/.hermes/config.yaml` (Hermes, ship guard only), merged never replaced |
|
|
106
|
+
|
|
107
|
+
## Step 4 — Report
|
|
108
|
+
|
|
109
|
+
One summary: what was created, what was skipped and why, what remains TODO, what the `issue-types:` and `issue-fields:` knobs ended up holding — and where either is `none`, one plain sentence saying issues here carry their labels and nothing else — what the drafted `harness-policy:` line ended up holding and which harnesses it names that the box does not have, and every gh feature the detected version lacks with the floor that unlocks it (on gh 2.92.0: "native issue types, sub-issues and dependencies need gh 2.94.0; name-based project field edits need gh 2.97.0"). With no App installation detected, say so — no automation identity yet, [github-app](references/github-app.md) is the path out. When `gh` was unauthenticated, print the exact `gh auth login` and `gh label create` commands to run later, and name the gap plainly.
|
|
110
|
+
|
|
111
|
+
## Re-runs
|
|
112
|
+
|
|
113
|
+
Re-running is how knobs get revisited and empty sections get filled: diff fresh detection against the existing dev.md, show what differs per target, and change only what the user confirms — propose the delta, because a reset discards the hand edits that made the profile true. The other dev skills send the user here when they notice an empty Ship/Verify section next to newly present machinery. The marked block is the only part of AGENTS.md this skill owns; hand edits inside dev.md win, and the templates are for creation.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!-- vsk-dev:start -->
|
|
2
|
+
## Dev workflow
|
|
3
|
+
|
|
4
|
+
Read `.vegastack/dev.md` (stack, commands, knobs); if missing, run dev-setup first. The stages are the dev-family skills: dev-setup (bootstrap) · dev-intake (ideas to briefs) · dev-plan (approved briefs to plans) · dev-architect (stack judgment) · dev-implement (dark builds) · dev-debug (reproduce-first fixes) · dev-review (independent review) · dev-ship (gated landing) · dev-status (the operator's board) · dev-chronicle (the project's story).
|
|
5
|
+
|
|
6
|
+
Work flows through GitHub issues, labeled per dev.md's `labels:` knob; artifact formats follow dev-setup's `references/conventions.md`. Route each request by kind:
|
|
7
|
+
|
|
8
|
+
| Request | Skill |
|
|
9
|
+
|---|---|
|
|
10
|
+
| a new capability, feature, bug report, or SOW — in chat or as an unlabeled issue | dev-intake, which writes the issue and never builds |
|
|
11
|
+
| a `needs-plan` issue | dev-plan |
|
|
12
|
+
| a `ready` issue, a resume handover, or corrections on `for-operator` | dev-implement |
|
|
13
|
+
| a trivial fix asked in chat — one or two files, no new dependency, no behaviour beyond the words | dev-implement's direct path |
|
|
14
|
+
| "make the PR", "merge", "release" | dev-ship |
|
|
15
|
+
| "status", "catch me up" | dev-status, dev-chronicle |
|
|
16
|
+
|
|
17
|
+
**Local, reversible actions proceed; actions that are hard to reverse, affect shared systems, or are visible to others wait for the operator's word** — push to the default branch, merge, tag, publish, deploy, force-push, a hard reset, branch or worktree deletion, `--no-verify`; green checks, schedules, and standing approvals authorise none of them. The `gates:` knob in dev.md changes how many of those one instruction covers, never whether an instruction is needed. Behavior changes carry their changelog entry (dev.md's `changelog:` knob) before hand-back; after merge, dev.md's `## Ship` runbook says which steps need the operator's word.
|
|
18
|
+
|
|
19
|
+
Agent conduct: say what you mean — when a literal phrase is available, use it. Lead with the outcome, for a reader who did not watch the work. Report progress only against a tool result from this session; say plainly what is unverified. Pause for the operator only for a destructive or irreversible action, a real scope change, or input only they can provide; then ask and end the turn instead of promising. The approved brief or plan is the scope; extras are a closing note. Edit files surgically rather than rewriting them whole.
|
|
20
|
+
|
|
21
|
+
Directional decisions (`## Decisions` in dev.md says what qualifies) get one dated line in the register dev.md names: when a session settles such a choice, propose the line and add it only on the user's yes.
|
|
22
|
+
|
|
23
|
+
dev.md is the project's self-maintained handbook: when a gotcha or repeated instruction surfaces, propose the one line that would have prevented it — folded into existing lines, never a log — and add it on the user's yes.
|
|
24
|
+
<!-- vsk-dev:end -->
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Dev profile — {{owner/repo}}
|
|
2
|
+
|
|
3
|
+
This file is the project's handbook and its only process document: short directional bullets, not prose. Skills read the section they need. When reality disagrees with a line, fix the line; when a gotcha or repeated instruction surfaces, fold one line into the right section — never append a log. A section left as TODO because its machinery didn't exist yet: re-run dev-setup detection when the machinery appears.
|
|
4
|
+
|
|
5
|
+
repo: {{owner/repo}} · default branch {{branch}}
|
|
6
|
+
policy-schema: 2
|
|
7
|
+
stack: {{one line; the `## Architecture` section below carries the architecture facts}}
|
|
8
|
+
commands: test `{{test}}` · build `{{build}}` · dev `{{dev}}` · setup `{{setup}}`
|
|
9
|
+
authority: {{ordered — e.g. "CONTRIBUTING.md → this file → skill defaults"; delete the line when this file is the only process doc}}
|
|
10
|
+
|
|
11
|
+
## Knobs
|
|
12
|
+
|
|
13
|
+
review: cross-agent-risky # subagent (never cross-agent) | cross-agent-risky (other agent on risky) | cross-agent (always) — dev-review maps these
|
|
14
|
+
harnesses: {{claude <version> · codex <version> · hermes absent}} # what dev-setup found on this box, one `<name> <version|absent>` entry per harness; a re-run refreshes it. An absent harness the policy below names is also recorded in ## Environments with the capability it gates
|
|
15
|
+
harness-policy: intake {{intake-harness}} {{intake-model}} {{intake-effort}} · plan {{plan-harness}} {{plan-model}} {{plan-effort}} · implement {{implement-harness}} {{implement-model}} {{implement-effort}} · review {{review-harness}} {{review-model}} {{review-effort}} · status {{status-harness}} {{status-model}} {{status-effort}} · chronicle {{chronicle-harness}} {{chronicle-model}} {{chronicle-effort}} # confirm detected supported subscription choices for every stage; placeholders block execution
|
|
16
|
+
ui-evidence: playwright # playwright | none
|
|
17
|
+
evidence-repo: {{owner}}/dev-review-evidence # shared across projects; this project's folder = repo name; delete the line when ui-evidence is none
|
|
18
|
+
gates: 3 # 3 = approve/PR/merge · 2 = approve + one "ship it" · 1 = direct-to-main, ship word merges locally and pushes, no PR
|
|
19
|
+
tests: required # required | logic-only | best-effort | none; an org lock governs allowed overrides
|
|
20
|
+
skill-scan: none # one line only — directory holding the agent skills to scan (the BUILT one where a bundle is generated) | none. the skill-scan skill's guard reads this and refuses if a second line gives a different value
|
|
21
|
+
skillspector-update: auto # off | notify | auto — how the SkillSpector CLI itself is kept current. auto installs it when absent and upgrades it before each scan, falling back to the installed copy on any failure; notify only reports what upstream has published; off never touches the network. one line only, same as above
|
|
22
|
+
merge: squash
|
|
23
|
+
branch: <type>/<issue>-<slug> # type: feat | fix | docs | chore | refactor — the only place this list lives
|
|
24
|
+
worktree-include: {{files}} # space-separated gitignored files a fresh checkout needs (local env and secret files) | none — copied into every new worktree
|
|
25
|
+
worktree-retention: 14d # how long a parked worktree survives with no session, measured from the later of its last commit and its last ledger edit; prune pushes first and never removes uncommitted or unpushed work
|
|
26
|
+
labels: needs-operator needs-plan ready working for-operator risky research quick-build full-plan epic # epic label marks map parents only where the org has no native Epic issue type
|
|
27
|
+
workflow-labels: {"needsOperator":"needs-operator","needsPlan":"needs-plan","ready":"ready","working":"working","forOperator":"for-operator"} # custom names need explicit mapping; if labels: remains, both must agree
|
|
28
|
+
board: none # project board number the five state labels mirror into, one way, or none — .github/workflows/factory-board.yml reads this line and a card dragged on the board is cosmetic until the next label change
|
|
29
|
+
issue-types: {{Feature=feat · Bug=fix · Task=docs,chore,refactor,research | none}} # native org issue types dev-setup detected; dev-intake sets one at creation. none = personal repo, or an org that defines none
|
|
30
|
+
issue-fields: {{Priority=<options> default <option> · Effort=<options> default lowest for research/quick-build, middle for full-plan | none}} # org issue fields dev-setup detected; dev-intake asks for both and writes them at creation. none = org defines none
|
|
31
|
+
changelog: {{changesets | keep-a-changelog | pubspec+changelog | none (reason)}}
|
|
32
|
+
decisions: .vegastack/decisions.md
|
|
33
|
+
release: on-request # per-merge = Ship runbook runs as part of shipping · on-request = only when the operator says "release"
|
|
34
|
+
chronicle: on # on = dev-implement writes a .vegastack/chronicle.md story entry per behavior-changing branch · off
|
|
35
|
+
architect: {{github-username}} # confirmed architecture owner from `gh api user -q .login`; a display/commit author is not identity authority
|
|
36
|
+
control-room: {{org}}/vegafactory-control-room#{{group}}@{{sha7}} # org control room · this repo's group · the clone sha this profile was drafted from; delete the line when the org has none
|
|
37
|
+
sync-max-age: 30m # confirmed maximum validated-policy age, not a task deadline; <n>s, <n>m or <n>h
|
|
38
|
+
# stats: off # a mandatory org lock needs an exact org delegation; refusal prevents capture/export even when the diagnostic effective value is on
|
|
39
|
+
operators: {{github-username}} # csv of the humans who own issues here — every state flip assigns per conventions' Labels table; dev-setup writes the detected login, and the line is edited to add people
|
|
40
|
+
dispatch: off # off | local; repo-only opt-in, current scoped approval and validated policy/guard required; invalid values refuse
|
|
41
|
+
chronicle-style: plain # plain | story | witty — the voice of chronicle entries; the rule and one worked example per style live in dev-chronicle's references/styles.md
|
|
42
|
+
emoji: none # none | sparing — sparing allows at most one emoji per chronicle entry, in the title or footer, never inside a field's facts
|
|
43
|
+
|
|
44
|
+
# provider-mode: subscription-only # confirmed organization policy; no usage-billed fallback
|
|
45
|
+
# learning: normal-work # normal-work | off; verified VegaFactory lessons, no built-in vendor memory
|
|
46
|
+
# learning-adoption: scoped-reversible # scoped-reversible | propose-only; never changes approval or quality/privacy authority
|
|
47
|
+
|
|
48
|
+
## Ship — what happens after merge, in order
|
|
49
|
+
|
|
50
|
+
Line prefixes: `auto:` (agent just does it) · `ask:` (operator's word first) · `guard:` (deterministic check run locally at this position, its runnable command inline on the line; the CI copy is the backstop).
|
|
51
|
+
|
|
52
|
+
- {{playbook-drafted release steps for the detected stack}}
|
|
53
|
+
- {{guard: lines from the playbook}}
|
|
54
|
+
- {{post-release verification — how to see the release/deploy landed}}
|
|
55
|
+
- {{rollback one-liner from the playbook}}
|
|
56
|
+
- {{versioning policy in 1–2 bullets when the project has one; delete the section's placeholders — "Ship: merge only" is a valid runbook}}
|
|
57
|
+
|
|
58
|
+
## Verify — how to see it working (pre-merge)
|
|
59
|
+
|
|
60
|
+
- {{start: command · URL}}
|
|
61
|
+
- {{the flows worth smoke-checking after a change}}
|
|
62
|
+
|
|
63
|
+
## Environments
|
|
64
|
+
|
|
65
|
+
- {{environments and their targets; which the agent may touch}}
|
|
66
|
+
- {{where secret NAMES are defined — values never appear in this file}}
|
|
67
|
+
- Ship-guard policy lines, one per deployable target: `- <target>: <auto|ask> — <command pattern>` — for example `- preview: auto — wrangler deploy --env preview` and `- production: ask — wrangler deploy --env production`. The pattern runs to the end of the line and is matched as a literal prefix of the resolved command (quotes, wrappers and a path on the first word stripped); the longest match wins; a deploy or publish command matching no line is asked. `.vegastack/hooks/ship-guard.mjs` never reads this file: `vegafactory guard sync` compiles these lines into `~/.vegastack/guard/<owner>__<repo>.json`, and until it runs every guarded command asks.
|
|
68
|
+
|
|
69
|
+
## Design
|
|
70
|
+
|
|
71
|
+
- {{pointers: design system / component rules / UI conventions}}
|
|
72
|
+
|
|
73
|
+
## Architecture
|
|
74
|
+
|
|
75
|
+
Facts dev-architect reads before advising — knobs, not prose. Decisions with rationale go
|
|
76
|
+
to the register, never here. The repo wins on drift; dev-architect proposes the one-line
|
|
77
|
+
fix. Delete this whole section for repos with no app architecture (pure tooling, docs, or
|
|
78
|
+
content repos) — the `stack:` line at the top is enough.
|
|
79
|
+
|
|
80
|
+
hosting: {{cloudflare-workers-opennext | self-managed-server | both | vercel (exception - say why)}}
|
|
81
|
+
database: {{postgres via hyperdrive | postgres self-managed | d1 (recorded exception) | none}}
|
|
82
|
+
auth: {{better-auth | none}} # orgs plugin when multi-tenant
|
|
83
|
+
storage: {{r2 | s3 | minio | none}}
|
|
84
|
+
jobs: {{none | pg-boss}}
|
|
85
|
+
agents: {{none | eve | ai-features}} # ai-features = AI SDK calls only, no agent runtime
|
|
86
|
+
stage: {{pre-launch | live}} # pre-launch = delete-not-migrate applies
|
|
87
|
+
kind: {{internal | client | oss}}
|
|
88
|
+
mobile: {{no | flutter (separate repo)}}
|
|
89
|
+
|
|
90
|
+
## Decisions
|
|
91
|
+
|
|
92
|
+
Record a decision only when it is directional — it steers work beyond this issue: a real alternative was rejected; it constrains work not yet written; and no dev.md line, lint rule, or guard can enforce it instead (if one can, write the rule). Feature requests, one-off fixes, and routine implementation choices never qualify. Every entry needs the user's explicit yes. One line in the register (`decisions:` knob), append-only, no other metadata:
|
|
93
|
+
|
|
94
|
+
- DD-MM-YYYY (github-username) — the decision
|
|
95
|
+
|
|
96
|
+
## Stop and ask
|
|
97
|
+
|
|
98
|
+
Pause for the operator only when the work genuinely requires them: a destructive or irreversible action, a real scope change, or input only they can provide — ask and end the turn rather than end on a promise. In this project that means: a change of scope or product behavior, a significant new dependency or runtime, spending money, anything destructive or touching production, or a blocker the brief cannot resolve. Nothing ships without the operator's explicit instruction — see the AGENTS.md dev section.
|
|
99
|
+
|
|
100
|
+
## Project rules
|
|
101
|
+
|
|
102
|
+
- {{project-specific rules, one per line; delete this section if none}}
|