b2c-app-builder 0.221.39
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/ACKNOWLEDGMENTS.md +168 -0
- package/LICENSE +21 -0
- package/README.md +252 -0
- package/SKILL.md +59 -0
- package/THIRD_PARTY_NOTICES.md +1091 -0
- package/adapters/app-review/archive.ts +55 -0
- package/adapters/app-review/asc-boundary.ts +85 -0
- package/adapters/app-review/asc-provider.ts +499 -0
- package/adapters/app-review/auth.ts +75 -0
- package/adapters/app-review/capability.ts +240 -0
- package/adapters/app-review/classify.ts +116 -0
- package/adapters/app-review/consume.ts +108 -0
- package/adapters/app-review/envelope.ts +119 -0
- package/adapters/app-review/events.ts +451 -0
- package/adapters/app-review/hmac.ts +106 -0
- package/adapters/app-review/implement.ts +81 -0
- package/adapters/app-review/index.ts +172 -0
- package/adapters/app-review/ingest.ts +108 -0
- package/adapters/app-review/mandate.ts +102 -0
- package/adapters/app-review/normalize.ts +281 -0
- package/adapters/app-review/packet.ts +365 -0
- package/adapters/app-review/persist.ts +93 -0
- package/adapters/app-review/plan.ts +321 -0
- package/adapters/app-review/plist.ts +219 -0
- package/adapters/app-review/poll.ts +310 -0
- package/adapters/app-review/projection.ts +149 -0
- package/adapters/app-review/queue.ts +138 -0
- package/adapters/app-review/receiver.ts +111 -0
- package/adapters/app-review/registration.ts +95 -0
- package/adapters/app-review/remediate.ts +218 -0
- package/adapters/app-review/render.ts +180 -0
- package/adapters/app-review/resubmit.ts +357 -0
- package/adapters/app-review/types.ts +540 -0
- package/adapters/app-review/uncertain-execution.ts +205 -0
- package/adapters/app-review/verification.ts +42 -0
- package/adapters/appkittie-category-revenue.ts +106 -0
- package/adapters/claude.ts +69 -0
- package/adapters/codex.ts +65 -0
- package/adapters/cursor.ts +66 -0
- package/adapters/device-proof.ts +814 -0
- package/adapters/greenfield/boundary.ts +200 -0
- package/adapters/greenfield/fail-safe.ts +204 -0
- package/adapters/greenfield/index.ts +33 -0
- package/adapters/inline.ts +46 -0
- package/adapters/install-control-permissions.ts +331 -0
- package/adapters/install-entrypoints.ts +422 -0
- package/adapters/install-schedule.ts +700 -0
- package/adapters/ios-app-evidence.ts +136 -0
- package/adapters/mobile-operation-host.ts +209 -0
- package/adapters/mobile-operation.ts +131 -0
- package/adapters/operating.ts +8 -0
- package/adapters/probe.ts +48 -0
- package/adapters/profile.ts +272 -0
- package/adapters/providers/capability-delta.ts +84 -0
- package/adapters/providers/contract.ts +89 -0
- package/adapters/providers/evaluate.ts +125 -0
- package/adapters/providers/expo/argv.ts +228 -0
- package/adapters/providers/expo/decode.ts +702 -0
- package/adapters/providers/expo/discovery.ts +145 -0
- package/adapters/providers/expo/doctor.ts +217 -0
- package/adapters/providers/expo/effects.ts +185 -0
- package/adapters/providers/expo/execute.ts +389 -0
- package/adapters/providers/expo/expo-device-bind.ts +176 -0
- package/adapters/providers/expo/expo-mcp-route.ts +394 -0
- package/adapters/providers/expo/hosting-prepare.ts +195 -0
- package/adapters/providers/expo/identity.ts +117 -0
- package/adapters/providers/expo/index.ts +176 -0
- package/adapters/providers/expo/jobs.ts +490 -0
- package/adapters/providers/expo/preflight.ts +319 -0
- package/adapters/providers/expo/process.ts +156 -0
- package/adapters/providers/expo/project-config.ts +184 -0
- package/adapters/providers/expo/sanitize.ts +51 -0
- package/adapters/providers/expo/signing-readiness.ts +157 -0
- package/adapters/providers/expo/store-handoff.ts +74 -0
- package/adapters/providers/expo/update-identity.ts +121 -0
- package/adapters/providers/expo/update-policy.ts +130 -0
- package/adapters/providers/expo/update-prepare.ts +176 -0
- package/adapters/providers/expo/update-recovery.ts +152 -0
- package/adapters/providers/expo/update-rollout.ts +114 -0
- package/adapters/providers/expo/update-signing.ts +100 -0
- package/adapters/providers/expo/web-api-contract.ts +185 -0
- package/adapters/providers/growth-agent/boundary.ts +178 -0
- package/adapters/providers/growth-agent/fail-safe.ts +306 -0
- package/adapters/providers/growth-agent/index.ts +36 -0
- package/adapters/providers/layers/effects.ts +94 -0
- package/adapters/providers/layers/index.ts +91 -0
- package/adapters/providers/layers/jobs.ts +269 -0
- package/adapters/providers/layers/onboarding.ts +144 -0
- package/adapters/providers/layers/route.ts +308 -0
- package/adapters/providers/layers/transport.ts +251 -0
- package/adapters/providers/load.ts +293 -0
- package/adapters/providers/mobile-ops/boundary.ts +137 -0
- package/adapters/providers/mobile-ops/fail-safe.ts +273 -0
- package/adapters/providers/mobile-ops/index.ts +27 -0
- package/adapters/providers/monetization-validation.ts +80 -0
- package/adapters/providers/revenuecat/cli-catalog-observe.ts +254 -0
- package/adapters/providers/revenuecat/cli-catalog.ts +1146 -0
- package/adapters/providers/revenuecat/cli-command-schema.ts +369 -0
- package/adapters/providers/revenuecat/cli-decode.ts +908 -0
- package/adapters/providers/revenuecat/cli-discovery.ts +248 -0
- package/adapters/providers/revenuecat/cli-doctor.ts +279 -0
- package/adapters/providers/revenuecat/cli-execute.ts +456 -0
- package/adapters/providers/revenuecat/cli-ledger.ts +488 -0
- package/adapters/providers/revenuecat/cli-operations.ts +927 -0
- package/adapters/providers/revenuecat/cli-preflight.ts +245 -0
- package/adapters/providers/revenuecat/cli-process.ts +195 -0
- package/adapters/providers/revenuecat/cli-proof.ts +159 -0
- package/adapters/providers/revenuecat/cli-reconcile-plan.ts +1144 -0
- package/adapters/providers/revenuecat/provisioning.ts +54 -0
- package/adapters/providers/revenuecat/revenue-validation.ts +1224 -0
- package/adapters/providers/runtime-pin.ts +112 -0
- package/adapters/providers/superwall/boundary.ts +107 -0
- package/adapters/providers/superwall/fail-safe.ts +231 -0
- package/adapters/providers/superwall/measurement.ts +62 -0
- package/adapters/providers/typesafe/assess.ts +264 -0
- package/adapters/providers/typesafe/binding.ts +47 -0
- package/adapters/providers/typesafe/connection.ts +89 -0
- package/adapters/providers/typesafe/decode.ts +348 -0
- package/adapters/providers/typesafe/effects.ts +101 -0
- package/adapters/providers/typesafe/encode.ts +97 -0
- package/adapters/providers/typesafe/index.ts +71 -0
- package/adapters/providers/typesafe/support.ts +109 -0
- package/adapters/providers/typesafe/transport.ts +395 -0
- package/adapters/provisioning/capability-gaps.ts +110 -0
- package/adapters/provisioning/capability-readiness.ts +60 -0
- package/adapters/provisioning/cli.ts +274 -0
- package/adapters/provisioning/requirements.ts +525 -0
- package/adapters/provisioning/resolve.ts +356 -0
- package/adapters/registry.ts +225 -0
- package/agents/skills/b2c-app-builder/references/business-lifecycle.md +75 -0
- package/agents/skills/b2c-app-builder/references/composition.md +7 -0
- package/agents/skills/b2c-app-builder/references/mobile-operation.md +5 -0
- package/agents/skills/b2c-app-builder/references/setup.md +18 -0
- package/agents/skills/b2c-define-product/SKILL.md +49 -0
- package/agents/skills/b2c-define-product/references/task.md +42 -0
- package/agents/skills/b2c-design-onboarding/SKILL.md +51 -0
- package/agents/skills/b2c-design-onboarding/references/stages.md +31 -0
- package/agents/skills/b2c-design-onboarding/references/task.md +31 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-conversion.md +43 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-01-current-state-trace.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-02-evidence-plan.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-03-current-guidance.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-04-competitor-reviews.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-05-onbo-hub-atlas.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-06-internal-guidance-audit.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-07-provider-policy-landscape.md +37 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-08-motion-research.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-09-evidence-join.md +37 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-10-first-value-activation.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-11-effort-question-audit.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-12-state-identity-contract.md +38 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-13-analytics-experiments.md +38 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-14-trust-lifecycle-policy.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-15-architecture-decision.md +35 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-16-journey-graph.md +37 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-17-screen-control-paywall-contract.md +40 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-18-visual-design-prototype.md +40 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-19-implementation-cutover-contract.md +37 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-20-adversarial-qa.md +38 -0
- package/agents/skills/b2c-design-onboarding/references/workflow.experience.onboarding-system.onb-21-compound-engineering-plan.md +35 -0
- package/agents/skills/b2c-plan-implementation/SKILL.md +66 -0
- package/agents/skills/b2c-plan-implementation/references/task.md +41 -0
- package/agents/skills/b2c-plan-launch/SKILL.md +50 -0
- package/agents/skills/b2c-plan-launch/references/task.md +37 -0
- package/agents/skills/b2c-research-opportunity/SKILL.md +63 -0
- package/agents/skills/b2c-research-opportunity/references/task.md +42 -0
- package/agents/skills/b2c-review-business-performance/SKILL.md +50 -0
- package/agents/skills/b2c-review-business-performance/references/task.md +37 -0
- package/agents/skills/b2c-review-experience/SKILL.md +48 -0
- package/agents/skills/b2c-review-experience/references/task.md +36 -0
- package/agents/skills/b2c-review-monetization/SKILL.md +50 -0
- package/agents/skills/b2c-review-monetization/references/task.md +40 -0
- package/agents/skills/b2c-verify-release-readiness/SKILL.md +47 -0
- package/agents/skills/b2c-verify-release-readiness/references/task.md +36 -0
- package/catalog/agent-graph/load.ts +110 -0
- package/catalog/agent-graph/types.ts +53 -0
- package/catalog/agent-graph/validate.ts +121 -0
- package/catalog/agent-graph/work.schema.json +65 -0
- package/catalog/agent-graph/work.yaml +173 -0
- package/catalog/areas.ts +95 -0
- package/catalog/artifacts.ts +40 -0
- package/catalog/authoring.ts +46 -0
- package/catalog/bridge.ts +220 -0
- package/catalog/business-primitives.ts +82 -0
- package/catalog/business-units.ts +18 -0
- package/catalog/capabilities/paid-generative-ai/capability.yaml +27 -0
- package/catalog/capabilities/paid-generative-ai/controls.md +37 -0
- package/catalog/capabilities/types.ts +25 -0
- package/catalog/capabilities/web-presence/capability.yaml +37 -0
- package/catalog/capabilities/web-presence/shared.md +5 -0
- package/catalog/context-packs.ts +78 -0
- package/catalog/domain-authority.ts +38 -0
- package/catalog/domains.ts +178 -0
- package/catalog/firstparty-declarations.ts +652 -0
- package/catalog/firstparty-recipes.ts +283 -0
- package/catalog/gates.ts +99 -0
- package/catalog/generated/catalog.json +18892 -0
- package/catalog/generated/contracts.md +1565 -0
- package/catalog/generated/firstparty/catalog/render-routing.ts +410 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/amir-brand-system.txt +395 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/amir-cinematic-scroll.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/appllama-skills.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/eronred-aso-skills.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/evanbacon-serve-sim.txt +202 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/parth-app-store-screenshots.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/posthog-wizard.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/revenuecat-ai-toolkit.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/revenuecat-cli.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/rork-app-store-connect-cli-skills.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/rork-app-store-connect-cli.txt +21 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/sentry-snapshotpreviews.txt +22 -0
- package/catalog/generated/firstparty/catalog/upstreams/notices/sentry-xcodebuildmcp.txt +21 -0
- package/catalog/generated/firstparty/catalog-pack.yaml +12960 -0
- package/catalog/generated/firstparty/checks/validation/business/data/check-analytics-catalog.ts +166 -0
- package/catalog/generated/firstparty/checks/validation/business/data/check-attribution-contract.ts +731 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-audience-identity.ts +260 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-browser-runtime-proof.ts +269 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-component-contracts.ts +365 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-content-assets.ts +600 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-design-acceptance.ts +6 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-design-md.ts +19 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-design-room-contract.ts +200 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-design-worthiness.ts +710 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-motion-contract.ts +1374 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-scrollytelling-contract.ts +1486 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-token-promotion.ts +75 -0
- package/catalog/generated/firstparty/checks/validation/business/design/check-vibecoded-tells.ts +396 -0
- package/catalog/generated/firstparty/checks/validation/business/design/validate-state.ts +15 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-archetype-starter.ts +457 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-backend-data-contract.ts +151 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-compound-engineering-routing.ts +153 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-mobai-proof.ts +486 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-native-android-proof.ts +486 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-native-ios-proof.ts +465 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-readiness-coverage.ts +242 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-roster-headless-safety.ts +70 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-roster-overlap.ts +159 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-source-checkpoint.ts +123 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-technical-docs-ste100.ts +319 -0
- package/catalog/generated/firstparty/checks/validation/business/engineering/check-template-safety.ts +75 -0
- package/catalog/generated/firstparty/checks/validation/business/experience/check-emotional-design.ts +1246 -0
- package/catalog/generated/firstparty/checks/validation/business/experience/check-onboarding-cutover-repository.ts +157 -0
- package/catalog/generated/firstparty/checks/validation/business/experience/check-onboarding-evidence-packet.ts +263 -0
- package/catalog/generated/firstparty/checks/validation/business/experience/check-onboarding-foundations.ts +16 -0
- package/catalog/generated/firstparty/checks/validation/business/experience/check-onboarding-graph.ts +795 -0
- package/catalog/generated/firstparty/checks/validation/business/growth/check-landing-funnel.ts +593 -0
- package/catalog/generated/firstparty/checks/validation/business/growth/check-paid-user-acquisition.ts +601 -0
- package/catalog/generated/firstparty/checks/validation/business/money/check-price-derivation.ts +127 -0
- package/catalog/generated/firstparty/checks/validation/business/money/check-revenue.ts +72 -0
- package/catalog/generated/firstparty/checks/validation/business/operations/check-agent-operations.ts +709 -0
- package/catalog/generated/firstparty/checks/validation/business/operations/check-email.ts +356 -0
- package/catalog/generated/firstparty/checks/validation/business/operations/check-founder-operator-bootstrap.ts +759 -0
- package/catalog/generated/firstparty/checks/validation/business/operations/check-paid-tool-intake.ts +71 -0
- package/catalog/generated/firstparty/checks/validation/business/operations/check-portfolio-registry.ts +99 -0
- package/catalog/generated/firstparty/checks/validation/business/operations/check-post-launch-ops.ts +834 -0
- package/catalog/generated/firstparty/checks/validation/business/orchestration/check-continuity-contract.ts +266 -0
- package/catalog/generated/firstparty/checks/validation/business/orchestration/check-parallel-orchestration.ts +218 -0
- package/catalog/generated/firstparty/checks/validation/business/orchestration/validate-project-state.ts +357 -0
- package/catalog/generated/firstparty/checks/validation/business/process/check-artifact-templates.ts +103 -0
- package/catalog/generated/firstparty/checks/validation/business/process/check-change-cascade.ts +318 -0
- package/catalog/generated/firstparty/checks/validation/business/process/check-generated-pages.ts +153 -0
- package/catalog/generated/firstparty/checks/validation/business/process/check-lane-coverage.ts +377 -0
- package/catalog/generated/firstparty/checks/validation/business/process/check-live-provider-proof.ts +284 -0
- package/catalog/generated/firstparty/checks/validation/business/process/check-repository-profile.ts +43 -0
- package/catalog/generated/firstparty/checks/validation/business/product/check-app-archetype.ts +266 -0
- package/catalog/generated/firstparty/checks/validation/business/product/check-product-md.ts +67 -0
- package/catalog/generated/firstparty/checks/validation/business/research/check-evidence-schema-drift.ts +50 -0
- package/catalog/generated/firstparty/checks/validation/business/research/check-localization-research.ts +144 -0
- package/catalog/generated/firstparty/checks/validation/business/research/check-research-evidence.ts +1324 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-app-review-contract.ts +433 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-app-store-portfolio.ts +279 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-apple-app-store-requirements.ts +735 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-asc-command-contract.ts +175 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-aso-evidence.ts +162 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-store-console-packet.ts +480 -0
- package/catalog/generated/firstparty/checks/validation/business/store/check-store-screenshots.ts +1113 -0
- package/catalog/generated/firstparty/checks/validation/business/trust/check-ai-provider-controls.ts +127 -0
- package/catalog/generated/firstparty/checks/validation/business/trust/check-privacy-terms.ts +238 -0
- package/catalog/generated/firstparty/checks/validation/business/trust/check-secret-routing.ts +233 -0
- package/catalog/generated/firstparty/checks/validation/business/trust/check-security-release.ts +199 -0
- package/catalog/generated/firstparty/checks/validation/business/words/check-app-copy.ts +1019 -0
- package/catalog/generated/firstparty/checks/validation/business/words/check-founder-copy.ts +471 -0
- package/catalog/generated/firstparty/checks/validation/business/words/check-no-slop.ts +148 -0
- package/catalog/generated/firstparty/checks/validation/repository/audit-skill-links.ts +176 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-agent-entrypoints.ts +259 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-architecture.ts +393 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-autopilot-contract.ts +277 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-capability-delta.ts +30 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-catalog.ts +88 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-engine-e2e.ts +609 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-gates-layout.ts +109 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-graph-foundations.ts +158 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-hub-spoke.ts +144 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-learning-grounding.ts +323 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-operating-graph.ts +205 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-pack-composition.ts +94 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-package-parity.ts +632 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-provider-contracts.ts +24 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-reference-size.ts +354 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-repository-boundary.ts +2385 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-skill-supply-chain.ts +290 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-skill-version.ts +363 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-source-freshness.ts +627 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-task-skills.ts +40 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-upstreams.ts +189 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-validator-docs.ts +84 -0
- package/catalog/generated/firstparty/checks/validation/repository/check-version-discipline.ts +314 -0
- package/catalog/generated/firstparty/checks/validation/repository/run-agent-evals.ts +117 -0
- package/catalog/generated/firstparty/checks/validation/repository/run-behavioral-evals.ts +612 -0
- package/catalog/generated/firstparty/checks/validation/repository/run-launchbench.ts +246 -0
- package/catalog/generated/firstparty/checks/validation/repository/run-validator-fixtures.ts +173 -0
- package/catalog/generated/firstparty/examples/workspace/business/analytics/ANALYTICS.md +186 -0
- package/catalog/generated/firstparty/examples/workspace/business/analytics/analytics-plan.html +14 -0
- package/catalog/generated/firstparty/examples/workspace/business/design/motion-catalog/README.md +74 -0
- package/catalog/generated/firstparty/examples/workspace/business/design/system/PremiumCraft.swift +352 -0
- package/catalog/generated/firstparty/examples/workspace/business/growth/LAUNCH_NARRATIVE.md +241 -0
- package/catalog/generated/firstparty/examples/workspace/business/growth/PAID_UA.md +142 -0
- package/catalog/generated/firstparty/examples/workspace/business/growth/VIRAL_GROWTH.md +130 -0
- package/catalog/generated/firstparty/examples/workspace/business/growth/content-assets/CONTENT_ASSETS.md +127 -0
- package/catalog/generated/firstparty/examples/workspace/business/growth/landing/scrollytelling.portable.example.html +156 -0
- package/catalog/generated/firstparty/examples/workspace/business/product/copy/COPY_BRIEF.md +64 -0
- package/catalog/generated/firstparty/examples/workspace/business/product/copy/COPY_DECK.md +84 -0
- package/catalog/generated/firstparty/examples/workspace/business/product/experience/11-star-experience/11_STAR_EXPERIENCE.md +93 -0
- package/catalog/generated/firstparty/examples/workspace/business/product/experience/emotional-design/EMOTIONAL_DESIGN.md +355 -0
- package/catalog/generated/firstparty/examples/workspace/business/product/experience/ux-patterns/UX_PATTERNS.md +144 -0
- package/catalog/generated/firstparty/examples/workspace/business/state/LAUNCH_TRACE.md +29 -0
- package/catalog/generated/firstparty/examples/workspace/business/store/app-store-listing/APP_STORE_LISTING.md +160 -0
- package/catalog/generated/firstparty/examples/workspace/business/store/app-store-listing/SCREENSHOT_RUBRIC.md +202 -0
- package/catalog/generated/firstparty/extension.yaml +12344 -0
- package/catalog/generated/firstparty/kernel/schema/evidence-schema-version.ts +82 -0
- package/catalog/generated/firstparty/knowledge/data/analytics-attribution.md +317 -0
- package/catalog/generated/firstparty/knowledge/data/posthog-agent-tooling.md +101 -0
- package/catalog/generated/firstparty/knowledge/design/audience-derived-identity.md +55 -0
- package/catalog/generated/firstparty/knowledge/design/consumer-craft-benchmarks.md +72 -0
- package/catalog/generated/firstparty/knowledge/design/design-acceptance.md +199 -0
- package/catalog/generated/firstparty/knowledge/design/design-evidence-stack.md +130 -0
- package/catalog/generated/firstparty/knowledge/design/design-room.md +83 -0
- package/catalog/generated/firstparty/knowledge/design/design-visual-system.md +247 -0
- package/catalog/generated/firstparty/knowledge/design/design-worthiness.md +188 -0
- package/catalog/generated/firstparty/knowledge/design/editorial-scrollytelling.md +239 -0
- package/catalog/generated/firstparty/knowledge/design/landing-motion-craft.md +67 -0
- package/catalog/generated/firstparty/knowledge/design/mobile-flow-craft.md +177 -0
- package/catalog/generated/firstparty/knowledge/design/motion-craft-benchmarks.md +340 -0
- package/catalog/generated/firstparty/knowledge/design/premium-mobile-craft.md +137 -0
- package/catalog/generated/firstparty/knowledge/design/quality-lens.md +100 -0
- package/catalog/generated/firstparty/knowledge/design/refero-ux-patterns.md +131 -0
- package/catalog/generated/firstparty/knowledge/design/remotion-content-assets.md +370 -0
- package/catalog/generated/firstparty/knowledge/design/surfaces-b2c.md +84 -0
- package/catalog/generated/firstparty/knowledge/design/vibecoded-tells.md +129 -0
- package/catalog/generated/firstparty/knowledge/engineering/accessibility-readiness.md +24 -0
- package/catalog/generated/firstparty/knowledge/engineering/app-agent-roster.md +120 -0
- package/catalog/generated/firstparty/knowledge/engineering/app-quality.md +19 -0
- package/catalog/generated/firstparty/knowledge/engineering/backend-data-contract.md +187 -0
- package/catalog/generated/firstparty/knowledge/engineering/engineering-orchestration.md +365 -0
- package/catalog/generated/firstparty/knowledge/engineering/expo-compatibility.md +74 -0
- package/catalog/generated/firstparty/knowledge/engineering/expo-operations-map.md +84 -0
- package/catalog/generated/firstparty/knowledge/engineering/expo-stack-selection.md +75 -0
- package/catalog/generated/firstparty/knowledge/engineering/external-skill-packs.md +47 -0
- package/catalog/generated/firstparty/knowledge/engineering/mobai-toolbelt.md +389 -0
- package/catalog/generated/firstparty/knowledge/engineering/recommended-agent-skills.md +109 -0
- package/catalog/generated/firstparty/knowledge/engineering/technical-documentation-ste100.md +89 -0
- package/catalog/generated/firstparty/knowledge/engineering/xcodebuildmcp-testing.md +502 -0
- package/catalog/generated/firstparty/knowledge/experience/commitment-funnel.md +90 -0
- package/catalog/generated/firstparty/knowledge/experience/consumer-product-design-agency.md +268 -0
- package/catalog/generated/firstparty/knowledge/experience/eleven-star-experience.md +194 -0
- package/catalog/generated/firstparty/knowledge/experience/emotional-design-system.md +412 -0
- package/catalog/generated/firstparty/knowledge/experience/emotional-experience-design.md +359 -0
- package/catalog/generated/firstparty/knowledge/experience/emotional-experience-measurement.md +433 -0
- package/catalog/generated/firstparty/knowledge/experience/ethics-guardrail.md +460 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/commitment-card.md +36 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/endowed-progress-card.md +34 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/fresh-start-card.md +34 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/identity-and-self-expression-card.md +35 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/intent-mirroring-card.md +36 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/mastery-and-status-card.md +43 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/peak-end-card.md +44 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/perceived-effort-delay-card.md +37 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/reciprocity-card.md +38 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/recovery-and-trust-repair-card.md +40 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/streak-and-loss-aversion-card.md +37 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards/variable-reward-card.md +42 -0
- package/catalog/generated/firstparty/knowledge/experience/experience-cards.md +172 -0
- package/catalog/generated/firstparty/knowledge/experience/onboarding-conversion.md +422 -0
- package/catalog/generated/firstparty/knowledge/experience/onboarding-foundations.md +264 -0
- package/catalog/generated/firstparty/knowledge/experience/paywall-goal-headline.md +99 -0
- package/catalog/generated/firstparty/knowledge/experience/push-notification-lifecycle.md +79 -0
- package/catalog/generated/firstparty/knowledge/growth/appsflyer-mmp.md +99 -0
- package/catalog/generated/firstparty/knowledge/growth/cro-landing.md +86 -0
- package/catalog/generated/firstparty/knowledge/growth/fastlane-growth-ops.md +321 -0
- package/catalog/generated/firstparty/knowledge/growth/geo-seo.md +163 -0
- package/catalog/generated/firstparty/knowledge/growth/hdyhau-blended-roas.md +75 -0
- package/catalog/generated/firstparty/knowledge/growth/influencer-sponsorship-engine.md +224 -0
- package/catalog/generated/firstparty/knowledge/growth/ios-consumer-playbook-intake.md +65 -0
- package/catalog/generated/firstparty/knowledge/growth/launch-narrative-cadence.md +340 -0
- package/catalog/generated/firstparty/knowledge/growth/non-competitor-angle-discovery.md +80 -0
- package/catalog/generated/firstparty/knowledge/growth/paid-user-acquisition.md +283 -0
- package/catalog/generated/firstparty/knowledge/growth/ugc-creator-engine.md +259 -0
- package/catalog/generated/firstparty/knowledge/growth/viral-growth-loops.md +174 -0
- package/catalog/generated/firstparty/knowledge/money/billing-health-and-reactivation.md +54 -0
- package/catalog/generated/firstparty/knowledge/money/offer-and-pricing-decisions.md +33 -0
- package/catalog/generated/firstparty/knowledge/money/paywall-pricing-and-experiments.md +97 -0
- package/catalog/generated/firstparty/knowledge/money/revenue-monetization.md +107 -0
- package/catalog/generated/firstparty/knowledge/money/revenuecat-agent-tooling.md +174 -0
- package/catalog/generated/firstparty/knowledge/money/revenuecat-and-store-products.md +115 -0
- package/catalog/generated/firstparty/knowledge/money/stripe-and-web-billing.md +83 -0
- package/catalog/generated/firstparty/knowledge/money/subscription-price-derivation.md +105 -0
- package/catalog/generated/firstparty/knowledge/operations/autonomy-onboarding.md +269 -0
- package/catalog/generated/firstparty/knowledge/operations/doppler-organization.md +73 -0
- package/catalog/generated/firstparty/knowledge/operations/founder-zero-operator.md +184 -0
- package/catalog/generated/firstparty/knowledge/operations/frontier-agent-operations.md +189 -0
- package/catalog/generated/firstparty/knowledge/operations/paid-tool-routing.md +172 -0
- package/catalog/generated/firstparty/knowledge/operations/post-launch-operations.md +261 -0
- package/catalog/generated/firstparty/knowledge/operations/provider-state-recipes.md +80 -0
- package/catalog/generated/firstparty/knowledge/operations/resend-email-ops.md +339 -0
- package/catalog/generated/firstparty/knowledge/operations/secrets-management.md +215 -0
- package/catalog/generated/firstparty/knowledge/orchestration/compound-engineering-routing.md +101 -0
- package/catalog/generated/firstparty/knowledge/orchestration/dynamic-workflows.md +198 -0
- package/catalog/generated/firstparty/knowledge/orchestration/full-launch-program.md +179 -0
- package/catalog/generated/firstparty/knowledge/orchestration/isolated-review.md +144 -0
- package/catalog/generated/firstparty/knowledge/orchestration/parallel-agent-orchestration.md +335 -0
- package/catalog/generated/firstparty/knowledge/orchestration/project-state.md +96 -0
- package/catalog/generated/firstparty/knowledge/process/artifact-contracts.md +1527 -0
- package/catalog/generated/firstparty/knowledge/process/cascade-edges.yaml +217 -0
- package/catalog/generated/firstparty/knowledge/process/change-cascade.md +102 -0
- package/catalog/generated/firstparty/knowledge/process/current-truth.md +45 -0
- package/catalog/generated/firstparty/knowledge/process/failure-cards.md +114 -0
- package/catalog/generated/firstparty/knowledge/process/flow-traceability.md +189 -0
- package/catalog/generated/firstparty/knowledge/process/launch-coverage.md +298 -0
- package/catalog/generated/firstparty/knowledge/process/launch-phases.md +838 -0
- package/catalog/generated/firstparty/knowledge/process/learning-capture.md +77 -0
- package/catalog/generated/firstparty/knowledge/process/learnings/audit-runs-from-repo-root.md +22 -0
- package/catalog/generated/firstparty/knowledge/process/provider-contracts.md +49 -0
- package/catalog/generated/firstparty/knowledge/process/provider-proof.md +37 -0
- package/catalog/generated/firstparty/knowledge/process/repository-profiles.md +60 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/device-capture-and-proof.md +100 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/engineering-and-agent-orchestration.md +89 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/funnel-domain-and-privacy.md +142 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/growth-and-store-routing.md +192 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/research-intelligence.md +258 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/revenue-email-analytics.md +101 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/secrets-and-environment.md +35 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes/visual-and-motion-production.md +457 -0
- package/catalog/generated/firstparty/knowledge/process/tool-recipes.md +67 -0
- package/catalog/generated/firstparty/knowledge/product/ai-chat-companion.md +96 -0
- package/catalog/generated/firstparty/knowledge/product/core-loop-and-complete-scope.md +82 -0
- package/catalog/generated/firstparty/knowledge/product/core-loop-and-v1-scope.md +137 -0
- package/catalog/generated/firstparty/knowledge/product/habit-tracker.md +89 -0
- package/catalog/generated/firstparty/knowledge/product/photo-ai-media.md +96 -0
- package/catalog/generated/firstparty/knowledge/product/product-moat.md +64 -0
- package/catalog/generated/firstparty/knowledge/product/social-network.md +117 -0
- package/catalog/generated/firstparty/knowledge/research/distribution-first-niche.md +70 -0
- package/catalog/generated/firstparty/knowledge/research/distribution-offer-signal.md +190 -0
- package/catalog/generated/firstparty/knowledge/research/go-pivot-or-kill.md +120 -0
- package/catalog/generated/firstparty/knowledge/research/localization-market-research.md +145 -0
- package/catalog/generated/firstparty/knowledge/research/transformation-demo.md +70 -0
- package/catalog/generated/firstparty/knowledge/store/age-rating-questionnaire.md +75 -0
- package/catalog/generated/firstparty/knowledge/store/app-review-observe.md +314 -0
- package/catalog/generated/firstparty/knowledge/store/app-review-remediate.md +125 -0
- package/catalog/generated/firstparty/knowledge/store/app-review-resubmit.md +128 -0
- package/catalog/generated/firstparty/knowledge/store/app-store-connect-cli.md +347 -0
- package/catalog/generated/firstparty/knowledge/store/app-store-listing-prep.md +277 -0
- package/catalog/generated/firstparty/knowledge/store/apple-signing-release.md +551 -0
- package/catalog/generated/firstparty/knowledge/store/aso-apple-keyword-evidence.md +112 -0
- package/catalog/generated/firstparty/knowledge/store/aso-store-ops.md +316 -0
- package/catalog/generated/firstparty/knowledge/store/google-play-release.md +200 -0
- package/catalog/generated/firstparty/knowledge/store/marketplace-regional-compliance.md +21 -0
- package/catalog/generated/firstparty/knowledge/store/screenshot-toolchain.md +130 -0
- package/catalog/generated/firstparty/knowledge/store/store-console-workflow.md +760 -0
- package/catalog/generated/firstparty/knowledge/trust/community-safety.md +18 -0
- package/catalog/generated/firstparty/knowledge/trust/generative-ai-safety.md +27 -0
- package/catalog/generated/firstparty/knowledge/trust/paid-generative-ai-controls.md +85 -0
- package/catalog/generated/firstparty/knowledge/trust/privacy-terms.md +192 -0
- package/catalog/generated/firstparty/knowledge/trust/security-release-hardening.md +169 -0
- package/catalog/generated/firstparty/knowledge/words/consumer-copy-benchmarks.md +111 -0
- package/catalog/generated/firstparty/knowledge/words/conversion-copy.md +181 -0
- package/catalog/generated/firstparty/knowledge/words/no-slop-writing.md +173 -0
- package/catalog/generated/firstparty/package.json +290 -0
- package/catalog/generated/firstparty/schemas/mobile-evidence.json +177 -0
- package/catalog/generated/firstparty/schemas/mobile-input.json +191 -0
- package/catalog/generated/firstparty/schemas/mobile-output.json +228 -0
- package/catalog/generated/firstparty/schemas/monetization-unavailable.json +4 -0
- package/catalog/generated/firstparty/schemas/worker-evidence.json +21 -0
- package/catalog/generated/firstparty/schemas/worker-input.json +29 -0
- package/catalog/generated/firstparty/schemas/worker-output.json +41 -0
- package/catalog/generated/firstparty/snapshot.json +16229 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/README.md +41 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/00-positioning-strategy.md +45 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/01-database-schema.md +44 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/02-auth-system.md +38 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/03-chat-core-loop.md +42 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/04-model-integration.md +45 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/05-memory-personalization.md +38 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/06-usage-limits-metering.md +36 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/07-stripe-monetization.md +34 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/08-safety-and-moderation.md +39 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/variants/companion-character.md +40 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/prompts/variants/voice-first.md +37 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/.env.example +18 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/.github/workflows/ci.yml +30 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/.gitignore.template +9 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/README.md +48 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/api/chat/route.ts +70 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/api/stripe/checkout/route.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/api/stripe/webhook/route.ts +34 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/auth/confirm/route.ts +22 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/chat/page.tsx +78 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/layout.tsx +20 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/login/page.tsx +47 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/app/page.tsx +17 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/components/analytics-provider.tsx +14 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/analytics/events.ts +32 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/analytics/posthog-client.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/billing/revenuecat.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/billing/stripe.ts +15 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/strings.ts +32 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/supabase/client.ts +7 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/supabase/proxy.ts +29 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/lib/supabase/server.ts +23 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/next.config.ts +5 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/package-lock.json +1294 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/package.json +29 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/proxy.ts +12 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/supabase/migrations/0001_init.sql +78 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/supabase/tests/0001_rls.test.sql +75 -0
- package/catalog/generated/firstparty/surfaces/starters/ai-chat-companion/starter/tsconfig.json +41 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/README.md +43 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/00-positioning-strategy.md +47 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/01-database-schema.md +54 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/02-auth-system.md +42 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/03-habit-core-loop.md +50 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/04-reminders-and-streaks.md +58 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/05-stats-and-insights.md +44 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/06-paywall-and-monetization.md +50 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/07-social-accountability.md +49 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/variants/simple-counter-utility.md +43 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/prompts/variants/wellness-coach.md +44 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/.env.example +14 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/.github/workflows/ci.yml +30 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/.gitignore.template +9 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/README.md +48 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/api/stripe/checkout/route.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/api/stripe/webhook/route.ts +34 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/auth/confirm/route.ts +22 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/layout.tsx +20 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/login/page.tsx +47 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/page.tsx +17 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/app/today/page.tsx +27 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/components/analytics-provider.tsx +14 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/analytics/events.ts +29 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/analytics/posthog-client.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/billing/revenuecat.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/billing/stripe.ts +15 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/strings.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/supabase/client.ts +7 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/supabase/proxy.ts +29 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/lib/supabase/server.ts +23 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/next.config.ts +5 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/package-lock.json +1222 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/package.json +28 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/proxy.ts +12 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/supabase/migrations/0001_init.sql +84 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/supabase/tests/0001_rls.test.sql +75 -0
- package/catalog/generated/firstparty/surfaces/starters/habit-tracker/starter/tsconfig.json +41 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/README.md +40 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/00-positioning-strategy.md +51 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/01-database-schema.md +55 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/02-auth-system.md +39 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/03-capture-and-library.md +42 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/04-ai-generation-pipeline.md +46 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/05-editing-and-presets.md +40 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/06-credits-and-monetization.md +47 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/07-sharing-and-virality.md +39 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/08-content-safety-and-rights.md +49 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/variants/avatar-headshot-studio.md +43 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/prompts/variants/photo-restoration.md +39 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/.env.example +16 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/.github/workflows/ci.yml +30 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/.gitignore.template +9 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/README.md +50 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/api/generate/route.ts +47 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/api/stripe/checkout/route.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/api/stripe/webhook/route.ts +34 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/auth/confirm/route.ts +22 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/layout.tsx +20 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/library/page.tsx +29 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/login/page.tsx +47 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/app/page.tsx +17 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/components/analytics-provider.tsx +14 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/analytics/events.ts +32 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/analytics/posthog-client.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/billing/revenuecat.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/billing/stripe.ts +15 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/strings.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/supabase/client.ts +7 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/supabase/proxy.ts +29 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/lib/supabase/server.ts +23 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/next.config.ts +5 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/package-lock.json +1222 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/package.json +28 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/proxy.ts +12 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/supabase/migrations/0001_init.sql +74 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/supabase/tests/0001_rls.test.sql +72 -0
- package/catalog/generated/firstparty/surfaces/starters/photo-ai-media/starter/tsconfig.json +41 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/README.md +41 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/00-niche-strategy.md +44 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/01-database-schema.md +37 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/02-auth-system.md +40 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/03-feed-and-posts.md +43 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/04-profiles-and-follow.md +41 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/05-search-and-discovery.md +36 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/06-direct-messages.md +32 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/07-stripe-monetization.md +41 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/08-invite-system.md +37 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/variants/image-first-instagram.md +34 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/prompts/variants/video-first-tiktok.md +40 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/.env.example +14 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/.github/workflows/ci.yml +30 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/.gitignore.template +9 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/README.md +47 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/api/stripe/checkout/route.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/api/stripe/webhook/route.ts +34 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/auth/confirm/route.ts +22 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/feed/page.tsx +30 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/layout.tsx +20 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/login/page.tsx +47 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/app/page.tsx +17 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/components/analytics-provider.tsx +14 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/analytics/events.ts +31 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/analytics/posthog-client.ts +28 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/billing/revenuecat.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/billing/stripe.ts +15 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/strings.ts +27 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/supabase/client.ts +7 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/supabase/proxy.ts +29 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/lib/supabase/server.ts +23 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/next.config.ts +5 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/package-lock.json +1222 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/package.json +28 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/proxy.ts +12 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/supabase/migrations/0001_init.sql +81 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/supabase/tests/0001_rls.test.sql +70 -0
- package/catalog/generated/firstparty/surfaces/starters/social-network/starter/tsconfig.json +41 -0
- package/catalog/generated/firstparty/surfaces/ui-library/components/feedback.empty-state.md +22 -0
- package/catalog/generated/firstparty/surfaces/ui-library/components/feedback.haptics.md +21 -0
- package/catalog/generated/firstparty/surfaces/ui-library/components/feedback.skeleton.md +21 -0
- package/catalog/generated/firstparty/surfaces/ui-library/components/input.keyboard-behavior.md +22 -0
- package/catalog/generated/firstparty/surfaces/ui-library/components/interaction.press-feedback.md +22 -0
- package/catalog/generated/firstparty/tooling/catalog-scaffold.ts +181 -0
- package/catalog/generated/firstparty/tooling/render-artifact-pages.ts +93 -0
- package/catalog/generated/firstparty/tooling/render-credits.ts +301 -0
- package/catalog/generated/firstparty/tooling/render-design-room.ts +518 -0
- package/catalog/generated/firstparty/tooling/render-hosted-bundle.ts +201 -0
- package/catalog/generated/firstparty/tooling/render-product.ts +103 -0
- package/catalog/generated/firstparty/tooling/render-public-api.ts +91 -0
- package/catalog/generated/firstparty/tooling/render-task-skills.ts +69 -0
- package/catalog/generated/firstparty-pin.json +4 -0
- package/catalog/generated/hosted-knowledge.json +1 -0
- package/catalog/generated/knowledge-freshness.json +5 -0
- package/catalog/generated/packs.json +50 -0
- package/catalog/generated/repository-profiles.md +15 -0
- package/catalog/generated/routing.md +256 -0
- package/catalog/generated/spine.md +58 -0
- package/catalog/ids.ts +27 -0
- package/catalog/index.ts +40 -0
- package/catalog/knowledge/data/data-analytics-attribution.yaml +177 -0
- package/catalog/knowledge/data/data-posthog-agent-tooling.yaml +70 -0
- package/catalog/knowledge/design/design-audience-derived-identity.yaml +119 -0
- package/catalog/knowledge/design/design-consumer-craft-benchmarks.yaml +129 -0
- package/catalog/knowledge/design/design-design-acceptance.yaml +21 -0
- package/catalog/knowledge/design/design-design-evidence-stack.yaml +86 -0
- package/catalog/knowledge/design/design-design-room.yaml +18 -0
- package/catalog/knowledge/design/design-design-visual-system.yaml +215 -0
- package/catalog/knowledge/design/design-design-worthiness.yaml +40 -0
- package/catalog/knowledge/design/design-editorial-scrollytelling.yaml +56 -0
- package/catalog/knowledge/design/design-landing-motion-craft.yaml +34 -0
- package/catalog/knowledge/design/design-mobile-flow-craft.yaml +93 -0
- package/catalog/knowledge/design/design-motion-craft-benchmarks.yaml +84 -0
- package/catalog/knowledge/design/design-premium-mobile-craft.yaml +51 -0
- package/catalog/knowledge/design/design-quality-lens.yaml +29 -0
- package/catalog/knowledge/design/design-refero-ux-patterns.yaml +69 -0
- package/catalog/knowledge/design/design-remotion-content-assets.yaml +81 -0
- package/catalog/knowledge/design/design-surfaces-b2c.yaml +56 -0
- package/catalog/knowledge/design/design-vibecoded-tells.yaml +39 -0
- package/catalog/knowledge/engineering/engineering-accessibility-readiness.yaml +28 -0
- package/catalog/knowledge/engineering/engineering-app-agent-roster.yaml +14 -0
- package/catalog/knowledge/engineering/engineering-app-quality.yaml +20 -0
- package/catalog/knowledge/engineering/engineering-backend-data-contract.yaml +15 -0
- package/catalog/knowledge/engineering/engineering-engineering-orchestration.yaml +79 -0
- package/catalog/knowledge/engineering/engineering-expo-compatibility.yaml +44 -0
- package/catalog/knowledge/engineering/engineering-expo-operations-map.yaml +61 -0
- package/catalog/knowledge/engineering/engineering-expo-stack-selection.yaml +46 -0
- package/catalog/knowledge/engineering/engineering-external-skill-packs.yaml +112 -0
- package/catalog/knowledge/engineering/engineering-mobai-toolbelt.yaml +134 -0
- package/catalog/knowledge/engineering/engineering-recommended-agent-skills.yaml +66 -0
- package/catalog/knowledge/engineering/engineering-technical-documentation-ste100.yaml +16 -0
- package/catalog/knowledge/engineering/engineering-xcodebuildmcp-testing.yaml +344 -0
- package/catalog/knowledge/experience/experience-cards-commitment-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-endowed-progress-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-fresh-start-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-identity-and-self-expression-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-intent-mirroring-card.yaml +13 -0
- package/catalog/knowledge/experience/experience-cards-mastery-and-status-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-peak-end-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-perceived-effort-delay-card.yaml +13 -0
- package/catalog/knowledge/experience/experience-cards-reciprocity-card.yaml +13 -0
- package/catalog/knowledge/experience/experience-cards-recovery-and-trust-repair-card.yaml +13 -0
- package/catalog/knowledge/experience/experience-cards-streak-and-loss-aversion-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards-variable-reward-card.yaml +14 -0
- package/catalog/knowledge/experience/experience-cards.yaml +26 -0
- package/catalog/knowledge/experience/experience-commitment-funnel.yaml +22 -0
- package/catalog/knowledge/experience/experience-consumer-product-design-agency.yaml +14 -0
- package/catalog/knowledge/experience/experience-eleven-star-experience.yaml +26 -0
- package/catalog/knowledge/experience/experience-emotional-design-system.yaml +27 -0
- package/catalog/knowledge/experience/experience-emotional-experience-design.yaml +15 -0
- package/catalog/knowledge/experience/experience-emotional-experience-measurement.yaml +15 -0
- package/catalog/knowledge/experience/experience-ethics-guardrail.yaml +20 -0
- package/catalog/knowledge/experience/experience-onboarding-conversion.yaml +87 -0
- package/catalog/knowledge/experience/experience-onboarding-foundations.yaml +32 -0
- package/catalog/knowledge/experience/experience-paywall-goal-headline.yaml +40 -0
- package/catalog/knowledge/experience/experience-push-notification-lifecycle.yaml +14 -0
- package/catalog/knowledge/growth/growth-appsflyer-mmp.yaml +33 -0
- package/catalog/knowledge/growth/growth-cro-landing.yaml +38 -0
- package/catalog/knowledge/growth/growth-fastlane-growth-ops.yaml +37 -0
- package/catalog/knowledge/growth/growth-geo-seo.yaml +26 -0
- package/catalog/knowledge/growth/growth-hdyhau-blended-roas.yaml +18 -0
- package/catalog/knowledge/growth/growth-influencer-sponsorship-engine.yaml +15 -0
- package/catalog/knowledge/growth/growth-ios-consumer-playbook-intake.yaml +19 -0
- package/catalog/knowledge/growth/growth-launch-narrative-cadence.yaml +77 -0
- package/catalog/knowledge/growth/growth-non-competitor-angle-discovery.yaml +18 -0
- package/catalog/knowledge/growth/growth-paid-user-acquisition.yaml +25 -0
- package/catalog/knowledge/growth/growth-ugc-creator-engine.yaml +17 -0
- package/catalog/knowledge/growth/growth-viral-growth-loops.yaml +17 -0
- package/catalog/knowledge/money/money-billing-health-and-reactivation.yaml +16 -0
- package/catalog/knowledge/money/money-offer-and-pricing-decisions.yaml +15 -0
- package/catalog/knowledge/money/money-paywall-pricing-and-experiments.yaml +27 -0
- package/catalog/knowledge/money/money-revenue-monetization.yaml +148 -0
- package/catalog/knowledge/money/money-revenuecat-agent-tooling.yaml +108 -0
- package/catalog/knowledge/money/money-revenuecat-and-store-products.yaml +16 -0
- package/catalog/knowledge/money/money-stripe-and-web-billing.yaml +15 -0
- package/catalog/knowledge/money/money-subscription-price-derivation.yaml +41 -0
- package/catalog/knowledge/operations/operations-autonomy-onboarding.yaml +16 -0
- package/catalog/knowledge/operations/operations-doppler-organization.yaml +16 -0
- package/catalog/knowledge/operations/operations-founder-zero-operator.yaml +64 -0
- package/catalog/knowledge/operations/operations-frontier-agent-operations.yaml +15 -0
- package/catalog/knowledge/operations/operations-paid-tool-routing.yaml +29 -0
- package/catalog/knowledge/operations/operations-post-launch-operations.yaml +19 -0
- package/catalog/knowledge/operations/operations-provider-state-recipes.yaml +15 -0
- package/catalog/knowledge/operations/operations-resend-email-ops.yaml +205 -0
- package/catalog/knowledge/operations/operations-secrets-management.yaml +70 -0
- package/catalog/knowledge/orchestration/orchestration-compound-engineering-routing.yaml +30 -0
- package/catalog/knowledge/orchestration/orchestration-dynamic-workflows.yaml +89 -0
- package/catalog/knowledge/orchestration/orchestration-full-launch-program.yaml +24 -0
- package/catalog/knowledge/orchestration/orchestration-isolated-review.yaml +54 -0
- package/catalog/knowledge/orchestration/orchestration-parallel-agent-orchestration.yaml +145 -0
- package/catalog/knowledge/orchestration/orchestration-project-state.yaml +25 -0
- package/catalog/knowledge/process/learning-audit-runs-from-repo-root.yaml +16 -0
- package/catalog/knowledge/process/process-artifact-contracts.yaml +33 -0
- package/catalog/knowledge/process/process-cascade-edges.yaml +15 -0
- package/catalog/knowledge/process/process-change-cascade.yaml +17 -0
- package/catalog/knowledge/process/process-current-truth.yaml +15 -0
- package/catalog/knowledge/process/process-failure-cards.yaml +34 -0
- package/catalog/knowledge/process/process-flow-traceability.yaml +18 -0
- package/catalog/knowledge/process/process-launch-coverage.yaml +18 -0
- package/catalog/knowledge/process/process-launch-phases.yaml +21 -0
- package/catalog/knowledge/process/process-learning-capture.yaml +34 -0
- package/catalog/knowledge/process/process-provider-contracts.yaml +16 -0
- package/catalog/knowledge/process/process-provider-proof.yaml +18 -0
- package/catalog/knowledge/process/process-repository-profiles.yaml +15 -0
- package/catalog/knowledge/process/process-tool-recipes-device-capture-and-proof.yaml +155 -0
- package/catalog/knowledge/process/process-tool-recipes-engineering-and-agent-orchestration.yaml +32 -0
- package/catalog/knowledge/process/process-tool-recipes-funnel-domain-and-privacy.yaml +23 -0
- package/catalog/knowledge/process/process-tool-recipes-growth-and-store-routing.yaml +57 -0
- package/catalog/knowledge/process/process-tool-recipes-research-intelligence.yaml +52 -0
- package/catalog/knowledge/process/process-tool-recipes-revenue-email-analytics.yaml +14 -0
- package/catalog/knowledge/process/process-tool-recipes-secrets-and-environment.yaml +30 -0
- package/catalog/knowledge/process/process-tool-recipes-visual-and-motion-production.yaml +15 -0
- package/catalog/knowledge/process/process-tool-recipes.yaml +16 -0
- package/catalog/knowledge/product/product-ai-chat-companion.yaml +22 -0
- package/catalog/knowledge/product/product-core-loop-and-complete-scope.yaml +18 -0
- package/catalog/knowledge/product/product-habit-tracker.yaml +14 -0
- package/catalog/knowledge/product/product-photo-ai-media.yaml +14 -0
- package/catalog/knowledge/product/product-product-moat.yaml +15 -0
- package/catalog/knowledge/product/product-social-network.yaml +14 -0
- package/catalog/knowledge/research/research-distribution-first-niche.yaml +20 -0
- package/catalog/knowledge/research/research-distribution-offer-signal.yaml +31 -0
- package/catalog/knowledge/research/research-go-pivot-or-kill.yaml +16 -0
- package/catalog/knowledge/research/research-localization-market-research.yaml +18 -0
- package/catalog/knowledge/research/research-transformation-demo.yaml +17 -0
- package/catalog/knowledge/store/store-age-rating-questionnaire.yaml +44 -0
- package/catalog/knowledge/store/store-app-review-observe.yaml +87 -0
- package/catalog/knowledge/store/store-app-review-remediate.yaml +59 -0
- package/catalog/knowledge/store/store-app-review-resubmit.yaml +42 -0
- package/catalog/knowledge/store/store-app-store-connect-cli.yaml +90 -0
- package/catalog/knowledge/store/store-app-store-listing-prep.yaml +309 -0
- package/catalog/knowledge/store/store-apple-signing-release.yaml +234 -0
- package/catalog/knowledge/store/store-aso-apple-keyword-evidence.yaml +44 -0
- package/catalog/knowledge/store/store-aso-store-ops.yaml +24 -0
- package/catalog/knowledge/store/store-google-play-release.yaml +45 -0
- package/catalog/knowledge/store/store-marketplace-regional-compliance.yaml +20 -0
- package/catalog/knowledge/store/store-screenshot-toolchain.yaml +100 -0
- package/catalog/knowledge/store/store-store-console-workflow.yaml +431 -0
- package/catalog/knowledge/trust/trust-community-safety.yaml +28 -0
- package/catalog/knowledge/trust/trust-generative-ai-safety.yaml +29 -0
- package/catalog/knowledge/trust/trust-paid-generative-ai-controls.yaml +34 -0
- package/catalog/knowledge/trust/trust-privacy-terms.yaml +26 -0
- package/catalog/knowledge/trust/trust-security-release-hardening.yaml +43 -0
- package/catalog/knowledge/words/words-consumer-copy-benchmarks.yaml +169 -0
- package/catalog/knowledge/words/words-conversion-copy.yaml +95 -0
- package/catalog/knowledge/words/words-no-slop-writing.yaml +35 -0
- package/catalog/knowledge-packages.ts +210 -0
- package/catalog/knowledge-validation.ts +168 -0
- package/catalog/lane-graph.ts +37 -0
- package/catalog/lanes.ts +61 -0
- package/catalog/ontology/design-surface-applicability.ts +447 -0
- package/catalog/ontology/instance-load.ts +96 -0
- package/catalog/ontology/instance-types.ts +66 -0
- package/catalog/ontology/instance-validate.ts +104 -0
- package/catalog/ontology/instance.schema.json +171 -0
- package/catalog/ontology/load.ts +191 -0
- package/catalog/ontology/onboarding-applicability.ts +191 -0
- package/catalog/ontology/product-workspace.ts +58 -0
- package/catalog/ontology/query.ts +64 -0
- package/catalog/ontology/render-product.ts +30 -0
- package/catalog/ontology/types.ts +116 -0
- package/catalog/ontology/validate.ts +205 -0
- package/catalog/ontology/world.schema.json +191 -0
- package/catalog/ontology/world.yaml +458 -0
- package/catalog/operators.ts +276 -0
- package/catalog/overlays.ts +28 -0
- package/catalog/packs/compose.ts +424 -0
- package/catalog/packs/consumer-app/acquisition.md +4 -0
- package/catalog/packs/consumer-app/activation.md +4 -0
- package/catalog/packs/consumer-app/pack.yaml +66 -0
- package/catalog/packs/consumer-app/referral.md +4 -0
- package/catalog/packs/consumer-app/retention.md +4 -0
- package/catalog/packs/consumer-app/revenue.md +4 -0
- package/catalog/packs/firstparty-assets.ts +62 -0
- package/catalog/packs/firstparty-notices.ts +61 -0
- package/catalog/packs/firstparty.ts +146 -0
- package/catalog/packs/food-product-contrast/conversion.md +4 -0
- package/catalog/packs/food-product-contrast/manufacturing.md +4 -0
- package/catalog/packs/food-product-contrast/pack.yaml +108 -0
- package/catalog/packs/food-product-contrast/promise.md +4 -0
- package/catalog/packs/food-product-contrast/regulatory.md +4 -0
- package/catalog/packs/food-product-contrast/retailer.md +4 -0
- package/catalog/packs/food-product-contrast/sku.md +4 -0
- package/catalog/packs/installed-firstparty.ts +17 -0
- package/catalog/packs/isolation.ts +99 -0
- package/catalog/packs/load.ts +547 -0
- package/catalog/packs/paid-generative-ai/pack.yaml +73 -0
- package/catalog/packs/snapshots.ts +115 -0
- package/catalog/packs/types.ts +71 -0
- package/catalog/packs/web-presence/pack.yaml +54 -0
- package/catalog/phases.ts +139 -0
- package/catalog/principles/guards.ts +113 -0
- package/catalog/principles/load.ts +202 -0
- package/catalog/principles/principles.yaml +796 -0
- package/catalog/principles/types.ts +87 -0
- package/catalog/principles/vocabulary.yaml +68 -0
- package/catalog/profiles.ts +47 -0
- package/catalog/providers/agent-runtime-claude.yaml +17 -0
- package/catalog/providers/apple-asc-canonical-map.ts +499 -0
- package/catalog/providers/apple-asc.yaml +30 -0
- package/catalog/providers/capability-delta.yaml +41 -0
- package/catalog/providers/conformance.ts +64 -0
- package/catalog/providers/greenfield-70-applicability-closeout-map.ts +243 -0
- package/catalog/providers/greenfield-71-handoff-closeout-map.ts +376 -0
- package/catalog/providers/greenfield-72-benchmark-closeout-map.ts +502 -0
- package/catalog/providers/greenfield-73-overhead-closeout-map.ts +318 -0
- package/catalog/providers/greenfield-75-retrieval-closeout-map.ts +328 -0
- package/catalog/providers/greenfield-76-change-impact-closeout-map.ts +336 -0
- package/catalog/providers/greenfield-delivery-audit-map.ts +382 -0
- package/catalog/providers/growth-agent-canonical-map.ts +669 -0
- package/catalog/providers/mobile-ops-canonical-map.ts +581 -0
- package/catalog/providers/revenuecat.yaml +25 -0
- package/catalog/providers/semantic-batch-map.ts +70 -0
- package/catalog/providers/semantic-eval-baselines-map.ts +897 -0
- package/catalog/providers/semantic-graph-views-map.ts +74 -0
- package/catalog/providers/semantic-plan-lower-map.ts +62 -0
- package/catalog/providers/semantic-source-projection-map.ts +96 -0
- package/catalog/providers/superwall-canonical-map.ts +379 -0
- package/catalog/providers/typesafe-qualify-map.ts +250 -0
- package/catalog/recipes/default-monetization.ts +9 -0
- package/catalog/render-routing.ts +410 -0
- package/catalog/repository-profiles/compile.ts +435 -0
- package/catalog/repository-profiles/index.ts +19 -0
- package/catalog/repository-profiles/paid-generation-applicability.ts +106 -0
- package/catalog/repository-profiles/registry.ts +83 -0
- package/catalog/repository-profiles/types.ts +98 -0
- package/catalog/repository-profiles/workspace.ts +127 -0
- package/catalog/roles.ts +435 -0
- package/catalog/stacks/expo-agent-privacy.ts +140 -0
- package/catalog/stacks/expo-agent-tools.ts +337 -0
- package/catalog/stacks/expo-capability-matrix.ts +260 -0
- package/catalog/stacks/expo-capability-protocol.ts +775 -0
- package/catalog/stacks/expo-custom-module.ts +465 -0
- package/catalog/stacks/expo-eas-commands.ts +779 -0
- package/catalog/stacks/expo-eas-hosting.ts +224 -0
- package/catalog/stacks/expo-eas-operation-matrix.ts +243 -0
- package/catalog/stacks/expo-local-boot.ts +354 -0
- package/catalog/stacks/expo-local-capabilities.ts +328 -0
- package/catalog/stacks/expo-native-ownership.ts +469 -0
- package/catalog/stacks/expo-observability.ts +142 -0
- package/catalog/stacks/expo-proof-collection.ts +286 -0
- package/catalog/stacks/expo-quality-evidence.ts +212 -0
- package/catalog/stacks/expo-revenuecat-wiring.ts +168 -0
- package/catalog/stacks/expo-router-contract.ts +399 -0
- package/catalog/stacks/expo-sdk-upgrade.ts +186 -0
- package/catalog/stacks/expo-selection.ts +736 -0
- package/catalog/stacks/expo-starter-fixture/README.md +13 -0
- package/catalog/stacks/expo-starter-fixture/app/(tabs)/_layout.tsx +11 -0
- package/catalog/stacks/expo-starter-fixture/app/(tabs)/index.tsx +1 -0
- package/catalog/stacks/expo-starter-fixture/app/(tabs)/settings.tsx +1 -0
- package/catalog/stacks/expo-starter-fixture/app/+not-found.tsx +1 -0
- package/catalog/stacks/expo-starter-fixture/app/README.md +1 -0
- package/catalog/stacks/expo-starter-fixture/app/_layout.tsx +16 -0
- package/catalog/stacks/expo-starter-fixture/app/detail/[id].tsx +7 -0
- package/catalog/stacks/expo-starter-fixture/app/modal.tsx +1 -0
- package/catalog/stacks/expo-starter-fixture/app/sign-in.tsx +1 -0
- package/catalog/stacks/expo-starter-fixture/app.json +26 -0
- package/catalog/stacks/expo-starter-fixture/babel.config.js +4 -0
- package/catalog/stacks/expo-starter-fixture/gitignore.template +14 -0
- package/catalog/stacks/expo-starter-fixture/metro.config.js +3 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/NOTICE +1 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/README.md +1 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/android/build.gradle +15 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/android/src/main/AndroidManifest.xml +1 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/android/src/main/java/app/example/b2cnativecapability/B2cNativeCapabilityModule.kt +19 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/expo-module.config.json +9 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/ios/B2cNativeCapability.podspec +22 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/ios/B2cNativeCapabilityModule.swift +16 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/package.json +15 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/capability.ts +48 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/index.ts +3 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/index.web.ts +9 -0
- package/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/invoke.ts +13 -0
- package/catalog/stacks/expo-starter-fixture/package.json +38 -0
- package/catalog/stacks/expo-starter-fixture/src/capabilities/reducers.ts +146 -0
- package/catalog/stacks/expo-starter-fixture/src/native/capability-status.tsx +37 -0
- package/catalog/stacks/expo-starter-fixture/src/native/capability-status.web.tsx +13 -0
- package/catalog/stacks/expo-starter-fixture/src/navigation/deep-link.ts +12 -0
- package/catalog/stacks/expo-starter-fixture/src/navigation/journeys.ts +115 -0
- package/catalog/stacks/expo-starter-fixture/src/navigation/route-graph.ts +45 -0
- package/catalog/stacks/expo-starter-fixture/src/notifications/handoff.ts +13 -0
- package/catalog/stacks/expo-starter-fixture/src/offline/local-cache.ts +72 -0
- package/catalog/stacks/expo-starter-fixture/src/permissions/safe-state.ts +11 -0
- package/catalog/stacks/expo-starter-fixture/src/persistence/seam.ts +28 -0
- package/catalog/stacks/expo-starter-fixture/src/screens/detail.tsx +20 -0
- package/catalog/stacks/expo-starter-fixture/src/screens/home.tsx +84 -0
- package/catalog/stacks/expo-starter-fixture/src/screens/modal.tsx +18 -0
- package/catalog/stacks/expo-starter-fixture/src/screens/not-found.tsx +18 -0
- package/catalog/stacks/expo-starter-fixture/src/screens/settings.tsx +40 -0
- package/catalog/stacks/expo-starter-fixture/src/screens/sign-in.tsx +34 -0
- package/catalog/stacks/expo-starter-fixture/src/session/local-session.ts +22 -0
- package/catalog/stacks/expo-starter-fixture/src/states/surface-state.ts +16 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/contract-binding.ts +9 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/empty-state.tsx +22 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/haptics.tsx +33 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/keyboard-behavior.tsx +18 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/press-feedback.tsx +37 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/skeleton.tsx +53 -0
- package/catalog/stacks/expo-starter-fixture/src/ui/tokens.ts +5 -0
- package/catalog/stacks/expo-starter-fixture/tsconfig.json +8 -0
- package/catalog/stacks/expo-starter.ts +400 -0
- package/catalog/stacks/expo-web-api-routes.ts +237 -0
- package/catalog/stacks/expo-web-static.ts +560 -0
- package/catalog/stacks/expo-web-surface-table.ts +228 -0
- package/catalog/task-skills.ts +369 -0
- package/catalog/taxonomy/concept-scheme.schema.json +92 -0
- package/catalog/taxonomy/concept-scheme.yaml +978 -0
- package/catalog/taxonomy/load.ts +115 -0
- package/catalog/taxonomy/types.ts +79 -0
- package/catalog/taxonomy/validate.ts +234 -0
- package/catalog/types.ts +452 -0
- package/catalog/upstreams/README.md +23 -0
- package/catalog/upstreams/amir-brand-system.yaml +78 -0
- package/catalog/upstreams/amir-cinematic-scroll.yaml +84 -0
- package/catalog/upstreams/appllama-skills.yaml +129 -0
- package/catalog/upstreams/eronred-aso-skills.yaml +107 -0
- package/catalog/upstreams/evanbacon-serve-sim.yaml +102 -0
- package/catalog/upstreams/last30days-skill.yaml +128 -0
- package/catalog/upstreams/layers-growth-mcp.yaml +128 -0
- package/catalog/upstreams/notices/amir-brand-system.txt +395 -0
- package/catalog/upstreams/notices/amir-cinematic-scroll.txt +21 -0
- package/catalog/upstreams/notices/appllama-skills.txt +21 -0
- package/catalog/upstreams/notices/eronred-aso-skills.txt +21 -0
- package/catalog/upstreams/notices/evanbacon-serve-sim.txt +202 -0
- package/catalog/upstreams/notices/last30days-skill.txt +21 -0
- package/catalog/upstreams/notices/layers-growth-mcp.txt +21 -0
- package/catalog/upstreams/notices/parth-app-store-screenshots.txt +21 -0
- package/catalog/upstreams/notices/posthog-wizard.txt +21 -0
- package/catalog/upstreams/notices/revenuecat-ai-toolkit.txt +21 -0
- package/catalog/upstreams/notices/revenuecat-cli.txt +21 -0
- package/catalog/upstreams/notices/rork-app-store-connect-cli-skills.txt +21 -0
- package/catalog/upstreams/notices/rork-app-store-connect-cli.txt +21 -0
- package/catalog/upstreams/notices/sentry-snapshotpreviews.txt +22 -0
- package/catalog/upstreams/notices/sentry-xcodebuildmcp.txt +21 -0
- package/catalog/upstreams/notices/typesafe-ai.txt +21 -0
- package/catalog/upstreams/observations/eronred-aso-skills.json +20 -0
- package/catalog/upstreams/observations/evanbacon-serve-sim.json +20 -0
- package/catalog/upstreams/observations/parth-app-store-screenshots.json +20 -0
- package/catalog/upstreams/observations/posthog-context-mill.json +28 -0
- package/catalog/upstreams/observations/posthog-wizard.json +27 -0
- package/catalog/upstreams/observations/revenuecat-ai-toolkit.json +27 -0
- package/catalog/upstreams/observations/revenuecat-cli.json +27 -0
- package/catalog/upstreams/observations/rork-app-store-connect-cli.json +78 -0
- package/catalog/upstreams/observations/sentry-snapshotpreviews.json +23 -0
- package/catalog/upstreams/observations/sentry-xcodebuildmcp.json +23 -0
- package/catalog/upstreams/observations/typesafe-ai.json +30 -0
- package/catalog/upstreams/parth-app-store-screenshots.yaml +105 -0
- package/catalog/upstreams/posthog-context-mill.yaml +62 -0
- package/catalog/upstreams/posthog-wizard.yaml +74 -0
- package/catalog/upstreams/revenuecat-ai-toolkit.yaml +98 -0
- package/catalog/upstreams/revenuecat-cli.yaml +166 -0
- package/catalog/upstreams/rork-app-store-connect-cli-skills.yaml +100 -0
- package/catalog/upstreams/rork-app-store-connect-cli.yaml +211 -0
- package/catalog/upstreams/sentry-snapshotpreviews.yaml +103 -0
- package/catalog/upstreams/sentry-xcodebuildmcp.yaml +101 -0
- package/catalog/upstreams/typesafe-ai.yaml +144 -0
- package/catalog/validate.ts +898 -0
- package/catalog/workflows/build-release.ts +735 -0
- package/catalog/workflows/growth-revenue.ts +338 -0
- package/catalog/workflows/helpers.ts +103 -0
- package/catalog/workflows/index.ts +9 -0
- package/catalog/workflows/maintenance.ts +283 -0
- package/catalog/workflows/operating-system.ts +261 -0
- package/catalog/workflows/operations-trust.ts +425 -0
- package/catalog/workflows/product-experience.ts +1263 -0
- package/checks/validation/README.md +6 -0
- package/checks/validation/business/data/check-analytics-catalog.ts +166 -0
- package/checks/validation/business/data/check-attribution-contract.ts +731 -0
- package/checks/validation/business/design/check-audience-identity.ts +260 -0
- package/checks/validation/business/design/check-browser-runtime-proof.ts +269 -0
- package/checks/validation/business/design/check-component-contracts.ts +365 -0
- package/checks/validation/business/design/check-content-assets.ts +600 -0
- package/checks/validation/business/design/check-design-acceptance.ts +6 -0
- package/checks/validation/business/design/check-design-md.ts +19 -0
- package/checks/validation/business/design/check-design-room-contract.ts +200 -0
- package/checks/validation/business/design/check-design-worthiness.ts +710 -0
- package/checks/validation/business/design/check-motion-contract.ts +1374 -0
- package/checks/validation/business/design/check-scrollytelling-contract.ts +1486 -0
- package/checks/validation/business/design/check-token-promotion.ts +75 -0
- package/checks/validation/business/design/check-vibecoded-tells.ts +396 -0
- package/checks/validation/business/design/color-contrast.ts +45 -0
- package/checks/validation/business/design/design-acceptance.ts +1861 -0
- package/checks/validation/business/design/lib/legal-navigation.ts +1766 -0
- package/checks/validation/business/design/lib/vibecode-tells.ts +112 -0
- package/checks/validation/business/design/lib/worthiness-mechanical.ts +196 -0
- package/checks/validation/business/design/runtime-reviewer-inputs.ts +59 -0
- package/checks/validation/business/design/surface-page-gates.ts +191 -0
- package/checks/validation/business/design/validate-state.ts +15 -0
- package/checks/validation/business/engineering/check-archetype-starter.ts +457 -0
- package/checks/validation/business/engineering/check-backend-data-contract.ts +151 -0
- package/checks/validation/business/engineering/check-compound-engineering-routing.ts +153 -0
- package/checks/validation/business/engineering/check-mobai-proof.ts +486 -0
- package/checks/validation/business/engineering/check-native-android-proof.ts +486 -0
- package/checks/validation/business/engineering/check-native-ios-proof.ts +465 -0
- package/checks/validation/business/engineering/check-readiness-coverage.ts +242 -0
- package/checks/validation/business/engineering/check-roster-headless-safety.ts +70 -0
- package/checks/validation/business/engineering/check-roster-overlap.ts +159 -0
- package/checks/validation/business/engineering/check-source-checkpoint.ts +123 -0
- package/checks/validation/business/engineering/check-technical-docs-ste100.ts +319 -0
- package/checks/validation/business/engineering/check-template-safety.ts +75 -0
- package/checks/validation/business/engineering/native-ios-retained-proof.ts +128 -0
- package/checks/validation/business/engineering/strict-ios-receipt.ts +387 -0
- package/checks/validation/business/experience/check-emotional-design.ts +1246 -0
- package/checks/validation/business/experience/check-onboarding-cutover-repository.ts +157 -0
- package/checks/validation/business/experience/check-onboarding-evidence-packet.ts +263 -0
- package/checks/validation/business/experience/check-onboarding-foundations.ts +16 -0
- package/checks/validation/business/experience/check-onboarding-graph.ts +795 -0
- package/checks/validation/business/experience/onboarding-foundations.ts +372 -0
- package/checks/validation/business/growth/check-landing-funnel.ts +593 -0
- package/checks/validation/business/growth/check-paid-user-acquisition.ts +601 -0
- package/checks/validation/business/money/check-price-derivation.ts +127 -0
- package/checks/validation/business/money/check-revenue.ts +72 -0
- package/checks/validation/business/money/price-evidence.ts +37 -0
- package/checks/validation/business/operations/check-agent-operations.ts +709 -0
- package/checks/validation/business/operations/check-email.ts +356 -0
- package/checks/validation/business/operations/check-founder-operator-bootstrap.ts +759 -0
- package/checks/validation/business/operations/check-metric-contracts.ts +114 -0
- package/checks/validation/business/operations/check-paid-tool-intake.ts +71 -0
- package/checks/validation/business/operations/check-portfolio-registry.ts +99 -0
- package/checks/validation/business/operations/check-post-launch-ops.ts +834 -0
- package/checks/validation/business/orchestration/check-continuity-contract.ts +266 -0
- package/checks/validation/business/orchestration/check-parallel-orchestration.ts +218 -0
- package/checks/validation/business/orchestration/validate-project-state.ts +357 -0
- package/checks/validation/business/process/check-artifact-templates.ts +103 -0
- package/checks/validation/business/process/check-change-cascade.ts +318 -0
- package/checks/validation/business/process/check-generated-pages.ts +153 -0
- package/checks/validation/business/process/check-lane-coverage.ts +377 -0
- package/checks/validation/business/process/check-live-provider-proof.ts +284 -0
- package/checks/validation/business/process/check-repository-profile.ts +43 -0
- package/checks/validation/business/product/check-app-archetype.ts +266 -0
- package/checks/validation/business/product/check-product-md.ts +67 -0
- package/checks/validation/business/research/check-evidence-schema-drift.ts +50 -0
- package/checks/validation/business/research/check-localization-research.ts +144 -0
- package/checks/validation/business/research/check-research-evidence.ts +1324 -0
- package/checks/validation/business/research/offer-evidence.ts +360 -0
- package/checks/validation/business/research/render-evidence-markdown.ts +378 -0
- package/checks/validation/business/research/research-evidence-helpers.ts +21 -0
- package/checks/validation/business/store/check-app-review-contract.ts +433 -0
- package/checks/validation/business/store/check-app-store-portfolio.ts +279 -0
- package/checks/validation/business/store/check-apple-app-store-requirements.ts +735 -0
- package/checks/validation/business/store/check-asc-command-contract.ts +175 -0
- package/checks/validation/business/store/check-aso-evidence.ts +162 -0
- package/checks/validation/business/store/check-store-console-packet.ts +480 -0
- package/checks/validation/business/store/check-store-screenshots.ts +1113 -0
- package/checks/validation/business/trust/check-ai-provider-controls.ts +127 -0
- package/checks/validation/business/trust/check-privacy-terms.ts +238 -0
- package/checks/validation/business/trust/check-secret-routing.ts +233 -0
- package/checks/validation/business/trust/check-security-release.ts +199 -0
- package/checks/validation/business/words/check-app-copy.ts +1019 -0
- package/checks/validation/business/words/check-founder-copy.ts +471 -0
- package/checks/validation/business/words/check-no-slop.ts +148 -0
- package/checks/validation/repository/README.md +31 -0
- package/checks/validation/repository/agent-guidance-contract.ts +283 -0
- package/checks/validation/repository/audit-skill-links.ts +176 -0
- package/checks/validation/repository/check-agent-entrypoints.ts +259 -0
- package/checks/validation/repository/check-architecture.ts +393 -0
- package/checks/validation/repository/check-autopilot-contract.ts +277 -0
- package/checks/validation/repository/check-capability-delta.ts +30 -0
- package/checks/validation/repository/check-catalog.ts +88 -0
- package/checks/validation/repository/check-engine-e2e.ts +609 -0
- package/checks/validation/repository/check-gates-layout.ts +109 -0
- package/checks/validation/repository/check-graph-foundations.ts +158 -0
- package/checks/validation/repository/check-hub-spoke.ts +144 -0
- package/checks/validation/repository/check-learning-grounding.ts +323 -0
- package/checks/validation/repository/check-operating-graph.ts +205 -0
- package/checks/validation/repository/check-pack-composition.ts +94 -0
- package/checks/validation/repository/check-package-parity.ts +632 -0
- package/checks/validation/repository/check-provider-boundary.ts +154 -0
- package/checks/validation/repository/check-provider-contracts.ts +24 -0
- package/checks/validation/repository/check-reference-size.ts +354 -0
- package/checks/validation/repository/check-repository-boundary.ts +2385 -0
- package/checks/validation/repository/check-skill-supply-chain.ts +290 -0
- package/checks/validation/repository/check-skill-version.ts +363 -0
- package/checks/validation/repository/check-source-freshness.ts +627 -0
- package/checks/validation/repository/check-task-skills.ts +40 -0
- package/checks/validation/repository/check-upstreams.ts +189 -0
- package/checks/validation/repository/check-validator-docs.ts +84 -0
- package/checks/validation/repository/check-version-discipline.ts +314 -0
- package/checks/validation/repository/evals/agent-behavior/ai-chat-companion-archetype-prompt-pack.yaml +21 -0
- package/checks/validation/repository/evals/agent-behavior/appllama-provider-boundary.yaml +18 -0
- package/checks/validation/repository/evals/agent-behavior/compound-engineering-core-work.yaml +16 -0
- package/checks/validation/repository/evals/agent-behavior/design-room-state-render.yaml +15 -0
- package/checks/validation/repository/evals/agent-behavior/first-run-asc-command-contract.yaml +22 -0
- package/checks/validation/repository/evals/agent-behavior/first-run-doctor-asc-winner.yaml +27 -0
- package/checks/validation/repository/evals/agent-behavior/first-run-phase0-apple-honesty.yaml +28 -0
- package/checks/validation/repository/evals/agent-behavior/first-run-portfolio-hold.yaml +29 -0
- package/checks/validation/repository/evals/agent-behavior/first-run-tool-intake-fallback.yaml +32 -0
- package/checks/validation/repository/evals/agent-behavior/founder-zero-business-operator.yaml +28 -0
- package/checks/validation/repository/evals/agent-behavior/frontier-agent-operations.yaml +25 -0
- package/checks/validation/repository/evals/agent-behavior/habit-tracker-archetype-prompt-pack.yaml +22 -0
- package/checks/validation/repository/evals/agent-behavior/last30days-research-boundary.yaml +22 -0
- package/checks/validation/repository/evals/agent-behavior/mobile-flow-craft.yaml +23 -0
- package/checks/validation/repository/evals/agent-behavior/onboarding-review-after-engaged-normal-use.yaml +21 -0
- package/checks/validation/repository/evals/agent-behavior/onboarding-system-graph-rebuild.yaml +26 -0
- package/checks/validation/repository/evals/agent-behavior/photo-ai-media-archetype-prompt-pack.yaml +26 -0
- package/checks/validation/repository/evals/agent-behavior/post-launch-ops-live-app.yaml +27 -0
- package/checks/validation/repository/evals/agent-behavior/provider-proof-before-ready.yaml +15 -0
- package/checks/validation/repository/evals/agent-behavior/session-continuity-resume.yaml +19 -0
- package/checks/validation/repository/evals/agent-behavior/social-network-archetype-prompt-pack.yaml +21 -0
- package/checks/validation/repository/evals/agent-behavior/stale-skill-upgrade.yaml +14 -0
- package/checks/validation/repository/evals/agent-behavior/task-skill-alternate-provider.yaml +17 -0
- package/checks/validation/repository/evals/agent-behavior/task-skill-focused-onboarding.yaml +17 -0
- package/checks/validation/repository/evals/agent-behavior/task-skill-managed-continuation.yaml +17 -0
- package/checks/validation/repository/evals/agent-behavior/task-skill-missing-runtime.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/age-rating-questionnaire-missing.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/agent-behavior-evals-missing.yaml +11 -0
- package/checks/validation/repository/evals/launchbench/app-archetype-pack-incomplete.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/app-preview-video-hook-missing.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/app-price-vs-iap-confusion.yaml +29 -0
- package/checks/validation/repository/evals/launchbench/app-review-accepted-webhook-not-consumed.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-review-agreements-status-blocks-poll.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-binary-old-archive.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-consume-fixture-as-truth.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/app-review-consumed-envelope-left-in-queue.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/app-review-invalid-state.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-review-live-poll-created-date.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-missing-49-capability.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-review-missing-state.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-review-pending-agreement.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-review-protected-policy.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-resubmit-cycle-cap.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-resubmit-timeout-readback.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-review-resubmit-unauthorized.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-reviewer-injection.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/app-review-unknown-state.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/app-review-unobserved-shape.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/app-review-unsigned-webhook.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/app-review-verifier-self.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/app-review-web-session-missing.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/app-review-webhook-payload-as-truth.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/app-review-webhooks-serve.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/app-store-screenshots-unvalidated.yaml +26 -0
- package/checks/validation/repository/evals/launchbench/app-strings-hardcoded-not-localization-ready.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/app-ui-copy-reads-like-spec.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/apple-requirements-thin.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/apple-signing-pre-upload-checklist.yaml +57 -0
- package/checks/validation/repository/evals/launchbench/apple-simulator-only.yaml +13 -0
- package/checks/validation/repository/evals/launchbench/archetype-starter-ignored.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/artifact-template-coverage-gap.yaml +11 -0
- package/checks/validation/repository/evals/launchbench/asc-auth-recovery-not-attempted.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/asc-auth-unverifiable-on-knowledge-surface.yaml +38 -0
- package/checks/validation/repository/evals/launchbench/asc-cli-app-create-screenshot-orchestration-missed.yaml +29 -0
- package/checks/validation/repository/evals/launchbench/asc-flag-drift-runtime.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/asc-listing-thin.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/asc-name-fallback.yaml +12 -0
- package/checks/validation/repository/evals/launchbench/asc-promoted-iap-image-duplicate.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/asc-review-information-missing.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/asc-stale-command-guidance.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/aso-discover-without-ads.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/aso-metadata-appkittie-skipped.yaml +29 -0
- package/checks/validation/repository/evals/launchbench/aso-metadata-stale-log-source.yaml +25 -0
- package/checks/validation/repository/evals/launchbench/aso-unavailable-fabricated.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/attribution-event-only.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/authenticated-browser-mutation-unapproved.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/backend-data-contract-missing.yaml +35 -0
- package/checks/validation/repository/evals/launchbench/behavioral-eval-split-misclaimed.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/broad-request-narrated-not-routed.yaml +32 -0
- package/checks/validation/repository/evals/launchbench/browser-action-state-not-reconciled.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/browser-capability-skipped.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/browser-prompt-injection-followed.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/browser-research-untraceable.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/ce-unavailable-standalone-loop-missing.yaml +33 -0
- package/checks/validation/repository/evals/launchbench/change-cascade-incomplete.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/commitment-funnel-missing.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/compound-freshness-not-checked.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/compound-routing-skipped.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/context-budget-exceeded.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/continuity-drift-between-sessions.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/copy-deck-skipped-during-build.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/copy-ip-sweep-altered-brand-vocabulary.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/design-evidence-pass-skipped.yaml +32 -0
- package/checks/validation/repository/evals/launchbench/design-lock-landing-fanout-skipped.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/design-room-freeform-proposal.yaml +25 -0
- package/checks/validation/repository/evals/launchbench/design-token-promotion-missing.yaml +11 -0
- package/checks/validation/repository/evals/launchbench/design-worthiness-contrast-fail.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/design-worthiness-taste-missing.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/distribution-first-compliments.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/doppler-config-name-and-credential-routing.yaml +29 -0
- package/checks/validation/repository/evals/launchbench/doppler-raw-token-requested.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/email-lane-deep-proof-missing.yaml +13 -0
- package/checks/validation/repository/evals/launchbench/emotional-audit-prose-without-card-mapping.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/emotional-claim-without-research-grounding.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/emotional-design-system-missing.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/evidence-bar-overengineered.yaml +34 -0
- package/checks/validation/repository/evals/launchbench/founder-gate-deferred-forever.yaml +33 -0
- package/checks/validation/repository/evals/launchbench/founder-gate-jargon-without-choice.yaml +27 -0
- package/checks/validation/repository/evals/launchbench/founder-zero-operator-skipped.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/geo-seo-landing-copy-skipped.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/graph-foundations-unenforceable-principle.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/hdyhau-survey-missing.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/higgsfield-design-brief-missing.yaml +25 -0
- package/checks/validation/repository/evals/launchbench/higgsfield-remotion-fallback-unapproved.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/higgsfield-soul-identity-retrained-duplicate.yaml +26 -0
- package/checks/validation/repository/evals/launchbench/house-style-adr-api-example.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/house-style-customer-voice.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/house-style-entrypoints.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/house-style-fixture-as-provider-ready.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/house-style-handoff.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/house-style-inspect-read-only-claim.yaml +26 -0
- package/checks/validation/repository/evals/launchbench/house-style-literal-controls.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/house-style-mixed-readme.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/house-style-packaged-ethos-path.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/house-style-partial-pr.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/house-style-readme-kitchen.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/house-style-timeout-uncertain-mutation.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/in-app-simulator-route-mishandled.yaml +26 -0
- package/checks/validation/repository/evals/launchbench/influencer-sponsorship-shortcuts.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/landing-funnel-deploy-gates.yaml +31 -0
- package/checks/validation/repository/evals/launchbench/landing-motion-progressive-enhancement-missing.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/launch-tier-overproduction.yaml +41 -0
- package/checks/validation/repository/evals/launchbench/live-effect-false-progress.yaml +28 -0
- package/checks/validation/repository/evals/launchbench/live-provider-proof-missing.yaml +12 -0
- package/checks/validation/repository/evals/launchbench/localization-malformed-seasonal-dates.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/localization-same-day-peak.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/missed-provider-deprecation-unmigrated.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/mobai-fallback-unapproved.yaml +13 -0
- package/checks/validation/repository/evals/launchbench/mobai-onboarding-chain-unverified.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/mobai-v25-proof-conflated-or-unsafe.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/monetization-cozy-default-stack-unexamined.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/motion-craft-prose-never-applied.yaml +41 -0
- package/checks/validation/repository/evals/launchbench/multi-runtime-skill-pin-drift.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/native-ios-proof-route-skipped.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/non-competitor-angle-hunt-missing.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/onboarding-event-invented-without-catalog.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/onboarding-research-auth-analytics-skipped.yaml +33 -0
- package/checks/validation/repository/evals/launchbench/operating-graph-pack-leakage.yaml +24 -0
- package/checks/validation/repository/evals/launchbench/operator-stops-after-access-instructions.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/orchestration-preflight-missing.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/pack-composition-weakens-base.yaml +24 -0
- package/checks/validation/repository/evals/launchbench/paid-ai-anonymous-generation.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/paid-ai-controls-file-missing.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/paid-ai-kill-switch-disables-free.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/paid-ai-not-applicable-with-product-evidence.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/paid-ai-pack-omitted-while-spend-active.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/paid-ua-pending-mmp-waiver.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/paid-ua-spend-discipline-missing.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/paid-ua-spend-ready-without-appsflyer.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/paid-user-acquisition-system-missing.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/parallel-file-overlap-unsafe.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/paywall-engine-mismatch.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/paywall-experiment-program-unowned.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/paywall-experimentation-never-starts.yaml +35 -0
- package/checks/validation/repository/evals/launchbench/paywall-goal-headline-missing.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/post-launch-metrics-never-operated.yaml +33 -0
- package/checks/validation/repository/evals/launchbench/post-launch-ops-runbook-missing.yaml +34 -0
- package/checks/validation/repository/evals/launchbench/post-launch-zombie-app-no-kill-decision.yaml +35 -0
- package/checks/validation/repository/evals/launchbench/pre-build-kill-gate-skipped.yaml +43 -0
- package/checks/validation/repository/evals/launchbench/price-derivation-apply-without-dry-run.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/price-derivation-multiplier-as-approval.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/project-state-stale-after-upload.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/remotion-assets-thin.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/remotion-license-unchecked.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/repository-profile-acceptance-incomplete.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/repository-profile-overlay-invalid-yaml.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/repository-profile-public-community-on-private.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/repository-profile-suppresses-privacy.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/resend-template-unbranded.yaml +13 -0
- package/checks/validation/repository/evals/launchbench/revenuecat-entitlement-unproven.yaml +13 -0
- package/checks/validation/repository/evals/launchbench/revenuecat-experiments-capability-unclassified.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/revenuecat-subscription-preflight-missing.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/review-prompt-teardown-race.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/scrollytelling-copy-visual-disconnect.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/scrollytelling-mobile-short-height-failure.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/scrollytelling-reduced-motion-no-js-failure.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/scrollytelling-scroll-sync-drift.yaml +16 -0
- package/checks/validation/repository/evals/launchbench/secret-routing-missing.yaml +13 -0
- package/checks/validation/repository/evals/launchbench/secrets-baseline-skipped.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/security-release-lane-missing.yaml +15 -0
- package/checks/validation/repository/evals/launchbench/social-shared-password-instead-of-delegation.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/source-checkpoint-missing.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/source-registry-url-untracked.yaml +18 -0
- package/checks/validation/repository/evals/launchbench/stale-blocker-after-authoritative-readback.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/stale-installed-skill-runtime.yaml +25 -0
- package/checks/validation/repository/evals/launchbench/standing-approval-reprompt-and-late-tool-preflight.yaml +23 -0
- package/checks/validation/repository/evals/launchbench/state-updated-but-never-narrated.yaml +30 -0
- package/checks/validation/repository/evals/launchbench/store-screenshots-raw-only.yaml +24 -0
- package/checks/validation/repository/evals/launchbench/subagent-dispatch-skipped.yaml +22 -0
- package/checks/validation/repository/evals/launchbench/subagent-findings-unintegrated.yaml +21 -0
- package/checks/validation/repository/evals/launchbench/subagent-forbidden-actions.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/transformation-demo-vitamin.yaml +19 -0
- package/checks/validation/repository/evals/launchbench/typed-skill-graph-drift.yaml +17 -0
- package/checks/validation/repository/evals/launchbench/variable-reward-without-ethics-guardrail.yaml +14 -0
- package/checks/validation/repository/evals/launchbench/virality-predictor-skipped-before-spend.yaml +24 -0
- package/checks/validation/repository/evals/launchbench/weekly-source-refresh-unreviewed.yaml +20 -0
- package/checks/validation/repository/evals/launchbench/xctest-signal-kill-loop.yaml +17 -0
- package/checks/validation/repository/evals/triggering/autopilot-triggering.yaml +140 -0
- package/checks/validation/repository/fixtures/_builders-ops.ts +358 -0
- package/checks/validation/repository/fixtures/_builders-store.ts +380 -0
- package/checks/validation/repository/fixtures/_evidence-header-constants.ts +37 -0
- package/checks/validation/repository/fixtures/_harness.ts +213 -0
- package/checks/validation/repository/fixtures/_source-http-checks.ts +258 -0
- package/checks/validation/repository/fixtures/_source-http-preload.mjs +71 -0
- package/checks/validation/repository/fixtures/_state.ts +29 -0
- package/checks/validation/repository/fixtures/_table-edit.ts +18 -0
- package/checks/validation/repository/fixtures/agent-entrypoints.fixtures.ts +277 -0
- package/checks/validation/repository/fixtures/agent-operations.fixtures.ts +614 -0
- package/checks/validation/repository/fixtures/appkittie-adapter.fixtures.ts +143 -0
- package/checks/validation/repository/fixtures/archetype.fixtures.ts +137 -0
- package/checks/validation/repository/fixtures/architecture.fixtures.ts +127 -0
- package/checks/validation/repository/fixtures/behavioral.fixtures.ts +19 -0
- package/checks/validation/repository/fixtures/check-json.fixtures.ts +145 -0
- package/checks/validation/repository/fixtures/continuity-length-budget.fixtures.ts +35 -0
- package/checks/validation/repository/fixtures/copy.fixtures.ts +1486 -0
- package/checks/validation/repository/fixtures/core-artifacts.fixtures.ts +3208 -0
- package/checks/validation/repository/fixtures/design-taste-grading.fixtures.ts +358 -0
- package/checks/validation/repository/fixtures/design-taste-rubric.fixtures.ts +136 -0
- package/checks/validation/repository/fixtures/design.fixtures.ts +5771 -0
- package/checks/validation/repository/fixtures/engineering.fixtures.ts +764 -0
- package/checks/validation/repository/fixtures/evidence-schema.fixtures.ts +448 -0
- package/checks/validation/repository/fixtures/founder-operator.fixtures.ts +897 -0
- package/checks/validation/repository/fixtures/graph-foundations.fixtures.ts +107 -0
- package/checks/validation/repository/fixtures/growth.fixtures.ts +908 -0
- package/checks/validation/repository/fixtures/learning.fixtures.ts +243 -0
- package/checks/validation/repository/fixtures/lifecycle.fixtures.ts +1958 -0
- package/checks/validation/repository/fixtures/mobai.fixtures.ts +277 -0
- package/checks/validation/repository/fixtures/onboarding.fixtures.ts +2447 -0
- package/checks/validation/repository/fixtures/operating-graph.fixtures.ts +24 -0
- package/checks/validation/repository/fixtures/pack-composition.fixtures.ts +117 -0
- package/checks/validation/repository/fixtures/probes-and-grading.fixtures.ts +122 -0
- package/checks/validation/repository/fixtures/provider-contracts.fixtures.ts +378 -0
- package/checks/validation/repository/fixtures/providers-and-secrets.fixtures.ts +1266 -0
- package/checks/validation/repository/fixtures/repo-gates.fixtures.ts +2451 -0
- package/checks/validation/repository/fixtures/repository-boundary.fixtures.ts +2281 -0
- package/checks/validation/repository/fixtures/repository-profile.fixtures.ts +244 -0
- package/checks/validation/repository/fixtures/roster.fixtures.ts +62 -0
- package/checks/validation/repository/fixtures/runtime-sync.fixtures.ts +286 -0
- package/checks/validation/repository/fixtures/skill-supply-chain.fixtures.ts +114 -0
- package/checks/validation/repository/fixtures/source-access.fixtures.ts +523 -0
- package/checks/validation/repository/fixtures/state-and-meta.fixtures.ts +1518 -0
- package/checks/validation/repository/fixtures/store.fixtures.ts +1573 -0
- package/checks/validation/repository/fixtures/upstreams.fixtures.ts +222 -0
- package/checks/validation/repository/launchbench-evals.md +150 -0
- package/checks/validation/repository/message-batches.ts +75 -0
- package/checks/validation/repository/refresh-source-freshness.ts +341 -0
- package/checks/validation/repository/run-agent-evals.ts +117 -0
- package/checks/validation/repository/run-behavioral-evals.ts +612 -0
- package/checks/validation/repository/run-launchbench.ts +246 -0
- package/checks/validation/repository/run-validator-fixtures.ts +173 -0
- package/checks/validation/repository/skill-versioning.md +91 -0
- package/checks/validation/repository/source-freshness-maintenance.md +129 -0
- package/checks/validation/repository/source-registry.yaml +2976 -0
- package/contracts/contribution/contract.ts +571 -0
- package/contracts/extensions/contract.ts +307 -0
- package/contracts/extensions/schemas/extension.schema.json +756 -0
- package/contracts/mobile-operation.ts +148 -0
- package/contracts/onboarding/foundations.ts +286 -0
- package/contracts/public-api/REFERENCE.md +206 -0
- package/contracts/public-api/connection-receipt.ts +645 -0
- package/contracts/public-api/contract.ts +786 -0
- package/contracts/public-api/examples/mobile-app-capture.json +5 -0
- package/contracts/public-api/examples/subscription-app.json +19 -0
- package/contracts/public-api/research-contract.ts +125 -0
- package/contracts/public-api/schemas/business.create.input.schema.json +38 -0
- package/contracts/public-api/schemas/business.create.result.schema.json +177 -0
- package/contracts/public-api/schemas/business.evidence.input.schema.json +19 -0
- package/contracts/public-api/schemas/business.evidence.result.schema.json +206 -0
- package/contracts/public-api/schemas/business.initialize.input.schema.json +20 -0
- package/contracts/public-api/schemas/business.initialize.result.schema.json +140 -0
- package/contracts/public-api/schemas/business.plan.input.schema.json +21 -0
- package/contracts/public-api/schemas/business.plan.result.schema.json +1007 -0
- package/contracts/public-api/schemas/business.recover.input.schema.json +25 -0
- package/contracts/public-api/schemas/business.recover.result.schema.json +179 -0
- package/contracts/public-api/schemas/business.research.decision.input.schema.json +53 -0
- package/contracts/public-api/schemas/business.research.decision.result.schema.json +184 -0
- package/contracts/public-api/schemas/business.research.lookup.input.schema.json +87 -0
- package/contracts/public-api/schemas/business.research.lookup.result.schema.json +281 -0
- package/contracts/public-api/schemas/business.research.record.input.schema.json +136 -0
- package/contracts/public-api/schemas/business.research.record.result.schema.json +149 -0
- package/contracts/public-api/schemas/business.run.input.schema.json +53 -0
- package/contracts/public-api/schemas/business.run.result.schema.json +218 -0
- package/contracts/public-api/schemas/business.status.input.schema.json +15 -0
- package/contracts/public-api/schemas/business.status.result.schema.json +319 -0
- package/contracts/public-api/schemas/catalog.list.input.schema.json +20 -0
- package/contracts/public-api/schemas/catalog.list.result.schema.json +208 -0
- package/contracts/public-api/schemas/composition.activate.input.schema.json +30 -0
- package/contracts/public-api/schemas/composition.activate.result.schema.json +161 -0
- package/contracts/public-api/schemas/composition.plan.input.schema.json +25 -0
- package/contracts/public-api/schemas/composition.plan.result.schema.json +253 -0
- package/contracts/public-api/schemas/composition.preview.input.schema.json +118 -0
- package/contracts/public-api/schemas/composition.preview.result.schema.json +284 -0
- package/contracts/public-api/schemas/composition.recover.input.schema.json +23 -0
- package/contracts/public-api/schemas/composition.recover.result.schema.json +161 -0
- package/contracts/public-api/schemas/composition.schema.json +101 -0
- package/contracts/public-api/schemas/market.report.input.schema.json +21 -0
- package/contracts/public-api/schemas/market.report.result.schema.json +377 -0
- package/contracts/public-api/schemas/packages.import.input.schema.json +29 -0
- package/contracts/public-api/schemas/packages.import.result.schema.json +177 -0
- package/contracts/public-api/schemas/packages.list.input.schema.json +15 -0
- package/contracts/public-api/schemas/packages.list.result.schema.json +189 -0
- package/contracts/research/observation.ts +27 -0
- package/contracts/semantic/canonicalize.ts +25 -0
- package/contracts/semantic/index.ts +116 -0
- package/contracts/semantic/package-resource.ts +53 -0
- package/contracts/semantic/query-ir.ts +215 -0
- package/contracts/semantic/question-pack.ts +176 -0
- package/contracts/semantic/questions.ts +149 -0
- package/contracts/semantic/receipts.ts +179 -0
- package/contracts/shared-resources.ts +18 -0
- package/contracts/source-access.ts +44 -0
- package/contracts/worker-artifact.ts +14 -0
- package/dist/adapters/app-review/archive.js +46 -0
- package/dist/adapters/app-review/asc-boundary.js +71 -0
- package/dist/adapters/app-review/asc-provider.js +474 -0
- package/dist/adapters/app-review/auth.js +53 -0
- package/dist/adapters/app-review/capability.js +195 -0
- package/dist/adapters/app-review/classify.js +107 -0
- package/dist/adapters/app-review/consume.js +77 -0
- package/dist/adapters/app-review/envelope.js +89 -0
- package/dist/adapters/app-review/events.js +381 -0
- package/dist/adapters/app-review/hmac.js +72 -0
- package/dist/adapters/app-review/implement.js +76 -0
- package/dist/adapters/app-review/index.js +29 -0
- package/dist/adapters/app-review/ingest.js +106 -0
- package/dist/adapters/app-review/mandate.js +76 -0
- package/dist/adapters/app-review/normalize.js +245 -0
- package/dist/adapters/app-review/packet.js +236 -0
- package/dist/adapters/app-review/persist.js +83 -0
- package/dist/adapters/app-review/plan.js +268 -0
- package/dist/adapters/app-review/plist.js +218 -0
- package/dist/adapters/app-review/poll.js +224 -0
- package/dist/adapters/app-review/projection.js +143 -0
- package/dist/adapters/app-review/queue.js +115 -0
- package/dist/adapters/app-review/receiver.js +78 -0
- package/dist/adapters/app-review/registration.js +52 -0
- package/dist/adapters/app-review/remediate.js +185 -0
- package/dist/adapters/app-review/render.js +175 -0
- package/dist/adapters/app-review/resubmit.js +322 -0
- package/dist/adapters/app-review/types.js +52 -0
- package/dist/adapters/app-review/uncertain-execution.js +151 -0
- package/dist/adapters/app-review/verification.js +35 -0
- package/dist/adapters/appkittie-category-revenue.js +69 -0
- package/dist/adapters/claude.js +51 -0
- package/dist/adapters/codex.js +47 -0
- package/dist/adapters/cursor.js +48 -0
- package/dist/adapters/device-proof.js +649 -0
- package/dist/adapters/greenfield/boundary.js +126 -0
- package/dist/adapters/greenfield/fail-safe.js +120 -0
- package/dist/adapters/greenfield/index.js +2 -0
- package/dist/adapters/inline.js +35 -0
- package/dist/adapters/install-control-permissions.js +264 -0
- package/dist/adapters/install-entrypoints.js +344 -0
- package/dist/adapters/install-schedule.js +571 -0
- package/dist/adapters/ios-app-evidence.js +111 -0
- package/dist/adapters/mobile-operation-host.js +206 -0
- package/dist/adapters/mobile-operation.js +93 -0
- package/dist/adapters/operating.js +7 -0
- package/dist/adapters/probe.js +40 -0
- package/dist/adapters/profile.js +134 -0
- package/dist/adapters/providers/capability-delta.js +59 -0
- package/dist/adapters/providers/contract.js +41 -0
- package/dist/adapters/providers/evaluate.js +116 -0
- package/dist/adapters/providers/expo/argv.js +222 -0
- package/dist/adapters/providers/expo/decode.js +593 -0
- package/dist/adapters/providers/expo/discovery.js +94 -0
- package/dist/adapters/providers/expo/doctor.js +145 -0
- package/dist/adapters/providers/expo/effects.js +142 -0
- package/dist/adapters/providers/expo/execute.js +299 -0
- package/dist/adapters/providers/expo/expo-device-bind.js +91 -0
- package/dist/adapters/providers/expo/expo-mcp-route.js +282 -0
- package/dist/adapters/providers/expo/hosting-prepare.js +116 -0
- package/dist/adapters/providers/expo/identity.js +99 -0
- package/dist/adapters/providers/expo/index.js +26 -0
- package/dist/adapters/providers/expo/jobs.js +424 -0
- package/dist/adapters/providers/expo/preflight.js +215 -0
- package/dist/adapters/providers/expo/process.js +117 -0
- package/dist/adapters/providers/expo/project-config.js +147 -0
- package/dist/adapters/providers/expo/sanitize.js +46 -0
- package/dist/adapters/providers/expo/signing-readiness.js +108 -0
- package/dist/adapters/providers/expo/store-handoff.js +52 -0
- package/dist/adapters/providers/expo/update-identity.js +70 -0
- package/dist/adapters/providers/expo/update-policy.js +93 -0
- package/dist/adapters/providers/expo/update-prepare.js +104 -0
- package/dist/adapters/providers/expo/update-recovery.js +96 -0
- package/dist/adapters/providers/expo/update-rollout.js +69 -0
- package/dist/adapters/providers/expo/update-signing.js +69 -0
- package/dist/adapters/providers/expo/web-api-contract.js +112 -0
- package/dist/adapters/providers/growth-agent/boundary.js +143 -0
- package/dist/adapters/providers/growth-agent/fail-safe.js +220 -0
- package/dist/adapters/providers/growth-agent/index.js +2 -0
- package/dist/adapters/providers/layers/effects.js +72 -0
- package/dist/adapters/providers/layers/index.js +9 -0
- package/dist/adapters/providers/layers/jobs.js +207 -0
- package/dist/adapters/providers/layers/onboarding.js +114 -0
- package/dist/adapters/providers/layers/route.js +242 -0
- package/dist/adapters/providers/layers/transport.js +144 -0
- package/dist/adapters/providers/load.js +300 -0
- package/dist/adapters/providers/mobile-ops/boundary.js +114 -0
- package/dist/adapters/providers/mobile-ops/fail-safe.js +190 -0
- package/dist/adapters/providers/mobile-ops/index.js +2 -0
- package/dist/adapters/providers/monetization-validation.js +72 -0
- package/dist/adapters/providers/revenuecat/cli-catalog-observe.js +230 -0
- package/dist/adapters/providers/revenuecat/cli-catalog.js +941 -0
- package/dist/adapters/providers/revenuecat/cli-command-schema.js +319 -0
- package/dist/adapters/providers/revenuecat/cli-decode.js +740 -0
- package/dist/adapters/providers/revenuecat/cli-discovery.js +205 -0
- package/dist/adapters/providers/revenuecat/cli-doctor.js +199 -0
- package/dist/adapters/providers/revenuecat/cli-execute.js +345 -0
- package/dist/adapters/providers/revenuecat/cli-ledger.js +371 -0
- package/dist/adapters/providers/revenuecat/cli-operations.js +875 -0
- package/dist/adapters/providers/revenuecat/cli-preflight.js +175 -0
- package/dist/adapters/providers/revenuecat/cli-process.js +149 -0
- package/dist/adapters/providers/revenuecat/cli-proof.js +121 -0
- package/dist/adapters/providers/revenuecat/cli-reconcile-plan.js +901 -0
- package/dist/adapters/providers/revenuecat/provisioning.js +52 -0
- package/dist/adapters/providers/revenuecat/revenue-validation.js +772 -0
- package/dist/adapters/providers/runtime-pin.js +92 -0
- package/dist/adapters/providers/superwall/boundary.js +86 -0
- package/dist/adapters/providers/superwall/fail-safe.js +171 -0
- package/dist/adapters/providers/superwall/measurement.js +49 -0
- package/dist/adapters/providers/typesafe/assess.js +160 -0
- package/dist/adapters/providers/typesafe/binding.js +35 -0
- package/dist/adapters/providers/typesafe/connection.js +58 -0
- package/dist/adapters/providers/typesafe/decode.js +255 -0
- package/dist/adapters/providers/typesafe/effects.js +67 -0
- package/dist/adapters/providers/typesafe/encode.js +61 -0
- package/dist/adapters/providers/typesafe/index.js +12 -0
- package/dist/adapters/providers/typesafe/support.js +65 -0
- package/dist/adapters/providers/typesafe/transport.js +318 -0
- package/dist/adapters/provisioning/capability-gaps.js +66 -0
- package/dist/adapters/provisioning/capability-readiness.js +39 -0
- package/dist/adapters/provisioning/cli.js +259 -0
- package/dist/adapters/provisioning/requirements.js +458 -0
- package/dist/adapters/provisioning/resolve.js +217 -0
- package/dist/adapters/registry.js +180 -0
- package/dist/catalog/agent-graph/load.js +102 -0
- package/dist/catalog/agent-graph/types.js +15 -0
- package/dist/catalog/agent-graph/validate.js +110 -0
- package/dist/catalog/areas.js +83 -0
- package/dist/catalog/artifacts.js +38 -0
- package/dist/catalog/authoring.js +43 -0
- package/dist/catalog/bridge.js +221 -0
- package/dist/catalog/business-primitives.js +80 -0
- package/dist/catalog/business-units.js +13 -0
- package/dist/catalog/capabilities/types.js +3 -0
- package/dist/catalog/context-packs.js +76 -0
- package/dist/catalog/domain-authority.js +32 -0
- package/dist/catalog/domains.js +170 -0
- package/dist/catalog/firstparty-declarations.js +625 -0
- package/dist/catalog/firstparty-recipes.js +273 -0
- package/dist/catalog/gates.js +93 -0
- package/dist/catalog/ids.js +18 -0
- package/dist/catalog/index.js +36 -0
- package/dist/catalog/knowledge-packages.js +210 -0
- package/dist/catalog/knowledge-validation.js +160 -0
- package/dist/catalog/lane-graph.js +30 -0
- package/dist/catalog/lanes.js +59 -0
- package/dist/catalog/ontology/design-surface-applicability.js +383 -0
- package/dist/catalog/ontology/instance-load.js +97 -0
- package/dist/catalog/ontology/instance-types.js +25 -0
- package/dist/catalog/ontology/instance-validate.js +86 -0
- package/dist/catalog/ontology/load.js +174 -0
- package/dist/catalog/ontology/onboarding-applicability.js +166 -0
- package/dist/catalog/ontology/product-workspace.js +36 -0
- package/dist/catalog/ontology/query.js +62 -0
- package/dist/catalog/ontology/render-product.js +26 -0
- package/dist/catalog/ontology/types.js +24 -0
- package/dist/catalog/ontology/validate.js +173 -0
- package/dist/catalog/operators.js +246 -0
- package/dist/catalog/overlays.js +28 -0
- package/dist/catalog/packs/compose.js +386 -0
- package/dist/catalog/packs/firstparty-assets.js +68 -0
- package/dist/catalog/packs/firstparty-notices.js +52 -0
- package/dist/catalog/packs/firstparty.js +134 -0
- package/dist/catalog/packs/installed-firstparty.js +20 -0
- package/dist/catalog/packs/isolation.js +77 -0
- package/dist/catalog/packs/load.js +543 -0
- package/dist/catalog/packs/snapshots.js +122 -0
- package/dist/catalog/packs/types.js +11 -0
- package/dist/catalog/phases.js +137 -0
- package/dist/catalog/principles/guards.js +101 -0
- package/dist/catalog/principles/load.js +176 -0
- package/dist/catalog/principles/types.js +26 -0
- package/dist/catalog/profiles.js +40 -0
- package/dist/catalog/providers/apple-asc-canonical-map.js +449 -0
- package/dist/catalog/providers/conformance.js +41 -0
- package/dist/catalog/providers/greenfield-70-applicability-closeout-map.js +210 -0
- package/dist/catalog/providers/greenfield-71-handoff-closeout-map.js +331 -0
- package/dist/catalog/providers/greenfield-72-benchmark-closeout-map.js +449 -0
- package/dist/catalog/providers/greenfield-73-overhead-closeout-map.js +276 -0
- package/dist/catalog/providers/greenfield-75-retrieval-closeout-map.js +283 -0
- package/dist/catalog/providers/greenfield-76-change-impact-closeout-map.js +287 -0
- package/dist/catalog/providers/greenfield-delivery-audit-map.js +319 -0
- package/dist/catalog/providers/growth-agent-canonical-map.js +599 -0
- package/dist/catalog/providers/mobile-ops-canonical-map.js +513 -0
- package/dist/catalog/providers/semantic-batch-map.js +62 -0
- package/dist/catalog/providers/semantic-eval-baselines-map.js +735 -0
- package/dist/catalog/providers/semantic-graph-views-map.js +66 -0
- package/dist/catalog/providers/semantic-plan-lower-map.js +54 -0
- package/dist/catalog/providers/semantic-source-projection-map.js +78 -0
- package/dist/catalog/providers/superwall-canonical-map.js +325 -0
- package/dist/catalog/providers/typesafe-qualify-map.js +224 -0
- package/dist/catalog/recipes/default-monetization.js +9 -0
- package/dist/catalog/render-routing.js +394 -0
- package/dist/catalog/repository-profiles/compile.js +381 -0
- package/dist/catalog/repository-profiles/index.js +4 -0
- package/dist/catalog/repository-profiles/paid-generation-applicability.js +111 -0
- package/dist/catalog/repository-profiles/registry.js +75 -0
- package/dist/catalog/repository-profiles/types.js +17 -0
- package/dist/catalog/repository-profiles/workspace.js +128 -0
- package/dist/catalog/roles.js +266 -0
- package/dist/catalog/stacks/expo-agent-privacy.js +101 -0
- package/dist/catalog/stacks/expo-agent-tools.js +264 -0
- package/dist/catalog/stacks/expo-capability-matrix.js +209 -0
- package/dist/catalog/stacks/expo-capability-protocol.js +521 -0
- package/dist/catalog/stacks/expo-custom-module.js +367 -0
- package/dist/catalog/stacks/expo-eas-commands.js +677 -0
- package/dist/catalog/stacks/expo-eas-hosting.js +160 -0
- package/dist/catalog/stacks/expo-eas-operation-matrix.js +194 -0
- package/dist/catalog/stacks/expo-local-boot.js +301 -0
- package/dist/catalog/stacks/expo-local-capabilities.js +240 -0
- package/dist/catalog/stacks/expo-native-ownership.js +362 -0
- package/dist/catalog/stacks/expo-observability.js +101 -0
- package/dist/catalog/stacks/expo-proof-collection.js +231 -0
- package/dist/catalog/stacks/expo-quality-evidence.js +148 -0
- package/dist/catalog/stacks/expo-revenuecat-wiring.js +103 -0
- package/dist/catalog/stacks/expo-router-contract.js +340 -0
- package/dist/catalog/stacks/expo-sdk-upgrade.js +126 -0
- package/dist/catalog/stacks/expo-selection.js +572 -0
- package/dist/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/capability.js +36 -0
- package/dist/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/index.web.js +11 -0
- package/dist/catalog/stacks/expo-starter-fixture/modules/b2c-native-capability/src/invoke.js +17 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/capabilities/reducers.js +116 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/navigation/deep-link.js +14 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/navigation/journeys.js +94 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/navigation/route-graph.js +36 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/notifications/handoff.js +15 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/offline/local-cache.js +62 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/permissions/safe-state.js +10 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/persistence/seam.js +25 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/session/local-session.js +24 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/states/surface-state.js +12 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/ui/contract-binding.js +11 -0
- package/dist/catalog/stacks/expo-starter-fixture/src/ui/tokens.js +8 -0
- package/dist/catalog/stacks/expo-starter.js +292 -0
- package/dist/catalog/stacks/expo-web-api-routes.js +145 -0
- package/dist/catalog/stacks/expo-web-static.js +407 -0
- package/dist/catalog/stacks/expo-web-surface-table.js +162 -0
- package/dist/catalog/task-skills.js +345 -0
- package/dist/catalog/taxonomy/load.js +109 -0
- package/dist/catalog/taxonomy/types.js +30 -0
- package/dist/catalog/taxonomy/validate.js +199 -0
- package/dist/catalog/types.js +6 -0
- package/dist/catalog/validate.js +745 -0
- package/dist/catalog/workflows/build-release.js +704 -0
- package/dist/catalog/workflows/growth-revenue.js +322 -0
- package/dist/catalog/workflows/helpers.js +61 -0
- package/dist/catalog/workflows/index.js +8 -0
- package/dist/catalog/workflows/maintenance.js +269 -0
- package/dist/catalog/workflows/operating-system.js +250 -0
- package/dist/catalog/workflows/operations-trust.js +407 -0
- package/dist/catalog/workflows/product-experience.js +1214 -0
- package/dist/checks/validation/business/design/color-contrast.js +41 -0
- package/dist/checks/validation/business/design/design-acceptance.js +1716 -0
- package/dist/checks/validation/business/design/lib/vibecode-tells.js +78 -0
- package/dist/checks/validation/business/design/lib/worthiness-mechanical.js +157 -0
- package/dist/checks/validation/business/design/runtime-reviewer-inputs.js +51 -0
- package/dist/checks/validation/business/design/surface-page-gates.js +140 -0
- package/dist/checks/validation/repository/agent-guidance-contract.js +257 -0
- package/dist/checks/validation/repository/check-agent-entrypoints.js +210 -0
- package/dist/checks/validation/repository/check-architecture.js +327 -0
- package/dist/checks/validation/repository/check-autopilot-contract.js +198 -0
- package/dist/checks/validation/repository/check-capability-delta.js +28 -0
- package/dist/checks/validation/repository/check-catalog.js +80 -0
- package/dist/checks/validation/repository/check-gates-layout.js +76 -0
- package/dist/checks/validation/repository/check-graph-foundations.js +130 -0
- package/dist/checks/validation/repository/check-hub-spoke.js +110 -0
- package/dist/checks/validation/repository/check-learning-grounding.js +259 -0
- package/dist/checks/validation/repository/check-operating-graph.js +171 -0
- package/dist/checks/validation/repository/check-pack-composition.js +87 -0
- package/dist/checks/validation/repository/check-package-parity.js +410 -0
- package/dist/checks/validation/repository/check-provider-boundary.js +116 -0
- package/dist/checks/validation/repository/check-provider-contracts.js +21 -0
- package/dist/checks/validation/repository/check-upstreams.js +123 -0
- package/dist/checks/validation/repository/check-validator-docs.js +57 -0
- package/dist/contracts/contribution/contract.js +496 -0
- package/dist/contracts/extensions/contract.js +317 -0
- package/dist/contracts/mobile-operation.js +137 -0
- package/dist/contracts/onboarding/foundations.js +268 -0
- package/dist/contracts/public-api/connection-receipt.js +468 -0
- package/dist/contracts/public-api/contract.js +682 -0
- package/dist/contracts/public-api/research-contract.js +119 -0
- package/dist/contracts/research/observation.js +26 -0
- package/dist/contracts/semantic/canonicalize.js +24 -0
- package/dist/contracts/semantic/index.js +12 -0
- package/dist/contracts/semantic/package-resource.js +42 -0
- package/dist/contracts/semantic/query-ir.js +185 -0
- package/dist/contracts/semantic/question-pack.js +155 -0
- package/dist/contracts/semantic/questions.js +124 -0
- package/dist/contracts/semantic/receipts.js +152 -0
- package/dist/contracts/shared-resources.js +11 -0
- package/dist/contracts/source-access.js +36 -0
- package/dist/contracts/worker-artifact.js +13 -0
- package/dist/entrypoints/cli/business.js +245 -0
- package/dist/entrypoints/cli/contribute.js +256 -0
- package/dist/entrypoints/mcp/business.js +17 -0
- package/dist/entrypoints/mcp/contribute.js +36 -0
- package/dist/entrypoints/mcp/run-process.js +58 -0
- package/dist/entrypoints/mcp/server.js +664 -0
- package/dist/kernel/autonomy/budget.js +110 -0
- package/dist/kernel/autonomy/evaluator.js +81 -0
- package/dist/kernel/autonomy/grants.js +88 -0
- package/dist/kernel/autonomy/killswitch.js +16 -0
- package/dist/kernel/autonomy/prerequisites.js +71 -0
- package/dist/kernel/autonomy/probes/budget.js +50 -0
- package/dist/kernel/autonomy/probes/doppler.js +34 -0
- package/dist/kernel/autonomy/standing-approvals.js +272 -0
- package/dist/kernel/autonomy/waivers.js +97 -0
- package/dist/kernel/composition/activation.js +474 -0
- package/dist/kernel/composition/compile-bindings.js +241 -0
- package/dist/kernel/composition/notices.js +179 -0
- package/dist/kernel/composition/onboarding-selection.js +172 -0
- package/dist/kernel/composition/providers.js +29 -0
- package/dist/kernel/composition/resolve.js +201 -0
- package/dist/kernel/composition/resources.js +284 -0
- package/dist/kernel/composition/semantic-plan-lower.js +659 -0
- package/dist/kernel/composition/worker-context.js +54 -0
- package/dist/kernel/context/budget.js +12 -0
- package/dist/kernel/context/compile.js +54 -0
- package/dist/kernel/context/receipt.js +7 -0
- package/dist/kernel/context/selectors.js +25 -0
- package/dist/kernel/contribution/accepted-upstreams.js +71 -0
- package/dist/kernel/contribution/adoption-map.js +103 -0
- package/dist/kernel/contribution/check.js +157 -0
- package/dist/kernel/contribution/evaluate.js +251 -0
- package/dist/kernel/contribution/existing-owners.js +89 -0
- package/dist/kernel/contribution/github-metadata.js +178 -0
- package/dist/kernel/contribution/host-observe.js +117 -0
- package/dist/kernel/contribution/intake.js +559 -0
- package/dist/kernel/contribution/manifest-io.js +238 -0
- package/dist/kernel/contribution/plan.js +358 -0
- package/dist/kernel/contribution/preview.js +198 -0
- package/dist/kernel/contribution/provider-capability-delta.js +142 -0
- package/dist/kernel/contribution/service.js +208 -0
- package/dist/kernel/contribution/types.js +1 -0
- package/dist/kernel/contribution/untrusted.js +164 -0
- package/dist/kernel/contribution/upstream-coverage.js +99 -0
- package/dist/kernel/contribution/upstreams-load.js +157 -0
- package/dist/kernel/contribution/upstreams.js +1134 -0
- package/dist/kernel/engine/artifact-fingerprint.js +29 -0
- package/dist/kernel/engine/compile.js +201 -0
- package/dist/kernel/engine/design-taste-authority.js +191 -0
- package/dist/kernel/engine/dispatch.js +60 -0
- package/dist/kernel/engine/founder-decision-receipt.js +474 -0
- package/dist/kernel/engine/founder-trust-store.js +645 -0
- package/dist/kernel/engine/frontier.js +123 -0
- package/dist/kernel/engine/node-brief.js +199 -0
- package/dist/kernel/engine/proof-rung.js +47 -0
- package/dist/kernel/engine/review-evidence.js +292 -0
- package/dist/kernel/engine/review-facet.js +6 -0
- package/dist/kernel/engine/runstate.js +1032 -0
- package/dist/kernel/engine/source-fingerprint.js +89 -0
- package/dist/kernel/engine/verification-policy.js +4 -0
- package/dist/kernel/engine/verification.js +130 -0
- package/dist/kernel/knowledge-service/journey.js +46 -0
- package/dist/kernel/knowledge-service/projection-helpers.js +196 -0
- package/dist/kernel/knowledge-service/sections.js +58 -0
- package/dist/kernel/knowledge-service/semantic-graph-views.js +514 -0
- package/dist/kernel/knowledge-service/service.js +767 -0
- package/dist/kernel/knowledge-service/tools.js +101 -0
- package/dist/kernel/knowledge-service/types.js +27 -0
- package/dist/kernel/lib/atomic-file.js +39 -0
- package/dist/kernel/lib/bounded-file.js +29 -0
- package/dist/kernel/lib/cli.js +42 -0
- package/dist/kernel/lib/empty-equivalent-evidence.js +33 -0
- package/dist/kernel/lib/later-guidance.js +101 -0
- package/dist/kernel/lib/required-table-section.js +535 -0
- package/dist/kernel/operating-model/agreements.js +17 -0
- package/dist/kernel/operating-model/authorize.js +65 -0
- package/dist/kernel/operating-model/erasure-metadata.js +6 -0
- package/dist/kernel/operating-model/events.js +123 -0
- package/dist/kernel/operating-model/mandates.js +64 -0
- package/dist/kernel/operating-model/market-experiment.js +290 -0
- package/dist/kernel/operating-model/measurement.js +400 -0
- package/dist/kernel/operating-model/parties.js +12 -0
- package/dist/kernel/operating-model/projections.js +109 -0
- package/dist/kernel/operating-model/types.js +41 -0
- package/dist/kernel/operating-model/validate.js +316 -0
- package/dist/kernel/reducer/audit.js +103 -0
- package/dist/kernel/reducer/cli.js +489 -0
- package/dist/kernel/reducer/current-truth.js +383 -0
- package/dist/kernel/reducer/erasure-guard.js +16 -0
- package/dist/kernel/reducer/erasure.js +683 -0
- package/dist/kernel/reducer/lock.js +137 -0
- package/dist/kernel/reducer/patch.js +320 -0
- package/dist/kernel/reducer/semantic-batch-ownership.js +27 -0
- package/dist/kernel/reducer/semantic-graph-ownership.js +41 -0
- package/dist/kernel/reducer/shared-claims.js +124 -0
- package/dist/kernel/routing/eligibility.js +63 -0
- package/dist/kernel/routing/rank.js +14 -0
- package/dist/kernel/routing/resolve.js +89 -0
- package/dist/kernel/routing/signals.js +27 -0
- package/dist/kernel/routing/types.js +3 -0
- package/dist/kernel/schema/domain-authority.js +3 -0
- package/dist/kernel/schema/evidence-grammar.js +104 -0
- package/dist/kernel/schema/evidence-schema-version.js +64 -0
- package/dist/kernel/schema/index.js +283 -0
- package/dist/kernel/schema/types.js +91 -0
- package/dist/kernel/services/business.js +307 -0
- package/dist/kernel/services/installed-composition.js +148 -0
- package/dist/kernel/services/lifecycle.js +242 -0
- package/dist/kernel/services/plan-projection.js +211 -0
- package/dist/kernel/services/research-decision.js +209 -0
- package/dist/kernel/services/research.js +99 -0
- package/dist/kernel/services/source-projection.js +364 -0
- package/dist/kernel/session/app-review-ingress.js +230 -0
- package/dist/kernel/session/approve.js +364 -0
- package/dist/kernel/session/attempt-failure.js +108 -0
- package/dist/kernel/session/bootstrap.js +480 -0
- package/dist/kernel/session/brief.js +69 -0
- package/dist/kernel/session/catalog-contract.js +262 -0
- package/dist/kernel/session/check.js +184 -0
- package/dist/kernel/session/deterministic-gates.js +60 -0
- package/dist/kernel/session/digest.js +280 -0
- package/dist/kernel/session/doctor-host.js +187 -0
- package/dist/kernel/session/doctor.js +275 -0
- package/dist/kernel/session/executor.js +803 -0
- package/dist/kernel/session/firstparty-worker-host.js +30 -0
- package/dist/kernel/session/founder-brief.js +106 -0
- package/dist/kernel/session/founder-gate.js +133 -0
- package/dist/kernel/session/founder-key.js +118 -0
- package/dist/kernel/session/initialization-guard.js +16 -0
- package/dist/kernel/session/initialize.js +205 -0
- package/dist/kernel/session/input-inventory.js +207 -0
- package/dist/kernel/session/inspect.js +237 -0
- package/dist/kernel/session/ios-proof-receipt.js +232 -0
- package/dist/kernel/session/market-experiment.js +77 -0
- package/dist/kernel/session/new.js +177 -0
- package/dist/kernel/session/onboard.js +448 -0
- package/dist/kernel/session/operate-bind.js +52 -0
- package/dist/kernel/session/operate.js +211 -0
- package/dist/kernel/session/operating-service.js +431 -0
- package/dist/kernel/session/operating-transport.js +102 -0
- package/dist/kernel/session/operating-types.js +4 -0
- package/dist/kernel/session/operation-routes.js +569 -0
- package/dist/kernel/session/plan.js +473 -0
- package/dist/kernel/session/planning-context.js +92 -0
- package/dist/kernel/session/planning-limits.js +2 -0
- package/dist/kernel/session/proof.js +258 -0
- package/dist/kernel/session/reducer-cli.js +23 -0
- package/dist/kernel/session/research-observations.js +58 -0
- package/dist/kernel/session/research-proof-projection.js +62 -0
- package/dist/kernel/session/route-scoring.js +537 -0
- package/dist/kernel/session/route-utterance.js +321 -0
- package/dist/kernel/session/run.js +2042 -0
- package/dist/kernel/session/runtime-write-audit.js +47 -0
- package/dist/kernel/session/scope.js +75 -0
- package/dist/kernel/session/semantic-batch.js +535 -0
- package/dist/kernel/session/setup.js +126 -0
- package/dist/kernel/session/status.js +320 -0
- package/dist/kernel/session/stepper.js +188 -0
- package/dist/kernel/session/update.js +95 -0
- package/dist/kernel/session/verify.js +122 -0
- package/dist/kernel/session/worker-prompt.js +477 -0
- package/dist/kernel/session/workspace-revision.js +58 -0
- package/dist/kernel/session/workspaces.js +68 -0
- package/dist/kernel/work-orders/instantiate.js +51 -0
- package/dist/kernel/work-orders/lifecycle.js +156 -0
- package/dist/kernel/work-orders/outcomes.js +107 -0
- package/dist/kernel/work-orders/types.js +1 -0
- package/dist/tooling/browser-proof.js +1128 -0
- package/dist/tooling/calibrate-utterance-router.js +278 -0
- package/dist/tooling/catalog-scaffold.js +182 -0
- package/dist/tooling/export-task-skill.js +181 -0
- package/dist/tooling/grade-design-surface.js +341 -0
- package/dist/tooling/grade-screenshots.js +462 -0
- package/dist/tooling/knowledge.js +208 -0
- package/dist/tooling/lib/app-copy-rules.js +369 -0
- package/dist/tooling/lib/artifact-pages.js +136 -0
- package/dist/tooling/lib/audit-plan.js +382 -0
- package/dist/tooling/lib/canonical-json.js +26 -0
- package/dist/tooling/lib/cli-entrypoint.js +13 -0
- package/dist/tooling/lib/content-assets.js +246 -0
- package/dist/tooling/lib/design-exploration.js +165 -0
- package/dist/tooling/lib/design-md.js +381 -0
- package/dist/tooling/lib/design-state.js +278 -0
- package/dist/tooling/lib/design-taste-rubric.js +326 -0
- package/dist/tooling/lib/founder-copy.js +522 -0
- package/dist/tooling/lib/git-root.js +11 -0
- package/dist/tooling/lib/grading.js +43 -0
- package/dist/tooling/lib/html.js +31 -0
- package/dist/tooling/lib/knowledge-freshness-pin.js +69 -0
- package/dist/tooling/lib/launch-state.js +794 -0
- package/dist/tooling/lib/markdown-lite.js +294 -0
- package/dist/tooling/lib/no-slop-rules.js +243 -0
- package/dist/tooling/lib/packed-check.js +60 -0
- package/dist/tooling/lib/posthog-retention.js +96 -0
- package/dist/tooling/lib/render-artifact-page.js +312 -0
- package/dist/tooling/lib/runtime-sync-lib.js +122 -0
- package/dist/tooling/lib/script-paths.js +117 -0
- package/dist/tooling/lib/shard-pool.js +99 -0
- package/dist/tooling/lib/skill-root.js +31 -0
- package/dist/tooling/lib/source-freshness-state.js +31 -0
- package/dist/tooling/lib/source-http.js +166 -0
- package/dist/tooling/lib/spawn.js +30 -0
- package/dist/tooling/lib/tsx-bin.js +64 -0
- package/dist/tooling/lib/tsx-launcher.mjs +57 -0
- package/dist/tooling/print-hosted-version.js +46 -0
- package/dist/tooling/probe-eas.js +91 -0
- package/dist/tooling/probe-posthog.js +263 -0
- package/dist/tooling/probe-revenuecat-cli.js +399 -0
- package/dist/tooling/probe-revenuecat.js +234 -0
- package/dist/tooling/promote-design-tokens.js +215 -0
- package/dist/tooling/provision-posthog-platform.js +126 -0
- package/dist/tooling/prune-posthog-persons.js +270 -0
- package/dist/tooling/render-artifact-pages.js +70 -0
- package/dist/tooling/render-credits.js +269 -0
- package/dist/tooling/render-design-room.js +451 -0
- package/dist/tooling/render-hosted-bundle.js +186 -0
- package/dist/tooling/render-product.js +102 -0
- package/dist/tooling/render-public-api.js +95 -0
- package/dist/tooling/render-task-skills.js +71 -0
- package/dist/tooling/report-research-evidence-failures.js +135 -0
- package/dist/tooling/run-audit.js +332 -0
- package/dist/tooling/runtime-sync.js +392 -0
- package/dist/tooling/seed-design-brief.js +65 -0
- package/dist/tooling/test-public-api.js +37 -0
- package/entrypoints/cli/b2c.mjs +51 -0
- package/entrypoints/cli/business.ts +255 -0
- package/entrypoints/cli/contribute.ts +273 -0
- package/entrypoints/cli/help.d.mts +23 -0
- package/entrypoints/cli/help.mjs +262 -0
- package/entrypoints/mcp/b2c-app-builder-mcp.mjs +12 -0
- package/entrypoints/mcp/business.ts +22 -0
- package/entrypoints/mcp/contribute.ts +42 -0
- package/entrypoints/mcp/run-process.ts +59 -0
- package/entrypoints/mcp/server.ts +808 -0
- package/examples/extensions/layers-growth/LICENSE-layers-mcp.txt +21 -0
- package/examples/extensions/layers-growth/README.md +39 -0
- package/examples/extensions/layers-growth/draft-input.json +31 -0
- package/examples/extensions/layers-growth/evidence.json +17 -0
- package/examples/extensions/layers-growth/extension.yaml +200 -0
- package/examples/extensions/layers-growth/integration.md +122 -0
- package/examples/extensions/layers-growth/output.json +23 -0
- package/examples/extensions/layers-growth/pack.yaml +58 -0
- package/examples/extensions/layers-growth/read-input.json +11 -0
- package/examples/extensions/postiz-social/README.md +11 -0
- package/examples/extensions/postiz-social/extension.yaml +178 -0
- package/examples/extensions/postiz-social/integration.md +24 -0
- package/examples/extensions/postiz-social/schemas/post.evidence.json +13 -0
- package/examples/extensions/postiz-social/schemas/post.input.json +13 -0
- package/examples/extensions/postiz-social/schemas/post.output.json +11 -0
- package/examples/extensions/store-screenshot-compose/README.md +108 -0
- package/examples/extensions/store-screenshot-compose/compose.mjs +683 -0
- package/examples/extensions/store-screenshot-compose/compositor.md +51 -0
- package/examples/extensions/store-screenshot-compose/copy.sample.json +28 -0
- package/examples/extensions/store-screenshot-compose/extension.yaml +212 -0
- package/examples/extensions/store-screenshot-compose/pack.yaml +60 -0
- package/examples/extensions/store-screenshot-compose/schemas/compose-layout.input.json +17 -0
- package/examples/extensions/store-screenshot-compose/schemas/compose-layout.output.json +32 -0
- package/examples/extensions/store-screenshot-compose/schemas/export-localized.input.json +28 -0
- package/examples/extensions/store-screenshot-compose/schemas/export-localized.output.json +29 -0
- package/examples/extensions/store-screenshot-compose/schemas/provenance.evidence.json +80 -0
- package/examples/extensions/store-screenshot-compose/schemas/validate-deliverables.evidence.json +41 -0
- package/examples/extensions/store-screenshot-compose/schemas/validate-deliverables.input.json +12 -0
- package/examples/extensions/store-screenshot-compose/schemas/validate-deliverables.output.json +56 -0
- package/examples/extensions/store-screenshot-compose/templates/device-well.svg.tmpl +8 -0
- package/examples/extensions/store-screenshot-compose/wells.json +38 -0
- package/examples/extensions/superwall-ios/README.md +47 -0
- package/examples/extensions/superwall-ios/dependency-checksums.json +6 -0
- package/examples/extensions/superwall-ios/evidence.json +19 -0
- package/examples/extensions/superwall-ios/extension.yaml +174 -0
- package/examples/extensions/superwall-ios/input.json +15 -0
- package/examples/extensions/superwall-ios/integration.md +9 -0
- package/examples/extensions/superwall-ios/local-proof.json +44 -0
- package/examples/extensions/superwall-ios/native/Package.resolved +32 -0
- package/examples/extensions/superwall-ios/native/Package.swift +20 -0
- package/examples/extensions/superwall-ios/native/Sources/MonetizationCore/EntitlementState.swift +54 -0
- package/examples/extensions/superwall-ios/native/Sources/MonetizationNative/RevenueCatController.swift +129 -0
- package/examples/extensions/superwall-ios/native/Tests/MonetizationCoreTests/EntitlementStateTests.swift +46 -0
- package/examples/extensions/superwall-ios/output.json +16 -0
- package/examples/extensions/superwall-ios/pack.yaml +56 -0
- package/examples/extensions/support-case/README.md +7 -0
- package/examples/extensions/support-case/evidence.json +21 -0
- package/examples/extensions/support-case/extension.yaml +83 -0
- package/examples/extensions/support-case/input.json +16 -0
- package/examples/extensions/support-case/output.json +18 -0
- package/examples/extensions/support-case/pack.yaml +38 -0
- package/examples/extensions/support-case/support.md +3 -0
- package/examples/workspace/README.md +3 -0
- package/examples/workspace/business/DESIGN.md +338 -0
- package/examples/workspace/business/PRODUCT.md +91 -0
- package/examples/workspace/business/README.md +20 -0
- package/examples/workspace/business/analytics/ANALYTICS.md +186 -0
- package/examples/workspace/business/analytics/README.md +3 -0
- package/examples/workspace/business/analytics/analytics-plan.html +14 -0
- package/examples/workspace/business/analytics/posthog-proof.example.json +11 -0
- package/examples/workspace/business/design/README.md +12 -0
- package/examples/workspace/business/design/design-room.html +219 -0
- package/examples/workspace/business/design/motion-catalog/DemoBloom.swift +208 -0
- package/examples/workspace/business/design/motion-catalog/DemoCardReveal.swift +312 -0
- package/examples/workspace/business/design/motion-catalog/DemoExtrude.swift +255 -0
- package/examples/workspace/business/design/motion-catalog/DemoGesture.swift +315 -0
- package/examples/workspace/business/design/motion-catalog/DemoGrid.swift +215 -0
- package/examples/workspace/business/design/motion-catalog/DemoMascot.swift +535 -0
- package/examples/workspace/business/design/motion-catalog/DemoMeter.swift +335 -0
- package/examples/workspace/business/design/motion-catalog/DemoScratch.swift +357 -0
- package/examples/workspace/business/design/motion-catalog/DemoScrub.swift +267 -0
- package/examples/workspace/business/design/motion-catalog/DemoShiny.swift +325 -0
- package/examples/workspace/business/design/motion-catalog/DemoSphereCloud.swift +337 -0
- package/examples/workspace/business/design/motion-catalog/DemoTreasure.swift +484 -0
- package/examples/workspace/business/design/motion-catalog/MotionLabControls.swift +48 -0
- package/examples/workspace/business/design/motion-catalog/MotionLabIndex.swift +120 -0
- package/examples/workspace/business/design/motion-catalog/MotionLabTheme.swift +54 -0
- package/examples/workspace/business/design/motion-catalog/README.md +74 -0
- package/examples/workspace/business/design/motion-catalog/TokenSpring.swift +96 -0
- package/examples/workspace/business/design/motion-catalog/motion-tokens.ts +109 -0
- package/examples/workspace/business/design/system/DesignTokens.swift +57 -0
- package/examples/workspace/business/design/system/PremiumCraft.swift +352 -0
- package/examples/workspace/business/design/system/design-tokens.ts +84 -0
- package/examples/workspace/business/design/system/design_tokens.dart +14 -0
- package/examples/workspace/business/design/system/tokens.css +45 -0
- package/examples/workspace/business/design/system/tokens.json +313 -0
- package/examples/workspace/business/engineering/ACCESSIBILITY_READINESS.md +10 -0
- package/examples/workspace/business/engineering/APP_QUALITY.md +23 -0
- package/examples/workspace/business/engineering/ENGINEERING_PLAN.md +13 -0
- package/examples/workspace/business/engineering/PRODUCTION_READINESS.md +91 -0
- package/examples/workspace/business/engineering/README.md +3 -0
- package/examples/workspace/business/engineering/TECH_SPEC.md +57 -0
- package/examples/workspace/business/engineering/app-agent-roster/APP_AGENTS.md +88 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/accessibility-device-qa.md +36 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/backend-infrastructure-engineer.md +36 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/copy-specialist.md +36 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/customer-success.md +54 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/design-guru.md +56 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/engineering-leader.md +60 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/launch-surface-producer.md +118 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/marketing-guru.md +59 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/mobile-engineer.md +36 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/operator-readiness.md +61 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/orchestrator.md +56 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/product-leader.md +52 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/research-strategist.md +36 -0
- package/examples/workspace/business/engineering/app-agent-roster/agents/security-architect.md +63 -0
- package/examples/workspace/business/growth/DEMO_VIDEO.md +44 -0
- package/examples/workspace/business/growth/EMAIL_OPS.md +109 -0
- package/examples/workspace/business/growth/FASTLANE_OPS.md +5 -0
- package/examples/workspace/business/growth/LAUNCH_NARRATIVE.md +241 -0
- package/examples/workspace/business/growth/PAID_UA.md +142 -0
- package/examples/workspace/business/growth/README.md +3 -0
- package/examples/workspace/business/growth/UGC_PLAYBOOK.md +21 -0
- package/examples/workspace/business/growth/VIRAL_GROWTH.md +130 -0
- package/examples/workspace/business/growth/content-assets/CONTENT_ASSETS.md +127 -0
- package/examples/workspace/business/growth/content-assets/content-assets.html +97 -0
- package/examples/workspace/business/growth/content-assets/manifest.json +73 -0
- package/examples/workspace/business/growth/content-assets/remotion-README.md +26 -0
- package/examples/workspace/business/growth/content-intelligence.csv +1 -0
- package/examples/workspace/business/growth/format-lab.csv +2 -0
- package/examples/workspace/business/growth/landing/README.md +81 -0
- package/examples/workspace/business/growth/landing/lib/motion-tokens.ts +103 -0
- package/examples/workspace/business/growth/landing/lib/scene-progress.ts +286 -0
- package/examples/workspace/business/growth/landing/lib/scroll-scene-controller.ts +464 -0
- package/examples/workspace/business/growth/landing/motion.css +405 -0
- package/examples/workspace/business/growth/landing/scrollytelling.portable.example.html +156 -0
- package/examples/workspace/business/growth/landing/sections/Bento.tsx +51 -0
- package/examples/workspace/business/growth/landing/sections/Cta.tsx +48 -0
- package/examples/workspace/business/growth/landing/sections/Hero.tsx +62 -0
- package/examples/workspace/business/growth/landing/sections/Marquee.tsx +34 -0
- package/examples/workspace/business/growth/landing/sections/Pricing.tsx +73 -0
- package/examples/workspace/business/growth/landing/sections/Scrollytelling.tsx +193 -0
- package/examples/workspace/business/growth/landing/sections/Stats.tsx +74 -0
- package/examples/workspace/business/growth/landing/sections/Testimonials.tsx +61 -0
- package/examples/workspace/business/growth/landing/surface-contract.example.json +790 -0
- package/examples/workspace/business/growth/paid-ua-report.csv +2 -0
- package/examples/workspace/business/growth/resend/email-templates.ts +608 -0
- package/examples/workspace/business/operations/AGENT_OPERATIONS.md +56 -0
- package/examples/workspace/business/operations/BUSINESS_ACCESS.md +114 -0
- package/examples/workspace/business/operations/FAILURE_CARDS.md +21 -0
- package/examples/workspace/business/operations/LAUNCH_RETRO.md +53 -0
- package/examples/workspace/business/operations/METRIC_CONTRACTS.md +48 -0
- package/examples/workspace/business/operations/ORCHESTRATION.md +142 -0
- package/examples/workspace/business/operations/POST_LAUNCH_OPS.md +84 -0
- package/examples/workspace/business/operations/PROVIDER_PROOF.md +20 -0
- package/examples/workspace/business/operations/README.md +3 -0
- package/examples/workspace/business/operations/agent-operations.json +130 -0
- package/examples/workspace/business/operations/agent-operations.schema.json +274 -0
- package/examples/workspace/business/operations/business-access.json +418 -0
- package/examples/workspace/business/operations/business-access.schema.json +285 -0
- package/examples/workspace/business/operations/metric-contracts.json +346 -0
- package/examples/workspace/business/operations/metric-contracts.schema.json +255 -0
- package/examples/workspace/business/operations/orchestration.html +326 -0
- package/examples/workspace/business/product/ONBOARDING.md +306 -0
- package/examples/workspace/business/product/README.md +8 -0
- package/examples/workspace/business/product/copy/COPY_BRIEF.md +64 -0
- package/examples/workspace/business/product/copy/COPY_DECK.md +84 -0
- package/examples/workspace/business/product/experience/11-star-experience/11-star-experience.html +326 -0
- package/examples/workspace/business/product/experience/11-star-experience/11_STAR_EXPERIENCE.md +93 -0
- package/examples/workspace/business/product/experience/emotional-design/EMOTIONAL_AUDIT.md +608 -0
- package/examples/workspace/business/product/experience/emotional-design/EMOTIONAL_DESIGN.md +355 -0
- package/examples/workspace/business/product/experience/emotional-design/emotional-design.html +737 -0
- package/examples/workspace/business/product/experience/ux-patterns/UX_PATTERNS.md +144 -0
- package/examples/workspace/business/product/experience/ux-patterns/ux-patterns.html +102 -0
- package/examples/workspace/business/product/onboarding.html +58 -0
- package/examples/workspace/business/product.yaml +125 -0
- package/examples/workspace/business/revenue/README.md +3 -0
- package/examples/workspace/business/revenue/REVENUE_OPS.md +210 -0
- package/examples/workspace/business/revenue/revenuecat-proof.example.json +16 -0
- package/examples/workspace/business/revenue/revenuecat-proof.md +70 -0
- package/examples/workspace/business/state/LAUNCH_TRACE.md +29 -0
- package/examples/workspace/business/state/README.md +9 -0
- package/examples/workspace/business/state/business-state.json +520 -0
- package/examples/workspace/business/store/APPLE_APP_STORE_REQUIREMENTS.md +84 -0
- package/examples/workspace/business/store/APPLE_SIGNING.md +103 -0
- package/examples/workspace/business/store/APP_REVIEW.md +10 -0
- package/examples/workspace/business/store/GOOGLE_PLAY_RELEASE.md +71 -0
- package/examples/workspace/business/store/MARKETPLACE_COMPLIANCE.md +8 -0
- package/examples/workspace/business/store/README.md +3 -0
- package/examples/workspace/business/store/STORE_CONSOLE.md +62 -0
- package/examples/workspace/business/store/app-store-listing/APP_STORE_LISTING.md +160 -0
- package/examples/workspace/business/store/app-store-listing/SCREENSHOTS.md +246 -0
- package/examples/workspace/business/store/app-store-listing/SCREENSHOT_RUBRIC.md +202 -0
- package/examples/workspace/business/store/app-store-listing/app-privacy-questionnaire.html +156 -0
- package/examples/workspace/business/store/app-store-listing/app-store-listing.html +154 -0
- package/examples/workspace/business/store/app-store-listing/screenshot-rubric-scores.example.json +117 -0
- package/examples/workspace/business/store/store-console.html +271 -0
- package/examples/workspace/business/strategy/BRAND.md +48 -0
- package/examples/workspace/business/strategy/OFFER_TEST.md +43 -0
- package/examples/workspace/business/strategy/PORTFOLIO_REGISTRY.md +34 -0
- package/examples/workspace/business/strategy/README.md +3 -0
- package/examples/workspace/business/strategy/RESEARCH.md +87 -0
- package/examples/workspace/business/strategy/SIGNAL_CORPUS.md +34 -0
- package/examples/workspace/business/strategy/TOOL_DECISIONS.md +30 -0
- package/examples/workspace/business/strategy/localization-market-research/LOCALIZATION_MARKET_RESEARCH.md +93 -0
- package/examples/workspace/business/strategy/localization-market-research/localization-market-research.html +62 -0
- package/examples/workspace/business/studio/seed/business.json +57 -0
- package/examples/workspace/business/trust/AI_SAFETY.md +10 -0
- package/examples/workspace/business/trust/COMMUNITY_SAFETY.md +10 -0
- package/examples/workspace/business/trust/PRIVACY.md +31 -0
- package/examples/workspace/business/trust/README.md +3 -0
- package/examples/workspace/business/trust/SECURITY.md +145 -0
- package/examples/workspace/business/trust/TERMS.md +21 -0
- package/examples/workspace/business/trust/secrets/.env.example +2 -0
- package/examples/workspace/business/trust/secrets/SECRETS.md +77 -0
- package/examples/workspace/business/trust/secrets/doppler.yaml +3 -0
- package/examples/workspace/business/trust/security-review.html +373 -0
- package/examples/workspace/business/ugc/script-bank.md +9 -0
- package/kernel/autonomy/budget.ts +130 -0
- package/kernel/autonomy/evaluator.ts +136 -0
- package/kernel/autonomy/grants.ts +124 -0
- package/kernel/autonomy/killswitch.ts +27 -0
- package/kernel/autonomy/prerequisites.ts +94 -0
- package/kernel/autonomy/probes/budget.ts +55 -0
- package/kernel/autonomy/probes/doppler.ts +66 -0
- package/kernel/autonomy/standing-approvals.ts +336 -0
- package/kernel/autonomy/waivers.ts +129 -0
- package/kernel/composition/activation.ts +471 -0
- package/kernel/composition/compile-bindings.ts +297 -0
- package/kernel/composition/notices.ts +226 -0
- package/kernel/composition/onboarding-selection.ts +210 -0
- package/kernel/composition/providers.ts +43 -0
- package/kernel/composition/resolve.ts +252 -0
- package/kernel/composition/resources.ts +298 -0
- package/kernel/composition/semantic-plan-lower.ts +831 -0
- package/kernel/composition/worker-context.ts +63 -0
- package/kernel/context/budget.ts +16 -0
- package/kernel/context/compile.ts +66 -0
- package/kernel/context/receipt.ts +34 -0
- package/kernel/context/selectors.ts +30 -0
- package/kernel/contribution/accepted-upstreams.ts +83 -0
- package/kernel/contribution/adoption-map.ts +153 -0
- package/kernel/contribution/check.ts +197 -0
- package/kernel/contribution/evaluate.ts +275 -0
- package/kernel/contribution/existing-owners.ts +115 -0
- package/kernel/contribution/github-metadata.ts +241 -0
- package/kernel/contribution/host-observe.ts +146 -0
- package/kernel/contribution/intake.ts +611 -0
- package/kernel/contribution/manifest-io.ts +277 -0
- package/kernel/contribution/plan.ts +422 -0
- package/kernel/contribution/preview.ts +217 -0
- package/kernel/contribution/provider-capability-delta.ts +178 -0
- package/kernel/contribution/service.ts +291 -0
- package/kernel/contribution/types.ts +180 -0
- package/kernel/contribution/untrusted.ts +198 -0
- package/kernel/contribution/upstream-coverage.ts +116 -0
- package/kernel/contribution/upstreams-load.ts +184 -0
- package/kernel/contribution/upstreams.ts +1206 -0
- package/kernel/engine/artifact-fingerprint.ts +25 -0
- package/kernel/engine/compile.ts +419 -0
- package/kernel/engine/design-taste-authority.ts +264 -0
- package/kernel/engine/dispatch.ts +96 -0
- package/kernel/engine/founder-decision-receipt.ts +580 -0
- package/kernel/engine/founder-trust-store.ts +771 -0
- package/kernel/engine/frontier.ts +157 -0
- package/kernel/engine/node-brief.ts +285 -0
- package/kernel/engine/proof-rung.ts +95 -0
- package/kernel/engine/review-evidence.ts +343 -0
- package/kernel/engine/review-facet.ts +9 -0
- package/kernel/engine/runstate.ts +1113 -0
- package/kernel/engine/source-fingerprint.ts +100 -0
- package/kernel/engine/verification-policy.ts +6 -0
- package/kernel/engine/verification.ts +154 -0
- package/kernel/knowledge-service/journey.ts +50 -0
- package/kernel/knowledge-service/projection-helpers.ts +306 -0
- package/kernel/knowledge-service/sections.ts +68 -0
- package/kernel/knowledge-service/semantic-graph-views.ts +727 -0
- package/kernel/knowledge-service/service.ts +835 -0
- package/kernel/knowledge-service/tools.ts +118 -0
- package/kernel/knowledge-service/types.ts +236 -0
- package/kernel/lib/atomic-file.ts +34 -0
- package/kernel/lib/bounded-file.ts +24 -0
- package/kernel/lib/cli.ts +44 -0
- package/kernel/lib/empty-equivalent-evidence.ts +35 -0
- package/kernel/lib/later-guidance.ts +128 -0
- package/kernel/lib/required-table-section.ts +679 -0
- package/kernel/operating-model/agreements.ts +29 -0
- package/kernel/operating-model/authorize.ts +117 -0
- package/kernel/operating-model/erasure-metadata.ts +19 -0
- package/kernel/operating-model/events.ts +142 -0
- package/kernel/operating-model/mandates.ts +81 -0
- package/kernel/operating-model/market-experiment.ts +354 -0
- package/kernel/operating-model/measurement.ts +542 -0
- package/kernel/operating-model/parties.ts +23 -0
- package/kernel/operating-model/projections.ts +111 -0
- package/kernel/operating-model/types.ts +306 -0
- package/kernel/operating-model/validate.ts +388 -0
- package/kernel/reducer/audit.ts +146 -0
- package/kernel/reducer/cli.ts +552 -0
- package/kernel/reducer/current-truth.ts +432 -0
- package/kernel/reducer/erasure-guard.ts +17 -0
- package/kernel/reducer/erasure.ts +741 -0
- package/kernel/reducer/lock.ts +169 -0
- package/kernel/reducer/patch.ts +395 -0
- package/kernel/reducer/semantic-batch-ownership.ts +36 -0
- package/kernel/reducer/semantic-graph-ownership.ts +54 -0
- package/kernel/reducer/shared-claims.ts +133 -0
- package/kernel/routing/eligibility.ts +71 -0
- package/kernel/routing/rank.ts +21 -0
- package/kernel/routing/resolve.ts +97 -0
- package/kernel/routing/signals.ts +28 -0
- package/kernel/routing/types.ts +84 -0
- package/kernel/schema/app-review-webhook-envelope.schema.json +39 -0
- package/kernel/schema/app-review.schema.json +1504 -0
- package/kernel/schema/budget-ledger.schema.json +84 -0
- package/kernel/schema/business-state.schema.json +909 -0
- package/kernel/schema/checkpoint.schema.json +17 -0
- package/kernel/schema/control.schema.json +40 -0
- package/kernel/schema/current-truth.schema.json +56 -0
- package/kernel/schema/domain-authority.ts +22 -0
- package/kernel/schema/evidence-grammar.ts +132 -0
- package/kernel/schema/evidence-schema-version.json +5 -0
- package/kernel/schema/evidence-schema-version.ts +82 -0
- package/kernel/schema/grants.schema.json +102 -0
- package/kernel/schema/index.ts +518 -0
- package/kernel/schema/market-experiment.schema.json +212 -0
- package/kernel/schema/metric-contracts.schema.json +601 -0
- package/kernel/schema/offer-test.schema.json +88 -0
- package/kernel/schema/operation-envelope.schema.json +31 -0
- package/kernel/schema/research-evidence.schema.json +144 -0
- package/kernel/schema/run-state.schema.json +430 -0
- package/kernel/schema/signal-corpus.schema.json +94 -0
- package/kernel/schema/status.schema.json +25 -0
- package/kernel/schema/types.ts +701 -0
- package/kernel/schema/waivers.schema.json +97 -0
- package/kernel/services/business.ts +431 -0
- package/kernel/services/installed-composition.ts +146 -0
- package/kernel/services/lifecycle.ts +262 -0
- package/kernel/services/plan-projection.ts +230 -0
- package/kernel/services/research-decision.ts +234 -0
- package/kernel/services/research.ts +102 -0
- package/kernel/services/source-projection.ts +503 -0
- package/kernel/session/app-review-ingress.ts +254 -0
- package/kernel/session/approve.ts +411 -0
- package/kernel/session/attempt-failure.ts +113 -0
- package/kernel/session/bootstrap.ts +497 -0
- package/kernel/session/brief.ts +94 -0
- package/kernel/session/catalog-contract.ts +293 -0
- package/kernel/session/check.ts +206 -0
- package/kernel/session/deterministic-gates.ts +76 -0
- package/kernel/session/digest.ts +405 -0
- package/kernel/session/doctor-host.ts +219 -0
- package/kernel/session/doctor.ts +387 -0
- package/kernel/session/executor.ts +934 -0
- package/kernel/session/firstparty-worker-host.ts +30 -0
- package/kernel/session/founder-brief.ts +110 -0
- package/kernel/session/founder-gate.ts +188 -0
- package/kernel/session/founder-key.ts +119 -0
- package/kernel/session/initialization-guard.ts +17 -0
- package/kernel/session/initialize.ts +209 -0
- package/kernel/session/input-inventory.ts +217 -0
- package/kernel/session/inspect.ts +304 -0
- package/kernel/session/ios-proof-receipt.ts +273 -0
- package/kernel/session/market-experiment.ts +81 -0
- package/kernel/session/new.ts +202 -0
- package/kernel/session/onboard.ts +551 -0
- package/kernel/session/operate-bind.ts +58 -0
- package/kernel/session/operate.ts +239 -0
- package/kernel/session/operating-service.ts +452 -0
- package/kernel/session/operating-transport.ts +125 -0
- package/kernel/session/operating-types.ts +107 -0
- package/kernel/session/operation-routes.ts +673 -0
- package/kernel/session/plan.ts +667 -0
- package/kernel/session/planning-context.ts +96 -0
- package/kernel/session/planning-limits.ts +2 -0
- package/kernel/session/proof.ts +302 -0
- package/kernel/session/reducer-cli.ts +30 -0
- package/kernel/session/research-observations.ts +59 -0
- package/kernel/session/research-proof-projection.ts +76 -0
- package/kernel/session/route-scoring.ts +560 -0
- package/kernel/session/route-utterance.ts +486 -0
- package/kernel/session/run.ts +2214 -0
- package/kernel/session/runtime-write-audit.ts +44 -0
- package/kernel/session/scope.ts +85 -0
- package/kernel/session/semantic-batch.ts +834 -0
- package/kernel/session/setup.ts +142 -0
- package/kernel/session/status.ts +397 -0
- package/kernel/session/stepper.ts +258 -0
- package/kernel/session/update.ts +106 -0
- package/kernel/session/verify.ts +135 -0
- package/kernel/session/worker-prompt.ts +572 -0
- package/kernel/session/workspace-revision.ts +59 -0
- package/kernel/session/workspaces.ts +73 -0
- package/kernel/work-orders/instantiate.ts +68 -0
- package/kernel/work-orders/lifecycle.ts +178 -0
- package/kernel/work-orders/outcomes.ts +161 -0
- package/kernel/work-orders/types.ts +64 -0
- package/knowledge/README.md +81 -0
- package/knowledge/data/analytics-attribution.md +317 -0
- package/knowledge/data/posthog-agent-tooling.md +101 -0
- package/knowledge/design/audience-derived-identity.md +55 -0
- package/knowledge/design/consumer-craft-benchmarks.md +72 -0
- package/knowledge/design/design-acceptance.md +199 -0
- package/knowledge/design/design-evidence-stack.md +130 -0
- package/knowledge/design/design-room.md +83 -0
- package/knowledge/design/design-visual-system.md +247 -0
- package/knowledge/design/design-worthiness.md +188 -0
- package/knowledge/design/editorial-scrollytelling.md +239 -0
- package/knowledge/design/landing-motion-craft.md +67 -0
- package/knowledge/design/mobile-flow-craft.md +177 -0
- package/knowledge/design/motion-craft-benchmarks.md +340 -0
- package/knowledge/design/premium-mobile-craft.md +137 -0
- package/knowledge/design/quality-lens.md +100 -0
- package/knowledge/design/refero-ux-patterns.md +131 -0
- package/knowledge/design/remotion-content-assets.md +370 -0
- package/knowledge/design/surfaces-b2c.md +84 -0
- package/knowledge/design/vibecoded-tells.md +129 -0
- package/knowledge/engineering/accessibility-readiness.md +24 -0
- package/knowledge/engineering/app-agent-roster.md +120 -0
- package/knowledge/engineering/app-quality.md +19 -0
- package/knowledge/engineering/backend-data-contract.md +187 -0
- package/knowledge/engineering/engineering-orchestration.md +365 -0
- package/knowledge/engineering/expo-compatibility.md +74 -0
- package/knowledge/engineering/expo-operations-map.md +84 -0
- package/knowledge/engineering/expo-stack-selection.md +75 -0
- package/knowledge/engineering/external-skill-packs.md +47 -0
- package/knowledge/engineering/mobai-toolbelt.md +389 -0
- package/knowledge/engineering/recommended-agent-skills.md +109 -0
- package/knowledge/engineering/technical-documentation-ste100.md +89 -0
- package/knowledge/engineering/xcodebuildmcp-testing.md +502 -0
- package/knowledge/experience/commitment-funnel.md +90 -0
- package/knowledge/experience/consumer-product-design-agency.md +268 -0
- package/knowledge/experience/eleven-star-experience.md +194 -0
- package/knowledge/experience/emotional-design-system.md +412 -0
- package/knowledge/experience/emotional-experience-design.md +359 -0
- package/knowledge/experience/emotional-experience-measurement.md +433 -0
- package/knowledge/experience/ethics-guardrail.md +460 -0
- package/knowledge/experience/experience-cards/commitment-card.md +36 -0
- package/knowledge/experience/experience-cards/endowed-progress-card.md +34 -0
- package/knowledge/experience/experience-cards/fresh-start-card.md +34 -0
- package/knowledge/experience/experience-cards/identity-and-self-expression-card.md +35 -0
- package/knowledge/experience/experience-cards/intent-mirroring-card.md +36 -0
- package/knowledge/experience/experience-cards/mastery-and-status-card.md +43 -0
- package/knowledge/experience/experience-cards/peak-end-card.md +44 -0
- package/knowledge/experience/experience-cards/perceived-effort-delay-card.md +37 -0
- package/knowledge/experience/experience-cards/reciprocity-card.md +38 -0
- package/knowledge/experience/experience-cards/recovery-and-trust-repair-card.md +40 -0
- package/knowledge/experience/experience-cards/streak-and-loss-aversion-card.md +37 -0
- package/knowledge/experience/experience-cards/variable-reward-card.md +42 -0
- package/knowledge/experience/experience-cards.md +172 -0
- package/knowledge/experience/onboarding-conversion.md +422 -0
- package/knowledge/experience/onboarding-foundations.md +264 -0
- package/knowledge/experience/paywall-goal-headline.md +99 -0
- package/knowledge/experience/push-notification-lifecycle.md +79 -0
- package/knowledge/growth/appsflyer-mmp.md +99 -0
- package/knowledge/growth/cro-landing.md +86 -0
- package/knowledge/growth/fastlane-growth-ops.md +321 -0
- package/knowledge/growth/geo-seo.md +163 -0
- package/knowledge/growth/hdyhau-blended-roas.md +75 -0
- package/knowledge/growth/influencer-sponsorship-engine.md +224 -0
- package/knowledge/growth/ios-consumer-playbook-intake.md +65 -0
- package/knowledge/growth/launch-narrative-cadence.md +340 -0
- package/knowledge/growth/non-competitor-angle-discovery.md +80 -0
- package/knowledge/growth/paid-user-acquisition.md +283 -0
- package/knowledge/growth/ugc-creator-engine.md +259 -0
- package/knowledge/growth/viral-growth-loops.md +174 -0
- package/knowledge/money/billing-health-and-reactivation.md +54 -0
- package/knowledge/money/offer-and-pricing-decisions.md +33 -0
- package/knowledge/money/paywall-pricing-and-experiments.md +97 -0
- package/knowledge/money/revenue-monetization.md +107 -0
- package/knowledge/money/revenuecat-agent-tooling.md +174 -0
- package/knowledge/money/revenuecat-and-store-products.md +115 -0
- package/knowledge/money/stripe-and-web-billing.md +83 -0
- package/knowledge/money/subscription-price-derivation.md +105 -0
- package/knowledge/operations/autonomy-onboarding.md +269 -0
- package/knowledge/operations/doppler-organization.md +73 -0
- package/knowledge/operations/founder-zero-operator.md +184 -0
- package/knowledge/operations/frontier-agent-operations.md +189 -0
- package/knowledge/operations/paid-tool-routing.md +172 -0
- package/knowledge/operations/post-launch-operations.md +261 -0
- package/knowledge/operations/provider-state-recipes.md +80 -0
- package/knowledge/operations/resend-email-ops.md +339 -0
- package/knowledge/operations/secrets-management.md +215 -0
- package/knowledge/orchestration/compound-engineering-routing.md +101 -0
- package/knowledge/orchestration/dynamic-workflows.md +198 -0
- package/knowledge/orchestration/full-launch-program.md +179 -0
- package/knowledge/orchestration/isolated-review.md +144 -0
- package/knowledge/orchestration/parallel-agent-orchestration.md +335 -0
- package/knowledge/orchestration/project-state.md +96 -0
- package/knowledge/process/artifact-contracts.md +1527 -0
- package/knowledge/process/cascade-edges.yaml +217 -0
- package/knowledge/process/change-cascade.md +102 -0
- package/knowledge/process/current-truth.md +45 -0
- package/knowledge/process/failure-cards.md +114 -0
- package/knowledge/process/flow-traceability.md +189 -0
- package/knowledge/process/launch-coverage.md +298 -0
- package/knowledge/process/launch-phases.md +838 -0
- package/knowledge/process/learning-capture.md +77 -0
- package/knowledge/process/learnings/audit-runs-from-repo-root.md +22 -0
- package/knowledge/process/provider-contracts.md +49 -0
- package/knowledge/process/provider-proof.md +37 -0
- package/knowledge/process/repository-profiles.md +60 -0
- package/knowledge/process/tool-recipes/device-capture-and-proof.md +100 -0
- package/knowledge/process/tool-recipes/engineering-and-agent-orchestration.md +89 -0
- package/knowledge/process/tool-recipes/funnel-domain-and-privacy.md +142 -0
- package/knowledge/process/tool-recipes/growth-and-store-routing.md +192 -0
- package/knowledge/process/tool-recipes/research-intelligence.md +258 -0
- package/knowledge/process/tool-recipes/revenue-email-analytics.md +101 -0
- package/knowledge/process/tool-recipes/secrets-and-environment.md +35 -0
- package/knowledge/process/tool-recipes/visual-and-motion-production.md +457 -0
- package/knowledge/process/tool-recipes.md +67 -0
- package/knowledge/product/ai-chat-companion.md +96 -0
- package/knowledge/product/core-loop-and-complete-scope.md +82 -0
- package/knowledge/product/habit-tracker.md +89 -0
- package/knowledge/product/photo-ai-media.md +96 -0
- package/knowledge/product/product-moat.md +64 -0
- package/knowledge/product/social-network.md +117 -0
- package/knowledge/research/distribution-first-niche.md +70 -0
- package/knowledge/research/distribution-offer-signal.md +190 -0
- package/knowledge/research/go-pivot-or-kill.md +120 -0
- package/knowledge/research/localization-market-research.md +145 -0
- package/knowledge/research/transformation-demo.md +70 -0
- package/knowledge/store/age-rating-questionnaire.md +75 -0
- package/knowledge/store/app-review-observe.md +314 -0
- package/knowledge/store/app-review-remediate.md +125 -0
- package/knowledge/store/app-review-resubmit.md +128 -0
- package/knowledge/store/app-store-connect-cli.md +347 -0
- package/knowledge/store/app-store-listing-prep.md +277 -0
- package/knowledge/store/apple-signing-release.md +551 -0
- package/knowledge/store/aso-apple-keyword-evidence.md +112 -0
- package/knowledge/store/aso-store-ops.md +316 -0
- package/knowledge/store/google-play-release.md +200 -0
- package/knowledge/store/marketplace-regional-compliance.md +21 -0
- package/knowledge/store/screenshot-toolchain.md +130 -0
- package/knowledge/store/store-console-workflow.md +760 -0
- package/knowledge/trust/community-safety.md +18 -0
- package/knowledge/trust/generative-ai-safety.md +27 -0
- package/knowledge/trust/paid-generative-ai-controls.md +85 -0
- package/knowledge/trust/privacy-terms.md +192 -0
- package/knowledge/trust/security-release-hardening.md +169 -0
- package/knowledge/words/consumer-copy-benchmarks.md +111 -0
- package/knowledge/words/conversion-copy.md +181 -0
- package/knowledge/words/no-slop-writing.md +173 -0
- package/package.json +290 -0
- package/skill-version.json +149 -0
- package/surfaces/starters/ai-chat-companion/README.md +41 -0
- package/surfaces/starters/ai-chat-companion/prompts/00-positioning-strategy.md +45 -0
- package/surfaces/starters/ai-chat-companion/prompts/01-database-schema.md +44 -0
- package/surfaces/starters/ai-chat-companion/prompts/02-auth-system.md +38 -0
- package/surfaces/starters/ai-chat-companion/prompts/03-chat-core-loop.md +42 -0
- package/surfaces/starters/ai-chat-companion/prompts/04-model-integration.md +45 -0
- package/surfaces/starters/ai-chat-companion/prompts/05-memory-personalization.md +38 -0
- package/surfaces/starters/ai-chat-companion/prompts/06-usage-limits-metering.md +36 -0
- package/surfaces/starters/ai-chat-companion/prompts/07-stripe-monetization.md +34 -0
- package/surfaces/starters/ai-chat-companion/prompts/08-safety-and-moderation.md +39 -0
- package/surfaces/starters/ai-chat-companion/prompts/variants/companion-character.md +40 -0
- package/surfaces/starters/ai-chat-companion/prompts/variants/voice-first.md +37 -0
- package/surfaces/starters/ai-chat-companion/starter/.env.example +18 -0
- package/surfaces/starters/ai-chat-companion/starter/.github/workflows/ci.yml +30 -0
- package/surfaces/starters/ai-chat-companion/starter/.gitignore.template +9 -0
- package/surfaces/starters/ai-chat-companion/starter/README.md +48 -0
- package/surfaces/starters/ai-chat-companion/starter/app/api/chat/route.ts +70 -0
- package/surfaces/starters/ai-chat-companion/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/surfaces/starters/ai-chat-companion/starter/app/api/stripe/checkout/route.ts +28 -0
- package/surfaces/starters/ai-chat-companion/starter/app/api/stripe/webhook/route.ts +34 -0
- package/surfaces/starters/ai-chat-companion/starter/app/auth/confirm/route.ts +22 -0
- package/surfaces/starters/ai-chat-companion/starter/app/chat/page.tsx +78 -0
- package/surfaces/starters/ai-chat-companion/starter/app/layout.tsx +20 -0
- package/surfaces/starters/ai-chat-companion/starter/app/login/page.tsx +47 -0
- package/surfaces/starters/ai-chat-companion/starter/app/page.tsx +17 -0
- package/surfaces/starters/ai-chat-companion/starter/components/analytics-provider.tsx +14 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/analytics/events.ts +32 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/analytics/posthog-client.ts +28 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/billing/revenuecat.ts +27 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/billing/stripe.ts +15 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/strings.ts +32 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/supabase/client.ts +7 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/supabase/proxy.ts +29 -0
- package/surfaces/starters/ai-chat-companion/starter/lib/supabase/server.ts +23 -0
- package/surfaces/starters/ai-chat-companion/starter/next.config.ts +5 -0
- package/surfaces/starters/ai-chat-companion/starter/package-lock.json +1294 -0
- package/surfaces/starters/ai-chat-companion/starter/package.json +29 -0
- package/surfaces/starters/ai-chat-companion/starter/proxy.ts +12 -0
- package/surfaces/starters/ai-chat-companion/starter/supabase/migrations/0001_init.sql +78 -0
- package/surfaces/starters/ai-chat-companion/starter/supabase/tests/0001_rls.test.sql +75 -0
- package/surfaces/starters/ai-chat-companion/starter/tsconfig.json +41 -0
- package/surfaces/starters/habit-tracker/README.md +43 -0
- package/surfaces/starters/habit-tracker/prompts/00-positioning-strategy.md +47 -0
- package/surfaces/starters/habit-tracker/prompts/01-database-schema.md +54 -0
- package/surfaces/starters/habit-tracker/prompts/02-auth-system.md +42 -0
- package/surfaces/starters/habit-tracker/prompts/03-habit-core-loop.md +50 -0
- package/surfaces/starters/habit-tracker/prompts/04-reminders-and-streaks.md +58 -0
- package/surfaces/starters/habit-tracker/prompts/05-stats-and-insights.md +44 -0
- package/surfaces/starters/habit-tracker/prompts/06-paywall-and-monetization.md +50 -0
- package/surfaces/starters/habit-tracker/prompts/07-social-accountability.md +49 -0
- package/surfaces/starters/habit-tracker/prompts/variants/simple-counter-utility.md +43 -0
- package/surfaces/starters/habit-tracker/prompts/variants/wellness-coach.md +44 -0
- package/surfaces/starters/habit-tracker/starter/.env.example +14 -0
- package/surfaces/starters/habit-tracker/starter/.github/workflows/ci.yml +30 -0
- package/surfaces/starters/habit-tracker/starter/.gitignore.template +9 -0
- package/surfaces/starters/habit-tracker/starter/README.md +48 -0
- package/surfaces/starters/habit-tracker/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/surfaces/starters/habit-tracker/starter/app/api/stripe/checkout/route.ts +28 -0
- package/surfaces/starters/habit-tracker/starter/app/api/stripe/webhook/route.ts +34 -0
- package/surfaces/starters/habit-tracker/starter/app/auth/confirm/route.ts +22 -0
- package/surfaces/starters/habit-tracker/starter/app/layout.tsx +20 -0
- package/surfaces/starters/habit-tracker/starter/app/login/page.tsx +47 -0
- package/surfaces/starters/habit-tracker/starter/app/page.tsx +17 -0
- package/surfaces/starters/habit-tracker/starter/app/today/page.tsx +27 -0
- package/surfaces/starters/habit-tracker/starter/components/analytics-provider.tsx +14 -0
- package/surfaces/starters/habit-tracker/starter/lib/analytics/events.ts +29 -0
- package/surfaces/starters/habit-tracker/starter/lib/analytics/posthog-client.ts +28 -0
- package/surfaces/starters/habit-tracker/starter/lib/billing/revenuecat.ts +27 -0
- package/surfaces/starters/habit-tracker/starter/lib/billing/stripe.ts +15 -0
- package/surfaces/starters/habit-tracker/starter/lib/strings.ts +27 -0
- package/surfaces/starters/habit-tracker/starter/lib/supabase/client.ts +7 -0
- package/surfaces/starters/habit-tracker/starter/lib/supabase/proxy.ts +29 -0
- package/surfaces/starters/habit-tracker/starter/lib/supabase/server.ts +23 -0
- package/surfaces/starters/habit-tracker/starter/next.config.ts +5 -0
- package/surfaces/starters/habit-tracker/starter/package-lock.json +1222 -0
- package/surfaces/starters/habit-tracker/starter/package.json +28 -0
- package/surfaces/starters/habit-tracker/starter/proxy.ts +12 -0
- package/surfaces/starters/habit-tracker/starter/supabase/migrations/0001_init.sql +84 -0
- package/surfaces/starters/habit-tracker/starter/supabase/tests/0001_rls.test.sql +75 -0
- package/surfaces/starters/habit-tracker/starter/tsconfig.json +41 -0
- package/surfaces/starters/photo-ai-media/README.md +40 -0
- package/surfaces/starters/photo-ai-media/prompts/00-positioning-strategy.md +51 -0
- package/surfaces/starters/photo-ai-media/prompts/01-database-schema.md +55 -0
- package/surfaces/starters/photo-ai-media/prompts/02-auth-system.md +39 -0
- package/surfaces/starters/photo-ai-media/prompts/03-capture-and-library.md +42 -0
- package/surfaces/starters/photo-ai-media/prompts/04-ai-generation-pipeline.md +46 -0
- package/surfaces/starters/photo-ai-media/prompts/05-editing-and-presets.md +40 -0
- package/surfaces/starters/photo-ai-media/prompts/06-credits-and-monetization.md +47 -0
- package/surfaces/starters/photo-ai-media/prompts/07-sharing-and-virality.md +39 -0
- package/surfaces/starters/photo-ai-media/prompts/08-content-safety-and-rights.md +49 -0
- package/surfaces/starters/photo-ai-media/prompts/variants/avatar-headshot-studio.md +43 -0
- package/surfaces/starters/photo-ai-media/prompts/variants/photo-restoration.md +39 -0
- package/surfaces/starters/photo-ai-media/starter/.env.example +16 -0
- package/surfaces/starters/photo-ai-media/starter/.github/workflows/ci.yml +30 -0
- package/surfaces/starters/photo-ai-media/starter/.gitignore.template +9 -0
- package/surfaces/starters/photo-ai-media/starter/README.md +50 -0
- package/surfaces/starters/photo-ai-media/starter/app/api/generate/route.ts +47 -0
- package/surfaces/starters/photo-ai-media/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/surfaces/starters/photo-ai-media/starter/app/api/stripe/checkout/route.ts +28 -0
- package/surfaces/starters/photo-ai-media/starter/app/api/stripe/webhook/route.ts +34 -0
- package/surfaces/starters/photo-ai-media/starter/app/auth/confirm/route.ts +22 -0
- package/surfaces/starters/photo-ai-media/starter/app/layout.tsx +20 -0
- package/surfaces/starters/photo-ai-media/starter/app/library/page.tsx +29 -0
- package/surfaces/starters/photo-ai-media/starter/app/login/page.tsx +47 -0
- package/surfaces/starters/photo-ai-media/starter/app/page.tsx +17 -0
- package/surfaces/starters/photo-ai-media/starter/components/analytics-provider.tsx +14 -0
- package/surfaces/starters/photo-ai-media/starter/lib/analytics/events.ts +32 -0
- package/surfaces/starters/photo-ai-media/starter/lib/analytics/posthog-client.ts +28 -0
- package/surfaces/starters/photo-ai-media/starter/lib/billing/revenuecat.ts +27 -0
- package/surfaces/starters/photo-ai-media/starter/lib/billing/stripe.ts +15 -0
- package/surfaces/starters/photo-ai-media/starter/lib/strings.ts +27 -0
- package/surfaces/starters/photo-ai-media/starter/lib/supabase/client.ts +7 -0
- package/surfaces/starters/photo-ai-media/starter/lib/supabase/proxy.ts +29 -0
- package/surfaces/starters/photo-ai-media/starter/lib/supabase/server.ts +23 -0
- package/surfaces/starters/photo-ai-media/starter/next.config.ts +5 -0
- package/surfaces/starters/photo-ai-media/starter/package-lock.json +1222 -0
- package/surfaces/starters/photo-ai-media/starter/package.json +28 -0
- package/surfaces/starters/photo-ai-media/starter/proxy.ts +12 -0
- package/surfaces/starters/photo-ai-media/starter/supabase/migrations/0001_init.sql +74 -0
- package/surfaces/starters/photo-ai-media/starter/supabase/tests/0001_rls.test.sql +72 -0
- package/surfaces/starters/photo-ai-media/starter/tsconfig.json +41 -0
- package/surfaces/starters/social-network/README.md +41 -0
- package/surfaces/starters/social-network/prompts/00-niche-strategy.md +44 -0
- package/surfaces/starters/social-network/prompts/01-database-schema.md +37 -0
- package/surfaces/starters/social-network/prompts/02-auth-system.md +40 -0
- package/surfaces/starters/social-network/prompts/03-feed-and-posts.md +43 -0
- package/surfaces/starters/social-network/prompts/04-profiles-and-follow.md +41 -0
- package/surfaces/starters/social-network/prompts/05-search-and-discovery.md +36 -0
- package/surfaces/starters/social-network/prompts/06-direct-messages.md +32 -0
- package/surfaces/starters/social-network/prompts/07-stripe-monetization.md +41 -0
- package/surfaces/starters/social-network/prompts/08-invite-system.md +37 -0
- package/surfaces/starters/social-network/prompts/variants/image-first-instagram.md +34 -0
- package/surfaces/starters/social-network/prompts/variants/video-first-tiktok.md +40 -0
- package/surfaces/starters/social-network/starter/.env.example +14 -0
- package/surfaces/starters/social-network/starter/.github/workflows/ci.yml +30 -0
- package/surfaces/starters/social-network/starter/.gitignore.template +9 -0
- package/surfaces/starters/social-network/starter/README.md +47 -0
- package/surfaces/starters/social-network/starter/app/api/revenuecat/webhook/route.ts +21 -0
- package/surfaces/starters/social-network/starter/app/api/stripe/checkout/route.ts +28 -0
- package/surfaces/starters/social-network/starter/app/api/stripe/webhook/route.ts +34 -0
- package/surfaces/starters/social-network/starter/app/auth/confirm/route.ts +22 -0
- package/surfaces/starters/social-network/starter/app/feed/page.tsx +30 -0
- package/surfaces/starters/social-network/starter/app/layout.tsx +20 -0
- package/surfaces/starters/social-network/starter/app/login/page.tsx +47 -0
- package/surfaces/starters/social-network/starter/app/page.tsx +17 -0
- package/surfaces/starters/social-network/starter/components/analytics-provider.tsx +14 -0
- package/surfaces/starters/social-network/starter/lib/analytics/events.ts +31 -0
- package/surfaces/starters/social-network/starter/lib/analytics/posthog-client.ts +28 -0
- package/surfaces/starters/social-network/starter/lib/billing/revenuecat.ts +27 -0
- package/surfaces/starters/social-network/starter/lib/billing/stripe.ts +15 -0
- package/surfaces/starters/social-network/starter/lib/strings.ts +27 -0
- package/surfaces/starters/social-network/starter/lib/supabase/client.ts +7 -0
- package/surfaces/starters/social-network/starter/lib/supabase/proxy.ts +29 -0
- package/surfaces/starters/social-network/starter/lib/supabase/server.ts +23 -0
- package/surfaces/starters/social-network/starter/next.config.ts +5 -0
- package/surfaces/starters/social-network/starter/package-lock.json +1222 -0
- package/surfaces/starters/social-network/starter/package.json +28 -0
- package/surfaces/starters/social-network/starter/proxy.ts +12 -0
- package/surfaces/starters/social-network/starter/supabase/migrations/0001_init.sql +81 -0
- package/surfaces/starters/social-network/starter/supabase/tests/0001_rls.test.sql +70 -0
- package/surfaces/starters/social-network/starter/tsconfig.json +41 -0
- package/surfaces/studio/seed/schema/business.empty.json +45 -0
- package/surfaces/studio/seed/schema/business.schema.json +664 -0
- package/surfaces/ui-library/README.md +42 -0
- package/surfaces/ui-library/adapters/expo.json +57 -0
- package/surfaces/ui-library/adapters/swiftui.json +57 -0
- package/surfaces/ui-library/component-index.json +26 -0
- package/surfaces/ui-library/components/feedback.empty-state.md +22 -0
- package/surfaces/ui-library/components/feedback.haptics.md +21 -0
- package/surfaces/ui-library/components/feedback.skeleton.md +21 -0
- package/surfaces/ui-library/components/input.keyboard-behavior.md +22 -0
- package/surfaces/ui-library/components/interaction.press-feedback.md +22 -0
- package/surfaces/ui-library/schemas/adapter-manifest.schema.json +101 -0
- package/surfaces/ui-library/schemas/component-contract.schema.json +56 -0
- package/surfaces/ui-library/schemas/component-index.schema.json +34 -0
- package/surfaces/workspace-template/new-business/DESIGN.md +198 -0
- package/surfaces/workspace-template/new-business/PRODUCT.md +69 -0
- package/surfaces/workspace-template/new-business/operations/metric-contracts.json +34 -0
- package/surfaces/workspace-template/new-business/product.yaml +87 -0
- package/surfaces/workspace-template/new-business/strategy/OFFER_TEST.md +43 -0
- package/surfaces/workspace-template/new-business/strategy/RESEARCH.md +69 -0
- package/surfaces/workspace-template/new-business/strategy/SIGNAL_CORPUS.md +34 -0
- package/surfaces/workspace-template/repo-agent-entrypoints/.claude/settings.json +48 -0
- package/surfaces/workspace-template/repo-agent-entrypoints/.cursor/rules/agents.mdc +12 -0
- package/surfaces/workspace-template/repo-agent-entrypoints/AGENTS.md +102 -0
- package/surfaces/workspace-template/repo-agent-entrypoints/CLAUDE.md +14 -0
- package/tooling/README.md +3 -0
- package/tooling/browser-proof.ts +1254 -0
- package/tooling/calibrate-utterance-router.ts +374 -0
- package/tooling/catalog-scaffold.ts +181 -0
- package/tooling/ci-aggregate.mjs +105 -0
- package/tooling/ci-lane.mjs +275 -0
- package/tooling/copy-runtime-assets.mjs +18 -0
- package/tooling/export-task-skill.ts +181 -0
- package/tooling/grade-design-surface.ts +404 -0
- package/tooling/grade-screenshots.ts +586 -0
- package/tooling/knowledge.ts +219 -0
- package/tooling/lib/app-copy-rules.ts +428 -0
- package/tooling/lib/artifact-pages.ts +143 -0
- package/tooling/lib/audit-plan.ts +492 -0
- package/tooling/lib/canonical-json.ts +30 -0
- package/tooling/lib/cli-entrypoint.ts +12 -0
- package/tooling/lib/content-assets.ts +228 -0
- package/tooling/lib/design-exploration.ts +232 -0
- package/tooling/lib/design-md.ts +442 -0
- package/tooling/lib/design-state.ts +333 -0
- package/tooling/lib/design-taste-rubric.ts +375 -0
- package/tooling/lib/founder-copy.ts +548 -0
- package/tooling/lib/git-root.ts +12 -0
- package/tooling/lib/grading.ts +92 -0
- package/tooling/lib/html.ts +32 -0
- package/tooling/lib/knowledge-freshness-pin.ts +83 -0
- package/tooling/lib/launch-state.ts +965 -0
- package/tooling/lib/markdown-lite.ts +351 -0
- package/tooling/lib/no-slop-rules.ts +273 -0
- package/tooling/lib/packed-check.ts +69 -0
- package/tooling/lib/posthog-retention.ts +144 -0
- package/tooling/lib/render-artifact-page.ts +342 -0
- package/tooling/lib/runtime-sync-lib.ts +171 -0
- package/tooling/lib/script-paths.ts +131 -0
- package/tooling/lib/shard-pool.ts +121 -0
- package/tooling/lib/skill-root.ts +35 -0
- package/tooling/lib/source-freshness-state.ts +43 -0
- package/tooling/lib/source-http.ts +167 -0
- package/tooling/lib/spawn.ts +36 -0
- package/tooling/lib/tsx-bin.ts +65 -0
- package/tooling/lib/tsx-launcher.d.mts +4 -0
- package/tooling/lib/tsx-launcher.mjs +57 -0
- package/tooling/print-hosted-version.ts +49 -0
- package/tooling/probe-eas.ts +99 -0
- package/tooling/probe-posthog.ts +318 -0
- package/tooling/probe-revenuecat-cli.ts +426 -0
- package/tooling/probe-revenuecat.ts +282 -0
- package/tooling/promote-design-tokens.ts +244 -0
- package/tooling/provision-posthog-platform.ts +138 -0
- package/tooling/prune-posthog-persons.ts +295 -0
- package/tooling/render-artifact-pages.ts +93 -0
- package/tooling/render-credits.ts +301 -0
- package/tooling/render-design-room.ts +518 -0
- package/tooling/render-hosted-bundle.ts +201 -0
- package/tooling/render-product.ts +103 -0
- package/tooling/render-public-api.ts +91 -0
- package/tooling/render-task-skills.ts +69 -0
- package/tooling/report-research-evidence-failures.ts +144 -0
- package/tooling/run-audit.ts +386 -0
- package/tooling/runtime-sync.ts +404 -0
- package/tooling/seed-design-brief.ts +69 -0
- package/tooling/test-public-api.ts +39 -0
- package/tsconfig.json +32 -0
|
@@ -0,0 +1,2447 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { type Harness, getLane, readState, writeState } from "./_harness.js";
|
|
4
|
+
|
|
5
|
+
/** Deterministic fixtures for the generalized onboarding system graph gate. */
|
|
6
|
+
export function register(h: Harness): void {
|
|
7
|
+
const { makeFixture, runFixture } = h;
|
|
8
|
+
|
|
9
|
+
const onboardingPath = (fixtureRoot: string): string => path.join(fixtureRoot, "product/ONBOARDING.md");
|
|
10
|
+
const mutateOnboarding = (fixtureRoot: string, mutate: (text: string) => string): void => {
|
|
11
|
+
const file = onboardingPath(fixtureRoot);
|
|
12
|
+
writeFileSync(file, mutate(readFileSync(file, "utf8")), "utf8");
|
|
13
|
+
};
|
|
14
|
+
const mutateProductYaml = (fixtureRoot: string, mutate: (text: string) => string): void => {
|
|
15
|
+
const file = path.join(fixtureRoot, "product.yaml");
|
|
16
|
+
writeFileSync(file, mutate(readFileSync(file, "utf8")), "utf8");
|
|
17
|
+
};
|
|
18
|
+
const setFeatureScope = (text: string, featureId: string, scope: "required" | "excluded" | "non-goal"): string => {
|
|
19
|
+
const pattern = new RegExp(`(- id: ${escapeRegExp(featureId)}\\n class_id: class.feature\\n slots:\\n slot.feature.scope: )\\S+`);
|
|
20
|
+
if (!pattern.test(text)) throw new Error(`fixture setup: feature ${featureId} not found`);
|
|
21
|
+
return text.replace(pattern, `$1${scope}`);
|
|
22
|
+
};
|
|
23
|
+
const removeFeature = (text: string, featureId: string): string => {
|
|
24
|
+
const listPattern = new RegExp(`\\n - ${escapeRegExp(featureId)}`);
|
|
25
|
+
const instancePattern = new RegExp(`\\n - id: ${escapeRegExp(featureId)}\\n class_id: class.feature\\n slots:\\n slot.feature.scope: \\S+`);
|
|
26
|
+
if (!listPattern.test(text)) throw new Error(`fixture setup: feature list entry ${featureId} not found`);
|
|
27
|
+
if (!instancePattern.test(text)) throw new Error(`fixture setup: feature instance ${featureId} not found`);
|
|
28
|
+
return text.replace(listPattern, "").replace(instancePattern, "");
|
|
29
|
+
};
|
|
30
|
+
const writeWorkspaceComposition = (fixtureRoot: string, recipeId: string, presentPaywallProvider?: string): void => {
|
|
31
|
+
const bindings =
|
|
32
|
+
presentPaywallProvider === undefined
|
|
33
|
+
? "\n"
|
|
34
|
+
: `\nbindings:\n b2c/monetization.present-paywall:\n provider: {id: ${presentPaywallProvider}, version: 1.0.0}\n`;
|
|
35
|
+
writeFileSync(
|
|
36
|
+
path.join(fixtureRoot, "b2c.yaml"),
|
|
37
|
+
`apiVersion: b2c/v1\nrecipe: {id: ${recipeId}, version: 1.0.0}\ntarget: {platform: ios, runtime: swiftui}${bindings}`,
|
|
38
|
+
"utf8",
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
const studioSurface = (id: string, interaction?: string): Record<string, unknown> => ({
|
|
42
|
+
id,
|
|
43
|
+
name: id,
|
|
44
|
+
status: "draft",
|
|
45
|
+
purpose: "purpose prose must not be parsed as a technique class",
|
|
46
|
+
decisions: [],
|
|
47
|
+
tokenReferences: [],
|
|
48
|
+
...(interaction === undefined ? {} : { interaction }),
|
|
49
|
+
});
|
|
50
|
+
const writeStudioSurfaces = (
|
|
51
|
+
fixtureRoot: string,
|
|
52
|
+
landingPages: Array<{ id: string; interaction?: string }> = [],
|
|
53
|
+
screens: Array<{ id: string; interaction?: string }> = [],
|
|
54
|
+
): void => {
|
|
55
|
+
const file = path.join(fixtureRoot, "studio/seed/business.json");
|
|
56
|
+
const seed = JSON.parse(readFileSync(file, "utf8")) as {
|
|
57
|
+
surfaces: { landingPages: unknown[]; mobileApp: { screens: unknown[] } };
|
|
58
|
+
};
|
|
59
|
+
seed.surfaces.landingPages = landingPages.map((row) => studioSurface(row.id, row.interaction));
|
|
60
|
+
seed.surfaces.mobileApp.screens = screens.map((row) => studioSurface(row.id, row.interaction));
|
|
61
|
+
writeFileSync(file, `${JSON.stringify(seed, null, 2)}\n`, "utf8");
|
|
62
|
+
};
|
|
63
|
+
const writeSixtyFpsToolRow = (fixtureRoot: string, access: string, route: string): void => {
|
|
64
|
+
const file = path.join(fixtureRoot, "strategy/TOOL_DECISIONS.md");
|
|
65
|
+
const text = readFileSync(file, "utf8");
|
|
66
|
+
const marker = "\n## Mobile Proof Route Decision";
|
|
67
|
+
if (!text.includes(marker)) throw new Error("fixture setup: TOOL_DECISIONS intake marker missing");
|
|
68
|
+
const row = `| 60fps.design MCP | design | ${access} | required before paid/account access | ${route} | distilled recipes are not equivalent |\n`;
|
|
69
|
+
writeFileSync(file, text.replace(marker, `\n${row}${marker}`), "utf8");
|
|
70
|
+
};
|
|
71
|
+
const requireHeadlineFeature = (fixtureRoot: string): void => {
|
|
72
|
+
mutateProductYaml(fixtureRoot, (text) => setFeatureScope(text, "feature.paywall-goal-headline", "required"));
|
|
73
|
+
};
|
|
74
|
+
const requireRevenueCatHeadlineBind = (fixtureRoot: string): void => {
|
|
75
|
+
requireHeadlineFeature(fixtureRoot);
|
|
76
|
+
writeWorkspaceComposition(fixtureRoot, "b2c/subscription-app", "b2c/revenuecat");
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Shipped markdown tables are column-aligned (prettier pads every cell to its column's widest
|
|
80
|
+
// row), so a literal single-spaced row never matches them. Match rows by their cell contents
|
|
81
|
+
// with padding-tolerant separators, and throw when the row is absent: a String.replace that
|
|
82
|
+
// finds nothing silently leaves the fixture unmutated, which turns a "fails" case into a false
|
|
83
|
+
// failure and a "passes" case into a false pass.
|
|
84
|
+
const escapeRegExp = (value: string): string => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
85
|
+
const tableRowPattern = (row: string): RegExp => {
|
|
86
|
+
const cells = row
|
|
87
|
+
.trim()
|
|
88
|
+
.slice(1, row.trim().endsWith("|") ? -1 : undefined)
|
|
89
|
+
.split("|")
|
|
90
|
+
.map((cell) => cell.trim());
|
|
91
|
+
return new RegExp(`\\|${cells.map((cell) => `\\s*${escapeRegExp(cell)}\\s*\\|`).join("")}`);
|
|
92
|
+
};
|
|
93
|
+
const replaceTableRow = (text: string, row: string, replacement: string): string => {
|
|
94
|
+
const pattern = tableRowPattern(row);
|
|
95
|
+
if (!pattern.test(text)) throw new Error(`fixture setup: table row not found: ${row}`);
|
|
96
|
+
return text.replace(pattern, replacement);
|
|
97
|
+
};
|
|
98
|
+
const removeTableBlock = (text: string, pattern: RegExp): string => {
|
|
99
|
+
if (!pattern.test(text)) throw new Error(`fixture setup: table block not found: ${pattern}`);
|
|
100
|
+
return text.replace(pattern, "");
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// Mirrors check-onboarding-graph.ts's own TEMPLATE_DIRECTIVE_VERBS set: this fixture needs
|
|
104
|
+
// to fill every cell the validator itself would call a placeholder, not just the ones
|
|
105
|
+
// literally starting with "Record" -- the shipped template also opens cells with "Define",
|
|
106
|
+
// "Choose", etc., and leaving those unfilled means this "completed" fixture was never
|
|
107
|
+
// actually complete, so its assertions proved nothing about the cells it didn't touch.
|
|
108
|
+
const TEMPLATE_DIRECTIVE_VERBS_PATTERN =
|
|
109
|
+
/^\s*(?:add|added|capture|captured|choose|chosen|complete|completed|define|defined|describe|described|document|documented|enter|entered|fill|filled|finish|finished|include|included|insert|inserted|mark|marked|note|noted|provide|provided|record|replace|replaced|select|selected|specify|specified|update|updated|write|written)\b/i;
|
|
110
|
+
|
|
111
|
+
const baseline = makeFixture("onboarding-graph-baseline");
|
|
112
|
+
runFixture("shipped onboarding graph template passes before completion", baseline, "check-onboarding-graph.ts", 0);
|
|
113
|
+
|
|
114
|
+
const graphNodeMissing = makeFixture("onboarding-graph-node-missing");
|
|
115
|
+
mutateOnboarding(graphNodeMissing, (text) => text.replaceAll("ONB-22", "ONB-FINAL"));
|
|
116
|
+
runFixture("onboarding graph missing a canonical node fails", graphNodeMissing, "check-onboarding-graph.ts", 1, "onboarding_graph.node_missing");
|
|
117
|
+
|
|
118
|
+
const evidenceMissing = makeFixture("onboarding-graph-evidence-missing");
|
|
119
|
+
mutateOnboarding(evidenceMissing, (text) => text.replace("## Onbo Hub Pattern Atlas", "## Flow Pattern Notes"));
|
|
120
|
+
runFixture(
|
|
121
|
+
"onboarding without the authorized Onbo Hub evidence contract fails",
|
|
122
|
+
evidenceMissing,
|
|
123
|
+
"check-onboarding-graph.ts",
|
|
124
|
+
1,
|
|
125
|
+
"onboarding_graph.section_onbo_hub_pattern_atlas_missing",
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const commitmentFunnelMissing = makeFixture("onboarding-graph-commitment-funnel-missing");
|
|
129
|
+
mutateOnboarding(commitmentFunnelMissing, (text) => text.replace("## Commitment Funnel", "## First Session Order"));
|
|
130
|
+
runFixture(
|
|
131
|
+
"onboarding without the Commitment Funnel section fails",
|
|
132
|
+
commitmentFunnelMissing,
|
|
133
|
+
"check-onboarding-graph.ts",
|
|
134
|
+
1,
|
|
135
|
+
"onboarding_graph.section_commitment_funnel_missing",
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
const funnelQualityMissing = makeFixture("onboarding-graph-funnel-quality-missing");
|
|
139
|
+
mutateOnboarding(funnelQualityMissing, (text) => text.replace("## Funnel Quality Metrics", "## Conversion Metrics"));
|
|
140
|
+
runFixture(
|
|
141
|
+
"onboarding without Funnel Quality Metrics fails",
|
|
142
|
+
funnelQualityMissing,
|
|
143
|
+
"check-onboarding-graph.ts",
|
|
144
|
+
1,
|
|
145
|
+
"onboarding_graph.section_funnel_quality_metrics_missing",
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const paywallGoalHeadlineMissing = makeFixture("onboarding-graph-paywall-goal-headline-missing");
|
|
149
|
+
requireRevenueCatHeadlineBind(paywallGoalHeadlineMissing);
|
|
150
|
+
mutateOnboarding(paywallGoalHeadlineMissing, (text) => text.replace("## Paywall Goal Headline", "## Paywall Copy Notes"));
|
|
151
|
+
runFixture(
|
|
152
|
+
"onboarding without the Paywall Goal Headline section fails",
|
|
153
|
+
paywallGoalHeadlineMissing,
|
|
154
|
+
"check-onboarding-graph.ts",
|
|
155
|
+
1,
|
|
156
|
+
"onboarding_graph.section_paywall_goal_headline_missing",
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const paywallGoalHeadlineSelected = makeFixture("onboarding-graph-paywall-goal-headline-selected");
|
|
160
|
+
requireRevenueCatHeadlineBind(paywallGoalHeadlineSelected);
|
|
161
|
+
runFixture(
|
|
162
|
+
"onboarding with an explicit RevenueCat present-paywall binding keeps the headline section",
|
|
163
|
+
paywallGoalHeadlineSelected,
|
|
164
|
+
"check-onboarding-graph.ts",
|
|
165
|
+
0,
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const paywallGoalHeadlineInvented = makeFixture("onboarding-graph-paywall-goal-headline-invented");
|
|
169
|
+
mutateOnboarding(paywallGoalHeadlineInvented, (text) =>
|
|
170
|
+
text.replace("Do not invent a goal or outcome.", "An invented outcome is allowed when it sounds more motivating than their answer."),
|
|
171
|
+
);
|
|
172
|
+
runFixture(
|
|
173
|
+
"onboarding that allows an invented paywall outcome fails",
|
|
174
|
+
paywallGoalHeadlineInvented,
|
|
175
|
+
"check-onboarding-graph.ts",
|
|
176
|
+
1,
|
|
177
|
+
"onboarding_graph.paywall_goal_headline_invented",
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
const paywallGoalHeadlineTableMissing = makeFixture("onboarding-graph-paywall-goal-headline-table-missing");
|
|
181
|
+
requireRevenueCatHeadlineBind(paywallGoalHeadlineTableMissing);
|
|
182
|
+
mutateOnboarding(paywallGoalHeadlineTableMissing, (text) =>
|
|
183
|
+
removeTableBlock(
|
|
184
|
+
text,
|
|
185
|
+
/\|\s*Goal key\s*\|\s*User-facing prompt\s*\|\s*Headline template\s*\|\s*Fallback when skipped\s*\|[\s\S]*?\|\s*`skipped`\s*\|[^\n]*\n/,
|
|
186
|
+
),
|
|
187
|
+
);
|
|
188
|
+
runFixture(
|
|
189
|
+
"onboarding whose Paywall Goal Headline section has no mapping table fails",
|
|
190
|
+
paywallGoalHeadlineTableMissing,
|
|
191
|
+
"check-onboarding-graph.ts",
|
|
192
|
+
1,
|
|
193
|
+
"onboarding_graph.paywall_goal_headline_table",
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const refundRateMissing = makeFixture("onboarding-graph-refund-rate-missing");
|
|
197
|
+
mutateOnboarding(refundRateMissing, (text) => text.replaceAll("refund rate", "churn after trial"));
|
|
198
|
+
runFixture(
|
|
199
|
+
"onboarding without refund rate as a funnel quality metric fails",
|
|
200
|
+
refundRateMissing,
|
|
201
|
+
"check-onboarding-graph.ts",
|
|
202
|
+
1,
|
|
203
|
+
"onboarding_graph.funnel_quality",
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
const commitmentFunnelExcluded = makeFixture("onboarding-graph-commitment-funnel-excluded");
|
|
207
|
+
mutateProductYaml(commitmentFunnelExcluded, (text) => setFeatureScope(text, "feature.commitment-funnel", "excluded"));
|
|
208
|
+
mutateOnboarding(commitmentFunnelExcluded, (text) =>
|
|
209
|
+
text.replace("## Commitment Funnel", "## First Session Order").replace("## Funnel Quality Metrics", "## Conversion Metrics"),
|
|
210
|
+
);
|
|
211
|
+
runFixture("onboarding may omit the Commitment Funnel when feature.commitment-funnel is excluded", commitmentFunnelExcluded, "check-onboarding-graph.ts", 0);
|
|
212
|
+
|
|
213
|
+
const paywallGoalHeadlineExcluded = makeFixture("onboarding-graph-paywall-goal-headline-excluded");
|
|
214
|
+
mutateProductYaml(paywallGoalHeadlineExcluded, (text) => setFeatureScope(text, "feature.paywall-goal-headline", "excluded"));
|
|
215
|
+
mutateOnboarding(paywallGoalHeadlineExcluded, (text) => text.replace("## Paywall Goal Headline", "## Paywall Copy Notes"));
|
|
216
|
+
runFixture(
|
|
217
|
+
"onboarding may omit the Paywall Goal Headline when feature.paywall-goal-headline is excluded",
|
|
218
|
+
paywallGoalHeadlineExcluded,
|
|
219
|
+
"check-onboarding-graph.ts",
|
|
220
|
+
0,
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
const onboardingFeaturesUnresolved = makeFixture("onboarding-graph-features-unresolved");
|
|
224
|
+
mutateProductYaml(onboardingFeaturesUnresolved, (text) => removeFeature(removeFeature(text, "feature.commitment-funnel"), "feature.paywall-goal-headline"));
|
|
225
|
+
runFixture(
|
|
226
|
+
"onboarding holds when commitment-funnel and paywall-goal-headline instances are absent",
|
|
227
|
+
onboardingFeaturesUnresolved,
|
|
228
|
+
"check-onboarding-graph.ts",
|
|
229
|
+
1,
|
|
230
|
+
"onboarding_graph.commitment_funnel_unresolved",
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
const paywallGoalHeadlineUnresolvedComposition = makeFixture("onboarding-graph-paywall-goal-headline-unresolved-composition");
|
|
234
|
+
requireHeadlineFeature(paywallGoalHeadlineUnresolvedComposition);
|
|
235
|
+
runFixture(
|
|
236
|
+
"onboarding holds when the headline feature is required and present-paywall is unresolved",
|
|
237
|
+
paywallGoalHeadlineUnresolvedComposition,
|
|
238
|
+
"check-onboarding-graph.ts",
|
|
239
|
+
1,
|
|
240
|
+
"onboarding_graph.paywall_goal_headline_unresolved",
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
const paywallGoalHeadlineUnavailable = makeFixture("onboarding-graph-paywall-goal-headline-unavailable");
|
|
244
|
+
requireHeadlineFeature(paywallGoalHeadlineUnavailable);
|
|
245
|
+
writeWorkspaceComposition(paywallGoalHeadlineUnavailable, "b2c/subscription-app", "b2c/superwall");
|
|
246
|
+
runFixture(
|
|
247
|
+
"onboarding cannot invent a RevenueCat headline bind for a Superwall presenter",
|
|
248
|
+
paywallGoalHeadlineUnavailable,
|
|
249
|
+
"check-onboarding-graph.ts",
|
|
250
|
+
1,
|
|
251
|
+
"onboarding_graph.paywall_goal_headline_unavailable",
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
const motionResearchMissing = makeFixture("onboarding-graph-motion-research-missing");
|
|
255
|
+
mutateOnboarding(motionResearchMissing, (text) => text.replace("## Motion Research", "## Animation Notes"));
|
|
256
|
+
runFixture(
|
|
257
|
+
"onboarding without the Motion Research section fails",
|
|
258
|
+
motionResearchMissing,
|
|
259
|
+
"check-onboarding-graph.ts",
|
|
260
|
+
1,
|
|
261
|
+
"onboarding_graph.section_motion_research_missing",
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
const motionInteractionUnresolved = makeFixture("onboarding-graph-motion-interaction-unresolved");
|
|
265
|
+
writeStudioSurfaces(motionInteractionUnresolved, [{ id: "privacy" }]);
|
|
266
|
+
runFixture(
|
|
267
|
+
"onboarding holds when a listed studio surface omits interaction",
|
|
268
|
+
motionInteractionUnresolved,
|
|
269
|
+
"check-onboarding-graph.ts",
|
|
270
|
+
1,
|
|
271
|
+
"onboarding_graph.surface_interaction_unresolved",
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
const motionReferenceUnavailable = makeFixture("onboarding-graph-motion-reference-unavailable");
|
|
275
|
+
writeStudioSurfaces(motionReferenceUnavailable, [], [{ id: "hero", interaction: "bespoke-motion" }]);
|
|
276
|
+
writeSixtyFpsToolRow(motionReferenceUnavailable, "blocked", "fallback distilled recipes");
|
|
277
|
+
runFixture(
|
|
278
|
+
"onboarding holds when selected 60fps research is recorded as blocked",
|
|
279
|
+
motionReferenceUnavailable,
|
|
280
|
+
"check-onboarding-graph.ts",
|
|
281
|
+
1,
|
|
282
|
+
"onboarding_graph.motion_reference_unavailable",
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const motionReferenceSelectedMissingPhrases = makeFixture("onboarding-graph-motion-reference-selected-missing");
|
|
286
|
+
writeStudioSurfaces(motionReferenceSelectedMissingPhrases, [], [{ id: "hero", interaction: "bespoke-motion" }]);
|
|
287
|
+
writeSixtyFpsToolRow(motionReferenceSelectedMissingPhrases, "connected", "search_shots route");
|
|
288
|
+
mutateOnboarding(motionReferenceSelectedMissingPhrases, (text) =>
|
|
289
|
+
text.replaceAll("60fps MCP", "motion catalog").replaceAll("search_shots", "shot search").replaceAll("get_motion_breakdown", "motion breakdown"),
|
|
290
|
+
);
|
|
291
|
+
runFixture(
|
|
292
|
+
"onboarding requires 60fps MCP operations when that register is selected",
|
|
293
|
+
motionReferenceSelectedMissingPhrases,
|
|
294
|
+
"check-onboarding-graph.ts",
|
|
295
|
+
1,
|
|
296
|
+
"onboarding_graph.motion_reference",
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
const paywallGoalHeadlineSuperwallExcluded = makeFixture("onboarding-graph-paywall-goal-headline-superwall-excluded");
|
|
300
|
+
mutateProductYaml(paywallGoalHeadlineSuperwallExcluded, (text) => setFeatureScope(text, "feature.paywall-goal-headline", "excluded"));
|
|
301
|
+
writeWorkspaceComposition(paywallGoalHeadlineSuperwallExcluded, "b2c/subscription-app", "b2c/superwall");
|
|
302
|
+
mutateOnboarding(paywallGoalHeadlineSuperwallExcluded, (text) => text.replace("## Paywall Goal Headline", "## Paywall Copy Notes"));
|
|
303
|
+
runFixture(
|
|
304
|
+
"onboarding may omit the headline bind when Superwall presents and the feature is excluded",
|
|
305
|
+
paywallGoalHeadlineSuperwallExcluded,
|
|
306
|
+
"check-onboarding-graph.ts",
|
|
307
|
+
0,
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
const requiredSectionInFence = makeFixture("onboarding-graph-required-section-in-fence");
|
|
311
|
+
mutateOnboarding(requiredSectionInFence, (text) => {
|
|
312
|
+
// Relocate the entire live "## Privacy And Security" section into a fenced code sample,
|
|
313
|
+
// leaving it absent from the live document -- hasHeading() has no notion of fences, so
|
|
314
|
+
// before liveText was computed up front (and used for every structural check, not only the
|
|
315
|
+
// deep --require-done block) this would have still been accepted as present.
|
|
316
|
+
const section = text.match(/## Privacy And Security\n[\s\S]*?(?=\n## )/)?.[0];
|
|
317
|
+
if (!section) throw new Error("fixture setup: could not locate the Privacy And Security section to relocate");
|
|
318
|
+
const withoutLiveSection = text.replace(section, "");
|
|
319
|
+
return `${withoutLiveSection}\n\`\`\`markdown\n${section}\n\`\`\`\n`;
|
|
320
|
+
});
|
|
321
|
+
runFixture(
|
|
322
|
+
"a required section relocated into a fenced example still fails as missing",
|
|
323
|
+
requiredSectionInFence,
|
|
324
|
+
"check-onboarding-graph.ts",
|
|
325
|
+
1,
|
|
326
|
+
"onboarding_graph.section_privacy_and_security_missing",
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
const requiredSectionInHtmlComment = makeFixture("onboarding-graph-required-section-in-html-comment");
|
|
330
|
+
mutateOnboarding(requiredSectionInHtmlComment, (text) => {
|
|
331
|
+
// Same relocation as requiredSectionInFence, but into an HTML comment rather than a
|
|
332
|
+
// triple-backtick fence -- a comment renders nothing at all, yet stripFencedBlocks() only
|
|
333
|
+
// ever stripped backtick fences, so this form stayed live and readable to every structural
|
|
334
|
+
// check.
|
|
335
|
+
const section = text.match(/## Performance And Observability\n[\s\S]*?(?=\n## )/)?.[0];
|
|
336
|
+
if (!section) throw new Error("fixture setup: could not locate the Performance And Observability section to relocate");
|
|
337
|
+
const withoutLiveSection = text.replace(section, "");
|
|
338
|
+
return `${withoutLiveSection}\n<!--\n${section}\n-->\n`;
|
|
339
|
+
});
|
|
340
|
+
runFixture(
|
|
341
|
+
"a required section relocated into an HTML comment still fails as missing",
|
|
342
|
+
requiredSectionInHtmlComment,
|
|
343
|
+
"check-onboarding-graph.ts",
|
|
344
|
+
1,
|
|
345
|
+
"onboarding_graph.section_performance_and_observability_missing",
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
const requiredSectionInTildeFence = makeFixture("onboarding-graph-required-section-in-tilde-fence");
|
|
349
|
+
mutateOnboarding(requiredSectionInTildeFence, (text) => {
|
|
350
|
+
// Same relocation again, into a CommonMark tilde fence (~~~) -- an equally valid fence
|
|
351
|
+
// delimiter to triple backticks, which stripFencedBlocks() never recognized at all.
|
|
352
|
+
const section = text.match(/## Accessibility And Localization\n[\s\S]*?(?=\n## )/)?.[0];
|
|
353
|
+
if (!section) throw new Error("fixture setup: could not locate the Accessibility And Localization section to relocate");
|
|
354
|
+
const withoutLiveSection = text.replace(section, "");
|
|
355
|
+
return `${withoutLiveSection}\n~~~markdown\n${section}\n~~~\n`;
|
|
356
|
+
});
|
|
357
|
+
runFixture(
|
|
358
|
+
"a required section relocated into a tilde fence still fails as missing",
|
|
359
|
+
requiredSectionInTildeFence,
|
|
360
|
+
"check-onboarding-graph.ts",
|
|
361
|
+
1,
|
|
362
|
+
"onboarding_graph.section_accessibility_and_localization_missing",
|
|
363
|
+
);
|
|
364
|
+
|
|
365
|
+
const requiredSectionInUnterminatedFence = makeFixture("onboarding-graph-required-section-in-unterminated-fence");
|
|
366
|
+
mutateOnboarding(requiredSectionInUnterminatedFence, (text) => {
|
|
367
|
+
// Same relocation again, but the opening fence is never closed -- CommonMark still renders
|
|
368
|
+
// an unterminated fence as extending to the end of the document (code, not prose), yet the
|
|
369
|
+
// old paired-delimiter regex required a closing run of backticks to match anything at all,
|
|
370
|
+
// so with no closer present it stripped nothing and left the relocated heading exactly as
|
|
371
|
+
// live and findable as if it had never been fenced.
|
|
372
|
+
const section = text.match(/## Prototype And Design Proof\n[\s\S]*?(?=\n## )/)?.[0];
|
|
373
|
+
if (!section) throw new Error("fixture setup: could not locate the Prototype And Design Proof section to relocate");
|
|
374
|
+
const withoutLiveSection = text.replace(section, "");
|
|
375
|
+
return `${withoutLiveSection}\n\`\`\`markdown\n${section}\n`;
|
|
376
|
+
});
|
|
377
|
+
runFixture(
|
|
378
|
+
"a required section relocated into an unterminated fence still fails as missing",
|
|
379
|
+
requiredSectionInUnterminatedFence,
|
|
380
|
+
"check-onboarding-graph.ts",
|
|
381
|
+
1,
|
|
382
|
+
"onboarding_graph.section_prototype_and_design_proof_missing",
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
const requiredSectionAfterShortInnerFence = makeFixture("onboarding-graph-required-section-after-short-inner-fence");
|
|
386
|
+
mutateOnboarding(requiredSectionAfterShortInnerFence, (text) => {
|
|
387
|
+
// Opens with a four-backtick fence, then contains a three-backtick run before the relocated
|
|
388
|
+
// section and a real four-backtick closer after it. CommonMark only closes a fence with a
|
|
389
|
+
// same-character run at least as long as the opener, so the inner three-backtick line is
|
|
390
|
+
// literal fence content, not a closer -- the whole block, including the relocated section,
|
|
391
|
+
// stays hidden until the real four-backtick closer. A naive "any run of 3+ backticks closes
|
|
392
|
+
// it" strip would stop at the inner three-backtick line instead, leaving the section (and the
|
|
393
|
+
// real closer line after it) live and readable.
|
|
394
|
+
const section = text.match(/## Synthetic One-Star Pre-Mortem\n[\s\S]*?(?=\n## )/)?.[0];
|
|
395
|
+
if (!section) throw new Error("fixture setup: could not locate the Synthetic One-Star Pre-Mortem section to relocate");
|
|
396
|
+
const withoutLiveSection = text.replace(section, "");
|
|
397
|
+
return `${withoutLiveSection}\n\`\`\`\`markdown\nA decoy line that looks like a fence close but is too short to be one.\n\`\`\`\n${section}\n\`\`\`\`\n`;
|
|
398
|
+
});
|
|
399
|
+
runFixture(
|
|
400
|
+
"a required section placed after a shorter inner fence run (not a real closer) still fails as missing",
|
|
401
|
+
requiredSectionAfterShortInnerFence,
|
|
402
|
+
"check-onboarding-graph.ts",
|
|
403
|
+
1,
|
|
404
|
+
"onboarding_graph.section_synthetic_one_star_pre_mortem_missing",
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
const requiredHeadingIndented = makeFixture("onboarding-graph-required-heading-indented");
|
|
408
|
+
mutateOnboarding(requiredHeadingIndented, (text) =>
|
|
409
|
+
// Indenting the heading line by 4 spaces turns it into a CommonMark indented code block (a
|
|
410
|
+
// completely different construct from a heading) rather than a fence or comment -- it is
|
|
411
|
+
// preceded by a blank line in the shipped template, which is what lets an indented line begin
|
|
412
|
+
// a code block instead of lazily continuing a paragraph. hasHeading() has no notion of
|
|
413
|
+
// indentation and only ever compares each line's own *trimmed* text, so an indented,
|
|
414
|
+
// non-rendering heading line still registered as the section being present.
|
|
415
|
+
text.replace("## Verification\n", " ## Verification\n"),
|
|
416
|
+
);
|
|
417
|
+
runFixture(
|
|
418
|
+
"a required heading indented into a CommonMark code block still fails as missing",
|
|
419
|
+
requiredHeadingIndented,
|
|
420
|
+
"check-onboarding-graph.ts",
|
|
421
|
+
1,
|
|
422
|
+
"onboarding_graph.section_verification_missing",
|
|
423
|
+
);
|
|
424
|
+
|
|
425
|
+
const requiredSectionInScriptBlock = makeFixture("onboarding-graph-required-section-in-script-block");
|
|
426
|
+
mutateOnboarding(requiredSectionInScriptBlock, (text) => {
|
|
427
|
+
// Relocate the entire live "## Failure And Recovery" section into a <script type="text/plain">
|
|
428
|
+
// block -- a browser never renders script content as visible page text, the same reasoning
|
|
429
|
+
// already applied to HTML comments and fences, but stripNonRenderedMarkdown() had no notion of
|
|
430
|
+
// raw HTML blocks at all, so before this fix the relocated heading stayed live and findable.
|
|
431
|
+
const section = text.match(/## Failure And Recovery\n[\s\S]*?(?=\n## )/)?.[0];
|
|
432
|
+
if (!section) throw new Error("fixture setup: could not locate the Failure And Recovery section to relocate");
|
|
433
|
+
const withoutLiveSection = text.replace(section, "");
|
|
434
|
+
return `${withoutLiveSection}\n<script type="text/plain">\n${section}\n</script>\n`;
|
|
435
|
+
});
|
|
436
|
+
runFixture(
|
|
437
|
+
"a required section relocated into a script block still fails as missing",
|
|
438
|
+
requiredSectionInScriptBlock,
|
|
439
|
+
"check-onboarding-graph.ts",
|
|
440
|
+
1,
|
|
441
|
+
"onboarding_graph.section_failure_and_recovery_missing",
|
|
442
|
+
);
|
|
443
|
+
|
|
444
|
+
const requiredSectionInDivBlock = makeFixture("onboarding-graph-required-section-in-div-block");
|
|
445
|
+
mutateOnboarding(requiredSectionInDivBlock, (text) => {
|
|
446
|
+
// Relocate the entire live "## Evidence Decision And Complaint Traceability" section into a
|
|
447
|
+
// <div> block, with no blank line between the opening tag and the heading -- CommonMark's
|
|
448
|
+
// HTML-block-type-6 rule (div, section, table, p, li, ... -- a different rule from the
|
|
449
|
+
// script/style/template family above) runs the block through the next blank line, not until a
|
|
450
|
+
// matching closing tag, so the heading line (the first line after the opener, with no blank
|
|
451
|
+
// line separating them) is absorbed into the block regardless of what happens later in the
|
|
452
|
+
// section body. A real renderer shows the heading as literal text beside the <div> markup,
|
|
453
|
+
// never as a parsed heading, but before this fix stripNonRenderedMarkdown() had no notion of
|
|
454
|
+
// this tag family at all and left it live and findable.
|
|
455
|
+
const section = text.match(/## Evidence Decision And Complaint Traceability\n[\s\S]*?(?=\n## )/)?.[0];
|
|
456
|
+
if (!section) throw new Error("fixture setup: could not locate the Evidence Decision And Complaint Traceability section to relocate");
|
|
457
|
+
const withoutLiveSection = text.replace(section, "");
|
|
458
|
+
return `${withoutLiveSection}\n<div>\n${section}\n</div>\n`;
|
|
459
|
+
});
|
|
460
|
+
runFixture(
|
|
461
|
+
"a required section relocated into a div block still fails as missing",
|
|
462
|
+
requiredSectionInDivBlock,
|
|
463
|
+
"check-onboarding-graph.ts",
|
|
464
|
+
1,
|
|
465
|
+
"onboarding_graph.section_evidence_decision_and_complaint_traceability_missing",
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
const requiredSectionInPreBlock = makeFixture("onboarding-graph-required-section-in-pre-block");
|
|
469
|
+
mutateOnboarding(requiredSectionInPreBlock, (text) => {
|
|
470
|
+
// Relocate the entire live "## Competitor Review Matrix" section into a <pre> block.
|
|
471
|
+
// stripNonRenderingHtmlBlocks() originally only recognized script/style/template -- <pre>'s
|
|
472
|
+
// content DOES render visibly (unlike script/style/template), which is exactly why it was
|
|
473
|
+
// deliberately left unstripped, but "renders visibly" is the wrong test: a heading inside
|
|
474
|
+
// <pre> displays as literal preformatted text, never as a parsed heading a real renderer or
|
|
475
|
+
// this validator's own hasHeading()/graphRunRows()/countChecklistItems() would recognize.
|
|
476
|
+
const section = text.match(/## Competitor Review Matrix\n[\s\S]*?(?=\n## )/)?.[0];
|
|
477
|
+
if (!section) throw new Error("fixture setup: could not locate the Competitor Review Matrix section to relocate");
|
|
478
|
+
const withoutLiveSection = text.replace(section, "");
|
|
479
|
+
return `${withoutLiveSection}\n<pre>\n${section}\n</pre>\n`;
|
|
480
|
+
});
|
|
481
|
+
runFixture(
|
|
482
|
+
"a required section relocated into a pre block still fails as missing",
|
|
483
|
+
requiredSectionInPreBlock,
|
|
484
|
+
"check-onboarding-graph.ts",
|
|
485
|
+
1,
|
|
486
|
+
"onboarding_graph.section_competitor_review_matrix_missing",
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
const requiredSectionInCustomElementBlock = makeFixture("onboarding-graph-required-section-in-custom-element-block");
|
|
490
|
+
mutateOnboarding(requiredSectionInCustomElementBlock, (text) => {
|
|
491
|
+
// Relocate the entire live "## Permissions And Lifecycle" section into an <x-proof> custom
|
|
492
|
+
// element. CommonMark's HTML-block-type-7 rule: a line consisting of a COMPLETE open or
|
|
493
|
+
// closing tag and nothing else -- ANY tag name, including hyphenated custom elements, not
|
|
494
|
+
// just the curated type-6 container set -- opens an HTML block that runs through the next
|
|
495
|
+
// blank line. A real renderer shows the absorbed heading as inert text inside unknown
|
|
496
|
+
// markup, never as a parsed heading, but stripNonRenderedMarkdown() previously recognized
|
|
497
|
+
// only the five type-1 tags and the curated type-6 set, so evidence or completion structure
|
|
498
|
+
// hidden in a custom element stayed live and findable.
|
|
499
|
+
const section = text.match(/## Permissions And Lifecycle\n[\s\S]*?(?=\n## )/)?.[0];
|
|
500
|
+
if (!section) throw new Error("fixture setup: could not locate the Permissions And Lifecycle section to relocate");
|
|
501
|
+
const withoutLiveSection = text.replace(section, "");
|
|
502
|
+
return `${withoutLiveSection}\n<x-proof>\n${section}\n</x-proof>\n`;
|
|
503
|
+
});
|
|
504
|
+
runFixture(
|
|
505
|
+
"a required section relocated into a custom-element block still fails as missing",
|
|
506
|
+
requiredSectionInCustomElementBlock,
|
|
507
|
+
"check-onboarding-graph.ts",
|
|
508
|
+
1,
|
|
509
|
+
"onboarding_graph.section_permissions_and_lifecycle_missing",
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
const requiredSectionInTextareaBlock = makeFixture("onboarding-graph-required-section-in-textarea-block");
|
|
513
|
+
mutateOnboarding(requiredSectionInTextareaBlock, (text) => {
|
|
514
|
+
// Same gap, <textarea> this time: a form control's raw value renders visibly too, but a
|
|
515
|
+
// heading placed inside one is a literal string inside a control, never live document
|
|
516
|
+
// structure -- the same "renders visibly but is not parsed Markdown" case as <pre>.
|
|
517
|
+
const section = text.match(/## Internal Guidance Audit\n[\s\S]*?(?=\n## )/)?.[0];
|
|
518
|
+
if (!section) throw new Error("fixture setup: could not locate the Internal Guidance Audit section to relocate");
|
|
519
|
+
const withoutLiveSection = text.replace(section, "");
|
|
520
|
+
return `${withoutLiveSection}\n<textarea>\n${section}\n</textarea>\n`;
|
|
521
|
+
});
|
|
522
|
+
runFixture(
|
|
523
|
+
"a required section relocated into a textarea block still fails as missing",
|
|
524
|
+
requiredSectionInTextareaBlock,
|
|
525
|
+
"check-onboarding-graph.ts",
|
|
526
|
+
1,
|
|
527
|
+
"onboarding_graph.section_internal_guidance_audit_missing",
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
const requiredHeadingTabIndented = makeFixture("onboarding-graph-required-heading-tab-indented");
|
|
531
|
+
mutateOnboarding(requiredHeadingTabIndented, (text) =>
|
|
532
|
+
// A single leading tab expands to CommonMark's own 4-column tab stop, the same indentation
|
|
533
|
+
// threshold as four literal spaces -- it is preceded by a blank line in the shipped template,
|
|
534
|
+
// so it opens an indented code block exactly like the space-indented case above. A check that
|
|
535
|
+
// only recognized four literal space characters would miss this and still find the heading.
|
|
536
|
+
text.replace("## Permissions And Lifecycle\n", "\t## Permissions And Lifecycle\n"),
|
|
537
|
+
);
|
|
538
|
+
runFixture(
|
|
539
|
+
"a required heading indented with a tab into a CommonMark code block still fails as missing",
|
|
540
|
+
requiredHeadingTabIndented,
|
|
541
|
+
"check-onboarding-graph.ts",
|
|
542
|
+
1,
|
|
543
|
+
"onboarding_graph.section_permissions_and_lifecycle_missing",
|
|
544
|
+
);
|
|
545
|
+
|
|
546
|
+
const reviewInsideFirstRun = makeFixture("onboarding-graph-review-inside-first-run");
|
|
547
|
+
mutateOnboarding(reviewInsideFirstRun, (text) =>
|
|
548
|
+
text.replace(
|
|
549
|
+
"The native request happens outside first-run onboarding.",
|
|
550
|
+
"Show the native review prompt immediately after first value inside first-run onboarding.",
|
|
551
|
+
),
|
|
552
|
+
);
|
|
553
|
+
runFixture(
|
|
554
|
+
"review request immediately after first value inside onboarding fails",
|
|
555
|
+
reviewInsideFirstRun,
|
|
556
|
+
"check-onboarding-graph.ts",
|
|
557
|
+
1,
|
|
558
|
+
"onboarding_graph.review_inside_first_run",
|
|
559
|
+
);
|
|
560
|
+
|
|
561
|
+
const unobservableReview = makeFixture("onboarding-graph-unobservable-review-event");
|
|
562
|
+
mutateOnboarding(unobservableReview, (text) => text.replace("`review_request_returned`", "`review_prompt_shown`"));
|
|
563
|
+
runFixture(
|
|
564
|
+
"analytics cannot claim that the platform displayed a review prompt",
|
|
565
|
+
unobservableReview,
|
|
566
|
+
"check-onboarding-graph.ts",
|
|
567
|
+
1,
|
|
568
|
+
"onboarding_graph.review_unobservable_event",
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
const controlContractMissing = makeFixture("onboarding-graph-control-contract-missing");
|
|
572
|
+
mutateOnboarding(controlContractMissing, (text) => text.replaceAll("ONB-CTL-001", "CONTROL-TBD"));
|
|
573
|
+
runFixture("onboarding without stable control IDs fails", controlContractMissing, "check-onboarding-graph.ts", 1, "onboarding_graph.design_contract");
|
|
574
|
+
|
|
575
|
+
const targetRuntimeMissing = makeFixture("onboarding-graph-target-runtime-missing");
|
|
576
|
+
mutateOnboarding(targetRuntimeMissing, (text) => text.replaceAll("Do not keep the old runtime", "Keep the old runtime"));
|
|
577
|
+
runFixture(
|
|
578
|
+
"replacement plan that keeps the old runtime fails",
|
|
579
|
+
targetRuntimeMissing,
|
|
580
|
+
"check-onboarding-graph.ts",
|
|
581
|
+
1,
|
|
582
|
+
"onboarding_graph.replacement_contract",
|
|
583
|
+
);
|
|
584
|
+
|
|
585
|
+
const deferredWithUnscopedArtifact = makeFixture("onboarding-graph-deferred-with-unscoped-artifact");
|
|
586
|
+
{
|
|
587
|
+
const state = readState(deferredWithUnscopedArtifact);
|
|
588
|
+
const lane = getLane(state, "onboarding");
|
|
589
|
+
lane["status"] = "deferred";
|
|
590
|
+
lane["blockers"] = ["2026-08-08 founder deferred onboarding until the product hypothesis is validated"];
|
|
591
|
+
writeState(deferredWithUnscopedArtifact, state);
|
|
592
|
+
writeFileSync(onboardingPath(deferredWithUnscopedArtifact), "# Unscoped onboarding notes\n\nRetained for history.\n", "utf8");
|
|
593
|
+
}
|
|
594
|
+
runFixture("explicitly deferred onboarding ignores a retained removal artifact", deferredWithUnscopedArtifact, "check-onboarding-graph.ts", 0);
|
|
595
|
+
|
|
596
|
+
const doneWithPlaceholders = makeFixture("onboarding-graph-done-with-placeholders");
|
|
597
|
+
{
|
|
598
|
+
markOnboardingDone(doneWithPlaceholders);
|
|
599
|
+
}
|
|
600
|
+
runFixture(
|
|
601
|
+
"done onboarding lane with not_started nodes and template records fails",
|
|
602
|
+
doneWithPlaceholders,
|
|
603
|
+
"check-onboarding-graph.ts",
|
|
604
|
+
1,
|
|
605
|
+
"onboarding_graph.placeholder_complete",
|
|
606
|
+
);
|
|
607
|
+
|
|
608
|
+
const doneWithRenamedPlaceholders = makeFixture("onboarding-graph-done-with-renamed-placeholders");
|
|
609
|
+
{
|
|
610
|
+
markOnboardingDone(doneWithRenamedPlaceholders);
|
|
611
|
+
mutateOnboarding(doneWithRenamedPlaceholders, (text) => text.replaceAll("not_started", "done").replaceAll("Record", "Completed"));
|
|
612
|
+
}
|
|
613
|
+
runFixture(
|
|
614
|
+
"renaming template directives does not create a completed onboarding contract",
|
|
615
|
+
doneWithRenamedPlaceholders,
|
|
616
|
+
"check-onboarding-graph.ts",
|
|
617
|
+
1,
|
|
618
|
+
"onboarding_graph.placeholder_complete",
|
|
619
|
+
);
|
|
620
|
+
|
|
621
|
+
const doneWithOrdinaryRecordProse = makeFixture("onboarding-graph-done-with-ordinary-record-prose");
|
|
622
|
+
{
|
|
623
|
+
markOnboardingDone(doneWithOrdinaryRecordProse);
|
|
624
|
+
mutateOnboarding(doneWithOrdinaryRecordProse, (text) => {
|
|
625
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
626
|
+
return `${completed}\nThis remains the canonical execution record for the completed onboarding system.\n`;
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
runFixture("completed onboarding may use the ordinary word record outside template cells", doneWithOrdinaryRecordProse, "check-onboarding-graph.ts", 0);
|
|
630
|
+
runFixture("a genuinely completed onboarding graph also satisfies --require-done", doneWithOrdinaryRecordProse, "check-onboarding-graph.ts", 0, undefined, [
|
|
631
|
+
"--require-done",
|
|
632
|
+
]);
|
|
633
|
+
|
|
634
|
+
const doneWithTodoInInlineCodeSpan = makeFixture("onboarding-graph-done-with-todo-in-inline-code-span");
|
|
635
|
+
{
|
|
636
|
+
markOnboardingDone(doneWithTodoInInlineCodeSpan);
|
|
637
|
+
mutateOnboarding(doneWithTodoInInlineCodeSpan, (text) => {
|
|
638
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
639
|
+
// A triple-backtick code SPAN (CommonMark allows any run length as a code-span delimiter,
|
|
640
|
+
// not just single backticks) sitting mid-line inside a sentence -- not alone on its own
|
|
641
|
+
// line -- is not a fence at all; the rendered document shows TODO right there, in the open.
|
|
642
|
+
// A fence-stripper that matches a run of 3+ backticks anywhere, ignoring line position,
|
|
643
|
+
// cannot tell this apart from a real fence and would erase the word along with its
|
|
644
|
+
// delimiters, hiding a genuine unfinished-work marker from the placeholder scan below.
|
|
645
|
+
return `${completed}\nThis section still displays \`\`\`TODO\`\`\` inline as a worked example of what NOT to leave in a finished artifact.\n`;
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
runFixture(
|
|
649
|
+
"a TODO marker inside an inline triple-backtick code span still fails --require-done as incomplete",
|
|
650
|
+
doneWithTodoInInlineCodeSpan,
|
|
651
|
+
"check-onboarding-graph.ts",
|
|
652
|
+
1,
|
|
653
|
+
"onboarding_graph.placeholder_complete",
|
|
654
|
+
["--require-done"],
|
|
655
|
+
);
|
|
656
|
+
|
|
657
|
+
const doneWithTodoAfterIndentedFenceLookalike = makeFixture("onboarding-graph-done-with-todo-after-indented-fence-lookalike");
|
|
658
|
+
{
|
|
659
|
+
markOnboardingDone(doneWithTodoAfterIndentedFenceLookalike);
|
|
660
|
+
mutateOnboarding(doneWithTodoAfterIndentedFenceLookalike, (text) => {
|
|
661
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
662
|
+
// Both backtick runs are indented 4 spaces -- CommonMark's own cutoff for "this indentation
|
|
663
|
+
// starts an indented code block instead of a fence" (a fence may be indented at most 3
|
|
664
|
+
// spaces). A position-blind stripper that ignores indentation would still pair these two
|
|
665
|
+
// runs as an opener/closer and erase the live TODO line sitting between them; a real
|
|
666
|
+
// renderer never treats either line as a fence delimiter, so the TODO stays visible.
|
|
667
|
+
return `${completed}\n \`\`\`\nThis line still visibly says TODO and sits between two over-indented backtick runs.\n \`\`\`\n`;
|
|
668
|
+
});
|
|
669
|
+
}
|
|
670
|
+
runFixture(
|
|
671
|
+
"a TODO marker between two over-indented (4-space) backtick runs still fails --require-done as incomplete",
|
|
672
|
+
doneWithTodoAfterIndentedFenceLookalike,
|
|
673
|
+
"check-onboarding-graph.ts",
|
|
674
|
+
1,
|
|
675
|
+
"onboarding_graph.placeholder_complete",
|
|
676
|
+
["--require-done"],
|
|
677
|
+
);
|
|
678
|
+
|
|
679
|
+
const doneWithTodoAfterInlineHtmlTagMention = makeFixture("onboarding-graph-done-with-todo-after-inline-html-tag-mention");
|
|
680
|
+
{
|
|
681
|
+
markOnboardingDone(doneWithTodoAfterInlineHtmlTagMention);
|
|
682
|
+
mutateOnboarding(doneWithTodoAfterInlineHtmlTagMention, (text) => {
|
|
683
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
684
|
+
// The tag mention sits inside an inline code span mid-sentence, not alone at the start of its
|
|
685
|
+
// own line -- CommonMark never treats it as a real HTML block opener, so the rendered
|
|
686
|
+
// document shows both this sentence and the later TODO line right there, in the open. A
|
|
687
|
+
// position-blind stripper that matches the tag name anywhere in the raw text would still read
|
|
688
|
+
// this as an unterminated opener and, finding no closing tag anywhere after it, erase
|
|
689
|
+
// everything through end of document -- including the live TODO line below -- along with it.
|
|
690
|
+
return `${completed}\nThis section still mentions \`<style>\` inline as a worked example of a tag name, not a real block.\nThis line still visibly says TODO, well after that inline mention.\n`;
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
runFixture(
|
|
694
|
+
"a TODO marker after an inline mid-sentence HTML tag mention still fails --require-done as incomplete",
|
|
695
|
+
doneWithTodoAfterInlineHtmlTagMention,
|
|
696
|
+
"check-onboarding-graph.ts",
|
|
697
|
+
1,
|
|
698
|
+
"onboarding_graph.placeholder_complete",
|
|
699
|
+
["--require-done"],
|
|
700
|
+
);
|
|
701
|
+
|
|
702
|
+
const doneWithIndentedGraphRunTable = makeFixture("onboarding-graph-done-with-indented-graph-run-table");
|
|
703
|
+
{
|
|
704
|
+
markOnboardingDone(doneWithIndentedGraphRunTable);
|
|
705
|
+
mutateOnboarding(doneWithIndentedGraphRunTable, (text) => {
|
|
706
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
707
|
+
// Indenting the whole Graph Run table by 4 spaces turns it into a CommonMark indented code
|
|
708
|
+
// block (preceded by the blank line right after the "## Graph Run" heading) -- a rendered
|
|
709
|
+
// page shows this as inert code text, not as the graph's actual completion record.
|
|
710
|
+
// graphRunRows() has no notion of indentation and only ever matches each line's own
|
|
711
|
+
// *trimmed* text against "starts with |", so an indented, non-rendering table still
|
|
712
|
+
// registered every node as done.
|
|
713
|
+
// The header cells below are separated by \s* rather than a literal single space because
|
|
714
|
+
// the shipped template's Graph Run table is column-aligned (ADR-0002 repository layout
|
|
715
|
+
// move re-rendered it with padded cells) -- the same table graphRunRows() itself reads by
|
|
716
|
+
// trimming each cell, not by any fixed-width assumption.
|
|
717
|
+
const table = completed.match(/\|\s*Node\s*\|\s*Status\s*\|\s*Owner\s*\|\s*Result or next action\s*\|\n(?:\|.*\|\n?)+/);
|
|
718
|
+
if (!table) throw new Error("fixture setup: could not locate the Graph Run table to indent");
|
|
719
|
+
const indented = table[0]
|
|
720
|
+
.split("\n")
|
|
721
|
+
.map((line) => (line.length > 0 ? ` ${line}` : line))
|
|
722
|
+
.join("\n");
|
|
723
|
+
return completed.replace(table[0], indented);
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
runFixture(
|
|
727
|
+
"a Graph Run table indented into a CommonMark code block still fails every node as not done",
|
|
728
|
+
doneWithIndentedGraphRunTable,
|
|
729
|
+
"check-onboarding-graph.ts",
|
|
730
|
+
1,
|
|
731
|
+
"onboarding_graph.node_not_done",
|
|
732
|
+
["--require-done"],
|
|
733
|
+
);
|
|
734
|
+
|
|
735
|
+
// ONB-22's own catalog gate (check:onboarding-graph-complete) passes --require-done
|
|
736
|
+
// unconditionally -- the shipped template's Graph Run table still reads not_started for every
|
|
737
|
+
// node, so this is the one case that must fail even though the lenient baseline case above
|
|
738
|
+
// passes clean. This no longer depends on lanes.onboarding.status: the content checks below
|
|
739
|
+
// (which --require-done always runs, regardless of that field's value) reject the unstarted
|
|
740
|
+
// template on their own.
|
|
741
|
+
runFixture(
|
|
742
|
+
"the shipped template's own gate (--require-done) refuses to accept an unstarted onboarding lane",
|
|
743
|
+
baseline,
|
|
744
|
+
"check-onboarding-graph.ts",
|
|
745
|
+
1,
|
|
746
|
+
"onboarding_graph.placeholder_complete",
|
|
747
|
+
["--require-done"],
|
|
748
|
+
);
|
|
749
|
+
|
|
750
|
+
const completeArtifactLaneNeverMarkedDone = makeFixture("onboarding-graph-complete-artifact-lane-never-marked-done");
|
|
751
|
+
{
|
|
752
|
+
// Deliberately does NOT call markOnboardingDone -- lanes.onboarding.status stays at the
|
|
753
|
+
// shipped default (not_started), exactly as it would in a real durable-engine run: no
|
|
754
|
+
// production code path ever commits lanes.onboarding.status to "done" as a *result* of
|
|
755
|
+
// ONB-22's gate passing (kernel/engine/runstate.ts's reconcilePatch()/acceptVerification() only
|
|
756
|
+
// mutate run-state.json, never business-state.json). Requiring that field to already say done
|
|
757
|
+
// as --require-done's own precondition was therefore a deadlock the engine could never
|
|
758
|
+
// legitimately clear -- this proves the artifact's own content is sufficient on its own.
|
|
759
|
+
mutateOnboarding(completeArtifactLaneNeverMarkedDone, (text) => {
|
|
760
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
761
|
+
return `${completed}\nThis remains the canonical execution record for the completed onboarding system.\n`;
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
runFixture(
|
|
765
|
+
"ONB-22's --require-done gate passes on a genuinely complete artifact even though lanes.onboarding.status was never externally marked done",
|
|
766
|
+
completeArtifactLaneNeverMarkedDone,
|
|
767
|
+
"check-onboarding-graph.ts",
|
|
768
|
+
0,
|
|
769
|
+
undefined,
|
|
770
|
+
["--require-done"],
|
|
771
|
+
);
|
|
772
|
+
|
|
773
|
+
// A durable-engine-managed v2 workspace has no state/business-state.json at all (its canonical
|
|
774
|
+
// state is state/business-state.json, per kernel/session/run.ts's resolveWorkspacePaths()) --
|
|
775
|
+
// without loadLaneFromBusinessStateV2()'s fallback in check-onboarding-graph.ts, ONB-22's own
|
|
776
|
+
// --require-done gate would report the lane permanently missing on every genuinely completed
|
|
777
|
+
// v2 run, since loadProjectState() alone only ever reads the v1 file. buildValidBusinessStateV2
|
|
778
|
+
// produces a complete, schema-valid document (loadLaneFromBusinessStateV2 runs every v2 document
|
|
779
|
+
// through validateBusinessState() and fails closed on anything less -- a fixture using a partial
|
|
780
|
+
// object would test a state the real validator never actually accepts).
|
|
781
|
+
const ALL_LANE_KEYS = [
|
|
782
|
+
"paid_tool_routing",
|
|
783
|
+
"secrets",
|
|
784
|
+
"security",
|
|
785
|
+
"research",
|
|
786
|
+
"traceability",
|
|
787
|
+
"experience",
|
|
788
|
+
"product",
|
|
789
|
+
"design",
|
|
790
|
+
"emotional_design",
|
|
791
|
+
"content_assets",
|
|
792
|
+
"analytics_attribution",
|
|
793
|
+
"paid_user_acquisition",
|
|
794
|
+
"onboarding",
|
|
795
|
+
"revenue",
|
|
796
|
+
"store_console",
|
|
797
|
+
"apple_signing",
|
|
798
|
+
"privacy_legal",
|
|
799
|
+
"email",
|
|
800
|
+
"orchestration",
|
|
801
|
+
"engineering",
|
|
802
|
+
"growth",
|
|
803
|
+
"post_launch_ops",
|
|
804
|
+
];
|
|
805
|
+
|
|
806
|
+
function buildValidBusinessStateV2(onboardingLane: { status: string; evidence: string[]; blockers: string[] }): Record<string, unknown> {
|
|
807
|
+
const lanes: Record<string, unknown> = {};
|
|
808
|
+
for (const key of ALL_LANE_KEYS) {
|
|
809
|
+
lanes[key] = key === "onboarding" ? onboardingLane : { status: "pending", evidence: [], blockers: [] };
|
|
810
|
+
}
|
|
811
|
+
return {
|
|
812
|
+
schemaVersion: "2.0.0",
|
|
813
|
+
updatedAt: "2026-08-09T00:00:00.000Z",
|
|
814
|
+
narrative: { sinceLastTime: "", rightNow: "", yourCall: "", lastCelebratedPhase: "" },
|
|
815
|
+
project: {
|
|
816
|
+
name: "Fixture App",
|
|
817
|
+
slug: "fixture-app",
|
|
818
|
+
owner: "Founder",
|
|
819
|
+
phase: "phase_2_build",
|
|
820
|
+
launchScope: "essentials",
|
|
821
|
+
kickoffDate: "",
|
|
822
|
+
platforms: ["ios"],
|
|
823
|
+
bundleIds: { ios: "com.example.app", android: "" },
|
|
824
|
+
publicUrls: { landing: "", privacy: "", terms: "" },
|
|
825
|
+
},
|
|
826
|
+
lanes,
|
|
827
|
+
founderGates: { pending: [] },
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
const v2LaneComplete = makeFixture("onboarding-graph-v2-business-state-complete");
|
|
832
|
+
{
|
|
833
|
+
rmSync(path.join(v2LaneComplete, "state/business-state.json"), { force: true });
|
|
834
|
+
writeFileSync(
|
|
835
|
+
path.join(v2LaneComplete, "state/business-state.json"),
|
|
836
|
+
JSON.stringify(buildValidBusinessStateV2({ status: "succeeded", evidence: ["product/ONBOARDING.md", "product/onboarding.html"], blockers: [] })),
|
|
837
|
+
"utf8",
|
|
838
|
+
);
|
|
839
|
+
mutateOnboarding(v2LaneComplete, (text) => {
|
|
840
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
841
|
+
return `${completed}\nThis remains the canonical execution record for the completed onboarding system.\n`;
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
runFixture(
|
|
845
|
+
"a current workspace reads completed lanes.onboarding from business state and satisfies --require-done",
|
|
846
|
+
v2LaneComplete,
|
|
847
|
+
"check-onboarding-graph.ts",
|
|
848
|
+
0,
|
|
849
|
+
undefined,
|
|
850
|
+
["--require-done"],
|
|
851
|
+
);
|
|
852
|
+
|
|
853
|
+
const v2LanePendingIncompleteArtifact = makeFixture("onboarding-graph-v2-business-state-pending-incomplete-artifact");
|
|
854
|
+
{
|
|
855
|
+
rmSync(path.join(v2LanePendingIncompleteArtifact, "state/business-state.json"), { force: true });
|
|
856
|
+
writeFileSync(
|
|
857
|
+
path.join(v2LanePendingIncompleteArtifact, "state/business-state.json"),
|
|
858
|
+
JSON.stringify(buildValidBusinessStateV2({ status: "pending", evidence: [], blockers: [] })),
|
|
859
|
+
"utf8",
|
|
860
|
+
);
|
|
861
|
+
}
|
|
862
|
+
runFixture(
|
|
863
|
+
"a v2 workspace with an unfinished onboarding lane and an unfinished artifact still fails --require-done",
|
|
864
|
+
v2LanePendingIncompleteArtifact,
|
|
865
|
+
"check-onboarding-graph.ts",
|
|
866
|
+
1,
|
|
867
|
+
"onboarding_graph.placeholder_complete",
|
|
868
|
+
["--require-done"],
|
|
869
|
+
);
|
|
870
|
+
|
|
871
|
+
// lanes.onboarding.status never legitimately becomes "succeeded" as a *result* of ONB-22's own
|
|
872
|
+
// gate passing under the durable engine (kernel/engine/runstate.ts's reconcilePatch()/
|
|
873
|
+
// acceptVerification() only ever mutate run-state.json, never business-state.json) -- so a
|
|
874
|
+
// canonical v2 lane realistically sits at "pending" for the entire run, including at the exact
|
|
875
|
+
// moment ONB-22 itself finally executes. --require-done must not deadlock on that: it validates
|
|
876
|
+
// the artifact's own content, not an externally-tracked field nothing ever sets to done for it.
|
|
877
|
+
const v2LanePendingCompleteArtifact = makeFixture("onboarding-graph-v2-business-state-pending-complete-artifact");
|
|
878
|
+
{
|
|
879
|
+
rmSync(path.join(v2LanePendingCompleteArtifact, "state/business-state.json"), { force: true });
|
|
880
|
+
writeFileSync(
|
|
881
|
+
path.join(v2LanePendingCompleteArtifact, "state/business-state.json"),
|
|
882
|
+
JSON.stringify(buildValidBusinessStateV2({ status: "pending", evidence: [], blockers: [] })),
|
|
883
|
+
"utf8",
|
|
884
|
+
);
|
|
885
|
+
mutateOnboarding(v2LanePendingCompleteArtifact, (text) => {
|
|
886
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
887
|
+
return `${completed}\nThis remains the canonical execution record for the completed onboarding system.\n`;
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
runFixture(
|
|
891
|
+
"ONB-22's --require-done gate does not deadlock on a canonical v2 lane still pending once the artifact itself is genuinely complete",
|
|
892
|
+
v2LanePendingCompleteArtifact,
|
|
893
|
+
"check-onboarding-graph.ts",
|
|
894
|
+
0,
|
|
895
|
+
undefined,
|
|
896
|
+
["--require-done"],
|
|
897
|
+
);
|
|
898
|
+
|
|
899
|
+
// check-onboarding-graph.ts must fail closed on a malformed/partial business-state.json, never
|
|
900
|
+
// silently extract the one field it wants from an unvalidated document -- a corrupt canonical
|
|
901
|
+
// file must not quietly authorize the destructive ONB-22 cutover.
|
|
902
|
+
const v2LaneInvalid = makeFixture("onboarding-graph-v2-business-state-invalid");
|
|
903
|
+
{
|
|
904
|
+
rmSync(path.join(v2LaneInvalid, "state/business-state.json"), { force: true });
|
|
905
|
+
writeFileSync(
|
|
906
|
+
path.join(v2LaneInvalid, "state/business-state.json"),
|
|
907
|
+
JSON.stringify({ schemaVersion: "2.0.0", lanes: { onboarding: { status: "succeeded", evidence: [], blockers: [] } } }),
|
|
908
|
+
"utf8",
|
|
909
|
+
);
|
|
910
|
+
}
|
|
911
|
+
runFixture(
|
|
912
|
+
"a malformed business-state.json (missing required top-level fields) fails closed instead of trusting its one readable field",
|
|
913
|
+
v2LaneInvalid,
|
|
914
|
+
"check-onboarding-graph.ts",
|
|
915
|
+
1,
|
|
916
|
+
"project_state.invalid_schema",
|
|
917
|
+
);
|
|
918
|
+
|
|
919
|
+
// Pending work does not claim a finished onboarding artifact.
|
|
920
|
+
const pendingOnboarding = makeFixture("onboarding-pending");
|
|
921
|
+
{
|
|
922
|
+
writeFileSync(
|
|
923
|
+
path.join(pendingOnboarding, "state/business-state.json"),
|
|
924
|
+
JSON.stringify(buildValidBusinessStateV2({ status: "pending", evidence: [], blockers: [] })),
|
|
925
|
+
"utf8",
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
runFixture("pending onboarding does not trigger completion checks against an unfinished artifact", pendingOnboarding, "check-onboarding-graph.ts", 0);
|
|
929
|
+
|
|
930
|
+
// Provider-proof checks read the same reducer-owned state as onboarding.
|
|
931
|
+
const pendingOnboardingNeedsNoProof = makeFixture("onboarding-pending-no-proof");
|
|
932
|
+
{
|
|
933
|
+
rmSync(path.join(pendingOnboardingNeedsNoProof, "state/business-state.json"), { force: true });
|
|
934
|
+
writeFileSync(
|
|
935
|
+
path.join(pendingOnboardingNeedsNoProof, "state/business-state.json"),
|
|
936
|
+
JSON.stringify(buildValidBusinessStateV2({ status: "pending", evidence: [], blockers: [] })),
|
|
937
|
+
"utf8",
|
|
938
|
+
);
|
|
939
|
+
}
|
|
940
|
+
runFixture("pending onboarding accepts the current state without provider proof", pendingOnboardingNeedsNoProof, "check-live-provider-proof.ts", 0);
|
|
941
|
+
|
|
942
|
+
const completedOnboardingNeedsProof = makeFixture("onboarding-completed-needs-proof");
|
|
943
|
+
{
|
|
944
|
+
writeFileSync(
|
|
945
|
+
path.join(completedOnboardingNeedsProof, "state/business-state.json"),
|
|
946
|
+
JSON.stringify(buildValidBusinessStateV2({ status: "succeeded", evidence: ["product/ONBOARDING.md"], blockers: [] })),
|
|
947
|
+
"utf8",
|
|
948
|
+
);
|
|
949
|
+
rmSync(path.join(completedOnboardingNeedsProof, "operations/PROVIDER_PROOF.md"), { force: true });
|
|
950
|
+
}
|
|
951
|
+
runFixture("completed onboarding requires provider proof", completedOnboardingNeedsProof, "check-live-provider-proof.ts", 1, "provider_proof.file_missing");
|
|
952
|
+
|
|
953
|
+
const doneWithUncheckedVerification = makeFixture("onboarding-graph-done-with-unchecked-verification");
|
|
954
|
+
{
|
|
955
|
+
markOnboardingDone(doneWithUncheckedVerification);
|
|
956
|
+
// Same table- and prose-filling treatment as the passing "genuinely completed" fixture
|
|
957
|
+
// above, but the Verification section's own "- [ ]" checklist is deliberately left untouched.
|
|
958
|
+
mutateOnboarding(doneWithUncheckedVerification, (text) => fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
959
|
+
}
|
|
960
|
+
runFixture(
|
|
961
|
+
"a done lane with every Verification checklist item still unchecked fails",
|
|
962
|
+
doneWithUncheckedVerification,
|
|
963
|
+
"check-onboarding-graph.ts",
|
|
964
|
+
1,
|
|
965
|
+
"onboarding_graph.verification_incomplete",
|
|
966
|
+
["--require-done"],
|
|
967
|
+
);
|
|
968
|
+
|
|
969
|
+
const statusColumnSpoofed = makeFixture("onboarding-graph-status-column-spoofed");
|
|
970
|
+
{
|
|
971
|
+
markOnboardingDone(statusColumnSpoofed);
|
|
972
|
+
mutateOnboarding(statusColumnSpoofed, (text) => {
|
|
973
|
+
const filled = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
974
|
+
// ONB-01's row now reads "done" in the Status column like every other row from the blanket
|
|
975
|
+
// replace above; put it back to "partial" there while planting the literal word "done" in
|
|
976
|
+
// its Result cell, proving the checker reads the Status column specifically, not any cell
|
|
977
|
+
// in the row. Matched by pattern rather than a literal single-spaced string because the
|
|
978
|
+
// shipped table's cells are column-aligned (padded to their widest row), not fixed-width.
|
|
979
|
+
return filled.replace(
|
|
980
|
+
/\|\s*`ONB-01`\s*\|\s*done\s*\|\s*Engineering and product\s*\|\s*Trace the current implementation\s*\|/,
|
|
981
|
+
"| `ONB-01` | partial | Engineering and product | done, this work is done |",
|
|
982
|
+
);
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
runFixture(
|
|
986
|
+
"a Graph Run row's non-status cell mentioning done does not substitute for its Status column",
|
|
987
|
+
statusColumnSpoofed,
|
|
988
|
+
"check-onboarding-graph.ts",
|
|
989
|
+
1,
|
|
990
|
+
"onboarding_graph.node_not_done",
|
|
991
|
+
["--require-done"],
|
|
992
|
+
);
|
|
993
|
+
|
|
994
|
+
const duplicateGraphRunRow = makeFixture("onboarding-graph-duplicate-row");
|
|
995
|
+
{
|
|
996
|
+
markOnboardingDone(duplicateGraphRunRow);
|
|
997
|
+
mutateOnboarding(duplicateGraphRunRow, (text) => {
|
|
998
|
+
const filled = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
999
|
+
// A resumed or merged run can retain a stale row for a node alongside a freshly appended
|
|
1000
|
+
// one instead of updating it in place -- duplicate ONB-01's row with a conflicting status
|
|
1001
|
+
// to prove the checker rejects this instead of accepting the node because some row says done.
|
|
1002
|
+
// Matched by pattern rather than a literal single-spaced string because the shipped table's
|
|
1003
|
+
// cells are column-aligned (padded to their widest row), not fixed-width.
|
|
1004
|
+
return filled.replace(
|
|
1005
|
+
/\|\s*`ONB-01`\s*\|\s*done\s*\|\s*Engineering and product\s*\|\s*Trace the current implementation\s*\|/,
|
|
1006
|
+
"| `ONB-01` | partial | Engineering and product | Trace the current implementation |\n| `ONB-01` | done | Engineering and product | Trace the current implementation |",
|
|
1007
|
+
);
|
|
1008
|
+
});
|
|
1009
|
+
}
|
|
1010
|
+
runFixture(
|
|
1011
|
+
"duplicate Graph Run rows for one node fail even when one of them says done",
|
|
1012
|
+
duplicateGraphRunRow,
|
|
1013
|
+
"check-onboarding-graph.ts",
|
|
1014
|
+
1,
|
|
1015
|
+
"onboarding_graph.node_duplicate_row",
|
|
1016
|
+
["--require-done"],
|
|
1017
|
+
);
|
|
1018
|
+
|
|
1019
|
+
const fencedFakeGraphRunTable = makeFixture("onboarding-graph-fenced-fake-table");
|
|
1020
|
+
{
|
|
1021
|
+
markOnboardingDone(fencedFakeGraphRunTable);
|
|
1022
|
+
mutateOnboarding(fencedFakeGraphRunTable, (text) => {
|
|
1023
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1024
|
+
const graphRunSection = completed.match(/## Graph Run\n[\s\S]*?(?=\n## )/)?.[0];
|
|
1025
|
+
if (!graphRunSection) throw new Error("fixture setup: could not locate the Graph Run section to relocate");
|
|
1026
|
+
// Remove the live "## Graph Run" heading and table entirely and relocate the exact same
|
|
1027
|
+
// (all-done) content into a fenced code sample instead -- it is now the ONLY "## Graph Run"
|
|
1028
|
+
// heading anywhere in the document. sectionBody()'s own line search finds whichever "##
|
|
1029
|
+
// Graph Run" line comes first with no regard for fences, so before this fix this fenced
|
|
1030
|
+
// sample would have been picked up as the canonical run record and accepted every node as
|
|
1031
|
+
// done; after the fix, graphRunNodeStatus() reads only the fence-stripped live text, finds
|
|
1032
|
+
// no live Graph Run table at all, and correctly reports every node as not recorded.
|
|
1033
|
+
const withoutLiveTable = completed.replace(graphRunSection, "");
|
|
1034
|
+
return `${withoutLiveTable}\n\`\`\`markdown\n${graphRunSection}\n\`\`\`\n`;
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
runFixture(
|
|
1038
|
+
"a fenced fake Graph Run table cannot substitute for the removed live one",
|
|
1039
|
+
fencedFakeGraphRunTable,
|
|
1040
|
+
"check-onboarding-graph.ts",
|
|
1041
|
+
1,
|
|
1042
|
+
"onboarding_graph.node_not_done",
|
|
1043
|
+
["--require-done"],
|
|
1044
|
+
);
|
|
1045
|
+
|
|
1046
|
+
const verificationChecklistDeleted = makeFixture("onboarding-graph-verification-checklist-deleted");
|
|
1047
|
+
{
|
|
1048
|
+
markOnboardingDone(verificationChecklistDeleted);
|
|
1049
|
+
mutateOnboarding(verificationChecklistDeleted, (text) => {
|
|
1050
|
+
const completed = fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done")));
|
|
1051
|
+
// Delete every Verification checklist item outright (not just leave it unchecked) --
|
|
1052
|
+
// countUncheckedItems() alone reads 0 just as happily on an emptied section as on a
|
|
1053
|
+
// genuinely completed one, so this must be caught by a minimum-item-count check instead.
|
|
1054
|
+
return completed.replace(/## Verification[\s\S]*$/, "## Verification\n");
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
runFixture(
|
|
1058
|
+
"deleting the Verification checklist outright still fails even though nothing is left unchecked",
|
|
1059
|
+
verificationChecklistDeleted,
|
|
1060
|
+
"check-onboarding-graph.ts",
|
|
1061
|
+
1,
|
|
1062
|
+
"onboarding_graph.verification_items_missing",
|
|
1063
|
+
["--require-done"],
|
|
1064
|
+
);
|
|
1065
|
+
|
|
1066
|
+
const verificationChecklistDeletedAndDuplicated = makeFixture("onboarding-graph-verification-checklist-deleted-and-duplicated");
|
|
1067
|
+
{
|
|
1068
|
+
markOnboardingDone(verificationChecklistDeletedAndDuplicated);
|
|
1069
|
+
mutateOnboarding(verificationChecklistDeletedAndDuplicated, (text) => {
|
|
1070
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1071
|
+
// Delete the first canonical assertion and duplicate the second one in its place --
|
|
1072
|
+
// verificationItemCount still reaches 11 and countUncheckedItems() still reads 0, so a
|
|
1073
|
+
// count-only check would accept this even though a required assertion is now genuinely
|
|
1074
|
+
// missing, replaced by a copy of an unrelated one.
|
|
1075
|
+
return completed.replace(
|
|
1076
|
+
"- [x] `ONB-00` through `ONB-22` are done, or the lane is not claimed done\n- [x] Evidence, reviews, authorized Onbo Hub, internal guidance, provider, policy, seven-principle, and motion research are joined\n",
|
|
1077
|
+
"- [x] Evidence, reviews, authorized Onbo Hub, internal guidance, provider, policy, seven-principle, and motion research are joined\n- [x] Evidence, reviews, authorized Onbo Hub, internal guidance, provider, policy, seven-principle, and motion research are joined\n",
|
|
1078
|
+
);
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
runFixture(
|
|
1082
|
+
"deleting one canonical assertion and duplicating another still fails even though the count and unchecked total both look correct",
|
|
1083
|
+
verificationChecklistDeletedAndDuplicated,
|
|
1084
|
+
"check-onboarding-graph.ts",
|
|
1085
|
+
1,
|
|
1086
|
+
"onboarding_graph.verification_assertion_missing",
|
|
1087
|
+
["--require-done"],
|
|
1088
|
+
);
|
|
1089
|
+
|
|
1090
|
+
// Regression (round 23): the round-22 fix above still matched a fingerprint against the whole
|
|
1091
|
+
// section's raw text, so it passed as long as the deleted item's distinguishing text existed
|
|
1092
|
+
// ANYWHERE in the section -- including as ordinary prose that was never actually a checked
|
|
1093
|
+
// checklist line. Deleting the first item's checked line, leaving its exact text behind as a
|
|
1094
|
+
// floating (non-list) sentence, and duplicating the second item's checked line to keep the
|
|
1095
|
+
// total count at 11 used to satisfy every existing check: the item count, the unchecked count,
|
|
1096
|
+
// and a substring-anywhere fingerprint search all stayed green.
|
|
1097
|
+
const verificationFingerprintNotActuallyChecked = makeFixture("onboarding-graph-verification-fingerprint-not-actually-checked");
|
|
1098
|
+
{
|
|
1099
|
+
markOnboardingDone(verificationFingerprintNotActuallyChecked);
|
|
1100
|
+
mutateOnboarding(verificationFingerprintNotActuallyChecked, (text) => {
|
|
1101
|
+
const completed = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1102
|
+
return completed.replace(
|
|
1103
|
+
"- [x] `ONB-00` through `ONB-22` are done, or the lane is not claimed done\n- [x] Evidence, reviews, authorized Onbo Hub, internal guidance, provider, policy, seven-principle, and motion research are joined\n",
|
|
1104
|
+
"Historical note: `ONB-00` through `ONB-22` are done, or the lane is not claimed done -- see the retired checklist archive for detail.\n- [x] Evidence, reviews, authorized Onbo Hub, internal guidance, provider, policy, seven-principle, and motion research are joined\n- [x] Evidence, reviews, authorized Onbo Hub, internal guidance, provider, policy, seven-principle, and motion research are joined\n",
|
|
1105
|
+
);
|
|
1106
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
runFixture(
|
|
1109
|
+
"a deleted assertion's text surviving only as floating prose still fails, not just a fully-vanished assertion",
|
|
1110
|
+
verificationFingerprintNotActuallyChecked,
|
|
1111
|
+
"check-onboarding-graph.ts",
|
|
1112
|
+
1,
|
|
1113
|
+
"onboarding_graph.verification_assertion_missing",
|
|
1114
|
+
["--require-done"],
|
|
1115
|
+
);
|
|
1116
|
+
|
|
1117
|
+
const doneWithLegitimateAnswerWords = makeFixture("onboarding-graph-done-with-legitimate-answer-words");
|
|
1118
|
+
{
|
|
1119
|
+
markOnboardingDone(doneWithLegitimateAnswerWords);
|
|
1120
|
+
mutateOnboarding(doneWithLegitimateAnswerWords, (text) => {
|
|
1121
|
+
const filled = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1122
|
+
// The template itself prescribes these as the terminal answer format ("Yes or no" / "Pass
|
|
1123
|
+
// or gaps"); a real completed launch collapses them to the single chosen word.
|
|
1124
|
+
return filled.replaceAll("Yes or no", "Yes").replaceAll("Pass or gaps", "Pass");
|
|
1125
|
+
});
|
|
1126
|
+
}
|
|
1127
|
+
runFixture(
|
|
1128
|
+
"completed onboarding may answer Required/QA cells with the template's own prescribed Yes/Pass terminal words",
|
|
1129
|
+
doneWithLegitimateAnswerWords,
|
|
1130
|
+
"check-onboarding-graph.ts",
|
|
1131
|
+
0,
|
|
1132
|
+
undefined,
|
|
1133
|
+
["--require-done"],
|
|
1134
|
+
);
|
|
1135
|
+
|
|
1136
|
+
const doneWithUnfilledProseDirective = makeFixture("onboarding-graph-done-with-unfilled-prose-directive");
|
|
1137
|
+
{
|
|
1138
|
+
markOnboardingDone(doneWithUnfilledProseDirective);
|
|
1139
|
+
// Table cells, checklist, and status header are all completed, but the Execution Mode
|
|
1140
|
+
// section's own directive-verb-led paragraph ("Record `greenfield`, ...") is left exactly
|
|
1141
|
+
// as the shipped template wrote it -- table-only placeholder detection would miss this.
|
|
1142
|
+
mutateOnboarding(doneWithUnfilledProseDirective, (text) => checkVerificationItems(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1143
|
+
}
|
|
1144
|
+
runFixture(
|
|
1145
|
+
"a done lane with an unfilled prose directive (Execution Mode, evidence trace, ...) fails",
|
|
1146
|
+
doneWithUnfilledProseDirective,
|
|
1147
|
+
"check-onboarding-graph.ts",
|
|
1148
|
+
1,
|
|
1149
|
+
"onboarding_graph.placeholder_complete",
|
|
1150
|
+
["--require-done"],
|
|
1151
|
+
);
|
|
1152
|
+
|
|
1153
|
+
const staleStatusHeader = makeFixture("onboarding-graph-stale-status-header");
|
|
1154
|
+
{
|
|
1155
|
+
markOnboardingDone(staleStatusHeader);
|
|
1156
|
+
mutateOnboarding(staleStatusHeader, (text) => {
|
|
1157
|
+
const filled = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1158
|
+
// Every node, checklist item, and table cell now says done; put only the artifact's own
|
|
1159
|
+
// top-of-document "Status: `done`" header back to "partial" to prove it is independently
|
|
1160
|
+
// required to agree, not just inferred from everything else being done.
|
|
1161
|
+
return filled.replace("Status: `done`", "Status: `partial`");
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
runFixture(
|
|
1165
|
+
"a done lane whose artifact Status header still says partial fails",
|
|
1166
|
+
staleStatusHeader,
|
|
1167
|
+
"check-onboarding-graph.ts",
|
|
1168
|
+
1,
|
|
1169
|
+
"onboarding_graph.artifact_status_not_done",
|
|
1170
|
+
["--require-done"],
|
|
1171
|
+
);
|
|
1172
|
+
|
|
1173
|
+
const deferredRequireDone = makeFixture("onboarding-graph-deferred-require-done");
|
|
1174
|
+
{
|
|
1175
|
+
const state = readState(deferredRequireDone);
|
|
1176
|
+
const lane = getLane(state, "onboarding");
|
|
1177
|
+
lane["status"] = "deferred";
|
|
1178
|
+
lane["blockers"] = ["2026-08-08 founder deferred onboarding until the product hypothesis is validated"];
|
|
1179
|
+
writeState(deferredRequireDone, state);
|
|
1180
|
+
}
|
|
1181
|
+
runFixture("the general onboarding-graph check still honors an explicit deferral", deferredRequireDone, "check-onboarding-graph.ts", 0);
|
|
1182
|
+
// --require-done's skip variable is deliberately `laneExempt && hasDeferralReason && !requireDone`
|
|
1183
|
+
// -- the deferral exemption belongs to the general (lenient) invocation only. Under
|
|
1184
|
+
// --require-done, ONB-22's own gate still runs the full content checks against this fixture's
|
|
1185
|
+
// deliberately untouched (still unstarted) artifact regardless of the deferred status, and fails
|
|
1186
|
+
// on the same placeholder content the baseline unstarted-template fixture does.
|
|
1187
|
+
runFixture(
|
|
1188
|
+
"a deferred onboarding lane still fails ONB-22's own --require-done gate",
|
|
1189
|
+
deferredRequireDone,
|
|
1190
|
+
"check-onboarding-graph.ts",
|
|
1191
|
+
1,
|
|
1192
|
+
"onboarding_graph.placeholder_complete",
|
|
1193
|
+
["--require-done"],
|
|
1194
|
+
);
|
|
1195
|
+
|
|
1196
|
+
const deferredWithoutReason = makeFixture("onboarding-graph-deferred-without-reason");
|
|
1197
|
+
{
|
|
1198
|
+
const state = readState(deferredWithoutReason);
|
|
1199
|
+
const lane = getLane(state, "onboarding");
|
|
1200
|
+
lane["status"] = "deferred";
|
|
1201
|
+
// Deliberately no blockers or reason recorded -- evidence alone (already present from
|
|
1202
|
+
// markOnboardingDone-adjacent shipped state) is not an explanation of why the lane stopped.
|
|
1203
|
+
writeState(deferredWithoutReason, state);
|
|
1204
|
+
}
|
|
1205
|
+
runFixture(
|
|
1206
|
+
"a deferred lane with no recorded blockers or reason fails even the general check",
|
|
1207
|
+
deferredWithoutReason,
|
|
1208
|
+
"check-onboarding-graph.ts",
|
|
1209
|
+
1,
|
|
1210
|
+
"onboarding_graph.deferred_without_reason",
|
|
1211
|
+
);
|
|
1212
|
+
|
|
1213
|
+
const doneWithCounterBoilerplate = makeFixture("onboarding-graph-done-with-counter-boilerplate");
|
|
1214
|
+
{
|
|
1215
|
+
markOnboardingDone(doneWithCounterBoilerplate);
|
|
1216
|
+
// Every directive cell gets the exact same boilerplate sentence with only an incrementing
|
|
1217
|
+
// number varying -- technically unique per cellTextCounts, but not real content.
|
|
1218
|
+
let counter = 0;
|
|
1219
|
+
mutateOnboarding(doneWithCounterBoilerplate, (text) =>
|
|
1220
|
+
checkVerificationItems(
|
|
1221
|
+
fillProseDirectiveLines(
|
|
1222
|
+
text
|
|
1223
|
+
.replaceAll("not_started", "done")
|
|
1224
|
+
.split("\n")
|
|
1225
|
+
.map((line) => {
|
|
1226
|
+
if (!line.trim().startsWith("|")) return line;
|
|
1227
|
+
return line
|
|
1228
|
+
.split("|")
|
|
1229
|
+
.map((cell) => {
|
|
1230
|
+
if (!TEMPLATE_DIRECTIVE_VERBS_PATTERN.test(cell)) return cell;
|
|
1231
|
+
counter += 1;
|
|
1232
|
+
return ` Evidence-${counter}: source-backed implementation detail dated 2026-08-08 `;
|
|
1233
|
+
})
|
|
1234
|
+
.join("|");
|
|
1235
|
+
})
|
|
1236
|
+
.join("\n"),
|
|
1237
|
+
),
|
|
1238
|
+
),
|
|
1239
|
+
);
|
|
1240
|
+
}
|
|
1241
|
+
runFixture(
|
|
1242
|
+
"a done lane whose table cells are all the same counter-varying boilerplate fails",
|
|
1243
|
+
doneWithCounterBoilerplate,
|
|
1244
|
+
"check-onboarding-graph.ts",
|
|
1245
|
+
1,
|
|
1246
|
+
"onboarding_graph.placeholder_complete",
|
|
1247
|
+
["--require-done"],
|
|
1248
|
+
);
|
|
1249
|
+
|
|
1250
|
+
const doneWithFixedDoctrineProse = makeFixture("onboarding-graph-done-with-fixed-doctrine-prose");
|
|
1251
|
+
{
|
|
1252
|
+
markOnboardingDone(doneWithFixedDoctrineProse);
|
|
1253
|
+
mutateOnboarding(doneWithFixedDoctrineProse, (text) => {
|
|
1254
|
+
const filled = checkVerificationItems(fillProseDirectiveLines(fillTemplateDirectiveCells(text.replaceAll("not_started", "done"))));
|
|
1255
|
+
// fillProseDirectiveLines swaps every directive-verb-led line's leading word, including
|
|
1256
|
+
// two sentences that sit directly above their own capture table (Analytics Contract's
|
|
1257
|
+
// "Define a machine-readable schema..." and First Value And Activation's "Define First
|
|
1258
|
+
// value rendered..."). Put those two back to literally "Define ..." -- exactly as shipped
|
|
1259
|
+
// -- while every genuine fill-in line stays filled, proving the validator's own
|
|
1260
|
+
// has-table-in-section exemption rather than a swapped-verb version of the same text.
|
|
1261
|
+
return filled
|
|
1262
|
+
.replace(
|
|
1263
|
+
"Confirmed First value rendered, First value engaged, Activation, habit signal, retention, monetization, review eligibility, and onboarding completion separately.",
|
|
1264
|
+
"Define First value rendered, First value engaged, Activation, habit signal, retention, monetization, review eligibility, and onboarding completion separately.",
|
|
1265
|
+
)
|
|
1266
|
+
.replace("Confirmed a machine-readable schema and typed clients.", "Define a machine-readable schema and typed clients.");
|
|
1267
|
+
});
|
|
1268
|
+
}
|
|
1269
|
+
runFixture(
|
|
1270
|
+
"fixed doctrine prose above a capture table passes even though it starts with a directive verb",
|
|
1271
|
+
doneWithFixedDoctrineProse,
|
|
1272
|
+
"check-onboarding-graph.ts",
|
|
1273
|
+
0,
|
|
1274
|
+
undefined,
|
|
1275
|
+
["--require-done"],
|
|
1276
|
+
);
|
|
1277
|
+
|
|
1278
|
+
// check-onboarding-evidence-packet.ts: ONB-03..ONB-08's own per-node deterministic gate
|
|
1279
|
+
// (round 5's production-verification fix). It reads --root and --path exactly the way
|
|
1280
|
+
// runDeterministicGates() invokes it.
|
|
1281
|
+
const evidenceScript = "check-onboarding-evidence-packet.ts";
|
|
1282
|
+
const writeEvidencePacket = (fixtureRoot: string, relativePath: string, content: string): void => {
|
|
1283
|
+
const filePath = path.join(fixtureRoot, relativePath);
|
|
1284
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
1285
|
+
writeFileSync(filePath, content, "utf8");
|
|
1286
|
+
};
|
|
1287
|
+
const substantiveResearchProse = (topic: string): string => {
|
|
1288
|
+
const sentence = `This is a substantive, source-backed paragraph describing real research into ${topic}. `;
|
|
1289
|
+
return `## Findings\n\nFinding: ${sentence.trim()}\n\nSource: fixture observation 2026-09-09.\nClassification: observation.\nDecision: retain the current plan for ${topic}.\nUncertainty: synthetic fixture evidence.\n\n${sentence.repeat(8)}\n`;
|
|
1290
|
+
};
|
|
1291
|
+
const conciseStructuredPacket = `## Findings
|
|
1292
|
+
|
|
1293
|
+
Finding: Competitor reviews name the three-step quiz as the drop-off.
|
|
1294
|
+
Source: App Store review sample 2026-09-01 (n=40).
|
|
1295
|
+
Classification: observation.
|
|
1296
|
+
Decision: ONB-09 adopt a shorter quiz.
|
|
1297
|
+
Uncertainty: sample is US-only.
|
|
1298
|
+
`;
|
|
1299
|
+
|
|
1300
|
+
const onb00PacketMissing = makeFixture("onboarding-evidence-onb00-missing");
|
|
1301
|
+
runFixture(
|
|
1302
|
+
"ONB-00's gate fails when the resume/scope packet does not exist yet",
|
|
1303
|
+
onb00PacketMissing,
|
|
1304
|
+
evidenceScript,
|
|
1305
|
+
1,
|
|
1306
|
+
"onboarding_evidence.packet_missing",
|
|
1307
|
+
["--node", "ONB-00", "--path", "product/onboarding/graph/ONB-00-resume-scope.md"],
|
|
1308
|
+
);
|
|
1309
|
+
|
|
1310
|
+
const onb00PacketComplete = makeFixture("onboarding-evidence-onb00-complete");
|
|
1311
|
+
writeEvidencePacket(
|
|
1312
|
+
onb00PacketComplete,
|
|
1313
|
+
"product/onboarding/graph/ONB-00-resume-scope.md",
|
|
1314
|
+
substantiveResearchProse("whether this run is greenfield, replacement, audit-only, or a bounded incremental scope"),
|
|
1315
|
+
);
|
|
1316
|
+
runFixture("ONB-00's gate passes a genuinely substantive, marker-free resume/scope packet", onb00PacketComplete, evidenceScript, 0, undefined, [
|
|
1317
|
+
"--node",
|
|
1318
|
+
"ONB-00",
|
|
1319
|
+
"--path",
|
|
1320
|
+
"product/onboarding/graph/ONB-00-resume-scope.md",
|
|
1321
|
+
]);
|
|
1322
|
+
|
|
1323
|
+
const onb01PacketMissing = makeFixture("onboarding-evidence-onb01-missing");
|
|
1324
|
+
runFixture(
|
|
1325
|
+
"ONB-01's gate fails when the current-state trace does not exist yet",
|
|
1326
|
+
onb01PacketMissing,
|
|
1327
|
+
evidenceScript,
|
|
1328
|
+
1,
|
|
1329
|
+
"onboarding_evidence.packet_missing",
|
|
1330
|
+
["--node", "ONB-01", "--path", "product/onboarding/graph/ONB-01-current-state-trace.md"],
|
|
1331
|
+
);
|
|
1332
|
+
|
|
1333
|
+
const onb01PacketComplete = makeFixture("onboarding-evidence-onb01-complete");
|
|
1334
|
+
writeEvidencePacket(
|
|
1335
|
+
onb01PacketComplete,
|
|
1336
|
+
"product/onboarding/graph/ONB-01-current-state-trace.md",
|
|
1337
|
+
substantiveResearchProse("the actual onboarding implementation, documents, routes, state, providers, events, failures, tests, and replaced surfaces"),
|
|
1338
|
+
);
|
|
1339
|
+
runFixture("ONB-01's gate passes a genuinely substantive, marker-free current-state trace", onb01PacketComplete, evidenceScript, 0, undefined, [
|
|
1340
|
+
"--node",
|
|
1341
|
+
"ONB-01",
|
|
1342
|
+
"--path",
|
|
1343
|
+
"product/onboarding/graph/ONB-01-current-state-trace.md",
|
|
1344
|
+
]);
|
|
1345
|
+
|
|
1346
|
+
const onb02PacketMissing = makeFixture("onboarding-evidence-onb02-missing");
|
|
1347
|
+
runFixture("ONB-02's gate fails when the evidence plan does not exist yet", onb02PacketMissing, evidenceScript, 1, "onboarding_evidence.packet_missing", [
|
|
1348
|
+
"--node",
|
|
1349
|
+
"ONB-02",
|
|
1350
|
+
"--path",
|
|
1351
|
+
"product/onboarding/graph/ONB-02-evidence-plan.md",
|
|
1352
|
+
]);
|
|
1353
|
+
|
|
1354
|
+
const onb02PacketComplete = makeFixture("onboarding-evidence-onb02-complete");
|
|
1355
|
+
writeEvidencePacket(
|
|
1356
|
+
onb02PacketComplete,
|
|
1357
|
+
"product/onboarding/graph/ONB-02-evidence-plan.md",
|
|
1358
|
+
substantiveResearchProse("the onboarding evidence hierarchy, access constraints, sample plan, and freshness cutoff"),
|
|
1359
|
+
);
|
|
1360
|
+
runFixture("ONB-02's gate passes a genuinely substantive, marker-free evidence plan", onb02PacketComplete, evidenceScript, 0, undefined, [
|
|
1361
|
+
"--node",
|
|
1362
|
+
"ONB-02",
|
|
1363
|
+
"--path",
|
|
1364
|
+
"product/onboarding/graph/ONB-02-evidence-plan.md",
|
|
1365
|
+
]);
|
|
1366
|
+
|
|
1367
|
+
const evidencePacketMissing = makeFixture("onboarding-evidence-packet-missing");
|
|
1368
|
+
runFixture(
|
|
1369
|
+
"ONB-03's gate fails when its evidence packet does not exist yet",
|
|
1370
|
+
evidencePacketMissing,
|
|
1371
|
+
evidenceScript,
|
|
1372
|
+
1,
|
|
1373
|
+
"onboarding_evidence.packet_missing",
|
|
1374
|
+
["--node", "ONB-03", "--path", "product/onboarding/graph/ONB-03-current-guidance.md"],
|
|
1375
|
+
);
|
|
1376
|
+
|
|
1377
|
+
const evidencePacketThin = makeFixture("onboarding-evidence-packet-thin");
|
|
1378
|
+
writeEvidencePacket(evidencePacketThin, "product/onboarding/graph/ONB-04-competitor-reviews.md", "## Findings\n\nDone.\n");
|
|
1379
|
+
runFixture(
|
|
1380
|
+
"ONB-04's gate rejects a stub evidence packet that lacks a source and classification",
|
|
1381
|
+
evidencePacketThin,
|
|
1382
|
+
evidenceScript,
|
|
1383
|
+
1,
|
|
1384
|
+
"onboarding_evidence.packet_record_incomplete",
|
|
1385
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1386
|
+
);
|
|
1387
|
+
|
|
1388
|
+
const evidencePacketConcise = makeFixture("onboarding-evidence-packet-concise");
|
|
1389
|
+
writeEvidencePacket(evidencePacketConcise, "product/onboarding/graph/ONB-04-competitor-reviews.md", conciseStructuredPacket);
|
|
1390
|
+
runFixture("ONB-04's gate passes a concise structured record under the old length proxy", evidencePacketConcise, evidenceScript, 0, undefined, [
|
|
1391
|
+
"--node",
|
|
1392
|
+
"ONB-04",
|
|
1393
|
+
"--path",
|
|
1394
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1395
|
+
]);
|
|
1396
|
+
|
|
1397
|
+
const evidencePacketHtmlCommentOnly = makeFixture("onboarding-evidence-packet-html-comment-only");
|
|
1398
|
+
writeEvidencePacket(
|
|
1399
|
+
evidencePacketHtmlCommentOnly,
|
|
1400
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1401
|
+
`<!--\n${substantiveResearchProse("a competitor review that was never actually written, only faked inside this comment")}\n-->\n`,
|
|
1402
|
+
);
|
|
1403
|
+
runFixture(
|
|
1404
|
+
"an evidence packet whose only content is inside an HTML comment still fails as thin",
|
|
1405
|
+
evidencePacketHtmlCommentOnly,
|
|
1406
|
+
evidenceScript,
|
|
1407
|
+
1,
|
|
1408
|
+
"onboarding_evidence.packet_too_thin",
|
|
1409
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1410
|
+
);
|
|
1411
|
+
|
|
1412
|
+
const evidencePacketTildeFenceOnly = makeFixture("onboarding-evidence-packet-tilde-fence-only");
|
|
1413
|
+
writeEvidencePacket(
|
|
1414
|
+
evidencePacketTildeFenceOnly,
|
|
1415
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1416
|
+
`~~~markdown\n${substantiveResearchProse("a competitor review that was never actually written, only faked inside this tilde fence")}\n~~~\n`,
|
|
1417
|
+
);
|
|
1418
|
+
runFixture(
|
|
1419
|
+
"an evidence packet whose only content is inside a tilde fence still fails as thin",
|
|
1420
|
+
evidencePacketTildeFenceOnly,
|
|
1421
|
+
evidenceScript,
|
|
1422
|
+
1,
|
|
1423
|
+
"onboarding_evidence.packet_too_thin",
|
|
1424
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1425
|
+
);
|
|
1426
|
+
|
|
1427
|
+
const evidencePacketUnterminatedFenceOnly = makeFixture("onboarding-evidence-packet-unterminated-fence-only");
|
|
1428
|
+
writeEvidencePacket(
|
|
1429
|
+
evidencePacketUnterminatedFenceOnly,
|
|
1430
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1431
|
+
// The opening fence is never closed. CommonMark still renders everything after it as code,
|
|
1432
|
+
// not prose, to the end of the document -- but the old paired-delimiter regex only stripped
|
|
1433
|
+
// a fence when it found a matching close, so with none present here it stripped nothing and
|
|
1434
|
+
// this faked content still cleared the 400-character substantive-length check.
|
|
1435
|
+
`\`\`\`markdown\n${substantiveResearchProse("a competitor review that was never actually written, only faked inside this unterminated fence")}\n`,
|
|
1436
|
+
);
|
|
1437
|
+
runFixture(
|
|
1438
|
+
"an evidence packet whose only content is inside an unterminated fence still fails as thin",
|
|
1439
|
+
evidencePacketUnterminatedFenceOnly,
|
|
1440
|
+
evidenceScript,
|
|
1441
|
+
1,
|
|
1442
|
+
"onboarding_evidence.packet_too_thin",
|
|
1443
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1444
|
+
);
|
|
1445
|
+
|
|
1446
|
+
const evidencePacketShortInnerFenceOnly = makeFixture("onboarding-evidence-packet-short-inner-fence-only");
|
|
1447
|
+
writeEvidencePacket(
|
|
1448
|
+
evidencePacketShortInnerFenceOnly,
|
|
1449
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1450
|
+
// Four-backtick opener, a three-backtick decoy line, the faked content, then a real
|
|
1451
|
+
// four-backtick closer. CommonMark requires a closer at least as long as the opener, so the
|
|
1452
|
+
// decoy never closes the block -- the faked content stays hidden inside the fence the entire
|
|
1453
|
+
// way to the real closer. A strip that accepted any run of 3+ backticks as a valid closer
|
|
1454
|
+
// would stop at the decoy and let everything after it, including the real closer line, count
|
|
1455
|
+
// as live substantive text.
|
|
1456
|
+
`\`\`\`\`markdown\nA decoy line that looks like a fence close but is too short to be one.\n\`\`\`\n${substantiveResearchProse(
|
|
1457
|
+
"a competitor review that was never actually written, only faked past a too-short inner fence run",
|
|
1458
|
+
)}\n\`\`\`\`\n`,
|
|
1459
|
+
);
|
|
1460
|
+
runFixture(
|
|
1461
|
+
"an evidence packet whose only content sits past a shorter inner fence run still fails as thin",
|
|
1462
|
+
evidencePacketShortInnerFenceOnly,
|
|
1463
|
+
evidenceScript,
|
|
1464
|
+
1,
|
|
1465
|
+
"onboarding_evidence.packet_too_thin",
|
|
1466
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1467
|
+
);
|
|
1468
|
+
|
|
1469
|
+
const evidencePacketIndentedContentOnly = makeFixture("onboarding-evidence-packet-indented-content-only");
|
|
1470
|
+
writeEvidencePacket(
|
|
1471
|
+
evidencePacketIndentedContentOnly,
|
|
1472
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1473
|
+
// Every line indented 4 spaces at the very start of the document is a CommonMark indented
|
|
1474
|
+
// code block (the document start counts the same as a preceding blank line for the "cannot
|
|
1475
|
+
// interrupt a paragraph" rule) -- a rendered page shows this whole packet as inert code text,
|
|
1476
|
+
// not as a real finding. Without stripping indented code blocks the same way fenced and
|
|
1477
|
+
// commented-out blocks are stripped, a packet that never actually renders as prose still
|
|
1478
|
+
// cleared the substantive-length check.
|
|
1479
|
+
substantiveResearchProse("a competitor review that was never actually written, only indented into a CommonMark code block")
|
|
1480
|
+
.split("\n")
|
|
1481
|
+
.map((line) => (line.length > 0 ? ` ${line}` : line))
|
|
1482
|
+
.join("\n"),
|
|
1483
|
+
);
|
|
1484
|
+
runFixture(
|
|
1485
|
+
"an evidence packet whose only content is indented into a CommonMark code block still fails as thin",
|
|
1486
|
+
evidencePacketIndentedContentOnly,
|
|
1487
|
+
evidenceScript,
|
|
1488
|
+
1,
|
|
1489
|
+
"onboarding_evidence.packet_too_thin",
|
|
1490
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1491
|
+
);
|
|
1492
|
+
|
|
1493
|
+
const evidencePacketStyleBlockOnly = makeFixture("onboarding-evidence-packet-style-block-only");
|
|
1494
|
+
writeEvidencePacket(
|
|
1495
|
+
evidencePacketStyleBlockOnly,
|
|
1496
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1497
|
+
// A browser never renders <style> content as visible page text, the same non-rendering
|
|
1498
|
+
// reasoning already applied to HTML comments and fences -- but stripNonRenderedMarkdown() had
|
|
1499
|
+
// no notion of raw HTML blocks at all, so this faked content still cleared the 400-character
|
|
1500
|
+
// substantive-length check before this fix.
|
|
1501
|
+
`<style type="text/plain">\n${substantiveResearchProse(
|
|
1502
|
+
"a competitor review that was never actually written, only faked inside this style block",
|
|
1503
|
+
)}\n</style>\n`,
|
|
1504
|
+
);
|
|
1505
|
+
runFixture(
|
|
1506
|
+
"an evidence packet whose only content is inside a style block still fails as thin",
|
|
1507
|
+
evidencePacketStyleBlockOnly,
|
|
1508
|
+
evidenceScript,
|
|
1509
|
+
1,
|
|
1510
|
+
"onboarding_evidence.packet_too_thin",
|
|
1511
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1512
|
+
);
|
|
1513
|
+
|
|
1514
|
+
const evidencePacketTabIndentedContentOnly = makeFixture("onboarding-evidence-packet-tab-indented-content-only");
|
|
1515
|
+
writeEvidencePacket(
|
|
1516
|
+
evidencePacketTabIndentedContentOnly,
|
|
1517
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1518
|
+
// A single leading tab expands to CommonMark's own 4-column tab stop, the same indentation
|
|
1519
|
+
// threshold as four literal spaces -- a check that only recognized literal space characters
|
|
1520
|
+
// would miss this and let the faked content clear the substantive-length check.
|
|
1521
|
+
substantiveResearchProse("a competitor review that was never actually written, only tab-indented into a CommonMark code block")
|
|
1522
|
+
.split("\n")
|
|
1523
|
+
.map((line) => (line.length > 0 ? `\t${line}` : line))
|
|
1524
|
+
.join("\n"),
|
|
1525
|
+
);
|
|
1526
|
+
runFixture(
|
|
1527
|
+
"an evidence packet whose only content is tab-indented into a CommonMark code block still fails as thin",
|
|
1528
|
+
evidencePacketTabIndentedContentOnly,
|
|
1529
|
+
evidenceScript,
|
|
1530
|
+
1,
|
|
1531
|
+
"onboarding_evidence.packet_too_thin",
|
|
1532
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1533
|
+
);
|
|
1534
|
+
|
|
1535
|
+
const evidencePacketTodoInInlineCodeSpan = makeFixture("onboarding-evidence-packet-todo-in-inline-code-span");
|
|
1536
|
+
writeEvidencePacket(
|
|
1537
|
+
evidencePacketTodoInInlineCodeSpan,
|
|
1538
|
+
"product/onboarding/graph/ONB-05-onbo-hub-atlas.md",
|
|
1539
|
+
// The TODO sits inside a mid-sentence triple-backtick code span, not alone on its own line --
|
|
1540
|
+
// a real render shows it in the open, as inline code. A position-blind fence stripper that
|
|
1541
|
+
// matches any run of 3+ backticks, wherever it appears, would erase the span and the word
|
|
1542
|
+
// along with it, letting a packet that visibly still says TODO pass the placeholder scan.
|
|
1543
|
+
`${substantiveResearchProse("the authorized Onbo Hub flow atlas")}\n\nThis draft still shows \`\`\`TODO\`\`\` inline where the real citation belongs.\n`,
|
|
1544
|
+
);
|
|
1545
|
+
runFixture(
|
|
1546
|
+
"ONB-05's gate rejects a TODO marker hidden inside an inline triple-backtick code span",
|
|
1547
|
+
evidencePacketTodoInInlineCodeSpan,
|
|
1548
|
+
evidenceScript,
|
|
1549
|
+
1,
|
|
1550
|
+
"onboarding_evidence.packet_placeholder",
|
|
1551
|
+
["--node", "ONB-05", "--path", "product/onboarding/graph/ONB-05-onbo-hub-atlas.md"],
|
|
1552
|
+
);
|
|
1553
|
+
|
|
1554
|
+
const evidencePacketTodoAfterInlineHtmlTagMention = makeFixture("onboarding-evidence-packet-todo-after-inline-html-tag-mention");
|
|
1555
|
+
writeEvidencePacket(
|
|
1556
|
+
evidencePacketTodoAfterInlineHtmlTagMention,
|
|
1557
|
+
"product/onboarding/graph/ONB-05-onbo-hub-atlas.md",
|
|
1558
|
+
// The tag mention sits inside an inline code span mid-sentence, not alone at the start of its
|
|
1559
|
+
// own line -- never a real HTML block opener. A position-blind stripper that matches the tag
|
|
1560
|
+
// name anywhere in the raw text would still read this as an unterminated opener and, finding
|
|
1561
|
+
// no closing tag anywhere after it, erase everything through end of document -- including the
|
|
1562
|
+
// real TODO line below -- letting a packet that visibly still says TODO pass the placeholder
|
|
1563
|
+
// scan.
|
|
1564
|
+
`${substantiveResearchProse(
|
|
1565
|
+
"the authorized Onbo Hub flow atlas",
|
|
1566
|
+
)}\n\nThis draft still mentions \`<style>\` inline as a worked example of a tag name, not a real block.\nTODO: fill in the rest once access is granted.\n`,
|
|
1567
|
+
);
|
|
1568
|
+
runFixture(
|
|
1569
|
+
"ONB-05's gate rejects a TODO marker that follows an inline mid-sentence HTML tag mention",
|
|
1570
|
+
evidencePacketTodoAfterInlineHtmlTagMention,
|
|
1571
|
+
evidenceScript,
|
|
1572
|
+
1,
|
|
1573
|
+
"onboarding_evidence.packet_placeholder",
|
|
1574
|
+
["--node", "ONB-05", "--path", "product/onboarding/graph/ONB-05-onbo-hub-atlas.md"],
|
|
1575
|
+
);
|
|
1576
|
+
|
|
1577
|
+
const evidencePacketPlaceholder = makeFixture("onboarding-evidence-packet-placeholder");
|
|
1578
|
+
writeEvidencePacket(
|
|
1579
|
+
evidencePacketPlaceholder,
|
|
1580
|
+
"product/onboarding/graph/ONB-05-onbo-hub-atlas.md",
|
|
1581
|
+
`${substantiveResearchProse("the authorized Onbo Hub flow atlas")}\n\nTODO: fill in the rest once access is granted.\n`,
|
|
1582
|
+
);
|
|
1583
|
+
runFixture(
|
|
1584
|
+
"ONB-05's gate rejects a packet that still carries a TODO/TBD/PLACEHOLDER marker",
|
|
1585
|
+
evidencePacketPlaceholder,
|
|
1586
|
+
evidenceScript,
|
|
1587
|
+
1,
|
|
1588
|
+
"onboarding_evidence.packet_placeholder",
|
|
1589
|
+
["--node", "ONB-05", "--path", "product/onboarding/graph/ONB-05-onbo-hub-atlas.md"],
|
|
1590
|
+
);
|
|
1591
|
+
|
|
1592
|
+
const evidencePacketQuotedSourceTbd = makeFixture("onboarding-evidence-packet-quoted-source-tbd");
|
|
1593
|
+
writeEvidencePacket(
|
|
1594
|
+
evidencePacketQuotedSourceTbd,
|
|
1595
|
+
"product/onboarding/graph/ONB-05-onbo-hub-atlas.md",
|
|
1596
|
+
`${conciseStructuredPacket.replace(
|
|
1597
|
+
"Source: App Store review sample 2026-09-01 (n=40).",
|
|
1598
|
+
'Source: App Store review sample 2026-09-01 quotes "TBD" as the current empty-state label.',
|
|
1599
|
+
)}`,
|
|
1600
|
+
);
|
|
1601
|
+
runFixture(
|
|
1602
|
+
"ONB-05's gate does not treat a quoted TBD inside source evidence as an author placeholder",
|
|
1603
|
+
evidencePacketQuotedSourceTbd,
|
|
1604
|
+
evidenceScript,
|
|
1605
|
+
0,
|
|
1606
|
+
undefined,
|
|
1607
|
+
["--node", "ONB-05", "--path", "product/onboarding/graph/ONB-05-onbo-hub-atlas.md"],
|
|
1608
|
+
);
|
|
1609
|
+
|
|
1610
|
+
const evidencePacketApostropheAuthorTodo = makeFixture("onboarding-evidence-packet-apostrophe-author-todo");
|
|
1611
|
+
writeEvidencePacket(
|
|
1612
|
+
evidencePacketApostropheAuthorTodo,
|
|
1613
|
+
"product/onboarding/graph/ONB-05-onbo-hub-atlas.md",
|
|
1614
|
+
`${conciseStructuredPacket}\n\nThe app's TODO is still the author field and we don't know the empty-state copy.\n`,
|
|
1615
|
+
);
|
|
1616
|
+
runFixture(
|
|
1617
|
+
"ONB-05's gate still rejects an author TODO sitting between English apostrophes",
|
|
1618
|
+
evidencePacketApostropheAuthorTodo,
|
|
1619
|
+
evidenceScript,
|
|
1620
|
+
1,
|
|
1621
|
+
"onboarding_evidence.packet_placeholder",
|
|
1622
|
+
["--node", "ONB-05", "--path", "product/onboarding/graph/ONB-05-onbo-hub-atlas.md"],
|
|
1623
|
+
);
|
|
1624
|
+
|
|
1625
|
+
const evidencePacketFluentUnsupported = makeFixture("onboarding-evidence-packet-fluent-unsupported");
|
|
1626
|
+
writeEvidencePacket(
|
|
1627
|
+
evidencePacketFluentUnsupported,
|
|
1628
|
+
"product/onboarding/graph/ONB-04-competitor-reviews.md",
|
|
1629
|
+
`${conciseStructuredPacket}
|
|
1630
|
+
|
|
1631
|
+
This long fluent paragraph restates the same unsupported claim with more confidence and more padding. Structural completeness still cannot become semantic acceptance or runtime proof. Independent review and observed behavior stay separate obligations.
|
|
1632
|
+
`,
|
|
1633
|
+
);
|
|
1634
|
+
runFixture(
|
|
1635
|
+
"ONB-04's gate may pass a fluent unsupported claim on shape without granting semantic acceptance",
|
|
1636
|
+
evidencePacketFluentUnsupported,
|
|
1637
|
+
evidenceScript,
|
|
1638
|
+
0,
|
|
1639
|
+
"semantic=unknown",
|
|
1640
|
+
["--node", "ONB-04", "--path", "product/onboarding/graph/ONB-04-competitor-reviews.md"],
|
|
1641
|
+
);
|
|
1642
|
+
|
|
1643
|
+
const evidencePacketNoProse = makeFixture("onboarding-evidence-packet-no-prose");
|
|
1644
|
+
writeEvidencePacket(
|
|
1645
|
+
evidencePacketNoProse,
|
|
1646
|
+
"product/onboarding/graph/ONB-06-internal-guidance-audit.md",
|
|
1647
|
+
`## Findings\n\n| Rule | Status |\n| --- | --- |\n${"| internal-guidance-rule | resolved |\n".repeat(20)}`,
|
|
1648
|
+
);
|
|
1649
|
+
runFixture(
|
|
1650
|
+
"ONB-06's gate rejects a packet with a long table but no finding, source, or classification",
|
|
1651
|
+
evidencePacketNoProse,
|
|
1652
|
+
evidenceScript,
|
|
1653
|
+
1,
|
|
1654
|
+
"onboarding_evidence.packet_record_incomplete",
|
|
1655
|
+
["--node", "ONB-06", "--path", "product/onboarding/graph/ONB-06-internal-guidance-audit.md"],
|
|
1656
|
+
);
|
|
1657
|
+
|
|
1658
|
+
const evidencePacketMissingPathFlag = makeFixture("onboarding-evidence-packet-missing-path-flag");
|
|
1659
|
+
runFixture(
|
|
1660
|
+
"the evidence-packet gate refuses to run without --path",
|
|
1661
|
+
evidencePacketMissingPathFlag,
|
|
1662
|
+
evidenceScript,
|
|
1663
|
+
1,
|
|
1664
|
+
"onboarding_evidence.missing_path_flag",
|
|
1665
|
+
["--node", "ONB-07"],
|
|
1666
|
+
);
|
|
1667
|
+
|
|
1668
|
+
const evidencePacketComplete = makeFixture("onboarding-evidence-packet-complete");
|
|
1669
|
+
writeEvidencePacket(
|
|
1670
|
+
evidencePacketComplete,
|
|
1671
|
+
"product/onboarding/graph/ONB-08-motion-research.md",
|
|
1672
|
+
substantiveResearchProse("60fps motion references translated into the target framework"),
|
|
1673
|
+
);
|
|
1674
|
+
runFixture("ONB-08's gate passes a genuinely substantive, marker-free evidence packet", evidencePacketComplete, evidenceScript, 0, undefined, [
|
|
1675
|
+
"--node",
|
|
1676
|
+
"ONB-08",
|
|
1677
|
+
"--path",
|
|
1678
|
+
"product/onboarding/graph/ONB-08-motion-research.md",
|
|
1679
|
+
]);
|
|
1680
|
+
|
|
1681
|
+
const onb08PacketArgs = ["--node", "ONB-08", "--path", "product/onboarding/graph/ONB-08-motion-research.md"] as const;
|
|
1682
|
+
const onb08MotionRegister = `${substantiveResearchProse("applicable motion research translated into the target framework")}
|
|
1683
|
+
|
|
1684
|
+
Motion Research uses the 60fps MCP with search_shots and get_motion_breakdown. Reference shot ID shot-fixture-001. Interruption behavior yields to the next gesture. Reduced-motion shows the complete final state without the choreography.
|
|
1685
|
+
`;
|
|
1686
|
+
const onb08NotApplicableProse = `${substantiveResearchProse("applicable motion research translated into the target framework")}
|
|
1687
|
+
|
|
1688
|
+
The 60fps motion register is not applicable for this product.
|
|
1689
|
+
`;
|
|
1690
|
+
|
|
1691
|
+
const onb08PacketStatic = makeFixture("onboarding-evidence-onb08-static-document");
|
|
1692
|
+
writeStudioSurfaces(onb08PacketStatic, [{ id: "privacy", interaction: "static-document" }]);
|
|
1693
|
+
writeEvidencePacket(
|
|
1694
|
+
onb08PacketStatic,
|
|
1695
|
+
"product/onboarding/graph/ONB-08-motion-research.md",
|
|
1696
|
+
substantiveResearchProse("static legal-page motion research with no invented shot IDs"),
|
|
1697
|
+
);
|
|
1698
|
+
runFixture("ONB-08's gate passes a static-document surface without 60fps shot IDs", onb08PacketStatic, evidenceScript, 0, undefined, [...onb08PacketArgs]);
|
|
1699
|
+
|
|
1700
|
+
const onb08PacketSelectedMissing = makeFixture("onboarding-evidence-onb08-selected-missing");
|
|
1701
|
+
writeStudioSurfaces(onb08PacketSelectedMissing, [], [{ id: "hero", interaction: "bespoke-motion" }]);
|
|
1702
|
+
writeSixtyFpsToolRow(onb08PacketSelectedMissing, "connected", "search_shots route");
|
|
1703
|
+
writeEvidencePacket(
|
|
1704
|
+
onb08PacketSelectedMissing,
|
|
1705
|
+
"product/onboarding/graph/ONB-08-motion-research.md",
|
|
1706
|
+
substantiveResearchProse("bespoke motion without recording any reference shot"),
|
|
1707
|
+
);
|
|
1708
|
+
runFixture(
|
|
1709
|
+
"ONB-08's gate fails when selected 60fps research omits shot IDs",
|
|
1710
|
+
onb08PacketSelectedMissing,
|
|
1711
|
+
evidenceScript,
|
|
1712
|
+
1,
|
|
1713
|
+
"onboarding_evidence.onb08_motion_register",
|
|
1714
|
+
[...onb08PacketArgs],
|
|
1715
|
+
);
|
|
1716
|
+
|
|
1717
|
+
const onb08PacketSelectedComplete = makeFixture("onboarding-evidence-onb08-selected-complete");
|
|
1718
|
+
writeStudioSurfaces(onb08PacketSelectedComplete, [], [{ id: "hero", interaction: "bespoke-motion" }]);
|
|
1719
|
+
writeSixtyFpsToolRow(onb08PacketSelectedComplete, "connected", "search_shots route");
|
|
1720
|
+
writeEvidencePacket(onb08PacketSelectedComplete, "product/onboarding/graph/ONB-08-motion-research.md", onb08MotionRegister);
|
|
1721
|
+
runFixture("ONB-08's gate passes selected 60fps research with shot IDs", onb08PacketSelectedComplete, evidenceScript, 0, undefined, [...onb08PacketArgs]);
|
|
1722
|
+
|
|
1723
|
+
const onb08PacketNotApplicableOverride = makeFixture("onboarding-evidence-onb08-not-applicable-override");
|
|
1724
|
+
writeStudioSurfaces(onb08PacketNotApplicableOverride, [], [{ id: "hero", interaction: "bespoke-motion" }]);
|
|
1725
|
+
writeSixtyFpsToolRow(onb08PacketNotApplicableOverride, "connected", "search_shots route");
|
|
1726
|
+
writeEvidencePacket(onb08PacketNotApplicableOverride, "product/onboarding/graph/ONB-08-motion-research.md", onb08NotApplicableProse);
|
|
1727
|
+
runFixture(
|
|
1728
|
+
"ONB-08's gate fails when packet prose claims selected 60fps research is not applicable",
|
|
1729
|
+
onb08PacketNotApplicableOverride,
|
|
1730
|
+
evidenceScript,
|
|
1731
|
+
1,
|
|
1732
|
+
"onboarding_evidence.onb08_motion_register",
|
|
1733
|
+
[...onb08PacketArgs],
|
|
1734
|
+
);
|
|
1735
|
+
|
|
1736
|
+
const onb08PacketUnavailable = makeFixture("onboarding-evidence-onb08-unavailable");
|
|
1737
|
+
writeStudioSurfaces(onb08PacketUnavailable, [], [{ id: "hero", interaction: "bespoke-motion" }]);
|
|
1738
|
+
writeSixtyFpsToolRow(onb08PacketUnavailable, "blocked", "fallback distilled recipes");
|
|
1739
|
+
writeEvidencePacket(onb08PacketUnavailable, "product/onboarding/graph/ONB-08-motion-research.md", onb08MotionRegister);
|
|
1740
|
+
runFixture(
|
|
1741
|
+
"ONB-08's gate does not accept shot IDs when the 60fps MCP is blocked",
|
|
1742
|
+
onb08PacketUnavailable,
|
|
1743
|
+
evidenceScript,
|
|
1744
|
+
1,
|
|
1745
|
+
"onboarding_evidence.onb08_motion_reference_unavailable",
|
|
1746
|
+
[...onb08PacketArgs],
|
|
1747
|
+
);
|
|
1748
|
+
|
|
1749
|
+
const onb08PacketUnresolved = makeFixture("onboarding-evidence-onb08-unresolved");
|
|
1750
|
+
writeStudioSurfaces(onb08PacketUnresolved, [{ id: "privacy" }]);
|
|
1751
|
+
writeEvidencePacket(onb08PacketUnresolved, "product/onboarding/graph/ONB-08-motion-research.md", onb08MotionRegister);
|
|
1752
|
+
runFixture(
|
|
1753
|
+
"ONB-08's gate holds when a listed studio surface omits interaction",
|
|
1754
|
+
onb08PacketUnresolved,
|
|
1755
|
+
evidenceScript,
|
|
1756
|
+
1,
|
|
1757
|
+
"onboarding_evidence.onb08_surface_interaction_unresolved",
|
|
1758
|
+
[...onb08PacketArgs],
|
|
1759
|
+
);
|
|
1760
|
+
|
|
1761
|
+
const onb08PacketImplemented = makeFixture("onboarding-evidence-onb08-implemented-hooks");
|
|
1762
|
+
writeStudioSurfaces(onb08PacketImplemented, [{ id: "home", interaction: "conversion" }]);
|
|
1763
|
+
writeSixtyFpsToolRow(onb08PacketImplemented, "connected", "search_shots route");
|
|
1764
|
+
mkdirSync(path.join(onb08PacketImplemented, "growth/landing"), { recursive: true });
|
|
1765
|
+
writeFileSync(path.join(onb08PacketImplemented, "growth/landing/index.html"), "<main><h1>Landing</h1></main>\n", "utf8");
|
|
1766
|
+
writeFileSync(
|
|
1767
|
+
path.join(onb08PacketImplemented, "growth/landing/Story.tsx"),
|
|
1768
|
+
'export function Story() { return <section data-scrolly-step="need">Need</section>; }\n',
|
|
1769
|
+
"utf8",
|
|
1770
|
+
);
|
|
1771
|
+
writeEvidencePacket(
|
|
1772
|
+
onb08PacketImplemented,
|
|
1773
|
+
"product/onboarding/graph/ONB-08-motion-research.md",
|
|
1774
|
+
substantiveResearchProse("conversion landing that already implements scroll-linked hooks without recording shot IDs"),
|
|
1775
|
+
);
|
|
1776
|
+
runFixture(
|
|
1777
|
+
"ONB-08's gate fails when implemented scroll-linked hooks omit the 60fps register",
|
|
1778
|
+
onb08PacketImplemented,
|
|
1779
|
+
evidenceScript,
|
|
1780
|
+
1,
|
|
1781
|
+
"onboarding_evidence.onb08_motion_register",
|
|
1782
|
+
[...onb08PacketArgs],
|
|
1783
|
+
);
|
|
1784
|
+
|
|
1785
|
+
const onb20PacketMissing = makeFixture("onboarding-evidence-onb20-missing");
|
|
1786
|
+
runFixture(
|
|
1787
|
+
"ONB-20's gate fails when the adversarial-QA packet does not exist yet",
|
|
1788
|
+
onb20PacketMissing,
|
|
1789
|
+
evidenceScript,
|
|
1790
|
+
1,
|
|
1791
|
+
"onboarding_evidence.packet_missing",
|
|
1792
|
+
["--node", "ONB-20", "--path", "product/onboarding/graph/ONB-20-adversarial-qa.md"],
|
|
1793
|
+
);
|
|
1794
|
+
|
|
1795
|
+
const onb20PacketComplete = makeFixture("onboarding-evidence-onb20-complete");
|
|
1796
|
+
writeEvidencePacket(
|
|
1797
|
+
onb20PacketComplete,
|
|
1798
|
+
"product/onboarding/graph/ONB-20-adversarial-qa.md",
|
|
1799
|
+
substantiveResearchProse("the synthetic one-star pre-mortem, policy review, instrumentation QA, and accessibility review"),
|
|
1800
|
+
);
|
|
1801
|
+
runFixture("ONB-20's gate passes a genuinely substantive, marker-free adversarial-QA packet", onb20PacketComplete, evidenceScript, 0, undefined, [
|
|
1802
|
+
"--node",
|
|
1803
|
+
"ONB-20",
|
|
1804
|
+
"--path",
|
|
1805
|
+
"product/onboarding/graph/ONB-20-adversarial-qa.md",
|
|
1806
|
+
]);
|
|
1807
|
+
|
|
1808
|
+
const onb21PacketMissing = makeFixture("onboarding-evidence-onb21-missing");
|
|
1809
|
+
runFixture(
|
|
1810
|
+
"ONB-21's gate fails when the Compound Engineering plan does not exist yet",
|
|
1811
|
+
onb21PacketMissing,
|
|
1812
|
+
evidenceScript,
|
|
1813
|
+
1,
|
|
1814
|
+
"onboarding_evidence.packet_missing",
|
|
1815
|
+
["--node", "ONB-21", "--path", "product/onboarding/graph/ONB-21-compound-engineering-plan.md"],
|
|
1816
|
+
);
|
|
1817
|
+
|
|
1818
|
+
const onb21PacketComplete = makeFixture("onboarding-evidence-onb21-complete");
|
|
1819
|
+
writeEvidencePacket(
|
|
1820
|
+
onb21PacketComplete,
|
|
1821
|
+
"product/onboarding/graph/ONB-21-compound-engineering-plan.md",
|
|
1822
|
+
substantiveResearchProse("the implementation-ready Compound Engineering plan translated from the accepted onboarding graph"),
|
|
1823
|
+
);
|
|
1824
|
+
runFixture("ONB-21's gate passes a genuinely substantive, marker-free implementation plan", onb21PacketComplete, evidenceScript, 0, undefined, [
|
|
1825
|
+
"--node",
|
|
1826
|
+
"ONB-21",
|
|
1827
|
+
"--path",
|
|
1828
|
+
"product/onboarding/graph/ONB-21-compound-engineering-plan.md",
|
|
1829
|
+
]);
|
|
1830
|
+
|
|
1831
|
+
const onb09PacketMissing = makeFixture("onboarding-evidence-onb09-missing");
|
|
1832
|
+
runFixture("ONB-09's gate fails when the evidence join does not exist yet", onb09PacketMissing, evidenceScript, 1, "onboarding_evidence.packet_missing", [
|
|
1833
|
+
"--node",
|
|
1834
|
+
"ONB-09",
|
|
1835
|
+
"--path",
|
|
1836
|
+
"product/onboarding/graph/ONB-09-evidence-join.md",
|
|
1837
|
+
]);
|
|
1838
|
+
|
|
1839
|
+
const onb09PacketComplete = makeFixture("onboarding-evidence-onb09-complete");
|
|
1840
|
+
writeEvidencePacket(
|
|
1841
|
+
onb09PacketComplete,
|
|
1842
|
+
"product/onboarding/graph/ONB-09-evidence-join.md",
|
|
1843
|
+
substantiveResearchProse("the joined guidance, reviews, flow evidence, internal doctrine, provider facts, policy, and motion research decisions"),
|
|
1844
|
+
);
|
|
1845
|
+
runFixture("ONB-09's gate passes a genuinely substantive, marker-free evidence join", onb09PacketComplete, evidenceScript, 0, undefined, [
|
|
1846
|
+
"--node",
|
|
1847
|
+
"ONB-09",
|
|
1848
|
+
"--path",
|
|
1849
|
+
"product/onboarding/graph/ONB-09-evidence-join.md",
|
|
1850
|
+
]);
|
|
1851
|
+
|
|
1852
|
+
const onb10PacketMissing = makeFixture("onboarding-evidence-onb10-missing");
|
|
1853
|
+
runFixture(
|
|
1854
|
+
"ONB-10's gate fails when the first-value and activation packet does not exist yet",
|
|
1855
|
+
onb10PacketMissing,
|
|
1856
|
+
evidenceScript,
|
|
1857
|
+
1,
|
|
1858
|
+
"onboarding_evidence.packet_missing",
|
|
1859
|
+
["--node", "ONB-10", "--path", "product/onboarding/graph/ONB-10-first-value-activation.md"],
|
|
1860
|
+
);
|
|
1861
|
+
|
|
1862
|
+
const onb10PacketComplete = makeFixture("onboarding-evidence-onb10-complete");
|
|
1863
|
+
writeEvidencePacket(
|
|
1864
|
+
onb10PacketComplete,
|
|
1865
|
+
"product/onboarding/graph/ONB-10-first-value-activation.md",
|
|
1866
|
+
substantiveResearchProse("first value rendered, first value engaged, activation, habit, and retention hypotheses"),
|
|
1867
|
+
);
|
|
1868
|
+
runFixture("ONB-10's gate passes a genuinely substantive, marker-free first-value and activation packet", onb10PacketComplete, evidenceScript, 0, undefined, [
|
|
1869
|
+
"--node",
|
|
1870
|
+
"ONB-10",
|
|
1871
|
+
"--path",
|
|
1872
|
+
"product/onboarding/graph/ONB-10-first-value-activation.md",
|
|
1873
|
+
]);
|
|
1874
|
+
|
|
1875
|
+
const onb11PacketMissing = makeFixture("onboarding-evidence-onb11-missing");
|
|
1876
|
+
runFixture(
|
|
1877
|
+
"ONB-11's gate fails when the effort and question audit does not exist yet",
|
|
1878
|
+
onb11PacketMissing,
|
|
1879
|
+
evidenceScript,
|
|
1880
|
+
1,
|
|
1881
|
+
"onboarding_evidence.packet_missing",
|
|
1882
|
+
["--node", "ONB-11", "--path", "product/onboarding/graph/ONB-11-effort-question-audit.md"],
|
|
1883
|
+
);
|
|
1884
|
+
|
|
1885
|
+
const onb11PacketComplete = makeFixture("onboarding-evidence-onb11-complete");
|
|
1886
|
+
writeEvidencePacket(
|
|
1887
|
+
onb11PacketComplete,
|
|
1888
|
+
"product/onboarding/graph/ONB-11-effort-question-audit.md",
|
|
1889
|
+
substantiveResearchProse("effort before value, question usefulness, permissions, interruption budget, and visible personalization proof"),
|
|
1890
|
+
);
|
|
1891
|
+
runFixture("ONB-11's gate passes a genuinely substantive, marker-free effort and question audit", onb11PacketComplete, evidenceScript, 0, undefined, [
|
|
1892
|
+
"--node",
|
|
1893
|
+
"ONB-11",
|
|
1894
|
+
"--path",
|
|
1895
|
+
"product/onboarding/graph/ONB-11-effort-question-audit.md",
|
|
1896
|
+
]);
|
|
1897
|
+
|
|
1898
|
+
const onb12PacketMissing = makeFixture("onboarding-evidence-onb12-missing");
|
|
1899
|
+
runFixture(
|
|
1900
|
+
"ONB-12's gate fails when the state and identity contract does not exist yet",
|
|
1901
|
+
onb12PacketMissing,
|
|
1902
|
+
evidenceScript,
|
|
1903
|
+
1,
|
|
1904
|
+
"onboarding_evidence.packet_missing",
|
|
1905
|
+
["--node", "ONB-12", "--path", "product/onboarding/graph/ONB-12-state-identity-contract.md"],
|
|
1906
|
+
);
|
|
1907
|
+
|
|
1908
|
+
const onb12PacketComplete = makeFixture("onboarding-evidence-onb12-complete");
|
|
1909
|
+
writeEvidencePacket(
|
|
1910
|
+
onb12PacketComplete,
|
|
1911
|
+
"product/onboarding/graph/ONB-12-state-identity-contract.md",
|
|
1912
|
+
substantiveResearchProse("the canonical journey, profile, identity, entitlement, continuity, and cross-surface state transitions"),
|
|
1913
|
+
);
|
|
1914
|
+
runFixture("ONB-12's gate passes a genuinely substantive, marker-free state and identity contract", onb12PacketComplete, evidenceScript, 0, undefined, [
|
|
1915
|
+
"--node",
|
|
1916
|
+
"ONB-12",
|
|
1917
|
+
"--path",
|
|
1918
|
+
"product/onboarding/graph/ONB-12-state-identity-contract.md",
|
|
1919
|
+
]);
|
|
1920
|
+
|
|
1921
|
+
const onb13PacketMissing = makeFixture("onboarding-evidence-onb13-missing");
|
|
1922
|
+
runFixture(
|
|
1923
|
+
"ONB-13's gate fails when the analytics and experiments packet does not exist yet",
|
|
1924
|
+
onb13PacketMissing,
|
|
1925
|
+
evidenceScript,
|
|
1926
|
+
1,
|
|
1927
|
+
"onboarding_evidence.packet_missing",
|
|
1928
|
+
["--node", "ONB-13", "--path", "product/onboarding/graph/ONB-13-analytics-experiments.md"],
|
|
1929
|
+
);
|
|
1930
|
+
|
|
1931
|
+
const onb13PacketComplete = makeFixture("onboarding-evidence-onb13-complete");
|
|
1932
|
+
writeEvidencePacket(
|
|
1933
|
+
onb13PacketComplete,
|
|
1934
|
+
"product/onboarding/graph/ONB-13-analytics-experiments.md",
|
|
1935
|
+
substantiveResearchProse(
|
|
1936
|
+
"typed analytics, authoritative emitters, identity stitching, deduplication, experiment assignment, exposure, and expected sequences",
|
|
1937
|
+
),
|
|
1938
|
+
);
|
|
1939
|
+
runFixture("ONB-13's gate passes a genuinely substantive, marker-free analytics and experiments packet", onb13PacketComplete, evidenceScript, 0, undefined, [
|
|
1940
|
+
"--node",
|
|
1941
|
+
"ONB-13",
|
|
1942
|
+
"--path",
|
|
1943
|
+
"product/onboarding/graph/ONB-13-analytics-experiments.md",
|
|
1944
|
+
]);
|
|
1945
|
+
|
|
1946
|
+
const onb14PacketMissing = makeFixture("onboarding-evidence-onb14-missing");
|
|
1947
|
+
runFixture(
|
|
1948
|
+
"ONB-14's gate fails when the trust, lifecycle, and policy packet does not exist yet",
|
|
1949
|
+
onb14PacketMissing,
|
|
1950
|
+
evidenceScript,
|
|
1951
|
+
1,
|
|
1952
|
+
"onboarding_evidence.packet_missing",
|
|
1953
|
+
["--node", "ONB-14", "--path", "product/onboarding/graph/ONB-14-trust-lifecycle-policy.md"],
|
|
1954
|
+
);
|
|
1955
|
+
|
|
1956
|
+
const onb14PacketComplete = makeFixture("onboarding-evidence-onb14-complete");
|
|
1957
|
+
writeEvidencePacket(
|
|
1958
|
+
onb14PacketComplete,
|
|
1959
|
+
"product/onboarding/graph/ONB-14-trust-lifecycle-policy.md",
|
|
1960
|
+
substantiveResearchProse("review timing, permissions, lifecycle, privacy, security, accessibility, and policy behavior"),
|
|
1961
|
+
);
|
|
1962
|
+
runFixture(
|
|
1963
|
+
"ONB-14's gate passes a genuinely substantive, marker-free trust, lifecycle, and policy packet",
|
|
1964
|
+
onb14PacketComplete,
|
|
1965
|
+
evidenceScript,
|
|
1966
|
+
0,
|
|
1967
|
+
undefined,
|
|
1968
|
+
["--node", "ONB-14", "--path", "product/onboarding/graph/ONB-14-trust-lifecycle-policy.md"],
|
|
1969
|
+
);
|
|
1970
|
+
|
|
1971
|
+
const onb15PacketMissing = makeFixture("onboarding-evidence-onb15-missing");
|
|
1972
|
+
runFixture(
|
|
1973
|
+
"ONB-15's gate fails when the architecture decision does not exist yet",
|
|
1974
|
+
onb15PacketMissing,
|
|
1975
|
+
evidenceScript,
|
|
1976
|
+
1,
|
|
1977
|
+
"onboarding_evidence.packet_missing",
|
|
1978
|
+
["--node", "ONB-15", "--path", "product/onboarding/graph/ONB-15-architecture-decision.md"],
|
|
1979
|
+
);
|
|
1980
|
+
|
|
1981
|
+
const onb15PacketComplete = makeFixture("onboarding-evidence-onb15-complete");
|
|
1982
|
+
writeEvidencePacket(
|
|
1983
|
+
onb15PacketComplete,
|
|
1984
|
+
"product/onboarding/graph/ONB-15-architecture-decision.md",
|
|
1985
|
+
substantiveResearchProse("the native-first, hosted-funnel-first, hybrid, web-first, and evidence-backed architecture comparison and selection"),
|
|
1986
|
+
);
|
|
1987
|
+
runFixture("ONB-15's gate passes a genuinely substantive, marker-free architecture decision", onb15PacketComplete, evidenceScript, 0, undefined, [
|
|
1988
|
+
"--node",
|
|
1989
|
+
"ONB-15",
|
|
1990
|
+
"--path",
|
|
1991
|
+
"product/onboarding/graph/ONB-15-architecture-decision.md",
|
|
1992
|
+
]);
|
|
1993
|
+
|
|
1994
|
+
const onb16PacketMissing = makeFixture("onboarding-evidence-onb16-missing");
|
|
1995
|
+
runFixture(
|
|
1996
|
+
"ONB-16's gate fails when the canonical journey graph does not exist yet",
|
|
1997
|
+
onb16PacketMissing,
|
|
1998
|
+
evidenceScript,
|
|
1999
|
+
1,
|
|
2000
|
+
"onboarding_evidence.packet_missing",
|
|
2001
|
+
["--node", "ONB-16", "--path", "product/onboarding/graph/ONB-16-journey-graph.md"],
|
|
2002
|
+
);
|
|
2003
|
+
|
|
2004
|
+
const onb16PacketComplete = makeFixture("onboarding-evidence-onb16-complete");
|
|
2005
|
+
writeEvidencePacket(
|
|
2006
|
+
onb16PacketComplete,
|
|
2007
|
+
"product/onboarding/graph/ONB-16-journey-graph.md",
|
|
2008
|
+
substantiveResearchProse("the acquisition-specific journeys that converge on one semantic onboarding state graph"),
|
|
2009
|
+
);
|
|
2010
|
+
runFixture("ONB-16's gate passes a genuinely substantive, marker-free canonical journey graph", onb16PacketComplete, evidenceScript, 0, undefined, [
|
|
2011
|
+
"--node",
|
|
2012
|
+
"ONB-16",
|
|
2013
|
+
"--path",
|
|
2014
|
+
"product/onboarding/graph/ONB-16-journey-graph.md",
|
|
2015
|
+
]);
|
|
2016
|
+
|
|
2017
|
+
const onb17PacketMissing = makeFixture("onboarding-evidence-onb17-missing");
|
|
2018
|
+
runFixture(
|
|
2019
|
+
"ONB-17's gate fails when the screen, control, and paywall contract does not exist yet",
|
|
2020
|
+
onb17PacketMissing,
|
|
2021
|
+
evidenceScript,
|
|
2022
|
+
1,
|
|
2023
|
+
"onboarding_evidence.packet_missing",
|
|
2024
|
+
["--node", "ONB-17", "--path", "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md"],
|
|
2025
|
+
);
|
|
2026
|
+
|
|
2027
|
+
const onb17PacketComplete = makeFixture("onboarding-evidence-onb17-complete");
|
|
2028
|
+
requireRevenueCatHeadlineBind(onb17PacketComplete);
|
|
2029
|
+
writeEvidencePacket(
|
|
2030
|
+
onb17PacketComplete,
|
|
2031
|
+
"product/onboarding/graph/ONB-17-screen-control-paywall-contract.md",
|
|
2032
|
+
`${substantiveResearchProse("every onboarding screen, copy key, control, action, paywall state, failure, recovery, accessibility, and localization behavior")}
|
|
2033
|
+
|
|
2034
|
+
Paywall Goal Headline contract: the quiz writes paywall_headline_key. Keep templates in RevenueCat offering metadata and bind customVariables at present time. A skipped goal uses the fallback template.
|
|
2035
|
+
`,
|
|
2036
|
+
);
|
|
2037
|
+
runFixture(
|
|
2038
|
+
"ONB-17's gate passes a genuinely substantive, marker-free screen, control, and paywall contract",
|
|
2039
|
+
onb17PacketComplete,
|
|
2040
|
+
evidenceScript,
|
|
2041
|
+
0,
|
|
2042
|
+
undefined,
|
|
2043
|
+
["--node", "ONB-17", "--path", "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md"],
|
|
2044
|
+
);
|
|
2045
|
+
|
|
2046
|
+
const onb17PacketHeadlineMissing = makeFixture("onboarding-evidence-onb17-headline-missing");
|
|
2047
|
+
requireRevenueCatHeadlineBind(onb17PacketHeadlineMissing);
|
|
2048
|
+
writeEvidencePacket(
|
|
2049
|
+
onb17PacketHeadlineMissing,
|
|
2050
|
+
"product/onboarding/graph/ONB-17-screen-control-paywall-contract.md",
|
|
2051
|
+
substantiveResearchProse("every onboarding screen, copy key, control, action, paywall state, failure, recovery, accessibility, and localization behavior"),
|
|
2052
|
+
);
|
|
2053
|
+
runFixture(
|
|
2054
|
+
"ONB-17's gate fails when the screen, control, and paywall contract omits the Paywall Goal Headline bind",
|
|
2055
|
+
onb17PacketHeadlineMissing,
|
|
2056
|
+
evidenceScript,
|
|
2057
|
+
1,
|
|
2058
|
+
"onboarding_evidence.onb17_paywall_goal_headline",
|
|
2059
|
+
["--node", "ONB-17", "--path", "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md"],
|
|
2060
|
+
);
|
|
2061
|
+
|
|
2062
|
+
const onb17PacketArgs = ["--node", "ONB-17", "--path", "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md"] as const;
|
|
2063
|
+
const onb17HeadlineContract = `${substantiveResearchProse("every onboarding screen, copy key, control, action, paywall state, failure, recovery, accessibility, and localization behavior")}
|
|
2064
|
+
|
|
2065
|
+
Paywall Goal Headline contract: the quiz writes paywall_headline_key. Keep templates in RevenueCat offering metadata and bind customVariables at present time. A skipped goal uses the fallback template.
|
|
2066
|
+
`;
|
|
2067
|
+
const onb17NotApplicableProse = `${substantiveResearchProse("every onboarding screen, copy key, control, action, paywall state, failure, recovery, accessibility, and localization behavior")}
|
|
2068
|
+
|
|
2069
|
+
The Paywall Goal Headline bind is not applicable for this product.
|
|
2070
|
+
`;
|
|
2071
|
+
|
|
2072
|
+
const onb17PacketHeadlineExcluded = makeFixture("onboarding-evidence-onb17-headline-excluded");
|
|
2073
|
+
mutateProductYaml(onb17PacketHeadlineExcluded, (text) => setFeatureScope(text, "feature.paywall-goal-headline", "excluded"));
|
|
2074
|
+
writeEvidencePacket(
|
|
2075
|
+
onb17PacketHeadlineExcluded,
|
|
2076
|
+
"product/onboarding/graph/ONB-17-screen-control-paywall-contract.md",
|
|
2077
|
+
substantiveResearchProse("every onboarding screen, copy key, control, action, paywall state, failure, recovery, accessibility, and localization behavior"),
|
|
2078
|
+
);
|
|
2079
|
+
runFixture(
|
|
2080
|
+
"ONB-17's gate passes without the headline bind when feature.paywall-goal-headline is excluded",
|
|
2081
|
+
onb17PacketHeadlineExcluded,
|
|
2082
|
+
evidenceScript,
|
|
2083
|
+
0,
|
|
2084
|
+
undefined,
|
|
2085
|
+
[...onb17PacketArgs],
|
|
2086
|
+
);
|
|
2087
|
+
|
|
2088
|
+
const onb17PacketNotApplicableOverride = makeFixture("onboarding-evidence-onb17-not-applicable-override");
|
|
2089
|
+
requireRevenueCatHeadlineBind(onb17PacketNotApplicableOverride);
|
|
2090
|
+
writeEvidencePacket(onb17PacketNotApplicableOverride, "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md", onb17NotApplicableProse);
|
|
2091
|
+
runFixture(
|
|
2092
|
+
"ONB-17's gate fails when packet prose claims the required headline bind is not applicable",
|
|
2093
|
+
onb17PacketNotApplicableOverride,
|
|
2094
|
+
evidenceScript,
|
|
2095
|
+
1,
|
|
2096
|
+
"onboarding_evidence.onb17_paywall_goal_headline",
|
|
2097
|
+
[...onb17PacketArgs],
|
|
2098
|
+
);
|
|
2099
|
+
|
|
2100
|
+
const onb17PacketHeadlineUnresolved = makeFixture("onboarding-evidence-onb17-headline-unresolved");
|
|
2101
|
+
mutateProductYaml(onb17PacketHeadlineUnresolved, (text) => removeFeature(text, "feature.paywall-goal-headline"));
|
|
2102
|
+
writeEvidencePacket(onb17PacketHeadlineUnresolved, "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md", onb17HeadlineContract);
|
|
2103
|
+
runFixture(
|
|
2104
|
+
"ONB-17's gate holds when feature.paywall-goal-headline is absent",
|
|
2105
|
+
onb17PacketHeadlineUnresolved,
|
|
2106
|
+
evidenceScript,
|
|
2107
|
+
1,
|
|
2108
|
+
"onboarding_evidence.onb17_paywall_goal_headline_unresolved",
|
|
2109
|
+
[...onb17PacketArgs],
|
|
2110
|
+
);
|
|
2111
|
+
|
|
2112
|
+
const onb17PacketHeadlineUnresolvedComposition = makeFixture("onboarding-evidence-onb17-headline-unresolved-composition");
|
|
2113
|
+
requireHeadlineFeature(onb17PacketHeadlineUnresolvedComposition);
|
|
2114
|
+
writeEvidencePacket(onb17PacketHeadlineUnresolvedComposition, "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md", onb17HeadlineContract);
|
|
2115
|
+
runFixture(
|
|
2116
|
+
"ONB-17's gate holds when the headline feature is required and present-paywall is unresolved",
|
|
2117
|
+
onb17PacketHeadlineUnresolvedComposition,
|
|
2118
|
+
evidenceScript,
|
|
2119
|
+
1,
|
|
2120
|
+
"onboarding_evidence.onb17_paywall_goal_headline_unresolved",
|
|
2121
|
+
[...onb17PacketArgs],
|
|
2122
|
+
);
|
|
2123
|
+
|
|
2124
|
+
const onb17PacketHeadlineUnavailable = makeFixture("onboarding-evidence-onb17-headline-unavailable");
|
|
2125
|
+
requireHeadlineFeature(onb17PacketHeadlineUnavailable);
|
|
2126
|
+
writeWorkspaceComposition(onb17PacketHeadlineUnavailable, "b2c/subscription-app", "b2c/superwall");
|
|
2127
|
+
writeEvidencePacket(onb17PacketHeadlineUnavailable, "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md", onb17HeadlineContract);
|
|
2128
|
+
runFixture(
|
|
2129
|
+
"ONB-17's gate does not accept a RevenueCat headline bind for a Superwall presenter",
|
|
2130
|
+
onb17PacketHeadlineUnavailable,
|
|
2131
|
+
evidenceScript,
|
|
2132
|
+
1,
|
|
2133
|
+
"onboarding_evidence.onb17_paywall_goal_headline_unavailable",
|
|
2134
|
+
[...onb17PacketArgs],
|
|
2135
|
+
);
|
|
2136
|
+
|
|
2137
|
+
const onb17PacketSuperwallExcluded = makeFixture("onboarding-evidence-onb17-superwall-excluded");
|
|
2138
|
+
mutateProductYaml(onb17PacketSuperwallExcluded, (text) => setFeatureScope(text, "feature.paywall-goal-headline", "excluded"));
|
|
2139
|
+
writeWorkspaceComposition(onb17PacketSuperwallExcluded, "b2c/subscription-app", "b2c/superwall");
|
|
2140
|
+
writeEvidencePacket(onb17PacketSuperwallExcluded, "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md", onb17NotApplicableProse);
|
|
2141
|
+
runFixture("ONB-17's gate passes Superwall presentation when the headline feature is excluded", onb17PacketSuperwallExcluded, evidenceScript, 0, undefined, [
|
|
2142
|
+
...onb17PacketArgs,
|
|
2143
|
+
]);
|
|
2144
|
+
|
|
2145
|
+
const onb17PacketRevenueCatPurchaseExcluded = makeFixture("onboarding-evidence-onb17-revenuecat-purchase-excluded");
|
|
2146
|
+
mutateProductYaml(onb17PacketRevenueCatPurchaseExcluded, (text) => setFeatureScope(text, "feature.paywall-goal-headline", "excluded"));
|
|
2147
|
+
writeWorkspaceComposition(onb17PacketRevenueCatPurchaseExcluded, "b2c/subscription-app", "b2c/revenuecat");
|
|
2148
|
+
writeEvidencePacket(
|
|
2149
|
+
onb17PacketRevenueCatPurchaseExcluded,
|
|
2150
|
+
"product/onboarding/graph/ONB-17-screen-control-paywall-contract.md",
|
|
2151
|
+
substantiveResearchProse("every onboarding screen, copy key, control, action, paywall state, failure, recovery, accessibility, and localization behavior"),
|
|
2152
|
+
);
|
|
2153
|
+
runFixture(
|
|
2154
|
+
"ONB-17's gate passes a RevenueCat purchase owner when the headline feature is excluded",
|
|
2155
|
+
onb17PacketRevenueCatPurchaseExcluded,
|
|
2156
|
+
evidenceScript,
|
|
2157
|
+
0,
|
|
2158
|
+
undefined,
|
|
2159
|
+
[...onb17PacketArgs],
|
|
2160
|
+
);
|
|
2161
|
+
|
|
2162
|
+
const onb17PacketCompleteConsumerUnavailable = makeFixture("onboarding-evidence-onb17-complete-consumer-unavailable");
|
|
2163
|
+
requireHeadlineFeature(onb17PacketCompleteConsumerUnavailable);
|
|
2164
|
+
writeWorkspaceComposition(onb17PacketCompleteConsumerUnavailable, "b2c/complete-consumer-business");
|
|
2165
|
+
writeEvidencePacket(onb17PacketCompleteConsumerUnavailable, "product/onboarding/graph/ONB-17-screen-control-paywall-contract.md", onb17HeadlineContract);
|
|
2166
|
+
runFixture(
|
|
2167
|
+
"ONB-17's gate treats a required headline as unavailable when the recipe has no present-paywall operation",
|
|
2168
|
+
onb17PacketCompleteConsumerUnavailable,
|
|
2169
|
+
evidenceScript,
|
|
2170
|
+
1,
|
|
2171
|
+
"onboarding_evidence.onb17_paywall_goal_headline_unavailable",
|
|
2172
|
+
[...onb17PacketArgs],
|
|
2173
|
+
);
|
|
2174
|
+
|
|
2175
|
+
const onb18PacketMissing = makeFixture("onboarding-evidence-onb18-missing");
|
|
2176
|
+
runFixture(
|
|
2177
|
+
"ONB-18's gate fails when the visual design and prototype packet does not exist yet",
|
|
2178
|
+
onb18PacketMissing,
|
|
2179
|
+
evidenceScript,
|
|
2180
|
+
1,
|
|
2181
|
+
"onboarding_evidence.packet_missing",
|
|
2182
|
+
["--node", "ONB-18", "--path", "product/onboarding/graph/ONB-18-visual-design-prototype.md"],
|
|
2183
|
+
);
|
|
2184
|
+
|
|
2185
|
+
const onb18PacketComplete = makeFixture("onboarding-evidence-onb18-complete");
|
|
2186
|
+
writeEvidencePacket(
|
|
2187
|
+
onb18PacketComplete,
|
|
2188
|
+
"product/onboarding/graph/ONB-18-visual-design-prototype.md",
|
|
2189
|
+
substantiveResearchProse("the high-fidelity onboarding design, motion, interactive prototype, and design QA"),
|
|
2190
|
+
);
|
|
2191
|
+
runFixture(
|
|
2192
|
+
"ONB-18's gate passes a genuinely substantive, marker-free visual design and prototype packet",
|
|
2193
|
+
onb18PacketComplete,
|
|
2194
|
+
evidenceScript,
|
|
2195
|
+
0,
|
|
2196
|
+
undefined,
|
|
2197
|
+
["--node", "ONB-18", "--path", "product/onboarding/graph/ONB-18-visual-design-prototype.md"],
|
|
2198
|
+
);
|
|
2199
|
+
|
|
2200
|
+
const onb19PacketMissing = makeFixture("onboarding-evidence-onb19-missing");
|
|
2201
|
+
runFixture(
|
|
2202
|
+
"ONB-19's gate fails when the implementation and cutover contract does not exist yet",
|
|
2203
|
+
onb19PacketMissing,
|
|
2204
|
+
evidenceScript,
|
|
2205
|
+
1,
|
|
2206
|
+
"onboarding_evidence.packet_missing",
|
|
2207
|
+
["--node", "ONB-19", "--path", "product/onboarding/graph/ONB-19-implementation-cutover-contract.md"],
|
|
2208
|
+
);
|
|
2209
|
+
|
|
2210
|
+
const onb19PacketComplete = makeFixture("onboarding-evidence-onb19-complete");
|
|
2211
|
+
writeEvidencePacket(
|
|
2212
|
+
onb19PacketComplete,
|
|
2213
|
+
"product/onboarding/graph/ONB-19-implementation-cutover-contract.md",
|
|
2214
|
+
substantiveResearchProse("the implementation units, reliability, performance, observability, privacy, migration, hard cutover, and deletion plan"),
|
|
2215
|
+
);
|
|
2216
|
+
runFixture(
|
|
2217
|
+
"ONB-19's gate passes a genuinely substantive, marker-free implementation and cutover contract",
|
|
2218
|
+
onb19PacketComplete,
|
|
2219
|
+
evidenceScript,
|
|
2220
|
+
0,
|
|
2221
|
+
undefined,
|
|
2222
|
+
["--node", "ONB-19", "--path", "product/onboarding/graph/ONB-19-implementation-cutover-contract.md"],
|
|
2223
|
+
);
|
|
2224
|
+
|
|
2225
|
+
// --- check-onboarding-cutover-repository.ts ---
|
|
2226
|
+
// check-onboarding-graph.ts (and its --require-done variant) only ever read
|
|
2227
|
+
// product/ONBOARDING.md's own prose. A Removal Inventory row can claim Disposition
|
|
2228
|
+
// "delete" for an artifact that was never actually removed and both gates above stay
|
|
2229
|
+
// silent -- this is the independent, filesystem-grounded check that closes that gap.
|
|
2230
|
+
const cutoverScript = "check-onboarding-cutover-repository.ts";
|
|
2231
|
+
|
|
2232
|
+
const cutoverBaseline = makeFixture("onboarding-cutover-baseline");
|
|
2233
|
+
runFixture("shipped Removal Inventory template passes base mode: its unresolved option-list row is not a deletion claim", cutoverBaseline, cutoverScript, 0);
|
|
2234
|
+
|
|
2235
|
+
const cutoverUnverifiable = makeFixture("onboarding-cutover-deletion-unverifiable");
|
|
2236
|
+
mutateOnboarding(cutoverUnverifiable, (text) =>
|
|
2237
|
+
replaceTableRow(
|
|
2238
|
+
text,
|
|
2239
|
+
"| `REMOVE-001` | Record the item | Preserve durable data, transform once, recompute, archive legal history, or delete |",
|
|
2240
|
+
"| REMOVE-001 | Record the item | delete |",
|
|
2241
|
+
),
|
|
2242
|
+
);
|
|
2243
|
+
runFixture(
|
|
2244
|
+
"a delete-disposition row naming no backtick-quoted artifact is unverifiable",
|
|
2245
|
+
cutoverUnverifiable,
|
|
2246
|
+
cutoverScript,
|
|
2247
|
+
1,
|
|
2248
|
+
"onboarding_cutover.deletion_unverifiable",
|
|
2249
|
+
);
|
|
2250
|
+
|
|
2251
|
+
const cutoverNotVerified = makeFixture("onboarding-cutover-deletion-not-verified");
|
|
2252
|
+
mutateOnboarding(cutoverNotVerified, (text) =>
|
|
2253
|
+
replaceTableRow(
|
|
2254
|
+
text,
|
|
2255
|
+
"| `REMOVE-001` | Record the item | Preserve durable data, transform once, recompute, archive legal history, or delete |",
|
|
2256
|
+
"| `state/business-state.json` | Record the item | delete |",
|
|
2257
|
+
),
|
|
2258
|
+
);
|
|
2259
|
+
runFixture(
|
|
2260
|
+
"a delete-disposition row naming a path that still exists on disk fails",
|
|
2261
|
+
cutoverNotVerified,
|
|
2262
|
+
cutoverScript,
|
|
2263
|
+
1,
|
|
2264
|
+
"onboarding_cutover.deletion_not_verified",
|
|
2265
|
+
);
|
|
2266
|
+
|
|
2267
|
+
const cutoverVerified = makeFixture("onboarding-cutover-deletion-verified");
|
|
2268
|
+
mutateOnboarding(cutoverVerified, (text) =>
|
|
2269
|
+
replaceTableRow(
|
|
2270
|
+
text,
|
|
2271
|
+
"| `REMOVE-001` | Record the item | Preserve durable data, transform once, recompute, archive legal history, or delete |",
|
|
2272
|
+
"| `retired/old-onboarding-flow.ts` | Record the item | delete |",
|
|
2273
|
+
),
|
|
2274
|
+
);
|
|
2275
|
+
runFixture("a delete-disposition row naming a path genuinely absent from disk passes", cutoverVerified, cutoverScript, 0);
|
|
2276
|
+
|
|
2277
|
+
// Round 24 (PR #153 review): the shipped template row's Disposition cell is the unresolved
|
|
2278
|
+
// option list. A bare \bdelete\b substring test read that option list as a live deletion
|
|
2279
|
+
// decision, and its placeholder span (`REMOVE-001`, absent from disk by construction) then
|
|
2280
|
+
// counted as a verified deletion -- ONB-22 could pass without a concrete cutover inventory.
|
|
2281
|
+
// Base mode: an unresolved cell is NOT a deletion claim. --require-resolved (the ONB-22 gate
|
|
2282
|
+
// variant, check:onboarding-cutover-repository-complete): every row must resolve to exactly
|
|
2283
|
+
// one terminal disposition, so the shipped row itself is rejected until it is resolved.
|
|
2284
|
+
const cutoverUnresolvedRequire = makeFixture("onboarding-cutover-unresolved-require-resolved");
|
|
2285
|
+
runFixture(
|
|
2286
|
+
"the shipped option-list Disposition row fails --require-resolved until it records exactly one terminal disposition",
|
|
2287
|
+
cutoverUnresolvedRequire,
|
|
2288
|
+
cutoverScript,
|
|
2289
|
+
1,
|
|
2290
|
+
"onboarding_cutover.disposition_unresolved",
|
|
2291
|
+
["--require-resolved"],
|
|
2292
|
+
);
|
|
2293
|
+
|
|
2294
|
+
const cutoverResolvedRequire = makeFixture("onboarding-cutover-resolved-require-resolved");
|
|
2295
|
+
mutateOnboarding(cutoverResolvedRequire, (text) =>
|
|
2296
|
+
replaceTableRow(
|
|
2297
|
+
text,
|
|
2298
|
+
"| `REMOVE-001` | Record the item | Preserve durable data, transform once, recompute, archive legal history, or delete |",
|
|
2299
|
+
"| `retired/old-onboarding-flow.ts` | Record the item | delete |",
|
|
2300
|
+
),
|
|
2301
|
+
);
|
|
2302
|
+
runFixture("a resolved delete row naming a genuinely absent path passes --require-resolved", cutoverResolvedRequire, cutoverScript, 0, undefined, [
|
|
2303
|
+
"--require-resolved",
|
|
2304
|
+
]);
|
|
2305
|
+
|
|
2306
|
+
const cutoverOptionListNotAClaim = makeFixture("onboarding-cutover-option-list-not-a-claim");
|
|
2307
|
+
mutateOnboarding(cutoverOptionListNotAClaim, (text) => replaceTableRow(text, "| `REMOVE-001` | Record the item |", "| `state` | Record the item |"));
|
|
2308
|
+
runFixture(
|
|
2309
|
+
"an unresolved option-list row is not a deletion claim in base mode, even when its span names a path that still exists",
|
|
2310
|
+
cutoverOptionListNotAClaim,
|
|
2311
|
+
cutoverScript,
|
|
2312
|
+
0,
|
|
2313
|
+
);
|
|
2314
|
+
|
|
2315
|
+
// Regression: a punctuation heuristic ("must contain / or .") used to skip verifying any
|
|
2316
|
+
// extensionless span entirely, so a bare directory name naming a real, still-existing target
|
|
2317
|
+
// silently passed. `state` is a directory the fixture root always ships (copied from
|
|
2318
|
+
// examples/workspace/business), so this is a genuine on-disk collision, not a synthetic one.
|
|
2319
|
+
const cutoverExtensionlessNotVerified = makeFixture("onboarding-cutover-deletion-extensionless-not-verified");
|
|
2320
|
+
mutateOnboarding(cutoverExtensionlessNotVerified, (text) =>
|
|
2321
|
+
replaceTableRow(
|
|
2322
|
+
text,
|
|
2323
|
+
"| `REMOVE-001` | Record the item | Preserve durable data, transform once, recompute, archive legal history, or delete |",
|
|
2324
|
+
"| `state` | Record the item | delete |",
|
|
2325
|
+
),
|
|
2326
|
+
);
|
|
2327
|
+
runFixture(
|
|
2328
|
+
"a delete-disposition row naming an extensionless path that still exists on disk fails",
|
|
2329
|
+
cutoverExtensionlessNotVerified,
|
|
2330
|
+
cutoverScript,
|
|
2331
|
+
1,
|
|
2332
|
+
"onboarding_cutover.deletion_not_verified",
|
|
2333
|
+
);
|
|
2334
|
+
|
|
2335
|
+
// Regression (round 23): deletionManifestRows() used to return an empty array whenever the
|
|
2336
|
+
// "### Removal Inventory" heading itself was missing, and the caller's for-of loop over an
|
|
2337
|
+
// empty array reports zero issues -- indistinguishable from "nothing to verify". Renaming the
|
|
2338
|
+
// heading while leaving the phrase "Removal Inventory" elsewhere satisfies check-onboarding-
|
|
2339
|
+
// graph.ts's unrelated phrase-presence checks, so ONB-22 could pass both completion gates
|
|
2340
|
+
// without ever checking a single repository target.
|
|
2341
|
+
const cutoverManifestMissing = makeFixture("onboarding-cutover-manifest-missing");
|
|
2342
|
+
mutateOnboarding(cutoverManifestMissing, (text) =>
|
|
2343
|
+
text.replace("### Removal Inventory", "### Unstructured Removal Notes (see the Removal Inventory process elsewhere)"),
|
|
2344
|
+
);
|
|
2345
|
+
runFixture(
|
|
2346
|
+
"an artifact with no parseable Removal Inventory heading fails instead of silently passing",
|
|
2347
|
+
cutoverManifestMissing,
|
|
2348
|
+
cutoverScript,
|
|
2349
|
+
1,
|
|
2350
|
+
"onboarding_cutover.deletion_manifest_missing",
|
|
2351
|
+
);
|
|
2352
|
+
|
|
2353
|
+
// Same silent-pass gap, reached by renaming the table's Disposition column instead of removing
|
|
2354
|
+
// the heading: the heading and table both still exist, but header.indexOf("disposition") ===
|
|
2355
|
+
// -1 also used to return an empty array.
|
|
2356
|
+
const cutoverManifestDispositionRenamed = makeFixture("onboarding-cutover-manifest-disposition-renamed");
|
|
2357
|
+
mutateOnboarding(cutoverManifestDispositionRenamed, (text) =>
|
|
2358
|
+
replaceTableRow(
|
|
2359
|
+
text,
|
|
2360
|
+
"| Removal ID | Code, data, config, provider, analytics, test, doc, dashboard, alert, or secret | Disposition | Delete task | Verification |",
|
|
2361
|
+
"| Removal ID | Code, data, config, provider, analytics, test, doc, dashboard, alert, or secret | Action | Delete task | Verification |",
|
|
2362
|
+
),
|
|
2363
|
+
);
|
|
2364
|
+
runFixture(
|
|
2365
|
+
"a Removal Inventory table with its Disposition column renamed fails instead of silently passing",
|
|
2366
|
+
cutoverManifestDispositionRenamed,
|
|
2367
|
+
cutoverScript,
|
|
2368
|
+
1,
|
|
2369
|
+
"onboarding_cutover.deletion_manifest_unparseable",
|
|
2370
|
+
);
|
|
2371
|
+
|
|
2372
|
+
function checkVerificationItems(text: string): string {
|
|
2373
|
+
return text.replace(/^-\s*\[\s*\]/gm, "- [x]");
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
function markOnboardingDone(fixtureRoot: string): void {
|
|
2377
|
+
const state = readState(fixtureRoot);
|
|
2378
|
+
const lane = getLane(state, "onboarding");
|
|
2379
|
+
lane["status"] = "succeeded";
|
|
2380
|
+
lane["evidence"] = ["product/ONBOARDING.md", "product/onboarding.html"];
|
|
2381
|
+
writeState(fixtureRoot, state);
|
|
2382
|
+
}
|
|
2383
|
+
|
|
2384
|
+
// check-onboarding-graph.ts's tablePlaceholderCells() now also rejects boilerplate that
|
|
2385
|
+
// repeats with only an embedded counter varying (e.g. "Evidence-1: ...", "Evidence-2: ..."),
|
|
2386
|
+
// since that is exactly the shape of filler that is technically unique but carries no real
|
|
2387
|
+
// content. This filler derives each cell's text from its own table's column header and its
|
|
2388
|
+
// row's own identifying content instead of a counter, so distinct rows and columns produce
|
|
2389
|
+
// genuinely distinct text -- the same way a real completed launch's answers would differ
|
|
2390
|
+
// because they are about different things, not because of an incrementing label.
|
|
2391
|
+
function fillTemplateDirectiveCells(text: string): string {
|
|
2392
|
+
const lines = text.split("\n");
|
|
2393
|
+
let header: string[] | null = null;
|
|
2394
|
+
let pendingHeader: string[] | null = null;
|
|
2395
|
+
|
|
2396
|
+
return lines
|
|
2397
|
+
.map((line) => {
|
|
2398
|
+
const trimmed = line.trim();
|
|
2399
|
+
if (!trimmed.startsWith("|")) {
|
|
2400
|
+
header = null;
|
|
2401
|
+
pendingHeader = null;
|
|
2402
|
+
return line;
|
|
2403
|
+
}
|
|
2404
|
+
if (/^\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?$/.test(trimmed)) {
|
|
2405
|
+
header = pendingHeader;
|
|
2406
|
+
pendingHeader = null;
|
|
2407
|
+
return line;
|
|
2408
|
+
}
|
|
2409
|
+
if (header === null) {
|
|
2410
|
+
pendingHeader = line.split("|").map((cell) => cell.trim());
|
|
2411
|
+
return line;
|
|
2412
|
+
}
|
|
2413
|
+
const rawCells = line.split("|");
|
|
2414
|
+
const trimmedCells = rawCells.map((cell) => cell.trim().replaceAll("`", ""));
|
|
2415
|
+
const rowIdentity = trimmedCells.slice(1, -1).find((cell) => cell.length > 0 && !TEMPLATE_DIRECTIVE_VERBS_PATTERN.test(cell)) || "this row";
|
|
2416
|
+
const resolvedHeader = header;
|
|
2417
|
+
return rawCells
|
|
2418
|
+
.map((cell, index) => {
|
|
2419
|
+
if (!TEMPLATE_DIRECTIVE_VERBS_PATTERN.test(cell)) return cell;
|
|
2420
|
+
const columnName = (resolvedHeader?.[index] || "field").toLowerCase();
|
|
2421
|
+
return ` Confirmed ${columnName} for ${rowIdentity} `;
|
|
2422
|
+
})
|
|
2423
|
+
.join("|");
|
|
2424
|
+
})
|
|
2425
|
+
.join("\n");
|
|
2426
|
+
}
|
|
2427
|
+
|
|
2428
|
+
// Mirrors check-onboarding-graph.ts's own proseDirectiveLines(): fills paragraph-level
|
|
2429
|
+
// directive lines (Execution Mode, Source Map And Current-State Trace, ...) the table-cell
|
|
2430
|
+
// filler above never touches. Several of these same sentences are also where requirePhrases()
|
|
2431
|
+
// finds its required doctrine phrases (e.g. line 105's "Define First value rendered, First
|
|
2432
|
+
// value engaged, Activation, ..." carries three of onboarding_graph.activation_contract's
|
|
2433
|
+
// required phrases) -- replacing the whole line would make those checks fail too. Swap only
|
|
2434
|
+
// the leading verb for a word outside TEMPLATE_DIRECTIVE_VERBS_PATTERN, keeping the rest of
|
|
2435
|
+
// the sentence (and its required phrases) verbatim.
|
|
2436
|
+
function fillProseDirectiveLines(text: string): string {
|
|
2437
|
+
return text
|
|
2438
|
+
.split("\n")
|
|
2439
|
+
.map((line) => {
|
|
2440
|
+
const trimmed = line.trim();
|
|
2441
|
+
if (trimmed.length === 0 || trimmed.startsWith("|") || trimmed.startsWith("#") || trimmed.startsWith("-")) return line;
|
|
2442
|
+
if (!TEMPLATE_DIRECTIVE_VERBS_PATTERN.test(line)) return line;
|
|
2443
|
+
return line.replace(/^(\s*)[A-Za-z]+/, "$1Confirmed");
|
|
2444
|
+
})
|
|
2445
|
+
.join("\n");
|
|
2446
|
+
}
|
|
2447
|
+
}
|