godpowers 1.6.20 → 1.6.21

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/CHANGELOG.md CHANGED
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.6.21] - 2026-05-16
11
+
12
+ Dashboard compression, trace guardrails, and suite release readiness.
13
+
14
+ ### Added
15
+ - Added dashboard action briefs so `/god-status`, `/god-next`, and CLI status
16
+ output show the recommended command, reason, readiness, and top blockers
17
+ before the detailed check list.
18
+ - Added release-surface checks that verify dogfood, extension publish, Mode D
19
+ suite, and installer smoke tests remain wired into the release gate.
20
+ - Added repo-surface suite readiness checks for Mode D helper, docs, tests,
21
+ and suite command route coverage.
22
+
23
+ ### Changed
24
+ - Route-quality sync now requires every agent-spawning route to declare both
25
+ `agent.start` and `agent.end` trace events.
26
+ - `/god-init`, `/god-roadmap-update`, and `/god-sync` route metadata now
27
+ declare the missing `agent.start` trace event.
28
+
29
+ ### Guardrails
30
+ - Spawn observability, release dogfooding, extension readiness, suite
31
+ readiness, and onboarding compression are now checked by executable tests
32
+ instead of remaining documentation-only goals.
33
+
10
34
  ## [1.6.20] - 2026-05-16
11
35
 
