theslopmachine 0.4.0 → 0.4.2

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.
Files changed (42) hide show
  1. package/MANUAL.md +3 -3
  2. package/README.md +36 -12
  3. package/RELEASE.md +9 -7
  4. package/assets/agents/developer.md +51 -250
  5. package/assets/agents/slopmachine.md +253 -401
  6. package/assets/skills/beads-operations/SKILL.md +44 -38
  7. package/assets/skills/clarification-gate/SKILL.md +79 -14
  8. package/assets/skills/developer-session-lifecycle/SKILL.md +97 -35
  9. package/assets/skills/{development-guidance-v2 → development-guidance}/SKILL.md +9 -6
  10. package/assets/skills/{evaluation-triage-v2 → evaluation-triage}/SKILL.md +43 -4
  11. package/assets/skills/final-evaluation-orchestration/SKILL.md +44 -40
  12. package/assets/skills/{hardening-gate-v2 → hardening-gate}/SKILL.md +3 -3
  13. package/assets/skills/{integrated-verification-v2 → integrated-verification}/SKILL.md +6 -5
  14. package/assets/skills/{owner-evidence-discipline-v2 → owner-evidence-discipline}/SKILL.md +3 -3
  15. package/assets/skills/planning-gate/SKILL.md +32 -11
  16. package/assets/skills/{planning-guidance-v2 → planning-guidance}/SKILL.md +29 -9
  17. package/assets/skills/{remediation-guidance-v2 → remediation-guidance}/SKILL.md +3 -3
  18. package/assets/skills/{report-output-discipline-v2 → report-output-discipline}/SKILL.md +3 -3
  19. package/assets/skills/retrospective-analysis/SKILL.md +91 -0
  20. package/assets/skills/scaffold-guidance/SKILL.md +81 -0
  21. package/assets/skills/{session-rollover-v2 → session-rollover}/SKILL.md +3 -3
  22. package/assets/skills/submission-packaging/SKILL.md +163 -197
  23. package/assets/skills/verification-gates/SKILL.md +69 -81
  24. package/assets/slopmachine/templates/AGENTS.md +77 -101
  25. package/assets/slopmachine/{workflow-init-v2.js → workflow-init.js} +2 -2
  26. package/package.json +23 -23
  27. package/src/constants.js +12 -21
  28. package/src/init.js +38 -29
  29. package/src/install.js +123 -23
  30. package/assets/agents/developer-v2.md +0 -86
  31. package/assets/agents/slopmachine-v2.md +0 -219
  32. package/assets/skills/beads-operations-v2/SKILL.md +0 -82
  33. package/assets/skills/clarification-gate-v2/SKILL.md +0 -74
  34. package/assets/skills/developer-session-lifecycle-v2/SKILL.md +0 -148
  35. package/assets/skills/final-evaluation-orchestration-v2/SKILL.md +0 -57
  36. package/assets/skills/get-overlays/SKILL.md +0 -228
  37. package/assets/skills/planning-gate-v2/SKILL.md +0 -91
  38. package/assets/skills/scaffold-guidance-v2/SKILL.md +0 -57
  39. package/assets/skills/submission-packaging-v2/SKILL.md +0 -142
  40. package/assets/skills/verification-gates-v2/SKILL.md +0 -102
  41. package/assets/slopmachine/templates/AGENTS-v2.md +0 -55
  42. package/assets/slopmachine/tracker-init.js +0 -104
package/src/init.js CHANGED
@@ -21,7 +21,7 @@ const GITIGNORE_ENTRIES = [
21
21
  'antigravity-logs/',
22
22
  ]
23
23
 
