@tacuchi/agent-workflow-cli 25.8.0 → 25.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -0
- package/README.md +5 -1
- package/dist/adapters/git-cli.js +225 -17
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +48 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/amend-service.js +51 -14
- package/dist/application/amend-service.js.map +1 -1
- package/dist/application/branch-resolver.js +6 -3
- package/dist/application/branch-resolver.js.map +1 -1
- package/dist/application/capability/design-handler.js +124 -43
- package/dist/application/capability/design-handler.js.map +1 -1
- package/dist/application/capability/dispatcher.js +4 -1
- package/dist/application/capability/dispatcher.js.map +1 -1
- package/dist/application/capability/durable-effect.js +3 -0
- package/dist/application/capability/durable-effect.js.map +1 -1
- package/dist/application/check-branch-service.js +158 -19
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/checkpoint/markdown.js +2 -2
- package/dist/application/checkpoint/markdown.js.map +1 -1
- package/dist/application/checkpoint/state-reader.js +12 -0
- package/dist/application/checkpoint/state-reader.js.map +1 -1
- package/dist/application/checkpoint-service.js +12 -4
- package/dist/application/checkpoint-service.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +91 -17
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/claims-ledger.js +137 -11
- package/dist/application/claims-ledger.js.map +1 -1
- package/dist/application/claims-recovery.js +85 -44
- package/dist/application/claims-recovery.js.map +1 -1
- package/dist/application/database-tool-catalog.js +33 -0
- package/dist/application/database-tool-catalog.js.map +1 -1
- package/dist/application/design/consumer-document.js +2 -2
- package/dist/application/design/consumer-document.js.map +1 -1
- package/dist/application/design/design-content-gate-service.js +20 -2
- package/dist/application/design/design-content-gate-service.js.map +1 -1
- package/dist/application/design/design-gate-service.js +2 -0
- package/dist/application/design/design-gate-service.js.map +1 -1
- package/dist/application/design/design-index-service.js +4 -0
- package/dist/application/design/design-index-service.js.map +1 -1
- package/dist/application/design/design-publish-service.js +1 -4
- package/dist/application/design/design-publish-service.js.map +1 -1
- package/dist/application/design/design-record-service.js +13 -7
- package/dist/application/design/design-record-service.js.map +1 -1
- package/dist/application/design/design-resolver-service.js +22 -3
- package/dist/application/design/design-resolver-service.js.map +1 -1
- package/dist/application/design/design-simple-service.js +24 -5
- package/dist/application/design/design-simple-service.js.map +1 -1
- package/dist/application/design/digest.js +41 -0
- package/dist/application/design/digest.js.map +1 -0
- package/dist/application/dev-only-services.js +166 -20
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/doc-branch-ledger.js +145 -0
- package/dist/application/doc-branch-ledger.js.map +1 -0
- package/dist/application/docs-canon-service.js +1 -1
- package/dist/application/docs-canon-service.js.map +1 -1
- package/dist/application/doctor/dist-integrity.js +113 -0
- package/dist/application/doctor/dist-integrity.js.map +1 -0
- package/dist/application/doctor/hosts.js +5 -2
- package/dist/application/doctor/hosts.js.map +1 -1
- package/dist/application/doctor/prepare.js +4 -1
- package/dist/application/doctor/prepare.js.map +1 -1
- package/dist/application/doctor/provider-installation.js +39 -19
- package/dist/application/doctor/provider-installation.js.map +1 -1
- package/dist/application/doctor/provider-mcps.js +9 -1
- package/dist/application/doctor/provider-mcps.js.map +1 -1
- package/dist/application/doctor/provider-skills.js +25 -0
- package/dist/application/doctor/provider-skills.js.map +1 -1
- package/dist/application/doctor/provider-visibility.js +76 -3
- package/dist/application/doctor/provider-visibility.js.map +1 -1
- package/dist/application/doctor/provider-workspace-block.js +156 -0
- package/dist/application/doctor/provider-workspace-block.js.map +1 -0
- package/dist/application/doctor/repair-runner.js +47 -3
- package/dist/application/doctor/repair-runner.js.map +1 -1
- package/dist/application/doctor/report.js +24 -4
- package/dist/application/doctor/report.js.map +1 -1
- package/dist/application/doctor/skills-toml-migrate.js +76 -0
- package/dist/application/doctor/skills-toml-migrate.js.map +1 -0
- package/dist/application/export-catalog-check.js +200 -0
- package/dist/application/export-catalog-check.js.map +1 -0
- package/dist/application/export-service.js +716 -79
- package/dist/application/export-service.js.map +1 -1
- package/dist/application/fix-git-service.js +285 -64
- package/dist/application/fix-git-service.js.map +1 -1
- package/dist/application/flow/advance.js +202 -25
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/annul-service.js +3 -1
- package/dist/application/flow/annul-service.js.map +1 -1
- package/dist/application/flow/batch-commit.js +189 -0
- package/dist/application/flow/batch-commit.js.map +1 -0
- package/dist/application/flow/checkout-observation.js +63 -10
- package/dist/application/flow/checkout-observation.js.map +1 -1
- package/dist/application/flow/close-artifacts.js +105 -0
- package/dist/application/flow/close-artifacts.js.map +1 -0
- package/dist/application/flow/close-at-boundary.js +25 -14
- package/dist/application/flow/close-at-boundary.js.map +1 -1
- package/dist/application/flow/close-document-guidance.js +70 -0
- package/dist/application/flow/close-document-guidance.js.map +1 -0
- package/dist/application/flow/flow-service.js +46 -3
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +300 -82
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +24 -1
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/plan-entry.js +82 -0
- package/dist/application/flow/plan-entry.js.map +1 -0
- package/dist/application/flow/prove.js +32 -1
- package/dist/application/flow/prove.js.map +1 -1
- package/dist/application/flow/quick-checkouts.js +48 -0
- package/dist/application/flow/quick-checkouts.js.map +1 -0
- package/dist/application/flow/reinfer-batch.js +177 -0
- package/dist/application/flow/reinfer-batch.js.map +1 -0
- package/dist/application/flow/reopen-run.js +12 -5
- package/dist/application/flow/reopen-run.js.map +1 -1
- package/dist/application/flow/run-state-service.js +2 -0
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +583 -116
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/generate-launch-service.js +16 -6
- package/dist/application/generate-launch-service.js.map +1 -1
- package/dist/application/git-flow-service.js +34 -3
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/history-publications.js +24 -0
- package/dist/application/history-publications.js.map +1 -1
- package/dist/application/history-reconcile-service.js +45 -0
- package/dist/application/history-reconcile-service.js.map +1 -0
- package/dist/application/history-table.js +61 -12
- package/dist/application/history-table.js.map +1 -1
- package/dist/application/history-update-service.js +25 -4
- package/dist/application/history-update-service.js.map +1 -1
- package/dist/application/hook-branch-check.js +25 -3
- package/dist/application/hook-branch-check.js.map +1 -1
- package/dist/application/hook-git-commit-advisor.js +3 -4
- package/dist/application/hook-git-commit-advisor.js.map +1 -1
- package/dist/application/hook-turn-start.js +51 -0
- package/dist/application/hook-turn-start.js.map +1 -0
- package/dist/application/host-memory/codex.js +1 -1
- package/dist/application/host-memory/codex.js.map +1 -1
- package/dist/application/hub-registry.js +135 -0
- package/dist/application/hub-registry.js.map +1 -0
- package/dist/application/local-proposal.js +72 -19
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/mcp-host-reader.js +1 -1
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-writer.js +16 -10
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/merge-state-service.js +150 -34
- package/dist/application/merge-state-service.js.map +1 -1
- package/dist/application/multiroot/claude.js +17 -10
- package/dist/application/multiroot/claude.js.map +1 -1
- package/dist/application/multiroot/codex.js +17 -11
- package/dist/application/multiroot/codex.js.map +1 -1
- package/dist/application/multiroot-service.js +52 -28
- package/dist/application/multiroot-service.js.map +1 -1
- package/dist/application/parsers/execution-batches.js +64 -0
- package/dist/application/parsers/execution-batches.js.map +1 -0
- package/dist/application/parsers/phases.js +23 -2
- package/dist/application/parsers/phases.js.map +1 -1
- package/dist/application/parsers/project-block.js +146 -17
- package/dist/application/parsers/project-block.js.map +1 -1
- package/dist/application/parsers/tasks.js +16 -2
- package/dist/application/parsers/tasks.js.map +1 -1
- package/dist/application/parsers/toml.js +19 -0
- package/dist/application/parsers/toml.js.map +1 -0
- package/dist/application/paths-service.js +13 -16
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/persist-service.js +118 -5
- package/dist/application/persist-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +162 -22
- package/dist/application/plan-exec-batch-service.js.map +1 -1
- package/dist/application/plan-exec-decision-service.js +61 -12
- package/dist/application/plan-exec-decision-service.js.map +1 -1
- package/dist/application/plan-exec-plan-diff.js +105 -0
- package/dist/application/plan-exec-plan-diff.js.map +1 -0
- package/dist/application/plan-lint-service.js +2 -0
- package/dist/application/plan-lint-service.js.map +1 -1
- package/dist/application/plan-passes.js +41 -0
- package/dist/application/plan-passes.js.map +1 -0
- package/dist/application/preparation-receipts.js +58 -0
- package/dist/application/preparation-receipts.js.map +1 -0
- package/dist/application/project-md-upsert-service.js +191 -52
- package/dist/application/project-md-upsert-service.js.map +1 -1
- package/dist/application/project-tab-data.js +40 -10
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/release-data/artifacts.js +15 -7
- package/dist/application/release-data/artifacts.js.map +1 -1
- package/dist/application/release-data/bundles.js +52 -6
- package/dist/application/release-data/bundles.js.map +1 -1
- package/dist/application/release-data/common.js +2 -2
- package/dist/application/release-data/common.js.map +1 -1
- package/dist/application/release-data/rollback.js +7 -0
- package/dist/application/release-data/rollback.js.map +1 -0
- package/dist/application/release-data/sessions.js +2 -2
- package/dist/application/release-data/sessions.js.map +1 -1
- package/dist/application/release-pass-ledger.js +1 -1
- package/dist/application/render/history-row.js +2 -0
- package/dist/application/render/history-row.js.map +1 -1
- package/dist/application/render/project-block.js +28 -11
- package/dist/application/render/project-block.js.map +1 -1
- package/dist/application/reseal-service.js +1 -0
- package/dist/application/reseal-service.js.map +1 -1
- package/dist/application/resume-service.js +55 -8
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/retirement/apply.js +25 -7
- package/dist/application/retirement/apply.js.map +1 -1
- package/dist/application/retirement/attribution.js +121 -48
- package/dist/application/retirement/attribution.js.map +1 -1
- package/dist/application/retirement/prepare.js +17 -11
- package/dist/application/retirement/prepare.js.map +1 -1
- package/dist/application/retirement/preview.js +2 -1
- package/dist/application/retirement/preview.js.map +1 -1
- package/dist/application/self/codex-plugin.js +1 -1
- package/dist/application/self/codex-plugin.js.map +1 -1
- package/dist/application/self/host-states.js +3 -3
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-hooks.js +1 -1
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/mcp-config.js +19 -11
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/opencode-plugin.js +1 -0
- package/dist/application/self/opencode-plugin.js.map +1 -1
- package/dist/application/self/uninstall.js +1 -1
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/semantic-operation/protocol.js +66 -5
- package/dist/application/semantic-operation/protocol.js.map +1 -1
- package/dist/application/session-archive-service.js +113 -0
- package/dist/application/session-archive-service.js.map +1 -0
- package/dist/application/session-binding-service.js +35 -0
- package/dist/application/session-binding-service.js.map +1 -1
- package/dist/application/session-close-service.js +390 -54
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +97 -5
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-custody-recorder.js +15 -12
- package/dist/application/session-custody-recorder.js.map +1 -1
- package/dist/application/session-custody-service.js +1 -0
- package/dist/application/session-custody-service.js.map +1 -1
- package/dist/application/session-narrative.js +42 -12
- package/dist/application/session-narrative.js.map +1 -1
- package/dist/application/session-pause-service.js +46 -0
- package/dist/application/session-pause-service.js.map +1 -0
- package/dist/application/session-resolver.js +36 -11
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.js +134 -13
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +4 -0
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/sessions-sweep-service.js +77 -0
- package/dist/application/sessions-sweep-service.js.map +1 -0
- package/dist/application/settle-service.js +3 -1
- package/dist/application/settle-service.js.map +1 -1
- package/dist/application/skills-resolver-service.js +1 -1
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/source-add-service.js +37 -0
- package/dist/application/source-add-service.js.map +1 -0
- package/dist/application/source-boundary-policy.js +97 -8
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/source-pipeline.js +68 -0
- package/dist/application/source-pipeline.js.map +1 -0
- package/dist/application/source-remove-service.js +15 -3
- package/dist/application/source-remove-service.js.map +1 -1
- package/dist/application/sources-service.js +71 -16
- package/dist/application/sources-service.js.map +1 -1
- package/dist/application/status-service.js +55 -5
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/unit-dependencies.js +100 -0
- package/dist/application/unit-dependencies.js.map +1 -0
- package/dist/application/unit-membership.js +37 -0
- package/dist/application/unit-membership.js.map +1 -0
- package/dist/application/unit-residue.js +72 -0
- package/dist/application/unit-residue.js.map +1 -0
- package/dist/application/visibility-doctor-service.js +66 -4
- package/dist/application/visibility-doctor-service.js.map +1 -1
- package/dist/application/working-branch-service.js +6 -0
- package/dist/application/working-branch-service.js.map +1 -1
- package/dist/application/workline-graph.js +1 -1
- package/dist/application/workline-graph.js.map +1 -1
- package/dist/application/workline-index-service.js +118 -17
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-commit-service.js +218 -0
- package/dist/application/workspace-commit-service.js.map +1 -0
- package/dist/application/workspace-init-service.js +64 -34
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/application/workspace-local-config.js +90 -0
- package/dist/application/workspace-local-config.js.map +1 -0
- package/dist/application/workspace-materialization-service.js +52 -3
- package/dist/application/workspace-materialization-service.js.map +1 -1
- package/dist/application/workspace-migrate/apply.js +525 -4
- package/dist/application/workspace-migrate/apply.js.map +1 -1
- package/dist/application/workspace-migrate/markers.js +9 -6
- package/dist/application/workspace-migrate/markers.js.map +1 -1
- package/dist/application/workspace-migrate/plan.js +97 -5
- package/dist/application/workspace-migrate/plan.js.map +1 -1
- package/dist/application/workspace-move-service.js +270 -0
- package/dist/application/workspace-move-service.js.map +1 -0
- package/dist/application/workspace-untrack-service.js +28 -0
- package/dist/application/workspace-untrack-service.js.map +1 -0
- package/dist/application/worktree-service.js +654 -105
- package/dist/application/worktree-service.js.map +1 -1
- package/dist/cli/ascii.js +2 -0
- package/dist/cli/ascii.js.map +1 -1
- package/dist/cli/commands/add-source.js +38 -0
- package/dist/cli/commands/add-source.js.map +1 -0
- package/dist/cli/commands/amend.js +14 -3
- package/dist/cli/commands/amend.js.map +1 -1
- package/dist/cli/commands/capability.js +11 -0
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/designs.js +14 -5
- package/dist/cli/commands/designs.js.map +1 -1
- package/dist/cli/commands/dev-only.js +19 -6
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/doc-branch.js +184 -0
- package/dist/cli/commands/doc-branch.js.map +1 -0
- package/dist/cli/commands/doctor.js +5 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.js +78 -18
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/fix-git.js +89 -14
- package/dist/cli/commands/fix-git.js.map +1 -1
- package/dist/cli/commands/flow.js +120 -15
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate-launch.js +14 -2
- package/dist/cli/commands/generate-launch.js.map +1 -1
- package/dist/cli/commands/history-update.js +1 -1
- package/dist/cli/commands/history-update.js.map +1 -1
- package/dist/cli/commands/history.js +14 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/hook.js +15 -2
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/index.js +18 -1
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/merge-state.js +2 -2
- package/dist/cli/commands/merge-state.js.map +1 -1
- package/dist/cli/commands/persist.js +6 -5
- package/dist/cli/commands/persist.js.map +1 -1
- package/dist/cli/commands/project-md-upsert.js +5 -3
- package/dist/cli/commands/project-md-upsert.js.map +1 -1
- package/dist/cli/commands/release-pass.js +3 -3
- package/dist/cli/commands/release-pass.js.map +1 -1
- package/dist/cli/commands/resume.js +12 -3
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/self.js +7 -2
- package/dist/cli/commands/self.js.map +1 -1
- package/dist/cli/commands/session-close.js +64 -9
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.js +4 -2
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-pause.js +14 -0
- package/dist/cli/commands/session-pause.js.map +1 -0
- package/dist/cli/commands/sessions.js +16 -3
- package/dist/cli/commands/sessions.js.map +1 -1
- package/dist/cli/commands/set-branch.js +28 -4
- package/dist/cli/commands/set-branch.js.map +1 -1
- package/dist/cli/commands/set-edit-mode.js +20 -0
- package/dist/cli/commands/set-edit-mode.js.map +1 -0
- package/dist/cli/commands/set-pipeline.js +35 -0
- package/dist/cli/commands/set-pipeline.js.map +1 -0
- package/dist/cli/commands/sources.js +4 -0
- package/dist/cli/commands/sources.js.map +1 -1
- package/dist/cli/commands/status.js +35 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/unknown-flags.js +1 -0
- package/dist/cli/commands/unknown-flags.js.map +1 -1
- package/dist/cli/commands/visibility.js +1 -0
- package/dist/cli/commands/visibility.js.map +1 -1
- package/dist/cli/commands/workspace-commit.js +62 -0
- package/dist/cli/commands/workspace-commit.js.map +1 -0
- package/dist/cli/commands/workspace-init.js +39 -2
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/commands/workspace-migrate.js +31 -3
- package/dist/cli/commands/workspace-migrate.js.map +1 -1
- package/dist/cli/commands/workspace-move.js +42 -0
- package/dist/cli/commands/workspace-move.js.map +1 -0
- package/dist/cli/commands/worktree.js +4 -4
- package/dist/cli/commands/worktree.js.map +1 -1
- package/dist/cli/context-id.js +6 -0
- package/dist/cli/context-id.js.map +1 -1
- package/dist/cli/full-cli.js +555 -0
- package/dist/cli/full-cli.js.map +1 -0
- package/dist/cli/help-groups.js +75 -16
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/hook-stdin-cache.js +12 -0
- package/dist/cli/hook-stdin-cache.js.map +1 -0
- package/dist/cli/main.js +47 -453
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +4 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/app.js +1 -1
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/workspace-init-form.js +4 -1
- package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
- package/dist/cli/tui/data/recommended-skills.js +2 -2
- package/dist/cli/tui/data/recommended-skills.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +6 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +4 -3
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +7 -2
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/dist-manifest.json +4117 -0
- package/dist/domain/capability/protocol.js.map +1 -1
- package/dist/domain/decision-note.js +13 -0
- package/dist/domain/decision-note.js.map +1 -1
- package/dist/domain/design/artifact.js +22 -3
- package/dist/domain/design/artifact.js.map +1 -1
- package/dist/domain/design/capability.js +1 -0
- package/dist/domain/design/capability.js.map +1 -1
- package/dist/domain/design/expansion.js +1 -1
- package/dist/domain/design/expansion.js.map +1 -1
- package/dist/domain/design/maturity.js +16 -0
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/reference.js +5 -0
- package/dist/domain/design/reference.js.map +1 -1
- package/dist/domain/doctor/operations.js +28 -2
- package/dist/domain/doctor/operations.js.map +1 -1
- package/dist/domain/effective-contract.js +3 -1
- package/dist/domain/effective-contract.js.map +1 -1
- package/dist/domain/elicitation.js +1 -1
- package/dist/domain/flow/answer.js +265 -130
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +193 -34
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/batch-review.js +65 -0
- package/dist/domain/flow/batch-review.js.map +1 -0
- package/dist/domain/flow/decision-schema.js +47 -0
- package/dist/domain/flow/decision-schema.js.map +1 -0
- package/dist/domain/flow/directive.js +16 -0
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/execution-result.js +91 -2
- package/dist/domain/flow/execution-result.js.map +1 -1
- package/dist/domain/flow/run-state.js +352 -24
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/flow/test-run-evidence.js +285 -0
- package/dist/domain/flow/test-run-evidence.js.map +1 -0
- package/dist/domain/flow/unchanged-phase.js +15 -0
- package/dist/domain/flow/unchanged-phase.js.map +1 -0
- package/dist/domain/harnesses.js +14 -5
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/isolation-unit.js +2 -2
- package/dist/domain/isolation-unit.js.map +1 -1
- package/dist/domain/lineage.js +7 -2
- package/dist/domain/lineage.js.map +1 -1
- package/dist/domain/obligation-correspondence.js +4 -2
- package/dist/domain/obligation-correspondence.js.map +1 -1
- package/dist/domain/plan-handoff.js +5 -0
- package/dist/domain/plan-handoff.js.map +1 -0
- package/dist/domain/proposal.js +18 -7
- package/dist/domain/proposal.js.map +1 -1
- package/dist/domain/reservation.js +5 -3
- package/dist/domain/reservation.js.map +1 -1
- package/dist/domain/retirement/proposal.js +1 -0
- package/dist/domain/retirement/proposal.js.map +1 -1
- package/dist/domain/session/custody.js +10 -6
- package/dist/domain/session/custody.js.map +1 -1
- package/dist/domain/session/narrative.js +4 -1
- package/dist/domain/session/narrative.js.map +1 -1
- package/dist/domain/skills.js +2 -0
- package/dist/domain/skills.js.map +1 -1
- package/dist/domain/sql-lexer.js +1 -1
- package/dist/domain/sql-lexer.js.map +1 -1
- package/dist/runtime/namespace-resolver.js +4 -0
- package/dist/runtime/namespace-resolver.js.map +1 -1
- package/dist/runtime/workline-marker.js +35 -8
- package/dist/runtime/workline-marker.js.map +1 -1
- package/dist/runtime/workspace-resolution.js +123 -0
- package/dist/runtime/workspace-resolution.js.map +1 -0
- package/package.json +5 -4
- package/skills/w/SKILL.md +3 -1
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +1 -1
- package/skills/w/artifacts/artifacts-core/SCRIPTS.rollback.sql +8 -0
- package/skills/w/artifacts/artifacts-core/SCRIPTS.sql +4 -8
- package/skills/w/commands/export-diagrams.md +3 -3
- package/skills/w/commands/export-manuals.md +6 -6
- package/skills/w/commands/export-reports.md +3 -3
- package/skills/w/commands/export-scripts.md +5 -5
- package/skills/w/commands/fix-git.md +12 -13
- package/skills/w/commands/persist.md +2 -2
- package/skills/w/commands/plan-exec.md +4 -2
- package/skills/w/commands/spec-new.md +1 -1
- package/skills/w/commands/workspace-init.md +2 -0
- package/skills/w/context/MANIFEST.json +1 -1
- package/skills/w/exports/export-diagrams/EXPORT.md +3 -3
- package/skills/w/exports/export-manuals/EXPORT.md +14 -16
- package/skills/w/exports/export-reports/EXPORT.md +3 -3
- package/skills/w/exports/export-scripts/EXPORT.md +45 -21
- package/skills/w/harness/HARNESS.md +2 -2
- package/skills/w/hooks/hooks.template.json +6 -4
- package/skills/w/loops/CHASSIS.md +11 -5
- package/skills/w/loops/CODE-POLICIES.md +7 -4
- package/skills/w/loops/plan-exec-loop/LOOP.md +23 -22
- package/skills/w/loops/plan-new-loop/LOOP.md +23 -31
- package/skills/w/loops/plan-refine-loop/LOOP.md +8 -2
- package/skills/w/loops/quick-loop/LOOP.md +6 -5
- package/skills/w/modules/DESIGN-REFERENCES.md +9 -11
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +4 -4
- package/skills/w/modules/SESSION-NUMBERING.md +2 -0
- package/skills/w/roles/design/CONTRACT.md +6 -4
- package/skills/w/roles/design/ROLE.md +4 -2
- package/skills/w/roles/git/ROLE.md +16 -9
- package/skills/w/roles/research/ROLE.md +1 -1
- package/skills/w/roles/sql/ROLE.md +16 -14
- package/skills/w/schemas/design/ui-screen.v1.schema.json +9 -0
|
@@ -15,12 +15,36 @@
|
|
|
15
15
|
* directive with `ok: true` — with `ok: false` the host never calls `renderHuman`
|
|
16
16
|
* and the person would never see the boundary they have to answer over.
|
|
17
17
|
*/
|
|
18
|
+
import { resolve } from "node:path";
|
|
18
19
|
import { parseSemanticArtifacts } from "../../application/semantic-operation/protocol.js";
|
|
19
20
|
import { COMPLETENESS_VALUES } from "../capability/descriptor.js";
|
|
20
|
-
import { isEffectClass } from "../capability/effects.js";
|
|
21
|
+
import { EFFECT_CLASSES, isEffectClass } from "../capability/effects.js";
|
|
21
22
|
import { CAPABILITY_OUTCOMES, } from "../capability/protocol.js";
|
|
22
|
-
import { proposalContractOf, } from "./authority.js";
|
|
23
|
+
import { effectsOf, proposalContractOf, } from "./authority.js";
|
|
24
|
+
import { BATCH_REVIEW_CONTRACT, isBatchReview } from "./batch-review.js";
|
|
23
25
|
import { STOP_LABEL, isFlowControl } from "./directive.js";
|
|
26
|
+
/** Preserve the first code/message while publishing every independent defect. */
|
|
27
|
+
function collected(entries) {
|
|
28
|
+
const first = entries[0];
|
|
29
|
+
if (first === undefined)
|
|
30
|
+
throw new Error("no hay violaciones para entregar");
|
|
31
|
+
return {
|
|
32
|
+
...first.failure,
|
|
33
|
+
violations: entries.map((entry) => entry.violation),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function violation(failure, field, expected, received) {
|
|
37
|
+
return {
|
|
38
|
+
failure,
|
|
39
|
+
violation: {
|
|
40
|
+
code: failure.code,
|
|
41
|
+
field,
|
|
42
|
+
expected,
|
|
43
|
+
received: Array.isArray(received) ? "lista" : received === null ? "null" : typeof received,
|
|
44
|
+
message: failure.message,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
24
48
|
/**
|
|
25
49
|
* Which rejections COUNT as an attempt at the boundary, and which never reached
|
|
26
50
|
* it.
|
|
@@ -44,14 +68,11 @@ import { STOP_LABEL, isFlowControl } from "./directive.js";
|
|
|
44
68
|
* raises). At an execution boundary the decision IS the result and at an
|
|
45
69
|
* authoring one it IS the bytes: with neither there, there is nothing to judge,
|
|
46
70
|
* and charging for it charges for the envelope.
|
|
47
|
-
* - `evaluated` — the decision arrived and did not resolve the gap.
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* proposal reaching past what its row declares — and an answer that declares
|
|
53
|
-
* nothing at all, which is the feigned convergence the chassis degrades and
|
|
54
|
-
* exactly what the cap is for.
|
|
71
|
+
* - `evaluated` — the decision arrived and did not resolve the gap. An execution
|
|
72
|
+
* that did not complete or left its effect half-applied, a scope naming sources
|
|
73
|
+
* the workspace or the plan does not, a proposal reaching past what its row
|
|
74
|
+
* declares, or an answer that declares nothing at all. Unknown literals,
|
|
75
|
+
* malformed proofs, copied digests and invocations are envelope errors.
|
|
55
76
|
* - `control` — a real answer that deliberately applies nothing, or the same
|
|
56
77
|
* answer arriving twice. Pausing to compact, stopping the run, and a resend are
|
|
57
78
|
* all decisions somebody made on purpose; charging them would make the flow
|
|
@@ -75,6 +96,7 @@ export const FLOW_ANSWER_REJECTIONS = {
|
|
|
75
96
|
FLOW_ANSWER_MISSING: "envelope",
|
|
76
97
|
FLOW_ANSWER_INVALID: "envelope",
|
|
77
98
|
FLOW_ANSWER_STALE: "envelope",
|
|
99
|
+
WORKSPACE_MISMATCH: "envelope",
|
|
78
100
|
FLOW_ANSWER_NOT_EXPECTED: "envelope",
|
|
79
101
|
FLOW_RESULT_INVALID: "envelope",
|
|
80
102
|
FLOW_ARTIFACTS_MISSING: "envelope",
|
|
@@ -96,74 +118,130 @@ export const FLOW_ANSWER_REJECTIONS = {
|
|
|
96
118
|
// action, so charging the envelope would punish choosing the wrong verb.
|
|
97
119
|
FLOW_INTERNAL_ACTION_EXTERNAL_RESULT: "envelope",
|
|
98
120
|
FLOW_ANSWER_AMBIGUOUS: "evaluated",
|
|
99
|
-
FLOW_SIGNAL_UNKNOWN: "
|
|
100
|
-
FLOW_CHOICE_UNKNOWN: "
|
|
101
|
-
FLOW_APPROVAL_MISSING: "
|
|
102
|
-
FLOW_APPROVAL_MISMATCH: "
|
|
103
|
-
|
|
121
|
+
FLOW_SIGNAL_UNKNOWN: "envelope",
|
|
122
|
+
FLOW_CHOICE_UNKNOWN: "envelope",
|
|
123
|
+
FLOW_APPROVAL_MISSING: "envelope",
|
|
124
|
+
FLOW_APPROVAL_MISMATCH: "envelope",
|
|
125
|
+
WORKSPACE_COMMIT_UNAVAILABLE: "envelope",
|
|
126
|
+
WORKSPACE_COMMIT_APPROVAL_INVALID: "envelope",
|
|
127
|
+
FLOW_ACTION_MISMATCH: "envelope",
|
|
104
128
|
// The execution verdict's own vocabulary: it judges a result that WAS read.
|
|
105
129
|
FLOW_EXECUTION_NOT_COMPLETED: "evaluated",
|
|
106
130
|
FLOW_EVIDENCE_MISSING: "evaluated",
|
|
107
|
-
WORKLINE_CHECKOUT_PROOF_MISSING: "
|
|
131
|
+
WORKLINE_CHECKOUT_PROOF_MISSING: "envelope",
|
|
108
132
|
WORKLINE_CHECKOUT_PROOF_INVALID: "evaluated",
|
|
109
|
-
|
|
133
|
+
WORKLINE_CHECKOUT_PROOF_SHAPE_INVALID: "envelope",
|
|
134
|
+
WORKLINE_CHECKOUT_PROOF_ROOT_MISMATCH: "envelope",
|
|
135
|
+
WORKLINE_CHECKOUT_UNOBSERVABLE: "envelope",
|
|
136
|
+
WORKLINE_CHECKOUT_PROOF_STALE: "envelope",
|
|
110
137
|
FLOW_EFFECT_PARTIAL: "evaluated",
|
|
111
138
|
// The phase validation's own: the proofs were read and they are not this
|
|
112
139
|
// batch's — nothing changed since its base, or they already credited another.
|
|
113
140
|
PLAN_EXEC_BATCH_UNCHANGED: "evaluated",
|
|
141
|
+
PLAN_EXEC_BATCH_STALE: "control",
|
|
142
|
+
PLAN_VALIDATION_ONLY_NOT_APPROVED: "evaluated",
|
|
114
143
|
PLAN_EXEC_PROOF_REUSED: "evaluated",
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
144
|
+
PLAN_EXEC_BATCH_REVIEW_INVALID: "evaluated",
|
|
145
|
+
PLAN_EXEC_BATCH_COMMIT_UNOBSERVABLE: "envelope",
|
|
146
|
+
PLAN_EXEC_BATCH_COMMIT_MESSAGE_INVALID: "evaluated",
|
|
147
|
+
PLAN_EXEC_BATCH_PATHS_REQUIRED: "evaluated",
|
|
148
|
+
PLAN_EXEC_BATCH_SHARED_PATH: "evaluated",
|
|
149
|
+
PLAN_EXEC_BATCH_PATH_NOT_OWNED: "evaluated",
|
|
150
|
+
PLAN_ISOLATION_INVALID: "envelope",
|
|
151
|
+
PLAN_TEST_RUN_NOT_EXECUTED: "evaluated",
|
|
152
|
+
PLAN_FINAL_PIPELINE_MISSING: "evaluated",
|
|
153
|
+
PLAN_PREEXISTING_FAILURES_INVALID: "evaluated",
|
|
154
|
+
PLAN_TEST_FAILURES_UNREADABLE: "evaluated",
|
|
155
|
+
PLAN_TEST_FAILURE_NEW: "evaluated",
|
|
156
|
+
// The scope boundary distinguishes malformed fields and unavailable documents
|
|
157
|
+
// from a proposed source set that the workspace or plan cannot accept.
|
|
118
158
|
FLOW_SCOPE_INVALID: "evaluated",
|
|
159
|
+
FLOW_SCOPE_SHAPE_INVALID: "envelope",
|
|
119
160
|
FLOW_SCOPE_UNKNOWN_SOURCE: "evaluated",
|
|
120
161
|
FLOW_SCOPE_NOT_IN_PLAN: "evaluated",
|
|
121
|
-
FLOW_SCOPE_PLAN_UNREADABLE: "
|
|
162
|
+
FLOW_SCOPE_PLAN_UNREADABLE: "envelope",
|
|
122
163
|
// The submitted scope named a plan and the CLI read it, but its location
|
|
123
164
|
// violates the canonical documentation boundary.
|
|
124
|
-
FLOW_SCOPE_PLAN_OUTSIDE_CANON: "
|
|
125
|
-
FLOW_HANDOFF_PLAN_MISSING: "
|
|
126
|
-
// El preview
|
|
127
|
-
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
// and the workspace facts needed to act on it.
|
|
134
|
-
FLOW_DECISION_SCOPE_MISSING: "evaluated",
|
|
135
|
-
FLOW_DECISION_INPUT_INVALID: "evaluated",
|
|
136
|
-
FLOW_DECISION_PLAN_UNREADABLE: "evaluated",
|
|
165
|
+
FLOW_SCOPE_PLAN_OUTSIDE_CANON: "envelope",
|
|
166
|
+
FLOW_HANDOFF_PLAN_MISSING: "envelope",
|
|
167
|
+
// El preview sin archivos, intención o forma del diff sigue incompleto.
|
|
168
|
+
FLOW_PREVIEW_INVALID: "envelope",
|
|
169
|
+
// The choice itself can be refused (evaluated); missing shape or an unreadable
|
|
170
|
+
// live baseline cannot be charged to its author.
|
|
171
|
+
FLOW_DECISION_SCOPE_MISSING: "envelope",
|
|
172
|
+
FLOW_DECISION_INPUT_INVALID: "envelope",
|
|
173
|
+
FLOW_DECISION_PLAN_UNREADABLE: "envelope",
|
|
137
174
|
FLOW_DECISION_LINEAGE_INVALID: "evaluated",
|
|
138
|
-
FLOW_DECISION_SPEC_UNREADABLE: "
|
|
175
|
+
FLOW_DECISION_SPEC_UNREADABLE: "envelope",
|
|
139
176
|
FLOW_DECISION_UNRESOLVABLE: "evaluated",
|
|
140
|
-
FLOW_DECISION_PREPARATION_FAILED: "
|
|
141
|
-
FLOW_DECISION_PREVIEW_ABSENT: "
|
|
177
|
+
FLOW_DECISION_PREPARATION_FAILED: "envelope",
|
|
178
|
+
FLOW_DECISION_PREVIEW_ABSENT: "envelope",
|
|
142
179
|
// The settlement's own vocabulary. Both mean the CLI READ the declaration and
|
|
143
180
|
// compared it against what the plan really owes — a declaration that answers
|
|
144
181
|
// for the wrong obligations, or that leaves one unanswered.
|
|
145
182
|
FLOW_SETTLEMENT_INVALID: "evaluated",
|
|
146
183
|
FLOW_SETTLEMENT_INCOMPLETE: "evaluated",
|
|
147
|
-
PLAN_SOURCE_BOUNDARY_MISSING: "
|
|
148
|
-
PLAN_SOURCE_UNKNOWN: "
|
|
149
|
-
PLAN_TASK_SOURCE_OUTSIDE_PHASE: "
|
|
150
|
-
PLAN_SOURCE_EXTERNAL_CLOSURE: "
|
|
151
|
-
PLAN_SOURCE_LOCAL_PROOF_MISSING: "
|
|
184
|
+
PLAN_SOURCE_BOUNDARY_MISSING: "envelope",
|
|
185
|
+
PLAN_SOURCE_UNKNOWN: "envelope",
|
|
186
|
+
PLAN_TASK_SOURCE_OUTSIDE_PHASE: "envelope",
|
|
187
|
+
PLAN_SOURCE_EXTERNAL_CLOSURE: "envelope",
|
|
188
|
+
PLAN_SOURCE_LOCAL_PROOF_MISSING: "envelope",
|
|
152
189
|
// The plan's grammar does not spend: a plan published without its lineage is
|
|
153
190
|
// refused for what its header says, and fixing the header is the whole answer.
|
|
154
191
|
PLAN_LINEAGE_UNSEALED: "envelope",
|
|
155
192
|
// The authoring boundary's: the bytes arrived and what they would do is not
|
|
156
193
|
// what the row declares, or their destination could not be read.
|
|
157
194
|
FLOW_PROPOSAL_BEYOND_CONTRACT: "evaluated",
|
|
158
|
-
FLOW_PROPOSAL_DESTINATION_UNOBSERVED: "
|
|
159
|
-
FLOW_PROPOSAL_BASE_UNREADABLE: "
|
|
160
|
-
//
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
FLOW_ROUTE_PROPOSAL_INVALID: "evaluated",
|
|
165
|
-
FLOW_ROUTE_SUBSTITUTION_INVALID: "evaluated",
|
|
195
|
+
FLOW_PROPOSAL_DESTINATION_UNOBSERVED: "envelope",
|
|
196
|
+
FLOW_PROPOSAL_BASE_UNREADABLE: "envelope",
|
|
197
|
+
// Route shape is free; attempting to bypass a hard gate is evaluated.
|
|
198
|
+
FLOW_ROUTE_DECISION_INVALID: "envelope",
|
|
199
|
+
FLOW_ROUTE_PROPOSAL_INVALID: "envelope",
|
|
200
|
+
FLOW_ROUTE_SUBSTITUTION_INVALID: "envelope",
|
|
166
201
|
FLOW_ROUTE_HARD_GATE: "evaluated",
|
|
202
|
+
// The author's draft is a shape; a contradictory claim or a scope the
|
|
203
|
+
// contract refuses is content. A moved baseline or publication is state.
|
|
204
|
+
NOTE_NOT_OBJECT: "envelope",
|
|
205
|
+
NOTE_SCHEMA_UNKNOWN: "envelope",
|
|
206
|
+
NOTE_ID_INVALID: "envelope",
|
|
207
|
+
NOTE_DECISION_MISSING: "envelope",
|
|
208
|
+
NOTE_REASON_MISSING: "envelope",
|
|
209
|
+
NOTE_CONSUMERS_MISSING: "envelope",
|
|
210
|
+
NOTE_EVIDENCE_PRESERVED_MISSING: "envelope",
|
|
211
|
+
NOTE_EVIDENCE_INVALIDATED_MISSING: "envelope",
|
|
212
|
+
NOTE_OBLIGATIONS_MISSING: "envelope",
|
|
213
|
+
NOTE_OBLIGATIONS_INVALID: "envelope",
|
|
214
|
+
NOTE_OBLIGATION_KIND_MISSING: "envelope",
|
|
215
|
+
NOTE_RESUME_POINT_MISSING: "envelope",
|
|
216
|
+
NOTE_DATE_INVALID: "envelope",
|
|
217
|
+
NOTE_DIGEST_MISSING: "envelope",
|
|
218
|
+
NOTE_DIGEST_MISMATCH: "envelope",
|
|
219
|
+
NOTE_SCOPE_INVALID: "envelope",
|
|
220
|
+
NOTE_SUPERSEDES_INVALID: "envelope",
|
|
221
|
+
NOTE_ASSERTIONS_MISSING: "envelope",
|
|
222
|
+
NOTE_ASSERTIONS_INVALID: "envelope",
|
|
223
|
+
NOTE_ASSERTIONS_DUPLICATE: "envelope",
|
|
224
|
+
NOTE_LINEAGE_MISSING: "envelope",
|
|
225
|
+
NOTE_LINEAGE_INVALID: "envelope",
|
|
226
|
+
NOTE_LINEAGE_DIGEST_INVALID: "envelope",
|
|
227
|
+
NOTE_EXECUTION_STATE_MISSING: "envelope",
|
|
228
|
+
NOTE_INDEX_UNREADABLE: "envelope",
|
|
229
|
+
NOTE_INDEX_INVALID: "envelope",
|
|
230
|
+
NOTE_INDEX_SCHEMA_UNKNOWN: "envelope",
|
|
231
|
+
NOTE_ALREADY_PUBLISHED: "control",
|
|
232
|
+
NOTE_SUPERSEDES_ABSENT: "evaluated",
|
|
233
|
+
NOTE_REWRITES_BASELINE: "evaluated",
|
|
234
|
+
CONTRACT_BASELINE_ABSENT: "envelope",
|
|
235
|
+
CONTRACT_ASSERTION_ABSENT: "evaluated",
|
|
236
|
+
CONTRACT_OVERLAP: "evaluated",
|
|
237
|
+
CONTRACT_CONTRADICTION: "evaluated",
|
|
238
|
+
DECISION_BASE_ABSENT: "envelope",
|
|
239
|
+
PROPOSAL_LOCKED: "control",
|
|
240
|
+
PROPOSAL_BASELINE_UNSEALED: "envelope",
|
|
241
|
+
PROPOSAL_APPROVAL_MISMATCH: "envelope",
|
|
242
|
+
PROPOSAL_APPROVAL_MISSING: "envelope",
|
|
243
|
+
PROPOSAL_BASE_GONE: "envelope",
|
|
244
|
+
PROPOSAL_BASE_STALE: "envelope",
|
|
167
245
|
// A compensation the run declared STILL PENDING is not a malformed answer and
|
|
168
246
|
// not a failed check: it is the truthful one. The closure stays where it is
|
|
169
247
|
// until the work is done, and charging an attempt for saying so would make
|
|
@@ -276,45 +354,49 @@ function semanticAnswer(body, input) {
|
|
|
276
354
|
const proposes = proposalContractOf(input.decision);
|
|
277
355
|
const declared = new Set(input.decision.signals ?? []);
|
|
278
356
|
const raw = body.signals;
|
|
357
|
+
const issues = [];
|
|
279
358
|
if (raw !== undefined && !isStringArray(raw)) {
|
|
280
|
-
|
|
359
|
+
issues.push(violation(invalid("'signals' tiene que ser una lista de identificadores"), "signals", "string[]", raw));
|
|
281
360
|
}
|
|
282
|
-
const signals = raw
|
|
361
|
+
const signals = isStringArray(raw) ? raw : [];
|
|
283
362
|
const decisions = body.decisions;
|
|
284
363
|
if (decisions !== undefined && !isRecord(decisions)) {
|
|
285
|
-
|
|
364
|
+
issues.push(violation(invalid("'decisions' tiene que ser un objeto"), "decisions", "objeto", decisions));
|
|
286
365
|
}
|
|
287
366
|
// A flow control IS an answer, including here. It used to die on the emptiness
|
|
288
367
|
// check below — a semantic boundary demands signals or decisions — and
|
|
289
368
|
// `FLOW_ANSWER_AMBIGUOUS` is an EVALUATED rejection, so asking to compact cost
|
|
290
369
|
// an attempt at exactly the boundary somebody was trying to pause.
|
|
291
370
|
const control = flowControlOf(body);
|
|
292
|
-
const substance =
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
371
|
+
const substance = issues.length > 0
|
|
372
|
+
? null
|
|
373
|
+
: checkSubstance(body, {
|
|
374
|
+
decision: input.decision,
|
|
375
|
+
signals,
|
|
376
|
+
decisions,
|
|
377
|
+
proposes: proposes !== null,
|
|
378
|
+
control,
|
|
379
|
+
});
|
|
298
380
|
if (substance !== null)
|
|
299
|
-
|
|
381
|
+
issues.push(violation(substance, "artifacts", "respuesta con contenido para la frontera", body.artifacts));
|
|
300
382
|
const artifacts = proposes === null ? EMPTY : parseArtifacts(body.artifacts, input);
|
|
301
383
|
if (!Array.isArray(artifacts))
|
|
302
|
-
|
|
384
|
+
issues.push(violation(artifacts.failure, "artifacts", "lista de {path, content}", body.artifacts));
|
|
303
385
|
for (const signal of signals) {
|
|
304
386
|
if (declared.has(signal))
|
|
305
387
|
continue;
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
message: `'${signal}' no está en el vocabulario que esta frontera admite`,
|
|
311
|
-
action: `declarás solo: ${[...declared].join(", ") || "(ninguna señal en esta frontera)"}`,
|
|
312
|
-
},
|
|
388
|
+
const failure = {
|
|
389
|
+
code: "FLOW_SIGNAL_UNKNOWN",
|
|
390
|
+
message: `'${signal}' no está en el vocabulario que esta frontera admite`,
|
|
391
|
+
action: `declarás solo: ${[...declared].join(", ") || "(ninguna señal en esta frontera)"}`,
|
|
313
392
|
};
|
|
393
|
+
issues.push(violation(failure, "signals", [...declared].join(" | ") || "ninguna", signal));
|
|
314
394
|
}
|
|
315
395
|
if (new Set(signals).size !== signals.length) {
|
|
316
|
-
|
|
396
|
+
issues.push(violation(invalid("la misma señal viene declarada dos veces"), "signals", "identificadores únicos", signals));
|
|
317
397
|
}
|
|
398
|
+
if (issues.length > 0)
|
|
399
|
+
return { ok: false, failure: collected(issues) };
|
|
318
400
|
return {
|
|
319
401
|
ok: true,
|
|
320
402
|
answer: {
|
|
@@ -326,11 +408,22 @@ function semanticAnswer(body, input) {
|
|
|
326
408
|
// boundary has no alternatives of its own to pick from.
|
|
327
409
|
choice: control,
|
|
328
410
|
result: null,
|
|
329
|
-
artifacts,
|
|
411
|
+
artifacts: artifacts,
|
|
330
412
|
},
|
|
331
413
|
};
|
|
332
414
|
}
|
|
333
415
|
const EMPTY = [];
|
|
416
|
+
function checkAnswerContract(decision, decisions, control) {
|
|
417
|
+
if (control !== null || decision.answer_contract !== "batch-review")
|
|
418
|
+
return null;
|
|
419
|
+
if (isRecord(decisions) && isBatchReview(decisions.review))
|
|
420
|
+
return null;
|
|
421
|
+
return {
|
|
422
|
+
code: "PLAN_EXEC_BATCH_REVIEW_INVALID",
|
|
423
|
+
message: "la revisión del lote falta o no demuestra un revisor distinto y cada corrección revisada",
|
|
424
|
+
action: BATCH_REVIEW_CONTRACT,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
334
427
|
/**
|
|
335
428
|
* Whether the answer says anything the CLI can act on — and the right thing.
|
|
336
429
|
*
|
|
@@ -343,6 +436,9 @@ const EMPTY = [];
|
|
|
343
436
|
* nobody to approve them are precisely the write this contract forbids.
|
|
344
437
|
*/
|
|
345
438
|
function checkSubstance(body, answered) {
|
|
439
|
+
const contract = checkAnswerContract(answered.decision, answered.decisions, answered.control);
|
|
440
|
+
if (contract !== null)
|
|
441
|
+
return contract;
|
|
346
442
|
const hasArtifacts = Array.isArray(body.artifacts) && body.artifacts.length > 0;
|
|
347
443
|
if (hasArtifacts && !answered.proposes) {
|
|
348
444
|
return {
|
|
@@ -398,11 +494,24 @@ function parseArtifacts(raw, input) {
|
|
|
398
494
|
}
|
|
399
495
|
const parsed = parseSemanticArtifacts(raw, request);
|
|
400
496
|
if (!parsed.ok) {
|
|
497
|
+
const individual = Array.isArray(raw)
|
|
498
|
+
? raw.flatMap((entry, index) => {
|
|
499
|
+
const checked = parseSemanticArtifacts([entry], request);
|
|
500
|
+
return checked.ok
|
|
501
|
+
? []
|
|
502
|
+
: [
|
|
503
|
+
violation(checked.failure, `artifacts[${index}]`, "{path: ruta permitida, content: string}", entry).violation,
|
|
504
|
+
];
|
|
505
|
+
})
|
|
506
|
+
: [];
|
|
401
507
|
return {
|
|
402
508
|
failure: {
|
|
403
509
|
code: parsed.failure.code,
|
|
404
510
|
message: parsed.failure.message,
|
|
405
511
|
action: parsed.failure.action,
|
|
512
|
+
violations: individual.length > 0
|
|
513
|
+
? individual
|
|
514
|
+
: [violation(parsed.failure, "artifacts", "lista de {path, content}", raw).violation],
|
|
406
515
|
},
|
|
407
516
|
};
|
|
408
517
|
}
|
|
@@ -490,7 +599,7 @@ function approvalAnswer(body, input) {
|
|
|
490
599
|
failure: {
|
|
491
600
|
code: "FLOW_APPROVAL_MISSING",
|
|
492
601
|
message: "esta frontera necesita una aprobación de efecto y no llegó ninguna",
|
|
493
|
-
action: `volvé a invocar con --approval ${input.expectedApproval ?? "<digest>"}, o respondé '${STOP_LABEL}' para
|
|
602
|
+
action: `volvé a invocar con --approval ${input.expectedApproval ?? "<digest>"}, o respondé '${STOP_LABEL}' para cerrar la sesión conservando lo pendiente sin autorizar ese efecto`,
|
|
494
603
|
},
|
|
495
604
|
};
|
|
496
605
|
}
|
|
@@ -525,65 +634,58 @@ function executionAnswer(body, input) {
|
|
|
525
634
|
if (action === null) {
|
|
526
635
|
return { ok: false, failure: badResult("esta frontera no declara ninguna acción delegada") };
|
|
527
636
|
}
|
|
637
|
+
const issues = [];
|
|
638
|
+
const add = (failure, field, expected, value) => {
|
|
639
|
+
issues.push(violation(failure, field, expected, value));
|
|
640
|
+
};
|
|
528
641
|
const outcome = body.outcome;
|
|
529
642
|
// Absent and out-of-vocabulary are DIFFERENT failures and no longer share a
|
|
530
643
|
// sentence. They used to, and the sentence described only the second one.
|
|
531
644
|
if (outcome === undefined) {
|
|
532
|
-
|
|
645
|
+
add(badResult(missingOutcome(body)), "outcome", CAPABILITY_OUTCOMES.join(" | "), outcome);
|
|
533
646
|
}
|
|
534
|
-
if (typeof outcome !== "string" ||
|
|
647
|
+
else if (typeof outcome !== "string" ||
|
|
535
648
|
!CAPABILITY_OUTCOMES.includes(outcome)) {
|
|
536
|
-
|
|
537
|
-
ok: false,
|
|
538
|
-
failure: badResult(`'outcome' tiene que ser uno de: ${CAPABILITY_OUTCOMES.join(", ")} — una confirmación booleana o una narración no son un resultado`),
|
|
539
|
-
};
|
|
649
|
+
add(badResult(`'outcome' tiene que ser uno de: ${CAPABILITY_OUTCOMES.join(", ")} — una confirmación booleana o una narración no son un resultado`), "outcome", CAPABILITY_OUTCOMES.join(" | "), outcome);
|
|
540
650
|
}
|
|
541
651
|
const invocation = readInvocation(body.invocation);
|
|
542
652
|
if (invocation === null) {
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
action: "devolvé 'invocation' con el programa, los argumentos y el target que corriste: sin eso, nada distingue una ejecución de una afirmación",
|
|
549
|
-
},
|
|
550
|
-
};
|
|
653
|
+
add({
|
|
654
|
+
code: "FLOW_RESULT_INVALID",
|
|
655
|
+
message: `el resultado no declara la invocación que se ejecutó: invocation espera {program: string, args: string[], target: string, input: string|null}; recibió ${Array.isArray(body.invocation) ? "lista" : typeof body.invocation}`,
|
|
656
|
+
action: "devolvé 'invocation' con el programa, los argumentos y el target que corriste: sin eso, nada distingue una ejecución de una afirmación",
|
|
657
|
+
}, "invocation", "{program, args, target, input}", body.invocation);
|
|
551
658
|
}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
failure: {
|
|
659
|
+
else {
|
|
660
|
+
const mismatch = invocationMismatch(action.invocation, invocation);
|
|
661
|
+
if (mismatch !== null)
|
|
662
|
+
add({
|
|
557
663
|
code: "FLOW_ACTION_MISMATCH",
|
|
558
664
|
message: `el resultado corresponde a otra invocación: ${mismatch}`,
|
|
559
665
|
action: `ejecutá exactamente '${[action.invocation.program, ...action.invocation.args].join(" ")}' en ${action.invocation.target} y devolvé su resultado`,
|
|
560
|
-
},
|
|
561
|
-
};
|
|
666
|
+
}, "invocation", "invocación sellada", body.invocation);
|
|
562
667
|
}
|
|
563
|
-
const read = readValidations(body.validations);
|
|
668
|
+
const read = readValidations(body.validations, action.evidence);
|
|
564
669
|
if (!read.ok) {
|
|
565
|
-
|
|
566
|
-
// proof is the proof's, and only a container breaking its own shape is the
|
|
567
|
-
// envelope's. Reserving FLOW_RESULT_INVALID for the latter is the point.
|
|
568
|
-
return {
|
|
569
|
-
ok: false,
|
|
570
|
-
failure: read.defect !== null
|
|
571
|
-
? proofShapeFailure(read.defect)
|
|
572
|
-
: badResult(badValidations(body.validations, action.evidence)),
|
|
573
|
-
};
|
|
670
|
+
issues.push(...read.issues);
|
|
574
671
|
}
|
|
575
|
-
const
|
|
576
|
-
const effects = readLedger(body.effects);
|
|
672
|
+
const effects = readLedger(body.effects, outcome === "completed" ? effectsOf(input.decision) : []);
|
|
577
673
|
if (effects === null) {
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
674
|
+
const ledger = body.effects;
|
|
675
|
+
const field = isRecord(ledger) && ledger.applied !== undefined ? "effects.applied" : "effects";
|
|
676
|
+
const unknown = isRecord(ledger) && Array.isArray(ledger.applied)
|
|
677
|
+
? ledger.applied.find((effect) => !isEffectClass(effect))
|
|
678
|
+
: undefined;
|
|
679
|
+
add(badResult(unknown === undefined
|
|
680
|
+
? "'effects' tiene que traer el registro planned/approved/applied del resultado"
|
|
681
|
+
: `'effects.applied' trae la clase ${JSON.stringify(unknown)}; las válidas son ${EFFECT_CLASSES.join(", ")}`), field, "{planned: EffectClass[], approved: EffectClass[], applied: EffectClass[]}", field === "effects" ? ledger : ledger.applied);
|
|
582
682
|
}
|
|
583
683
|
const output = readOutput(body.output);
|
|
584
684
|
if (output === undefined) {
|
|
585
|
-
|
|
685
|
+
add(badResult("'output' tiene que ser un OperationOutput o null"), "output", "OperationOutput | null", body.output);
|
|
586
686
|
}
|
|
687
|
+
if (issues.length > 0)
|
|
688
|
+
return { ok: false, failure: collected(issues) };
|
|
587
689
|
return {
|
|
588
690
|
ok: true,
|
|
589
691
|
answer: {
|
|
@@ -591,7 +693,13 @@ function executionAnswer(body, input) {
|
|
|
591
693
|
signals: [],
|
|
592
694
|
decisions: {},
|
|
593
695
|
choice: null,
|
|
594
|
-
result: {
|
|
696
|
+
result: {
|
|
697
|
+
outcome: outcome,
|
|
698
|
+
invocation: invocation,
|
|
699
|
+
output: output,
|
|
700
|
+
validations: read.ok ? read.validations : [],
|
|
701
|
+
effects: effects,
|
|
702
|
+
},
|
|
595
703
|
artifacts: EMPTY,
|
|
596
704
|
},
|
|
597
705
|
};
|
|
@@ -652,12 +760,12 @@ function badValidations(value, evidence) {
|
|
|
652
760
|
const keys = Object.keys(entry);
|
|
653
761
|
const seen = keys.length > 0 ? ` (trae: ${keys.join(", ")})` : " (viene vacía)";
|
|
654
762
|
if (typeof entry.id !== "string")
|
|
655
|
-
return `la validación ${index + 1} no trae 'id'${seen}`;
|
|
763
|
+
return `la validación ${index + 1} no trae 'id': validations[${index}].id espera string; recibió ${typeof entry.id}${seen}`;
|
|
656
764
|
if (typeof entry.passed !== "boolean") {
|
|
657
|
-
return `
|
|
765
|
+
return `validations[${index}].passed espera boolean; recibió ${typeof entry.passed}${seen}`;
|
|
658
766
|
}
|
|
659
767
|
if (entry.detail !== undefined && entry.detail !== null && typeof entry.detail !== "string") {
|
|
660
|
-
return `
|
|
768
|
+
return `validations[${index}].detail espera string o null; recibió ${typeof entry.detail}: ahí va la salida real del comando`;
|
|
661
769
|
}
|
|
662
770
|
}
|
|
663
771
|
return `'validations' tiene que ser ${shape}`;
|
|
@@ -669,7 +777,7 @@ function invocationMismatch(sealed, ran) {
|
|
|
669
777
|
if (sealed.args.length !== ran.args.length || sealed.args.some((arg, i) => arg !== ran.args[i])) {
|
|
670
778
|
return `argumentos '${ran.args.join(" ")}' en vez de '${sealed.args.join(" ")}'`;
|
|
671
779
|
}
|
|
672
|
-
if (sealed.target !== ran.target)
|
|
780
|
+
if (resolve(sealed.target) !== resolve(ran.target))
|
|
673
781
|
return `target '${ran.target}' en vez de '${sealed.target}'`;
|
|
674
782
|
if ((sealed.input ?? null) !== (ran.input ?? null))
|
|
675
783
|
return "otro input";
|
|
@@ -689,31 +797,58 @@ function readInvocation(value) {
|
|
|
689
797
|
return null;
|
|
690
798
|
return { program: value.program, args: value.args, target: value.target, input };
|
|
691
799
|
}
|
|
692
|
-
function readValidations(value) {
|
|
800
|
+
function readValidations(value, evidence) {
|
|
693
801
|
if (value === undefined)
|
|
694
802
|
return { ok: true, validations: [] };
|
|
803
|
+
const bad = () => badResult(badValidations(value, evidence));
|
|
695
804
|
if (!Array.isArray(value))
|
|
696
|
-
return {
|
|
805
|
+
return {
|
|
806
|
+
ok: false,
|
|
807
|
+
issues: [violation(bad(), "validations", "lista de {id, passed, detail}", value)],
|
|
808
|
+
};
|
|
697
809
|
const out = [];
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
810
|
+
const issues = [];
|
|
811
|
+
const add = (failure, field, expected, received) => {
|
|
812
|
+
issues.push(violation(failure, field, expected, received));
|
|
813
|
+
};
|
|
814
|
+
for (const [index, entry] of value.entries()) {
|
|
815
|
+
if (!isRecord(entry)) {
|
|
816
|
+
add(bad(), `validations[${index}]`, "{id, passed, detail}", entry);
|
|
817
|
+
continue;
|
|
818
|
+
}
|
|
819
|
+
const field = `validations[${index}]`;
|
|
820
|
+
if (typeof entry.id !== "string") {
|
|
821
|
+
add(bad(), `${field}.id`, "string", entry.id);
|
|
822
|
+
}
|
|
823
|
+
if (typeof entry.passed !== "boolean") {
|
|
824
|
+
add(bad(), `${field}.passed`, "boolean", entry.passed);
|
|
703
825
|
}
|
|
704
826
|
const detail = entry.detail === undefined ? null : entry.detail;
|
|
705
|
-
if (detail !== null && typeof detail !== "string")
|
|
706
|
-
|
|
707
|
-
|
|
827
|
+
if (detail !== null && typeof detail !== "string") {
|
|
828
|
+
add(bad(), `${field}.detail`, "string | null", detail);
|
|
829
|
+
}
|
|
830
|
+
if (entry.proof === undefined || entry.proof === null) {
|
|
831
|
+
if (typeof entry.id !== "string" ||
|
|
832
|
+
typeof entry.passed !== "boolean" ||
|
|
833
|
+
(detail !== null && typeof detail !== "string"))
|
|
834
|
+
continue;
|
|
708
835
|
out.push({ id: entry.id, passed: entry.passed, detail });
|
|
709
836
|
continue;
|
|
710
837
|
}
|
|
711
838
|
const read = readCheckoutProof(entry.proof);
|
|
712
|
-
if (!read.ok)
|
|
713
|
-
|
|
839
|
+
if (!read.ok) {
|
|
840
|
+
const failure = proofShapeFailure(read.defect);
|
|
841
|
+
const suffix = read.defect.where === "proof" ? "" : `.${read.defect.where}`;
|
|
842
|
+
add(failure, `${field}.proof${suffix}`, read.defect.expected.join(" | "), entry.proof);
|
|
843
|
+
continue;
|
|
844
|
+
}
|
|
845
|
+
if (typeof entry.id !== "string" ||
|
|
846
|
+
typeof entry.passed !== "boolean" ||
|
|
847
|
+
(detail !== null && typeof detail !== "string"))
|
|
848
|
+
continue;
|
|
714
849
|
out.push({ id: entry.id, passed: entry.passed, detail, proof: read.proof });
|
|
715
850
|
}
|
|
716
|
-
return { ok: true, validations: out };
|
|
851
|
+
return issues.length === 0 ? { ok: true, validations: out } : { ok: false, issues };
|
|
717
852
|
}
|
|
718
853
|
/** The fields each `kind` demands of its `invocation`, named once. */
|
|
719
854
|
const PROOF_INVOCATION_FIELDS = {
|
|
@@ -818,17 +953,17 @@ function proofShapeFailure(defect) {
|
|
|
818
953
|
? `el 'proof' de kind '${defect.kind}' trae una 'invocation' que ese kind no acepta: espera ${defect.expected.join(", ")} y ${received}`
|
|
819
954
|
: `el 'proof' de kind '${defect.kind ?? "(ausente)"}' no satisface la forma de su kind: espera ${defect.expected.join(", ")} (${received})`;
|
|
820
955
|
return {
|
|
821
|
-
code: "
|
|
956
|
+
code: "WORKLINE_CHECKOUT_PROOF_SHAPE_INVALID",
|
|
822
957
|
message,
|
|
823
958
|
action: "corregí el 'proof' anidado, no la lista 'validations': un kind 'command' pide {program, args} y un 'inspection' pide {artifact} — sin 'target' ni 'input', aunque la directiva los traiga. 'aw flow prove' lo produce ya bien formado y sin gastar intento",
|
|
824
959
|
};
|
|
825
960
|
}
|
|
826
|
-
function readLedger(value) {
|
|
961
|
+
function readLedger(value, defaultApplied = []) {
|
|
827
962
|
if (!isRecord(value))
|
|
828
963
|
return null;
|
|
829
964
|
const planned = readEffectClasses(value.planned);
|
|
830
965
|
const approved = readEffectClasses(value.approved);
|
|
831
|
-
const applied = readEffectClasses(value.applied);
|
|
966
|
+
const applied = value.applied === undefined ? [...defaultApplied] : readEffectClasses(value.applied);
|
|
832
967
|
if (planned === null || approved === null || applied === null)
|
|
833
968
|
return null;
|
|
834
969
|
return { planned, approved, applied };
|