@jaimevalasek/aioson 1.30.2 → 1.33.1

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 (49) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +19 -6
  3. package/docs/en/5-reference/cli-reference.md +1 -1
  4. package/docs/pt/5-referencia/comandos-cli.md +1 -1
  5. package/docs/pt/5-referencia/harness-retro.md +2 -1
  6. package/package.json +1 -1
  7. package/src/cli.js +38 -21
  8. package/src/commands/classify.js +389 -327
  9. package/src/commands/harness-retro-promote.js +387 -0
  10. package/src/commands/prototype-check.js +163 -0
  11. package/src/commands/verify-implementation.js +428 -0
  12. package/src/commands/workflow-next.js +222 -9
  13. package/src/constants.js +2 -0
  14. package/src/lib/retro/retro-render.js +10 -1
  15. package/src/lib/retro/retro-sources.js +45 -27
  16. package/src/lib/retro/verification-reports.js +230 -0
  17. package/src/runtime-store.js +13 -9
  18. package/src/verification/evidence-bundle.js +251 -0
  19. package/src/verification/ledger-store.js +221 -0
  20. package/src/verification/path-policy.js +74 -0
  21. package/src/verification/policy-engine.js +95 -0
  22. package/src/verification/prompt-package.js +314 -0
  23. package/src/verification/redaction.js +77 -0
  24. package/src/verification/report-parser.js +132 -0
  25. package/src/verification/report-store.js +97 -0
  26. package/src/verification/result.js +16 -0
  27. package/src/verification/runners/index.js +319 -0
  28. package/src/verification/runtime-telemetry.js +144 -0
  29. package/src/verification/schema.js +276 -0
  30. package/src/verification/source-discovery.js +153 -0
  31. package/template/.aioson/agents/analyst.md +9 -6
  32. package/template/.aioson/agents/briefing-refiner.md +22 -0
  33. package/template/.aioson/agents/briefing.md +69 -12
  34. package/template/.aioson/agents/design-hybrid-forge.md +18 -14
  35. package/template/.aioson/agents/dev.md +23 -10
  36. package/template/.aioson/agents/deyvin.md +3 -2
  37. package/template/.aioson/agents/product.md +15 -11
  38. package/template/.aioson/agents/qa.md +13 -4
  39. package/template/.aioson/agents/scope-check.md +19 -5
  40. package/template/.aioson/agents/sheldon.md +4 -3
  41. package/template/.aioson/agents/ux-ui.md +3 -2
  42. package/template/.aioson/docs/feature-expansion-taxonomy.md +31 -3
  43. package/template/.aioson/docs/prototype-contract.md +81 -0
  44. package/template/.aioson/skills/process/briefing-expansion-scout/SKILL.md +25 -3
  45. package/template/.aioson/skills/process/design-hybrid-forge/SKILL.md +5 -3
  46. package/template/.aioson/skills/process/design-hybrid-forge/references/external-source-ingestion.md +89 -0
  47. package/template/.aioson/skills/process/product-scope-expansion/SKILL.md +29 -2
  48. package/template/.aioson/skills/process/prototype-forge/SKILL.md +92 -0
  49. package/template/.aioson/skills/process/sheldon-expansion-audit/SKILL.md +23 -2