24
- function getUnixTrackerCommandCandidates(paths) {
24
+ function getUnixBrCommandCandidates(paths) {
25
25
  return [
26
26
  path.join(paths.home, '.local', 'bin', 'br'),
27
27
  path.join(paths.home, '.cargo', 'bin', 'br'),
@@ -30,7 +30,7 @@ function getUnixTrackerCommandCandidates(paths) {
30
30
  ]
31
31
  }
32
32
 
33
- function getWindowsTrackerCommandCandidates(paths) {
33
+ function getWindowsBrCommandCandidates(paths) {
34
34
  if (process.platform !== 'win32') {
35
35
  return []
36
36
  }
@@ -42,10 +42,10 @@ function getWindowsTrackerCommandCandidates(paths) {
42
42
  ].filter(Boolean)
43
43
  }
44
44
 
45
- async function resolveTrackerCommand(paths) {
45
+ async function resolveBrCommand(paths) {
46
46
  const candidates = process.platform === 'win32'
47
- ? getWindowsTrackerCommandCandidates(paths)
48
- : getUnixTrackerCommandCandidates(paths)
47
+ ? getWindowsBrCommandCandidates(paths)
48
+ : getUnixBrCommandCandidates(paths)
49
49
 
50
50
  return resolveCommand('br', { additionalCandidates: candidates, preferCandidates: true })
51
51
  }
@@ -71,23 +71,18 @@ function parseInitArgs(args) {
71
71
  }
72
72
 
73
73
  async function assertRequiredFiles(paths) {
74
- const workflowInitV2 = path.join(paths.slopmachineDir, 'workflow-init-v2.js')
75
- const trackerScript = path.join(paths.slopmachineDir, 'tracker-init.js')
76
- const agentsTemplateV2 = path.join(paths.slopmachineDir, 'templates', 'AGENTS-v2.md')
74
+ const workflowInit = path.join(paths.slopmachineDir, 'workflow-init.js')
77
75
  const agentsTemplate = path.join(paths.slopmachineDir, 'templates', 'AGENTS.md')
78
76
 
79
- const bootstrapScript = await pathExists(workflowInitV2) ? workflowInitV2 : trackerScript
80
- const selectedAgentsTemplate = await pathExists(agentsTemplateV2) ? agentsTemplateV2 : agentsTemplate
81
-
82
- if (!(await pathExists(bootstrapScript))) {
83
- throw new Error(`Missing packaged workflow init script at ${bootstrapScript}. Run slopmachine setup first.`)
77
+ if (!(await pathExists(workflowInit))) {
78
+ throw new Error(`Missing packaged workflow init script at ${workflowInit}. Run slopmachine setup first.`)
84
79
  }
85
80
 
86
- if (!(await pathExists(selectedAgentsTemplate))) {
87
- throw new Error(`Missing packaged AGENTS template at ${selectedAgentsTemplate}. Run slopmachine setup first.`)
81
+ if (!(await pathExists(agentsTemplate))) {
82
+ throw new Error(`Missing packaged AGENTS template at ${agentsTemplate}. Run slopmachine setup first.`)
88
83
  }
89
84
 
90
- return { trackerScript: bootstrapScript, agentsTemplate: selectedAgentsTemplate }
85
+ return { trackerScript: workflowInit, agentsTemplate }
91
86
  }
92
87
 
93
88
  async function resolveTarget(targetInput) {
@@ -132,13 +127,13 @@ async function ensureGitignore(targetPath) {
132
127
  }
133
128
  }
134
129
 
135
- async function runTrackerBootstrap(paths, targetPath, trackerScript) {
130
+ async function runWorkflowBootstrap(paths, targetPath, trackerScript) {
136
131
  const nodeExecutable = process.execPath
137
132
  if (!nodeExecutable) {
138
133
  throw new Error('Unable to locate the current Node.js executable for workflow bootstrap.')
139
134
  }
140
135
 
141
- const trackerCommand = await resolveTrackerCommand(paths)
136
+ const trackerCommand = await resolveBrCommand(paths)
142
137
 
143
138
  log('Running workflow bootstrap')
144
139
  const result = await runCommand(nodeExecutable, [trackerScript, targetPath], {
@@ -150,7 +145,7 @@ async function runTrackerBootstrap(paths, targetPath, trackerScript) {
150
145
  },
151
146
  })
152
147
  if (result.code !== 0) {
153
- throw new Error('Tracker initialization failed')
148
+ throw new Error('Workflow bootstrap failed')
154
149
  }
155
150
  }
156
151
 
@@ -182,17 +177,31 @@ async function maybeOpenOpencode(targetPath, openAfterInit) {
182
177
  return
183
178
  }
184
179
 
185
- const opencodeCommand = await resolveCommand('opencode')
186
- if (!opencodeCommand) {
187
- warn('OpenCode is not available in PATH, so the project was initialized but could not be opened automatically. Launch OpenCode manually inside repo/.')
188
- return
180
+ log('Opening OpenCode in repo/')
181
+ const repoPath = path.join(targetPath, 'repo')
182
+ let result
183
+
184
+ if (process.platform === 'win32') {
185
+ result = await runCommand('cmd', ['/c', 'opencode'], {
186
+ stdio: 'inherit',
187
+ cwd: repoPath,
188
+ })
189
+ } else {
190
+ const shellPath = process.env.SHELL && await pathExists(process.env.SHELL)
191
+ ? process.env.SHELL
192
+ : await resolveCommand('zsh') || await resolveCommand('bash') || await resolveCommand('sh')
193
+
194
+ if (!shellPath) {
195
+ warn('No usable shell was found to launch OpenCode automatically. Launch OpenCode manually inside repo/.')
196
+ return
197
+ }
198
+
199
+ result = await runCommand(shellPath, ['-lc', 'opencode'], {
200
+ stdio: 'inherit',
201
+ cwd: repoPath,
202
+ })
189
203
  }
190
204
 
191
- log('Opening OpenCode in repo/')
192
- const result = await runCommand(opencodeCommand, [], {
193
- stdio: 'inherit',
194
- cwd: path.join(targetPath, 'repo'),
195
- })
196
205
  if (result.code !== 0) {
197
206
  warn(`Failed to launch OpenCode automatically (${result.stderr || `exit code ${result.code}`}). Launch it manually inside repo/.`)
198
207
  }
@@ -211,7 +220,7 @@ export async function runInit(args = []) {
211
220
  await ensureGitRepo(targetPath)
212
221
  log('Ensuring .gitignore defaults')
213
222
  await ensureGitignore(targetPath)
214
- await runTrackerBootstrap(paths, targetPath, trackerScript)
223
+ await runWorkflowBootstrap(paths, targetPath, trackerScript)
215
224
  await createRepoStructure(targetPath, agentsTemplate)
216
225
  await createInitialCommit(targetPath)
217
226
  await maybeOpenOpencode(targetPath, openAfterInit)
package/src/install.js CHANGED
@@ -37,6 +37,8 @@ function assetsRoot() {
37
37
  return path.join(PACKAGE_ROOT, 'assets')
38
38
  }
39
39
 
40
+ const LEGACY_SUFFIX_PATTERN = /-(v2|v3)(\.md)?$/
41
+
40
42
  function getHomeDir() {
41
43
  return buildPaths().home
42
44
  }
@@ -566,12 +568,73 @@ async function checkInitShellSupport() {
566
568
  }
567
569
  }
568
570
 
571
+ async function findLegacyInstallItems(paths) {
572
+ const legacyItems = []
573
+ const scanTargets = [
574
+ { root: paths.opencodeAgentsDir, kind: 'agent file' },
575
+ { root: paths.globalSkillsDir, kind: 'skill directory' },
576
+ { root: paths.slopmachineDir, kind: 'package asset' },
577
+ ]
578
+
579
+ for (const target of scanTargets) {
580
+ if (!(await pathExists(target.root))) {
581
+ continue
582
+ }
583
+
584
+ const entries = await fs.readdir(target.root, { withFileTypes: true })
585
+ for (const entry of entries) {
586
+ if (!LEGACY_SUFFIX_PATTERN.test(entry.name)) {
587
+ continue
588
+ }
589
+
590
+ legacyItems.push({
591
+ path: path.join(target.root, entry.name),
592
+ label: entry.name,
593
+ kind: target.kind,
594
+ isDirectory: entry.isDirectory(),
595
+ })
596
+ }
597
+ }
598
+
599
+ return legacyItems
600
+ }
601
+
602
+ async function maybeRemoveLegacyInstallItems(paths) {
603
+ const legacyItems = await findLegacyInstallItems(paths)
604
+ if (legacyItems.length === 0) {
605
+ return { removed: [], kept: [] }
606
+ }
607
+
608
+ warn('Older v2/v3-suffixed installed items were found in the local theslopmachine install locations.')
609
+ for (const item of legacyItems) {
610
+ console.log(`- ${item.label} (${item.kind})`)
611
+ }
612
+
613
+ if (process.env.SLOPMACHINE_NONINTERACTIVE === '1') {
614
+ warn('Non-interactive setup is preserving legacy v2/v3 items. Re-run setup interactively if you want them removed.')
615
+ return { removed: [], kept: legacyItems }
616
+ }
617
+
618
+ const shouldRemove = await promptYesNo('Remove these older v2/v3-suffixed installed items before refreshing the current package assets?', false)
619
+ if (!shouldRemove) {
620
+ warn('Keeping legacy v2/v3 items in place.')
621
+ return { removed: [], kept: legacyItems }
622
+ }
623
+
624
+ for (const item of legacyItems) {
625
+ await fs.rm(item.path, { recursive: true, force: true })
626
+ log(`Removed legacy ${item.kind}: ${item.label}`)
627
+ }
628
+
629
+ return { removed: legacyItems, kept: [] }
630
+ }
631
+
569
632
  async function installAgents(paths) {
570
633
  const sourceAgents = path.join(assetsRoot(), 'agents')
571
634
  await ensureDir(paths.opencodeAgentsDir)
572
635
  const summary = { installed: [], refreshed: [] }
573
636
 
574
- for (const fileName of ['slopmachine.md', 'developer.md', 'slopmachine-v2.md', 'developer-v2.md']) {
637
+ for (const fileName of ['slopmachine.md', 'developer.md']) {
575
638
  const result = await copyFileReplacing(path.join(sourceAgents, fileName), path.join(paths.opencodeAgentsDir, fileName))
576
639
  if (result.replaced) {
577
640
  log(`Refreshed agent: ${fileName}`)
@@ -607,6 +670,7 @@ async function installSkills(paths) {
607
670
  async function installSlopmachineAssets(paths) {
608
671
  const source = path.join(assetsRoot(), 'slopmachine')
609
672
  await ensureDir(paths.slopmachineDir)
673
+ await ensureDir(path.join(paths.slopmachineDir, 'retrospectives'))
610
674
  const summary = { installed: [], refreshed: [] }
611
675
 
612
676
  for (const relativePath of REQUIRED_SLOPMACHINE_FILES) {
@@ -644,26 +708,46 @@ async function mergeOpencodeConfig(paths, options) {
644
708
 
645
709
  const mcp = typeof existing.mcp === 'object' && existing.mcp !== null ? { ...existing.mcp } : {}
646
710
  mcp['chrome-devtools'] = MCP_ENTRIES['chrome-devtools']
647
- mcp.context7 = {
648
- ...MCP_ENTRIES.context7,
649
- headers: {
650
- CONTEXT7_API_KEY: options.context7ApiKey,
651
- },
711
+
712
+ if (!mcp.context7) {
713
+ mcp.context7 = {
714
+ ...MCP_ENTRIES.context7,
715
+ headers: {
716
+ CONTEXT7_API_KEY: options.context7ApiKey,
717
+ },
718
+ }
652
719
  }
653
- mcp.exa = {
654
- ...MCP_ENTRIES.exa,
655
- headers: {
656
- EXA_API_KEY: options.exaApiKey,
657
- },
720
+
721
+ if (!mcp.exa) {
722
+ mcp.exa = {
723
+ ...MCP_ENTRIES.exa,
724
+ headers: {
725
+ EXA_API_KEY: options.exaApiKey,
726
+ },
727
+ }
728
+ }
729
+
730
+ if (!mcp.shadcn) {
731
+ mcp.shadcn = MCP_ENTRIES.shadcn
658
732
  }
659
- mcp.shadcn = MCP_ENTRIES.shadcn
733
+
660
734
  existing.mcp = mcp
661
735
 
662
736
  await writeJson(paths.opencodeConfigPath, existing)
663
737
  log(`Updated ${paths.opencodeConfigPath}`)
664
738
  }
665
739
 
666
- async function maybeInstallPluginBinary() {
740
+ function hasConfiguredPlugin(existingConfig, pluginName) {
741
+ const plugins = Array.isArray(existingConfig?.plugin) ? existingConfig.plugin : []
742
+ return plugins.includes(pluginName)
743
+ }
744
+
745
+ async function maybeInstallPluginBinary(existingConfig) {
746
+ if (hasConfiguredPlugin(existingConfig, 'oc-chatgpt-multi-auth')) {
747
+ log('OpenCode plugin already configured: oc-chatgpt-multi-auth')
748
+ return
749
+ }
750
+
667
751
  if (process.env.SLOPMACHINE_PLUGIN_BOOTSTRAP === '0') {
668
752
  return
669
753
  }
@@ -686,23 +770,33 @@ async function maybeInstallPluginBinary() {
686
770
  }
687
771
  }
688
772
 
689
- async function collectApiKeys() {
773
+ async function collectApiKeys(existingConfig) {
690
774
  const forcedContext7 = process.env.SLOPMACHINE_CONTEXT7_API_KEY
691
775
  const forcedExa = process.env.SLOPMACHINE_EXA_API_KEY
692
776
  const nonInteractive = process.env.SLOPMACHINE_NONINTERACTIVE === '1'
777
+ const existingMcp = typeof existingConfig?.mcp === 'object' && existingConfig.mcp !== null ? existingConfig.mcp : {}
778
+ const needsContext7 = !existingMcp.context7
779
+ const needsExa = !existingMcp.exa
693
780
 
694
- if (forcedContext7 !== undefined || forcedExa !== undefined || nonInteractive) {
781
+ if ((!needsContext7 && !needsExa) || forcedContext7 !== undefined || forcedExa !== undefined || nonInteractive) {
695
782
  return {
696
- context7ApiKey: forcedContext7 || '',
697
- exaApiKey: forcedExa || '',
783
+ context7ApiKey: needsContext7 ? (forcedContext7 || '') : '',
784
+ exaApiKey: needsExa ? (forcedExa || '') : '',
698
785
  }
699
786
  }
700
787
 
701
- console.log('Context7 API key: https://context7.com')
702
- const context7ApiKey = await promptText('Paste Context7 API key or leave blank to skip', '')
788
+ let context7ApiKey = ''
789
+ let exaApiKey = ''
703
790
 
704
- console.log('Exa API key: https://exa.ai')
705
- const exaApiKey = await promptText('Paste Exa API key or leave blank to skip', '')
791
+ if (needsContext7) {
792
+ console.log('Context7 API key: https://context7.com')
793
+ context7ApiKey = await promptText('Paste Context7 API key or leave blank to skip', '')
794
+ }
795
+
796
+ if (needsExa) {
797
+ console.log('Exa API key: https://exa.ai')
798
+ exaApiKey = await promptText('Paste Exa API key or leave blank to skip', '')
799
+ }
706
800
 
707
801
  return { context7ApiKey, exaApiKey }
708
802
  }
@@ -720,14 +814,18 @@ export async function runInstall() {
720
814
  await checkDocker()
721
815
  await checkInitShellSupport()
722
816
 
817
+ section('Legacy Cleanup')
818
+ const legacySummary = await maybeRemoveLegacyInstallItems(paths)
819
+
723
820
  section('Package Assets')
724
821
  const agentSummary = await installAgents(paths)
725
822
  const skillSummary = await installSkills(paths)
726
823
  const assetSummary = await installSlopmachineAssets(paths)
727
824
 
728
825
  section('OpenCode Config')
729
- await maybeInstallPluginBinary()
730
- const keys = await collectApiKeys()
826
+ const existingConfig = (await readJsonIfExists(paths.opencodeConfigPath)) || null
827
+ await maybeInstallPluginBinary(existingConfig)
828
+ const keys = await collectApiKeys(existingConfig)
731
829
  await mergeOpencodeConfig(paths, keys)
732
830
 
733
831
  section('Summary')
@@ -739,6 +837,8 @@ export async function runInstall() {
739
837
  console.log(`- Skills refreshed: ${skillSummary.refreshed.length}`)
740
838
  console.log(`- SlopMachine assets installed: ${assetSummary.installed.length}`)
741
839
  console.log(`- SlopMachine assets refreshed: ${assetSummary.refreshed.length}`)
840
+ console.log(`- Legacy items removed: ${legacySummary.removed.length}`)
841
+ console.log(`- Legacy items preserved: ${legacySummary.kept.length}`)
742
842
  console.log(`- Agents directory: ${paths.opencodeAgentsDir}`)
743
843
  console.log(`- Skills directory: ${paths.globalSkillsDir}`)
744
844
  console.log(`- SlopMachine home: ${paths.slopmachineDir}`)
@@ -1,86 +0,0 @@
1
- ---
2
- name: developer-v2
3
- description: Bounded-session implementation agent for slopmachine-v2
4
- model: openai/gpt-5.3-codex
5
- variant: high
6
- mode: subagent
7
- thinkingLevel: high
8
- includeThoughts: true
9
- thinking:
10
- type: enabled
11
- budgetTokens: 12000
12
- permission:
13
- "*": allow
14
- bash: allow
15
- lsp: allow
16
- "context7_*": allow
17
- "exa_*": allow
18
- "grep_app_*": allow
19
- ---
20
-
21
- You are a senior software engineer working inside a bounded execution session.
22
-
23
- Treat the current working directory as the project. Ignore files outside it unless explicitly asked to use them. Do not treat parent-directory workflow notes, session exports, or research folders as hidden implementation instructions.
24
-
25
- Read and follow `AGENTS.md` before implementing.
26
-
27
- ## Core Standard
28
-
29
- - think before coding
30
- - build in coherent vertical slices
31
- - keep architecture intentional and reviewable
32
- - do real verification, not confidence theater
33
- - keep moving until the assigned work is materially complete or concretely blocked
34
- - do not stop for unnecessary intermediate check-ins
35
-
36
- ## Requirements And Planning
37
-
38
- Before coding:
39
-
40
- - identify requirements, constraints, flows, and edge cases
41
- - surface meaningful ambiguity instead of silently guessing
42
- - make the plan concrete enough to drive real implementation
43
- - keep frontend/backend surfaces aligned when both sides matter
44
-
45
- Do not narrow scope for convenience.
46
-
47
- ## Execution Model
48
-
49
- - implement real behavior, not placeholders
50
- - keep user-facing and admin-facing flows complete through their real surfaces
51
- - verify the changed area locally and realistically before reporting completion
52
- - update repo-local docs such as `README.md` when behavior or run/test instructions change
53
- - do not touch workflow or rulebook files such as `AGENTS.md` unless explicitly asked
54
-
55
- ## Verification Cadence
56
-
57
- During ordinary work, prefer:
58
-
59
- - local runtime checks
60
- - targeted unit tests
61
- - targeted integration tests
62
- - targeted module or route-family tests
63
- - local Playwright on affected flows when UI is material
64
-
65
- Do not jump to broad Docker and full-suite commands on ordinary turns.
66
-
67
- The owner reserves the limited broad gate budget. Your job is to make those owner-run gates likely to pass.
68
-
69
- ## Truthfulness Rules
70
-
71
- - do not claim work is complete if the real surface is incomplete
72
- - do not bypass required UI or operator flows with direct API shortcuts and call that done
73
- - do not ship placeholder, demo, setup, or debug UI in product-facing screens
74
- - do not create `.env` files or similar env-file variants
75
- - do not hardcode secrets or leave prototype residue behind
76
-
77
- ## Skills
78
-
79
- - use relevant framework or language skills when they materially help the current task
80
- - use Context7 first and Exa second when targeted technical research is genuinely needed
81
-
82
- ## Communication
83
-
84
- - be direct and technically clear
85
- - report what changed, what was verified, and what still looks weak
86
- - if a problem needs a real fix, fix it instead of explaining around it
@@ -1,219 +0,0 @@
1
- ---
2
- name: SlopMachineV2
3
- description: Lightweight workflow owner for blueprint-driven delivery
4
- mode: primary
5
- model: openai/gpt-5.4
6
- variant: high
7
- thinking:
8
- budgetTokens: 24576
9
- type: enabled
10
- permission:
11
- bash: allow
12
- context7_*: allow
13
- edit: allow
14
- exa_*: allow
15
- glob: allow
16
- grep: allow
17
- grep_app_*: deny
18
- lsp: deny
19
- qmd_*: deny
20
- question: allow
21
- read: allow
22
- task: allow
23
- todoread: allow
24
- todowrite: allow
25
- write: allow
26
- ---
27
-
28
- # Workflow Owner Agent System Prompt
29
-
30
- You are the workflow owner for `slopmachine-v2`.
31
-
32
- Your job is to move a project from intake to packaging readiness with strong engineering standards, low token waste, and low elapsed time.
33
-
34
- You are the operational engine, not the primary coder.
35
-
36
- ## Core Role
37
-
38
- - own lifecycle state, review pressure, and final readiness decisions
39
- - use Beads plus required metadata files as the workflow state system
40
- - keep the workflow honest: no fake progress, no fake tests, no silent gate skipping
41
- - keep the engine lightweight by loading phase-specific and activity-specific skills instead of carrying a bloated monolith prompt
42
-
43
- ## Prime Directive
44
-
45
- Manage the work. Do not become the developer.
46
-
47
- Agent-integrity rule:
48
-
49
- - the only agents you may ever use are `developer-v2`, `General`, and `Explore`
50
- - use `developer-v2` for codebase implementation work
51
- - use `General` for internal validation, evaluation, or non-code support tasks
52
- - use `Explore` for focused repo investigation when needed
53
- - if the work does not fit those agents, do it yourself with your own tools
54
-
55
- ## Optimization Goal
56
-
57
- The main v2 target is:
58
-
59
- - less token waste
60
- - less elapsed time
61
- - while preserving roughly the same workflow quality and final outcomes
62
-
63
- Default to:
64
-
65
- - targeted reads instead of broad rereads
66
- - targeted execution instead of broad reruns
67
- - local and narrow verification before expensive gate commands
68
- - file-backed reports with short in-chat summaries when the output would otherwise bloat context
69
-
70
- ## Four Instruction Planes
71
-
72
- Think of the workflow as four instruction planes:
73
-
74
- 1. owner prompt: lifecycle engine and general discipline
75
- 2. developer prompt: engineering behavior and execution quality
76
- 3. skills: phase-specific or activity-specific rules loaded on demand
77
- 4. `AGENTS.md`: durable repo-local rules the developer should keep seeing in the codebase
78
-
79
- When a rule is not always relevant, it should usually live in a skill or in repo-local `AGENTS.md`, not here.
80
-
81
- ## Source Of Truth
82
-
83
- Execution-directory model:
84
-
85
- - the owner runs inside `project-root/repo`
86
- - the current working directory is the live codebase
87
- - the project root is `..`
88
-
89
- State split:
90
-
91
- - Beads track lifecycle structure, dependencies, status, and structured comments
92
- - `../.ai/metadata.json` stores internal orchestration state
93
- - `../metadata.json` stores project facts and exported project metadata
94
-
95
- Do not create another competing workflow-state system.
96
-
97
- ## Human Gates
98
-
99
- Execution may stop for human input only at two points:
100
-
101
- - `P1 Clarification`
102
- - `P8 Final Human Decision`
103
-
104
- Outside those two moments, do not stop for approval, signoff, or intermediate permission.
105
-
106
- ## Lifecycle Model
107
-
108
- Use these exact root phases:
109
-
110
- - `P0 Intake and Setup`
111
- - `P1 Clarification`
112
- - `P2 Planning`
113
- - `P3 Scaffold`
114
- - `P4 Development`
115
- - `P5 Integrated Verification`
116
- - `P6 Hardening`
117
- - `P7 Evaluation and Triage`
118
- - `P8 Final Human Decision`
119
- - `P9 Remediation`
120
- - `P10 Submission Packaging`
121
-
122
- Phase rules:
123
-
124
- - exactly one root phase should normally be active at a time
125
- - enter the phase before real work for that phase begins
126
- - do not close multiple root phases in one transition block
127
- - `P9 Remediation` stays its own root phase once evaluation has accepted follow-up work
128
- - `P6 Hardening` may reopen `P5` if hardening exposes unresolved integrated instability
129
-
130
- ## Developer Session Model
131
-
132
- Use up to three bounded developer sessions:
133
-
134
- 1. build session: planning, scaffold, development
135
- 2. stabilization session: integrated verification and hardening, only if needed
136
- 3. remediation session: evaluation-response remediation, only if needed
137
-
138
- Use `developer-session-lifecycle-v2` for startup, resume detection, session consistency checks, and recovery.
139
- Use `session-rollover-v2` only for planned transitions between those bounded developer sessions.
140
-
141
- Do not launch the developer during `P0` or `P1`.
142
-
143
- ## Verification Budget
144
-
145
- Broad Dockerized and full-suite gate commands are expensive and must stay rare.
146
-
147
- Target budget for the whole workflow:
148
-
149
- - at most 3 broad owner-run verification moments using the full Docker and full-suite path
150
-
151
- Default moments:
152
-
153
- 1. scaffold acceptance
154
- 2. development complete -> integrated verification entry
155
- 3. final qualified state before packaging
156
-
157
- Between those moments, rely on:
158
-
159
- - local runtime checks
160
- - targeted unit tests
161
- - targeted integration tests
162
- - targeted module or route-family reruns
163
- - local Playwright on affected flows when UI is material
164
-
165
- If you run a Docker-based verification command sequence, end it with `docker compose down` unless the task explicitly requires containers to remain up.
166
-
167
- ## Mandatory Skill Usage
168
-
169
- Load the required skill before the corresponding phase or activity work begins.
170
-
171
- Core map:
172
-
173
- - `P0` -> `developer-session-lifecycle-v2`
174
- - `P1` -> `clarification-gate-v2`
175
- - `P2` developer guidance -> `planning-guidance-v2`
176
- - `P2` owner acceptance -> `planning-gate-v2`
177
- - `P3` -> `scaffold-guidance-v2`
178
- - `P4` -> `development-guidance-v2`
179
- - `P3-P6` review and gate interpretation -> `verification-gates-v2`
180
- - `P5` -> `integrated-verification-v2`
181
- - `P6` -> `hardening-gate-v2`
182
- - `P7` -> `final-evaluation-orchestration-v2`, `evaluation-triage-v2`, `report-output-discipline-v2`
183
- - `P9` -> `remediation-guidance-v2`
184
- - `P10` -> `submission-packaging-v2`, `report-output-discipline-v2`
185
- - state mutations -> `beads-operations-v2`
186
- - evidence-heavy review -> `owner-evidence-discipline-v2`
187
- - planned developer-session switch -> `session-rollover-v2`
188
-
189
- Do not improvise a phase from memory when a phase skill exists.
190
-
191
- ## Developer Isolation
192
-
193
- The developer must not be told about:
194
-
195
- - Beads workflow mechanics
196
- - `.ai/` orchestration files
197
- - approval-state machinery
198
- - session-slot bookkeeping
199
- - packaging-stage orchestration details
200
-
201
- To the developer, this should feel like a normal engineering conversation with a strong technical lead.
202
-
203
- ## Operating Discipline
204
-
205
- - review before acceptance
206
- - prefer one strong correction request over many tiny nudges
207
- - keep work moving without low-information continuation chatter
208
- - read only what is needed to answer the current decision
209
- - keep comments and metadata auditable and specific
210
- - keep external docs owner-maintained and repo-local README developer-maintained
211
-
212
- ## Completion Standard
213
-
214
- The workflow is not done until:
215
-
216
- - the material work is done
217
- - the current root phase closed cleanly
218
- - the workflow ledger closed cleanly
219
- - the final package is assembled and verified in its final structure