@kensaurus/skills 0.0.0-stage → 2.1.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/.claude-plugin/marketplace.json +53 -0
- package/.claude-plugin/plugin.json +40 -0
- package/.cursor-plugin/plugin.json +38 -0
- package/.mcp.json +28 -0
- package/CHANGELOG.md +1790 -0
- package/LICENSE +21 -0
- package/LICENSE-APACHE +62 -0
- package/NOTICE +13 -0
- package/README.md +821 -2
- package/SECURITY.md +55 -0
- package/agents/code-reviewer.md +60 -0
- package/agents/completion-judge.md +89 -0
- package/agents/db-migrator.md +125 -0
- package/agents/debugger.md +47 -0
- package/agents/deploy-checker.md +100 -0
- package/agents/perf-monitor.md +74 -0
- package/assets/favicon.png +0 -0
- package/assets/logo-light.png +0 -0
- package/assets/logo.png +0 -0
- package/assets/logo.svg +6 -0
- package/assets/og.png +0 -0
- package/bin/install.mjs +1127 -0
- package/bin/kenji.js +2 -0
- package/commands/adr.md +17 -0
- package/commands/aeo-plan.md +18 -0
- package/commands/arch-boundaries.md +17 -0
- package/commands/aso-plan.md +18 -0
- package/commands/auth-flows.md +19 -0
- package/commands/backup-plan.md +17 -0
- package/commands/burndown-full.md +25 -0
- package/commands/capacitor-plan.md +18 -0
- package/commands/codemod-safety.md +22 -0
- package/commands/commit.md +18 -0
- package/commands/complete-everything.md +40 -0
- package/commands/cost-plan.md +19 -0
- package/commands/deadcode-plan.md +26 -0
- package/commands/deadcode.md +32 -0
- package/commands/debug-issue.md +17 -0
- package/commands/deps-plan.md +18 -0
- package/commands/docs-plan.md +17 -0
- package/commands/doctrine.md +19 -0
- package/commands/error-plan.md +19 -0
- package/commands/feedback-to-closure.md +36 -0
- package/commands/fix-issue.md +76 -0
- package/commands/gate-logic.md +26 -0
- package/commands/green-repo.md +36 -0
- package/commands/grill-me.md +19 -0
- package/commands/gtm-plan.md +21 -0
- package/commands/gtm-weekly.md +17 -0
- package/commands/gtm.md +22 -0
- package/commands/handoff.md +15 -0
- package/commands/housekeep-backlog.md +18 -0
- package/commands/housekeep-files.md +22 -0
- package/commands/housekeep-gates.md +18 -0
- package/commands/instant-nav.md +11 -0
- package/commands/integrity-plan.md +19 -0
- package/commands/launch-kit.md +16 -0
- package/commands/mcp-guide.md +40 -0
- package/commands/mobile-plan.md +19 -0
- package/commands/native-rn-monorepo/README.md +78 -0
- package/commands/native-rn-monorepo/android-build.md +26 -0
- package/commands/native-rn-monorepo/android-install.md +32 -0
- package/commands/native-rn-monorepo/android-logcat.md +37 -0
- package/commands/native-rn-monorepo/ios-ci-logs.md +56 -0
- package/commands/native-rn-monorepo/ios-ci-status.md +52 -0
- package/commands/native-rn-monorepo/ios-ci-trigger.md +59 -0
- package/commands/native-rn-monorepo/rn-reset.md +50 -0
- package/commands/native-rn-monorepo/rn-ship-ios.md +67 -0
- package/commands/native-rn-monorepo/rn-verify.md +53 -0
- package/commands/perf-plan.md +18 -0
- package/commands/plan-mode.md +74 -0
- package/commands/pr.md +16 -0
- package/commands/pricing-plan.md +20 -0
- package/commands/privacy-plan.md +18 -0
- package/commands/readability.md +12 -0
- package/commands/readme.md +15 -0
- package/commands/refactor.md +15 -0
- package/commands/release-prep.md +17 -0
- package/commands/research.md +25 -0
- package/commands/responsive-audit.md +21 -0
- package/commands/review-code.md +18 -0
- package/commands/rls-plan.md +18 -0
- package/commands/secrets-plan.md +18 -0
- package/commands/security-plan.md +19 -0
- package/commands/ship-and-observe.md +36 -0
- package/commands/skill-conflicts.md +19 -0
- package/commands/slop-plan.md +18 -0
- package/commands/stub-plan.md +18 -0
- package/commands/test-mutation.md +16 -0
- package/commands/test-plan.md +17 -0
- package/commands/test.md +29 -0
- package/commands/thirdparty-web-interface-guidelines.md +185 -0
- package/commands/uiux-plan.md +18 -0
- package/commands/uiux.md +45 -0
- package/commands/update-deps.md +21 -0
- package/commands/validation-plan.md +19 -0
- package/commands-portable/fix-issue.md +72 -0
- package/commands-portable/plan-mode.md +92 -0
- package/commands-portable/research.md +91 -0
- package/docs/screenshots/README.md +5 -0
- package/docs/screenshots/audit-dark.png +0 -0
- package/docs/screenshots/build-dark.png +0 -0
- package/docs/screenshots/grill-dark.png +0 -0
- package/docs/screenshots/hero-dark.png +0 -0
- package/docs/screenshots/hero-light.png +0 -0
- package/docs/screenshots/ship-dark.png +0 -0
- package/docs/screenshots/src/showcase.html +320 -0
- package/hooks/completion-gate.mjs +258 -0
- package/hooks/cursor-hooks.json +13 -0
- package/hooks/hooks.json +15 -0
- package/install.sh +21 -0
- package/llms.txt +40 -0
- package/mcp/README.md +266 -0
- package/mcp/VERSIONS.md +41 -0
- package/mcp/mcp-full.json.template +124 -0
- package/mcp/mcp.json.template +29 -0
- package/mcp/pinned-versions.json +27 -0
- package/package.json +94 -4
- package/rules/approved-plan-execution.mdc +65 -0
- package/rules/full-stack-ship-discipline.mdc +37 -0
- package/rules/native-rn-monorepo/README.md +63 -0
- package/rules/native-rn-monorepo/_project.mdc +69 -0
- package/rules/native-rn-monorepo/native-android.mdc +72 -0
- package/rules/native-rn-monorepo/native-ios.mdc +61 -0
- package/rules/native-rn-monorepo/react-native-js.mdc +78 -0
- package/rules/native-rn-monorepo/web.mdc +60 -0
- package/rules/project-starter/components.mdc +54 -0
- package/rules/project-starter/data-fetching.mdc +77 -0
- package/rules/project-starter/git.mdc +41 -0
- package/rules/project-starter/supabase.mdc +37 -0
- package/rules/project-starter/tailwind.mdc +48 -0
- package/rules/project-starter/typescript.mdc +36 -0
- package/rules/project-starter/web-performance.mdc +42 -0
- package/rules/senior-engineer.mdc +30 -0
- package/rules/shell-first-search.mdc +19 -0
- package/rules/skill-workflows.mdc +35 -0
- package/rules/verification-before-completion.mdc +57 -0
- package/skills/audit-accessibility/SKILL.md +441 -0
- package/skills/audit-agent-speed/SKILL.md +181 -0
- package/skills/audit-agent-speed/scripts/stop-typecheck.mjs +151 -0
- package/skills/audit-analytics/SKILL.md +138 -0
- package/skills/audit-auth-flows/SKILL.md +267 -0
- package/skills/audit-backend-architecture/SKILL.md +266 -0
- package/skills/audit-backend-architecture/references/patterns.md +386 -0
- package/skills/audit-bundle-size/SKILL.md +295 -0
- package/skills/audit-cicd/SKILL.md +218 -0
- package/skills/audit-code-quality/SKILL.md +314 -0
- package/skills/audit-code-review/SKILL.md +289 -0
- package/skills/audit-codemod-safety/SKILL.md +159 -0
- package/skills/audit-db-schema/SKILL.md +465 -0
- package/skills/audit-db-schema/references/details.md +110 -0
- package/skills/audit-doctrine/SKILL.md +189 -0
- package/skills/audit-env-parity/SKILL.md +133 -0
- package/skills/audit-fe-api/SKILL.md +458 -0
- package/skills/audit-gate-logic/SKILL.md +219 -0
- package/skills/audit-i18n/SKILL.md +339 -0
- package/skills/audit-infra-cost/SKILL.md +142 -0
- package/skills/audit-langfuse-llm/SKILL.md +468 -0
- package/skills/audit-langfuse-llm/references/details.md +226 -0
- package/skills/audit-llm-security/SKILL.md +147 -0
- package/skills/audit-monetization-iap/SKILL.md +137 -0
- package/skills/audit-payment-system/SKILL.md +268 -0
- package/skills/audit-payment-system/references/checklist.md +283 -0
- package/skills/audit-performance/SKILL.md +383 -0
- package/skills/audit-performance/references/loading-priority-2026.md +81 -0
- package/skills/audit-realworld/SKILL.md +287 -0
- package/skills/audit-registry-listing/SKILL.md +122 -0
- package/skills/audit-resilience/SKILL.md +153 -0
- package/skills/audit-responsive/SKILL.md +221 -0
- package/skills/audit-responsive/references/checklist.md +166 -0
- package/skills/audit-security/SKILL.md +289 -0
- package/skills/audit-skill-conflicts/SKILL.md +178 -0
- package/skills/audit-ui-states/SKILL.md +146 -0
- package/skills/audit-uiux-design-system/SKILL.md +475 -0
- package/skills/audit-uiux-design-system/references/details.md +71 -0
- package/skills/audit-ux/SKILL.md +381 -0
- package/skills/audit-ux/references/details.md +245 -0
- package/skills/audit-ux-journeys/SKILL.md +215 -0
- package/skills/audit-ux-journeys/references/checklist.md +179 -0
- package/skills/backend-db-performance/SKILL.md +441 -0
- package/skills/backend-error-handling/SKILL.md +489 -0
- package/skills/backend-error-handling/references/details.md +58 -0
- package/skills/backend-observability/SKILL.md +88 -0
- package/skills/backend-patterns/SKILL.md +499 -0
- package/skills/backend-patterns/references/architecture-patterns.md +298 -0
- package/skills/backend-realtime/SKILL.md +403 -0
- package/skills/backend-realtime/references/patterns.md +74 -0
- package/skills/burndown-full/SKILL.md +174 -0
- package/skills/complete-everything/SKILL.md +295 -0
- package/skills/data-pipeline/SKILL.md +109 -0
- package/skills/data-visualization/SKILL.md +488 -0
- package/skills/debug-error/SKILL.md +322 -0
- package/skills/debug-fe-be-integration/SKILL.md +459 -0
- package/skills/debug-sentry-monitor/SKILL.md +497 -0
- package/skills/debug-sentry-monitor/references/details.md +165 -0
- package/skills/deploy-npm/SKILL.md +394 -0
- package/skills/deploy-npm/references/example-mushi-mushi.md +52 -0
- package/skills/deploy-verify/SKILL.md +489 -0
- package/skills/design-api/SKILL.md +379 -0
- package/skills/design-canvas/SKILL.md +155 -0
- package/skills/design-email/SKILL.md +370 -0
- package/skills/design-frontend/SKILL.md +143 -0
- package/skills/design-generative-art/SKILL.md +474 -0
- package/skills/design-mobile-first/SKILL.md +506 -0
- package/skills/design-motion/SKILL.md +333 -0
- package/skills/design-motion/references/delight-interactions.md +191 -0
- package/skills/design-prd/SKILL.md +443 -0
- package/skills/design-system/SKILL.md +457 -0
- package/skills/design-theme/SKILL.md +226 -0
- package/skills/design-theme/themes/tsumagoi-ranch.md +150 -0
- package/skills/docs-adr/SKILL.md +168 -0
- package/skills/docs-coauthor/SKILL.md +368 -0
- package/skills/docs-comparison-pages/SKILL.md +117 -0
- package/skills/docs-domain-modeling/SKILL.md +97 -0
- package/skills/docs-launch-kit/SKILL.md +139 -0
- package/skills/docs-writer/SKILL.md +469 -0
- package/skills/enhance-agent-guardrails/SKILL.md +164 -0
- package/skills/enhance-arch-boundaries/SKILL.md +154 -0
- package/skills/enhance-capacitor-ui/SKILL.md +463 -0
- package/skills/enhance-capacitor-ui/references/details.md +750 -0
- package/skills/enhance-email-deliverability/SKILL.md +143 -0
- package/skills/enhance-growth-loops/SKILL.md +122 -0
- package/skills/enhance-lifecycle-email/SKILL.md +130 -0
- package/skills/enhance-motion/SKILL.md +193 -0
- package/skills/enhance-onboarding/SKILL.md +148 -0
- package/skills/enhance-pwa/SKILL.md +303 -0
- package/skills/enhance-readability/SKILL.md +146 -0
- package/skills/enhance-readme/SKILL.md +496 -0
- package/skills/enhance-readme/package-lock.json +187 -0
- package/skills/enhance-readme/package.json +17 -0
- package/skills/enhance-readme/scripts/generate-readme-blocks.mjs +199 -0
- package/skills/enhance-readme/scripts/record-readme-tour.mjs +442 -0
- package/skills/enhance-skill-prompts/SKILL.md +167 -0
- package/skills/enhance-skill-prompts/references/exemplar-audit-auth-flows.md +311 -0
- package/skills/enhance-ux-laws/SKILL.md +409 -0
- package/skills/enhance-web-conversion/SKILL.md +155 -0
- package/skills/enhance-web-forms/SKILL.md +154 -0
- package/skills/enhance-web-instant-nav/SKILL.md +138 -0
- package/skills/enhance-web-instant-nav/references/bfcache-blockers.md +23 -0
- package/skills/enhance-web-instant-nav/references/early-hints.md +33 -0
- package/skills/enhance-web-instant-nav/references/speculation-rules.md +44 -0
- package/skills/enhance-web-landing/SKILL.md +459 -0
- package/skills/enhance-web-landing/references/details.md +773 -0
- package/skills/enhance-web-redesign/SKILL.md +228 -0
- package/skills/enhance-web-seo/SKILL.md +276 -0
- package/skills/enhance-web-ui/SKILL.md +473 -0
- package/skills/enhance-web-ui/references/details.md +674 -0
- package/skills/enhance-web-ux/HEURISTICS.md +248 -0
- package/skills/enhance-web-ux/PATTERNS.md +375 -0
- package/skills/enhance-web-ux/SKILL.md +464 -0
- package/skills/enhance-web-ux/examples.md +222 -0
- package/skills/enhance-web-ux/references/details.md +406 -0
- package/skills/enhance-web-web3d/SKILL.md +397 -0
- package/skills/enhance-web-web3d/references/css-canvas-effects.md +180 -0
- package/skills/handoff/SKILL.md +66 -0
- package/skills/housekeep-backlog/SKILL.md +149 -0
- package/skills/housekeep-dead-code/SKILL.md +387 -0
- package/skills/housekeep-dead-code/references/ratchet-ci.md +205 -0
- package/skills/housekeep-dead-code/references/supabase-hygiene.md +152 -0
- package/skills/housekeep-design/SKILL.md +207 -0
- package/skills/housekeep-files/SKILL.md +220 -0
- package/skills/housekeep-files/references/naming-and-catalog.md +86 -0
- package/skills/housekeep-files/scripts/housekeep-files.ps1 +360 -0
- package/skills/housekeep-files/scripts/housekeep-files.sh +238 -0
- package/skills/housekeep-gates/SKILL.md +174 -0
- package/skills/iterate-agent-harness/SKILL.md +137 -0
- package/skills/iterate-gtm-weekly/SKILL.md +103 -0
- package/skills/iterate-post-launch/SKILL.md +292 -0
- package/skills/meta-mcp-builder/SKILL.md +313 -0
- package/skills/meta-skill-creator/SKILL.md +304 -0
- package/skills/mobile-capacitor-platform/SKILL.md +103 -0
- package/skills/mobile-emulator-start/SKILL.md +296 -0
- package/skills/mobile-emulator-test/SKILL.md +491 -0
- package/skills/mobile-emulator-test/references/details.md +478 -0
- package/skills/mobile-rn-performance/SKILL.md +107 -0
- package/skills/mobile-rn-screen/SKILL.md +476 -0
- package/skills/mobile-rn-screen/references/details.md +785 -0
- package/skills/mushi-health/SKILL.md +206 -0
- package/skills/mushi-integration/SKILL.md +257 -0
- package/skills/plan-aeo-readiness/SKILL.md +166 -0
- package/skills/plan-antislop/SKILL.md +281 -0
- package/skills/plan-aso/SKILL.md +149 -0
- package/skills/plan-backup-dr/SKILL.md +131 -0
- package/skills/plan-capacitor-hardening/SKILL.md +217 -0
- package/skills/plan-data-integrity/SKILL.md +187 -0
- package/skills/plan-dead-code/SKILL.md +386 -0
- package/skills/plan-dead-code/references/knip-config.md +214 -0
- package/skills/plan-dead-code/references/output-templates.md +133 -0
- package/skills/plan-dead-code/references/preservation-contract.md +50 -0
- package/skills/plan-dead-code/references/residue-greps.md +84 -0
- package/skills/plan-dependency-provenance/SKILL.md +200 -0
- package/skills/plan-docs-sync/SKILL.md +143 -0
- package/skills/plan-docs-sync/references/drift-taxonomy.md +43 -0
- package/skills/plan-docs-sync/references/output-templates.md +33 -0
- package/skills/plan-docs-sync/references/preservation-contract.md +17 -0
- package/skills/plan-error-handling/SKILL.md +205 -0
- package/skills/plan-gtm/SKILL.md +276 -0
- package/skills/plan-gtm/references/benchmarks-2026.md +183 -0
- package/skills/plan-input-validation/SKILL.md +179 -0
- package/skills/plan-llm-cost-guardrails/SKILL.md +176 -0
- package/skills/plan-mobile-readiness/SKILL.md +171 -0
- package/skills/plan-perf-audit/SKILL.md +145 -0
- package/skills/plan-perf-audit/references/audit-scope.md +51 -0
- package/skills/plan-perf-audit/references/output-templates.md +33 -0
- package/skills/plan-perf-audit/references/preservation-contract.md +13 -0
- package/skills/plan-pricing/SKILL.md +173 -0
- package/skills/plan-privacy-compliance/SKILL.md +148 -0
- package/skills/plan-rls-audit/SKILL.md +231 -0
- package/skills/plan-secrets-audit/SKILL.md +181 -0
- package/skills/plan-security-audit/SKILL.md +168 -0
- package/skills/plan-security-audit/references/output-templates.md +36 -0
- package/skills/plan-security-audit/references/owasp-supabase-scope.md +55 -0
- package/skills/plan-security-audit/references/preservation-contract.md +18 -0
- package/skills/plan-stub-checker/SKILL.md +216 -0
- package/skills/plan-stub-checker/references/detection-methodology.md +75 -0
- package/skills/plan-stub-checker/references/detection-taxonomy.md +34 -0
- package/skills/plan-stub-checker/references/output-templates.md +63 -0
- package/skills/plan-stub-checker/references/preservation-contract.md +24 -0
- package/skills/plan-test-coverage/SKILL.md +170 -0
- package/skills/plan-test-coverage/references/methodology.md +54 -0
- package/skills/plan-test-coverage/references/output-templates.md +34 -0
- package/skills/plan-test-coverage/references/preservation-contract.md +15 -0
- package/skills/plan-uiux-unification/SKILL.md +230 -0
- package/skills/plan-uiux-unification/references/output-templates.md +67 -0
- package/skills/plan-uiux-unification/references/phase-workbook.md +85 -0
- package/skills/plan-uiux-unification/references/preservation-contract.md +24 -0
- package/skills/protocol-browser-anti-stall/SKILL.md +211 -0
- package/skills/protocol-browser-anti-stall/references/mcp-to-cli-map.md +113 -0
- package/skills/protocol-browser-anti-stall/references/playwright-session-coordination.md +170 -0
- package/skills/research/SKILL.md +422 -0
- package/skills/test-exploratory/SKILL.md +165 -0
- package/skills/test-exploratory/references/charter-template.md +29 -0
- package/skills/test-load/SKILL.md +126 -0
- package/skills/test-mutation/SKILL.md +160 -0
- package/skills/test-playwright/SKILL.md +354 -0
- package/skills/test-qa/SKILL.md +364 -0
- package/skills/test-qa/references/details.md +268 -0
- package/skills/test-red-team/SKILL.md +386 -0
- package/skills/test-red-team/references/owasp-attack-checklist.md +193 -0
- package/skills/test-unit/SKILL.md +259 -0
- package/skills/test-unit/references/details.md +267 -0
- package/skills/test-visual-regression/SKILL.md +132 -0
- package/skills/thirdparty-emil-design-eng/ATTRIBUTION.md +20 -0
- package/skills/thirdparty-emil-design-eng/SKILL.md +21 -0
- package/skills/thirdparty-emil-design-eng/references/emil-design-eng.md +676 -0
- package/skills/thirdparty-ui-ux-pro-max/ATTRIBUTION.md +22 -0
- package/skills/thirdparty-ui-ux-pro-max/SKILL.md +304 -0
- package/skills/thirdparty-ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/thirdparty-ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/thirdparty-ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/thirdparty-ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/thirdparty-ui-ux-pro-max/data/products.csv +97 -0
- package/skills/thirdparty-ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/thirdparty-ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/thirdparty-ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/thirdparty-ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/thirdparty-ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/thirdparty-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/thirdparty-ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/thirdparty-ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/thirdparty-web-interface-guidelines/ATTRIBUTION.md +23 -0
- package/skills/thirdparty-web-interface-guidelines/SKILL.md +190 -0
- package/skills/workflow-build-feature/SKILL.md +118 -0
- package/skills/workflow-coding-discipline/SKILL.md +140 -0
- package/skills/workflow-environment-ready/SKILL.md +128 -0
- package/skills/workflow-feature-flag/SKILL.md +262 -0
- package/skills/workflow-feedback-to-closure/SKILL.md +165 -0
- package/skills/workflow-fix-and-ship/SKILL.md +136 -0
- package/skills/workflow-git-commit/SKILL.md +200 -0
- package/skills/workflow-green-repo/SKILL.md +166 -0
- package/skills/workflow-grilling/SKILL.md +73 -0
- package/skills/workflow-gtm/SKILL.md +153 -0
- package/skills/workflow-housekeep/SKILL.md +453 -0
- package/skills/workflow-housekeep/references/templates.md +109 -0
- package/skills/workflow-launch-ready/SKILL.md +145 -0
- package/skills/workflow-merge-conflicts/SKILL.md +62 -0
- package/skills/workflow-onboard/SKILL.md +99 -0
- package/skills/workflow-parallel-agents/SKILL.md +164 -0
- package/skills/workflow-pr/SKILL.md +197 -0
- package/skills/workflow-quality-gate/SKILL.md +147 -0
- package/skills/workflow-refactor/SKILL.md +274 -0
- package/skills/workflow-release-prep/SKILL.md +207 -0
- package/skills/workflow-ship-and-observe/SKILL.md +164 -0
- package/skills/workflow-spec-tdd/SKILL.md +141 -0
- package/skills/workflow-spec-tdd/references/spec-template.md +126 -0
- package/skills/workflow-spec-tdd/references/tdd-patterns.md +167 -0
- package/skills-cursor/babysit/SKILL.md +17 -0
- package/skills-cursor/canvas/SKILL.md +142 -0
- package/skills-cursor/canvas/sdk/canvas-tokens.d.ts +235 -0
- package/skills-cursor/canvas/sdk/chart-primitives.d.ts +200 -0
- package/skills-cursor/canvas/sdk/dag-layout.d.ts +102 -0
- package/skills-cursor/canvas/sdk/diff-view.d.ts +130 -0
- package/skills-cursor/canvas/sdk/form-primitives.d.ts +194 -0
- package/skills-cursor/canvas/sdk/hooks.d.ts +117 -0
- package/skills-cursor/canvas/sdk/index.d.ts +47 -0
- package/skills-cursor/canvas/sdk/theme.d.ts +61 -0
- package/skills-cursor/canvas/sdk/todo-list.d.ts +49 -0
- package/skills-cursor/canvas/sdk/ui-primitives.d.ts +549 -0
- package/skills-cursor/canvas/sdk/ui-primitives.test.d.ts +2 -0
- package/skills-cursor/create-hook/SKILL.md +238 -0
- package/skills-cursor/create-rule/SKILL.md +185 -0
- package/skills-cursor/create-skill/SKILL.md +269 -0
- package/skills-cursor/create-skill/references/authoring-guide.md +182 -0
- package/skills-cursor/create-subagent/SKILL.md +228 -0
- package/skills-cursor/migrate-to-skills/SKILL.md +121 -0
- package/skills-cursor/shell/SKILL.md +22 -0
- package/skills-cursor/split-to-prs/SKILL.md +47 -0
- package/skills-cursor/statusline/SKILL.md +193 -0
- package/skills-cursor/update-cli-config/SKILL.md +85 -0
- package/skills-cursor/update-cursor-settings/SKILL.md +137 -0
- package/skills.sh.json +297 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# FILE: housekeep-files.sh
|
|
4
|
+
# PURPOSE: Copy-not-move document organizer with a hash inventory, dry run,
|
|
5
|
+
# labeled copies, a JSONL catalog, and a verify gate. macOS/Linux twin
|
|
6
|
+
# of housekeep-files.ps1 (same plan.tsv, same outputs).
|
|
7
|
+
#
|
|
8
|
+
# OVERVIEW:
|
|
9
|
+
# - inventory : sha256 + size of every source file -> work/inventory.csv;
|
|
10
|
+
# file counts of count-only folders -> work/count-only.csv
|
|
11
|
+
# - dry-run : work/preview.tsv with the action per file; no disk change
|
|
12
|
+
# - apply : cp only when the destination is absent, hash the copy, append
|
|
13
|
+
# _ai-catalog.jsonl at each catalog_root and work/catalog.jsonl,
|
|
14
|
+
# write apply-log.tsv. Never deletes.
|
|
15
|
+
# - verify : every inventory path exists at the same size, every copy
|
|
16
|
+
# re-hashes equal, every in-place file exists, count-only counts
|
|
17
|
+
# unchanged. Exit 1 on the first failure. -> work/verify-report.txt
|
|
18
|
+
#
|
|
19
|
+
# DEPENDENCIES: bash 3.2+, find, cp, stat, and shasum or sha256sum.
|
|
20
|
+
#
|
|
21
|
+
# USAGE:
|
|
22
|
+
# housekeep-files.sh inventory plan.tsv work count-only.txt
|
|
23
|
+
# housekeep-files.sh dry-run plan.tsv work
|
|
24
|
+
# housekeep-files.sh apply plan.tsv work
|
|
25
|
+
# housekeep-files.sh verify plan.tsv work count-only.txt
|
|
26
|
+
# MAX_MB=200 MAX_PATH=200 override the caps.
|
|
27
|
+
#
|
|
28
|
+
# NOTES:
|
|
29
|
+
# - No rm, mv, or rsync --delete anywhere in this file by design.
|
|
30
|
+
# - plan.tsv is tab-separated so paths may contain commas, spaces, and CJK.
|
|
31
|
+
# - Optional 10th column `exclude`: ';'-separated relative-path substrings cataloged in
|
|
32
|
+
# place instead of copied (code checkouts, caches). node_modules/.git/__pycache__/
|
|
33
|
+
# .venv/.next/.cache are always skipped.
|
|
34
|
+
#
|
|
35
|
+
set -u
|
|
36
|
+
MODE="${1:-}"; PLAN="${2:-}"; OUT="${3:-}"; COUNT_ONLY="${4:-}"
|
|
37
|
+
MAX_MB="${MAX_MB:-200}"; MAX_PATH="${MAX_PATH:-200}"
|
|
38
|
+
[ -n "$MODE" ] && [ -n "$PLAN" ] && [ -n "$OUT" ] || { echo "usage: $0 inventory|dry-run|apply|verify plan.tsv work [count-only.txt]" >&2; exit 64; }
|
|
39
|
+
case "$MODE" in inventory|dry-run|apply|verify) ;; *) echo "unknown mode $MODE" >&2; exit 64;; esac
|
|
40
|
+
|
|
41
|
+
mkdir -p "$OUT"
|
|
42
|
+
INV="$OUT/inventory.csv"; CNT="$OUT/count-only.csv"; PREVIEW="$OUT/preview.tsv"
|
|
43
|
+
CATALOG="$OUT/catalog.jsonl"; APPLYLOG="$OUT/apply-log.tsv"; VERIFY="$OUT/verify-report.txt"
|
|
44
|
+
RUN="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
45
|
+
DOC_EXT=" pdf doc docx xls xlsx xlsm ppt pptx csv txt md html htm xtx xml data zip jpg jpeg png heic svg gif webp rtf odt ods eml msg "
|
|
46
|
+
ARTIFACT_RE='/(node_modules|\.git|__pycache__|\.venv|\.next|\.cache)/'
|
|
47
|
+
SECRET_RE='credential|keystore|\.p8$|\.p12$|\.pem$|\.key$|\.jks$|mobileprovision|\.cer$|\.der$|certsigningrequest|\.b64$|service-account|client_secret|google-services\.json|googleservice-info|oauth|private-key|backup_code|\.env$|play-publisher|apple-credentials|env-backups|recovery|2fa|mfa|totp|アクセスキー'
|
|
48
|
+
|
|
49
|
+
if command -v sha256sum >/dev/null 2>&1; then sha() { sha256sum "$1" | awk '{print $1}'; }
|
|
50
|
+
elif command -v shasum >/dev/null 2>&1; then sha() { shasum -a 256 "$1" | awk '{print $1}'; }
|
|
51
|
+
else echo "need sha256sum or shasum" >&2; exit 69; fi
|
|
52
|
+
if stat -f%z / >/dev/null 2>&1; then fsize() { stat -f%z "$1"; }; else fsize() { stat -c%s "$1"; }; fi
|
|
53
|
+
lower() { printf '%s' "$1" | tr '[:upper:]' '[:lower:]'; }
|
|
54
|
+
json_esc() { printf '%s' "$1" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/\t/\\t/g'; }
|
|
55
|
+
count_files() { [ -d "$1" ] || { echo -1; return; }; find "$1" -type f ! -name desktop.ini ! -name .DS_Store ! -name Thumbs.db | wc -l | tr -d ' '; }
|
|
56
|
+
|
|
57
|
+
date_token() { # $1 name, $2 parent name
|
|
58
|
+
local c y m d
|
|
59
|
+
for c in "$1" "$2"; do
|
|
60
|
+
[ -n "$c" ] || continue
|
|
61
|
+
if [[ "$c" =~ (20[0-9]{2})[-_.]?([0-9]{2})[-_.]?([0-9]{2}) ]]; then
|
|
62
|
+
y="${BASH_REMATCH[1]}"; m="${BASH_REMATCH[2]}"; d="${BASH_REMATCH[3]}"
|
|
63
|
+
if [ "$m" -ge 1 ] && [ "$m" -le 12 ] && [ "$d" -ge 1 ] && [ "$d" -le 31 ]; then echo "$y-$m-$d"; return; fi
|
|
64
|
+
fi
|
|
65
|
+
if [[ "$c" =~ (20[0-9]{2})[-_]?([0-9]{2}) ]]; then
|
|
66
|
+
y="${BASH_REMATCH[1]}"; m="${BASH_REMATCH[2]}"
|
|
67
|
+
if [ "$m" -ge 1 ] && [ "$m" -le 12 ]; then echo "$y-$m"; return; fi
|
|
68
|
+
fi
|
|
69
|
+
done
|
|
70
|
+
echo undated
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Expand plan into per-file item lines:
|
|
74
|
+
# action|reason|source|destDir|newName|entity|area|project|doc_type|date|tags|catalog_root|bytes joined by \037 (unit separator).
|
|
75
|
+
# Tab is whitespace to read(1) and collapses empty columns, so plan.tsv is re-separated with \037 first.
|
|
76
|
+
expand_plan() {
|
|
77
|
+
local header=1 source destination entity area project doc_type tags prefix catalog_root
|
|
78
|
+
while IFS=$'\037' read -r source destination entity area project doc_type tags prefix catalog_root exclude _rest; do
|
|
79
|
+
if [ $header -eq 1 ]; then header=0; continue; fi
|
|
80
|
+
[ -n "$source" ] || continue
|
|
81
|
+
case "$source" in \#*) continue;; esac
|
|
82
|
+
if [ ! -e "$source" ]; then echo "plan source missing, skipped: $source" >&2; continue; fi
|
|
83
|
+
local files
|
|
84
|
+
if [ -d "$source" ]; then files=$(find "$source" -type f); else files="$source"; fi
|
|
85
|
+
while IFS= read -r f; do
|
|
86
|
+
[ -n "$f" ] || continue
|
|
87
|
+
local name rel destDir relDir lp ext action reason bytes date newName cand
|
|
88
|
+
name="$(basename "$f")"
|
|
89
|
+
# OS / sync-client metadata files are recreated and removed by the client itself; never inventory them.
|
|
90
|
+
case "$name" in desktop.ini|.DS_Store|Thumbs.db) continue;; esac
|
|
91
|
+
if [ -d "$source" ]; then rel="${f#"$source"/}"; else rel="$name"; fi
|
|
92
|
+
destDir="$destination"; relDir="$(dirname "$rel")"
|
|
93
|
+
[ "$relDir" != "." ] && destDir="$destination/$relDir"
|
|
94
|
+
lp="$(lower "$f")"; ext="$(lower "${name##*.}")"; [ "$ext" = "$(lower "$name")" ] && ext=""
|
|
95
|
+
bytes="$(fsize "$f")"
|
|
96
|
+
action=copy; reason=""
|
|
97
|
+
local excluded=0 pat lrel; lrel="$(lower "$rel")"
|
|
98
|
+
IFS=';' read -ra _ex <<< "${exclude:-}"
|
|
99
|
+
for pat in "${_ex[@]}"; do pat="$(lower "$(printf '%s' "$pat" | sed 's/^ *//;s/ *$//')")"; [ -n "$pat" ] && [[ "$lrel" == *"$pat"* ]] && excluded=1; done
|
|
100
|
+
if printf '%s' "$lp" | grep -Eq "$SECRET_RE"; then action=indexed-in-place; reason=secret
|
|
101
|
+
elif [ $excluded -eq 1 ]; then action=indexed-in-place; reason=excluded
|
|
102
|
+
elif printf '%s' "$lp" | grep -Eq "$ARTIFACT_RE"; then action=indexed-in-place; reason=artifact
|
|
103
|
+
elif [[ "$DOC_EXT" != *" $ext "* ]]; then action=indexed-in-place; reason=ext
|
|
104
|
+
elif [ "$bytes" -gt $((MAX_MB * 1024 * 1024)) ]; then action=indexed-in-place; reason=size; fi
|
|
105
|
+
# Parent-folder date only inside a folder row; a loose file's parent is the old root.
|
|
106
|
+
local parentForDate=""
|
|
107
|
+
if [ -d "$source" ] && [ "$(dirname "$f")" != "$source" ]; then parentForDate="$(basename "$(dirname "$f")")"; fi
|
|
108
|
+
date="$(date_token "$name" "$parentForDate")"
|
|
109
|
+
newName="$name"
|
|
110
|
+
if [ "$action" = copy ] && [ "$prefix" = yes ]; then
|
|
111
|
+
if ! [[ "$name" =~ ^(20[0-9]{6}|20[0-9]{2}-[0-9]{2}|20[0-9]{2}_) ]] && [[ "$name" != "${entity}_"* ]]; then
|
|
112
|
+
cand="${entity}_${area}_${date}_${doc_type}__${name}"
|
|
113
|
+
[ ${#destDir} -le $((MAX_PATH - ${#cand} - 1)) ] && newName="$cand"
|
|
114
|
+
fi
|
|
115
|
+
fi
|
|
116
|
+
printf '%s\037%s\037%s\037%s\037%s\037%s\037%s\037%s\037%s\037%s\037%s\037%s\037%s\n' \
|
|
117
|
+
"$action" "$reason" "$f" "$destDir" "$newName" "$entity" "$area" "$project" "$doc_type" "$date" "$tags" "$catalog_root" "$bytes"
|
|
118
|
+
done <<< "$files"
|
|
119
|
+
done < <(tr -d '\r' < "$PLAN" | tr '\t' '\037')
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
catalog_line() { # args: entity area project doc_type date tags source name canonical bytes sha persist reason
|
|
123
|
+
local t tags_json="" first=1
|
|
124
|
+
IFS=',' read -ra _tags <<< "$6"
|
|
125
|
+
for t in "${_tags[@]}"; do t="$(printf '%s' "$t" | sed 's/^ *//;s/ *$//')"; [ -n "$t" ] || continue
|
|
126
|
+
[ $first -eq 1 ] || tags_json+=","; first=0; tags_json+="\"$(json_esc "$t")\""; done
|
|
127
|
+
printf '{"run":"%s","entity":"%s","area":"%s","project":"%s","doc_type":"%s","date":"%s","tags":[%s],"original_path":"%s","original_name":"%s","canonical_path":"%s","bytes":%s,"sha256":"%s","persist":"%s","reason":"%s"}\n' \
|
|
128
|
+
"$RUN" "$(json_esc "$1")" "$(json_esc "$2")" "$(json_esc "$3")" "$(json_esc "$4")" "$5" "$tags_json" \
|
|
129
|
+
"$(json_esc "$7")" "$(json_esc "$8")" "$(json_esc "$9")" "${10}" "${11}" "${12}" "$(json_esc "${13}")"
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
read_count_only() { [ -n "$COUNT_ONLY" ] && [ -f "$COUNT_ONLY" ] && grep -v '^[[:space:]]*#' "$COUNT_ONLY" | grep -v '^[[:space:]]*$' || true; }
|
|
133
|
+
|
|
134
|
+
case "$MODE" in
|
|
135
|
+
inventory)
|
|
136
|
+
echo "path,bytes,sha256" > "$INV"; n=0
|
|
137
|
+
while IFS=$'\037' read -r action reason src destDir newName entity area project doc_type date tags croot bytes; do
|
|
138
|
+
n=$((n+1)); [ $((n % 50)) -eq 0 ] && echo "hashing $n"
|
|
139
|
+
# Hash only what will be copied; in-place items are size-checked so a streaming drive is not forced to download them.
|
|
140
|
+
h=""; [ "$action" = copy ] && h="$(sha "$src")"
|
|
141
|
+
printf '"%s",%s,%s\n' "${src//\"/\"\"}" "$bytes" "$h" >> "$INV"
|
|
142
|
+
done < <(expand_plan)
|
|
143
|
+
echo "folder,files" > "$CNT"
|
|
144
|
+
while IFS= read -r folder; do printf '"%s",%s\n' "${folder//\"/\"\"}" "$(count_files "$folder")" >> "$CNT"; done < <(read_count_only)
|
|
145
|
+
echo "inventory: $n files -> $INV; count-only -> $CNT"
|
|
146
|
+
;;
|
|
147
|
+
dry-run)
|
|
148
|
+
printf 'action\treason\tsource\tdestination\tnew_name\tentity\tarea\tproject\tdoc_type\tdate\ttags\n' > "$PREVIEW"
|
|
149
|
+
while IFS=$'\037' read -r action reason src destDir newName entity area project doc_type date tags croot bytes; do
|
|
150
|
+
[ "$action" = copy ] && [ -e "$destDir/$newName" ] && action=skipped-exists
|
|
151
|
+
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$action" "$reason" "$src" "$destDir" "$newName" "$entity" "$area" "$project" "$doc_type" "$date" "$tags" >> "$PREVIEW"
|
|
152
|
+
done < <(expand_plan)
|
|
153
|
+
echo "preview -> $PREVIEW"; tail -n +2 "$PREVIEW" | awk -F'\t' '{k=$1; if($2!="")k=k":"$2; c[k]++} END{for(k in c) printf " %-24s %d\n",k,c[k]}'
|
|
154
|
+
;;
|
|
155
|
+
apply)
|
|
156
|
+
[ -f "$INV" ] || { echo "inventory.csv missing under $OUT — run inventory first" >&2; exit 65; }
|
|
157
|
+
printf 'action\tsource\tcanonical\tbytes\tsha256\n' > "$APPLYLOG"
|
|
158
|
+
copied=0 skipped=0 inplace=0 failed=0 copiedBytes=0 n=0
|
|
159
|
+
while IFS=$'\037' read -r action reason src destDir newName entity area project doc_type date tags croot bytes; do
|
|
160
|
+
n=$((n+1)); [ $((n % 50)) -eq 0 ] && echo "apply $n"
|
|
161
|
+
esc="${src//\"/\"\"}"
|
|
162
|
+
inv_line="$(grep -F -- "\"$esc\",$bytes," "$INV" | head -1)"
|
|
163
|
+
[ -n "$inv_line" ] || { echo "source not in inventory (plan changed after inventory?): $src" >&2; exit 65; }
|
|
164
|
+
sha_src="${inv_line##*,}" # empty for in-place items, which are never hashed
|
|
165
|
+
canonical="$destDir/$newName"; persist=""
|
|
166
|
+
if [ "$action" = indexed-in-place ]; then persist=indexed-in-place; canonical="$src"; inplace=$((inplace+1))
|
|
167
|
+
elif [ -e "$canonical" ]; then persist=skipped-exists; skipped=$((skipped+1))
|
|
168
|
+
else
|
|
169
|
+
mkdir -p "$destDir"
|
|
170
|
+
if cp -p "$src" "$canonical" 2>/dev/null && [ "$(sha "$canonical")" = "$sha_src" ]; then
|
|
171
|
+
persist=copied-source-kept; copied=$((copied+1)); copiedBytes=$((copiedBytes+bytes))
|
|
172
|
+
else persist=failed; reason=copy-or-hash-error; failed=$((failed+1)); fi
|
|
173
|
+
fi
|
|
174
|
+
printf '%s\t%s\t%s\t%s\t%s\n' "$persist" "$src" "$canonical" "$bytes" "$sha_src" >> "$APPLYLOG"
|
|
175
|
+
line="$(catalog_line "$entity" "$area" "$project" "$doc_type" "$date" "$tags" "$src" "$(basename "$src")" "$canonical" "$bytes" "$sha_src" "$persist" "$reason")"
|
|
176
|
+
printf '%s\n' "$line" >> "$CATALOG"
|
|
177
|
+
if [ -n "$croot" ]; then
|
|
178
|
+
mkdir -p "$croot"; printf '%s\n' "$line" >> "$croot/_ai-catalog.jsonl"
|
|
179
|
+
if [ ! -f "$croot/_SEARCH.md" ]; then cat > "$croot/_SEARCH.md" <<'EOF'
|
|
180
|
+
# _SEARCH.md — how to find a file here
|
|
181
|
+
|
|
182
|
+
1. grep `_ai-catalog.jsonl` in this folder: tags, entity, area, doc_type, date, original_name.
|
|
183
|
+
2. Search the prefixed filename: `{entity}_{area}_{date}_{doc_type}__{original name}`.
|
|
184
|
+
3. Search the original name after `__`; it is unchanged.
|
|
185
|
+
|
|
186
|
+
persist values: copied-source-kept (original still at original_path), indexed-in-place (only copy is at original_path), skipped-exists, failed.
|
|
187
|
+
Keys, credentials, videos, and installers are never copied here; the catalog points to where they already live.
|
|
188
|
+
EOF
|
|
189
|
+
fi
|
|
190
|
+
fi
|
|
191
|
+
done < <(expand_plan)
|
|
192
|
+
echo "apply done: copied=$copied skipped-exists=$skipped indexed-in-place=$inplace failed=$failed copiedMB=$((copiedBytes / 1048576))"
|
|
193
|
+
echo "log -> $APPLYLOG"; echo "catalog -> $CATALOG"
|
|
194
|
+
[ "$failed" -eq 0 ] || exit 2
|
|
195
|
+
;;
|
|
196
|
+
verify)
|
|
197
|
+
[ -f "$INV" ] || { echo "inventory.csv missing under $OUT" >&2; exit 65; }
|
|
198
|
+
: > "$VERIFY"; fail=0; checked=0; copies=0; inplace=0
|
|
199
|
+
echo "verify run $RUN" >> "$VERIFY"
|
|
200
|
+
while IFS= read -r row; do
|
|
201
|
+
p="$(printf '%s' "$row" | sed -E 's/^"(.*)",[0-9]+,[0-9a-f]*$/\1/' | sed 's/""/"/g')"
|
|
202
|
+
b="$(printf '%s' "$row" | sed -E 's/^".*",([0-9]+),[0-9a-f]*$/\1/')"
|
|
203
|
+
checked=$((checked+1))
|
|
204
|
+
if [ ! -e "$p" ]; then fail=$((fail+1)); echo "MISSING source: $p" >> "$VERIFY"
|
|
205
|
+
elif [ "$(fsize "$p")" != "$b" ]; then fail=$((fail+1)); echo "RESIZED source: $p" >> "$VERIFY"; fi
|
|
206
|
+
done < <(tail -n +2 "$INV")
|
|
207
|
+
echo "sources checked: $checked" >> "$VERIFY"
|
|
208
|
+
if [ -f "$CATALOG" ]; then
|
|
209
|
+
while IFS= read -r line; do
|
|
210
|
+
persist="$(printf '%s' "$line" | sed -E 's/.*"persist":"([^"]*)".*/\1/')"
|
|
211
|
+
if [ "$persist" = copied-source-kept ]; then
|
|
212
|
+
copies=$((copies+1))
|
|
213
|
+
c="$(printf '%s' "$line" | sed -E 's/.*"canonical_path":"((\\"|[^"])*)".*/\1/' | sed 's/\\"/"/g;s/\\\\/\\/g')"
|
|
214
|
+
h="$(printf '%s' "$line" | sed -E 's/.*"sha256":"([^"]*)".*/\1/')"
|
|
215
|
+
if [ ! -e "$c" ]; then fail=$((fail+1)); echo "MISSING copy: $c" >> "$VERIFY"
|
|
216
|
+
elif [ "$(sha "$c")" != "$h" ]; then fail=$((fail+1)); echo "HASH MISMATCH copy: $c" >> "$VERIFY"; fi
|
|
217
|
+
elif [ "$persist" = indexed-in-place ]; then
|
|
218
|
+
inplace=$((inplace+1))
|
|
219
|
+
o="$(printf '%s' "$line" | sed -E 's/.*"original_path":"((\\"|[^"])*)".*/\1/' | sed 's/\\"/"/g;s/\\\\/\\/g')"
|
|
220
|
+
[ -e "$o" ] || { fail=$((fail+1)); echo "MISSING in-place: $o" >> "$VERIFY"; }
|
|
221
|
+
fi
|
|
222
|
+
done < "$CATALOG"
|
|
223
|
+
fi
|
|
224
|
+
echo "copies re-hashed: $copies" >> "$VERIFY"; echo "in-place files present-checked: $inplace" >> "$VERIFY"
|
|
225
|
+
if [ -f "$CNT" ]; then cc=0
|
|
226
|
+
while IFS= read -r row; do
|
|
227
|
+
folder="$(printf '%s' "$row" | sed -E 's/^"(.*)",-?[0-9]+$/\1/' | sed 's/""/"/g')"
|
|
228
|
+
was="$(printf '%s' "$row" | sed -E 's/^".*",(-?[0-9]+)$/\1/')"
|
|
229
|
+
cc=$((cc+1)); now="$(count_files "$folder")"
|
|
230
|
+
[ "$now" = "$was" ] || { fail=$((fail+1)); echo "COUNT CHANGED: $folder $was -> $now" >> "$VERIFY"; }
|
|
231
|
+
done < <(tail -n +2 "$CNT")
|
|
232
|
+
echo "count-only folders rechecked: $cc" >> "$VERIFY"
|
|
233
|
+
fi
|
|
234
|
+
echo "failures: $fail" >> "$VERIFY"
|
|
235
|
+
if [ "$fail" -eq 0 ]; then echo "RESULT: PASS - every source present, every copy hash-equal, media counts unchanged" >> "$VERIFY"; else echo "RESULT: FAIL" >> "$VERIFY"; fi
|
|
236
|
+
cat "$VERIFY"; [ "$fail" -eq 0 ] || exit 1
|
|
237
|
+
;;
|
|
238
|
+
esac
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: housekeep-gates
|
|
3
|
+
description: >
|
|
4
|
+
Consolidate accreted CI gates, ratchets, and hooks into one required
|
|
5
|
+
aggregator check. Use after audit-gate-logic, or when "clean up our CI
|
|
6
|
+
checks", "we have three lint jobs", or "make one quality gate". Pipeline
|
|
7
|
+
cost → audit-cicd.
|
|
8
|
+
license: MIT
|
|
9
|
+
effort: high
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# housekeep-gates — One required check, defined in code
|
|
13
|
+
|
|
14
|
+
**Degree of freedom: MIXED — T1 is the priority.** Mapping and winner
|
|
15
|
+
confirmation `[HIGH freedom]`; aggregator `needs:` + skip-fail, loser
|
|
16
|
+
**deletion**, branch-protection, and Phase 4 probes `[LOW freedom — run
|
|
17
|
+
exactly]`. **Net enforcement strictly ≥ before.**
|
|
18
|
+
|
|
19
|
+
Apply-now. `audit-gate-logic` mapped the sprawl and named a winner per
|
|
20
|
+
duplicate cluster; this makes the repo match the map. **Target state: one
|
|
21
|
+
required check in branch protection, backed by an aggregator job that
|
|
22
|
+
`needs:` every real gate — so "what blocks merge" has exactly one answer,
|
|
23
|
+
in one file.**
|
|
24
|
+
|
|
25
|
+
Every retirement is proven safe before deletion. Never weaken enforcement
|
|
26
|
+
while consolidating. **Net enforcement strictly ≥ before.**
|
|
27
|
+
|
|
28
|
+
This is the execution arm of `audit-gate-logic`, the same way
|
|
29
|
+
`housekeep-design` executes `plan-uiux-unification`.
|
|
30
|
+
|
|
31
|
+
## This skill vs neighbors
|
|
32
|
+
|
|
33
|
+
| Skill | Owns |
|
|
34
|
+
|---|---|
|
|
35
|
+
| **housekeep-gates** (this) | Consolidate / delete / wire the aggregator |
|
|
36
|
+
| `audit-gate-logic` | Read-only map — bypass, ratchets, archaeology |
|
|
37
|
+
| `audit-cicd` | Pipeline cost, speed, storage |
|
|
38
|
+
| `workflow-quality-gate` | *Runs* the pre-release sweep |
|
|
39
|
+
| `enhance-agent-guardrails` | *Installs* new guard classes, not accreted-gate cleanup |
|
|
40
|
+
| `workflow-green-repo` | Make the repo green — does not redesign the gate graph |
|
|
41
|
+
| `housekeep-backlog` | Parked-work register — not CI gates |
|
|
42
|
+
| `housekeep-dead-code` | Owns the dead-code `--max-issues` ratchet that joins this aggregator |
|
|
43
|
+
|
|
44
|
+
## How to reason
|
|
45
|
+
|
|
46
|
+
1. **Observe** — archaeology map: cluster, winner, loser, current required checks
|
|
47
|
+
2. **Interpret** — would deleting this loser drop unique coverage?
|
|
48
|
+
3. **Classify** — port-then-delete / keep / not-yet-mapped
|
|
49
|
+
4. **Severity** — deleting the only server-side-enforced gate is a regression
|
|
50
|
+
|
|
51
|
+
## Worked example
|
|
52
|
+
|
|
53
|
+
> **Observe:** two lint jobs; old `lint.yml` is required; new `ci.yml` lint
|
|
54
|
+
> is not. `paths:` skips `.github/**`.
|
|
55
|
+
> **Interpret:** retiring `lint.yml` without porting + aggregator skip-fail
|
|
56
|
+
> would let a workflow edit merge unlinted.
|
|
57
|
+
> **Classify:** port unique rules, wire winner, delete loser; probe the skip path.
|
|
58
|
+
> **Probe:** change matching the old skip filter → aggregator must go red, not skip-green.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Phase 0 — Load the map (or make a quick one) [HIGH freedom; confirm before edits]
|
|
63
|
+
|
|
64
|
+
Consume the archaeology map from `audit-gate-logic` (duplicate clusters,
|
|
65
|
+
winners, losers, ratchet findings). If none exists, run its Phase 0 + 2.5
|
|
66
|
+
first — never consolidate gates you have not mapped. Deleting an "obvious
|
|
67
|
+
duplicate" that was the only server-side-enforced one *weakens* the repo.
|
|
68
|
+
|
|
69
|
+
Confirm which winners stand **before touching anything**. Branch-protection
|
|
70
|
+
changes always get explicit confirmation.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Phase 1 — Build the aggregator gate [LOW freedom — fail on failed or skipped]
|
|
75
|
+
|
|
76
|
+
Create (or adopt) the single-gate structure:
|
|
77
|
+
|
|
78
|
+
- One job — conventionally `gate` / `all-green` — that `needs:` every real
|
|
79
|
+
check (lint, typecheck, tests, build, and the audit jobs worth blocking
|
|
80
|
+
on) and fails if any dependency failed **or was skipped** (`if: always()`
|
|
81
|
+
+ explicit result check). Skipped-counts-as-success is the classic
|
|
82
|
+
aggregator bug.
|
|
83
|
+
- Make that job the **only** required status check; remove scattered
|
|
84
|
+
required entries. Enforcement moves from a settings list nobody audits
|
|
85
|
+
to a `needs:` list that lives in code review.
|
|
86
|
+
- If a merge queue is (or will be) in use: add `merge_group` to the
|
|
87
|
+
workflow triggers and keep check names identical across `pull_request`
|
|
88
|
+
and `merge_group`, or queued PRs wait on checks that never start.
|
|
89
|
+
- Keep one fast always-runs job as the visible status link if the
|
|
90
|
+
aggregator's `needs:` delays its appearance.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Phase 2 — Consolidate per the map [LOW freedom — delete losers, do not disable]
|
|
95
|
+
|
|
96
|
+
For each duplicate cluster, in this order:
|
|
97
|
+
|
|
98
|
+
1. **Port unique value** from losers into the winner (a lint rule only the
|
|
99
|
+
old config had, a test only the old workflow ran). Diff configs before
|
|
100
|
+
deleting — retirement must not drop coverage.
|
|
101
|
+
2. **Wire the winner** into the aggregator's `needs:`.
|
|
102
|
+
3. **Retire the losers** — delete the workflow/config, do not
|
|
103
|
+
disable-and-keep. A disabled gate is comprehension debt and resurrection
|
|
104
|
+
bait for the next agent session.
|
|
105
|
+
4. **Extract shared logic** into a reusable workflow or composite action
|
|
106
|
+
when the same steps exist in 2+ places.
|
|
107
|
+
|
|
108
|
+
Also restore **hook/CI parity**: local pre-commit / pre-push hooks run the
|
|
109
|
+
same commands (ideally the same scripts) as CI's gate jobs — one
|
|
110
|
+
definition, two callers — so "passes locally" predicts "passes CI" and
|
|
111
|
+
nobody learns `--no-verify`.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Phase 3 — Normalize the ratchets [HIGH freedom]
|
|
116
|
+
|
|
117
|
+
- **One baseline per metric.** Competing thresholds (jest + codecov + a
|
|
118
|
+
committed floor) collapse to one enforcement point; the rest read from
|
|
119
|
+
it or die.
|
|
120
|
+
- **Auto-tighten upward.** Floors track reality (threshold rises as the
|
|
121
|
+
metric improves, small flake tolerance) instead of sitting far below
|
|
122
|
+
actual.
|
|
123
|
+
- **Resets are reviewed, separate acts.** Baseline regeneration happens in
|
|
124
|
+
its own PR with the diff visible. CI should fail if a baseline file
|
|
125
|
+
changes in the same PR as a metric regression, where the tooling allows
|
|
126
|
+
expressing that.
|
|
127
|
+
- **No silent exemption growth.** Ignore-lists and inline-disable counts
|
|
128
|
+
become ratcheted metrics themselves where feasible.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Phase 4 — Prove it [LOW freedom — run both probes]
|
|
133
|
+
|
|
134
|
+
- **Deliberate-violation probe** on a scratch branch: one violation per
|
|
135
|
+
consolidated gate class (lint error, failing test, coverage drop,
|
|
136
|
+
baseline edit bundled with a regression). Confirm the aggregator goes
|
|
137
|
+
red and the PR is unmergeable. A consolidation is not done until each
|
|
138
|
+
retired loser's job is demonstrably covered by the winner.
|
|
139
|
+
- **Skip-path probe:** push a change matching any `paths:` filter that
|
|
140
|
+
previously skipped gates; confirm the aggregator still reports
|
|
141
|
+
(skipped-as-success is the failure mode to disprove).
|
|
142
|
+
- Run a `workflow-green-repo`-style full pass to confirm the repo is green
|
|
143
|
+
under the new single gate.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Definition of Done
|
|
148
|
+
|
|
149
|
+
- [ ] Archaeology map confirmed with the user before edits
|
|
150
|
+
- [ ] Aggregator job exists, fails on any failed **or skipped** dependency, and is the only required check
|
|
151
|
+
- [ ] `merge_group` parity in place if a merge queue is used
|
|
152
|
+
- [ ] Every cluster: unique value ported, winner wired, losers deleted (not disabled)
|
|
153
|
+
- [ ] Shared steps extracted to one reusable definition; hooks and CI call the same commands
|
|
154
|
+
- [ ] One baseline per metric; ratchets auto-tighten; resets require a separate reviewed PR; exemption lists cannot silently grow
|
|
155
|
+
- [ ] Deliberate-violation + skip-path probes red as expected; repo green under the new gate
|
|
156
|
+
- [ ] Net enforcement strictly ≥ before
|
|
157
|
+
|
|
158
|
+
## Self-critique before claiming done [LOW freedom — do not skip]
|
|
159
|
+
|
|
160
|
+
1. **Map confirmed** — no "obvious duplicate" deleted unmapped
|
|
161
|
+
2. **Skipped ≠ success** — aggregator checks dependency results
|
|
162
|
+
3. **Losers deleted** — not disabled
|
|
163
|
+
4. **Probes red** — violation + skip-path
|
|
164
|
+
5. **Branch protection** — only after explicit confirmation
|
|
165
|
+
|
|
166
|
+
## Output format
|
|
167
|
+
|
|
168
|
+
1. **Before/after map** — old gates → new structure (aggregator + needs list)
|
|
169
|
+
2. **Per-cluster log** — winner | value ported from losers | losers deleted
|
|
170
|
+
3. **Ratchet policy** — metric | enforcement point | floor behavior | reset rule
|
|
171
|
+
4. **Probe evidence** — violation | gate response | pass/fail
|
|
172
|
+
|
|
173
|
+
Applied phase-by-phase. Pause for approval between phases when blast
|
|
174
|
+
radius is large. Branch-protection changes always get explicit confirmation.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: iterate-agent-harness
|
|
3
|
+
description: >
|
|
4
|
+
Turn an agent failure (premature stop, false completion, gamed check, missed
|
|
5
|
+
file) into a rule, hook, or CI guard with a regression test. Use when "the
|
|
6
|
+
agent stopped early again", "it gamed the test", or "add a guard so this
|
|
7
|
+
doesn't recur".
|
|
8
|
+
license: MIT
|
|
9
|
+
effort: high
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# iterate-agent-harness — Failure → Durable Guard
|
|
13
|
+
|
|
14
|
+
**Degree of freedom: MIXED.** Failure-class and smallest fix `[HIGH freedom]`;
|
|
15
|
+
guard-fails-before-fix and the report shape `[LOW freedom — run exactly]`.
|
|
16
|
+
|
|
17
|
+
When an agent run ends wrong, the fix is not just to redo the task — it is to
|
|
18
|
+
change the harness so the whole class of failure cannot recur silently. This
|
|
19
|
+
skill converts a single failure into a durable guard plus a regression check.
|
|
20
|
+
|
|
21
|
+
> **A failure you cannot reproduce, you cannot prove you fixed.** Capture the
|
|
22
|
+
> failure mode, add a guard that fails on it, then make the guard pass with the
|
|
23
|
+
> smallest durable change.
|
|
24
|
+
|
|
25
|
+
## How to reason
|
|
26
|
+
|
|
27
|
+
1. **Observe** — happened vs should-have; transcript, state file, diff, CI
|
|
28
|
+
2. **Interpret** — routing miss, missing guard, or a gate that passed wrongly
|
|
29
|
+
3. **Classify** — premature stop / false completion / reward hacking / scope / handoff / context loss
|
|
30
|
+
4. **Guard** — add a guard that fails on the unfixed behavior, then the smallest durable fix
|
|
31
|
+
|
|
32
|
+
## Worked example
|
|
33
|
+
|
|
34
|
+
> **Observe:** agent said complete-everything was done; `.cursor/complete-everything-state.md` still has 12 unchecked items.
|
|
35
|
+
> **Interpret:** false completion — no harness stopped the claim.
|
|
36
|
+
> **Classify:** false completion; gap is an unwired or skippable completion gate.
|
|
37
|
+
> **Fix:** add a hook test that fails while unchecked items remain; confirm it fails on this tree; then wire the hook. Do not delete the open items to go green.
|
|
38
|
+
|
|
39
|
+
## Self-critique before reporting
|
|
40
|
+
|
|
41
|
+
- **Fail-then-pass** — the new guard failed on the unfixed tree
|
|
42
|
+
- **Class, not incident** — the same failure mode would now be caught
|
|
43
|
+
- **Guard not weakened** — passing did not mean deleting or narrowing the check
|
|
44
|
+
- **Right owner** — app bug → `workflow-fix-and-ship`; new SKILL.md from scratch → `meta-skill-creator`
|
|
45
|
+
|
|
46
|
+
## Phase 0 — Capture the failure precisely [HIGH freedom]
|
|
47
|
+
|
|
48
|
+
1. State what happened vs. what should have happened, in one sentence each.
|
|
49
|
+
2. Classify the failure mode (borrow the taxonomy the toolkit already targets):
|
|
50
|
+
- **premature stop** — quit with actionable work remaining. Shapes to guard: ends the turn with a plan or status report instead of the work; asks a question the repo could answer; stops after a subagent returns without integrating its result; wraps up early believing context is running out (compaction exists — it should not)
|
|
51
|
+
- **false completion** — claimed done without evidence, including fabricated progress: a "ran", "checked", or "verified" with no matching tool result in the transcript
|
|
52
|
+
- **reward hacking** — satisfied the check, not the intent (skipped test,
|
|
53
|
+
narrowed assertion, `@ts-ignore`, blanket snapshot update)
|
|
54
|
+
- **scope boundary error** — treated the plan/visible list as the full scope
|
|
55
|
+
- **broken handoff** — a skill/command/subagent pointed at a missing or
|
|
56
|
+
wrong target, or a phase transition dropped work
|
|
57
|
+
- **context loss** — forgot earlier state after compaction
|
|
58
|
+
3. Pull evidence from the agent transcript, `.cursor/*-state.md` files,
|
|
59
|
+
`git diff`, and CI logs. Link the concrete artifacts.
|
|
60
|
+
|
|
61
|
+
## Phase 1 — Locate the harness gap [HIGH freedom]
|
|
62
|
+
|
|
63
|
+
Find where the harness *should* have caught it:
|
|
64
|
+
|
|
65
|
+
- Was there a skill/rule that covered this, and it was not followed or not
|
|
66
|
+
triggered? → the description/routing or wording is the gap.
|
|
67
|
+
- Was there no guard at all? → a new rule, hook, subagent check, or
|
|
68
|
+
verification script is warranted.
|
|
69
|
+
- Did an enforcement gate exist but pass anyway (like a count check with
|
|
70
|
+
incomplete coverage)? → the gate's coverage is the gap.
|
|
71
|
+
|
|
72
|
+
Name the single smallest change that closes the class, not just this instance.
|
|
73
|
+
Prefer strengthening an existing skill/rule/hook over adding a new one; only
|
|
74
|
+
add a new component when no existing one owns the concern.
|
|
75
|
+
|
|
76
|
+
## Phase 2 — Add a regression guard first [LOW freedom — fail before fix]
|
|
77
|
+
|
|
78
|
+
Before fixing, add something that fails on the captured failure:
|
|
79
|
+
|
|
80
|
+
- an executable check (a script under `scripts/`, a hook test like
|
|
81
|
+
`scripts/test-completion-gate.mjs`, a validation rule) — preferred; or
|
|
82
|
+
- a documented, repeatable scenario with an explicit expected outcome when the
|
|
83
|
+
failure is judgment-based and not mechanically checkable.
|
|
84
|
+
|
|
85
|
+
For premature-stop and false-completion classes, two guards are mechanical: (1) transcript audit — every claimed action maps to a tool result; (2) turn-ending check — the last paragraph of a turn lists done vs owed, and an owed item with no named blocker means the turn should not have ended. Encode those as the guard rather than a wording tweak.
|
|
86
|
+
|
|
87
|
+
Confirm the guard actually fails against the current (unfixed) behavior — a
|
|
88
|
+
guard that passes before the fix proves nothing.
|
|
89
|
+
|
|
90
|
+
## Phase 3 — Make the smallest durable fix [HIGH freedom]
|
|
91
|
+
|
|
92
|
+
Apply the minimal change that makes the guard pass by satisfying intent:
|
|
93
|
+
|
|
94
|
+
- tighten a skill/rule's wording or trigger; resolve a policy conflict;
|
|
95
|
+
- fix or add a hook / subagent / verification script;
|
|
96
|
+
- repair a broken skill/command/subagent reference or handoff.
|
|
97
|
+
|
|
98
|
+
Do not weaken the guard to pass, and do not delete working behavior. Keep the
|
|
99
|
+
public behavior of unrelated skills unchanged.
|
|
100
|
+
|
|
101
|
+
## Phase 4 — Validate and record the lesson [LOW freedom — do not skip]
|
|
102
|
+
|
|
103
|
+
1. Re-run the guard: it now passes for the right reason. Run the repo's full
|
|
104
|
+
check suite (`npm test` or equivalent) so the new guard is wired in.
|
|
105
|
+
2. Record a concise lesson: the failure mode, the trigger, the guard, and the
|
|
106
|
+
fix — in `CHANGELOG.md` and/or a durable lessons note, so the same mistake
|
|
107
|
+
surfaces a reference next time.
|
|
108
|
+
3. If the failure recurred despite an existing guard, note why the guard was
|
|
109
|
+
insufficient and strengthen it rather than duplicating it.
|
|
110
|
+
|
|
111
|
+
## Phase 5 — Report [LOW freedom — this shape]
|
|
112
|
+
|
|
113
|
+
```md
|
|
114
|
+
## Harness Iteration — <date>
|
|
115
|
+
Failure mode: <class> — <one-sentence description>
|
|
116
|
+
Root gap: <missing/weak guard or conflicting rule>
|
|
117
|
+
Guard added: <script/test/rule> — failed before, passes after
|
|
118
|
+
Durable fix: <smallest change>
|
|
119
|
+
Validation: <check suite> → green
|
|
120
|
+
Lesson recorded: <where>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Guardrails
|
|
124
|
+
|
|
125
|
+
- Improve the harness for the **class**, not just the one incident.
|
|
126
|
+
- A new guard must fail before the fix and pass after — never the reverse.
|
|
127
|
+
- Never satisfy a guard by weakening it; that repeats the reward-hacking
|
|
128
|
+
failure this skill exists to prevent.
|
|
129
|
+
- Prefer editing an existing skill/rule/hook to adding a new one.
|
|
130
|
+
|
|
131
|
+
## Related
|
|
132
|
+
|
|
133
|
+
- `verification-before-completion` — the evidence discipline guards enforce
|
|
134
|
+
- `completion-judge` — independent verdict that catches false completion
|
|
135
|
+
- `complete-everything` / `burndown-full` — the closure loops guards protect
|
|
136
|
+
- `create-skill` / `create-rule` / `create-hook` — build the new guard
|
|
137
|
+
- `meta-skill-creator` — author or refine a skill correctly
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: iterate-gtm-weekly
|
|
3
|
+
description: >
|
|
4
|
+
Weekly go-to-market review for a shipped product: funnel by source,
|
|
5
|
+
activation cohort, top drop-off, launch results, then one experiment and one
|
|
6
|
+
post, scorecard row appended. Use when "weekly growth review", "what should
|
|
7
|
+
we do this week for growth", "GTM check-in". Production bugs →
|
|
8
|
+
iterate-post-launch.
|
|
9
|
+
license: MIT
|
|
10
|
+
disable-model-invocation: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# iterate-gtm-weekly — One number, one fix, one post
|
|
14
|
+
|
|
15
|
+
**Degree of freedom: MIXED.** Which lever to pull `[HIGH freedom]`; the
|
|
16
|
+
five-line review, the single-experiment rule, and the scorecard update
|
|
17
|
+
`[LOW freedom — run exactly]`.
|
|
18
|
+
|
|
19
|
+
The loop after `workflow-gtm`. Thirty minutes a week: read what the funnel
|
|
20
|
+
did, name the one step that lost the most, ship one experiment against it,
|
|
21
|
+
publish one thing, write it down. `iterate-post-launch` owns production
|
|
22
|
+
defects; this owns growth.
|
|
23
|
+
|
|
24
|
+
## This skill vs neighbors
|
|
25
|
+
|
|
26
|
+
| Skill | Owns |
|
|
27
|
+
|---|---|
|
|
28
|
+
| **iterate-gtm-weekly** (this) | Weekly funnel read → one experiment → one post → scorecard |
|
|
29
|
+
| `iterate-post-launch` | Sentry / production signals → fix |
|
|
30
|
+
| `workflow-gtm` | The initial plan-to-apply run this loop follows |
|
|
31
|
+
| `audit-analytics` | When a funnel cell is blind, add the event first |
|
|
32
|
+
| `docs-launch-kit` | The post, when it is a launch |
|
|
33
|
+
| `workflow-feedback-to-closure` | Turning user feedback into tickets |
|
|
34
|
+
|
|
35
|
+
Do **not** fire for "errors spiked in production" → `iterate-post-launch`.
|
|
36
|
+
|
|
37
|
+
## How to reason
|
|
38
|
+
|
|
39
|
+
1. **Read** — the six funnel cells by source for the last 7 days vs the prior 7
|
|
40
|
+
2. **Locate** — the single step with the largest absolute loss (not the smallest percentage)
|
|
41
|
+
3. **Attribute** — did last week's experiment or post move anything; say so with the number
|
|
42
|
+
4. **Choose** — one experiment on the losing step, one post, both small enough for this week
|
|
43
|
+
5. **Record** — scorecard row appended; next review scheduled
|
|
44
|
+
|
|
45
|
+
## Worked example
|
|
46
|
+
|
|
47
|
+
> **Read:** visits 4,120 (+9%), signups 310 (−4%), activated 71 (23%, flat), paid 6, refer 2; Show HN source dried up, organic docs traffic up.
|
|
48
|
+
> **Locate:** signup → activated loses 239 users; visit → signup lost 22 more than last week but far fewer in absolute terms.
|
|
49
|
+
> **Attribute:** last week's hero rewrite: visit→signup 7.9% → 7.5% — no lift; keep for one more week (sample small).
|
|
50
|
+
> **Choose:** experiment — pre-fill the workspace with sample data for the "explore" JTBD answer (`enhance-onboarding`); post — a short comparison page announcement.
|
|
51
|
+
> **Record:** row appended to `plan-gtm.md` scorecard; review next Monday.
|
|
52
|
+
|
|
53
|
+
## Self-critique before reporting
|
|
54
|
+
|
|
55
|
+
- **Five lines** — the review fits: funnel by source · activation cohort · top drop-off · last experiment result · one post
|
|
56
|
+
- **One experiment** — exactly one, with a metric and a stop date; a second becomes next week's
|
|
57
|
+
- **Attributed** — last week's change has a number beside it, even if "no change" or "unmeasured"
|
|
58
|
+
- **Recorded** — scorecard row appended in `plan-gtm.md` (or the file `workflow-gtm` produced)
|
|
59
|
+
- **Right owner** — production errors → `iterate-post-launch`; new events → `audit-analytics`
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Procedure [LOW freedom — run exactly]
|
|
64
|
+
|
|
65
|
+
1. **Pull numbers** — analytics dashboard or export for Visit → Signup →
|
|
66
|
+
Activated → Habit → Paid → Refer, by `utm_source` / referrer, this week vs
|
|
67
|
+
last. Blind cell → write **unmeasured** and file the event with
|
|
68
|
+
`audit-analytics` as this week's experiment if it is the losing step.
|
|
69
|
+
2. **Launch results** — fill any `docs/launch/*.md` Results table older than 7 days.
|
|
70
|
+
3. **Locate the loss** — absolute users lost per step; pick the largest.
|
|
71
|
+
4. **Attribute** — last week's experiment: metric before / after; keep, revert, or extend.
|
|
72
|
+
5. **Choose** — one experiment (owner skill named) + one post (channel named).
|
|
73
|
+
6. **Write the row** and schedule next week.
|
|
74
|
+
|
|
75
|
+
## Levers by losing step [HIGH freedom]
|
|
76
|
+
|
|
77
|
+
| Losing step | First levers | Skill |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| Visit → Signup | hero five-second test, CTA verb, "no card" line, ungated try | `enhance-web-conversion` |
|
|
80
|
+
| Signup → Activated | cut a field, sample data, checklist end = activation, day-1 nudge | `enhance-onboarding`, `enhance-lifecycle-email` |
|
|
81
|
+
| Activated → Habit | day-3/7 nudges, saved-state reminder, second aha | `enhance-lifecycle-email` |
|
|
82
|
+
| Habit → Paid | limit-moment prompt, price shown, annual toggle wording | `enhance-web-conversion`, `plan-pricing` |
|
|
83
|
+
| Paid → Refer | badge, share artifact, referral credit on activation | `enhance-growth-loops` |
|
|
84
|
+
| Visits themselves | one comparison page, one launch post, registry listing | `docs-comparison-pages`, `docs-launch-kit`, `audit-registry-listing` |
|
|
85
|
+
|
|
86
|
+
## Scorecard row [LOW freedom — shape]
|
|
87
|
+
|
|
88
|
+
```markdown
|
|
89
|
+
| Week | Visit | Signup | Activated | Habit | Paid | Refer | Top loss | Experiment (metric, stop date) | Post | Last week's result |
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Guardrails
|
|
93
|
+
|
|
94
|
+
- **One experiment.** Two changes on one step make attribution impossible.
|
|
95
|
+
- **Absolute loss, not percentage.** A 90% drop on 10 users is not the priority.
|
|
96
|
+
- **Numbers or "unmeasured".** No estimates presented as measurements.
|
|
97
|
+
- **Thirty minutes.** If the review grows, the instrumentation is the problem — file it.
|
|
98
|
+
|
|
99
|
+
## Chains with
|
|
100
|
+
|
|
101
|
+
- **`workflow-gtm`** → produces the scorecard this loop appends to.
|
|
102
|
+
- **`audit-analytics`** → blind cells.
|
|
103
|
+
- **`enhance-onboarding`**, **`enhance-web-conversion`**, **`enhance-lifecycle-email`**, **`enhance-growth-loops`**, **`docs-comparison-pages`**, **`docs-launch-kit`** → the levers.
|