package/CHANGELOG.md CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.33.1] - 2026-06-24
6
+
7
+ ### Fixed
8
+ - **Hardened adversarial verification gates.** `prototype:check` now rejects prototype and manifest references that resolve outside the project root before reading them, strict evidence bundles run prototype checks with `--strict`, partial prototype acceptance-criterion coverage can fail strict audits, Sheldon-owned scope findings route back to `@sheldon`, and failed external auditor stderr is kept in a separate artifact instead of being copied into the consolidated verification report.
9
+
10
+ ## [1.33.0] - 2026-06-24
11
+
12
+ ### Changed
13
+ - **Scope-aware solution fan-out in `@briefing`.** Horizontal exploration no longer forces 3–5 options when the user has already committed to one specific solution and its operational surface is complete; it records any weighed alternative as a short "Alternatives considered" note instead. Operational completeness is never waived — only the breadth of options when the direction is already fixed.
14
+ - **Non-blocking prototype recommendation in `@briefing-refiner`.** For a rich-surface briefing with no prototype yet, the handoff now recommends running prototype mode before `@product` (it surfaces missing management screens and broken interactions early). Recommendation only — it never blocks the route to `@product`.
15
+
16
+ ## [1.32.0] - 2026-06-24
17
+
18
+ ### Added
19
+ - **External DESIGN.md sources in `@design-hybrid-forge`.** A hybrid's primary parent or modifier can now be an external DESIGN.md source (a refero.design md-example or a similar portable design spec extracted from a real site), not only a local AIOSON design skill. The agent normalizes the source into the same parent DNA the crossover protocol expects, records `sources[]` provenance in `.skill-meta.json`, and enforces an anti-clone rule — the hybrid stays a new identity (no brand/logo/trademark or 1:1 palette reproduction, never named after the source). The "exactly 2 primary parents" model is unchanged.
20
+
21
+ ## [1.31.0] - 2026-06-24
22
+
23
+ ### Added
24
+ - **Clickable prototype stage.** New `prototype-forge` process skill and an optional `@briefing-refiner` "Generate prototype" mode produce a self-contained, clickable HTML app-shell (`prototype.html` + manifest) that materializes a rich-surface feature's screens, navigation, and CRUD interactions before the PRD — delegating visuals to the selected design skill while owning structure, behavior, and state. No native dialogs; authenticated app chrome is seeded.
25
+ - **Horizontal solution exploration in `@briefing`.** For goals with more than one viable shape, `@briefing` explores 3–5 solution shapes, maps each one's operational surface, and writes an optional `solution-options.md` so `@product` chooses with the trade-offs in hand.
26
+ - **Prototype propagated as a contract.** New `prototype-contract.md` defines how the prototype flows through the chain: `@product` writes a `## Prototype reference` in the PRD, `@dev` reproduces its screens/interactions, `@ux-ui` treats it as the authoritative realization, and `@analyst` derives acceptance criteria so `@validator` honors it via the binary contract (respecting its context sandbox).
27
+ - **Operational-surface classification floor.** `aioson classify` now floors rich operational surfaces (workspaces, boards/cards, Kanban/CRM pipelines, CRUD/admin management) to at least SMALL, so a Trello-like feature can't take the MICRO shortcut that skips `@analyst`/`@architect`/the prototype.
28
+
29
+ ### Changed
30
+ - **Operational Surface Map across planning agents.** `feature-expansion-taxonomy.md` and the briefing/product/sheldon expansion skills now require every Core object to have create/list/edit/archive/restore behavior and a management surface, so rich-surface features (Trello/Kanban/CRM/workspace-like) can't pass with bare nouns.
31
+
5
32
  ## [1.30.2] - 2026-06-24
6
33
 
7
34
  ### Changed
