forge-workflow 0.0.9 → 0.1.0-beta.2
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/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
- package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
- package/.cursor/rules/permissions-guidance.mdc +2 -2
- package/.forge/hooks/check-tdd.js +3 -0
- package/.forge/hooks/forge-native-hook.js +245 -0
- package/.forge/protected-paths.yaml +157 -0
- package/AGENTS.md +151 -61
- package/CHANGELOG.md +681 -0
- package/CLAUDE.md +9 -106
- package/QUICKSTART.md +171 -0
- package/README.md +271 -363
- package/bin/forge-cmd.js +120 -9
- package/bin/forge-preflight.js +26 -5
- package/bin/forge.js +466 -489
- package/docs/INDEX.md +93 -0
- package/docs/PROJECT_DESIGN.md +685 -0
- package/docs/architecture/index.md +66 -0
- package/docs/architecture/notes/README.md +35 -0
- package/docs/architecture/subsystems/README.md +46 -0
- package/docs/{TOOLCHAIN.md → forge/TOOLCHAIN.md} +56 -47
- package/docs/forge/VALIDATION.md +82 -0
- package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
- package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
- package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
- package/docs/guides/GREPTILE_SETUP.md +46 -0
- package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
- package/docs/guides/MIGRATION.md +56 -0
- package/docs/guides/SETUP.md +118 -0
- package/docs/guides/SUPPORT.md +185 -0
- package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
- package/docs/guides/memory-backends.md +183 -0
- package/docs/reference/ADAPTERS.md +128 -0
- package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
- package/docs/reference/COMMANDS.md +205 -0
- package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
- package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
- package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
- package/docs/reference/HERMES_INTEGRATION.md +118 -0
- package/docs/reference/INSIGHTS_RECAP.md +63 -0
- package/docs/reference/INSTALL.md +164 -0
- package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
- package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
- package/docs/reference/RELEASE.md +68 -0
- package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
- package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
- package/docs/reference/SKILLS.md +35 -0
- package/docs/reference/STATUS_BOARD.md +80 -0
- package/docs/reference/TEMPLATES.md +106 -0
- package/docs/reference/TOOLCHAIN.md +658 -0
- package/docs/reference/VALIDATION.md +82 -0
- package/docs/reference/agent-permissions.md +169 -0
- package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
- package/docs/reference/control-plane-guarantees.md +125 -0
- package/docs/reference/dependency-chain.md +331 -0
- package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
- package/docs/reference/forge-kernel-schema.md +72 -0
- package/docs/reference/kernel-conflict-evaluators.md +27 -0
- package/docs/reference/patch-md-format.md +77 -0
- package/docs/reference/protected-state-surfaces.md +59 -0
- package/docs/reference/shepherd.md +115 -0
- package/docs/reference/superpowers-analysis.md +320 -0
- package/docs/reference/superpowers-integration-options.md +404 -0
- package/docs/reference/test-environment.md +519 -0
- package/docs/reference/upgrade-safety.md +59 -0
- package/lefthook.yml +18 -0
- package/lib/adapter-cli.js +307 -0
- package/lib/adapters/beads-issue-adapter.js +127 -0
- package/lib/adapters/beads-kernel-compat.js +1042 -0
- package/lib/adapters/greptile-review-adapter.js +141 -0
- package/lib/adapters/kernel-issue-adapter.js +101 -0
- package/lib/adapters/pr-state-adapter.js +484 -0
- package/lib/adoption-profiles.js +126 -0
- package/lib/agents/README.md +2 -6
- package/lib/agents/claude.plugin.json +3 -8
- package/lib/agents/codex.plugin.json +9 -1
- package/lib/agents/cursor.plugin.json +2 -6
- package/lib/agents/hermes.plugin.json +22 -0
- package/lib/agents-config.js +39 -1236
- package/lib/audit-evidence.js +282 -0
- package/lib/beads-setup.js +225 -28
- package/lib/beads-sync-scaffold.js +36 -107
- package/lib/codex-skills.js +51 -1
- package/lib/commands/_issue.js +744 -70
- package/lib/commands/_manifest.js +91 -0
- package/lib/commands/_registry.js +85 -34
- package/lib/commands/_resolve-command-opts.js +261 -0
- package/lib/commands/_serve-security.js +270 -0
- package/lib/commands/adapter.js +12 -0
- package/lib/commands/add.js +118 -0
- package/lib/commands/audit.js +70 -0
- package/lib/commands/blocked.js +5 -0
- package/lib/commands/board.js +64 -0
- package/lib/commands/claim.js +21 -2
- package/lib/commands/claims.js +7 -0
- package/lib/commands/clean.js +485 -75
- package/lib/commands/close.js +2 -2
- package/lib/commands/comment.js +5 -0
- package/lib/commands/control.js +148 -0
- package/lib/commands/create.js +2 -2
- package/lib/commands/dev.js +185 -7
- package/lib/commands/doc-gate.js +336 -0
- package/lib/commands/doctor.js +156 -0
- package/lib/commands/explain.js +15 -0
- package/lib/commands/export.js +237 -0
- package/lib/commands/gate.js +192 -0
- package/lib/commands/hooks.js +242 -0
- package/lib/commands/inbox.js +118 -0
- package/lib/commands/init.js +598 -0
- package/lib/commands/insights.js +79 -0
- package/lib/commands/issue.js +12 -1
- package/lib/commands/issues.js +66 -0
- package/lib/commands/lint.js +5 -0
- package/lib/commands/list.js +2 -2
- package/lib/commands/merge.js +312 -0
- package/lib/commands/migrate.js +523 -0
- package/lib/commands/new.js +12 -0
- package/lib/commands/options.js +241 -0
- package/lib/commands/orient.js +13 -0
- package/lib/commands/orphans.js +5 -0
- package/lib/commands/patch.js +67 -0
- package/lib/commands/plan.js +436 -24
- package/lib/commands/preflight.js +211 -0
- package/lib/commands/prime.js +13 -0
- package/lib/commands/push.js +69 -2
- package/lib/commands/ready.js +2 -2
- package/lib/commands/recall.js +116 -0
- package/lib/commands/recap.js +61 -0
- package/lib/commands/recommend.js +22 -2
- package/lib/commands/release.js +91 -0
- package/lib/commands/remember.js +74 -0
- package/lib/commands/role.js +99 -0
- package/lib/commands/serve.js +581 -0
- package/lib/commands/setup.js +851 -979
- package/lib/commands/shepherd.js +436 -0
- package/lib/commands/ship.js +23 -1
- package/lib/commands/show.js +2 -2
- package/lib/commands/stage.js +192 -0
- package/lib/commands/stale.js +5 -0
- package/lib/commands/status.js +329 -11
- package/lib/commands/sync.js +34 -46
- package/lib/commands/team.js +15 -2
- package/lib/commands/test.js +58 -7
- package/lib/commands/update.js +2 -2
- package/lib/commands/upgrade.js +47 -0
- package/lib/commands/validate.js +56 -25
- package/lib/commands/worktree.js +308 -128
- package/lib/config-writer.js +202 -0
- package/lib/control-plane.js +236 -0
- package/lib/core/runtime-graph.js +946 -0
- package/lib/dep-guard/keyword-ripple.js +184 -0
- package/lib/deprecated-sync-cleanup.js +362 -0
- package/lib/detect-agent.js +2 -28
- package/lib/detect-worktree.js +42 -17
- package/lib/doc-gate/declaration.js +177 -0
- package/lib/doc-gate/detect.js +289 -0
- package/lib/doc-gate/gate.js +375 -0
- package/lib/doc-gate/okf-config.js +128 -0
- package/lib/doc-gate/okf.js +429 -0
- package/lib/docs-command.js +1161 -6
- package/lib/forge-issues.js +697 -0
- package/lib/forge-lock.js +262 -0
- package/lib/gate-events.js +193 -0
- package/lib/global-flags.js +74 -0
- package/lib/greptile-match.js +7 -63
- package/lib/harness-capability-matrix.js +380 -0
- package/lib/hook-global-installer.js +347 -0
- package/lib/hook-renderer.js +451 -0
- package/lib/inbox.js +391 -0
- package/lib/insights.js +397 -0
- package/lib/issue-adapter.js +156 -0
- package/lib/issue-backend.js +145 -0
- package/lib/issue-render.js +220 -0
- package/lib/issue-sync/authority.js +100 -0
- package/lib/issue-sync/github-pull.js +184 -0
- package/lib/issue-sync/import-primitives.js +98 -0
- package/lib/issue-sync/legacy-link-bridge.js +436 -0
- package/lib/issue-sync/link-store.js +292 -0
- package/lib/issue-sync/project-github.js +123 -0
- package/lib/issue-sync/reconcile.js +195 -0
- package/lib/issue-sync/schema.js +126 -0
- package/lib/kernel/backing-issue.js +305 -0
- package/lib/kernel/broker.js +1218 -0
- package/lib/kernel/cli-broker-factory.js +130 -0
- package/lib/kernel/conflict-signal.js +82 -0
- package/lib/kernel/evaluators.js +195 -0
- package/lib/kernel/fs-class.js +495 -0
- package/lib/kernel/issue-command-contract.js +559 -0
- package/lib/kernel/issue-id-resolver.js +186 -0
- package/lib/kernel/lease-enforcer.js +158 -0
- package/lib/kernel/migrations.js +333 -0
- package/lib/kernel/planning-buckets-schema.js +109 -0
- package/lib/kernel/projection-jsonl-writer.js +450 -0
- package/lib/kernel/readiness-model.js +329 -0
- package/lib/kernel/schema.js +356 -0
- package/lib/kernel/sqlite-driver.js +2504 -0
- package/lib/kernel/taxonomy-validator.js +394 -0
- package/lib/lefthook-check.js +8 -4
- package/lib/lefthook-wiring.js +413 -0
- package/lib/mcp-config-renderer.js +288 -0
- package/lib/memory/graphiti-mcp.js +106 -0
- package/lib/memory/router.js +387 -0
- package/lib/memory/typed-api.js +102 -0
- package/lib/memory-digest.js +195 -0
- package/lib/merge-rules.js +395 -0
- package/lib/migrate-dry-run.js +466 -0
- package/lib/orientation.js +863 -0
- package/lib/package-manager-remediation.js +103 -0
- package/lib/package-root.js +381 -0
- package/lib/patch-intent.js +890 -0
- package/lib/plugin-catalog.js +3 -4
- package/lib/plugin-manager.js +0 -5
- package/lib/pr-bundle.js +186 -0
- package/lib/pr-monitor/differ.js +195 -0
- package/lib/pr-monitor/events.js +0 -0
- package/lib/pr-monitor/gather.js +124 -0
- package/lib/pr-monitor/journal.js +299 -0
- package/lib/pr-monitor/monitor.js +146 -0
- package/lib/pr-monitor/render-sticky.js +157 -0
- package/lib/pr-monitor/watch-lifecycle.js +95 -0
- package/lib/pr-monitor/watch.js +247 -0
- package/lib/pr-pull.js +1273 -0
- package/lib/pr-shepherd.js +494 -0
- package/lib/pr-state-validator.js +59 -0
- package/lib/preflight/gates.js +237 -0
- package/lib/preflight/runner.js +116 -0
- package/lib/project-discovery.js +0 -53
- package/lib/project-memory.js +166 -0
- package/lib/protected-path-manifest.js +281 -0
- package/lib/protected-state-surfaces.js +387 -0
- package/lib/release-readiness.js +2089 -0
- package/lib/reset.js +59 -45
- package/lib/review-adapter.js +68 -0
- package/lib/rules-sync.js +260 -0
- package/lib/runtime-health.js +332 -23
- package/lib/safety-config-renderer.js +268 -0
- package/lib/setup-action-log.js +1 -7
- package/lib/setup.js +27 -65
- package/lib/shell-utils.js +76 -6
- package/lib/skills-sync.js +330 -0
- package/lib/smart-status/conflicts.js +205 -0
- package/lib/smart-status/scoring.js +191 -0
- package/lib/status/beads-snapshot.js +145 -0
- package/lib/status/presenter.js +216 -0
- package/lib/status/snapshot.js +186 -0
- package/lib/sync-backend.js +202 -0
- package/lib/untrusted-content.js +52 -0
- package/lib/upgrade-safety.js +199 -0
- package/lib/workflow/enforce-stage.js +298 -47
- package/lib/workflow/stage-transition.js +115 -0
- package/lib/workflow/stages.js +30 -6
- package/lib/workflow/state-manager.js +159 -14
- package/lib/workflow/state.js +23 -1
- package/lib/workflow-profiles.js +17 -5
- package/package.json +46 -36
- package/rules/documentation.md +19 -0
- package/rules/kernel-tracking.md +26 -0
- package/rules/security.md +22 -0
- package/rules/tdd.md +20 -0
- package/rules/workflow.md +27 -0
- package/scripts/auto-backing-issue.js +47 -0
- package/scripts/beads-context.sh +165 -22
- package/scripts/beads-migrate-to-dolt.sh +7 -0
- package/scripts/beads-upgrade-smoke.sh +284 -0
- package/scripts/behavioral-judge.sh +115 -11
- package/scripts/benchmark.js +349 -63
- package/scripts/bootstrap-windows-tools.sh +78 -0
- package/scripts/branch-protection.js +2 -3
- package/scripts/check-agents.js +34 -137
- package/scripts/commitlint.js +3 -1
- package/scripts/conflict-detect.sh +3 -0
- package/scripts/dep-guard-analyze.js +52 -17
- package/scripts/dep-guard-keyword-ripple.js +29 -0
- package/scripts/dep-guard-render-review.js +86 -0
- package/scripts/dep-guard.sh +64 -232
- package/scripts/file-index.sh +3 -0
- package/scripts/forge-team/lib/claim.sh +34 -18
- package/scripts/forge-team/lib/dashboard.sh +61 -86
- package/scripts/forge-team/lib/epic.sh +99 -263
- package/scripts/forge-team/lib/hooks.sh +26 -28
- package/scripts/forge-team/lib/identity.sh +4 -4
- package/scripts/forge-team/lib/sync-github.sh +144 -47
- package/scripts/forge-team/lib/verify.sh +93 -83
- package/scripts/forge-team/lib/workload.sh +41 -65
- package/scripts/forge-team/tests/claim.test.sh +25 -19
- package/scripts/forge-team/tests/dashboard.test.sh +31 -46
- package/scripts/forge-team/tests/epic.test.sh +52 -71
- package/scripts/forge-team/tests/hooks.test.sh +38 -50
- package/scripts/forge-team/tests/identity.test.sh +3 -3
- package/scripts/forge-team/tests/integration.test.sh +44 -66
- package/scripts/forge-team/tests/sync-github.test.sh +183 -79
- package/scripts/forge-team/tests/verify.test.sh +37 -46
- package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
- package/scripts/forge-team/tests/workload.test.sh +32 -66
- package/scripts/gen-command-manifest.js +153 -0
- package/scripts/gen-embedded-assets.mjs +129 -0
- package/scripts/install.ps1 +139 -0
- package/scripts/install.sh +268 -0
- package/scripts/lib/beads-migrate-to-dolt.mjs +503 -0
- package/scripts/lib/release-asset.mjs +84 -0
- package/scripts/parity-check.mjs +145 -0
- package/scripts/parity-check.test.mjs +58 -0
- package/scripts/pin-agentic-workflow-images.js +112 -0
- package/scripts/pr-coordinator.sh +3 -0
- package/scripts/preflight-sonar.eslint.config.mjs +44 -0
- package/scripts/preflight.sh +108 -0
- package/scripts/protected-state-check.js +104 -0
- package/scripts/smart-status-score.js +31 -0
- package/scripts/smart-status-sessions.js +51 -0
- package/scripts/smart-status.sh +117 -369
- package/scripts/spikes/config-race-bench.js +111 -0
- package/scripts/spikes/harness-capability-matrix.js +13 -0
- package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
- package/scripts/spikes/protected-path-manifest.js +20 -0
- package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
- package/scripts/sync-agent-skills.js +62 -0
- package/scripts/sync-agentic-workflow.js +48 -0
- package/scripts/sync-utils.sh +3 -0
- package/scripts/test-ci-shard.js +251 -0
- package/scripts/test-dashboard.js +188 -52
- package/scripts/test-full-suite.js +186 -0
- package/scripts/test-profile.js +278 -0
- package/scripts/test.js +302 -28
- package/scripts/validate.js +143 -0
- package/scripts/validate.sh +18 -1
- package/skills/claim-safety/SKILL.md +102 -0
- package/skills/claim-safety/evals/evals.json +46 -0
- package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +46 -52
- package/skills/dev/evals/evals.json +50 -0
- package/skills/hermes-forge/SKILL.md +185 -0
- package/skills/hermes-forge/evals/evals.json +46 -0
- package/skills/issue-basics/SKILL.md +111 -0
- package/skills/issue-basics/evals/evals.json +46 -0
- package/skills/kernel/SKILL.md +166 -0
- package/skills/kernel/evals/evals.json +50 -0
- package/skills/memory/SKILL.md +102 -0
- package/skills/parallel-deep-research/SKILL.md +14 -11
- package/skills/parallel-deep-research/evals/evals.json +11 -27
- package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +134 -159
- package/skills/plan/evals/evals.json +42 -0
- package/skills/research/SKILL.md +195 -0
- package/skills/research/evals/evals.json +42 -0
- package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
- package/skills/review/evals/evals.json +42 -0
- package/skills/rollback/SKILL.md +110 -0
- package/skills/rollback/evals/evals.json +46 -0
- package/skills/rollback/references/methods.md +204 -0
- package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
- package/skills/shepherd/SKILL.md +66 -0
- package/skills/shepherd/evals/evals.json +42 -0
- package/skills/ship/SKILL.md +251 -0
- package/skills/ship/evals/evals.json +42 -0
- package/skills/smith/SKILL.md +142 -0
- package/skills/smith/evals/evals.json +46 -0
- package/skills/smith/references/autonomy-and-gates.md +94 -0
- package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
- package/skills/sonarcloud/evals/evals.json +46 -0
- package/skills/sonarcloud-analysis/SKILL.md +18 -13
- package/skills/sonarcloud-analysis/evals/evals.json +11 -15
- package/skills/status/SKILL.md +102 -0
- package/skills/status/evals/evals.json +50 -0
- package/skills/triage-ready/SKILL.md +121 -0
- package/skills/triage-ready/evals/evals.json +42 -0
- package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
- package/skills/validate/evals/evals.json +42 -0
- package/skills/verify/SKILL.md +299 -0
- package/skills/verify/evals/evals.json +50 -0
- package/.claude/commands/dev.md +0 -345
- package/.claude/commands/plan.md +0 -566
- package/.claude/commands/premerge.md +0 -186
- package/.claude/commands/research.md +0 -42
- package/.claude/commands/review.md +0 -451
- package/.claude/commands/rollback.md +0 -721
- package/.claude/commands/ship.md +0 -213
- package/.claude/commands/sonarcloud.md +0 -152
- package/.claude/commands/status.md +0 -90
- package/.claude/commands/validate.md +0 -288
- package/.claude/commands/verify.md +0 -269
- package/.claude/rules/workflow.md +0 -121
- package/.cline/workflows/dev.md +0 -342
- package/.cline/workflows/plan.md +0 -563
- package/.cline/workflows/premerge.md +0 -183
- package/.cline/workflows/research.md +0 -39
- package/.cline/workflows/review.md +0 -448
- package/.cline/workflows/rollback.md +0 -718
- package/.cline/workflows/ship.md +0 -210
- package/.cline/workflows/sonarcloud.md +0 -146
- package/.cline/workflows/status.md +0 -87
- package/.cline/workflows/validate.md +0 -285
- package/.cline/workflows/verify.md +0 -266
- package/.codex/config.toml +0 -11
- package/.codex/skills/dev/SKILL.md +0 -345
- package/.codex/skills/plan/SKILL.md +0 -566
- package/.codex/skills/premerge/SKILL.md +0 -186
- package/.codex/skills/research/SKILL.md +0 -42
- package/.codex/skills/review/SKILL.md +0 -451
- package/.codex/skills/rollback/SKILL.md +0 -721
- package/.codex/skills/ship/SKILL.md +0 -213
- package/.codex/skills/sonarcloud/SKILL.md +0 -149
- package/.codex/skills/status/SKILL.md +0 -90
- package/.codex/skills/validate/SKILL.md +0 -288
- package/.codex/skills/verify/SKILL.md +0 -269
- package/.cursor/commands/dev.md +0 -342
- package/.cursor/commands/plan.md +0 -563
- package/.cursor/commands/premerge.md +0 -183
- package/.cursor/commands/research.md +0 -39
- package/.cursor/commands/review.md +0 -448
- package/.cursor/commands/ship.md +0 -210
- package/.cursor/commands/sonarcloud.md +0 -146
- package/.cursor/commands/status.md +0 -87
- package/.cursor/commands/validate.md +0 -285
- package/.cursor/commands/verify.md +0 -266
- package/.cursorrules +0 -149
- package/.github/prompts/premerge.prompt.md +0 -188
- package/.github/prompts/research.prompt.md +0 -44
- package/.github/prompts/rollback.prompt.md +0 -723
- package/.github/prompts/ship.prompt.md +0 -215
- package/.github/prompts/status.prompt.md +0 -92
- package/.github/prompts/verify.prompt.md +0 -271
- package/.github/workflows/beads-to-github.yml +0 -56
- package/.github/workflows/github-to-beads.yml +0 -97
- package/.kilocode/workflows/dev.md +0 -346
- package/.kilocode/workflows/plan.md +0 -567
- package/.kilocode/workflows/premerge.md +0 -187
- package/.kilocode/workflows/research.md +0 -43
- package/.kilocode/workflows/review.md +0 -452
- package/.kilocode/workflows/rollback.md +0 -722
- package/.kilocode/workflows/ship.md +0 -214
- package/.kilocode/workflows/sonarcloud.md +0 -150
- package/.kilocode/workflows/status.md +0 -91
- package/.kilocode/workflows/validate.md +0 -289
- package/.kilocode/workflows/verify.md +0 -270
- package/.opencode/commands/dev.md +0 -345
- package/.opencode/commands/plan.md +0 -566
- package/.opencode/commands/premerge.md +0 -186
- package/.opencode/commands/research.md +0 -42
- package/.opencode/commands/review.md +0 -451
- package/.opencode/commands/rollback.md +0 -721
- package/.opencode/commands/ship.md +0 -213
- package/.opencode/commands/sonarcloud.md +0 -149
- package/.opencode/commands/status.md +0 -90
- package/.opencode/commands/validate.md +0 -288
- package/.opencode/commands/verify.md +0 -269
- package/.roo/commands/dev.md +0 -346
- package/.roo/commands/plan.md +0 -567
- package/.roo/commands/premerge.md +0 -187
- package/.roo/commands/research.md +0 -43
- package/.roo/commands/review.md +0 -452
- package/.roo/commands/rollback.md +0 -722
- package/.roo/commands/ship.md +0 -214
- package/.roo/commands/sonarcloud.md +0 -150
- package/.roo/commands/status.md +0 -91
- package/.roo/commands/validate.md +0 -289
- package/.roo/commands/verify.md +0 -270
- package/docs/BEADS_GITHUB_SYNC.md +0 -255
- package/docs/GREPTILE_SETUP.md +0 -400
- package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
- package/docs/SETUP.md +0 -663
- package/docs/VALIDATION.md +0 -363
- package/lib/agents/cline.plugin.json +0 -29
- package/lib/agents/copilot.plugin.json +0 -24
- package/lib/agents/kilocode.plugin.json +0 -22
- package/lib/agents/opencode.plugin.json +0 -23
- package/lib/agents/roo.plugin.json +0 -30
- package/lib/beads-health-check.js +0 -143
- package/lib/commands/commands-reset.js +0 -147
- package/opencode.json +0 -67
- package/scripts/beads-context.test.js +0 -567
- package/scripts/github-beads-sync/comment.mjs +0 -64
- package/scripts/github-beads-sync/config.mjs +0 -148
- package/scripts/github-beads-sync/github-api.mjs +0 -131
- package/scripts/github-beads-sync/index.mjs +0 -332
- package/scripts/github-beads-sync/label-mapper.mjs +0 -54
- package/scripts/github-beads-sync/mapping.mjs +0 -78
- package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
- package/scripts/github-beads-sync/reverse-sync.mjs +0 -138
- package/scripts/github-beads-sync/run-bd.mjs +0 -161
- package/scripts/github-beads-sync/sanitize.mjs +0 -121
- package/scripts/github-beads-sync.config.json +0 -26
- package/scripts/sync-commands.js +0 -600
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Validation Reference
|
|
2
|
+
|
|
3
|
+
Forge validation is evidence, not a slogan. Record the command, result, and failure text when validation fails.
|
|
4
|
+
|
|
5
|
+
## Project Validation
|
|
6
|
+
|
|
7
|
+
In this repository:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
bun run check
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`bun run check` runs `scripts/validate.js` in this order:
|
|
14
|
+
|
|
15
|
+
1. `bun run typecheck`
|
|
16
|
+
2. `bun run lint`
|
|
17
|
+
3. `bun audit`
|
|
18
|
+
4. `node scripts/test.js --validate`
|
|
19
|
+
|
|
20
|
+
Security audit behavior distinguishes blocking high/critical vulnerabilities from lower-severity warnings.
|
|
21
|
+
|
|
22
|
+
## Supporting Commands
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
bun run typecheck
|
|
26
|
+
bun run lint
|
|
27
|
+
bun test --timeout 15000
|
|
28
|
+
bun run validate:yaml
|
|
29
|
+
npm pack --dry-run
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Use `npm pack --dry-run` for package contents and release-readiness checks. It does not publish.
|
|
33
|
+
|
|
34
|
+
## Agent Stage Validation
|
|
35
|
+
|
|
36
|
+
`/validate` is an agent workflow stage. It may include rebase/freshness checks, local validation, manual security review, and Beads context updates according to the installed stage instructions.
|
|
37
|
+
|
|
38
|
+
Do not confuse:
|
|
39
|
+
|
|
40
|
+
- `/validate` - agent stage workflow
|
|
41
|
+
- `forge-preflight` - prerequisite checker
|
|
42
|
+
- `bun run check` - repository validation script
|
|
43
|
+
|
|
44
|
+
## Work Artifact Paths
|
|
45
|
+
|
|
46
|
+
Current planning and validation evidence should point to:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
docs/work/YYYY-MM-DD-<slug>/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Legacy `docs/research/` or `docs/plans/` examples are historical unless a specific tool documents a compatibility fallback.
|
|
53
|
+
|
|
54
|
+
## Failure Recovery
|
|
55
|
+
|
|
56
|
+
Fix failures in order:
|
|
57
|
+
|
|
58
|
+
1. Typecheck
|
|
59
|
+
2. Lint
|
|
60
|
+
3. Security audit
|
|
61
|
+
4. Tests
|
|
62
|
+
5. Packaging
|
|
63
|
+
|
|
64
|
+
For each failure:
|
|
65
|
+
|
|
66
|
+
1. Reproduce with the exact command.
|
|
67
|
+
2. Read the first real error.
|
|
68
|
+
3. Fix the root cause.
|
|
69
|
+
4. Rerun the full validation command.
|
|
70
|
+
|
|
71
|
+
Do not proceed to ship with "should pass" or stale output.
|
|
72
|
+
|
|
73
|
+
## Documentation Changes
|
|
74
|
+
|
|
75
|
+
For docs-only changes, still run:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
bun run check
|
|
79
|
+
npm pack --dry-run
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Run a Markdown link check when available. If adding docs tooling would broaden the PR, file follow-up work instead.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Research: Per-Agent Permissions Configuration
|
|
2
|
+
|
|
3
|
+
> Historical research artifact. Do not treat this page as current setup behavior or current permission defaults. Current user-facing setup guidance lives in [Setup Guide](../guides/SETUP.md), and current skills/command packaging boundaries live in [Skills and command projections](SKILLS.md).
|
|
4
|
+
|
|
5
|
+
**Feature slug**: `agent-permissions`
|
|
6
|
+
**Beads issue**: forge-bo2
|
|
7
|
+
**Date**: 2026-02-24
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Objective
|
|
12
|
+
|
|
13
|
+
Every AI agent supported by Forge has its own permission/auto-approval system for terminal commands and file operations. Currently Forge ships no default permission config for any agent, meaning developers hit approval prompts constantly for safe, routine commands (git status, ls, bun run, bd list, etc.).
|
|
14
|
+
|
|
15
|
+
**Goal**: Ship project-level permission config files for all supported agents so that safe commands auto-run out of the box, while destructive commands still require explicit approval.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Codebase Analysis
|
|
20
|
+
|
|
21
|
+
### What already exists
|
|
22
|
+
|
|
23
|
+
| File | Agent | Status |
|
|
24
|
+
| ---- | ----- | ------ |
|
|
25
|
+
| `AGENTS.md` | Universal | ✅ Exists — workflow instructions only |
|
|
26
|
+
| `docs/SETUP.md` | All agents | ✅ Exists (635 lines) — no permissions section |
|
|
27
|
+
| `lib/agents/*.plugin.json` | 11 agents | ✅ All 11 plugin definitions exist |
|
|
28
|
+
| `.claude/settings.json` | Claude Code | ✅ Exists — project-level permissions present |
|
|
29
|
+
| `opencode.json` | Kilo/OpenCode | ❌ Missing |
|
|
30
|
+
| `.codex/config.toml` | Codex CLI | ❌ Missing |
|
|
31
|
+
| `.cursor/rules/permissions-guidance.mdc` | Cursor | ❌ Missing |
|
|
32
|
+
|
|
33
|
+
### Affected files
|
|
34
|
+
|
|
35
|
+
- `docs/SETUP.md` — add permissions section
|
|
36
|
+
- `opencode.json` — new file at project root
|
|
37
|
+
- `.codex/config.toml` — new file (directory must be created)
|
|
38
|
+
- `.cursor/rules/permissions-guidance.mdc` — new file (directory must be created)
|
|
39
|
+
|
|
40
|
+
### Integration points
|
|
41
|
+
|
|
42
|
+
- `docs/SETUP.md` has per-agent sections — permissions guidance slots naturally into each agent's section
|
|
43
|
+
- `.cursor/rules/` is referenced in `cursor.plugin.json` — adding a `.mdc` file there fits the existing pattern
|
|
44
|
+
- The `forge setup` command will need to be updated separately to copy these files to new projects (separate issue)
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Research Findings
|
|
49
|
+
|
|
50
|
+
### Agent Permission System Comparison
|
|
51
|
+
|
|
52
|
+
#### Claude Code — `.claude/settings.json`
|
|
53
|
+
- **Format**: JSON, `permissions.allow` array
|
|
54
|
+
- **Syntax**: `"Bash(git status:*)"` — command prefix with wildcard
|
|
55
|
+
- **Scope**: Project-level (committed) + global (`~/.claude/settings.json`) + local (gitignored)
|
|
56
|
+
- **Granularity**: Per-tool (Bash, Read, Edit, WebFetch, Skill, Task, MCP)
|
|
57
|
+
- **Evaluation**: First match in allow/deny wins
|
|
58
|
+
- **Status**: Already configured in this project's `.claude/settings.json`
|
|
59
|
+
|
|
60
|
+
#### Kilo Code + OpenCode — `opencode.json` (shared format)
|
|
61
|
+
- **Format**: JSON, `permission` object with nested patterns
|
|
62
|
+
- **Syntax**: `"git status *": "allow"` inside `bash` block
|
|
63
|
+
- **Scope**: Project root (project-level) OR `~/.config/kilo/opencode.json` (global)
|
|
64
|
+
- **Granularity**: bash, edit, external_directory, MCP, browser
|
|
65
|
+
- **Evaluation**: **Last matching rule wins** — put deny rules at the bottom
|
|
66
|
+
- **States**: `"allow"`, `"ask"`, `"deny"`
|
|
67
|
+
- **Sources**: [Kilo Code docs](https://kilo.ai/docs/features/auto-approving-actions), [OpenCode docs](https://opencode.ai/docs/permissions/)
|
|
68
|
+
|
|
69
|
+
#### OpenAI Codex CLI — `.codex/config.toml`
|
|
70
|
+
- **Format**: TOML
|
|
71
|
+
- **Syntax**: `approval_policy = "on-request"` + `sandbox_mode = "workspace-write"`
|
|
72
|
+
- **Scope**: `.codex/config.toml` (project) OR `~/.codex/config.toml` (global)
|
|
73
|
+
- **Granularity**: Policy-level (untrusted/on-request/never) + sandbox restrictions
|
|
74
|
+
- **States**: `untrusted` (approve all), `on-request` (agent decides), `never` (no prompts)
|
|
75
|
+
- **Best default**: `on-request` — agent uses built-in risk model, only asks when uncertain
|
|
76
|
+
- **Also supports**: `--full-auto` flag and `--yolo` (dangerous bypass)
|
|
77
|
+
- **Sources**: [Codex CLI config reference](https://developers.openai.com/codex/config-reference/)
|
|
78
|
+
|
|
79
|
+
#### Cursor — IDE Settings (YOLO Mode)
|
|
80
|
+
- **Format**: UI-only — configured in Cursor Settings > Features > Chat & Composer
|
|
81
|
+
- **Syntax**: `Bash(git status *)` in allow/deny lists (same format as Claude Code)
|
|
82
|
+
- **Scope**: IDE-level, not version-controlled — cannot be shipped as project file
|
|
83
|
+
- **Granularity**: Fine-grained per-command allow/deny lists
|
|
84
|
+
- **Approach for Forge**: Document recommended settings in `.cursor/rules/permissions-guidance.mdc`
|
|
85
|
+
- **Sources**: Cursor Settings UI
|
|
86
|
+
|
|
87
|
+
### Risk-Based Command Classification
|
|
88
|
+
|
|
89
|
+
| Risk Level | Commands | Default action |
|
|
90
|
+
| ---------- | -------- | -------------- |
|
|
91
|
+
| **Safe (read-only)** | git status/log/diff/branch, ls, cat, grep, find, pwd, which, bd list/show/stats | `allow` |
|
|
92
|
+
| **Safe (local write, reversible)** | git add, git commit, git stash, git checkout, bun/npm run, mkdir, touch, cp, mv | `allow` |
|
|
93
|
+
| **Medium (remote-affecting)** | git push, gh pr create, gh issue create | `allow` (intentional dev action) |
|
|
94
|
+
| **Careful (needs attention)** | git reset --hard, git rebase | `ask` |
|
|
95
|
+
| **Dangerous (destructive)** | rm -rf, git push --force, drop database | `deny` |
|
|
96
|
+
|
|
97
|
+
### Key Design Decisions
|
|
98
|
+
|
|
99
|
+
**Decision 1: Include `git push:*` in allow list**
|
|
100
|
+
- Reasoning: Developers push intentionally, constant prompting breaks flow
|
|
101
|
+
- Evidence: Volleyball project already allows it in settings.local.json
|
|
102
|
+
- Alternative: Keep as `ask` (rejected — too much friction for normal PRs)
|
|
103
|
+
|
|
104
|
+
**Decision 2: `on-request` not `never` for Codex CLI**
|
|
105
|
+
- Reasoning: `never` skips ALL prompts including network access and external edits; `on-request` lets the agent's risk model handle edge cases
|
|
106
|
+
- Evidence: Codex docs recommend `on-request` for interactive development
|
|
107
|
+
- Alternative: `never` for power users (can be documented as option)
|
|
108
|
+
|
|
109
|
+
**Decision 3: Documentation-only for Cursor**
|
|
110
|
+
- Reasoning: Cursor permissions are IDE-level settings, not project files — nothing to commit
|
|
111
|
+
- Evidence: No `settings.json`-like project file exists for Cursor
|
|
112
|
+
- Alternative: None — this is a platform limitation
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## TDD Test Scenarios
|
|
117
|
+
|
|
118
|
+
Since these are config files (not code), traditional unit tests don't apply. Verification is manual:
|
|
119
|
+
|
|
120
|
+
1. **opencode.json validity** — JSON parses without errors; `git status` and `bd list` run without prompt in Kilo Code or OpenCode
|
|
121
|
+
2. **.codex/config.toml validity** — TOML parses correctly; Codex CLI reads file at startup
|
|
122
|
+
3. **.cursor/rules/ presence** — File appears in Cursor's Rules panel; content is accurate
|
|
123
|
+
4. **docs/SETUP.md section** — Section is readable, links work, global config snippet is copy-pasteable and correct
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Security Analysis
|
|
128
|
+
|
|
129
|
+
### OWASP Top 10 Relevance
|
|
130
|
+
|
|
131
|
+
| Risk | Relevance | Mitigation |
|
|
132
|
+
| ---- | --------- | ---------- |
|
|
133
|
+
| **A01 Broken Access Control** | Medium — overly broad allow lists could let agents run unintended commands | Explicit deny rules for `rm -rf`, `git push --force`, `git reset --hard` |
|
|
134
|
+
| **A05 Security Misconfiguration** | Medium — shipping overly permissive defaults would be misconfigured | Conservative defaults: `approval_policy = "on-request"` |
|
|
135
|
+
| **A09 Security Logging** | Low — agent commands aren't logged by these configs | Mitigated by git history and Beads tracking |
|
|
136
|
+
|
|
137
|
+
### Agent-Specific Security Notes
|
|
138
|
+
|
|
139
|
+
- **opencode.json**: Deny rules must be at the bottom (last match wins) — putting them first would be ineffective
|
|
140
|
+
- **Codex CLI**: `sandbox_mode = "workspace-write"` prevents file access outside project root — keep this
|
|
141
|
+
- **Never ship**: `--dangerously-bypass-approvals-and-sandbox` (Codex) or global `"*": "allow"` (opencode.json)
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Scope Assessment
|
|
146
|
+
|
|
147
|
+
**Type**: Tactical (config files + docs update, no business logic)
|
|
148
|
+
**Complexity**: Low — all config formats researched, no code changes needed
|
|
149
|
+
**Parallelization**: All 3 config files can be created simultaneously; docs/SETUP.md update is sequential after
|
|
150
|
+
**Estimated files**: 4 new files, 1 modified
|
|
151
|
+
|
|
152
|
+
**Branch**: `feat/agent-permissions`
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Sources
|
|
157
|
+
|
|
158
|
+
- [Kilo Code - Auto-Approving Actions](https://kilo.ai/docs/features/auto-approving-actions)
|
|
159
|
+
- [OpenCode - Permissions](https://opencode.ai/docs/permissions/)
|
|
160
|
+
- [Codex CLI - Config Reference](https://developers.openai.com/codex/config-reference/)
|
|
161
|
+
- Forge project codebase analysis (2026-02-24)
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Next Step
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
/plan agent-permissions
|
|
169
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Beads To Kernel Migration UX
|
|
2
|
+
|
|
3
|
+
**Status**: 0.0.20 migration reference for Forge Kernel authority rollout.
|
|
4
|
+
|
|
5
|
+
**Related work**:
|
|
6
|
+
|
|
7
|
+
- PR A / `forge-2agy.2.1`: Kernel schema, migrations, and storage classifier.
|
|
8
|
+
- PR B / `forge-2agy.2.2`: Local SQLite WAL broker and command API contract.
|
|
9
|
+
- PR C / `forge-2agy.2.3`: Beads import/export adapter and fidelity report.
|
|
10
|
+
- PR D / `forge-2agy.2.4`: Conflict quarantine, idempotency, and evaluator fixtures.
|
|
11
|
+
- PR E / `forge-2agy.2.5`: Documentation and migration UX.
|
|
12
|
+
|
|
13
|
+
## User-Facing Position
|
|
14
|
+
|
|
15
|
+
Forge Kernel is the target issue authority. Beads remains compatibility input/output during the migration window so existing repositories can inspect, import, export, and recover issue state without treating `.beads` files as the new source of truth.
|
|
16
|
+
|
|
17
|
+
The migration UX should make three boundaries visible:
|
|
18
|
+
|
|
19
|
+
1. Import reads Beads state and creates Kernel-shaped records.
|
|
20
|
+
2. Export projects Kernel records back to Beads-compatible JSONL.
|
|
21
|
+
3. Projection failure does not invalidate Kernel authority.
|
|
22
|
+
|
|
23
|
+
## Current Compatibility
|
|
24
|
+
|
|
25
|
+
The Beads compatibility adapter is import/export only. It preserves issue IDs, statuses, priorities, parent-child dependencies, blockers, comments, close reasons, available timestamps, and fidelity counts where the current Beads projection exposes them.
|
|
26
|
+
|
|
27
|
+
Known compatibility gaps are explicit. Kernel schema v1 does not directly preserve every Beads field as first-class issue columns, so unsupported or non-authoritative fields must appear in the fidelity report rather than silently becoming Kernel authority.
|
|
28
|
+
|
|
29
|
+
## Recommended Operator Flow
|
|
30
|
+
|
|
31
|
+
1. Snapshot or back up the current Beads projection before migration.
|
|
32
|
+
2. Run import and review the fidelity report.
|
|
33
|
+
3. Keep export in dry-run mode until record counts, dependency edges, comments, close metadata, and unsupported-field gaps are understood.
|
|
34
|
+
4. If export writes are enabled, capture rollback snapshots for the Beads projection files before writing.
|
|
35
|
+
5. Treat any conflict or stale projection warning as a stop point until the quarantine report is reviewed.
|
|
36
|
+
|
|
37
|
+
## Rollback Boundaries
|
|
38
|
+
|
|
39
|
+
Import rollback is discard-only when import has not committed authoritative Kernel mutations. Discard the imported Kernel-shaped records and keep the original Beads projection unchanged.
|
|
40
|
+
|
|
41
|
+
Export rollback restores the previous Beads-compatible projection files captured before the export write. This rollback affects files such as `issues.jsonl`, `comments.jsonl`, and `dependencies.jsonl`; it does not roll back Kernel authority.
|
|
42
|
+
|
|
43
|
+
After Kernel command routing is active, a committed Kernel mutation must be reversed through a Kernel operation or a documented Kernel migration rollback. Do not use Beads export rollback as an authority rollback.
|
|
44
|
+
|
|
45
|
+
## Conflict Quarantine Boundary
|
|
46
|
+
|
|
47
|
+
Conflict quarantine is defined by the landed evaluator contract in [Kernel Conflict Evaluators](kernel-conflict-evaluators.md). Migration UX should reference that contract for exact quarantine behavior, evaluator evidence, and release-readiness checks.
|
|
48
|
+
|
|
49
|
+
The intended UX boundary is stable:
|
|
50
|
+
|
|
51
|
+
- stale revisions, duplicate writes, dependency cycles, and projection drift are detected before external projection;
|
|
52
|
+
- conflicting records are quarantined instead of projected as normal output;
|
|
53
|
+
- the operator gets enough detail to decide whether to repair source input, retry projection, or wait for a resolver path.
|
|
54
|
+
|
|
55
|
+
## Release Readiness Checklist
|
|
56
|
+
|
|
57
|
+
- Beads import fidelity report reviewed.
|
|
58
|
+
- Export dry-run reviewed before any write.
|
|
59
|
+
- Rollback snapshot path documented for write-enabled export.
|
|
60
|
+
- Projection failure behavior documented as non-authoritative rollback.
|
|
61
|
+
- Conflict quarantine behavior cross-checked against [Kernel Conflict Evaluators](kernel-conflict-evaluators.md).
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Control-plane guarantees — what each control state actually does
|
|
2
|
+
|
|
3
|
+
Status: beta (B6). Issues: `7dc59af2` (controls config + `forge control`),
|
|
4
|
+
`724356ea` (all-surface read + enforcement-locus badges). Epic: `363954dd`.
|
|
5
|
+
|
|
6
|
+
This document is the **contract** the cockpit badges and the `forge control`
|
|
7
|
+
command read from. It states, honestly and per surface, what a control state
|
|
8
|
+
*actually* does today — so the UI never sells enforcement Forge cannot deliver.
|
|
9
|
+
|
|
10
|
+
## Headline — the honest state of enforcement (as of 2026-07-15)
|
|
11
|
+
|
|
12
|
+
**The configurable gate/rail registry is NOT yet consumed by any runtime deny.**
|
|
13
|
+
An adversarial grep of every consumer of the resolved runtime graph found none
|
|
14
|
+
that refuses on `workflow.gates.<id>.enabled`. So setting a gate or rail to
|
|
15
|
+
`mandatory` vs `optional` today changes the **declared registry**, not runtime
|
|
16
|
+
behavior.
|
|
17
|
+
|
|
18
|
+
Real enforcement in Forge today lives **elsewhere, independent of these flags**:
|
|
19
|
+
|
|
20
|
+
- the **B3 lefthook TDD pre-commit hook** (blocks a commit that changes source
|
|
21
|
+
without tests),
|
|
22
|
+
- **B2 fail-closed `validate` / `preflight`** (these fail closed on their own
|
|
23
|
+
logic, *not* on `workflow.gates.<id>.enabled`),
|
|
24
|
+
- **`enforce-stage.js`** (blocks a stage on kernel-recorded stage **order +
|
|
25
|
+
completion**, again independent of these flags).
|
|
26
|
+
|
|
27
|
+
Because of this, **`ENFORCED` is reserved strictly for a wired runtime deny —
|
|
28
|
+
and that set is EMPTY for these flags today.** The badges below never say
|
|
29
|
+
`ENFORCED`; they say what is actually true (`DECLARED`, `DENY-ON-CHECK`,
|
|
30
|
+
`VERIFY (warn-only)`, `PRESENT (advisory)`). Wiring the registry to real
|
|
31
|
+
enforcement points is filed as separate post-beta work.
|
|
32
|
+
|
|
33
|
+
## The two axes
|
|
34
|
+
|
|
35
|
+
- **State** (author intent, written to config): `mandatory` · `optional` · `permission`.
|
|
36
|
+
- **Enforcement-locus** (what actually happens today, and *where*):
|
|
37
|
+
- `registry — declared, not yet enforced` — the flag is stored and reflected in
|
|
38
|
+
the resolved graph, but **no runtime code consumes it to deny**. (stage-exit
|
|
39
|
+
gates, rails)
|
|
40
|
+
- `run-time verify (warn-only, never denies)` — consumed at run time, but only
|
|
41
|
+
**warns**; never overturns the operation. (`gate.issue_verify`)
|
|
42
|
+
- `deny-on-check (no chokepoint yet)` — a real, deny-**capable** primitive
|
|
43
|
+
(`forge gate check`), but **no chokepoint auto-invokes it**, so nothing denies
|
|
44
|
+
on it yet. (human gates)
|
|
45
|
+
- `render-time presence-only` — written into harness config / discovered by
|
|
46
|
+
precedence; nothing denies at run time. **Advisory.** (mcp / rules / skills)
|
|
47
|
+
|
|
48
|
+
## The matrix — state × surface × what it actually does today
|
|
49
|
+
|
|
50
|
+
| Surface | Example ids | Controllable by `forge control`? | State it takes | Enforcement-locus | What it actually does today |
|
|
51
|
+
|---|---|---|---|---|---|
|
|
52
|
+
| **Stage gate** | `gate.plan-exit`, `gate.dev-exit`, `gate.validate-exit`, `gate.ship-entry` | **Yes** | `mandatory` / `optional` | `registry — declared, not yet enforced` | Writes the declared value into the resolved graph. **No runtime consumer reads it** — `enforce-stage.js` blocks on stage order + kernel completion, which is independent of this flag. Setting mandatory/optional changes nothing at run time (yet). Badge: `DECLARED (no runtime consumer yet)`. |
|
|
53
|
+
| **Issue-verify gate** | `gate.issue_verify` | **Yes** | `mandatory` / `optional` | `run-time verify (warn-only, never denies)` | Consumed by `lib/commands/_issue.js`: after a kernel write it re-reads and emits `verified` + `mismatches`, but **warn-only** — a mismatch prints a warning and never overturns the write's `ok`. `optional` skips the read-back. Badge: `VERIFY (warn-only)`. |
|
|
54
|
+
| **Human gate** | `gate.intent`, `gate.plan-approval`, `gate.merge` | **Yes** | `permission` / `optional` | `deny-on-check (no chokepoint yet)` | The `forge gate approve` / `forge gate check` primitives are real and deny-**capable**: with the gate active, `forge gate check <issue> <id>` exits non-zero until a durable `gate.approved` event exists (`lib/gate-events.js`). But **no chokepoint auto-invokes `forge gate check`**, so nothing denies on it unless a skill/CI explicitly calls it. Badge: `DENY-ON-CHECK`. |
|
|
55
|
+
| **L1 rail** | `rail.kernel_tracking` (unlocked); other rails (locked) | **Yes** (unlocked only) | `mandatory` / `optional` | `registry — declared, not yet enforced` | Writes the declared value; the resolved graph reflects it. **No runtime refusal exists** — the flag is read only by `gate.js` id-maps, not by an enforcement chokepoint. Locked rails cannot be lowered. Badge: `DECLARED (no runtime consumer yet)`. |
|
|
56
|
+
| **MCP server** | `mcp.*` | **No — refused** | — | `render-time presence-only` | Rendered into harness MCP config. Presence advises the agent a tool exists; Forge does **not** deny at run time. Not enforceable. Badge: `PRESENT (advisory)`. |
|
|
57
|
+
| **Rule** | `rule.*` (`rules/*.md`) | **No — refused** | — | `render-time presence-only` | Injected as agent guidance. No run-time deny. Advisory. Badge: `PRESENT (advisory)`. |
|
|
58
|
+
| **Skill** | `skill.*` | **No — refused** | — | `render-time presence-only` | Discovered by precedence (`.skills/` > `skills/` > packaged). Presence, not enforcement. Advisory. Badge: `PRESENT (advisory)`. |
|
|
59
|
+
|
|
60
|
+
## How the tri-state maps onto Forge's real config (single source of truth)
|
|
61
|
+
|
|
62
|
+
The one config field `forge control` writes is **`workflow.gates.<id>.enabled`**
|
|
63
|
+
in `.forge/config.yaml` — the field the resolver (`applyEnabledConfig` in
|
|
64
|
+
`lib/core/runtime-graph.js`) consumes into the resolved graph, shared by gates
|
|
65
|
+
and unlocked rails (`gate.*` / `rail.*` namespaces are disjoint). `forge control`
|
|
66
|
+
reuses exactly this field — it does **not** add a parallel `controls:` key,
|
|
67
|
+
because a key nothing reads would be doubly-fake. The tri-state is the
|
|
68
|
+
*vocabulary*; `enabled` is the stored *truth*; state is **derived**, never stored
|
|
69
|
+
twice.
|
|
70
|
+
|
|
71
|
+
**Important:** writing this field changes the **declared registry** the read view
|
|
72
|
+
and `forge options` reflect. It does **not**, today, change what any runtime
|
|
73
|
+
chokepoint does (see the headline). The mapping:
|
|
74
|
+
|
|
75
|
+
| State | Config written | Applies to | Effect today |
|
|
76
|
+
|---|---|---|---|
|
|
77
|
+
| `mandatory` | `workflow.gates.<id>.enabled = true` | stage gates, rails | declared active in the registry; no runtime consumer denies on it |
|
|
78
|
+
| `optional` | `workflow.gates.<id>.enabled = false` | unlocked gates & rails | declared off; for `gate.issue_verify`, actually skips the warn-only read-back |
|
|
79
|
+
| `permission` | `workflow.gates.<id>.enabled = true` | human gates only | keeps the gate active, so `forge gate check` *can* deny if a chokepoint calls it (none does yet) |
|
|
80
|
+
|
|
81
|
+
Read-back derives the label from `(enabled, locked, isHumanGate)`:
|
|
82
|
+
- human gate + enabled → `permission`; human gate + disabled → `optional`.
|
|
83
|
+
- non-human gate/rail + enabled → `mandatory`; + disabled → `optional`.
|
|
84
|
+
- `locked` primitives are always `mandatory` and render a `LOCKED` badge (cannot be lowered).
|
|
85
|
+
|
|
86
|
+
## What `forge control` refuses, and why
|
|
87
|
+
|
|
88
|
+
- **`permission` on a non-human gate or rail** — refused: the approve/check
|
|
89
|
+
primitive only applies to the three human gates; elsewhere `permission` has no
|
|
90
|
+
path at all.
|
|
91
|
+
- **`optional` on a `locked` primitive** — refused: mirrors
|
|
92
|
+
`Cannot disable locked gate` in `forge gate`.
|
|
93
|
+
- **Any `mcp.*` / `rule.*` / `skill.*` id** — refused with:
|
|
94
|
+
*"<id> is presence-only, not enforceable — Forge has no run-time deny for this
|
|
95
|
+
surface. See docs/reference/control-plane-guarantees.md."* These are read-only
|
|
96
|
+
in the cockpit; their badge is `PRESENT (advisory)`.
|
|
97
|
+
|
|
98
|
+
## Badge vocabulary (what the read view / dashboard renders)
|
|
99
|
+
|
|
100
|
+
Driven entirely by the honest enforcement-locus above — never by author intent:
|
|
101
|
+
|
|
102
|
+
- `DECLARED (no runtime consumer yet)` — `registry — declared, not yet enforced`
|
|
103
|
+
(stage-exit gates, rails).
|
|
104
|
+
- `VERIFY (warn-only)` — `run-time verify (warn-only, never denies)`
|
|
105
|
+
(`gate.issue_verify`).
|
|
106
|
+
- `DENY-ON-CHECK` — `deny-on-check (no chokepoint yet)` (human gates).
|
|
107
|
+
- `OFF (optional)` — a controllable flag set to `optional`.
|
|
108
|
+
- `PRESENT (advisory)` — `render-time presence-only` (mcp/rules/skills).
|
|
109
|
+
- `· LOCKED` — appended to a locked primitive that cannot be lowered.
|
|
110
|
+
- `ENFORCED (...)` — **reserved for a wired runtime deny; emitted by NOTHING
|
|
111
|
+
today** (the set is empty until the registry is wired to enforcement points).
|
|
112
|
+
|
|
113
|
+
A surface's badge reflects **where and whether** it is actually consumed, so the
|
|
114
|
+
UI can never imply enforcement it lacks.
|
|
115
|
+
|
|
116
|
+
## Deferred (out of B6 scope, filed separately)
|
|
117
|
+
|
|
118
|
+
- **Wire the configurable gates/rails to real enforcement points** — the bigger
|
|
119
|
+
work that would let a `mandatory` gate/rail actually deny at run time. Filed as
|
|
120
|
+
separate post-beta work; B6 deliberately does *not* attempt it. B6's deliverable
|
|
121
|
+
is the honest vocabulary + matrix, not new enforcement.
|
|
122
|
+
- **Control for advisory surfaces** (mcp/rules/skills) — no run-time deny path
|
|
123
|
+
exists; they stay read-only + `PRESENT (advisory)`.
|
|
124
|
+
- **Live/SSE updates** — a separate stubbed issue; the read view is a
|
|
125
|
+
point-in-time snapshot.
|