godpowers 1.6.20 → 1.6.22

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 (34) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +28 -9
  3. package/RELEASE.md +38 -21
  4. package/bin/install.js +81 -1
  5. package/fixtures/dogfood/extension-authoring/manifest.json +13 -0
  6. package/fixtures/dogfood/half-migrated-gsd/.planning/PROJECT.md +5 -0
  7. package/fixtures/dogfood/half-migrated-gsd/.planning/REQUIREMENTS.md +5 -0
  8. package/fixtures/dogfood/half-migrated-gsd/.planning/ROADMAP.md +5 -0
  9. package/fixtures/dogfood/half-migrated-gsd/manifest.json +16 -0
  10. package/fixtures/dogfood/host-degraded/manifest.json +5 -0
  11. package/fixtures/dogfood/host-full/home/.codex/agents/god-orchestrator.toml +2 -0
  12. package/fixtures/dogfood/host-full/manifest.json +5 -0
  13. package/fixtures/dogfood/suite-release-dry-run/.godpowers/suite-config.yaml +9 -0
  14. package/fixtures/dogfood/suite-release-dry-run/manifest.json +7 -0
  15. package/fixtures/dogfood/suite-release-dry-run/repo-a/package.json +4 -0
  16. package/fixtures/dogfood/suite-release-dry-run/repo-b/package.json +7 -0
  17. package/lib/README.md +3 -0
  18. package/lib/dashboard.js +73 -3
  19. package/lib/dogfood-runner.js +193 -0
  20. package/lib/extension-authoring.js +154 -0
  21. package/lib/feature-awareness.js +18 -0
  22. package/lib/host-capabilities.js +125 -0
  23. package/lib/release-surface-sync.js +30 -0
  24. package/lib/repo-surface-sync.js +128 -0
  25. package/lib/route-quality-sync.js +31 -4
  26. package/lib/suite-state.js +90 -1
  27. package/package.json +4 -3
  28. package/routing/god-dogfood.yaml +35 -0
  29. package/routing/god-init.yaml +1 -1
  30. package/routing/god-roadmap-update.yaml +1 -1
  31. package/routing/god-sync.yaml +1 -1
  32. package/skills/god-doctor.md +1 -1
  33. package/skills/god-dogfood.md +63 -0
  34. package/skills/god-version.md +1 -1
@@ -12,11 +12,25 @@ const path = require('path');
12
12
  const LOG_PATH = '.godpowers/surface/RELEASE-SURFACE-SYNC.md';
13
13
 
14
14
  const REQUIRED_PACKAGE_GUARDS = [
15
+ 'lib/dogfood-runner.js',
16
+ 'lib/extension-authoring.js',
17
+ 'lib/host-capabilities.js',
15
18
  'lib/route-quality-sync.js',
16
19
  'lib/recipe-coverage-sync.js',
17
20
  'lib/release-surface-sync.js'
18
21
  ];
19
22
 
23
+ const REQUIRED_RELEASE_TESTS = [
24
+ 'scripts/test-dogfood-runner.js',
25
+ 'scripts/test-extension-authoring.js',
26
+ 'scripts/test-host-capabilities.js',
27
+ 'scripts/test-automation-surface-sync.js',
28
+ 'scripts/test-repo-surface-sync.js',
29
+ 'scripts/test-extensions-publish.js',
30
+ 'scripts/test-mode-d.js',
31
+ 'scripts/test-install-smoke.js'
32
+ ];
33
+
20
34
  function read(projectRoot, relPath) {
21
35
  const file = path.join(projectRoot, relPath);
22
36
  if (!fs.existsSync(file)) return '';
@@ -100,6 +114,21 @@ function detect(projectRoot) {
100
114
  );
101
115
  }
102
116
 
117
+ const scriptsText = JSON.stringify(pkg.scripts || {});
118
+ for (const required of REQUIRED_RELEASE_TESTS) {
119
+ const ok = scriptsText.includes(required);
120
+ addCheck(
121
+ checks,
122
+ `release-test-${required.replace(/[^a-z0-9]+/gi, '-')}`,
123
+ ok ? 'fresh' : 'stale',
124
+ 'package.json',
125
+ ok
126
+ ? `Release gate includes ${required}.`
127
+ : `Release gate does not include ${required}.`,
128
+ { spawn: ok ? null : 'god-auditor' }
129
+ );
130
+ }
131
+
103
132
  const stale = checks.filter((check) => check.status !== 'fresh');