package/README.md CHANGED
@@ -716,7 +716,7 @@ aioson scan:project [path] [--folder=src] [--with-llm] [--provider=<name>] [--dr
716
716
  aioson agents
717
717
  aioson agent:prompt <agent> [--tool=codex|claude|gemini|opencode]
718
718
  aioson workflow:plan [path] [--classification=MICRO|SMALL|MEDIUM] [--json]
719
- aioson workflow:next [path] [--complete] [--auto-heal] [--force]
719
+ aioson workflow:next [path] [--complete] [--auto-heal] [--force] [--scope-mode=post-dev|post-fix|final] [--verification-policy=advisory|standard|strict]
720
720
  aioson workflow:heal [path] --stage=<agent>
721
721
  aioson workflow:harden [path] [--dry-run]
722
722
  aioson workflow:execute [path] [--dry-run] [--start-from=<agent>]
@@ -729,8 +729,13 @@ aioson intake:ask [path] --agent=<agent> --schema=<questions.json> [--out=<answe
729
729
  <summary><strong>SDD automation & gates</strong></summary>
730
730
 
731
731
  ```bash
732
- aioson preflight [path] [--json]
732
+ aioson preflight [path] [--json]
733
733
  aioson classify [path] [--json]
734
+ aioson prototype:check [path] --feature=<slug> [--json]
735
+ aioson verify:implementation [path] --feature=<slug> --prepare-ledger|--check-ledger|--build-prompt|--check-report=<path> [--policy=advisory|standard|strict] [--json]
736
+ aioson verify:implementation [path] --feature=<slug> --tool=codex|claude|opencode [--model=<model>|configured-default] [--timeout-ms=<ms>] [--max-output-bytes=<bytes>] [--policy=advisory|standard|strict] [--json]
737
+ aioson harness:retro [path] --feature=<slug>|--last=<N> [--json]
738
+ aioson harness:retro-promote [path] --feature=<slug> [--to=learnings|rules] [--apply --select=<candidate-key|all>] [--json]
734
739
  aioson gate:check [path] --gate=A|B|C|D [--json]
735
740
  aioson artifact:validate [path] --feature=<slug> [--json]
736
741
  aioson ac:test-audit [path] --feature=<slug> [--json]
@@ -738,10 +743,18 @@ aioson sdd:benchmark [path] --feature=<slug> [--json]
738
743
  aioson detect:test-runner [path] [--json]
739
744
  aioson agent:audit [path] [--json]
740
745
  aioson brief:gen [path] --feature=<slug> [--json]
741
- aioson verify:gate [path] --feature=<slug> [--json]
742
- ```
743
-
744
- </details>
746
+ aioson verify:gate [path] --feature=<slug> [--json]
747
+ ```
748
+
749
+ `verify:implementation` prepares/checks `.aioson/context/features/{slug}/implementation-ledger.md`, builds clean-auditor prompt packages, validates `Machine Report` JSON with reusable schema helpers in `src/verification/schema.js`, and can optionally run a constrained auditor through `codex`, `claude`, or `opencode`. Runner execution is opt-in, uses explicit timeout/output limits, writes raw output under `verification-runs/`, and promotes only a valid or system-generated `INCONCLUSIVE` report to `verification-report.md`.
750
+
751
+ `workflow:next --agent=scope-check --scope-mode=post-dev --verification-policy=strict` consumes an existing local `verification-report.md` as structured evidence in the scope-check prompt. It validates and routes the report result, but never runs an external `--tool` auditor automatically.
752
+
753
+ `harness:retro` mines schema-valid implementation verification reports as a retrospective source. It uses only non-confirming `Machine Report` findings (`DOES_NOT_CONFIRM`, `PARTIAL`, `NOT_VERIFIED`) and never includes raw auditor output, stderr, prompt packages, or finding evidence text in the generated dossier.
754
+
755
+ `harness:retro-promote` is the human-approved promotion path from a generated retro dossier to `.aioson/learnings/` or `.aioson/rules/`. It is dry-run by default; writing requires `--apply --select=<candidate-key|all>`. Promotion records bounded metadata and source paths only, and never edits prompts, skills, PRDs, plans, raw reports, or agent files automatically.
756
+
757
+ </details>
745
758
 
746
759
  <details>
747
760
  <summary><strong>Parallel orchestration</strong></summary>
@@ -820,7 +820,7 @@ aioson harness:retro . --feature=checkout --json
820
820
 
821
821
  **Exit codes:** 0 = success (including empty dossier); 1 = unexpected I/O error; 12 = input error (invalid slug, conflicting flags, feature not found).
822
822
 
823
- **Sources mined:** QA reports, correction plans, dossier FAIL→PASS cycles, execution events, attempt artifacts, failure signatures, devlogs.
823
+ **Sources mined:** QA reports, implementation verification reports (non-confirming `Machine Report` findings only), correction plans, dossier FAIL→PASS cycles, execution events, attempt artifacts, failure signatures, devlogs. Raw auditor output, stderr, prompt packages, and finding evidence text are not mined.
824
824
 
825
825
  ---
826
826
 
@@ -1877,7 +1877,7 @@ aioson harness:retro . --last=5
1877
1877
  aioson harness:retro . --feature=checkout --json
1878
1878
  ```
1879
1879
 
1880
- Saída em `.aioson/context/retro/checkout.md`. Fontes mineradas: QA reports, planos de correção, trilha FAIL→PASS do dossier, eventos de execução, tentativas, assinaturas de falha e devlogs. Operação de leitura — arquivos-fonte nunca são alterados.
1880
+ Saída em `.aioson/context/retro/checkout.md`. Fontes mineradas: QA reports, reports de verificação de implementação (apenas findings não confirmatórios do `Machine Report`), planos de correção, trilha FAIL→PASS do dossier, eventos de execução, tentativas, assinaturas de falha e devlogs. Raw auditor output, stderr, prompts e texto de evidence não são minerados. Operação de leitura — arquivos-fonte nunca são alterados.
1881
1881
 
1882
1882
  ```bash
1883
1883
  # Exibir prévia de um artefato com truncação segura
@@ -55,11 +55,12 @@ Usado principalmente na interface de feedback do `self:loop` quando um critério
55
55
 
56
56
  ## Fontes mineradas
57
57
 
58
- O `harness:retro` lê sete fontes por feature:
58
+ O `harness:retro` lê oito fontes por feature:
59
59
 
60
60
  | Fonte | O que captura |
61
61
  |---|---|
62
62
  | Relatórios QA | Falhas e severidades de `@qa` |
63
+ | Reports de verificação de implementação | Findings não confirmatórios do `Machine Report` (`DOES_NOT_CONFIRM`, `PARTIAL`, `NOT_VERIFIED`); não minera raw output, stderr, prompts nem texto de evidence |
63
64
  | Planos de correção | Correções aplicadas por ciclo |
64
65
  | Trilha do dossier | Ciclos FAIL→PASS do Agent Trail |
65
66
  | `execution_events` | Eventos de telemetria do loop |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jaimevalasek/aioson",
3
- "version": "1.30.2",
3
+ "version": "1.33.1",
4
4
  "description": "AI operating framework for hyper-personalized software.",
5
5
  "keywords": [
6
6
  "ai",
package/src/cli.js CHANGED
@@ -183,9 +183,11 @@ const { runRunnerRun } = require('./commands/runner-run');
183
183
  const { runRunnerQueue } = require('./commands/runner-queue');
184
184
  const { runRunnerPlan } = require('./commands/runner-plan');
185
185
  const { runRunnerDaemon } = require('./commands/runner-daemon');
186
- const { runPreflight } = require('./commands/preflight');
187
- const { runClassify } = require('./commands/classify');
188
- const { runSizing } = require('./commands/sizing');
186
+ const { runPreflight } = require('./commands/preflight');
187
+ const { runClassify } = require('./commands/classify');
188
+ const { runPrototypeCheck } = require('./commands/prototype-check');
189
+ const { runVerifyImplementation } = require('./commands/verify-implementation');
190
+ const { runSizing } = require('./commands/sizing');
189
191
  const { runDetectTestRunner } = require('./commands/detect-test-runner');
190
192
  const { runPulseUpdate } = require('./commands/pulse-update');
191
193
  const { runAgentEpilogue } = require('./commands/agent-epilogue');
@@ -290,10 +292,12 @@ const JSON_SUPPORTED_COMMANDS = new Set([
290
292
  'workflow-status',
291
293
  'feature:current',
292
294
  'feature-current',
293
- 'harness:retro',
294
- 'harness-retro',
295
- 'harness:preview',
296
- 'harness-preview',
295
+ 'harness:retro',
296
+ 'harness-retro',
297
+ 'harness:retro-promote',
298
+ 'harness-retro-promote',
299
+ 'harness:preview',
300
+ 'harness-preview',
297
301
  'agent:next',
298
302
  'agent-next',
299
303
  'parallel:init',
@@ -433,10 +437,12 @@ const JSON_SUPPORTED_COMMANDS = new Set([
433
437
  'harness-status',
434
438
  'harness:check',
435
439
  'harness-check',
436
- 'harness:retro',
437
- 'harness-retro',
438
- 'harness:preview',
439
- 'harness-preview',
440
+ 'harness:retro',
441
+ 'harness-retro',
442
+ 'harness:retro-promote',
443
+ 'harness-retro-promote',
444
+ 'harness:preview',
445
+ 'harness-preview',
440
446
  'brief-gen',
441
447
  'verify:gate',
442
448
  'verify-gate',
@@ -649,8 +655,12 @@ const JSON_SUPPORTED_COMMANDS = new Set([
649
655
  '--version',
650
656
  '-v',
651
657
  'preflight',
652
- 'classify',
653
- 'sizing',
658
+ 'classify',
659
+ 'prototype:check',
660
+ 'prototype-check',
661
+ 'verify:implementation',
662
+ 'verify-implementation',
663
+ 'sizing',
654
664
  'detect:test-runner',
655
665
  'detect-test-runner',
656
666
  'pulse:update',
@@ -1346,12 +1356,15 @@ async function main() {
1346
1356
  } else if (command === 'harness:check' || command === 'harness-check') {
1347
1357
  const { runHarnessCheck } = require('./commands/harness-check');
1348
1358
  result = await runHarnessCheck({ args, options, logger: commandLogger, t });
1349
- } else if (command === 'harness:retro' || command === 'harness-retro') {
1350
- const { runHarnessRetro } = require('./commands/harness-retro');
1351
- result = await runHarnessRetro({ args, options, logger: commandLogger, t });
1352
- } else if (command === 'harness:preview' || command === 'harness-preview') {
1353
- const { runHarnessPreview } = require('./commands/harness-preview');
1354
- result = await runHarnessPreview({ args, options, logger: commandLogger, t });
1359
+ } else if (command === 'harness:retro' || command === 'harness-retro') {
1360
+ const { runHarnessRetro } = require('./commands/harness-retro');
1361
+ result = await runHarnessRetro({ args, options, logger: commandLogger, t });
1362
+ } else if (command === 'harness:retro-promote' || command === 'harness-retro-promote') {
1363
+ const { runHarnessRetroPromote } = require('./commands/harness-retro-promote');
1364
+ result = await runHarnessRetroPromote({ args, options, logger: commandLogger, t });
1365
+ } else if (command === 'harness:preview' || command === 'harness-preview') {
1366
+ const { runHarnessPreview } = require('./commands/harness-preview');
1367
+ result = await runHarnessPreview({ args, options, logger: commandLogger, t });
1355
1368
  } else if (command === 'verify:gate' || command === 'verify-gate') {
1356
1369
  result = await runVerifyGate({ args, options, logger: commandLogger, t });
1357
1370
 
@@ -1588,8 +1601,12 @@ async function main() {
1588
1601
  result = await runPreflight({ args, options, logger: commandLogger });
1589
1602
  } else if (command === 'classify') {
1590
1603
  result = await runClassify({ args, options, logger: commandLogger });
1591
- } else if (command === 'sizing') {
1592
- result = await runSizing({ args, options, logger: commandLogger });
1604
+ } else if (command === 'prototype:check' || command === 'prototype-check') {
1605
+ result = await runPrototypeCheck({ args, options, logger: commandLogger });
1606
+ } else if (command === 'verify:implementation' || command === 'verify-implementation') {
1607
+ result = await runVerifyImplementation({ args, options, logger: commandLogger });
1608
+ } else if (command === 'sizing') {
1609
+ result = await runSizing({ args, options, logger: commandLogger });
1593
1610
  } else if (command === 'detect:test-runner' || command === 'detect-test-runner') {
1594
1611
  result = await runDetectTestRunner({ args, options, logger: commandLogger });
1595
1612
  } else if (command === 'pulse:update' || command === 'pulse-update') {