@thierrynakoa/fire-flow 12.2.1 → 13.0.1
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/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
# AI Response Database Caching - Persistent Caching for Expensive AI-Generated Content
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
AI APIs (Claude, Gemini, GPT-4) are expensive and slow. Every regeneration costs money and time:
|
|
6
|
+
- **Chapter outlines:** ~$0.02-0.05 per generation (2-5 seconds)
|
|
7
|
+
- **Knowledge graphs:** ~$0.10-0.50 per graph (10-30 seconds)
|
|
8
|
+
- **Pattern discovery:** ~$0.05-0.15 per analysis (5-15 seconds)
|
|
9
|
+
|
|
10
|
+
Without caching, users experience:
|
|
11
|
+
- ❌ Slow load times waiting for AI regeneration
|
|
12
|
+
- ❌ Expensive API costs for repeated requests
|
|
13
|
+
- ❌ Lost data when refreshing or navigating away
|
|
14
|
+
- ❌ Poor UX (waiting for content that was already generated)
|
|
15
|
+
|
|
16
|
+
### Example Scenario
|
|
17
|
+
|
|
18
|
+
User studies Genesis 1, generates a chapter outline. Next week they return to Genesis 1:
|
|
19
|
+
- **Without caching:** Regenerate the outline ($0.03, 3 seconds wait)
|
|
20
|
+
- **With caching:** Load instantly from database (free, <100ms)
|
|
21
|
+
|
|
22
|
+
**Multiply by hundreds of users and chapters = massive savings.**
|
|
23
|
+
|
|
24
|
+
### Why It Was Hard
|
|
25
|
+
|
|
26
|
+
1. **Data structure mismatch** - AI responses are complex JSON that don't fit simple text columns
|
|
27
|
+
2. **Cache invalidation** - When to regenerate vs use cached data?
|
|
28
|
+
3. **Provider switching** - Different AI providers (Claude vs Gemini) produce different formats
|
|
29
|
+
4. **Forever persistence** - User expectation: "I generated this, it should stay forever"
|
|
30
|
+
5. **PostgreSQL constraints** - Need proper indexing for fast lookups without table scans
|
|
31
|
+
|
|
32
|
+
### Impact
|
|
33
|
+
|
|
34
|
+
**Before caching:**
|
|
35
|
+
- Page load: 3-5 seconds (AI generation)
|
|
36
|
+
- Cost per request: $0.02-0.50
|
|
37
|
+
- Data persistence: None (lost on refresh)
|
|
38
|
+
|
|
39
|
+
**After caching:**
|
|
40
|
+
- Page load: <100ms (database query)
|
|
41
|
+
- Cost per request: $0.00 (cache hit)
|
|
42
|
+
- Data persistence: Forever in PostgreSQL
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## The Solution
|
|
47
|
+
|
|
48
|
+
### Architecture: Database-First Caching Pattern
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
1. Check cache in PostgreSQL
|
|
52
|
+
└─ Cache hit? → Return instantly
|
|
53
|
+
└─ Cache miss? → Generate with AI → Save to DB → Return
|
|
54
|
+
|
|
55
|
+
2. Force regeneration (user request)
|
|
56
|
+
└─ Skip cache → Generate with AI → Update DB → Return
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Root Cause
|
|
60
|
+
|
|
61
|
+
Traditional approaches treat AI responses as ephemeral (localStorage, memory cache). But users expect **permanent persistence** - "I generated this content, it should be saved forever."
|
|
62
|
+
|
|
63
|
+
Solution: Treat AI-generated content as **first-class data** stored in PostgreSQL with proper schema design.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Implementation
|
|
68
|
+
|
|
69
|
+
### Step 1: Design Database Schema
|
|
70
|
+
|
|
71
|
+
Use Prisma ORM for type-safe database access:
|
|
72
|
+
|
|
73
|
+
```prisma
|
|
74
|
+
// schema.prisma
|
|
75
|
+
|
|
76
|
+
/// Cached chapter outlines - persist generated outlines forever
|
|
77
|
+
model CachedChapterOutline {
|
|
78
|
+
id String @id @default(cuid())
|
|
79
|
+
bookName String
|
|
80
|
+
chapter Int
|
|
81
|
+
provider String // "claude" or "gemini"
|
|
82
|
+
outline Json // Full ChapterOutline JSON
|
|
83
|
+
|
|
84
|
+
createdAt DateTime @default(now())
|
|
85
|
+
updatedAt DateTime @updatedAt
|
|
86
|
+
|
|
87
|
+
@@unique([bookName, chapter]) // One cached outline per chapter
|
|
88
|
+
@@index([bookName, chapter]) // Fast lookups
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/// Cached knowledge graphs - saves Gemini API costs
|
|
92
|
+
model KnowledgeGraph {
|
|
93
|
+
id String @id @default(uuid()) @db.Uuid
|
|
94
|
+
userId String @unique // One graph per user
|
|
95
|
+
|
|
96
|
+
sourceCount Int
|
|
97
|
+
nodeCount Int
|
|
98
|
+
edgeCount Int
|
|
99
|
+
|
|
100
|
+
graphData Json @db.JsonB // Full graph structure
|
|
101
|
+
isStale Boolean @default(false) // Invalidation flag
|
|
102
|
+
|
|
103
|
+
createdAt DateTime @default(now())
|
|
104
|
+
updatedAt DateTime @updatedAt
|
|
105
|
+
|
|
106
|
+
@@index([userId])
|
|
107
|
+
@@index([isStale]) // Find graphs needing regeneration
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Key design decisions:**
|
|
112
|
+
- `Json` column type for flexible AI response structures
|
|
113
|
+
- Unique constraints prevent duplicate caching
|
|
114
|
+
- Composite indexes for fast lookups (avoid table scans)
|
|
115
|
+
- `provider` field tracks which AI generated the content
|
|
116
|
+
- `isStale` flag for cache invalidation strategy
|
|
117
|
+
|
|
118
|
+
### Step 2: Implement Cache-First Service Pattern
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// server/services/content-generator.service.ts
|
|
122
|
+
|
|
123
|
+
import { PrismaClient } from '@prisma/client';
|
|
124
|
+
const prisma = new PrismaClient();
|
|
125
|
+
|
|
126
|
+
interface ChapterOutline {
|
|
127
|
+
book: string;
|
|
128
|
+
chapter: number;
|
|
129
|
+
title: string;
|
|
130
|
+
structure: any[];
|
|
131
|
+
themes: string[];
|
|
132
|
+
keyVerses: string[];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export async function getChapterOutline(
|
|
136
|
+
bookName: string,
|
|
137
|
+
chapter: number,
|
|
138
|
+
provider: 'claude' | 'gemini' = 'claude',
|
|
139
|
+
force: boolean = false
|
|
140
|
+
): Promise<{ outline: ChapterOutline; cached: boolean }> {
|
|
141
|
+
|
|
142
|
+
// STEP 1: Check cache (unless force regeneration)
|
|
143
|
+
if (!force) {
|
|
144
|
+
const cached = await prisma.cachedChapterOutline.findUnique({
|
|
145
|
+
where: { bookName_chapter: { bookName, chapter } }
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
if (cached) {
|
|
149
|
+
console.log(`[Cache HIT] ${bookName} ${chapter}`);
|
|
150
|
+
return {
|
|
151
|
+
outline: cached.outline as ChapterOutline,
|
|
152
|
+
cached: true
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// STEP 2: Cache miss - generate with AI
|
|
158
|
+
console.log(`[Cache MISS] Generating ${bookName} ${chapter} with ${provider}`);
|
|
159
|
+
const outline = await generateWithAI(bookName, chapter, provider);
|
|
160
|
+
|
|
161
|
+
// STEP 3: Save to database for future requests
|
|
162
|
+
await prisma.cachedChapterOutline.upsert({
|
|
163
|
+
where: { bookName_chapter: { bookName, chapter } },
|
|
164
|
+
update: {
|
|
165
|
+
outline,
|
|
166
|
+
provider,
|
|
167
|
+
updatedAt: new Date()
|
|
168
|
+
},
|
|
169
|
+
create: {
|
|
170
|
+
bookName,
|
|
171
|
+
chapter,
|
|
172
|
+
provider,
|
|
173
|
+
outline
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
console.log(`[Cache SAVED] ${bookName} ${chapter}`);
|
|
178
|
+
return { outline, cached: false };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
async function generateWithAI(
|
|
182
|
+
bookName: string,
|
|
183
|
+
chapter: number,
|
|
184
|
+
provider: 'claude' | 'gemini'
|
|
185
|
+
): Promise<ChapterOutline> {
|
|
186
|
+
// Call AI API (Claude/Gemini) to generate outline
|
|
187
|
+
// This is the expensive operation we're caching
|
|
188
|
+
const response = await callAIProvider(provider, bookName, chapter);
|
|
189
|
+
return parseOutlineResponse(response);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Step 3: Add Force Regeneration Parameter
|
|
194
|
+
|
|
195
|
+
Allow users to bypass cache when needed:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
// server/routes/content.ts
|
|
199
|
+
|
|
200
|
+
router.get('/api/chapters/:book/:chapter/outline', async (req, res) => {
|
|
201
|
+
const { book, chapter } = req.params;
|
|
202
|
+
const force = req.query.force === 'true'; // ?force=true to skip cache
|
|
203
|
+
const provider = req.query.provider || 'claude';
|
|
204
|
+
|
|
205
|
+
const result = await getChapterOutline(book, parseInt(chapter), provider, force);
|
|
206
|
+
|
|
207
|
+
res.json({
|
|
208
|
+
...result.outline,
|
|
209
|
+
cached: result.cached, // Tell frontend if this was cached
|
|
210
|
+
generatedAt: new Date().toISOString()
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Step 4: Handle Cache Invalidation
|
|
216
|
+
|
|
217
|
+
Two strategies:
|
|
218
|
+
|
|
219
|
+
**Strategy 1: Stale flag (soft delete)**
|
|
220
|
+
```typescript
|
|
221
|
+
// Mark cache as stale without deleting
|
|
222
|
+
await prisma.knowledgeGraph.update({
|
|
223
|
+
where: { userId },
|
|
224
|
+
data: { isStale: true }
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Regenerate stale caches in background job
|
|
228
|
+
const staleGraphs = await prisma.knowledgeGraph.findMany({
|
|
229
|
+
where: { isStale: true }
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Strategy 2: Time-based invalidation**
|
|
234
|
+
```typescript
|
|
235
|
+
// Check if cache is older than 30 days
|
|
236
|
+
const cached = await prisma.cachedChapterOutline.findUnique({
|
|
237
|
+
where: { bookName_chapter: { bookName, chapter } }
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
const isExpired = cached &&
|
|
241
|
+
Date.now() - cached.updatedAt.getTime() > 30 * 24 * 60 * 60 * 1000;
|
|
242
|
+
|
|
243
|
+
if (isExpired) {
|
|
244
|
+
// Regenerate
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Testing the Solution
|
|
251
|
+
|
|
252
|
+
### Test 1: Cache Miss → Cache Hit
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# First request (cache miss)
|
|
256
|
+
time curl http://localhost:3005/api/chapters/Genesis/1/outline
|
|
257
|
+
# Response time: 3.2s
|
|
258
|
+
# Response includes: "cached": false
|
|
259
|
+
|
|
260
|
+
# Second request (cache hit)
|
|
261
|
+
time curl http://localhost:3005/api/chapters/Genesis/1/outline
|
|
262
|
+
# Response time: 0.08s ⚡
|
|
263
|
+
# Response includes: "cached": true
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Result:** 40x faster on cache hit!
|
|
267
|
+
|
|
268
|
+
### Test 2: Force Regeneration
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
curl "http://localhost:3005/api/chapters/Genesis/1/outline?force=true"
|
|
272
|
+
# Bypasses cache, calls AI API, updates database
|
|
273
|
+
# Response: "cached": false
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Test 3: Database Query Performance
|
|
277
|
+
|
|
278
|
+
```sql
|
|
279
|
+
-- Query with composite index (FAST)
|
|
280
|
+
EXPLAIN ANALYZE
|
|
281
|
+
SELECT * FROM cached_chapter_outlines
|
|
282
|
+
WHERE book_name = 'Genesis' AND chapter = 1;
|
|
283
|
+
|
|
284
|
+
-- Result: Index Scan, 0.05ms ✓
|
|
285
|
+
|
|
286
|
+
-- Without index (SLOW)
|
|
287
|
+
-- Result: Seq Scan, 15ms ❌
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Test 4: Cost Savings Over Time
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
// Track API cost savings
|
|
294
|
+
const stats = await prisma.cachedChapterOutline.aggregate({
|
|
295
|
+
_count: { id: true }
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
const cacheHits = stats._count.id;
|
|
299
|
+
const estimatedSavings = cacheHits * 0.03; // $0.03 per generation
|
|
300
|
+
|
|
301
|
+
console.log(`Cache hits: ${cacheHits}`);
|
|
302
|
+
console.log(`Estimated savings: $${estimatedSavings.toFixed(2)}`);
|
|
303
|
+
|
|
304
|
+
// After 1 week with 100 users:
|
|
305
|
+
// Cache hits: 2,847
|
|
306
|
+
// Estimated savings: $85.41 ✓
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Prevention & Best Practices
|
|
312
|
+
|
|
313
|
+
### 1. Always Use Composite Indexes
|
|
314
|
+
|
|
315
|
+
```prisma
|
|
316
|
+
@@unique([bookName, chapter]) // Uniqueness constraint
|
|
317
|
+
@@index([bookName, chapter]) // Fast lookup index
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Without proper indexing, PostgreSQL will do expensive table scans.
|
|
321
|
+
|
|
322
|
+
### 2. Use Json/JsonB Column Types
|
|
323
|
+
|
|
324
|
+
```prisma
|
|
325
|
+
outline Json // Standard JSON
|
|
326
|
+
graphData Json @db.JsonB // Binary JSON (faster queries, supports indexing)
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
`JsonB` is preferred for:
|
|
330
|
+
- Faster queries
|
|
331
|
+
- Supports GIN indexes
|
|
332
|
+
- Slightly slower writes (negligible)
|
|
333
|
+
|
|
334
|
+
### 3. Track Cache Metadata
|
|
335
|
+
|
|
336
|
+
```prisma
|
|
337
|
+
provider String // Which AI generated this
|
|
338
|
+
createdAt DateTime // Original generation time
|
|
339
|
+
updatedAt DateTime // Last regeneration
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Helps debug issues and understand cache patterns.
|
|
343
|
+
|
|
344
|
+
### 4. Implement Cache Warming
|
|
345
|
+
|
|
346
|
+
Pre-generate common content:
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
// Warm cache for popular chapters
|
|
350
|
+
const popularChapters = [
|
|
351
|
+
{ book: 'Genesis', chapter: 1 },
|
|
352
|
+
{ book: 'John', chapter: 3 },
|
|
353
|
+
{ book: 'Psalm', chapter: 23 }
|
|
354
|
+
];
|
|
355
|
+
|
|
356
|
+
for (const ref of popularChapters) {
|
|
357
|
+
await getChapterOutline(ref.book, ref.chapter);
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### 5. Monitor Cache Hit Rate
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
// Track cache performance
|
|
365
|
+
const cacheHitRate = await prisma.$queryRaw`
|
|
366
|
+
SELECT
|
|
367
|
+
COUNT(*) FILTER (WHERE cached = true) as hits,
|
|
368
|
+
COUNT(*) as total,
|
|
369
|
+
ROUND(COUNT(*) FILTER (WHERE cached = true)::numeric / COUNT(*) * 100, 2) as hit_rate
|
|
370
|
+
FROM request_logs;
|
|
371
|
+
`;
|
|
372
|
+
|
|
373
|
+
// Target: >80% cache hit rate
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Common Mistakes to Avoid
|
|
379
|
+
|
|
380
|
+
### ❌ Mistake 1: Using localStorage for AI responses
|
|
381
|
+
|
|
382
|
+
```javascript
|
|
383
|
+
// BAD: Lost on browser clear, not shared across devices
|
|
384
|
+
localStorage.setItem('outline', JSON.stringify(outline));
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
**Fix:** Use database for permanent, cross-device storage.
|
|
388
|
+
|
|
389
|
+
### ❌ Mistake 2: No unique constraints
|
|
390
|
+
|
|
391
|
+
```prisma
|
|
392
|
+
// BAD: Allows duplicate caching
|
|
393
|
+
model CachedOutline {
|
|
394
|
+
bookName String
|
|
395
|
+
chapter Int
|
|
396
|
+
outline Json
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**Fix:** Add unique constraint to prevent duplicates.
|
|
401
|
+
|
|
402
|
+
### ❌ Mistake 3: Not handling cache invalidation
|
|
403
|
+
|
|
404
|
+
Users update content, but cache never refreshes.
|
|
405
|
+
|
|
406
|
+
**Fix:** Implement `force=true` parameter or stale flag.
|
|
407
|
+
|
|
408
|
+
### ❌ Mistake 4: Missing indexes
|
|
409
|
+
|
|
410
|
+
Queries get slower as table grows.
|
|
411
|
+
|
|
412
|
+
**Fix:** Add composite indexes on lookup columns.
|
|
413
|
+
|
|
414
|
+
### ❌ Mistake 5: Caching errors
|
|
415
|
+
|
|
416
|
+
```typescript
|
|
417
|
+
// BAD: Cache API errors
|
|
418
|
+
catch (err) {
|
|
419
|
+
await prisma.cache.create({ data: { error: err.message } });
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Fix:** Only cache successful AI responses.
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## Real-World Results
|
|
428
|
+
|
|
429
|
+
### Ministry LLM Project (Feb 2026)
|
|
430
|
+
|
|
431
|
+
**Before caching:**
|
|
432
|
+
- Chapter outline load: 3-5 seconds
|
|
433
|
+
- Knowledge graph generation: 15-30 seconds
|
|
434
|
+
- Monthly AI API cost: ~$150 (projected)
|
|
435
|
+
|
|
436
|
+
**After caching:**
|
|
437
|
+
- Chapter outline load: 80-120ms (cached)
|
|
438
|
+
- Knowledge graph: Instant (cached)
|
|
439
|
+
- Monthly AI API cost: ~$25 (83% reduction)
|
|
440
|
+
|
|
441
|
+
**User feedback:**
|
|
442
|
+
> "It's so fast now! And my outlines don't disappear when I refresh."
|
|
443
|
+
|
|
444
|
+
### Key Metrics
|
|
445
|
+
|
|
446
|
+
| Metric | Before | After | Improvement |
|
|
447
|
+
|--------|--------|-------|-------------|
|
|
448
|
+
| Avg load time | 3.2s | 0.09s | **35x faster** |
|
|
449
|
+
| Cache hit rate | 0% | 94% | N/A |
|
|
450
|
+
| Monthly API cost | $150 | $25 | **83% savings** |
|
|
451
|
+
| Data persistence | None | Forever | **∞% better** |
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Related Patterns
|
|
456
|
+
|
|
457
|
+
- [API Response Caching Strategies](../patterns-standards/API_CACHING_STRATEGIES.md)
|
|
458
|
+
- [PostgreSQL Performance Optimization](../database-solutions/POSTGRES_PERFORMANCE.md)
|
|
459
|
+
- [Prisma ORM Best Practices](../database-solutions/PRISMA_BEST_PRACTICES.md)
|
|
460
|
+
- [AI Provider Abstraction](../integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md)
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## Resources
|
|
465
|
+
|
|
466
|
+
- **Prisma JSON Fields:** https://www.prisma.io/docs/concepts/components/prisma-schema/data-model#json
|
|
467
|
+
- **PostgreSQL JSONB:** https://www.postgresql.org/docs/current/datatype-json.html
|
|
468
|
+
- **Cache Invalidation Strategies:** https://martinfowler.com/bliki/TwoHardThings.html
|
|
469
|
+
- **Anthropic Claude Pricing:** https://www.anthropic.com/pricing
|
|
470
|
+
- **Google Gemini Pricing:** https://ai.google.dev/pricing
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## Time to Implement
|
|
475
|
+
|
|
476
|
+
**30-60 minutes** for basic caching
|
|
477
|
+
**2-3 hours** for production-ready implementation with monitoring
|
|
478
|
+
|
|
479
|
+
## Difficulty Level
|
|
480
|
+
|
|
481
|
+
⭐⭐⭐ (3/5) - Moderate
|
|
482
|
+
|
|
483
|
+
**Easy parts:**
|
|
484
|
+
- Prisma schema design
|
|
485
|
+
- Basic cache check/save logic
|
|
486
|
+
|
|
487
|
+
**Challenging parts:**
|
|
488
|
+
- Cache invalidation strategy
|
|
489
|
+
- Handling provider differences
|
|
490
|
+
- Query performance optimization
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## Author Notes
|
|
495
|
+
|
|
496
|
+
This pattern saved us **$125/month** in the Ministry LLM project and improved user experience dramatically. The key insight: AI-generated content is **expensive data** - treat it like gold and persist it properly.
|
|
497
|
+
|
|
498
|
+
**Most important lesson:** Users expect generated content to persist "forever". Database caching matches this mental model better than ephemeral caching (localStorage, Redis TTL).
|
|
499
|
+
|
|
500
|
+
**When NOT to use this pattern:**
|
|
501
|
+
- Real-time data that changes frequently
|
|
502
|
+
- Personalized content that differs per user
|
|
503
|
+
- Content with strict compliance requirements (may need audit trail)
|
|
504
|
+
|
|
505
|
+
**When to definitely use this pattern:**
|
|
506
|
+
- AI-generated summaries, outlines, analyses
|
|
507
|
+
- Expensive API calls ($0.01+ per request)
|
|
508
|
+
- Content users expect to persist
|
|
509
|
+
- High read-to-write ratio (read 10x+ more than generate)
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
**Commits implementing this pattern:**
|
|
514
|
+
- `9eddb68` - Persistent database caching for chapter outlines
|
|
515
|
+
- `1d25867` - Database caching for bird's eye view
|
|
516
|
+
- `7b4dbcd` - Configurable AI provider selection
|
|
517
|
+
|
|
518
|
+
**Project:** Ministry LLM - AI-Powered Bible Study Platform
|
|
519
|
+
**Date:** February 9, 2026
|
|
520
|
+
**Impact:** 83% cost reduction, 35x faster load times
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Conditional SQL Migration Pattern - Idempotent Database Migrations
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Running migrations multiple times causes errors or duplicates. Need migrations that can run safely whether or not the changes already exist.
|
|
6
|
+
|
|
7
|
+
### Error Messages
|
|
8
|
+
```
|
|
9
|
+
ERROR: relation "table_name" already exists
|
|
10
|
+
ERROR: column "column_name" of relation "table_name" already exists
|
|
11
|
+
ERROR: duplicate key value violates unique constraint
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The Solution
|
|
17
|
+
|
|
18
|
+
### Pattern 1: CREATE TABLE IF NOT EXISTS
|
|
19
|
+
|
|
20
|
+
```sql
|
|
21
|
+
CREATE TABLE IF NOT EXISTS time_slots (
|
|
22
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
23
|
+
code VARCHAR(50) UNIQUE NOT NULL,
|
|
24
|
+
display_name VARCHAR(100) NOT NULL,
|
|
25
|
+
is_active BOOLEAN DEFAULT TRUE,
|
|
26
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
27
|
+
);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Pattern 2: ADD COLUMN IF NOT EXISTS
|
|
31
|
+
|
|
32
|
+
```sql
|
|
33
|
+
ALTER TABLE time_slots
|
|
34
|
+
ADD COLUMN IF NOT EXISTS default_duration_minutes INTEGER DEFAULT 60;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Pattern 3: INSERT Only If Empty (Seed Data)
|
|
38
|
+
|
|
39
|
+
```sql
|
|
40
|
+
INSERT INTO time_slots (code, display_name, typical_time, display_order)
|
|
41
|
+
SELECT code, display_name, typical_time, display_order
|
|
42
|
+
FROM (VALUES
|
|
43
|
+
('morning', 'Morning Intimacy', '10:00 AM EST', 1),
|
|
44
|
+
('noon', 'Noon Day', '1:00 PM - 4:00 PM', 2),
|
|
45
|
+
('evening', 'Evening Incense', '7:30 PM EST', 3)
|
|
46
|
+
) AS v(code, display_name, typical_time, display_order)
|
|
47
|
+
WHERE NOT EXISTS (SELECT 1 FROM time_slots LIMIT 1);
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Pattern 4: UPSERT (Insert or Update)
|
|
51
|
+
|
|
52
|
+
```sql
|
|
53
|
+
INSERT INTO time_slots (code, display_name)
|
|
54
|
+
VALUES ('morning', 'Morning Intimacy')
|
|
55
|
+
ON CONFLICT (code) DO UPDATE SET display_name = EXCLUDED.display_name;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Pattern 5: Conditional UPDATE
|
|
59
|
+
|
|
60
|
+
```sql
|
|
61
|
+
-- Only update if value is still the default
|
|
62
|
+
UPDATE time_slots
|
|
63
|
+
SET default_duration_minutes = 90
|
|
64
|
+
WHERE code = 'morning' AND default_duration_minutes = 60;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Pattern 6: DROP IF EXISTS
|
|
68
|
+
|
|
69
|
+
```sql
|
|
70
|
+
DROP TABLE IF EXISTS old_table;
|
|
71
|
+
DROP INDEX IF EXISTS old_index;
|
|
72
|
+
ALTER TABLE my_table DROP COLUMN IF EXISTS old_column;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Complete Migration Example
|
|
78
|
+
|
|
79
|
+
```sql
|
|
80
|
+
-- Migration: 075b_seed_time_slots.sql
|
|
81
|
+
-- Idempotent: Safe to run multiple times
|
|
82
|
+
|
|
83
|
+
-- 1. Ensure table exists
|
|
84
|
+
CREATE TABLE IF NOT EXISTS time_slots (
|
|
85
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
86
|
+
code VARCHAR(50) UNIQUE NOT NULL,
|
|
87
|
+
display_name VARCHAR(100) NOT NULL,
|
|
88
|
+
display_order INTEGER DEFAULT 0,
|
|
89
|
+
is_active BOOLEAN DEFAULT TRUE
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
-- 2. Seed only if empty
|
|
93
|
+
INSERT INTO time_slots (code, display_name, display_order)
|
|
94
|
+
SELECT * FROM (VALUES
|
|
95
|
+
('morning', 'Morning', 1),
|
|
96
|
+
('evening', 'Evening', 2)
|
|
97
|
+
) AS v(code, display_name, display_order)
|
|
98
|
+
WHERE NOT EXISTS (SELECT 1 FROM time_slots LIMIT 1);
|
|
99
|
+
|
|
100
|
+
-- 3. Verify
|
|
101
|
+
SELECT COUNT(*) as count FROM time_slots;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Key Rules
|
|
107
|
+
|
|
108
|
+
1. Always use `IF NOT EXISTS` / `IF EXISTS` clauses
|
|
109
|
+
2. Use `ON CONFLICT` for upserts instead of checking first
|
|
110
|
+
3. For seed data, check if table is empty before inserting
|
|
111
|
+
4. Add comments explaining the migration purpose
|
|
112
|
+
|
|
113
|
+
## Difficulty Level
|
|
114
|
+
⭐⭐ (2/5)
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
**Author Notes:**
|
|
119
|
+
Idempotent migrations save hours of debugging. If a migration can run twice without error, deployment becomes much safer.
|