12
36
  Automation surface closeout and release guardrails.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/aihxp/godpowers/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-1.6.20-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-1.6.21-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/godpowers.svg)](https://www.npmjs.com/package/godpowers)
7
7
 
8
8
  **Ship fast. Ship right. Ship everything. Ship accountably.**
@@ -12,11 +12,14 @@ idea to hardened production. It runs as **slash commands inside your AI coding
12
12
  tool** (Claude Code, Codex, Cursor, etc.) that orchestrate **specialist agents**
13
13
  in fresh contexts to do the work.
14
14
 
15
- Version 1.6.20 closes the automation surface gaps around route quality, recipe
16
- coverage, and release readiness. Godpowers now checks symbolic route spawns,
17
- unresolved agent targets, standards coverage for durable-writing routes, missing
18
- high-frequency recipes, package payload guards, and release-facing version drift
19
- before closeout.
15
+ Version 1.6.21 sharpens the daily operating loop. Godpowers now shows a compact
16
+ action brief in dashboard output, enforces trace events for every
17
+ agent-spawning route, and keeps dogfood, extension publish, Mode D suite, and
18
+ installer smoke gates wired into release readiness.
19
+
20
+ The dashboard now starts with an action brief: the next command, why it is
21
+ recommended, whether the project is ready, and the first blockers that need
22
+ attention. Detailed proactive checks remain below the brief for auditability.
20
23
 
21
24
  It fuses four disciplines into one unified workflow:
22
25
 
@@ -107,8 +110,8 @@ You can also ask any time:
107
110
  ```
108
111
 
109
112
  This reads `.godpowers/PROGRESS.md`, scans disk, reconciles any drift, and
110
- suggests the next logical command. The SessionStart hook does the same thing
111
- when you open a new session in a Godpowers project.
113
+ suggests the next logical command with a compact action brief. The SessionStart
114
+ hook does the same thing when you open a new session in a Godpowers project.
112
115
 
113
116
  The same status engine is available from the installer CLI for humans, CI,
114
117
  Codex, Claude, Cursor, Gemini, OpenCode, Windsurf, Antigravity, and any host
package/RELEASE.md CHANGED
@@ -1,12 +1,11 @@
1
- # Godpowers 1.6.20 Release
1
+ # Godpowers 1.6.21 Release
2
2
 
3
3
  Date: 2026-05-16
4
4
 
5
- Godpowers 1.6.20 closes the automation gaps found after repository surface
6
- sync. It adds dedicated route-quality, recipe-coverage, and release-surface
7
- checks so Godpowers detects disconnected route spawns, missing intent recipes,
8
- and stale release-facing documentation before declaring a project or release
9
- current.
5
+ Godpowers 1.6.21 sharpens the daily operating loop after the automation
6
+ surface closeout. It adds dashboard action briefs, requires agent-spawning
7
+ routes to declare trace events, and expands release readiness checks across
8
+ dogfood, extension publish, Mode D suite, and installer smoke gates.
10
9
 
11
10
  ## What is stable
12
11
 
@@ -28,21 +27,22 @@ current.
28
27
  - Repository documentation sync checks
29
28
  - Repository surface sync checks
30
29
  - Route quality, recipe coverage, and release surface sync checks
30
+ - Dashboard action briefs for next-step compression
31
+ - Agent-spawn trace event guardrails
32
+ - Mode D suite readiness checks
31
33
 
32
34
  ## What is new
33
35
 
34
- - Added `lib/route-quality-sync.js`.
35
- - Added `lib/recipe-coverage-sync.js`.
36
- - Added `lib/release-surface-sync.js`.
37
- - Added `scripts/test-automation-surface-sync.js`.
38
- - Added release maintenance, context refresh, story work, and automation setup
39
- recipes.
40
- - `/god-party` now declares concrete parallel specialist personas.
41
- - `/god-story-build` now declares planner, executor, and reviewer handoffs
42
- without symbolic spawn tokens.
43
- - Feature awareness now records route quality, recipe coverage, and release
44
- surface sync as known runtime features.
45
- - Package contents checks now require all three new sync helpers.
36
+ - Added `Action brief` output to `lib/dashboard.js` and CLI status rendering.
37
+ - Added route-quality enforcement for `agent.start` and `agent.end` trace
38
+ event declarations on agent-spawning routes.
39
+ - Added repo-surface Mode D suite readiness checks for suite helper presence,
40
+ suite command skill and routing coverage, roadmap documentation, and release
41
+ test wiring.
42
+ - Added release-surface checks for dogfood, extension publish, Mode D suite,
43
+ and installer smoke tests.
44
+ - Updated `/god-init`, `/god-roadmap-update`, and `/god-sync` route metadata
45
+ to declare `agent.start`.
46
46
 
47
47
  ## Automation surface behavior
48
48
 
@@ -50,12 +50,15 @@ For a Godpowers repository, the helper checks:
50
50
 
51
51
  - every routed specialist spawn resolves to a real agent or built-in runtime
52
52
  owner
53
+ - every agent-spawning route declares `agent.start` and `agent.end`
53
54
  - every durable-writing route declares standards coverage or an approved
54
55
  exemption
55
56
  - high-frequency work has discoverable intent recipes
56
57
  - release-facing version surfaces agree with `package.json`
57
58
  - package content checks require load-bearing runtime helper files
58
59
  - release checklist policy names the current sync guards
60
+ - release gates include dogfood, extension publish, Mode D suite, and installer
61
+ smoke checks
59
62
 
60
63
  Detection is read-only by default. Applying sync writes logs and leaves
61
64
  judgment-heavy rewrites to scoped specialists.
@@ -84,6 +87,9 @@ Release validation includes:
84
87
  - `node scripts/test-repo-doc-sync.js`
85
88
  - `node scripts/test-feature-awareness.js`
86
89
  - `node scripts/test-dashboard.js`
90
+ - `node scripts/test-mode-d.js`
91
+ - `node scripts/test-extensions-publish.js`
92
+ - `node scripts/test-install-smoke.js`
87
93
  - `node scripts/test-context-writer.js`
88
94
  - `node scripts/test-planning-systems.js`
89
95
  - `node scripts/test-doc-surface-counts.js`
@@ -91,5 +97,5 @@ Release validation includes:
91
97
  - `git diff --check`
92
98
  - `npm run release:check`
93
99
 
94
- The `v1.6.20` tag should point to the release commit that matches the npm
95
- `godpowers@1.6.20` package.
100
+ The `v1.6.21` tag should point to the release commit that matches the npm
101
+ `godpowers@1.6.21` package.
package/lib/dashboard.js CHANGED
@@ -217,7 +217,7 @@ function compute(projectRoot, opts = {}) {
217
217
 
218
218
  if (!s) {
219
219
  const next = { command: '/god-init', reason: 'No Godpowers project initialized' };
220
- return {
220
+ const result = {
221
221
  source: 'runtime dashboard (lib/dashboard.js)',
222
222
  state: 'not initialized',
223
223
  mode: null,
@@ -237,6 +237,8 @@ function compute(projectRoot, opts = {}) {
237
237
  next,
238
238
  openItems: ['No .godpowers/state.json found']
239
239
  };
240
+ result.actionBrief = actionBrief(result);
241
+ return result;
240
242
  }
241
243
 
242
244
  const progress = state.progressSummary(s);
@@ -250,7 +252,7 @@ function compute(projectRoot, opts = {}) {
250
252
  if (reviewCount(projectRoot) > 0) openItems.push('pending review items');
251
253
  if (openItems.length === 0) openItems.push('none');
252
254
 
253
- return {
255
+ const result = {
254
256
  source: 'runtime dashboard (lib/dashboard.js)',
255
257
  state: progress.remaining === 0 ? 'complete' : 'in progress',
256
258
  mode: s.mode || s['mode-announced-as'] || null,
@@ -264,6 +266,37 @@ function compute(projectRoot, opts = {}) {
264
266
  next,
265
267
  openItems
266
268
  };
269
+ result.actionBrief = actionBrief(result);
270
+ return result;
271
+ }
272
+
273
+ function actionBrief(dashboard) {
274
+ const proactive = dashboard.proactive || {};
275
+ const next = dashboard.next || {};
276
+ const blockers = [];
277
+ for (const [label, value] of [
278
+ ['Repo surface', proactive.repoSurface],
279
+ ['Docs', proactive.docs],
280
+ ['Reviews', proactive.reviews],
281
+ ['Sync', proactive.sync],
282
+ ['Security', proactive.security],
283
+ ['Dependencies', proactive.dependencies],
284
+ ['Hygiene', proactive.hygiene]
285
+ ]) {
286
+ if (!value) continue;
287
+ if (value === 'fresh' || value === 'none' || value === 'clear' || value === 'not-applicable') continue;
288
+ if (/^available via /.test(value)) continue;
289
+ blockers.push(`${label}: ${value}`);
290
+ }
291
+
292
+ const recommended = next.command || 'describe the next intent';
293
+ return {
294
+ recommended,
295
+ reason: next.reason || 'No route was computed.',
296
+ confidence: blockers.length === 0 ? 'ready' : 'needs attention',
297
+ blockers: blockers.slice(0, 3),
298
+ overflow: Math.max(0, blockers.length - 3)
299
+ };
267
300
  }
268
301
 
269
302
  function render(dashboard) {
@@ -277,6 +310,7 @@ function render(dashboard) {
277
310
  const openItems = dashboard.openItems && dashboard.openItems.length > 0
278
311
  ? dashboard.openItems
279
312
  : ['none'];
313
+ const brief = dashboard.actionBrief || actionBrief(dashboard);
280
314
 
281
315
  return [
282
316
  'Godpowers Dashboard',
@@ -291,6 +325,12 @@ function render(dashboard) {
291
325
  ` Worktree: ${dashboard.worktree}`,
292
326
  ` Index: ${dashboard.index}`,
293
327
  '',
328
+ 'Action brief:',
329
+ ` Next: ${brief.recommended}`,
330
+ ` Why: ${brief.reason}`,
331
+ ` Readiness: ${brief.confidence}`,
332
+ ` Attention: ${brief.blockers && brief.blockers.length > 0 ? brief.blockers.join('; ') : 'none'}${brief.overflow ? `; ${brief.overflow} more` : ''}`,
333
+ '',
294
334
  'Planning visibility:',
295
335
  ` PRD: ${prd.status || 'missing'}${prd.path ? ` ${prd.path}` : ''}`,
296
336
  ` Roadmap: ${roadmap.status || 'missing'}${roadmap.path ? ` ${roadmap.path}` : ''}`,
@@ -325,5 +365,6 @@ module.exports = {
325
365
  parseGitStatus,
326
366
  proactiveChecks,
327
367
  automationSummary,
368
+ actionBrief,
328
369
  planningVisibility
329
370
  };
@@ -17,6 +17,14 @@ const REQUIRED_PACKAGE_GUARDS = [
17
17
  'lib/release-surface-sync.js'
18
18
  ];
19
19
 
20
+ const REQUIRED_RELEASE_TESTS = [
21
+ 'scripts/test-automation-surface-sync.js',
22
+ 'scripts/test-repo-surface-sync.js',
23
+ 'scripts/test-extensions-publish.js',
24
+ 'scripts/test-mode-d.js',
25
+ 'scripts/test-install-smoke.js'
26
+ ];
27
+
20
28
  function read(projectRoot, relPath) {
21
29
  const file = path.join(projectRoot, relPath);
22
30
  if (!fs.existsSync(file)) return '';
@@ -100,6 +108,21 @@ function detect(projectRoot) {
100
108
  );
101
109
  }
102
110
 
111
+ const scriptsText = JSON.stringify(pkg.scripts || {});
112
+ for (const required of REQUIRED_RELEASE_TESTS) {
113
+ const ok = scriptsText.includes(required);
114
+ addCheck(
115
+ checks,
116
+ `release-test-${required.replace(/[^a-z0-9]+/gi, '-')}`,
117
+ ok ? 'fresh' : 'stale',
118
+ 'package.json',
119
+ ok
120
+ ? `Release gate includes ${required}.`
121
+ : `Release gate does not include ${required}.`,
122
+ { spawn: ok ? null : 'god-auditor' }
123
+ );
124
+ }
125
+
103
126
  const stale = checks.filter((check) => check.status !== 'fresh');
104
127
  return {
105
128
  status: stale.length === 0 ? 'fresh' : 'stale',
@@ -147,6 +170,7 @@ function summary(report) {
147
170
  module.exports = {
148
171
  LOG_PATH,
149
172
  REQUIRED_PACKAGE_GUARDS,
173
+ REQUIRED_RELEASE_TESTS,
150
174
  detect,
151
175
  run,
152
176
  summary
@@ -357,6 +357,75 @@ function extensionChecks(projectRoot) {
357
357
  return checks;
358
358
  }
359
359
 
360
+ function suiteChecks(projectRoot) {
361
+ const checks = [];
362
+ const pkg = readJson(projectRoot, 'package.json') || {};
363
+ const scriptsText = JSON.stringify(pkg.scripts || {});
364
+ const roadmap = read(projectRoot, 'docs/ROADMAP.md');
365
+ const suiteCommands = [
366
+ 'god-suite-init',
367
+ 'god-suite-status',
368
+ 'god-suite-sync',
369
+ 'god-suite-patch',
370
+ 'god-suite-release'
371
+ ];
372
+
373
+ addCheck(
374
+ checks,
375
+ 'suite',
376
+ 'suite-runtime-helper',
377
+ exists(projectRoot, 'lib/suite-state.js') ? 'fresh' : 'stale',
378
+ 'lib/suite-state.js',
379
+ exists(projectRoot, 'lib/suite-state.js')
380
+ ? 'Mode D suite state helper exists.'
381
+ : 'Mode D suite state helper is missing.',
382
+ { spawn: exists(projectRoot, 'lib/suite-state.js') ? null : 'god-coordinator' }
383
+ );
384
+
385
+ addCheck(
386
+ checks,
387
+ 'suite',
388
+ 'suite-test-gate',
389
+ scriptsText.includes('scripts/test-mode-d.js') ? 'fresh' : 'stale',
390
+ 'package.json',
391
+ scriptsText.includes('scripts/test-mode-d.js')
392
+ ? 'Release gate includes Mode D suite tests.'
393
+ : 'Release gate does not include Mode D suite tests.',
394
+ { spawn: scriptsText.includes('scripts/test-mode-d.js') ? null : 'god-coordinator' }
395
+ );
396
+
397
+ addCheck(
398
+ checks,
399
+ 'suite',
400
+ 'suite-docs',
401
+ roadmap.includes('Mode D') ? 'fresh' : 'stale',
402
+ 'docs/ROADMAP.md',
403
+ roadmap.includes('Mode D')
404
+ ? 'Roadmap documents Mode D suite support.'
405
+ : 'Roadmap does not document Mode D suite support.',
406
+ { spawn: roadmap.includes('Mode D') ? null : 'god-coordinator' }
407
+ );
408
+
409
+ for (const command of suiteCommands) {
410
+ const skill = `skills/${command}.md`;
411
+ const route = `routing/${command}.yaml`;
412
+ const ok = exists(projectRoot, skill) && exists(projectRoot, route);
413
+ addCheck(
414
+ checks,
415
+ 'suite',
416
+ `suite-command-${command}`,
417
+ ok ? 'fresh' : 'stale',
418
+ skill,
419
+ ok
420
+ ? `/${command} has skill and routing metadata.`
421
+ : `/${command} is missing a skill or route.`,
422
+ { spawn: ok ? null : 'god-coordinator' }
423
+ );
424
+ }
425
+
426
+ return checks;
427
+ }
428
+
360
429
  function releasePolicyChecks(projectRoot) {
361
430
  const checks = [];
362
431
  const docs = repoDocSync.detect(projectRoot);
@@ -393,6 +462,7 @@ function detect(projectRoot) {
393
462
  ...agentChecks(projectRoot),
394
463
  ...workflowRecipeChecks(projectRoot),
395
464
  ...extensionChecks(projectRoot),
465
+ ...suiteChecks(projectRoot),
396
466
  ...releasePolicyChecks(projectRoot),
397
467
  ...routeQualitySync.detect(projectRoot).checks,
398
468
  ...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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "godpowers",
3
- "version": "1.6.20",
3
+ "version": "1.6.21",
4
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.",
5
5
  "bin": {
6
6
  "godpowers": "./bin/install.js"
@@ -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]