@hassangameryt/freeflow 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +1 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +1 -1
- package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +1 -1
- package/README.md +19 -14
- package/assets/freeflow-plugin-icon.png +0 -0
- package/{plugins/freeflow/command-surface.json → command-surface.json} +10 -2
- package/evals/README.md +32 -0
- package/evals/fixtures/copy-conventions.md +31 -0
- package/evals/fixtures/output-router/README.md +12 -0
- package/evals/fixtures/output-router/failed-command-output.txt +9 -0
- package/evals/fixtures/output-router/large-router-manual.md +63 -0
- package/evals/fixtures/output-router/native-large-output.txt +40 -0
- package/evals/fixtures/output-router/noisy-test-output.txt +30 -0
- package/evals/fixtures/output-router/verification-output.txt +8 -0
- package/evals/fixtures/tiny-artifact-review-app/README.md +5 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +21 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +24 -0
- package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +17 -0
- package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +14 -0
- package/evals/fixtures/tiny-commit-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +5 -0
- package/evals/fixtures/tiny-commit-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-everything-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +5 -0
- package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-staged-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +5 -0
- package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +15 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +3 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +3 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +3 -0
- package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-dashboard-stale-app/README.md +11 -0
- package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +13 -0
- package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +19 -0
- package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +9 -0
- package/evals/fixtures/tiny-decision-destination-app/README.md +6 -0
- package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +8 -0
- package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +4 -0
- package/evals/fixtures/tiny-design-depth-app/README.md +15 -0
- package/evals/fixtures/tiny-design-depth-app/src/routes.ts +25 -0
- package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +3 -0
- package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +3 -0
- package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +3 -0
- package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +12 -0
- package/evals/fixtures/tiny-eval-method-app/README.md +8 -0
- package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +5 -0
- package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +17 -0
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +11 -0
- package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +3 -0
- package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +10 -0
- package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +10 -0
- package/evals/fixtures/tiny-execute-plan-app/README.md +5 -0
- package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +5 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +11 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +12 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +15 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +9 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +9 -0
- package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +9 -0
- package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +7 -0
- package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-execute-review-loop-app/README.md +5 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +9 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +12 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +15 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +11 -0
- package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +9 -0
- package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +7 -0
- package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-flaky-session-app/README.md +10 -0
- package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +13 -0
- package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +8 -0
- package/evals/fixtures/tiny-handoff-app/README.md +5 -0
- package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +8 -0
- package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +11 -0
- package/evals/fixtures/tiny-handoff-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-handoff-report-app/README.md +3 -0
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +1 -0
- package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +1 -0
- package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +4 -0
- package/evals/fixtures/tiny-plan-app/README.md +5 -0
- package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +25 -0
- package/evals/fixtures/tiny-plan-app/src/billing.ts +17 -0
- package/evals/fixtures/tiny-plan-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-plan-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-plan-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-plan-strict-api-app/README.md +3 -0
- package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +5 -0
- package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +25 -0
- package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +5 -0
- package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +3 -0
- package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +3 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +15 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +16 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +15 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +16 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +3 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +15 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +16 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-report-performance-app/README.md +11 -0
- package/evals/fixtures/tiny-report-performance-app/docs/performance.md +10 -0
- package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +29 -0
- package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +8 -0
- package/evals/fixtures/tiny-review-request-app/README.md +3 -0
- package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +5 -0
- package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +19 -0
- package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +20 -0
- package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +25 -0
- package/evals/fixtures/tiny-review-request-app/src/billing.ts +11 -0
- package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +19 -0
- package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +8 -0
- package/evals/fixtures/tiny-review-work-app/README.md +5 -0
- package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +9 -0
- package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +12 -0
- package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +15 -0
- package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +9 -0
- package/evals/fixtures/tiny-review-work-app/src/billing.ts +7 -0
- package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +7 -0
- package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +5 -0
- package/evals/fixtures/tiny-saas-app/README.md +16 -0
- package/evals/fixtures/tiny-saas-app/docs/auth-review.md +15 -0
- package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +10 -0
- package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +15 -0
- package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +13 -0
- package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +12 -0
- package/evals/fixtures/tiny-saas-app/src/billing.ts +20 -0
- package/evals/fixtures/tiny-saas-app/src/login-copy.ts +1 -0
- package/evals/fixtures/tiny-saas-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +8 -0
- package/evals/fixtures/tiny-saas-app/tests/billing.test.md +8 -0
- package/evals/fixtures/tiny-saas-app/tests/copy.test.md +7 -0
- package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +6 -0
- package/evals/fixtures/tiny-setup-both-app/AGENTS.md +5 -0
- package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +5 -0
- package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +6 -0
- package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +5 -0
- package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +6 -0
- package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +6 -0
- package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +14 -0
- package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +6 -0
- package/evals/fixtures/tiny-skill-dev-app/README.md +10 -0
- package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +8 -0
- package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +17 -0
- package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +13 -0
- package/evals/fixtures/tiny-team-app/README.md +5 -0
- package/evals/fixtures/tiny-team-app/docs/product.md +6 -0
- package/evals/fixtures/tiny-team-app/src/teams.ts +9 -0
- package/evals/fixtures/tiny-team-app/src/users.ts +5 -0
- package/evals/fixtures/tiny-team-app/tests/teams.test.md +7 -0
- package/evals/fixtures/tiny-verify-app/README.md +5 -0
- package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +1 -0
- package/evals/fixtures/tiny-verify-app/src/settings-page.ts +1 -0
- package/evals/fixtures/tiny-verify-app/tests/settings.test.md +7 -0
- package/evals/prompts/aon-001.txt +2 -0
- package/evals/prompts/byp-001.txt +2 -0
- package/evals/prompts/byp-002.txt +2 -0
- package/evals/prompts/cap-001.txt +3 -0
- package/evals/prompts/cap-002.txt +3 -0
- package/evals/prompts/cmd-001.txt +3 -0
- package/evals/prompts/cmd-002.txt +3 -0
- package/evals/prompts/cmd-003.txt +6 -0
- package/evals/prompts/cmd-004.txt +5 -0
- package/evals/prompts/cmd-005.txt +5 -0
- package/evals/prompts/cmd-006.txt +5 -0
- package/evals/prompts/cmd-007.txt +5 -0
- package/evals/prompts/cmd-008.txt +5 -0
- package/evals/prompts/cmd-009.txt +8 -0
- package/evals/prompts/cmd-010.txt +5 -0
- package/evals/prompts/cmd-011.txt +5 -0
- package/evals/prompts/cmd-012.txt +5 -0
- package/evals/prompts/cmd-013.txt +5 -0
- package/evals/prompts/cmd-014.txt +7 -0
- package/evals/prompts/cmd-015.txt +7 -0
- package/evals/prompts/cmd-016.txt +5 -0
- package/evals/prompts/cmt-001.txt +1 -0
- package/evals/prompts/cmt-002.txt +1 -0
- package/evals/prompts/cmt-003.txt +1 -0
- package/evals/prompts/cmt-004.txt +1 -0
- package/evals/prompts/cmt-005.txt +1 -0
- package/evals/prompts/dfd-001.txt +3 -0
- package/evals/prompts/dia-001.txt +3 -0
- package/evals/prompts/dia-002.txt +3 -0
- package/evals/prompts/dia-003.txt +3 -0
- package/evals/prompts/dis-001.txt +5 -0
- package/evals/prompts/dis-002.txt +5 -0
- package/evals/prompts/esk-001.txt +5 -0
- package/evals/prompts/esk-002.txt +5 -0
- package/evals/prompts/esk-003.txt +5 -0
- package/evals/prompts/grc-001.txt +3 -0
- package/evals/prompts/hof-001.txt +3 -0
- package/evals/prompts/hof-002.txt +1 -0
- package/evals/prompts/hof-003.txt +1 -0
- package/evals/prompts/hof-004.txt +1 -0
- package/evals/prompts/hof-005.txt +1 -0
- package/evals/prompts/ivg-001.txt +1 -0
- package/evals/prompts/ivg-002.txt +11 -0
- package/evals/prompts/ivg-003.txt +1 -0
- package/evals/prompts/ivg-004.txt +1 -0
- package/evals/prompts/mode-001.txt +3 -0
- package/evals/prompts/mode-002.txt +1 -0
- package/evals/prompts/mode-003.txt +3 -0
- package/evals/prompts/mode-004.txt +3 -0
- package/evals/prompts/mode-005.txt +3 -0
- package/evals/prompts/mode-006.txt +3 -0
- package/evals/prompts/mode-007.txt +3 -0
- package/evals/prompts/otr-001.txt +3 -0
- package/evals/prompts/otr-002.txt +3 -0
- package/evals/prompts/rar-001.txt +5 -0
- package/evals/prompts/rar-002.txt +3 -0
- package/evals/prompts/rar-003.txt +6 -0
- package/evals/prompts/rar-004.txt +15 -0
- package/evals/prompts/rar-005.txt +10 -0
- package/evals/prompts/rbr-001.txt +3 -0
- package/evals/prompts/rbr-002.txt +3 -0
- package/evals/prompts/rbr-003.txt +7 -0
- package/evals/prompts/rev-001.txt +3 -0
- package/evals/prompts/rev-002.txt +5 -0
- package/evals/prompts/rev-003.txt +6 -0
- package/evals/prompts/rev-004.txt +1 -0
- package/evals/prompts/rev-005.txt +15 -0
- package/evals/prompts/rev-006.txt +5 -0
- package/evals/prompts/stp-001.txt +1 -0
- package/evals/prompts/stp-002.txt +1 -0
- package/evals/prompts/stp-003.txt +1 -0
- package/evals/prompts/stp-004.txt +1 -0
- package/evals/prompts/stp-005.txt +1 -0
- package/evals/prompts/stp-006.txt +1 -0
- package/evals/prompts/stp-007.txt +1 -0
- package/evals/prompts/stp-008.txt +1 -0
- package/evals/prompts/stp-009.txt +1 -0
- package/evals/prompts/stp-010.txt +1 -0
- package/evals/prompts/stp-011.txt +1 -0
- package/evals/prompts/vfy-003.txt +1 -0
- package/evals/prompts/wpl-001.txt +3 -0
- package/evals/prompts/wpl-002.txt +5 -0
- package/evals/prompts/wpl-003.txt +3 -0
- package/evals/prompts/wpl-004.txt +5 -0
- package/evals/prompts/wpl-005.txt +1 -0
- package/evals/prompts/wrc-001.txt +10 -0
- package/evals/prompts/wrc-002.txt +3 -0
- package/evals/prompts/wsk-001.txt +6 -0
- package/evals/prompts/wsp-001.txt +5 -0
- package/evals/prompts/wsp-002.txt +15 -0
- package/evals/prompts/wsp-003.txt +3 -0
- package/evals/prompts/wsp-004.txt +15 -0
- package/evals/prompts/wsp-005.txt +5 -0
- package/evals/prompts/wsp-006.txt +12 -0
- package/evals/prompts/wsp-007.txt +9 -0
- package/evals/prompts/wsp-008.txt +13 -0
- package/evals/prompts/xpl-001.txt +1 -0
- package/evals/prompts/xpl-002.txt +3 -0
- package/evals/prompts/xpl-003.txt +3 -0
- package/evals/prompts/xpl-004.txt +3 -0
- package/evals/prompts/xpl-005.txt +5 -0
- package/evals/prompts/xpl-006.txt +3 -0
- package/evals/registries/adversarial-evals.json +39 -0
- package/evals/registries/fixture-evals.json +2513 -0
- package/evals/registries/handoff-evals.json +74 -0
- package/evals/registries/legacy-evals.json +147 -0
- package/evals/registries/skill-evidence.json +193 -0
- package/evals/registries/verify-work-evals.json +46 -0
- package/evals/reports/acceptance/v0.1-acceptance-report.md +130 -0
- package/evals/reports/by-command-surface/command-surface-1-report.md +45 -0
- package/evals/reports/by-command-surface/command-surface-10-report.md +76 -0
- package/evals/reports/by-command-surface/command-surface-11-report.md +77 -0
- package/evals/reports/by-command-surface/command-surface-12-report.md +91 -0
- package/evals/reports/by-command-surface/command-surface-13-report.md +64 -0
- package/evals/reports/by-command-surface/command-surface-14-report.md +66 -0
- package/evals/reports/by-command-surface/command-surface-15-report.md +124 -0
- package/evals/reports/by-command-surface/command-surface-16-report.md +39 -0
- package/evals/reports/by-command-surface/command-surface-2-report.md +80 -0
- package/evals/reports/by-command-surface/command-surface-3-report.md +86 -0
- package/evals/reports/by-command-surface/command-surface-4-report.md +76 -0
- package/evals/reports/by-command-surface/command-surface-5-report.md +80 -0
- package/evals/reports/by-command-surface/command-surface-6-report.md +74 -0
- package/evals/reports/by-command-surface/command-surface-7-report.md +84 -0
- package/evals/reports/by-command-surface/command-surface-8-report.md +79 -0
- package/evals/reports/by-command-surface/command-surface-9-report.md +79 -0
- package/evals/reports/by-command-surface/command-surface-matrix.md +91 -0
- package/evals/reports/by-skill/bypass-1-report.md +124 -0
- package/evals/reports/by-skill/capture-decisions-1-report.md +99 -0
- package/evals/reports/by-skill/capture-decisions-2-report.md +102 -0
- package/evals/reports/by-skill/commit-work-1-report.md +165 -0
- package/evals/reports/by-skill/commit-work-2-report.md +109 -0
- package/evals/reports/by-skill/design-for-depth-1-report.md +95 -0
- package/evals/reports/by-skill/diagnose-failure-1-report.md +91 -0
- package/evals/reports/by-skill/diagnose-failure-2-report.md +94 -0
- package/evals/reports/by-skill/discover-1-report.md +118 -0
- package/evals/reports/by-skill/evaluate-skill-2-report.md +71 -0
- package/evals/reports/by-skill/execute-plan-1-report.md +103 -0
- package/evals/reports/by-skill/execute-plan-2-report.md +112 -0
- package/evals/reports/by-skill/execute-plan-3-report.md +87 -0
- package/evals/reports/by-skill/grill-context-1-report.md +103 -0
- package/evals/reports/by-skill/handoff-1-report.md +123 -0
- package/evals/reports/by-skill/handoff-2-report.md +105 -0
- package/evals/reports/by-skill/handoff-3-report.md +100 -0
- package/evals/reports/by-skill/handoff-7-report.md +77 -0
- package/evals/reports/by-skill/interview-gate-1-report.md +63 -0
- package/evals/reports/by-skill/interview-gate-2-report.md +105 -0
- package/evals/reports/by-skill/mode-contract-1-report.md +74 -0
- package/evals/reports/by-skill/mode-contract-2-report.md +87 -0
- package/evals/reports/by-skill/mode-contract-3-report.md +65 -0
- package/evals/reports/by-skill/mode-contract-4-report.md +71 -0
- package/evals/reports/by-skill/mode-contract-5-report.md +70 -0
- package/evals/reports/by-skill/output-router-1-report.md +76 -0
- package/evals/reports/by-skill/output-router-2-report.md +65 -0
- package/evals/reports/by-skill/research-1-report.md +144 -0
- package/evals/reports/by-skill/research-brief-1-report.md +94 -0
- package/evals/reports/by-skill/research-brief-2-report.md +75 -0
- package/evals/reports/by-skill/review-artifact-1-report.md +91 -0
- package/evals/reports/by-skill/review-artifact-2-report.md +79 -0
- package/evals/reports/by-skill/review-artifact-3-report.md +120 -0
- package/evals/reports/by-skill/review-artifact-4-report.md +89 -0
- package/evals/reports/by-skill/review-artifact-5-report.md +66 -0
- package/evals/reports/by-skill/review-work-1-report.md +85 -0
- package/evals/reports/by-skill/review-work-2-report.md +87 -0
- package/evals/reports/by-skill/review-work-3-report.md +104 -0
- package/evals/reports/by-skill/review-work-4-report.md +108 -0
- package/evals/reports/by-skill/review-work-5-report.md +73 -0
- package/evals/reports/by-skill/review-work-6-report.md +66 -0
- package/evals/reports/by-skill/setup-freeflow-1-report.md +199 -0
- package/evals/reports/by-skill/setup-freeflow-2-report.md +105 -0
- package/evals/reports/by-skill/setup-freeflow-3-report.md +105 -0
- package/evals/reports/by-skill/setup-freeflow-4-report.md +88 -0
- package/evals/reports/by-skill/setup-freeflow-5-report.md +115 -0
- package/evals/reports/by-skill/skill-authoring-1-report.md +81 -0
- package/evals/reports/by-skill/verify-work-1-report.md +111 -0
- package/evals/reports/by-skill/verify-work-2-report.md +120 -0
- package/evals/reports/by-skill/workflow-1-report.md +65 -0
- package/evals/reports/by-skill/write-plan-1-report.md +123 -0
- package/evals/reports/by-skill/write-plan-2-report.md +98 -0
- package/evals/reports/by-skill/write-plan-3-report.md +110 -0
- package/evals/reports/by-skill/write-spec-1-report.md +88 -0
- package/evals/reports/by-skill/write-spec-2-report.md +89 -0
- package/evals/reports/by-skill/write-spec-3-report.md +90 -0
- package/evals/reports/by-skill/write-spec-4-report.md +167 -0
- package/evals/reports/harness/claude-harness-1-report.md +103 -0
- package/evals/reports/harness/eval-harness-1-report.md +91 -0
- package/evals/reports/iterations/iteration-1-report.md +71 -0
- package/evals/reports/iterations/iteration-2-report.md +78 -0
- package/evals/reports/iterations/iteration-3-report.md +118 -0
- package/evals/reports/iterations/iteration-4-report.md +131 -0
- package/evals/reports/iterations/iteration-5-report.md +149 -0
- package/evals/reports/iterations/iteration-6-report.md +136 -0
- package/evals/reports/runtime/always-on-runtime-1-report.md +107 -0
- package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +52 -0
- package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +410 -0
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +203 -0
- package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +51 -0
- package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +99 -0
- package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +166 -0
- package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +96 -0
- package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +151 -0
- package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +233 -0
- package/evals/reports/runtime/jq-script-derive-execution-1-report.md +215 -0
- package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +67 -0
- package/evals/reports/runtime/output-router-benchmark-1-report.md +81 -0
- package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +35 -0
- package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +150 -0
- package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +46 -0
- package/evals/reports/runtime/output-router-command-benchmark-1-report.md +62 -0
- package/evals/reports/runtime/output-router-index-benchmark-1-report.md +64 -0
- package/evals/reports/runtime/output-router-regression-1-report.md +81 -0
- package/evals/reports/runtime/output-router-transform-eval-1-report.md +28 -0
- package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +44 -0
- package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +159 -0
- package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +55 -0
- package/evals/reports/runtime/render-format-row-protocol-1-report.md +58 -0
- package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +84 -0
- package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +51 -0
- package/evals/reports/runtime/storage-policy-benchmark-1-report.md +176 -0
- package/evals/reports/runtime/vault-index-storage-spike-1-report.md +39 -0
- package/evals/reports/runtime/workflow-context-hook-1-report.md +82 -0
- package/evals/runbooks/adversarial-eval-runbook.md +28 -0
- package/evals/runbooks/fixture-eval-runbook.md +137 -0
- package/evals/runbooks/handoff-eval-runbook.md +22 -0
- package/evals/runbooks/verify-work-eval-runbook.md +27 -0
- package/evals/scripts/audit-command-surface.sh +160 -0
- package/evals/scripts/check-activation-contract.sh +121 -0
- package/evals/scripts/check-runtime-context-hook.sh +183 -0
- package/evals/scripts/grade-fixture-eval.sh +446 -0
- package/evals/scripts/run-claude-fixture-eval.sh +26 -0
- package/evals/scripts/run-codex-fixture-eval.sh +26 -0
- package/evals/scripts/run-eryx-python-proof-spike.js +559 -0
- package/evals/scripts/run-fixture-eval-by-id.sh +23 -0
- package/evals/scripts/run-fixture-eval.sh +464 -0
- package/evals/scripts/run-jq-wasm-proof-spike.js +299 -0
- package/evals/scripts/run-output-router-transform-eval.js +115 -0
- package/evals/scripts/run-pi-observed-routing-eval.js +478 -0
- package/evals/scripts/run-quickjs-wasi-proof-spike.js +339 -0
- package/evals/scripts/skill-evidence.sh +316 -0
- package/evals/scripts/validate-release-metadata.sh +486 -0
- package/evals/suites/v0.1-acceptance-suite.md +131 -0
- package/{plugins/freeflow/hooks → hooks}/freeflow-runtime-context.mjs +46 -12
- package/package.json +39 -19
- package/pi-extension/dist/host-producer-identification.js +186 -0
- package/pi-extension/dist/index.js +85 -0
- package/pi-extension/dist/mcp-config.js +30 -0
- package/pi-extension/dist/native-safety-net.js +209 -0
- package/pi-extension/dist/observed-tool-routing.js +114 -0
- package/pi-extension/dist/renderers.js +835 -0
- package/pi-extension/dist/router-tools.js +438 -0
- package/pi-extension/dist/runtime-context.js +288 -0
- package/pi-extension/dist/schemas.js +254 -0
- package/pi-extension/dist/status.js +449 -0
- package/pi-extension/dist/utils.js +467 -0
- package/pi-extension/src/host-producer-identification.ts +226 -0
- package/pi-extension/src/index.ts +121 -0
- package/pi-extension/src/mcp-config.ts +32 -0
- package/pi-extension/src/native-safety-net.ts +252 -0
- package/pi-extension/src/observed-tool-routing.ts +126 -0
- package/pi-extension/src/renderers.ts +917 -0
- package/pi-extension/src/router-tools.ts +478 -0
- package/pi-extension/src/runtime-context.ts +347 -0
- package/pi-extension/src/schemas.ts +259 -0
- package/pi-extension/src/status.ts +505 -0
- package/pi-extension/src/utils.ts +492 -0
- package/pi-extension/tsconfig.json +16 -0
- package/{plugins/freeflow/docs → plugin-docs}/README.md +3 -3
- package/plugin-docs/adr/0002-evals-before-hooks.md +17 -0
- package/{plugins/freeflow/docs → plugin-docs}/adr/0003-release-boundary.md +2 -2
- package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +26 -0
- package/plugin-docs/adr/README.md +10 -0
- package/plugin-docs/architecture.md +89 -0
- package/plugin-docs/output-router.md +396 -0
- package/plugin-docs/release-evidence.md +77 -0
- package/{plugins/freeflow/docs → plugin-docs}/skills.md +3 -2
- package/{plugins/freeflow/docs → plugin-docs}/workflow.md +4 -4
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.js +1 -1
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.js +14 -14
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.js +6 -6
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.d.ts +1 -1
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.js +11 -10
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +74 -0
- package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +707 -0
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +124 -0
- package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1295 -0
- package/router/dist/benchmarks/context-saving-baseline.d.ts +54 -0
- package/router/dist/benchmarks/context-saving-baseline.js +439 -0
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.d.ts +16 -2
- package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.js +330 -26
- package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +90 -0
- package/router/dist/benchmarks/storage-policy-benchmarks.js +538 -0
- package/router/dist/benchmarks/vault-index-benchmarks.d.ts +47 -0
- package/router/dist/benchmarks/vault-index-benchmarks.js +257 -0
- package/router/dist/config/config.d.ts +96 -0
- package/router/dist/config/config.js +453 -0
- package/{plugins/freeflow/router/dist → router/dist/config}/schema.js +248 -2
- package/router/dist/config/types.d.ts +521 -0
- package/router/dist/config/types.js +30 -0
- package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.d.ts +1 -1
- package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.js +65 -14
- package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.js +18 -2
- package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.d.ts +1 -1
- package/router/dist/evidence/failure-contracts.d.ts +27 -0
- package/router/dist/evidence/failure-contracts.js +160 -0
- package/router/dist/index.d.ts +30 -0
- package/router/dist/index.js +32 -0
- package/router/dist/processing/engine.d.ts +108 -0
- package/router/dist/processing/engine.js +435 -0
- package/router/dist/processing/reducers.d.ts +266 -0
- package/router/dist/processing/reducers.js +1495 -0
- package/router/dist/processing/renderers.d.ts +25 -0
- package/router/dist/processing/renderers.js +186 -0
- package/router/dist/processing/scripts.d.ts +78 -0
- package/router/dist/processing/scripts.js +333 -0
- package/router/dist/routing/observed-reducers.d.ts +35 -0
- package/router/dist/routing/observed-reducers.js +647 -0
- package/router/dist/routing/observed-routing.d.ts +17 -0
- package/router/dist/routing/observed-routing.js +377 -0
- package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.d.ts +1 -1
- package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.js +1 -1
- package/router/dist/routing/run-filters.d.ts +56 -0
- package/router/dist/routing/run-filters.js +230 -0
- package/router/dist/routing/run-reducers.d.ts +30 -0
- package/router/dist/routing/run-reducers.js +110 -0
- package/router/dist/sandbox/adapter-roots.d.ts +38 -0
- package/router/dist/sandbox/adapter-roots.js +64 -0
- package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -0
- package/router/dist/sandbox/eryx-python-adapter.js +797 -0
- package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
- package/router/dist/sandbox/jq-wasm-adapter.js +421 -0
- package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -0
- package/router/dist/sandbox/quickjs-wasi-adapter.js +381 -0
- package/router/dist/sandbox/script-sandbox.d.ts +113 -0
- package/router/dist/sandbox/script-sandbox.js +303 -0
- package/router/dist/setup/script-transform-adapters.d.ts +28 -0
- package/router/dist/setup/script-transform-adapters.js +259 -0
- package/router/dist/tools/batch.d.ts +22 -0
- package/router/dist/tools/batch.js +509 -0
- package/router/dist/tools/run.d.ts +50 -0
- package/router/dist/tools/run.js +1219 -0
- package/router/dist/tools/search.d.ts +44 -0
- package/{plugins/freeflow/router/dist/retrieve.js → router/dist/tools/search.js} +395 -45
- package/router/dist/transform/engine.d.ts +143 -0
- package/router/dist/transform/engine.js +1955 -0
- package/router/dist/vault/vault-index.d.ts +106 -0
- package/router/dist/vault/vault-index.js +411 -0
- package/{plugins/freeflow/router/dist → router/dist/vault}/vault.d.ts +24 -1
- package/{plugins/freeflow/router/dist → router/dist/vault}/vault.js +152 -1
- package/skills/design-for-depth/SKILL.md +90 -0
- package/skills/design-for-depth/references/design-pressure-signals.md +265 -0
- package/skills/design-for-depth/references/software-design-philosophy.md +219 -0
- package/{plugins/freeflow/skills → skills}/diagnose-failure/SKILL.md +6 -1
- package/{plugins/freeflow/skills/research → skills/discover}/ARTIFACT-DESTINATIONS.md +4 -4
- package/{plugins/freeflow/skills/research → skills/discover}/CHECKPOINTS.md +4 -4
- package/skills/discover/SKILL.md +173 -0
- package/{plugins/freeflow/skills → skills}/execute-plan/SKILL.md +5 -4
- package/{plugins/freeflow/skills → skills}/execute-plan/references/execution-map.md +2 -2
- package/{plugins/freeflow/skills → skills}/mode-contract/SKILL.md +9 -4
- package/skills/output-router/SKILL.md +202 -0
- package/skills/output-router/references/safety-policy.md +40 -0
- package/{plugins/freeflow/skills → skills}/review-artifact/SKILL.md +5 -2
- package/{plugins/freeflow/skills → skills}/review-artifact/references/reviewer-prompt.md +2 -1
- package/{plugins/freeflow/skills → skills}/review-work/SKILL.md +6 -1
- package/{plugins/freeflow/skills → skills}/setup-freeflow/SKILL.md +21 -9
- package/{plugins/freeflow/skills → skills}/setup-freeflow/references/activation-contract.md +11 -10
- package/{plugins/freeflow/skills → skills}/setup-freeflow/references/host-setup.md +3 -3
- package/skills/setup-freeflow/references/output-router-setup.md +102 -0
- package/{plugins/freeflow/skills → skills}/verify-work/SKILL.md +3 -1
- package/{plugins/freeflow/skills → skills}/workflow/SKILL.md +16 -14
- package/{plugins/freeflow/skills → skills}/workflow/references/workflow-map.md +16 -14
- package/{plugins/freeflow/skills → skills}/write-plan/SKILL.md +9 -1
- package/{plugins/freeflow/skills → skills}/write-spec/SKILL.md +9 -6
- package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
- package/plugins/freeflow/docs/adr/0004-research-replaces-shallow-discovery-skills.md +0 -26
- package/plugins/freeflow/docs/adr/README.md +0 -8
- package/plugins/freeflow/docs/architecture.md +0 -86
- package/plugins/freeflow/docs/output-router.md +0 -212
- package/plugins/freeflow/docs/release-evidence.md +0 -69
- package/plugins/freeflow/pi-extension/index.js +0 -1176
- package/plugins/freeflow/router/dist/config.d.ts +0 -22
- package/plugins/freeflow/router/dist/config.js +0 -114
- package/plugins/freeflow/router/dist/experimental-local-index.d.ts +0 -1
- package/plugins/freeflow/router/dist/experimental-local-index.js +0 -1
- package/plugins/freeflow/router/dist/index.d.ts +0 -12
- package/plugins/freeflow/router/dist/index.js +0 -12
- package/plugins/freeflow/router/dist/retrieve.d.ts +0 -33
- package/plugins/freeflow/router/dist/run.d.ts +0 -26
- package/plugins/freeflow/router/dist/run.js +0 -356
- package/plugins/freeflow/router/dist/types.d.ts +0 -234
- package/plugins/freeflow/router/dist/types.js +0 -9
- package/plugins/freeflow/skills/output-router/SKILL.md +0 -69
- package/plugins/freeflow/skills/output-router/references/safety-policy.md +0 -33
- package/plugins/freeflow/skills/research/LANGUAGE.md +0 -61
- package/plugins/freeflow/skills/research/SKILL.md +0 -128
- package/plugins/freeflow/skills/setup-freeflow/references/output-router-setup.md +0 -52
- /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
- /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
- /package/{plugins/freeflow/docs → plugin-docs}/adr/0001-three-modes.md +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/config}/schema.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.js +0 -0
- /package/{plugins/freeflow/router → router}/dist/experiments/local-index.d.ts +0 -0
- /package/{plugins/freeflow/router → router}/dist/experiments/local-index.js +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.d.ts +0 -0
- /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.js +0 -0
- /package/{plugins/freeflow/skills → skills}/bypass/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/commit-work/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/commit-work/references/staging-decisions.md +0 -0
- /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/feedback-loop-catalog.md +0 -0
- /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/flaky-and-performance.md +0 -0
- /package/{plugins/freeflow/skills → skills}/evaluate-skill/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/eval-patterns.md +0 -0
- /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/grading-priority.md +0 -0
- /package/{plugins/freeflow/skills → skills}/handoff/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/handoff/references/templates.md +0 -0
- /package/{plugins/freeflow/skills → skills}/interview-gate/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/review-work/references/reviewer-prompt.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-plan/references/plan-shapes.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-skill/SKILL.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-spec/references/artifact-standards.md +0 -0
- /package/{plugins/freeflow/skills → skills}/write-spec/references/spec-shapes.md +0 -0
|
@@ -2,7 +2,8 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { mkdir, open, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, join, resolve } from "node:path";
|
|
5
|
-
import { DEFAULT_VAULT_RETENTION, DEFAULT_VAULT_ROOT } from "
|
|
5
|
+
import { DEFAULT_VAULT_RETENTION, DEFAULT_VAULT_ROOT } from "../config/config.js";
|
|
6
|
+
import { createLocalVaultIndex, recordVaultIndexFailure } from "./vault-index.js";
|
|
6
7
|
const sessionIndexWriteLocks = new Map();
|
|
7
8
|
const SESSION_INDEX_LOCK_RETRY_MS = 5;
|
|
8
9
|
const SESSION_INDEX_LOCK_TIMEOUT_MS = 5_000;
|
|
@@ -79,6 +80,7 @@ export async function findExactDuplicateTextOutput(vault, options) {
|
|
|
79
80
|
return undefined;
|
|
80
81
|
}
|
|
81
82
|
export async function storeCommandOutput(vault, options) {
|
|
83
|
+
assertStorablePersistence(options.persistence);
|
|
82
84
|
const createdAt = options.createdAt ?? new Date().toISOString();
|
|
83
85
|
const combined = options.combined ?? combineOutputSections(options.stdout, options.stderr);
|
|
84
86
|
const decisionIds = options.decisionIds ?? [];
|
|
@@ -106,6 +108,7 @@ export async function storeCommandOutput(vault, options) {
|
|
|
106
108
|
});
|
|
107
109
|
const objectId = objectIdFromHash(payloadHash);
|
|
108
110
|
const outputId = outputIdFromHash(payloadHash);
|
|
111
|
+
const recordId = recordIdFromHash(payloadHash);
|
|
109
112
|
const objectDir = objectDirectory(vault, objectId);
|
|
110
113
|
const paths = {
|
|
111
114
|
meta: join(objectDir, "meta.json"),
|
|
@@ -116,6 +119,7 @@ export async function storeCommandOutput(vault, options) {
|
|
|
116
119
|
const record = {
|
|
117
120
|
kind: "command",
|
|
118
121
|
outputId,
|
|
122
|
+
recordId,
|
|
119
123
|
objectId,
|
|
120
124
|
command: options.command,
|
|
121
125
|
createdAt,
|
|
@@ -139,9 +143,14 @@ export async function storeCommandOutput(vault, options) {
|
|
|
139
143
|
},
|
|
140
144
|
fingerprints,
|
|
141
145
|
decisionIds,
|
|
146
|
+
producer: options.producer ?? { kind: "command" },
|
|
147
|
+
persistence: options.persistence ?? exactVaultPersistence(outputId),
|
|
142
148
|
contentHashSha256: payloadHash,
|
|
143
149
|
retention: vault.retention,
|
|
144
150
|
};
|
|
151
|
+
if (options.lineage !== undefined) {
|
|
152
|
+
record.lineage = options.lineage;
|
|
153
|
+
}
|
|
145
154
|
const commandExpiresAt = expiresAt(createdAt, vault.retention);
|
|
146
155
|
if (commandExpiresAt !== undefined) {
|
|
147
156
|
record.expiresAt = commandExpiresAt;
|
|
@@ -158,9 +167,11 @@ export async function storeCommandOutput(vault, options) {
|
|
|
158
167
|
await writeFile(paths.combined, combined, "utf8");
|
|
159
168
|
await writeJson(paths.meta, record);
|
|
160
169
|
await addRecordToSessionIndex(vault, options.sessionId, record);
|
|
170
|
+
await indexVaultRecordAfterAppend(vault, options.sessionId, record, combined, "combined");
|
|
161
171
|
return record;
|
|
162
172
|
}
|
|
163
173
|
export async function storeTextOutput(vault, options) {
|
|
174
|
+
assertStorablePersistence(options.persistence);
|
|
164
175
|
const createdAt = options.createdAt ?? new Date().toISOString();
|
|
165
176
|
const decisionIds = options.decisionIds ?? [];
|
|
166
177
|
const fingerprints = textOutputFingerprints({ raw: options.raw });
|
|
@@ -173,6 +184,7 @@ export async function storeTextOutput(vault, options) {
|
|
|
173
184
|
});
|
|
174
185
|
const objectId = objectIdFromHash(payloadHash);
|
|
175
186
|
const outputId = outputIdFromHash(payloadHash);
|
|
187
|
+
const recordId = recordIdFromHash(payloadHash);
|
|
176
188
|
const objectDir = objectDirectory(vault, objectId);
|
|
177
189
|
const paths = {
|
|
178
190
|
meta: join(objectDir, "meta.json"),
|
|
@@ -181,6 +193,7 @@ export async function storeTextOutput(vault, options) {
|
|
|
181
193
|
const record = {
|
|
182
194
|
kind: "text",
|
|
183
195
|
outputId,
|
|
196
|
+
recordId,
|
|
184
197
|
objectId,
|
|
185
198
|
sourceKind: options.sourceKind,
|
|
186
199
|
createdAt,
|
|
@@ -190,9 +203,14 @@ export async function storeTextOutput(vault, options) {
|
|
|
190
203
|
hashes: { rawSha256: sha256Text(options.raw) },
|
|
191
204
|
fingerprints,
|
|
192
205
|
decisionIds,
|
|
206
|
+
producer: options.producer ?? producerForTextSourceKind(options.sourceKind),
|
|
207
|
+
persistence: options.persistence ?? exactVaultPersistence(outputId),
|
|
193
208
|
contentHashSha256: payloadHash,
|
|
194
209
|
retention: vault.retention,
|
|
195
210
|
};
|
|
211
|
+
if (options.lineage !== undefined) {
|
|
212
|
+
record.lineage = options.lineage;
|
|
213
|
+
}
|
|
196
214
|
const textExpiresAt = expiresAt(createdAt, vault.retention);
|
|
197
215
|
if (textExpiresAt !== undefined) {
|
|
198
216
|
record.expiresAt = textExpiresAt;
|
|
@@ -201,9 +219,65 @@ export async function storeTextOutput(vault, options) {
|
|
|
201
219
|
await writeFile(paths.raw, options.raw, "utf8");
|
|
202
220
|
await writeJson(paths.meta, record);
|
|
203
221
|
await addRecordToSessionIndex(vault, options.sessionId, record);
|
|
222
|
+
await indexVaultRecordAfterAppend(vault, options.sessionId, record, options.raw, "raw");
|
|
223
|
+
return record;
|
|
224
|
+
}
|
|
225
|
+
export async function storeMetadataOutput(vault, options) {
|
|
226
|
+
assertStorablePersistence(options.persistence);
|
|
227
|
+
const createdAt = options.createdAt ?? new Date().toISOString();
|
|
228
|
+
const decisionIds = options.decisionIds ?? [];
|
|
229
|
+
const payloadHash = sha256Json({
|
|
230
|
+
kind: "metadata",
|
|
231
|
+
createdAt,
|
|
232
|
+
sourceKind: options.sourceKind,
|
|
233
|
+
rawLineCount: options.rawLineCount,
|
|
234
|
+
rawByteCount: options.rawByteCount,
|
|
235
|
+
rawSha256: options.rawSha256,
|
|
236
|
+
metadata: options.metadata,
|
|
237
|
+
decisionIds,
|
|
238
|
+
});
|
|
239
|
+
const objectId = objectIdFromHash(payloadHash);
|
|
240
|
+
const outputId = outputIdFromHash(payloadHash);
|
|
241
|
+
const recordId = recordIdFromHash(payloadHash);
|
|
242
|
+
const objectDir = objectDirectory(vault, objectId);
|
|
243
|
+
const paths = {
|
|
244
|
+
meta: join(objectDir, "meta.json"),
|
|
245
|
+
};
|
|
246
|
+
const record = {
|
|
247
|
+
kind: "metadata",
|
|
248
|
+
outputId,
|
|
249
|
+
recordId,
|
|
250
|
+
objectId,
|
|
251
|
+
sourceKind: options.sourceKind,
|
|
252
|
+
createdAt,
|
|
253
|
+
paths,
|
|
254
|
+
lineCounts: { raw: options.rawLineCount },
|
|
255
|
+
byteCounts: { raw: options.rawByteCount },
|
|
256
|
+
hashes: options.rawSha256 !== undefined ? { rawSha256: options.rawSha256 } : {},
|
|
257
|
+
decisionIds,
|
|
258
|
+
producer: options.producer ?? producerForTextSourceKind(options.sourceKind),
|
|
259
|
+
persistence: options.persistence ?? metadataOnlyPersistence(outputId),
|
|
260
|
+
contentHashSha256: payloadHash,
|
|
261
|
+
retention: vault.retention,
|
|
262
|
+
};
|
|
263
|
+
if (options.metadata !== undefined) {
|
|
264
|
+
record.metadata = options.metadata;
|
|
265
|
+
}
|
|
266
|
+
if (options.lineage !== undefined) {
|
|
267
|
+
record.lineage = options.lineage;
|
|
268
|
+
}
|
|
269
|
+
const metadataExpiresAt = expiresAt(createdAt, vault.retention);
|
|
270
|
+
if (metadataExpiresAt !== undefined) {
|
|
271
|
+
record.expiresAt = metadataExpiresAt;
|
|
272
|
+
}
|
|
273
|
+
await mkdir(objectDir, { recursive: true });
|
|
274
|
+
await writeJson(paths.meta, record);
|
|
275
|
+
await addRecordToSessionIndex(vault, options.sessionId, record);
|
|
276
|
+
await indexVaultRecordAfterAppend(vault, options.sessionId, record, undefined);
|
|
204
277
|
return record;
|
|
205
278
|
}
|
|
206
279
|
export async function storeRepoFileReference(vault, options) {
|
|
280
|
+
assertStorablePersistence(options.persistence);
|
|
207
281
|
const createdAt = options.createdAt ?? new Date().toISOString();
|
|
208
282
|
const decisionIds = options.decisionIds ?? [];
|
|
209
283
|
const payloadHash = sha256Json({
|
|
@@ -215,6 +289,7 @@ export async function storeRepoFileReference(vault, options) {
|
|
|
215
289
|
});
|
|
216
290
|
const objectId = objectIdFromHash(payloadHash);
|
|
217
291
|
const outputId = outputIdFromHash(payloadHash);
|
|
292
|
+
const recordId = recordIdFromHash(payloadHash);
|
|
218
293
|
const objectDir = objectDirectory(vault, objectId);
|
|
219
294
|
const paths = {
|
|
220
295
|
meta: join(objectDir, "meta.json"),
|
|
@@ -222,14 +297,20 @@ export async function storeRepoFileReference(vault, options) {
|
|
|
222
297
|
const record = {
|
|
223
298
|
kind: "repo-file",
|
|
224
299
|
outputId,
|
|
300
|
+
recordId,
|
|
225
301
|
objectId,
|
|
226
302
|
path: options.path,
|
|
227
303
|
paths,
|
|
228
304
|
decisionIds,
|
|
229
305
|
createdAt,
|
|
306
|
+
producer: options.producer ?? { kind: "repo" },
|
|
307
|
+
persistence: options.persistence ?? metadataOnlyPersistence(),
|
|
230
308
|
contentHashSha256: payloadHash,
|
|
231
309
|
retention: vault.retention,
|
|
232
310
|
};
|
|
311
|
+
if (options.lineage !== undefined) {
|
|
312
|
+
record.lineage = options.lineage;
|
|
313
|
+
}
|
|
233
314
|
const repoExpiresAt = expiresAt(createdAt, vault.retention);
|
|
234
315
|
if (repoExpiresAt !== undefined) {
|
|
235
316
|
record.expiresAt = repoExpiresAt;
|
|
@@ -240,6 +321,7 @@ export async function storeRepoFileReference(vault, options) {
|
|
|
240
321
|
await mkdir(objectDir, { recursive: true });
|
|
241
322
|
await writeJson(paths.meta, record);
|
|
242
323
|
await addRecordToSessionIndex(vault, options.sessionId, record);
|
|
324
|
+
await indexVaultRecordAfterAppend(vault, options.sessionId, record, undefined);
|
|
243
325
|
return record;
|
|
244
326
|
}
|
|
245
327
|
export async function readVaultRecord(vault, sessionId, outputId) {
|
|
@@ -279,16 +361,40 @@ export async function readSessionIndex(vault, sessionId) {
|
|
|
279
361
|
return emptySessionIndex(sessionId, now);
|
|
280
362
|
}
|
|
281
363
|
}
|
|
364
|
+
function assertStorablePersistence(persistence) {
|
|
365
|
+
if (persistence?.recoverability === "none") {
|
|
366
|
+
throw new Error("Cannot store output with persistence recoverability none; skip vault storage instead.");
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
async function indexVaultRecordAfterAppend(vault, sessionId, record, text, stream) {
|
|
370
|
+
try {
|
|
371
|
+
const index = createLocalVaultIndex(vault);
|
|
372
|
+
const metadata = {
|
|
373
|
+
sessionId,
|
|
374
|
+
...(stream !== undefined ? { stream } : {}),
|
|
375
|
+
};
|
|
376
|
+
await index.indexRecord(record, text, metadata);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
await recordVaultIndexFailure(vault, error).catch(() => undefined);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
282
382
|
async function addRecordToSessionIndex(vault, sessionId, record) {
|
|
283
383
|
await withSessionIndexWriteLock(vault, sessionId, async () => {
|
|
284
384
|
const index = await readSessionIndex(vault, sessionId);
|
|
285
385
|
const updatedAt = new Date().toISOString();
|
|
286
386
|
const entry = {
|
|
287
387
|
outputId: record.outputId,
|
|
388
|
+
recordId: record.recordId,
|
|
288
389
|
objectId: record.objectId,
|
|
289
390
|
kind: record.kind,
|
|
290
391
|
createdAt: record.createdAt,
|
|
392
|
+
producer: record.producer,
|
|
393
|
+
persistence: record.persistence,
|
|
291
394
|
};
|
|
395
|
+
if (record.lineage !== undefined) {
|
|
396
|
+
entry.lineage = record.lineage;
|
|
397
|
+
}
|
|
292
398
|
if (record.kind === "command") {
|
|
293
399
|
entry.executionStatus = record.executionStatus;
|
|
294
400
|
}
|
|
@@ -394,6 +500,9 @@ function streamPath(record, stream) {
|
|
|
394
500
|
}
|
|
395
501
|
return record.paths.raw;
|
|
396
502
|
}
|
|
503
|
+
if (record.kind === "metadata") {
|
|
504
|
+
throw new Error("Metadata only records store no raw stream.");
|
|
505
|
+
}
|
|
397
506
|
throw new Error("Repo file reference records store metadata only and have no raw stream.");
|
|
398
507
|
}
|
|
399
508
|
function sessionIndexPath(vault, sessionId) {
|
|
@@ -411,6 +520,48 @@ function objectIdFromHash(hash) {
|
|
|
411
520
|
function outputIdFromHash(hash) {
|
|
412
521
|
return `ffout_${hash.slice(0, 24)}`;
|
|
413
522
|
}
|
|
523
|
+
function recordIdFromHash(hash) {
|
|
524
|
+
return `ffrec_${hash.slice(0, 24)}`;
|
|
525
|
+
}
|
|
526
|
+
function exactVaultPersistence(outputId) {
|
|
527
|
+
return {
|
|
528
|
+
status: "vaulted",
|
|
529
|
+
recoverability: "exact",
|
|
530
|
+
recoveryOutputId: outputId,
|
|
531
|
+
outputId,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
function metadataOnlyPersistence(outputId) {
|
|
535
|
+
return {
|
|
536
|
+
status: "metadata_only",
|
|
537
|
+
recoverability: "metadata_only",
|
|
538
|
+
...(outputId !== undefined ? { outputId } : {}),
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
function producerForTextSourceKind(sourceKind) {
|
|
542
|
+
if (sourceKind === "native") {
|
|
543
|
+
return { kind: "native" };
|
|
544
|
+
}
|
|
545
|
+
if (sourceKind === "script") {
|
|
546
|
+
return { kind: "script" };
|
|
547
|
+
}
|
|
548
|
+
if (sourceKind === "mcp") {
|
|
549
|
+
return { kind: "mcp" };
|
|
550
|
+
}
|
|
551
|
+
if (sourceKind === "web") {
|
|
552
|
+
return { kind: "web" };
|
|
553
|
+
}
|
|
554
|
+
if (sourceKind === "fetch") {
|
|
555
|
+
return { kind: "fetch" };
|
|
556
|
+
}
|
|
557
|
+
if (sourceKind === "code_search") {
|
|
558
|
+
return { kind: "code_search" };
|
|
559
|
+
}
|
|
560
|
+
if (sourceKind === "transform") {
|
|
561
|
+
return { kind: "transform" };
|
|
562
|
+
}
|
|
563
|
+
return { kind: "other" };
|
|
564
|
+
}
|
|
414
565
|
function combineOutputSections(stdout, stderr) {
|
|
415
566
|
if (stdout.length === 0) {
|
|
416
567
|
return stderr;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-for-depth
|
|
3
|
+
description: Use when shaping, reviewing, implementing, or diagnosing work where module/interface/seam choices affect complexity, locality, testability, future change, or repeated edge-case churn. Use for architecture direction, growing scope, shallow modules, bad seams, broad refactors, and review loops that keep finding new edge cases.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Design For Depth
|
|
7
|
+
|
|
8
|
+
Use this as a lens, not a phase.
|
|
9
|
+
|
|
10
|
+
Core rule: if complexity is spreading across callers, tests, docs, artifacts, or review comments, stop and classify the design pressure before patching forward.
|
|
11
|
+
|
|
12
|
+
Goal: hide useful complexity behind stable interfaces so future callers, tests, reviewers, and agents coordinate less.
|
|
13
|
+
|
|
14
|
+
Do not add architecture ceremony when the next action is small, local, and reversible. Do not use architecture language to hide product or policy decisions.
|
|
15
|
+
|
|
16
|
+
## Load When Needed
|
|
17
|
+
|
|
18
|
+
Read `references/software-design-philosophy.md` when shaping architecture direction, reviewing a design-heavy artifact, or diagnosing repeated design failure.
|
|
19
|
+
|
|
20
|
+
Read `references/design-pressure-signals.md` when reviewing code/work for shallow modules, scattered policy, edge-case churn, or refactor candidates.
|
|
21
|
+
|
|
22
|
+
Do not load references for every small design question. The active skill should be enough for routine routing.
|
|
23
|
+
|
|
24
|
+
## Language
|
|
25
|
+
|
|
26
|
+
Use these terms consistently:
|
|
27
|
+
|
|
28
|
+
- **Module** — anything with an interface and implementation: function, class, package, subsystem, workflow slice.
|
|
29
|
+
- **Interface** — everything a caller, user, test, or future agent must know: types, invariants, ordering, errors, configuration, performance, side effects, and policy context.
|
|
30
|
+
- **Implementation** — details hidden behind the interface.
|
|
31
|
+
- **Depth** — leverage at the interface. Deep modules hide useful behavior behind a smaller interface.
|
|
32
|
+
- **Shallow module** — interface is nearly as complex as implementation, or callers coordinate details the module should own.
|
|
33
|
+
- **Seam** — where behavior, ownership, or variation can change without editing surrounding work.
|
|
34
|
+
- **Adapter** — a concrete thing satisfying an interface at a seam.
|
|
35
|
+
- **Locality** — changes, bugs, decisions, and verification stay near one module.
|
|
36
|
+
- **Leverage** — future work gets more behavior from less interface knowledge.
|
|
37
|
+
|
|
38
|
+
Avoid using “architecture” as a vague quality claim. Name the module, interface, hidden decision, seam, adapter, locality, or leverage.
|
|
39
|
+
|
|
40
|
+
## Signals
|
|
41
|
+
|
|
42
|
+
Use this lens when evidence shows:
|
|
43
|
+
|
|
44
|
+
- one concept requires many unrelated file, test, doc, or reviewer-comment changes;
|
|
45
|
+
- callers know ordering, flags, retries, cleanup, cache, auth, billing, migration, privacy, permissions, or compatibility policy;
|
|
46
|
+
- tests reach past the interface to assert normal behavior;
|
|
47
|
+
- review findings become a stream of edge-case patches;
|
|
48
|
+
- the same conditional or policy appears in multiple callers;
|
|
49
|
+
- a module is mostly pass-through naming around another module;
|
|
50
|
+
- a seam exists only for theoretical future variation;
|
|
51
|
+
- a spec or plan encodes detailed implementation guesses before evidence exists;
|
|
52
|
+
- the agent can only explain correctness by listing coordinated steps across modules.
|
|
53
|
+
|
|
54
|
+
Do not use this lens just because work is “important.” Use it when interface shape changes the next action.
|
|
55
|
+
|
|
56
|
+
## Tests
|
|
57
|
+
|
|
58
|
+
Use the smallest test that changes the route:
|
|
59
|
+
|
|
60
|
+
- **Deletion test:** if deleting the module makes complexity vanish, it may be pass-through ceremony. If complexity reappears across callers, tests, docs, or review comments, it was earning its keep.
|
|
61
|
+
- **Interface test surface:** callers and tests should exercise normal behavior through the same interface. If tests bypass it, mock internals, or duplicate setup, the module shape may be wrong.
|
|
62
|
+
- **Variation test:** one adapter is a hypothetical seam. Two adapters, a real test double, or a known upcoming variation justify a seam better.
|
|
63
|
+
- **Locality test:** one behavior change should not scatter policy, error handling, retries, logging, auth, billing, compatibility, docs, and tests across unrelated places.
|
|
64
|
+
- **Decision-hiding test:** design decisions likely to change should live behind modules, not in every caller or artifact.
|
|
65
|
+
- **Obscurity test:** if a fresh agent must read many files to learn a simple rule, the design may be obscure even if each file is small.
|
|
66
|
+
|
|
67
|
+
## Route
|
|
68
|
+
|
|
69
|
+
If the current direction spreads complexity, do not patch forward silently.
|
|
70
|
+
|
|
71
|
+
Classify the pressure:
|
|
72
|
+
|
|
73
|
+
- **Local fix:** same interface, complexity stays hidden; continue in the current phase.
|
|
74
|
+
- **Plan defect:** slice boundary, check, or implementation path is wrong; revise the plan.
|
|
75
|
+
- **Spec gap:** behavior, scope, or acceptance is unclear; revise the spec or return to discovery.
|
|
76
|
+
- **Owner decision:** public API, compatibility, security, privacy, billing, data-loss, permissions, migration, or hard-to-reverse architecture changes; use the interview gate.
|
|
77
|
+
- **Refactor candidate:** current behavior is valid but the module is shallow; propose a bounded deepening path before editing.
|
|
78
|
+
- **Stop/defer:** design pressure is real but not worth solving in this scope; record or defer it explicitly.
|
|
79
|
+
|
|
80
|
+
## Non-Goals
|
|
81
|
+
|
|
82
|
+
Do not:
|
|
83
|
+
|
|
84
|
+
- introduce abstractions for imagined future variation;
|
|
85
|
+
- hide product or policy decisions inside architecture wording;
|
|
86
|
+
- rewrite source truth to make a design cleaner;
|
|
87
|
+
- turn every feature into upfront architecture design;
|
|
88
|
+
- broaden a narrow fix into a refactor without user approval;
|
|
89
|
+
- treat line count, file count, indirection, or pattern names as proof of quality;
|
|
90
|
+
- claim a design is better without evidence from code, tests, review, usage, or an explicit owner decision.
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# Design Pressure Signals
|
|
2
|
+
|
|
3
|
+
Use this reference when reviewing code, artifacts, or work for shallow modules and complexity spread.
|
|
4
|
+
|
|
5
|
+
The goal is not to find every smell. The goal is to notice pressure that changes the next route.
|
|
6
|
+
|
|
7
|
+
## Quick Classifier
|
|
8
|
+
|
|
9
|
+
Ask:
|
|
10
|
+
|
|
11
|
+
1. What is the module?
|
|
12
|
+
2. What is the interface?
|
|
13
|
+
3. What details are callers forced to know?
|
|
14
|
+
4. What decision is likely to change?
|
|
15
|
+
5. Where would that decision be localized?
|
|
16
|
+
6. Would solving this now fit the approved scope?
|
|
17
|
+
|
|
18
|
+
Then classify:
|
|
19
|
+
|
|
20
|
+
- **Continue:** no design pressure that changes the next action.
|
|
21
|
+
- **Local fix:** improve within current module/interface.
|
|
22
|
+
- **Plan revision:** slice boundary or verification path is wrong.
|
|
23
|
+
- **Spec/discovery:** behavior, scope, or acceptance is unclear.
|
|
24
|
+
- **Owner decision:** public API, compatibility, security, privacy, billing, data loss, permissions, migration, or hard-to-reverse architecture.
|
|
25
|
+
- **Deferred deepening:** real design pressure, but not worth solving in this scope.
|
|
26
|
+
|
|
27
|
+
## Signals And What They Usually Mean
|
|
28
|
+
|
|
29
|
+
### Shotgun Surgery
|
|
30
|
+
|
|
31
|
+
Signal: one concept requires many unrelated edits.
|
|
32
|
+
|
|
33
|
+
Examples:
|
|
34
|
+
|
|
35
|
+
- retry policy added to every route;
|
|
36
|
+
- permission check copied into API, UI, and job worker;
|
|
37
|
+
- billing grace-period logic repeated in webhook, email, and dashboard;
|
|
38
|
+
- cache freshness flags threaded through callers.
|
|
39
|
+
|
|
40
|
+
Likely issue: a likely-changing decision is not hidden behind a module.
|
|
41
|
+
|
|
42
|
+
Route:
|
|
43
|
+
|
|
44
|
+
- If behavior/scope is unsettled: discovery or spec.
|
|
45
|
+
- If behavior is settled but slice spreads edits: plan revision or refactor candidate.
|
|
46
|
+
|
|
47
|
+
### Caller Choreography
|
|
48
|
+
|
|
49
|
+
Signal: callers must perform steps in the right order.
|
|
50
|
+
|
|
51
|
+
Examples:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
open connection -> set retry -> register cleanup -> call provider -> translate error -> log metric
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Likely issue: interface exposes implementation sequence.
|
|
58
|
+
|
|
59
|
+
Better interface asks for outcome:
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
deliverNotification(invitation)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
while the module owns retry, fallback, logging, cleanup, and provider errors.
|
|
66
|
+
|
|
67
|
+
### Scattered Policy
|
|
68
|
+
|
|
69
|
+
Signal: product or operational rules appear in many places.
|
|
70
|
+
|
|
71
|
+
Examples:
|
|
72
|
+
|
|
73
|
+
- billing downgrade timing in UI, webhook, worker, and tests;
|
|
74
|
+
- notification fallback rules in every route;
|
|
75
|
+
- authorization rules in frontend and backend separately;
|
|
76
|
+
- migration compatibility gates inside individual callers.
|
|
77
|
+
|
|
78
|
+
Likely issue: policy is not localized.
|
|
79
|
+
|
|
80
|
+
Stop if changing it would alter product, security, privacy, billing, permissions, public API, compatibility, or data-loss behavior.
|
|
81
|
+
|
|
82
|
+
### Test Knows Too Much
|
|
83
|
+
|
|
84
|
+
Signal: tests assert implementation sequencing instead of behavior.
|
|
85
|
+
|
|
86
|
+
Examples:
|
|
87
|
+
|
|
88
|
+
- tests assert `sendEmail` then `logFailure` then `sendSms` in every route;
|
|
89
|
+
- tests mock five helpers to verify one user-visible behavior;
|
|
90
|
+
- tests duplicate retry counts and provider error types;
|
|
91
|
+
- tests need private methods or internal state.
|
|
92
|
+
|
|
93
|
+
Likely issue: the production interface is not the right test seam.
|
|
94
|
+
|
|
95
|
+
Do not automatically add mocks. Ask whether the module interface should own the behavior.
|
|
96
|
+
|
|
97
|
+
### Edge-Case Patch Stream
|
|
98
|
+
|
|
99
|
+
Signal: each review pass finds another special case.
|
|
100
|
+
|
|
101
|
+
Examples:
|
|
102
|
+
|
|
103
|
+
- “also handle null phone”; then “also handle email bounce”; then “also handle duplicate invite”; then “also handle retry telemetry.”
|
|
104
|
+
|
|
105
|
+
Likely issue: review is exposing missing behavior ownership, not isolated bugs.
|
|
106
|
+
|
|
107
|
+
Route:
|
|
108
|
+
|
|
109
|
+
- classify findings;
|
|
110
|
+
- stop at review cap;
|
|
111
|
+
- diagnose whether discovery, spec, plan, source truth, module shape, or reviewer context is wrong.
|
|
112
|
+
|
|
113
|
+
### Pass-Through Wrapper
|
|
114
|
+
|
|
115
|
+
Signal: a module mostly renames another call.
|
|
116
|
+
|
|
117
|
+
Example:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
function sendTeamInviteEmail(email, subject, options) {
|
|
121
|
+
return sendEmail(email, subject, options);
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Likely issue: shallow wrapper.
|
|
126
|
+
|
|
127
|
+
Options:
|
|
128
|
+
|
|
129
|
+
- delete it if it hides nothing;
|
|
130
|
+
- deepen it by moving real policy behind it;
|
|
131
|
+
- keep it only if it expresses a stable domain interface that will soon hide behavior.
|
|
132
|
+
|
|
133
|
+
### Leaky Interface
|
|
134
|
+
|
|
135
|
+
Signal: callers know provider/database/cache internals.
|
|
136
|
+
|
|
137
|
+
Examples:
|
|
138
|
+
|
|
139
|
+
- callers catch Stripe-specific errors;
|
|
140
|
+
- UI code knows database enum transitions;
|
|
141
|
+
- API callers pass cache invalidation flags;
|
|
142
|
+
- tests assert internal queue names.
|
|
143
|
+
|
|
144
|
+
Likely issue: implementation detail leaked through interface.
|
|
145
|
+
|
|
146
|
+
Route to design if leakage blocks safe change or verification.
|
|
147
|
+
|
|
148
|
+
### God Module
|
|
149
|
+
|
|
150
|
+
Signal: one file owns unrelated responsibilities.
|
|
151
|
+
|
|
152
|
+
Examples:
|
|
153
|
+
|
|
154
|
+
- route file validates input, applies policy, calls providers, logs metrics, and formats UI copy;
|
|
155
|
+
- workflow module owns routing, vaulting, parsing, rendering, and config mutation.
|
|
156
|
+
|
|
157
|
+
Likely issue: missing internal modules or seams.
|
|
158
|
+
|
|
159
|
+
Do not split by file type alone. Split around hidden decisions and interfaces.
|
|
160
|
+
|
|
161
|
+
### Speculative Seam
|
|
162
|
+
|
|
163
|
+
Signal: interface/adapters/factory exist for only imagined future variation.
|
|
164
|
+
|
|
165
|
+
Examples:
|
|
166
|
+
|
|
167
|
+
- `PaymentProviderAdapterFactoryRegistry` when only Stripe exists and no migration is planned;
|
|
168
|
+
- strategies for every small formatting function;
|
|
169
|
+
- generic repository around a single simple query.
|
|
170
|
+
|
|
171
|
+
Likely issue: indirection without leverage.
|
|
172
|
+
|
|
173
|
+
Use the variation test: one adapter is hypothetical; two adapters or known upcoming variation justify a seam better.
|
|
174
|
+
|
|
175
|
+
### Premature Artifact Detail
|
|
176
|
+
|
|
177
|
+
Signal: spec or plan chooses exact classes, factories, tables, or algorithms before evidence exists.
|
|
178
|
+
|
|
179
|
+
Likely issue: artifact is hiding uncertainty as implementation detail.
|
|
180
|
+
|
|
181
|
+
Better:
|
|
182
|
+
|
|
183
|
+
```text
|
|
184
|
+
Tentative: likely need a policy-owning module if retry/fallback rules spread.
|
|
185
|
+
Open: whether provider variation is real in this scope.
|
|
186
|
+
Stop: revisit plan if slice requires touching every caller.
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Before / After Examples
|
|
190
|
+
|
|
191
|
+
### Notification Retry
|
|
192
|
+
|
|
193
|
+
Bad direction:
|
|
194
|
+
|
|
195
|
+
```text
|
|
196
|
+
Add retryCount to each route that sends notifications.
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Pressure:
|
|
200
|
+
|
|
201
|
+
- callers know retry policy;
|
|
202
|
+
- fallback and telemetry are duplicated;
|
|
203
|
+
- tests assert provider sequencing;
|
|
204
|
+
- adding another provider touches every caller.
|
|
205
|
+
|
|
206
|
+
Better direction:
|
|
207
|
+
|
|
208
|
+
```text
|
|
209
|
+
Introduce a notification delivery module whose interface accepts the notification intent and owns retry, fallback, provider errors, and telemetry.
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Still ask owner decisions before changing user-visible delivery semantics.
|
|
213
|
+
|
|
214
|
+
### Billing Grace Period
|
|
215
|
+
|
|
216
|
+
Bad direction:
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
Patch webhook to downgrade immediately, update email text, adjust dashboard copy.
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Pressure:
|
|
223
|
+
|
|
224
|
+
- billing policy spread across systems;
|
|
225
|
+
- likely source-truth conflict with docs/tests;
|
|
226
|
+
- user-owned billing behavior.
|
|
227
|
+
|
|
228
|
+
Better direction:
|
|
229
|
+
|
|
230
|
+
```text
|
|
231
|
+
Stop at interview gate. Decide billing policy first. Then localize policy behind a billing-state transition module if implementation spreads.
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Cache Freshness
|
|
235
|
+
|
|
236
|
+
Bad direction:
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
Thread forceRefresh through every caller.
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Pressure:
|
|
243
|
+
|
|
244
|
+
- callers know cache invalidation policy;
|
|
245
|
+
- tests must set timing flags;
|
|
246
|
+
- source truth may allow caching.
|
|
247
|
+
|
|
248
|
+
Better direction:
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
Discover expected freshness boundary. If source truth supports it, hide invalidation/freshness rules behind a cache-aware read interface.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## False Positives
|
|
255
|
+
|
|
256
|
+
Do not overreact when:
|
|
257
|
+
|
|
258
|
+
- a small repeated pattern is stable and local;
|
|
259
|
+
- a one-off script does not need long-term depth;
|
|
260
|
+
- a wrapper exists for public compatibility;
|
|
261
|
+
- broad edits are mechanical and source-backed;
|
|
262
|
+
- tests inspect internals only for an internal module whose interface is intentionally internal;
|
|
263
|
+
- deeper design would expand scope beyond the user's goal.
|
|
264
|
+
|
|
265
|
+
When in doubt, classify as deferred design pressure rather than silently refactoring.
|