sneakoscope 2.0.14 → 2.0.15
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/README.md +6 -3
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/crates/sks-core/src/main.rs +1 -1
- package/dist/.sks-build-stamp.json +4 -4
- package/dist/bin/sks.js +1 -1
- package/dist/cli/command-registry.js +1 -0
- package/dist/commands/mad-db.js +5 -0
- package/dist/commands/zellij-slot-pane.js +3 -1
- package/dist/core/agents/agent-plan.js +3 -2
- package/dist/core/agents/native-cli-session-swarm.js +118 -0
- package/dist/core/agents/native-cli-worker.js +85 -0
- package/dist/core/commands/basic-cli.js +1 -1
- package/dist/core/commands/command-suggestions.js +1 -1
- package/dist/core/commands/mad-db-command.js +106 -0
- package/dist/core/commands/mad-sks-command.js +50 -13
- package/dist/core/commands/naruto-command.js +81 -1
- package/dist/core/commands/research-command.js +13 -1
- package/dist/core/commands/team-command.js +25 -1
- package/dist/core/db-safety.js +26 -0
- package/dist/core/fsx.js +1 -1
- package/dist/core/mad-db/mad-db-capability.js +84 -0
- package/dist/core/mad-db/mad-db-ledger.js +17 -0
- package/dist/core/mad-db/mad-db-policy-resolver.js +46 -0
- package/dist/core/pipeline-internals/runtime-core.js +74 -8
- package/dist/core/pipeline-internals/runtime-gates.js +44 -0
- package/dist/core/proof/route-proof-gate.js +5 -3
- package/dist/core/proof/route-proof-policy.js +9 -1
- package/dist/core/release/release-gate-affected-selector.js +113 -0
- package/dist/core/release/release-gate-batch-runner.js +67 -0
- package/dist/core/release/release-gate-dag.js +22 -3
- package/dist/core/release/release-gate-resource-governor.js +23 -11
- package/dist/core/research/implementation-blueprint-densifier.js +1 -1
- package/dist/core/research/implementation-blueprint-markdown.js +1 -1
- package/dist/core/research/implementation-blueprint.js +68 -7
- package/dist/core/research/research-final-reviewer.js +27 -1
- package/dist/core/research/research-handoff.js +69 -5
- package/dist/core/research/research-realistic-report.js +162 -0
- package/dist/core/research/research-repetition-detector.js +75 -0
- package/dist/core/research/research-report-quality.js +27 -5
- package/dist/core/research/research-stage-runner.js +40 -13
- package/dist/core/research/research-synthesis-prompt.js +52 -0
- package/dist/core/research/research-synthesis-writer.js +208 -0
- package/dist/core/research.js +60 -48
- package/dist/core/routes.js +23 -19
- package/dist/core/update/update-notice.js +120 -0
- package/dist/core/version.js +1 -1
- package/dist/core/zellij/zellij-dashboard-renderer.js +2 -0
- package/dist/core/zellij/zellij-slot-column-anchor.js +35 -1
- package/dist/core/zellij/zellij-slot-pane-renderer.js +57 -0
- package/dist/core/zellij/zellij-slot-telemetry.js +182 -0
- package/dist/scripts/release-gate-dag-runner.js +5 -0
- package/dist/scripts/release-speed-summary.js +25 -0
- package/package.json +52 -5
- package/schemas/mad-db/mad-db-capability.schema.json +31 -0
- package/schemas/mad-db/mad-db-ledger.schema.json +14 -0
- package/schemas/research/implementation-blueprint.schema.json +6 -1
- package/schemas/research/research-final-review.schema.json +10 -0
- package/schemas/research/research-synthesis-output.schema.json +62 -0
- package/schemas/update/update-notice.schema.json +19 -0
- package/schemas/zellij/zellij-slot-telemetry.schema.json +89 -0
- package/dist/scripts/agent-ast-aware-work-graph-check.js +0 -25
- package/dist/scripts/agent-backfill-replenishment-check.js +0 -13
- package/dist/scripts/agent-backfill-route-blackbox.js +0 -5
- package/dist/scripts/agent-background-terminals-check.js +0 -16
- package/dist/scripts/agent-cleanup-command-ux-check.js +0 -12
- package/dist/scripts/agent-cleanup-executor-check.js +0 -53
- package/dist/scripts/agent-cleanup-executor-v2-check.js +0 -39
- package/dist/scripts/agent-cli-options-to-task-graph-check.js +0 -5
- package/dist/scripts/agent-codex-app-cockpit-check.js +0 -91
- package/dist/scripts/agent-codex-child-overlap-check.js +0 -21
- package/dist/scripts/agent-dynamic-cockpit-check.js +0 -10
- package/dist/scripts/agent-dynamic-pool-check.js +0 -13
- package/dist/scripts/agent-dynamic-pool-route-blackbox.js +0 -5
- package/dist/scripts/agent-fast-mode-default-check.js +0 -62
- package/dist/scripts/agent-fast-mode-worker-propagation-check.js +0 -7
- package/dist/scripts/agent-follow-up-work-schema-check.js +0 -80
- package/dist/scripts/agent-goal-mode-propagation-check.js +0 -9
- package/dist/scripts/agent-intelligent-work-graph-check.js +0 -25
- package/dist/scripts/agent-janitor-check.js +0 -76
- package/dist/scripts/agent-main-no-scout-check.js +0 -11
- package/dist/scripts/agent-model-authored-patch-envelope-check.js +0 -15
- package/dist/scripts/agent-multi-project-isolation-check.js +0 -86
- package/dist/scripts/agent-native-cli-session-proof-check.js +0 -7
- package/dist/scripts/agent-native-cli-session-swarm-10-check.js +0 -7
- package/dist/scripts/agent-native-cli-session-swarm-20-check.js +0 -7
- package/dist/scripts/agent-native-cli-session-swarm-check.js +0 -7
- package/dist/scripts/agent-no-subagent-scaling-check.js +0 -7
- package/dist/scripts/agent-parallel-write-blackbox.js +0 -56
- package/dist/scripts/agent-parallel-write-kernel-check.js +0 -103
- package/dist/scripts/agent-patch-conflict-rebase-check.js +0 -198
- package/dist/scripts/agent-patch-envelope-extraction-check.js +0 -17
- package/dist/scripts/agent-patch-proof-check.js +0 -41
- package/dist/scripts/agent-patch-proof-runtime-check.js +0 -63
- package/dist/scripts/agent-patch-queue-runtime-check.js +0 -36
- package/dist/scripts/agent-patch-rollback-check.js +0 -38
- package/dist/scripts/agent-patch-rollback-dag-check.js +0 -14
- package/dist/scripts/agent-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/agent-patch-swarm-runtime-check.js +0 -10
- package/dist/scripts/agent-patch-swarm-runtime-truth-check.js +0 -76
- package/dist/scripts/agent-patch-transaction-journal-check.js +0 -57
- package/dist/scripts/agent-patch-verification-dag-check.js +0 -14
- package/dist/scripts/agent-proof-contract-reconciled-check.js +0 -5
- package/dist/scripts/agent-real-codex-dynamic-smoke-check.js +0 -166
- package/dist/scripts/agent-real-codex-dynamic-smoke-v2-check.js +0 -14
- package/dist/scripts/agent-real-codex-in-zellij-worker-pane-check.js +0 -229
- package/dist/scripts/agent-real-codex-parallel-workers-10-check.js +0 -5
- package/dist/scripts/agent-real-codex-parallel-workers-20-check.js +0 -5
- package/dist/scripts/agent-real-codex-parallel-workers-5-check.js +0 -5
- package/dist/scripts/agent-real-codex-parallel-workers-check.js +0 -5
- package/dist/scripts/agent-role-config-repair-check.js +0 -33
- package/dist/scripts/agent-rollback-command-check.js +0 -86
- package/dist/scripts/agent-route-truth-backfill-check.js +0 -5
- package/dist/scripts/agent-scheduler-proof-check.js +0 -13
- package/dist/scripts/agent-scheduler-proof-hardening-check.js +0 -22
- package/dist/scripts/agent-session-generation-check.js +0 -21
- package/dist/scripts/agent-slot-pane-binding-proof-check.js +0 -64
- package/dist/scripts/agent-source-intelligence-propagation-check.js +0 -9
- package/dist/scripts/agent-strategy-to-lease-wiring-check.js +0 -32
- package/dist/scripts/agent-strategy-to-patch-strict-check.js +0 -54
- package/dist/scripts/agent-task-graph-expansion-check.js +0 -14
- package/dist/scripts/agent-terminal-generations-check.js +0 -23
- package/dist/scripts/agent-visual-consistency-check.js +0 -9
- package/dist/scripts/agent-wiki-context-proof-check.js +0 -62
- package/dist/scripts/agent-worker-backend-router-check.js +0 -63
- package/dist/scripts/agent-worker-scout-limited-check.js +0 -17
- package/dist/scripts/agent-zellij-dynamic-backfill-panes-check.js +0 -34
- package/dist/scripts/agent-zellij-runtime-check.js +0 -84
- package/dist/scripts/all-feature-deep-completion-check.js +0 -31
- package/dist/scripts/appshots-capability-check.js +0 -18
- package/dist/scripts/appshots-evidence-check.js +0 -48
- package/dist/scripts/appshots-operator-policy-check.js +0 -25
- package/dist/scripts/appshots-privacy-safety-check.js +0 -48
- package/dist/scripts/appshots-source-intelligence-check.js +0 -53
- package/dist/scripts/appshots-thread-attachment-discovery-check.js +0 -87
- package/dist/scripts/appshots-triwiki-voxel-check.js +0 -46
- package/dist/scripts/architecture-guard-check.js +0 -55
- package/dist/scripts/changelog-check.js +0 -47
- package/dist/scripts/codex-0-133-official-compat-report.js +0 -53
- package/dist/scripts/codex-0-134-official-compat-report.js +0 -110
- package/dist/scripts/codex-0-134-runner-truth-check.js +0 -66
- package/dist/scripts/codex-0-135-compat-check.js +0 -57
- package/dist/scripts/codex-0-136-compat-check.js +0 -30
- package/dist/scripts/codex-0-137-compat-check.js +0 -27
- package/dist/scripts/codex-app-fast-ui-preservation-check.js +0 -32
- package/dist/scripts/codex-app-provider-badge-check.js +0 -37
- package/dist/scripts/codex-app-ui-clobber-guard-check.js +0 -22
- package/dist/scripts/codex-app-ui-preservation-check.js +0 -96
- package/dist/scripts/codex-control-all-pipelines-check.js +0 -36
- package/dist/scripts/codex-control-capability-check.js +0 -10
- package/dist/scripts/codex-control-empty-result-retry-check.js +0 -43
- package/dist/scripts/codex-control-event-stream-ledger-check.js +0 -10
- package/dist/scripts/codex-control-keepalive-no-cot-leak-check.js +0 -14
- package/dist/scripts/codex-control-no-legacy-fallback-check.js +0 -31
- package/dist/scripts/codex-control-side-effect-scope-check.js +0 -26
- package/dist/scripts/codex-control-stream-idle-watchdog-check.js +0 -18
- package/dist/scripts/codex-control-structured-output-check.js +0 -11
- package/dist/scripts/codex-control-thread-registry-check.js +0 -11
- package/dist/scripts/codex-control-tool-call-sequence-repair-check.js +0 -14
- package/dist/scripts/codex-environment-scoped-approvals-check.js +0 -10
- package/dist/scripts/codex-exec-output-schema-actual-syntax-check.js +0 -33
- package/dist/scripts/codex-fast-mode-profile-propagation-check.js +0 -12
- package/dist/scripts/codex-history-search-check.js +0 -19
- package/dist/scripts/codex-hook-semantic-check.js +0 -15
- package/dist/scripts/codex-hook-strict-subset-check.js +0 -61
- package/dist/scripts/codex-lb-config-toml-safety-check.js +0 -85
- package/dist/scripts/codex-lb-persistence-truth-check.js +0 -96
- package/dist/scripts/codex-lb-setup-fixture-check.js +0 -91
- package/dist/scripts/codex-lb-setup-truthfulness-check.js +0 -84
- package/dist/scripts/codex-legacy-profile-consumers-removed-check.js +0 -24
- package/dist/scripts/codex-managed-proxy-env-check.js +0 -17
- package/dist/scripts/codex-output-schema-fixture-check.js +0 -25
- package/dist/scripts/codex-permission-profiles-check.js +0 -36
- package/dist/scripts/codex-plugin-list-json-check.js +0 -8
- package/dist/scripts/codex-profile-primary-check.js +0 -13
- package/dist/scripts/codex-project-config-policy-splitter-check.js +0 -51
- package/dist/scripts/codex-resume-cwd-truth-check.js +0 -17
- package/dist/scripts/codex-sdk-all-pipelines-check.js +0 -32
- package/dist/scripts/codex-sdk-backend-router-check.js +0 -65
- package/dist/scripts/codex-sdk-capability-check.js +0 -11
- package/dist/scripts/codex-sdk-core-skill-pipeline-check.js +0 -9
- package/dist/scripts/codex-sdk-dfix-pipeline-check.js +0 -9
- package/dist/scripts/codex-sdk-event-stream-ledger-check.js +0 -9
- package/dist/scripts/codex-sdk-no-legacy-fallback-check.js +0 -33
- package/dist/scripts/codex-sdk-qa-pipeline-check.js +0 -8
- package/dist/scripts/codex-sdk-real-smoke-check.js +0 -39
- package/dist/scripts/codex-sdk-release-review-pipeline-check.js +0 -13
- package/dist/scripts/codex-sdk-research-pipeline-check.js +0 -47
- package/dist/scripts/codex-sdk-sandbox-policy-check.js +0 -21
- package/dist/scripts/codex-sdk-structured-output-check.js +0 -10
- package/dist/scripts/codex-sdk-team-naruto-agent-pipeline-check.js +0 -12
- package/dist/scripts/codex-sdk-thread-registry-check.js +0 -11
- package/dist/scripts/codex-sdk-ux-ppt-review-pipeline-check.js +0 -9
- package/dist/scripts/codex-sdk-zellij-pane-binding-check.js +0 -13
- package/dist/scripts/codex-thread-runtime-choice-check.js +0 -10
- package/dist/scripts/codex-web-adapter-check.js +0 -12
- package/dist/scripts/computer-use-live-evidence-check.js +0 -55
- package/dist/scripts/computer-use-live-optional-check.js +0 -32
- package/dist/scripts/computer-use-policy-check.js +0 -69
- package/dist/scripts/computer-use-visual-route-fixture-check.js +0 -37
- package/dist/scripts/core-skill-card-schema-check.js +0 -61
- package/dist/scripts/core-skill-deployment-snapshot-check.js +0 -54
- package/dist/scripts/core-skill-heldout-validation-check.js +0 -49
- package/dist/scripts/core-skill-no-inference-optimizer-check.js +0 -75
- package/dist/scripts/core-skill-patch-check.js +0 -79
- package/dist/scripts/core-skill-promotion-side-effect-ledger-check.js +0 -64
- package/dist/scripts/core-skill-rollout-scoring-check.js +0 -72
- package/dist/scripts/core-skill-route-runtime-integration-check.js +0 -49
- package/dist/scripts/dfix-fast-blackbox-check.js +0 -37
- package/dist/scripts/dfix-fast-kernel-check.js +0 -26
- package/dist/scripts/dfix-fixture-check.js +0 -6
- package/dist/scripts/dfix-parallel-write-blackbox.js +0 -48
- package/dist/scripts/dfix-patch-handoff-check.js +0 -13
- package/dist/scripts/dfix-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/dfix-performance-check.js +0 -15
- package/dist/scripts/dfix-verification-check.js +0 -9
- package/dist/scripts/dfix-verification-recommendation-check.js +0 -15
- package/dist/scripts/docs-truthfulness-check.js +0 -61
- package/dist/scripts/doctor-codex-doctor-parity-check.js +0 -17
- package/dist/scripts/doctor-fix-proves-codex-read-check.js +0 -64
- package/dist/scripts/doctor-fix-recovers-corrupted-config-check.js +0 -122
- package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +0 -39
- package/dist/scripts/evidence-fixture-check.js +0 -26
- package/dist/scripts/evidence-flagship-coverage-check.js +0 -55
- package/dist/scripts/fake-real-proof-policy-v2-check.js +0 -27
- package/dist/scripts/fake-vs-real-proof-policy-check.js +0 -14
- package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -42
- package/dist/scripts/flagship-proof-graph-v2-check.js +0 -48
- package/dist/scripts/flagship-proof-graph-v3-check.js +0 -67
- package/dist/scripts/flagship-proof-graph-v4-check.js +0 -61
- package/dist/scripts/git-precommit-fixture-check.js +0 -41
- package/dist/scripts/git-worktree-cache-performance-check.js +0 -25
- package/dist/scripts/git-worktree-capability-check.js +0 -27
- package/dist/scripts/git-worktree-checkpoint-check.js +0 -20
- package/dist/scripts/git-worktree-cleanup-check.js +0 -27
- package/dist/scripts/git-worktree-cross-rebase-check.js +0 -39
- package/dist/scripts/git-worktree-diff-envelope-check.js +0 -17
- package/dist/scripts/git-worktree-diff-export-check.js +0 -43
- package/dist/scripts/git-worktree-dirty-lock-check.js +0 -17
- package/dist/scripts/git-worktree-dirty-main-detection-check.js +0 -14
- package/dist/scripts/git-worktree-integration-primary-check.js +0 -24
- package/dist/scripts/git-worktree-integration-primary-runtime-check.js +0 -20
- package/dist/scripts/git-worktree-manager-check.js +0 -37
- package/dist/scripts/git-worktree-manifest-append-check.js +0 -18
- package/dist/scripts/git-worktree-merge-queue-check.js +0 -31
- package/dist/scripts/git-worktree-pool-performance-check.js +0 -20
- package/dist/scripts/git-worktree-untracked-diff-check.js +0 -18
- package/dist/scripts/goal-mode-official-default-check.js +0 -12
- package/dist/scripts/gpt-final-arbiter-check.js +0 -63
- package/dist/scripts/gpt-final-arbiter-performance-check.js +0 -36
- package/dist/scripts/gpt-image-2-request-validator-check.js +0 -35
- package/dist/scripts/hooks-0.134-context-parity-check.js +0 -20
- package/dist/scripts/hooks-actual-parity-check.js +0 -17
- package/dist/scripts/hooks-actual-parity-v2-check.js +0 -21
- package/dist/scripts/hooks-latest-schema-check.js +0 -20
- package/dist/scripts/hooks-managed-install-fixture-check.js +0 -21
- package/dist/scripts/hooks-official-hash-oracle-check.js +0 -35
- package/dist/scripts/hooks-official-hash-parity-check.js +0 -17
- package/dist/scripts/hooks-subagent-events-check.js +0 -17
- package/dist/scripts/hooks-trust-state-check.js +0 -14
- package/dist/scripts/image-fidelity-fixture-check.js +0 -24
- package/dist/scripts/imagegen-capability-check.js +0 -30
- package/dist/scripts/imagegen-real-smoke-check.js +0 -155
- package/dist/scripts/install-update-preserves-config-check.js +0 -87
- package/dist/scripts/json-schema-recursive-check.js +0 -78
- package/dist/scripts/legacy-multiagent-removal-check.js +0 -85
- package/dist/scripts/legacy-upgrade-matrix-check.js +0 -300
- package/dist/scripts/local-collab-all-pipelines-final-gpt-check.js +0 -21
- package/dist/scripts/local-collab-gpt-final-availability-check.js +0 -58
- package/dist/scripts/local-collab-no-local-only-final-check.js +0 -27
- package/dist/scripts/local-collab-policy-check.js +0 -17
- package/dist/scripts/local-collab-worktree-gpt-final-apply-policy-check.js +0 -63
- package/dist/scripts/local-llm-all-pipelines-check.js +0 -11
- package/dist/scripts/local-llm-cache-performance-check.js +0 -10
- package/dist/scripts/local-llm-capability-check.js +0 -14
- package/dist/scripts/local-llm-smoke-check.js +0 -23
- package/dist/scripts/local-llm-structured-output-check.js +0 -11
- package/dist/scripts/local-llm-throughput-check.js +0 -10
- package/dist/scripts/local-llm-tool-call-repair-check.js +0 -10
- package/dist/scripts/local-llm-warmup-check.js +0 -11
- package/dist/scripts/loop-blocker-check.js +0 -15
- package/dist/scripts/mad-preflight-blocks-unreadable-config-check.js +0 -35
- package/dist/scripts/mad-sks-actual-executor-blackbox.js +0 -5
- package/dist/scripts/mad-sks-app-ui-no-mutation-check.js +0 -92
- package/dist/scripts/mad-sks-audit-proof-check.js +0 -34
- package/dist/scripts/mad-sks-db-executor-check.js +0 -5
- package/dist/scripts/mad-sks-executor-proof-graph-check.js +0 -5
- package/dist/scripts/mad-sks-fast-mode-propagation-check.js +0 -24
- package/dist/scripts/mad-sks-file-write-executor-check.js +0 -5
- package/dist/scripts/mad-sks-immutable-harness-check.js +0 -36
- package/dist/scripts/mad-sks-no-harness-modification-check.js +0 -25
- package/dist/scripts/mad-sks-package-executor-check.js +0 -5
- package/dist/scripts/mad-sks-permission-model-check.js +0 -22
- package/dist/scripts/mad-sks-rollback-apply-check.js +0 -5
- package/dist/scripts/mad-sks-service-executor-check.js +0 -5
- package/dist/scripts/mad-sks-shell-executor-check.js +0 -5
- package/dist/scripts/mad-sks-write-guard-check.js +0 -28
- package/dist/scripts/mad-sks-zellij-default-pane-worker-check.js +0 -37
- package/dist/scripts/mad-sks-zellij-launch-check.js +0 -102
- package/dist/scripts/mcp-0-134-modernization-check.js +0 -55
- package/dist/scripts/mcp-readonly-concurrency-check.js +0 -17
- package/dist/scripts/mcp-readonly-runtime-scheduler-check.js +0 -20
- package/dist/scripts/mcp-tool-naming-parity-check.js +0 -16
- package/dist/scripts/memory-summary-rebuild-check.js +0 -22
- package/dist/scripts/mutation-callsite-coverage-check.js +0 -180
- package/dist/scripts/naruto-active-pool-check.js +0 -39
- package/dist/scripts/naruto-actual-worker-control-plane-check.js +0 -56
- package/dist/scripts/naruto-allocation-policy-check.js +0 -33
- package/dist/scripts/naruto-allocation-runtime-wiring-check.js +0 -92
- package/dist/scripts/naruto-concurrency-governor-check.js +0 -53
- package/dist/scripts/naruto-extreme-parallelism-check.js +0 -22
- package/dist/scripts/naruto-extreme-parallelism-real-check.js +0 -43
- package/dist/scripts/naruto-gpt-final-pack-check.js +0 -34
- package/dist/scripts/naruto-orchestrator-runtime-source-check.js +0 -70
- package/dist/scripts/naruto-parallel-patch-apply-check.js +0 -41
- package/dist/scripts/naruto-readonly-routing-check.js +0 -116
- package/dist/scripts/naruto-real-active-pool-check.js +0 -39
- package/dist/scripts/naruto-real-active-pool-runtime-check.js +0 -55
- package/dist/scripts/naruto-rebalance-policy-check.js +0 -41
- package/dist/scripts/naruto-role-distribution-check.js +0 -23
- package/dist/scripts/naruto-shadow-clone-swarm-check.js +0 -153
- package/dist/scripts/naruto-verification-pool-check.js +0 -36
- package/dist/scripts/naruto-work-graph-check.js +0 -24
- package/dist/scripts/naruto-worktree-coding-blackbox.js +0 -29
- package/dist/scripts/naruto-worktree-coding-check.js +0 -44
- package/dist/scripts/naruto-worktree-gpt-final-check.js +0 -45
- package/dist/scripts/naruto-worktree-zellij-ui-check.js +0 -28
- package/dist/scripts/naruto-zellij-dynamic-right-column-check.js +0 -48
- package/dist/scripts/naruto-zellij-massive-ui-check.js +0 -23
- package/dist/scripts/non-recursive-pipeline-check.js +0 -68
- package/dist/scripts/npm-publish-performance-check.js +0 -65
- package/dist/scripts/official-docs-compat-report.js +0 -304
- package/dist/scripts/packlist-performance-check.js +0 -83
- package/dist/scripts/parallel-verification-engine-check.js +0 -85
- package/dist/scripts/postinstall-safe-side-effects-check.js +0 -65
- package/dist/scripts/ppt-full-e2e-artifact-graph-check.js +0 -40
- package/dist/scripts/ppt-full-e2e-blackbox-check.js +0 -109
- package/dist/scripts/ppt-image-voxel-relations-check.js +0 -9
- package/dist/scripts/ppt-imagegen-blackbox-check.js +0 -46
- package/dist/scripts/ppt-imagegen-review-fixture-check.js +0 -6
- package/dist/scripts/ppt-issue-extraction-fixture-check.js +0 -7
- package/dist/scripts/ppt-no-mock-as-real-check.js +0 -8
- package/dist/scripts/ppt-no-text-fallback-check.js +0 -7
- package/dist/scripts/ppt-proof-trust-fixture-check.js +0 -10
- package/dist/scripts/ppt-real-export-adapter-check.js +0 -13
- package/dist/scripts/ppt-real-imagegen-smoke-check.js +0 -42
- package/dist/scripts/ppt-real-imagegen-wiring-check.js +0 -16
- package/dist/scripts/ppt-reexport-rereview-check.js +0 -19
- package/dist/scripts/ppt-slide-export-fixture-check.js +0 -7
- package/dist/scripts/prepublish-fast-check.js +0 -128
- package/dist/scripts/priority-full-closure-check.js +0 -12
- package/dist/scripts/product-design-auto-install-check.js +0 -119
- package/dist/scripts/product-design-plugin-routing-check.js +0 -101
- package/dist/scripts/prompt-placeholder-guard-check.js +0 -33
- package/dist/scripts/provider-badge-context-check.js +0 -26
- package/dist/scripts/provider-context-config-toml-check.js +0 -63
- package/dist/scripts/python-codex-sdk-all-pipelines-check.js +0 -47
- package/dist/scripts/python-codex-sdk-capability-check.js +0 -75
- package/dist/scripts/python-codex-sdk-sandbox-policy-check.js +0 -10
- package/dist/scripts/python-codex-sdk-stream-bridge-check.js +0 -12
- package/dist/scripts/python-tools-smoke-check.js +0 -71
- package/dist/scripts/qa-actual-route-backfill-check.js +0 -5
- package/dist/scripts/qa-backfill-route-blackbox.js +0 -5
- package/dist/scripts/qa-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/readme-architecture-imagegen-official-check.js +0 -448
- package/dist/scripts/release-cache-glob-hashing-check.js +0 -42
- package/dist/scripts/release-dag-full-coverage-check.js +0 -66
- package/dist/scripts/release-dist-freshness-check.js +0 -8
- package/dist/scripts/release-dynamic-performance-check.js +0 -103
- package/dist/scripts/release-gate-budget-check.js +0 -36
- package/dist/scripts/release-gate-dag-runner-check.js +0 -17
- package/dist/scripts/release-metadata-1-11-check.js +0 -37
- package/dist/scripts/release-metadata-1-12-check.js +0 -48
- package/dist/scripts/release-metadata-1-13-check.js +0 -53
- package/dist/scripts/release-metadata-1-14-check.js +0 -63
- package/dist/scripts/release-metadata-1-16-check.js +0 -81
- package/dist/scripts/release-metadata-1-17-check.js +0 -51
- package/dist/scripts/release-metadata-1-19-check.js +0 -371
- package/dist/scripts/release-metadata-check.js +0 -7
- package/dist/scripts/release-native-agent-fixture-check.js +0 -41
- package/dist/scripts/release-parallel-check.js +0 -374
- package/dist/scripts/release-parallel-full-coverage-check.js +0 -13
- package/dist/scripts/release-parallel-speed-budget-check.js +0 -84
- package/dist/scripts/release-provenance-check.js +0 -150
- package/dist/scripts/release-real-check.js +0 -330
- package/dist/scripts/release-registry-check.js +0 -344
- package/dist/scripts/release-runtime-truth-matrix-check.js +0 -47
- package/dist/scripts/release-stability-report-check.js +0 -99
- package/dist/scripts/release-version-truth-check.js +0 -134
- package/dist/scripts/research-actual-route-backfill-check.js +0 -5
- package/dist/scripts/research-backfill-route-blackbox.js +0 -5
- package/dist/scripts/research-blueprint-densifier-check.js +0 -21
- package/dist/scripts/research-claim-builder-check.js +0 -19
- package/dist/scripts/research-complete-package-fixture-check.js +0 -23
- package/dist/scripts/research-final-reviewer-blackbox.js +0 -22
- package/dist/scripts/research-parallel-source-shards-check.js +0 -22
- package/dist/scripts/research-quality-gate-check.js +0 -111
- package/dist/scripts/research-real-cycle-no-legacy-final-md-check.js +0 -14
- package/dist/scripts/research-short-report-rejection-check.js +0 -46
- package/dist/scripts/research-source-ledger-merge-check.js +0 -26
- package/dist/scripts/research-stage-cycle-runtime-blackbox.js +0 -24
- package/dist/scripts/responses-retry-policy-centralized-check.js +0 -19
- package/dist/scripts/retention-cleanup-safety-check.js +0 -155
- package/dist/scripts/route-blackbox-realism-check.js +0 -21
- package/dist/scripts/route-proof-artifact-structure-check.js +0 -145
- package/dist/scripts/runtime-dist-parity-check.js +0 -78
- package/dist/scripts/runtime-no-mjs-scripts-check.js +0 -45
- package/dist/scripts/runtime-no-src-mjs-check.js +0 -32
- package/dist/scripts/runtime-no-tmux-check.js +0 -113
- package/dist/scripts/runtime-ts-python-boundary-check.js +0 -59
- package/dist/scripts/runtime-ts-rust-boundary-check.js +0 -74
- package/dist/scripts/runtime-ts-source-of-truth-check.js +0 -55
- package/dist/scripts/safety-check.js +0 -23
- package/dist/scripts/shared-memory-fixture-check.js +0 -27
- package/dist/scripts/side-effect-runtime-report-check.js +0 -19
- package/dist/scripts/side-effect-zero-gate-check.js +0 -226
- package/dist/scripts/sks-1-11-fixture-check.js +0 -130
- package/dist/scripts/source-intelligence-all-modes-check.js +0 -32
- package/dist/scripts/source-intelligence-policy-check.js +0 -13
- package/dist/scripts/strategy-adhd-orchestrating-gate-check.js +0 -22
- package/dist/scripts/strategy-file-ownership-plan-check.js +0 -18
- package/dist/scripts/strategy-parallel-modification-plan-check.js +0 -19
- package/dist/scripts/strategy-verification-rollback-dag-check.js +0 -19
- package/dist/scripts/team-actual-route-backfill-check.js +0 -5
- package/dist/scripts/team-backfill-route-blackbox.js +0 -5
- package/dist/scripts/team-parallel-write-blackbox.js +0 -55
- package/dist/scripts/team-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/terminal-keyboard-enhancement-safety-check.js +0 -12
- package/dist/scripts/terminal-tui-output-stability-check.js +0 -35
- package/dist/scripts/test-no-orphan-dist-imports-check.js +0 -73
- package/dist/scripts/trust-fixture-check.js +0 -33
- package/dist/scripts/typescript-migration-report.js +0 -78
- package/dist/scripts/ultra-router-auto-router-check.js +0 -33
- package/dist/scripts/ultra-router-classification-check.js +0 -28
- package/dist/scripts/ux-patch-swarm-route-blackbox.js +0 -10
- package/dist/scripts/ux-ppt-structured-extraction-check.js +0 -21
- package/dist/scripts/ux-review-extract-real-callouts-fixture-check.js +0 -8
- package/dist/scripts/ux-review-extract-wires-real-extractor-check.js +0 -15
- package/dist/scripts/ux-review-generate-callouts-fixture-check.js +0 -9
- package/dist/scripts/ux-review-image-voxel-relations-check.js +0 -31
- package/dist/scripts/ux-review-imagegen-blackbox-check.js +0 -67
- package/dist/scripts/ux-review-no-fake-callouts-check.js +0 -8
- package/dist/scripts/ux-review-no-text-fallback-check.js +0 -25
- package/dist/scripts/ux-review-patch-diff-recheck-check.js +0 -20
- package/dist/scripts/ux-review-patch-handoff-fixture-check.js +0 -8
- package/dist/scripts/ux-review-real-imagegen-smoke-check.js +0 -31
- package/dist/scripts/ux-review-real-loop-fixture-check.js +0 -24
- package/dist/scripts/ux-review-recapture-recheck-fixture-check.js +0 -8
- package/dist/scripts/ux-review-run-wires-imagegen-check.js +0 -11
- package/dist/scripts/worker-pane-communication-contract-check.js +0 -54
- package/dist/scripts/wrongness-fixture-check.js +0 -65
- package/dist/scripts/xai-mcp-capability-check.js +0 -14
- package/dist/scripts/zellij-capability-check.js +0 -15
- package/dist/scripts/zellij-dashboard-pane-check.js +0 -70
- package/dist/scripts/zellij-developer-controls-check.js +0 -20
- package/dist/scripts/zellij-doctor-readiness-check.js +0 -63
- package/dist/scripts/zellij-dynamic-pane-lifecycle-check.js +0 -21
- package/dist/scripts/zellij-first-slot-down-stack-check.js +0 -20
- package/dist/scripts/zellij-first-slot-down-stack-real-check.js +0 -356
- package/dist/scripts/zellij-initial-main-only-blackbox.js +0 -28
- package/dist/scripts/zellij-lane-renderer-check.js +0 -65
- package/dist/scripts/zellij-launch-command-truth-check.js +0 -75
- package/dist/scripts/zellij-layout-valid-check.js +0 -90
- package/dist/scripts/zellij-pane-proof-check.js +0 -59
- package/dist/scripts/zellij-real-session-cleanup-check.js +0 -21
- package/dist/scripts/zellij-real-session-heartbeat-check.js +0 -49
- package/dist/scripts/zellij-real-session-launch-check.js +0 -57
- package/dist/scripts/zellij-right-column-headless-overflow-check.js +0 -22
- package/dist/scripts/zellij-right-column-manager-check.js +0 -27
- package/dist/scripts/zellij-screen-proof-check.js +0 -45
- package/dist/scripts/zellij-slot-column-anchor-check.js +0 -66
- package/dist/scripts/zellij-slot-only-ui-check.js +0 -26
- package/dist/scripts/zellij-slot-pane-renderer-check.js +0 -106
- package/dist/scripts/zellij-slot-renderer-proof-semantics-check.js +0 -59
- package/dist/scripts/zellij-spawn-on-demand-layout-check.js +0 -40
- package/dist/scripts/zellij-ui-design-check.js +0 -105
- package/dist/scripts/zellij-worker-pane-manager-check.js +0 -109
- package/dist/scripts/zellij-worker-pane-manager-single-owner-check.js +0 -47
- package/dist/scripts/zellij-worker-pane-real-ui-blackbox.js +0 -202
- package/dist/scripts/zellij-worker-pane-spawn-order-check.js +0 -35
|
@@ -39,7 +39,7 @@ function ambientGoalContinuation() {
|
|
|
39
39
|
mode: 'ambient_codex_native_goal_overlay',
|
|
40
40
|
native_slash_command: '/goal',
|
|
41
41
|
non_disruptive: true,
|
|
42
|
-
rule: 'Use Codex native goal persistence when available to keep work resumable until completion; it never replaces the selected SKS route,
|
|
42
|
+
rule: 'Use Codex native goal persistence when available to keep work resumable until completion; it never replaces the selected SKS route, Naruto, TriWiki, verification, reflection, or Honest Mode gates.'
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
const REFLECTION_ARTIFACT = 'reflection.md';
|
|
@@ -279,7 +279,7 @@ function selectPipelineLane(route, task, proof) {
|
|
|
279
279
|
if (LIGHTWEIGHT_ROUTES.has(route?.id))
|
|
280
280
|
return { lane: `${String(route.id).toLowerCase()}_lightweight_lane`, source: 'route_policy', fast_lane_allowed: true, reason: 'Lightweight route bypasses full mission orchestration by design.', blockers: [], skip_when_fast: SPEED_LANE_POLICY.skip_when_fast, keep: ['focused_implementation', 'listed_verification', 'honest_mode'] };
|
|
281
281
|
if (routeRequiresSubagents(route, task))
|
|
282
|
-
return { lane: SPEED_LANE_POLICY.full_lane, source: 'route_policy', fast_lane_allowed: false, reason: 'No Proof Field attached and this route normally requires full
|
|
282
|
+
return { lane: SPEED_LANE_POLICY.full_lane, source: 'route_policy', fast_lane_allowed: false, reason: 'No Proof Field attached and this route normally requires full Naruto evidence.', blockers: ['proof_field_not_attached'], skip_when_fast: [], keep: SPEED_LANE_POLICY.always_keep };
|
|
283
283
|
return { lane: SPEED_LANE_POLICY.balanced_lane, source: 'route_policy', fast_lane_allowed: false, reason: 'Balanced parent-owned route until Proof Field proves a narrower lane.', blockers: ['proof_field_not_attached'], skip_when_fast: [], keep: SPEED_LANE_POLICY.always_keep };
|
|
284
284
|
}
|
|
285
285
|
function buildPipelineStages(route, task, ambiguity, lane, context7Required, agentPolicy = normalizeAgentPolicy(route, task, {})) {
|
|
@@ -343,8 +343,11 @@ function planNextActions(route, task, ambiguity, lane, agentPolicy = normalizeAg
|
|
|
343
343
|
const actions = ['read pipeline-plan.json before work', 'execute kept stages only', 'run listed verification'];
|
|
344
344
|
if (agentPolicy.required)
|
|
345
345
|
actions.splice(1, 0, 'run sks agents run latest --json before implementation');
|
|
346
|
-
if (!lane.fast_lane_allowed && routeRequiresSubagents(route, task))
|
|
347
|
-
actions.splice(1, 0,
|
|
346
|
+
if (!lane.fast_lane_allowed && routeRequiresSubagents(route, task)) {
|
|
347
|
+
actions.splice(1, 0, route?.id === 'Naruto'
|
|
348
|
+
? 'materialize Naruto clone roster, work graph, worker proof, and naruto-gate.json before implementation'
|
|
349
|
+
: 'materialize full Team artifacts before implementation');
|
|
350
|
+
}
|
|
348
351
|
if (looksLikeProblemSolvingRequest(task))
|
|
349
352
|
actions.splice(1, 0, 'run Solution Scout web search for similar fixes before editing');
|
|
350
353
|
actions.push('refresh/validate TriWiki when required', 'finish with completion summary and Honest Mode');
|
|
@@ -372,10 +375,10 @@ export function promptPipelineContext(prompt, route = null) {
|
|
|
372
375
|
'Ambient Goal continuation: even without an explicit $Goal keyword, use Codex native /goal persistence when it helps keep long work resumable and complete; do not let it replace or skip the selected SKS route gates.',
|
|
373
376
|
'Route contract: execution routes infer contract answers from the prompt, TriWiki/current-code defaults, and conservative SKS policy. DFix and Answer bypass stateful execution because they do not start implementation.',
|
|
374
377
|
'Plan-first interaction: when ambiguity questions are truly required, show the user only the missing human decision(s), then seal the decision contract internally and execute/verify.',
|
|
375
|
-
'Question-shaped directive policy: before using Answer, decide whether a question is a real information request or an implicit instruction/complaint about broken behavior. Rhetorical bug reports, mandatory-policy statements, and "why is this not happening?" execution complaints must route to
|
|
378
|
+
'Question-shaped directive policy: before using Answer, decide whether a question is a real information request or an implicit instruction/complaint about broken behavior. Rhetorical bug reports, mandatory-policy statements, and "why is this not happening?" execution complaints must route to Naruto, not Answer.',
|
|
376
379
|
'Best-practice prompt shape: extract Goal, Context, Constraints, and Done-when before implementation; keep questions compact and only ask for answers that can change scope, safety, user-facing behavior, or acceptance criteria.',
|
|
377
380
|
chatCaptureIntakeText(),
|
|
378
|
-
'Default execution routing: general implementation/code-changing prompts promote to
|
|
381
|
+
'Default execution routing: general implementation/code-changing prompts promote to Naruto so the normal path is shadow-clone fan-out, hardware-safe concurrency, patch envelopes, verification DAG, and GPT final arbitration. Answer, DFix, Help, Wiki maintenance, and safety-specific routes are intentional exceptions.',
|
|
379
382
|
'Stance: infer the user intent aggressively from rough wording, local context, TriWiki, and conservative defaults; do not surface prequestion sheets before work.',
|
|
380
383
|
subagentExecutionPolicyText(route, cleanPrompt),
|
|
381
384
|
solutionScoutPolicyText(cleanPrompt),
|
|
@@ -397,8 +400,10 @@ export function promptPipelineContext(prompt, route = null) {
|
|
|
397
400
|
];
|
|
398
401
|
if (reflectionRequiredForRoute(route))
|
|
399
402
|
lines.push(reflectionInstructionText());
|
|
403
|
+
if (route?.id === 'Naruto')
|
|
404
|
+
lines.push(`Naruto route: build clone roster, massive work graph, hardware-safe governor, active pool, allocation/rebalance policy, parallel verification DAG, GPT final pack, per-clone proof, session cleanup, reflection, and Honest Mode. $Team is deprecated for new execution missions.`);
|
|
400
405
|
if (route?.id === 'Team')
|
|
401
|
-
lines.push(`Team route
|
|
406
|
+
lines.push(`Team route is a deprecated compatibility surface; use $Naruto for new execution missions. Existing Team mission observation commands remain available.`);
|
|
402
407
|
if (route?.id === 'Goal')
|
|
403
408
|
lines.push('Goal route: write SKS goal bridge artifacts, then use Codex native /goal persistence for create, pause, resume, and clear continuation controls.');
|
|
404
409
|
if (route?.id === 'PPT')
|
|
@@ -473,8 +478,10 @@ export async function prepareRoute(root, prompt, state = {}) {
|
|
|
473
478
|
const nativeSessionsRequired = routeRequiresSubagents(route, cleanPrompt);
|
|
474
479
|
if (QUESTION_GATE_ROUTES.has(route.id) || route.id === 'MadSKS')
|
|
475
480
|
return withSkillDreamContext(await prepareClarificationGate(root, route, task, required, { madSksAuthorization }), dreamContext);
|
|
481
|
+
if (route.id === 'Naruto')
|
|
482
|
+
return withSkillDreamContext(await prepareNaruto(root, route, task, required, { madSksAuthorization }), dreamContext);
|
|
476
483
|
if (route.id === 'Team')
|
|
477
|
-
return withSkillDreamContext(await
|
|
484
|
+
return withSkillDreamContext(await prepareNaruto(root, { ...route, id: 'Naruto', command: '$Naruto', mode: 'NARUTO', stopGate: 'naruto-gate.json', requiredSkills: ['naruto', 'pipeline-runner', 'prompt-pipeline', 'honest-mode'] }, task, required, { madSksAuthorization, teamAlias: true }), dreamContext);
|
|
478
485
|
if (route.id === 'Research')
|
|
479
486
|
return withSkillDreamContext(await prepareResearch(root, route, task, required), dreamContext);
|
|
480
487
|
if (route.id === 'AutoResearch')
|
|
@@ -626,6 +633,10 @@ export async function activeRouteContext(root, state) {
|
|
|
626
633
|
const roles = state.role_counts ? ` Role counts: ${formatRoleCounts(state.role_counts)}.` : '';
|
|
627
634
|
return `Active Team mission ${state.mission_id || 'latest'} must keep the user-visible live transcript updated. Native session budget: ${state.agent_sessions || MIN_TEAM_REVIEWER_LANES}.${roles} Run native sessions, TriWiki refresh, debate, consensus, fresh development, minimum ${MIN_TEAM_REVIEWER_LANES}-lane review/integration, then close or account for every Team native session and write ${TEAM_SESSION_CLEANUP_ARTIFACT} before reflection/final. ${MIN_TEAM_REVIEW_POLICY_TEXT} After each native-session status/result/handoff, run: sks team event ${state.mission_id || 'latest'} --agent <name> --phase <phase> --message "...". Inspect with sks team log/watch ${state.mission_id || 'latest'}.${reasoningNote}${context7}${planNote}`;
|
|
628
635
|
}
|
|
636
|
+
if (state.mode === 'NARUTO') {
|
|
637
|
+
const clones = state.clone_count ? ` Clone count: ${state.clone_count}.` : '';
|
|
638
|
+
return `Active Naruto mission ${state.mission_id || 'latest'} must keep clone/worker evidence current.${clones} Use sks naruto status ${state.mission_id || 'latest'} --json, inspect .sneakoscope/missions/${state.mission_id || 'latest'}/naruto-gate.json and agents/agent-proof-evidence.json, then continue until the Naruto gate passes or a hard blocker is recorded.${reasoningNote}${planNote}`;
|
|
639
|
+
}
|
|
629
640
|
if (state.subagents_required && !(await hasSubagentEvidence(root, state))) {
|
|
630
641
|
return `Active SKS route ${id} requires native multi-session evidence before code-changing work can be considered complete. Run worker/reviewer native sessions for disjoint write scopes, or record explicit unavailable/unsplittable native-session evidence before editing.${reasoningNote}${planNote}`;
|
|
631
642
|
}
|
|
@@ -1069,6 +1080,61 @@ async function prepareLightRoute(root, route, task, required) {
|
|
|
1069
1080
|
await setCurrent(root, routeState(id, route, 'ROUTE_CONTEXT_READY', required, { prompt: task, stop_gate: 'none', pipeline_plan_ready: validatePipelinePlan(pipelinePlan).ok, pipeline_plan_path: PIPELINE_PLAN_ARTIFACT }));
|
|
1070
1081
|
return routeContext(route, id, task, required, 'Load the route skill context, execute the smallest matching action, and finish with Honest Mode.');
|
|
1071
1082
|
}
|
|
1083
|
+
async function prepareNaruto(root, route, task, required, opts = {}) {
|
|
1084
|
+
const cleanTask = stripDollarCommand(task) || String(task || '').trim();
|
|
1085
|
+
const { id, dir } = await createMission(root, { mode: 'naruto', prompt: cleanTask });
|
|
1086
|
+
const routeContextPayload = {
|
|
1087
|
+
route: 'Naruto',
|
|
1088
|
+
command: '$Naruto',
|
|
1089
|
+
mode: 'NARUTO',
|
|
1090
|
+
task: cleanTask,
|
|
1091
|
+
required_skills: route.requiredSkills || ['naruto', 'pipeline-runner', 'prompt-pipeline', 'honest-mode'],
|
|
1092
|
+
context7_required: required,
|
|
1093
|
+
context_tracking: triwikiContextTracking(),
|
|
1094
|
+
stop_gate: 'naruto-gate.json',
|
|
1095
|
+
team_alias: opts.teamAlias === true,
|
|
1096
|
+
mad_sks_authorization: Boolean(opts.madSksAuthorization)
|
|
1097
|
+
};
|
|
1098
|
+
await writeJsonAtomic(path.join(dir, 'route-context.json'), routeContextPayload);
|
|
1099
|
+
await writeJsonAtomic(path.join(dir, 'naruto-gate.json'), {
|
|
1100
|
+
schema: 'sks.naruto-gate.v1',
|
|
1101
|
+
passed: false,
|
|
1102
|
+
mission_id: id,
|
|
1103
|
+
clone_roster_built: false,
|
|
1104
|
+
work_graph_ready: false,
|
|
1105
|
+
role_distribution_ready: false,
|
|
1106
|
+
allocation_ready: false,
|
|
1107
|
+
rebalance_ready: false,
|
|
1108
|
+
concurrency_governor_ready: false,
|
|
1109
|
+
active_pool_simulated: false,
|
|
1110
|
+
verification_dag_ready: false,
|
|
1111
|
+
gpt_final_pack_ready: false,
|
|
1112
|
+
zellij_dashboard_ready: false,
|
|
1113
|
+
native_agent_proof: false,
|
|
1114
|
+
final_arbiter_accepted: false,
|
|
1115
|
+
session_cleanup: false,
|
|
1116
|
+
blockers: ['naruto_run_not_started'],
|
|
1117
|
+
updated_at: nowIso()
|
|
1118
|
+
});
|
|
1119
|
+
const pipelinePlan = await writePipelinePlan(dir, { missionId: id, route, task: cleanTask, required, ambiguity: { required: false, status: opts.teamAlias ? 'team_alias_to_naruto' : 'direct_naruto' } });
|
|
1120
|
+
await setCurrent(root, routeState(id, route, 'NARUTO_READY', required, {
|
|
1121
|
+
prompt: cleanTask,
|
|
1122
|
+
route: 'Naruto',
|
|
1123
|
+
route_command: '$Naruto',
|
|
1124
|
+
mode: 'NARUTO',
|
|
1125
|
+
implementation_allowed: true,
|
|
1126
|
+
ambiguity_gate_required: false,
|
|
1127
|
+
ambiguity_gate_passed: true,
|
|
1128
|
+
stop_gate: 'naruto-gate.json',
|
|
1129
|
+
required_skills: routeContextPayload.required_skills,
|
|
1130
|
+
subagents_required: true,
|
|
1131
|
+
native_sessions_required: true,
|
|
1132
|
+
naruto_gate_file: 'naruto-gate.json',
|
|
1133
|
+
pipeline_plan_ready: validatePipelinePlan(pipelinePlan).ok,
|
|
1134
|
+
pipeline_plan_path: PIPELINE_PLAN_ARTIFACT
|
|
1135
|
+
}));
|
|
1136
|
+
return routeContext(route, id, cleanTask, required, `Run sks naruto run ${JSON.stringify(cleanTask)} --json (or continue with Codex native workers for the same mission), then update naruto-gate.json from the worker proof and verification DAG.`);
|
|
1137
|
+
}
|
|
1072
1138
|
function routeState(id, route, phase, context7Required, extra = {}) {
|
|
1073
1139
|
const reasoning = routeReasoning(route, extra.prompt || '');
|
|
1074
1140
|
const nativeSessionsRequired = routeRequiresSubagents(route, extra.prompt || '');
|
|
@@ -371,6 +371,24 @@ function missingRequiredGateFields(file, state, gate = {}) {
|
|
|
371
371
|
return required
|
|
372
372
|
.filter((key) => gate[key] !== true);
|
|
373
373
|
}
|
|
374
|
+
if (file === 'naruto-gate.json' || mode === 'NARUTO') {
|
|
375
|
+
const required = [
|
|
376
|
+
'clone_roster_built',
|
|
377
|
+
'work_graph_ready',
|
|
378
|
+
'role_distribution_ready',
|
|
379
|
+
'allocation_ready',
|
|
380
|
+
'rebalance_ready',
|
|
381
|
+
'concurrency_governor_ready',
|
|
382
|
+
'active_pool_simulated',
|
|
383
|
+
'verification_dag_ready',
|
|
384
|
+
'gpt_final_pack_ready',
|
|
385
|
+
'zellij_dashboard_ready',
|
|
386
|
+
'native_agent_proof',
|
|
387
|
+
'final_arbiter_accepted',
|
|
388
|
+
'session_cleanup'
|
|
389
|
+
];
|
|
390
|
+
return required.filter((key) => gate[key] !== true);
|
|
391
|
+
}
|
|
374
392
|
if (file === 'qa-gate.json' || mode === 'QALOOP') {
|
|
375
393
|
const required = ['clarification_contract_sealed', 'qa_report_written', 'qa_ledger_complete', 'checklist_completed', 'safety_reviewed', 'deployed_destructive_tests_blocked', 'credentials_not_persisted', 'honest_mode_complete'];
|
|
376
394
|
if (gate.ui_e2e_required === true)
|
|
@@ -405,6 +423,8 @@ async function missingRequiredGateArtifacts(root, file, state, gate = {}) {
|
|
|
405
423
|
}
|
|
406
424
|
if (file === IMAGE_UX_REVIEW_GATE_ARTIFACT || mode === 'IMAGE_UX_REVIEW')
|
|
407
425
|
return missingImageUxReviewArtifacts(root, state, gate);
|
|
426
|
+
if (file === 'naruto-gate.json' || mode === 'NARUTO')
|
|
427
|
+
return missingNarutoArtifacts(root, state, gate);
|
|
408
428
|
if (file !== 'team-gate.json' && mode !== 'TEAM')
|
|
409
429
|
return [];
|
|
410
430
|
const missing = [];
|
|
@@ -611,6 +631,8 @@ function gateFilesForState(state) {
|
|
|
611
631
|
return ['goal-workflow.json'];
|
|
612
632
|
if (state.mode === 'RESEARCH')
|
|
613
633
|
return ['research-gate.json', 'research-gate.evaluated.json'];
|
|
634
|
+
if (state.mode === 'NARUTO')
|
|
635
|
+
return ['naruto-gate.json'];
|
|
614
636
|
if (state.mode === 'TEAM')
|
|
615
637
|
return ['team-gate.json'];
|
|
616
638
|
if (state.mode === 'AUTORESEARCH')
|
|
@@ -627,6 +649,28 @@ function gateFilesForState(state) {
|
|
|
627
649
|
return [IMAGE_UX_REVIEW_GATE_ARTIFACT];
|
|
628
650
|
return ['done-gate.json'];
|
|
629
651
|
}
|
|
652
|
+
async function missingNarutoArtifacts(root, state = {}, gate = {}) {
|
|
653
|
+
const id = state?.mission_id;
|
|
654
|
+
if (!id)
|
|
655
|
+
return ['mission_id'];
|
|
656
|
+
const dir = missionDir(root, id);
|
|
657
|
+
const required = [
|
|
658
|
+
'naruto-gate.json',
|
|
659
|
+
'agents/naruto-work-graph.json',
|
|
660
|
+
'agents/naruto-role-distribution.json',
|
|
661
|
+
'agents/naruto-concurrency-governor.json',
|
|
662
|
+
'agents/naruto-verification-dag.json',
|
|
663
|
+
'agents/naruto-gpt-final-pack.json'
|
|
664
|
+
];
|
|
665
|
+
const missing = [];
|
|
666
|
+
for (const file of required) {
|
|
667
|
+
if (!(await exists(path.join(dir, file))))
|
|
668
|
+
missing.push(file);
|
|
669
|
+
}
|
|
670
|
+
if (gate.native_agent_proof === true && !(await exists(path.join(dir, 'agents', 'agent-proof-evidence.json'))))
|
|
671
|
+
missing.push('agents/agent-proof-evidence.json');
|
|
672
|
+
return missing;
|
|
673
|
+
}
|
|
630
674
|
function extractLastMessage(payload) {
|
|
631
675
|
return payload.last_assistant_message || payload.assistant_message || payload.message || payload.response || payload.raw || '';
|
|
632
676
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { containsPlaintextSecret } from '../secret-redaction.js';
|
|
2
2
|
import { readRouteProof } from './proof-reader.js';
|
|
3
3
|
import { validateCompletionProof } from './validation.js';
|
|
4
|
-
import { proofStatusBlocks, routeRequiresCompletionProof, routeRequiresImageVoxelAnchors } from './route-proof-policy.js';
|
|
4
|
+
import { normalizeProofRoute, proofStatusBlocks, routeRequiresCompletionProof, routeRequiresImageVoxelAnchors } from './route-proof-policy.js';
|
|
5
5
|
import { routeRequiresAgentIntake } from '../agents/agent-plan.js';
|
|
6
6
|
export async function validateRouteCompletionProof(root, { missionId = null, route = null, state = {}, visualClaim = undefined } = {}) {
|
|
7
7
|
const proofRequired = state.proof_required === true || routeRequiresCompletionProof(route);
|
|
@@ -34,11 +34,13 @@ export async function validateRouteCompletionProof(root, { missionId = null, rou
|
|
|
34
34
|
else {
|
|
35
35
|
if (agents.status !== 'passed' || agents.ok !== true)
|
|
36
36
|
issues.push('agent_gate_not_passed');
|
|
37
|
+
const normalizedRoute = normalizeProofRoute(route || proof.route);
|
|
38
|
+
const maxAgentCount = normalizedRoute === '$Naruto' ? 100 : 20;
|
|
37
39
|
const agentCount = Number(agents.agent_count || 0);
|
|
38
40
|
if (agentCount < 5)
|
|
39
41
|
issues.push('agent_count_below_5');
|
|
40
|
-
if (agentCount >
|
|
41
|
-
issues.push(
|
|
42
|
+
if (agentCount > maxAgentCount)
|
|
43
|
+
issues.push(`agent_count_above_${maxAgentCount}`);
|
|
42
44
|
if (agents.all_sessions_closed !== true)
|
|
43
45
|
issues.push('agent_sessions_not_closed');
|
|
44
46
|
if (agents.no_overlap_ok !== true)
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export const SERIOUS_ROUTE_ALIASES = Object.freeze([
|
|
2
2
|
'$Team',
|
|
3
|
+
'$Naruto',
|
|
4
|
+
'$ShadowClone',
|
|
5
|
+
'$Kagebunshin',
|
|
3
6
|
'$DFix',
|
|
4
7
|
'$QA-LOOP',
|
|
5
8
|
'$Research',
|
|
@@ -35,7 +38,12 @@ export const VISUAL_ROUTE_ALIASES = Object.freeze([
|
|
|
35
38
|
'$GX'
|
|
36
39
|
]);
|
|
37
40
|
const ROUTE_NORMALIZATION = Object.freeze({
|
|
38
|
-
team: '$
|
|
41
|
+
team: '$Naruto',
|
|
42
|
+
naruto: '$Naruto',
|
|
43
|
+
shadowclone: '$Naruto',
|
|
44
|
+
'shadow-clone': '$Naruto',
|
|
45
|
+
kagebunshin: '$Naruto',
|
|
46
|
+
'kage-bunshin': '$Naruto',
|
|
39
47
|
dfix: '$DFix',
|
|
40
48
|
qaloop: '$QA-LOOP',
|
|
41
49
|
'qa-loop': '$QA-LOOP',
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
const ALWAYS_KEEP = new Set([
|
|
3
|
+
'release:version-truth',
|
|
4
|
+
'release:dag-full-coverage',
|
|
5
|
+
'runtime:ts-source-of-truth',
|
|
6
|
+
'typecheck',
|
|
7
|
+
'schema:check'
|
|
8
|
+
]);
|
|
9
|
+
export function selectAffectedReleaseGates(root, manifest, gates, input = {}) {
|
|
10
|
+
if (input.full) {
|
|
11
|
+
return selectionResult(gates, gates, [], 'full', {}, []);
|
|
12
|
+
}
|
|
13
|
+
const changedFiles = resolveChangedFiles(root, input.changedSince || 'auto');
|
|
14
|
+
const selected = [];
|
|
15
|
+
const reasons = {};
|
|
16
|
+
for (const gate of gates) {
|
|
17
|
+
const reason = gateSelectionReason(gate, changedFiles, input.preset || 'affected');
|
|
18
|
+
if (reason) {
|
|
19
|
+
selected.push(gate);
|
|
20
|
+
reasons[gate.id] = reason;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const byId = new Map(gates.map((gate) => [gate.id, gate]));
|
|
24
|
+
for (const id of ALWAYS_KEEP) {
|
|
25
|
+
const gate = byId.get(id) || manifest.gates.find((candidate) => candidate.id === id);
|
|
26
|
+
if (gate && !selected.some((row) => row.id === gate.id)) {
|
|
27
|
+
selected.push(gate);
|
|
28
|
+
reasons[gate.id] = 'always_keep_core_release_safety';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const expanded = expandWithDependencies(selected, manifest);
|
|
32
|
+
const ordered = manifest.gates.filter((gate) => expanded.some((row) => row.id === gate.id));
|
|
33
|
+
return selectionResult(gates, ordered, changedFiles, 'affected', reasons, gates.filter((gate) => !ordered.some((row) => row.id === gate.id)).map((gate) => gate.id));
|
|
34
|
+
}
|
|
35
|
+
function expandWithDependencies(selected, manifest) {
|
|
36
|
+
const byId = new Map(manifest.gates.map((gate) => [gate.id, gate]));
|
|
37
|
+
const out = new Map(selected.map((gate) => [gate.id, gate]));
|
|
38
|
+
const visit = (gate) => {
|
|
39
|
+
for (const dep of gate.deps || []) {
|
|
40
|
+
const depGate = byId.get(dep);
|
|
41
|
+
if (depGate && !out.has(depGate.id)) {
|
|
42
|
+
out.set(depGate.id, depGate);
|
|
43
|
+
visit(depGate);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
for (const gate of selected)
|
|
48
|
+
visit(gate);
|
|
49
|
+
return [...out.values()];
|
|
50
|
+
}
|
|
51
|
+
function gateSelectionReason(gate, changedFiles, preset) {
|
|
52
|
+
if (ALWAYS_KEEP.has(gate.id))
|
|
53
|
+
return 'always_keep_core_release_safety';
|
|
54
|
+
if (!changedFiles.length)
|
|
55
|
+
return preset === 'fast' ? 'fast_no_diff_core_only_skip' : 'no_changed_files';
|
|
56
|
+
if (changedFiles.some((file) => file === 'package.json' || file === 'package-lock.json')) {
|
|
57
|
+
if (/^(release:|publish:|prepublish|runtime:|typecheck|schema:check)/.test(gate.id))
|
|
58
|
+
return 'package_metadata_changed';
|
|
59
|
+
}
|
|
60
|
+
if (changedFiles.some((file) => file === 'release-gates.v2.json' || file.startsWith('src/core/release/') || file.startsWith('src/scripts/release-')))
|
|
61
|
+
return 'release_gate_system_changed';
|
|
62
|
+
if (changedFiles.some((file) => file.startsWith('src/core/research/')))
|
|
63
|
+
return gate.id.startsWith('research:') ? 'research_source_changed' : null;
|
|
64
|
+
if (changedFiles.some((file) => file.startsWith('src/core/zellij/') || file.startsWith('src/commands/zellij')))
|
|
65
|
+
return gate.id.startsWith('zellij:') || gate.id.startsWith('agent:zellij') || gate.id.startsWith('naruto:zellij') ? 'zellij_source_changed' : null;
|
|
66
|
+
if (changedFiles.some((file) => file.includes('/db') || file.includes('mad-db') || file.includes('mcp')))
|
|
67
|
+
return /db|mcp|mad-db|mad-sks/.test(gate.id) ? 'db_mcp_or_mad_db_changed' : null;
|
|
68
|
+
const inputs = gate.cache?.inputs || [];
|
|
69
|
+
if (inputs.some((pattern) => changedFiles.some((file) => matchesGlobish(file, pattern))))
|
|
70
|
+
return 'cache_input_changed';
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function selectionResult(all, selected, changedFiles, mode, reasons, skipped) {
|
|
74
|
+
return {
|
|
75
|
+
gates: selected,
|
|
76
|
+
selection: {
|
|
77
|
+
schema: 'sks.release-gate-affected-selection.v1',
|
|
78
|
+
mode,
|
|
79
|
+
changed_files: changedFiles,
|
|
80
|
+
selected_gate_ids: selected.map((gate) => gate.id),
|
|
81
|
+
skipped_gate_ids: skipped.length ? skipped : all.filter((gate) => !selected.some((row) => row.id === gate.id)).map((gate) => gate.id),
|
|
82
|
+
reasons
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function resolveChangedFiles(root, changedSince) {
|
|
87
|
+
const base = changedSince === 'auto' ? 'HEAD' : changedSince;
|
|
88
|
+
const args = base === 'HEAD'
|
|
89
|
+
? ['diff', '--name-only', 'HEAD']
|
|
90
|
+
: ['diff', '--name-only', String(base)];
|
|
91
|
+
const diff = spawnSync('git', args, { cwd: root, encoding: 'utf8' });
|
|
92
|
+
const status = spawnSync('git', ['status', '--short'], { cwd: root, encoding: 'utf8' });
|
|
93
|
+
const files = [
|
|
94
|
+
...String(diff.stdout || '').split(/\n/),
|
|
95
|
+
...String(status.stdout || '').split(/\n/).map((line) => line.slice(3))
|
|
96
|
+
].map((file) => file.trim()).filter(Boolean);
|
|
97
|
+
return [...new Set(files)].sort();
|
|
98
|
+
}
|
|
99
|
+
function matchesGlobish(file, pattern) {
|
|
100
|
+
const normalized = pattern.replace(/\\/g, '/');
|
|
101
|
+
if (normalized === file)
|
|
102
|
+
return true;
|
|
103
|
+
if (normalized.endsWith('/**'))
|
|
104
|
+
return file.startsWith(normalized.slice(0, -3));
|
|
105
|
+
if (normalized.endsWith('/**/*'))
|
|
106
|
+
return file.startsWith(normalized.slice(0, -5));
|
|
107
|
+
if (normalized.includes('**'))
|
|
108
|
+
return file.startsWith(normalized.split('**')[0] || '');
|
|
109
|
+
if (normalized.endsWith('*'))
|
|
110
|
+
return file.startsWith(normalized.slice(0, -1));
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=release-gate-affected-selector.js.map
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { writeReleaseGateJson } from './release-gate-report.js';
|
|
4
|
+
const DISALLOWED_BATCH_RESOURCES = new Set(['zellij-real', 'git-worktree', 'local-llm-real', 'remote-model-real', 'publish', 'global-config']);
|
|
5
|
+
export function isReleaseGateBatchable(gate) {
|
|
6
|
+
if (gate.side_effect !== 'hermetic')
|
|
7
|
+
return false;
|
|
8
|
+
if (!gate.resource.includes('cpu-light') || !gate.resource.includes('fs-read'))
|
|
9
|
+
return false;
|
|
10
|
+
return gate.resource.every((resource) => resource === 'cpu-light' || resource === 'fs-read') && !gate.resource.some((resource) => DISALLOWED_BATCH_RESOURCES.has(resource));
|
|
11
|
+
}
|
|
12
|
+
export async function runReleaseGateBatch(root, gates, input = {}) {
|
|
13
|
+
const concurrency = Math.max(1, Math.floor(Number(input.concurrency || process.env.SKS_RELEASE_BATCH_CONCURRENCY || 4)));
|
|
14
|
+
const nonBatchable = gates.filter((gate) => !isReleaseGateBatchable(gate));
|
|
15
|
+
if (nonBatchable.length) {
|
|
16
|
+
return {
|
|
17
|
+
schema: 'sks.release-gate-batch-result.v1',
|
|
18
|
+
ok: false,
|
|
19
|
+
batch_size: gates.length,
|
|
20
|
+
completed: 0,
|
|
21
|
+
failed: nonBatchable.length,
|
|
22
|
+
results: nonBatchable.map((gate) => ({ id: gate.id, ok: false, exit_code: null, duration_ms: 0 }))
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const queue = [...gates];
|
|
26
|
+
const results = [];
|
|
27
|
+
const workers = Array.from({ length: Math.min(concurrency, queue.length) }, async () => {
|
|
28
|
+
while (queue.length) {
|
|
29
|
+
const gate = queue.shift();
|
|
30
|
+
if (!gate)
|
|
31
|
+
continue;
|
|
32
|
+
const result = await runOne(root, gate);
|
|
33
|
+
results.push(result);
|
|
34
|
+
if (input.reportRoot)
|
|
35
|
+
writeChildResult(input.reportRoot, result);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
await Promise.all(workers);
|
|
39
|
+
const failed = results.filter((row) => !row.ok).length;
|
|
40
|
+
return {
|
|
41
|
+
schema: 'sks.release-gate-batch-result.v1',
|
|
42
|
+
ok: failed === 0,
|
|
43
|
+
batch_size: gates.length,
|
|
44
|
+
completed: results.length - failed,
|
|
45
|
+
failed,
|
|
46
|
+
results
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function runOne(root, gate) {
|
|
50
|
+
const started = Date.now();
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
const child = spawn(gate.command, { cwd: root, shell: true, stdio: ['ignore', 'ignore', 'ignore'] });
|
|
53
|
+
const timer = setTimeout(() => child.kill('SIGTERM'), gate.timeout_ms);
|
|
54
|
+
child.on('close', (code) => {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
resolve({ id: gate.id, ok: code === 0, exit_code: code, duration_ms: Date.now() - started });
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function writeChildResult(reportRoot, result) {
|
|
61
|
+
const dir = path.join(reportRoot, result.id.replace(/[^A-Za-z0-9_.:-]/g, '_'));
|
|
62
|
+
writeReleaseGateJson(path.join(dir, 'result.json'), {
|
|
63
|
+
schema: 'sks.release-gate-batch-child-result.v1',
|
|
64
|
+
...result
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=release-gate-batch-runner.js.map
|
|
@@ -7,6 +7,7 @@ import { findReadyReleaseGateNodes, findReleaseGatesBlockedByFailedDeps, pickRea
|
|
|
7
7
|
import { readReleaseGateCacheHit, writeReleaseGateCacheHit } from './release-gate-cache-v2.js';
|
|
8
8
|
import { RELEASE_GATE_NODE_SCHEMA, validateReleaseGateManifest } from './release-gate-node.js';
|
|
9
9
|
import { countReleaseGateResources, defaultReleaseGateBudget, summarizeReleaseGateBudget } from './release-gate-resource-governor.js';
|
|
10
|
+
import { selectAffectedReleaseGates } from './release-gate-affected-selector.js';
|
|
10
11
|
export function loadReleaseGateManifest(root, file = 'release-gates.v2.json') {
|
|
11
12
|
const manifestPath = path.join(root, file);
|
|
12
13
|
const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
@@ -20,7 +21,11 @@ export async function runReleaseGateDag(input) {
|
|
|
20
21
|
const root = path.resolve(input.root);
|
|
21
22
|
const preset = input.preset || 'release';
|
|
22
23
|
const manifest = loadReleaseGateManifest(root);
|
|
23
|
-
const
|
|
24
|
+
const presetGates = selectReleaseGatePreset(manifest, preset);
|
|
25
|
+
const affected = (preset === 'affected' || preset === 'fast') && input.full !== true
|
|
26
|
+
? selectAffectedReleaseGates(root, manifest, presetGates, { changedSince: input.changedSince || 'auto', preset })
|
|
27
|
+
: selectAffectedReleaseGates(root, manifest, presetGates, { full: true, preset });
|
|
28
|
+
const selected = affected.gates;
|
|
24
29
|
const runId = `rg-${new Date().toISOString().replace(/[:.]/g, '-')}-${process.pid}`;
|
|
25
30
|
const reportDir = path.join(root, '.sneakoscope', 'reports', 'release-gates', runId);
|
|
26
31
|
fs.mkdirSync(reportDir, { recursive: true });
|
|
@@ -33,6 +38,8 @@ export async function runReleaseGateDag(input) {
|
|
|
33
38
|
const budget = defaultReleaseGateBudget();
|
|
34
39
|
const peakResources = {};
|
|
35
40
|
let cached = 0;
|
|
41
|
+
const cachedGates = [];
|
|
42
|
+
const executedGates = [];
|
|
36
43
|
let sumGateMs = 0;
|
|
37
44
|
let peakRunning = 0;
|
|
38
45
|
const writeSummarySnapshot = (finished = false) => {
|
|
@@ -45,6 +52,9 @@ export async function runReleaseGateDag(input) {
|
|
|
45
52
|
selected_preset: preset,
|
|
46
53
|
total_gates: manifest.gates.length,
|
|
47
54
|
selected_gates: selected.length,
|
|
55
|
+
selected_gate_ids: selected.map((gate) => gate.id),
|
|
56
|
+
skipped_by_affected: affected.selection.mode === 'affected' ? affected.selection.skipped_gate_ids : [],
|
|
57
|
+
affected_selection: affected.selection,
|
|
48
58
|
completed: completed.size,
|
|
49
59
|
failed: failed.size,
|
|
50
60
|
cached,
|
|
@@ -55,6 +65,12 @@ export async function runReleaseGateDag(input) {
|
|
|
55
65
|
critical_path_ms: estimateCriticalPath(selected, completed),
|
|
56
66
|
peak_running: peakRunning,
|
|
57
67
|
peak_resources: peakResources,
|
|
68
|
+
cached_gates: cachedGates,
|
|
69
|
+
executed_gates: executedGates,
|
|
70
|
+
slowest_gates: [...completed.values(), ...failed.values()]
|
|
71
|
+
.sort((a, b) => b.duration_ms - a.duration_ms)
|
|
72
|
+
.slice(0, 10)
|
|
73
|
+
.map((row) => ({ id: row.id, duration_ms: row.duration_ms, cached: row.cached })),
|
|
58
74
|
budget_snapshot: budget,
|
|
59
75
|
budget_summary: summarizeReleaseGateBudget(budget),
|
|
60
76
|
report_dir: reportDir,
|
|
@@ -82,12 +98,14 @@ export async function runReleaseGateDag(input) {
|
|
|
82
98
|
const result = { id: gate.id, ok: true, exit_code: 0, duration_ms: 0, cached: true, stderr_tail: '' };
|
|
83
99
|
completed.set(gate.id, result);
|
|
84
100
|
cached += 1;
|
|
101
|
+
cachedGates.push(gate.id);
|
|
85
102
|
progressed = true;
|
|
86
103
|
appendReleaseGateJsonl(timeline, { event: 'cache_hit', gate_id: gate.id, at: new Date().toISOString() });
|
|
87
104
|
writeSummarySnapshot(false);
|
|
88
105
|
continue;
|
|
89
106
|
}
|
|
90
107
|
appendReleaseGateJsonl(timeline, { event: 'start', gate_id: gate.id, resource: gate.resource, at: new Date().toISOString() });
|
|
108
|
+
executedGates.push(gate.id);
|
|
91
109
|
running.set(gate.id, { gate, promise: runGate(root, runId, reportDir, gate) });
|
|
92
110
|
peakRunning = Math.max(peakRunning, running.size);
|
|
93
111
|
const used = countReleaseGateResources([...running.values()].map((row) => row.gate));
|
|
@@ -141,8 +159,9 @@ export async function runReleaseGateDag(input) {
|
|
|
141
159
|
const result = writeSummarySnapshot(true);
|
|
142
160
|
return result;
|
|
143
161
|
}
|
|
144
|
-
function
|
|
145
|
-
|
|
162
|
+
export function selectReleaseGatePreset(manifest, preset) {
|
|
163
|
+
const effectivePreset = preset === 'affected' || preset === 'fast' ? 'release' : preset;
|
|
164
|
+
return manifest.gates.filter((gate) => gate.preset.includes(effectivePreset));
|
|
146
165
|
}
|
|
147
166
|
function runGate(root, runId, reportRoot, gate) {
|
|
148
167
|
const started = Date.now();
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import os from 'node:os';
|
|
2
2
|
export function defaultReleaseGateBudget() {
|
|
3
3
|
const cores = Math.max(1, os.cpus().length || 1);
|
|
4
|
-
|
|
5
|
-
'cpu-light': Math.min(
|
|
6
|
-
'cpu-heavy': Math.max(1, cores
|
|
7
|
-
'io-light': Math.min(
|
|
8
|
-
'io-heavy': Math.min(
|
|
9
|
-
git: Math.min(
|
|
10
|
-
'git-worktree': Math.min(
|
|
11
|
-
python: Math.min(
|
|
12
|
-
network:
|
|
4
|
+
const base = {
|
|
5
|
+
'cpu-light': Math.min(48, cores * 6),
|
|
6
|
+
'cpu-heavy': Math.max(1, cores),
|
|
7
|
+
'io-light': Math.min(96, cores * 10),
|
|
8
|
+
'io-heavy': Math.min(12, Math.max(1, cores)),
|
|
9
|
+
git: Math.min(12, Math.max(1, cores)),
|
|
10
|
+
'git-worktree': Math.min(8, Math.max(1, cores)),
|
|
11
|
+
python: Math.min(12, Math.max(1, cores)),
|
|
12
|
+
network: 12,
|
|
13
13
|
'zellij-real': 1,
|
|
14
14
|
'local-llm-real': Math.max(1, Number(process.env.SKS_LOCAL_LLM_MAX_PARALLEL || 1)),
|
|
15
|
-
'remote-model-real':
|
|
15
|
+
'remote-model-real': 6,
|
|
16
16
|
'global-config': 1,
|
|
17
17
|
publish: 1,
|
|
18
|
-
'fs-read': Math.min(
|
|
18
|
+
'fs-read': Math.min(96, cores * 10)
|
|
19
19
|
};
|
|
20
|
+
for (const key of Object.keys(base)) {
|
|
21
|
+
const envName = `SKS_RELEASE_MAX_${key.toUpperCase().replace(/[^A-Z0-9]+/g, '_')}`;
|
|
22
|
+
base[key] = envInt(envName, base[key]);
|
|
23
|
+
}
|
|
24
|
+
return base;
|
|
20
25
|
}
|
|
21
26
|
export function summarizeReleaseGateBudget(budget = defaultReleaseGateBudget()) {
|
|
22
27
|
return Object.entries(budget)
|
|
@@ -31,7 +36,10 @@ export function pickLaunchableReleaseGates(input) {
|
|
|
31
36
|
const budget = input.budget || defaultReleaseGateBudget();
|
|
32
37
|
const used = usedResources(input.running);
|
|
33
38
|
const launchable = [];
|
|
39
|
+
const maxTotal = envInt('SKS_RELEASE_MAX_TOTAL', Number.POSITIVE_INFINITY);
|
|
34
40
|
for (const gate of input.ready) {
|
|
41
|
+
if (input.running.length + launchable.length >= maxTotal)
|
|
42
|
+
break;
|
|
35
43
|
if (fits(gate, used, budget)) {
|
|
36
44
|
launchable.push(gate);
|
|
37
45
|
for (const resource of gate.resource)
|
|
@@ -40,6 +48,10 @@ export function pickLaunchableReleaseGates(input) {
|
|
|
40
48
|
}
|
|
41
49
|
return launchable;
|
|
42
50
|
}
|
|
51
|
+
function envInt(name, fallback) {
|
|
52
|
+
const parsed = Number(process.env[name]);
|
|
53
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
|
|
54
|
+
}
|
|
43
55
|
function usedResources(running) {
|
|
44
56
|
const used = {};
|
|
45
57
|
for (const gate of running) {
|
|
@@ -25,7 +25,7 @@ export async function densifyImplementationBlueprint(input) {
|
|
|
25
25
|
generated_at: nowIso(),
|
|
26
26
|
prompt: input.plan?.prompt || base.prompt || '',
|
|
27
27
|
implementation_allowed_in_research: false,
|
|
28
|
-
handoff_route: '$
|
|
28
|
+
handoff_route: '$Naruto',
|
|
29
29
|
repository_aware: true,
|
|
30
30
|
existing_files: likelyFiles,
|
|
31
31
|
possible_new_files: possibleNewFiles,
|
|
@@ -4,7 +4,7 @@ export function renderImplementationBlueprintMarkdown(blueprint = null) {
|
|
|
4
4
|
lines.push('# Research Implementation Blueprint');
|
|
5
5
|
lines.push('');
|
|
6
6
|
lines.push(`Prompt: ${blueprint?.prompt || ''}`);
|
|
7
|
-
lines.push(`Handoff route: ${blueprint?.handoff_route || '$
|
|
7
|
+
lines.push(`Handoff route: ${blueprint?.handoff_route || '$Naruto'}`);
|
|
8
8
|
lines.push(`Implementation allowed in Research: ${blueprint?.implementation_allowed_in_research === true ? 'yes' : 'no'}`);
|
|
9
9
|
lines.push('');
|
|
10
10
|
lines.push('## Sections');
|