104
133
  return {
105
134
  status: stale.length === 0 ? 'fresh' : 'stale',
@@ -147,6 +176,7 @@ function summary(report) {
147
176
  module.exports = {
148
177
  LOG_PATH,
149
178
  REQUIRED_PACKAGE_GUARDS,
179
+ REQUIRED_RELEASE_TESTS,
150
180
  detect,
151
181
  run,
152
182
  summary
@@ -29,6 +29,7 @@ const REQUIRED_PACKAGE_FILE_ENTRIES = [
29
29
  'workflows/',
30
30
  'schema/',
31
31
  'lib/',
32
+ 'fixtures/',
32
33
  'extensions/',
33
34
  'RELEASE.md',
34
35
  'SKILL.md',
@@ -41,6 +42,9 @@ const REQUIRED_PACKAGE_CHECKS = [
41
42
  'lib/feature-awareness.js',
42
43
  'lib/repo-doc-sync.js',
43
44
  'lib/repo-surface-sync.js',
45
+ 'lib/dogfood-runner.js',
46
+ 'lib/extension-authoring.js',
47
+ 'lib/host-capabilities.js',
44
48
  'lib/route-quality-sync.js',
45
49
  'lib/recipe-coverage-sync.js',
46
50
  'lib/release-surface-sync.js',
@@ -357,6 +361,128 @@ function extensionChecks(projectRoot) {
357
361
  return checks;
358
362
  }
359
363
 
364
+ function suiteChecks(projectRoot) {
365
+ const checks = [];
366
+ const pkg = readJson(projectRoot, 'package.json') || {};
367
+ const scriptsText = JSON.stringify(pkg.scripts || {});
368
+ const roadmap = read(projectRoot, 'docs/ROADMAP.md');
369
+ const suiteCommands = [
370
+ 'god-suite-init',
371
+ 'god-suite-status',
372
+ 'god-suite-sync',
373
+ 'god-suite-patch',
374
+ 'god-suite-release'
375
+ ];
376
+
377
+ addCheck(
378
+ checks,
379
+ 'suite',
380
+ 'suite-runtime-helper',
381
+ exists(projectRoot, 'lib/suite-state.js') ? 'fresh' : 'stale',
382
+ 'lib/suite-state.js',
383
+ exists(projectRoot, 'lib/suite-state.js')
384
+ ? 'Mode D suite state helper exists.'
385
+ : 'Mode D suite state helper is missing.',
386
+ { spawn: exists(projectRoot, 'lib/suite-state.js') ? null : 'god-coordinator' }
387
+ );
388
+
389
+ addCheck(
390
+ checks,
391
+ 'suite',
392
+ 'suite-test-gate',
393
+ scriptsText.includes('scripts/test-mode-d.js') ? 'fresh' : 'stale',
394
+ 'package.json',
395
+ scriptsText.includes('scripts/test-mode-d.js')
396
+ ? 'Release gate includes Mode D suite tests.'
397
+ : 'Release gate does not include Mode D suite tests.',
398
+ { spawn: scriptsText.includes('scripts/test-mode-d.js') ? null : 'god-coordinator' }
399
+ );
400
+
401
+ addCheck(
402
+ checks,
403
+ 'suite',
404
+ 'suite-docs',
405
+ roadmap.includes('Mode D') ? 'fresh' : 'stale',
406
+ 'docs/ROADMAP.md',
407
+ roadmap.includes('Mode D')
408
+ ? 'Roadmap documents Mode D suite support.'
409
+ : 'Roadmap does not document Mode D suite support.',
410
+ { spawn: roadmap.includes('Mode D') ? null : 'god-coordinator' }
411
+ );
412
+
413
+ for (const command of suiteCommands) {
414
+ const skill = `skills/${command}.md`;
415
+ const route = `routing/${command}.yaml`;
416
+ const ok = exists(projectRoot, skill) && exists(projectRoot, route);
417
+ addCheck(
418
+ checks,
419
+ 'suite',
420
+ `suite-command-${command}`,
421
+ ok ? 'fresh' : 'stale',
422
+ skill,
423
+ ok
424
+ ? `/${command} has skill and routing metadata.`
425
+ : `/${command} is missing a skill or route.`,
426
+ { spawn: ok ? null : 'god-coordinator' }
427
+ );
428
+ }
429
+
430
+ return checks;
431
+ }
432
+
433
+ function dogfoodChecks(projectRoot) {
434
+ const checks = [];
435
+ const pkg = readJson(projectRoot, 'package.json') || {};
436
+ const scriptsText = JSON.stringify(pkg.scripts || {});
437
+ const scenarios = [
438
+ 'fixtures/dogfood/half-migrated-gsd/manifest.json',
439
+ 'fixtures/dogfood/host-degraded/manifest.json',
440
+ 'fixtures/dogfood/host-full/manifest.json',
441
+ 'fixtures/dogfood/extension-authoring/manifest.json',
442
+ 'fixtures/dogfood/suite-release-dry-run/manifest.json'
443
+ ];
444
+
445
+ addCheck(
446
+ checks,
447
+ 'dogfood',
448
+ 'dogfood-runtime-helper',
449
+ exists(projectRoot, 'lib/dogfood-runner.js') ? 'fresh' : 'stale',
450
+ 'lib/dogfood-runner.js',
451
+ exists(projectRoot, 'lib/dogfood-runner.js')
452
+ ? 'Dogfood runner helper exists.'
453
+ : 'Dogfood runner helper is missing.',
454
+ { spawn: exists(projectRoot, 'lib/dogfood-runner.js') ? null : 'god-auditor' }
455
+ );
456
+
457
+ addCheck(
458
+ checks,
459
+ 'dogfood',
460
+ 'dogfood-test-gate',
461
+ scriptsText.includes('scripts/test-dogfood-runner.js') ? 'fresh' : 'stale',
462
+ 'package.json',
463
+ scriptsText.includes('scripts/test-dogfood-runner.js')
464
+ ? 'Release gate includes dogfood runner tests.'
465
+ : 'Release gate does not include dogfood runner tests.',
466
+ { spawn: scriptsText.includes('scripts/test-dogfood-runner.js') ? null : 'god-auditor' }
467
+ );
468
+
469
+ for (const scenario of scenarios) {
470
+ addCheck(
471
+ checks,
472
+ 'dogfood',
473
+ `dogfood-scenario-${path.basename(path.dirname(scenario))}`,
474
+ exists(projectRoot, scenario) ? 'fresh' : 'stale',
475
+ scenario,
476
+ exists(projectRoot, scenario)
477
+ ? `${scenario} exists.`
478
+ : `${scenario} is missing.`,
479
+ { spawn: exists(projectRoot, scenario) ? null : 'god-auditor' }
480
+ );
481
+ }
482
+
483
+ return checks;
484
+ }
485
+
360
486
  function releasePolicyChecks(projectRoot) {
361
487
  const checks = [];
362
488
  const docs = repoDocSync.detect(projectRoot);
@@ -393,6 +519,8 @@ function detect(projectRoot) {
393
519
  ...agentChecks(projectRoot),
394
520
  ...workflowRecipeChecks(projectRoot),
395
521
  ...extensionChecks(projectRoot),
522
+ ...suiteChecks(projectRoot),
523
+ ...dogfoodChecks(projectRoot),
396
524
  ...releasePolicyChecks(projectRoot),
397
525
  ...routeQualitySync.detect(projectRoot).checks,
398
526
  ...recipeCoverageSync.detect(projectRoot).checks,
@@ -2,9 +2,8 @@
2
2
  * Route quality sync.
3
3
  *
4
4
  * Detects disconnected route automation surfaces: symbolic spawn tokens,
5
- * unresolved agent targets, contextual exits without an approved reason, and
6
- * composite flows that should be represented as primary plus secondary or
7
- * parallel spawns.
5
+ * unresolved agent targets, contextual exits without an approved reason,
6
+ * missing standards coverage, and agent-spawn routes without trace events.
8
7
  */
9
8
 
10
9
  const fs = require('fs');
@@ -141,14 +140,16 @@ function detect(projectRoot) {
141
140
  let unresolvedCount = 0;
142
141
  let contextualExitCount = 0;
143
142
  let standardsExemptCount = 0;
143
+ let traceEventMissingCount = 0;
144
144
 
145
145
  for (const routePath of routes) {
146
146
  const route = parseRoute(projectRoot, routePath);
147
147
  const command = route.metadata && route.metadata.command
148
148
  ? route.metadata.command
149
149
  : `/${path.basename(routePath, '.yaml')}`;
150
+ const tokens = spawnTokens(route);
150
151
 
151
- for (const token of spawnTokens(route)) {
152
+ for (const token of tokens) {
152
153
  if (!isAtomicSpawn(String(token))) {
153
154
  symbolicCount++;
154
155
  addCheck(
@@ -174,6 +175,22 @@ function detect(projectRoot) {
174
175
  }
175
176
  }
176
177
 
178
+ const agentTokens = tokens
179
+ .map((token) => String(token))
180
+ .filter((token) => /^god-[a-z0-9-]+$/.test(token));
181
+ const events = arr(route.endoff && route.endoff.events).map((event) => String(event));
182
+ if (agentTokens.length > 0 && (!events.includes('agent.start') || !events.includes('agent.end'))) {
183
+ traceEventMissingCount++;
184
+ addCheck(
185
+ checks,
186
+ `missing-trace-events-${command.replace(/[^a-z0-9]+/gi, '-')}`,
187
+ 'stale',
188
+ routePath,
189
+ `${command} spawns agents but does not declare both agent.start and agent.end trace events.`,
190
+ { spawn: 'god-auditor' }
191
+ );
192
+ }
193
+
177
194
  const next = route['success-path'] && route['success-path']['next-recommended'];
178
195
  const conditionalNext = route['success-path'] && arr(route['success-path']['conditional-next']);
179
196
  if (next === 'varies' && conditionalNext.length === 0) {
@@ -231,6 +248,16 @@ function detect(projectRoot) {
231
248
  `${standardsExemptCount} durable-writing routes have approved standards exemptions and all other writing routes declare standards.`,
232
249
  { spawn: checks.some((check) => check.id.startsWith('missing-standards-')) ? 'god-auditor' : null }
233
250
  );
251
+ addCheck(
252
+ checks,
253
+ 'agent-trace-policy',
254
+ traceEventMissingCount === 0 ? 'fresh' : 'stale',
255
+ 'routing/',
256
+ traceEventMissingCount === 0
257
+ ? 'All agent-spawning routes declare agent.start and agent.end trace events.'
258
+ : `${traceEventMissingCount} agent-spawning routes are missing required trace events.`,
259
+ { spawn: traceEventMissingCount === 0 ? null : 'god-auditor' }
260
+ );
234
261
 
235
262
  const stale = checks.filter((check) => check.status !== 'fresh');
236
263
  return {
@@ -143,6 +143,94 @@ function refreshFromRepos(hubPath) {
143
143
  return data;
144
144
  }
145
145
 
146
+ function readPackageName(repoPath) {
147
+ const file = path.join(repoPath, 'package.json');
148
+ if (!fs.existsSync(file)) return path.basename(repoPath);
149
+ try {
150
+ const pkg = JSON.parse(fs.readFileSync(file, 'utf8'));
151
+ return pkg.name || path.basename(repoPath);
152
+ } catch (err) {
153
+ return path.basename(repoPath);
154
+ }
155
+ }
156
+
157
+ function readPackageDeps(repoPath) {
158
+ const file = path.join(repoPath, 'package.json');
159
+ if (!fs.existsSync(file)) return {};
160
+ try {
161
+ const pkg = JSON.parse(fs.readFileSync(file, 'utf8'));
162
+ return {
163
+ ...(pkg.dependencies || {}),
164
+ ...(pkg.devDependencies || {}),
165
+ ...(pkg.peerDependencies || {}),
166
+ ...(pkg.optionalDependencies || {})
167
+ };
168
+ } catch (err) {
169
+ return {};
170
+ }
171
+ }
172
+
173
+ function siblingRecords(hubPath) {
174
+ const config = detector.readSuiteConfig(hubPath);
175
+ if (!config) return [];
176
+ return (config.siblings || []).map((sib) => {
177
+ if (typeof sib === 'string') {
178
+ const repoPath = path.resolve(hubPath, sib);
179
+ return { name: sib, path: repoPath, packageName: readPackageName(repoPath) };
180
+ }
181
+ const repoPath = path.resolve(hubPath, sib.path || sib.name);
182
+ return { name: sib.name, path: repoPath, packageName: readPackageName(repoPath) };
183
+ });
184
+ }
185
+
186
+ function planRelease(hubPath, repoName, version, opts = {}) {
187
+ const siblings = siblingRecords(hubPath);
188
+ const target = siblings.find((repo) => repo.name === repoName || repo.packageName === repoName);
189
+ if (!target) {
190
+ return {
191
+ mode: 'dry-run',
192
+ status: 'blocked',
193
+ repo: repoName,
194
+ version,
195
+ impacted: [],
196
+ blockers: [`${repoName} is not registered in suite-config.yaml`],
197
+ writes: []
198
+ };
199
+ }
200
+
201
+ const impacted = [];
202
+ for (const repo of siblings) {
203
+ if (repo.name === target.name) continue;
204
+ const deps = readPackageDeps(repo.path);
205
+ if (Object.prototype.hasOwnProperty.call(deps, target.packageName)
206
+ || Object.prototype.hasOwnProperty.call(deps, target.name)) {
207
+ impacted.push({
208
+ name: repo.name,
209
+ packageName: repo.packageName,
210
+ path: repo.path,
211
+ dependsOn: target.packageName,
212
+ currentRange: deps[target.packageName] || deps[target.name]
213
+ });
214
+ }
215
+ }
216
+
217
+ return {
218
+ mode: opts.apply ? 'apply-plan' : 'dry-run',
219
+ status: 'ready',
220
+ repo: target.name,
221
+ packageName: target.packageName,
222
+ version,
223
+ impacted,
224
+ blockers: [],
225
+ writes: [
226
+ { path: path.join(target.path, 'package.json'), action: 'bump-version' },
227
+ ...impacted.map((repo) => ({ path: path.join(repo.path, 'package.json'), action: 'update-dependency-range' })),
228
+ { path: path.join(hubPath, '.godpowers', 'suite-config.yaml'), action: 'update-version-table' },
229
+ { path: suiteSyncLogPath(hubPath), action: 'append-release-plan' }
230
+ ]
231
+ };
232
+ }
233
+
146
234
  /**
147
235
  * Write a human-readable STATE.md from the aggregate.
148
236
  */
@@ -216,5 +304,6 @@ module.exports = {
216
304
  writeSuiteState,
217
305
  refreshFromRepos,
218
306
  appendSyncLog,
219
- format
307
+ format,
308
+ planRelease
220
309
  };
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "godpowers",
3
- "version": "1.6.20",
4
- "description": "AI-powered development system: 109 slash commands and 40 specialist agents that take a project from raw idea to hardened production. Runs inside Claude Code, Codex, Cursor, Windsurf, Gemini, and 10+ other AI coding tools.",
3
+ "version": "1.6.22",
4
+ "description": "AI-powered development system: 110 slash commands and 40 specialist agents that take a project from raw idea to hardened production. Runs inside Claude Code, Codex, Cursor, Windsurf, Gemini, and 10+ other AI coding tools.",
5
5
  "bin": {
6
6
  "godpowers": "./bin/install.js"
7
7
  },
8
8
  "scripts": {
9
- "test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-planning-systems.js && node scripts/test-feature-awareness.js && node scripts/test-repo-doc-sync.js && node scripts/test-repo-surface-sync.js && node scripts/test-automation-surface-sync.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-dashboard.js && node scripts/test-automation-providers.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
9
+ "test": "node scripts/validate-skills.js && node scripts/test-doc-surface-counts.js && bash scripts/smoke.sh && node scripts/test-runtime.js && node scripts/test-router.js && node scripts/test-recipes.js && node scripts/test-context-writer.js && node scripts/test-pillars.js && node scripts/test-artifact-linter.js && node scripts/test-artifact-diff.js && node scripts/test-design-foundation.js && node scripts/test-linkage.js && node scripts/test-impact.js && node scripts/test-reverse-sync.js && node scripts/test-planning-systems.js && node scripts/test-feature-awareness.js && node scripts/test-repo-doc-sync.js && node scripts/test-repo-surface-sync.js && node scripts/test-automation-surface-sync.js && node scripts/test-host-capabilities.js && node scripts/test-extension-authoring.js && node scripts/test-dogfood-runner.js && node scripts/test-integration.js && node scripts/test-cross-artifact.js && node scripts/test-awesome-design.js && node scripts/test-skillui-bridge.js && node scripts/test-runtime-verification.js && node scripts/test-agent-browser.js && node scripts/test-mode-d.js && node scripts/test-runtime-heuristics.js && node scripts/test-agent-validator.js && node scripts/test-story-validator.js && node scripts/test-state.js && node scripts/test-dashboard.js && node scripts/test-automation-providers.js && node scripts/test-intent.js && node scripts/test-events.js && node scripts/test-golden-artifacts.js && node scripts/test-install-smoke.js && node scripts/test-checkpoint.js && node scripts/test-extensions.js && node scripts/test-event-reader.js && node scripts/test-state-lock.js && node scripts/test-cost-saver.js && node scripts/test-budget-onoff.js && node scripts/test-workflow-runner.js && npm run test:e2e && node scripts/test-otel-exporter.js && node scripts/test-extensions-publish.js",
10
10
  "prepublishOnly": "npm test",
11
11
  "validate-skills": "node scripts/validate-skills.js",
12
12
  "test:surface": "node scripts/test-doc-surface-counts.js",
@@ -74,6 +74,7 @@
74
74
  "workflows/",
75
75
  "schema/",
76
76
  "lib/",
77
+ "fixtures/",
77
78
  "extensions/",
78
79
  "INSPIRATION.md",
79
80
  "RELEASE.md",
@@ -0,0 +1,35 @@
1
+ apiVersion: godpowers/v1
2
+ kind: CommandRouting
3
+ metadata:
4
+ command: /god-dogfood
5
+ description: Run messy-repo dogfood scenarios for release and autonomy readiness.
6
+ tier: 0
7
+
8
+ prerequisites:
9
+ required: []
10
+
11
+ execution:
12
+ spawns:
13
+ - built-in
14
+ secondary-spawns:
15
+ - god-greenfieldifier
16
+ - god-context-writer
17
+ - god-coordinator
18
+ context: current
19
+ writes: []
20
+
21
+ success-path:
22
+ next-recommended: /god-status
23
+
24
+ failure-path:
25
+ on-error: /god-repair
26
+ auto-spawn:
27
+ - god-greenfieldifier
28
+ - god-context-writer
29
+ - god-coordinator
30
+
31
+ endoff:
32
+ state-update: none
33
+ events:
34
+ - agent.start
35
+ - agent.end
@@ -35,5 +35,5 @@ failure-path:
35
35
 
36
36
  endoff:
37
37
  state-update: tier-0.orchestration.status = done
38
- events: [orchestrator.spawn, artifact.created, agent.end]
38
+ events: [orchestrator.spawn, agent.start, artifact.created, agent.end]
39
39
  lifecycle-transition: pre-init -> in-arc
@@ -34,4 +34,4 @@ failure-path:
34
34
 
35
35
  endoff:
36
36
  state-update: tier-1.roadmap.updated timestamp
37
- events: [artifact.updated, have-nots.check, agent.end]
37
+ events: [agent.start, artifact.updated, have-nots.check, agent.end]
@@ -30,4 +30,4 @@ failure-path:
30
30
 
31
31
  endoff:
32
32
  state-update: tier statuses updated based on what was synced
33
- events: [artifact.updated, have-nots.check, agent.end]
33
+ events: [agent.start, artifact.updated, have-nots.check, agent.end]
@@ -48,7 +48,7 @@ Plain-text report grouped by severity:
48
48
  GODPOWERS DOCTOR
49
49
 
50
50
  Install: claude (~/.claude/)
51
- [OK] 109 skills installed
51
+ [OK] 110 skills installed
52
52
  [OK] 40 agents installed
53
53
  [OK] VERSION matches (1.6.6)
54
54
  [WARN] routing/god-doctor.yaml exists but skill file did not until now
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: god-dogfood
3
+ description: |
4
+ Run built-in messy-repo dogfood scenarios against Godpowers automation,
5
+ migration, host capability, extension authoring, and suite release surfaces.
6
+
7
+ Triggers on: "god dogfood", "/god-dogfood", "dogfood godpowers",
8
+ "test messy repos", "real-project dogfooding"
9
+ ---
10
+
11
+ # /god-dogfood
12
+
13
+ Run deterministic messy-repo scenarios before release or after automation changes.
14
+
15
+ ## When To Use
16
+
17
+ - [DECISION] Use `/god-dogfood` before a release when migration, host autonomy,
18
+ extension authoring, or Mode D suite release behavior changes.
19
+ - [DECISION] Use `/god-dogfood` when a project already contains GSD, BMAD, or
20
+ Superpowers context and you need confidence that Godpowers can import and
21
+ sync back without deleting prior-system files.
22
+ - [DECISION] Use `/god-dogfood` when host-spawn guarantees are unclear and the
23
+ dashboard reports degraded or unknown host capability.
24
+
25
+ ## Process
26
+
27
+ 1. Resolve the runtime root and load `lib/dogfood-runner.js`.
28
+ 2. Run `dogfood.runAll()` against `fixtures/dogfood/`.
29
+ 3. Report each scenario with pass or fail status.
30
+ 4. If any scenario fails, auto-invoke the matching specialist by visible card:
31
+ - `god-greenfieldifier` for planning-system import failures.
32
+ - `god-context-writer` for host capability or install surface failures.
33
+ - `god-coordinator` for extension authoring or suite release failures.
34
+ 5. Do not edit user projects while running fixture scenarios.
35
+ 6. End with the Godpowers Dashboard and make `/god-repair` the recommended
36
+ route when dogfood is red.
37
+
38
+ ## CLI Equivalent
39
+
40
+ ```bash
41
+ npx godpowers dogfood
42
+ npx godpowers dogfood --json
43
+ ```
44
+
45
+ ## Expected Coverage
46
+
47
+ - [DECISION] The dogfood suite includes a half-migrated GSD project.
48
+ - [DECISION] The dogfood suite includes degraded and full host capability
49
+ scenarios.
50
+ - [DECISION] The dogfood suite includes extension scaffold validation.
51
+ - [DECISION] The dogfood suite includes a Mode D suite release dry-run.
52
+
53
+ ## Auto-Invoke Card
54
+
55
+ ```text
56
+ Auto-invoked:
57
+ Trigger: /god-dogfood scenario failure
58
+ Agent: <god-greenfieldifier | god-context-writer | god-coordinator | none, local runtime only>
59
+ Local syncs:
60
+ + dogfood-runner: <pass, fail, or skipped reason>
61
+ Artifacts: fixture-only unless repair is explicitly requested
62
+ Log: none
63
+ ```
@@ -16,7 +16,7 @@ Print version and a short capability summary.
16
16
  ```
17
17
  Godpowers v1.6.19
18
18
  Install: /Users/.../.claude/ (matches package.json)
19
- Surface: 109 skills, 40 agents, 13 workflows, 40 recipes
19
+ Surface: 110 skills, 40 agents, 13 workflows, 40 recipes
20
20
  Schema: intent.v1, state.v1, events.v1, workflow.v1, routing.v1, recipe.v1
21
21
  External integrations available: impeccable, agent-browser (others lazy)
22
22
  Feature awareness: planning-system migration, source-system sync-back, context refresh, dashboard status labels, repo documentation sync, repo surface sync