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,2451 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { type Harness, skillRoot } from "./_harness.js";
|
|
6
|
+
import { artifactPageEntries } from "../../../../tooling/lib/artifact-pages.js";
|
|
7
|
+
import { auditExcludedScripts, buildAuditPlan, type AuditLayout } from "../../../../tooling/lib/audit-plan.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Fixtures for the repo/skill-level gates that previously had zero fixture
|
|
11
|
+
* coverage: the live audit pipeline only ever exercised their PASS path, so
|
|
12
|
+
* nothing proved they could fail. Each gate gets at least one failing input
|
|
13
|
+
* here so a regression that makes it always-pass is caught by test:validators.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** Scripts object that satisfies checkAuditPlanCoverage for a layout: every plan step resolves, no extra gate scripts. */
|
|
17
|
+
function planScripts(layout: AuditLayout): Record<string, string> {
|
|
18
|
+
const scripts: Record<string, string> = {};
|
|
19
|
+
for (const step of buildAuditPlan(layout)) {
|
|
20
|
+
if (step.kind === "tsc") {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
scripts[step.id] = step.id === "audit" ? "tsx tooling/run-audit.ts" : `tsx tooling/${step.id.replace(/:/g, "-")}.ts`;
|
|
24
|
+
}
|
|
25
|
+
for (const name of Object.keys(auditExcludedScripts)) {
|
|
26
|
+
scripts[name] = `tsx tooling/${name.replace(/:/g, "-")}.ts`;
|
|
27
|
+
}
|
|
28
|
+
return scripts;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function lockFor(name: string, version: string): string {
|
|
32
|
+
return JSON.stringify({ name, version, lockfileVersion: 3, packages: { "": { name, version } } }, null, 2);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Write a minimal synthetic repo-root + skill-root pair that check-package-parity accepts. */
|
|
36
|
+
function writeParityPair(
|
|
37
|
+
root: string,
|
|
38
|
+
options: { rootVersion: string; skillVersion: string; nodePin?: boolean },
|
|
39
|
+
): { repoRoot: string; parityScriptRoot: string } {
|
|
40
|
+
const repoRoot = path.join(root, "repo");
|
|
41
|
+
const parityScriptRoot = path.join(repoRoot, "skill", "pkg");
|
|
42
|
+
mkdirSync(parityScriptRoot, { recursive: true });
|
|
43
|
+
|
|
44
|
+
const rootScripts = {
|
|
45
|
+
...planScripts("repo"),
|
|
46
|
+
audit: "tsx skill/pkg/tooling/run-audit.ts",
|
|
47
|
+
"audit:ci": "tsx skill/pkg/tooling/run-audit.ts --ci",
|
|
48
|
+
};
|
|
49
|
+
const runtimeScripts = {
|
|
50
|
+
...planScripts("skill"),
|
|
51
|
+
audit: "tsx tooling/run-audit.ts",
|
|
52
|
+
};
|
|
53
|
+
const engines = options.nodePin === false ? undefined : { node: ">=22" };
|
|
54
|
+
|
|
55
|
+
writeFileSync(
|
|
56
|
+
path.join(repoRoot, "package.json"),
|
|
57
|
+
JSON.stringify({ name: "parity-root", version: options.rootVersion, ...(engines ? { engines } : {}), scripts: rootScripts, devDependencies: {} }, null, 2),
|
|
58
|
+
"utf8",
|
|
59
|
+
);
|
|
60
|
+
writeFileSync(path.join(repoRoot, "package-lock.json"), lockFor("parity-root", options.rootVersion), "utf8");
|
|
61
|
+
writeFileSync(
|
|
62
|
+
path.join(parityScriptRoot, "package.json"),
|
|
63
|
+
JSON.stringify(
|
|
64
|
+
{ name: "parity-runtime", version: options.skillVersion, ...(engines ? { engines } : {}), scripts: runtimeScripts, devDependencies: {} },
|
|
65
|
+
null,
|
|
66
|
+
2,
|
|
67
|
+
),
|
|
68
|
+
"utf8",
|
|
69
|
+
);
|
|
70
|
+
writeFileSync(path.join(parityScriptRoot, "package-lock.json"), lockFor("parity-runtime", options.skillVersion), "utf8");
|
|
71
|
+
writeFileSync(path.join(parityScriptRoot, "skill-version.json"), JSON.stringify({ version: options.skillVersion }, null, 2), "utf8");
|
|
72
|
+
if (options.nodePin !== false) {
|
|
73
|
+
writeFileSync(path.join(repoRoot, ".nvmrc"), "22\n", "utf8");
|
|
74
|
+
writeFileSync(path.join(repoRoot, ".node-version"), "22\n", "utf8");
|
|
75
|
+
}
|
|
76
|
+
return { repoRoot, parityScriptRoot };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function register(h: Harness): void {
|
|
80
|
+
const { makeEmptyFixture, runFixture, runScriptArgs } = h;
|
|
81
|
+
|
|
82
|
+
// --- check-autopilot-contract ---
|
|
83
|
+
runScriptArgs("autopilot contract passes on the shipped skill", "check-autopilot-contract.ts", ["--skill-root", skillRoot], 0);
|
|
84
|
+
const autopilotEmpty = makeEmptyFixture("autopilot-empty-skill-root");
|
|
85
|
+
runScriptArgs(
|
|
86
|
+
"autopilot contract fails when SKILL.md is missing",
|
|
87
|
+
"check-autopilot-contract.ts",
|
|
88
|
+
["--skill-root", autopilotEmpty],
|
|
89
|
+
1,
|
|
90
|
+
"autopilot.skill_missing",
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// --- check-gates-layout ---
|
|
94
|
+
//
|
|
95
|
+
// The shipped tree must pass, and each of the three rules must be provably
|
|
96
|
+
// able to fail. A flat checks/validation/business/ made duplicate basenames structurally
|
|
97
|
+
// impossible; the mirrored layout does not, so that rule in particular is
|
|
98
|
+
// the one carrying a guarantee the previous layout gave for free.
|
|
99
|
+
runScriptArgs("gates layout passes on the shipped skill", "check-gates-layout.ts", ["--skill-root", skillRoot], 0);
|
|
100
|
+
|
|
101
|
+
/** Minimal skill root: playbook domains define the permitted gate folders. */
|
|
102
|
+
const layoutRoot = (name: string, build: (root: string) => void): string => {
|
|
103
|
+
const root = makeEmptyFixture(name);
|
|
104
|
+
for (const domain of ["money", "process"]) {
|
|
105
|
+
mkdirSync(path.join(root, "knowledge", domain), { recursive: true });
|
|
106
|
+
}
|
|
107
|
+
mkdirSync(path.join(root, "checks", "validation", "business", "money"), { recursive: true });
|
|
108
|
+
writeFileSync(path.join(root, "checks", "validation", "business", "money", "check-revenue.ts"), "// stub\n", "utf8");
|
|
109
|
+
build(root);
|
|
110
|
+
return root;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const layoutClean = layoutRoot("gates-layout-clean", () => {});
|
|
114
|
+
runScriptArgs("gates layout passes when every gate nests in a real domain", "check-gates-layout.ts", ["--skill-root", layoutClean], 0);
|
|
115
|
+
|
|
116
|
+
const layoutUngrouped = layoutRoot("gates-layout-ungrouped", (root) => {
|
|
117
|
+
writeFileSync(path.join(root, "checks", "validation", "business", "check-stray.ts"), "// stub\n", "utf8");
|
|
118
|
+
});
|
|
119
|
+
runScriptArgs(
|
|
120
|
+
"gates layout fails on a gate left at the checks/validation/business/ root",
|
|
121
|
+
"check-gates-layout.ts",
|
|
122
|
+
["--skill-root", layoutUngrouped],
|
|
123
|
+
1,
|
|
124
|
+
"gates_layout.ungrouped_gate",
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const layoutUnknownDomain = layoutRoot("gates-layout-unknown-domain", (root) => {
|
|
128
|
+
mkdirSync(path.join(root, "checks", "validation", "business", "finance"), { recursive: true });
|
|
129
|
+
writeFileSync(path.join(root, "checks", "validation", "business", "finance", "check-invoices.ts"), "// stub\n", "utf8");
|
|
130
|
+
});
|
|
131
|
+
runScriptArgs(
|
|
132
|
+
"gates layout fails on a folder that is not a playbook domain",
|
|
133
|
+
"check-gates-layout.ts",
|
|
134
|
+
["--skill-root", layoutUnknownDomain],
|
|
135
|
+
1,
|
|
136
|
+
"gates_layout.unknown_domain",
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
const layoutDuplicate = layoutRoot("gates-layout-duplicate-basename", (root) => {
|
|
140
|
+
mkdirSync(path.join(root, "checks", "validation", "business", "process"), { recursive: true });
|
|
141
|
+
// Same basename as checks/validation/business/money/check-revenue.ts — impossible under a flat
|
|
142
|
+
// checks/validation/business/, permitted by the filesystem once the domains are folders.
|
|
143
|
+
writeFileSync(path.join(root, "checks", "validation", "business", "process", "check-revenue.ts"), "// stub\n", "utf8");
|
|
144
|
+
});
|
|
145
|
+
runScriptArgs(
|
|
146
|
+
"gates layout fails when two domains hold the same basename",
|
|
147
|
+
"check-gates-layout.ts",
|
|
148
|
+
["--skill-root", layoutDuplicate],
|
|
149
|
+
1,
|
|
150
|
+
"gates_layout.duplicate_basename",
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
// body_contract only earns its cost if dropping one pinned term actually
|
|
154
|
+
// fails. The term stripped here is the read-only default, because that is the
|
|
155
|
+
// one whose loss is a safety regression rather than a wording change: AGENTS.md
|
|
156
|
+
// states it separately, and nothing else in this repo reads SKILL.md for it.
|
|
157
|
+
//
|
|
158
|
+
// The earlier version of this fixture stripped "non-Claude-Code runtime", a
|
|
159
|
+
// string a later SKILL.md rewrite removed. The replace() silently became a
|
|
160
|
+
// no-op and the fixture kept passing on the 65 unrelated errors the stale eval
|
|
161
|
+
// was already producing. When SKILL.md is rewritten on purpose, re-derive the
|
|
162
|
+
// eval's terms AND the term stripped here in the same change.
|
|
163
|
+
const autopilotStripped = makeEmptyFixture("autopilot-read-only-default-stripped");
|
|
164
|
+
mkdirSync(path.join(autopilotStripped, "checks", "validation", "repository", "evals", "triggering"), { recursive: true });
|
|
165
|
+
cpSync(
|
|
166
|
+
path.join(skillRoot, "checks", "validation", "repository", "evals", "triggering", "autopilot-triggering.yaml"),
|
|
167
|
+
path.join(autopilotStripped, "checks", "validation", "repository", "evals", "triggering", "autopilot-triggering.yaml"),
|
|
168
|
+
);
|
|
169
|
+
const shippedSkill = readFileSync(path.join(skillRoot, "SKILL.md"), "utf8");
|
|
170
|
+
const procedureDirectory = "agents/skills/b2c-app-builder/references";
|
|
171
|
+
cpSync(path.join(skillRoot, procedureDirectory), path.join(autopilotStripped, procedureDirectory), { recursive: true });
|
|
172
|
+
writeFileSync(path.join(autopilotStripped, "SKILL.md"), shippedSkill, "utf8");
|
|
173
|
+
runScriptArgs("autopilot root and linked procedures pass before mutation", "check-autopilot-contract.ts", ["--skill-root", autopilotStripped], 0);
|
|
174
|
+
const strippedSkill = shippedSkill.replace("Keep MCP read-only by default", "Let the MCP write by default");
|
|
175
|
+
assert.notEqual(strippedSkill, shippedSkill, "autopilot fixture must strip a term SKILL.md still contains");
|
|
176
|
+
writeFileSync(path.join(autopilotStripped, "SKILL.md"), strippedSkill, "utf8");
|
|
177
|
+
runScriptArgs(
|
|
178
|
+
"autopilot contract fails when SKILL.md drops the MCP read-only default",
|
|
179
|
+
"check-autopilot-contract.ts",
|
|
180
|
+
["--skill-root", autopilotStripped],
|
|
181
|
+
1,
|
|
182
|
+
"autopilot.body.required_term_missing",
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
// Unsafe routing language must fail the skill contract even when added to a valid body.
|
|
186
|
+
const autopilotForbiddenTerm = "bypass the reducer";
|
|
187
|
+
const autopilotForbidden = makeEmptyFixture("autopilot-forbidden-term-reintroduced");
|
|
188
|
+
mkdirSync(path.join(autopilotForbidden, "checks", "validation", "repository", "evals", "triggering"), { recursive: true });
|
|
189
|
+
cpSync(
|
|
190
|
+
path.join(skillRoot, "checks", "validation", "repository", "evals", "triggering", "autopilot-triggering.yaml"),
|
|
191
|
+
path.join(autopilotForbidden, "checks", "validation", "repository", "evals", "triggering", "autopilot-triggering.yaml"),
|
|
192
|
+
);
|
|
193
|
+
cpSync(path.join(skillRoot, procedureDirectory), path.join(autopilotForbidden, procedureDirectory), { recursive: true });
|
|
194
|
+
const shippedSkillBody = readFileSync(path.join(skillRoot, "SKILL.md"), "utf8");
|
|
195
|
+
assert.ok(
|
|
196
|
+
!shippedSkillBody.toLowerCase().includes(autopilotForbiddenTerm.toLowerCase()),
|
|
197
|
+
"forbidden-term fixture must start from a SKILL.md that does not already contain the unsafe instruction",
|
|
198
|
+
);
|
|
199
|
+
const reintroduced = `${shippedSkillBody}\n\nUpdate \`${autopilotForbiddenTerm}\` directly when state changes.\n`;
|
|
200
|
+
assert.notEqual(reintroduced, shippedSkillBody, "forbidden-term fixture must actually add the unsafe instruction");
|
|
201
|
+
assert.ok(
|
|
202
|
+
reintroduced.toLowerCase().includes(autopilotForbiddenTerm.toLowerCase()),
|
|
203
|
+
"forbidden-term fixture must contain the unsafe instruction it claims to reintroduce",
|
|
204
|
+
);
|
|
205
|
+
writeFileSync(path.join(autopilotForbidden, "SKILL.md"), reintroduced, "utf8");
|
|
206
|
+
runScriptArgs(
|
|
207
|
+
"autopilot contract fails when SKILL.md reintroduces a unsafe routing instruction",
|
|
208
|
+
"check-autopilot-contract.ts",
|
|
209
|
+
["--skill-root", autopilotForbidden],
|
|
210
|
+
1,
|
|
211
|
+
"autopilot.body.forbidden_term_present",
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
// --- check-generated-pages ---
|
|
215
|
+
//
|
|
216
|
+
// Four founder-facing pages had drifted from the documents they were written
|
|
217
|
+
// from while the audit stayed green, so every rule here has to be provably
|
|
218
|
+
// able to fail. All three assertions matter: page-is-declared alone misses a
|
|
219
|
+
// deleted page, declared-page-exists alone misses stale content, and the
|
|
220
|
+
// byte-match alone misses a new hand-authored page nobody declared.
|
|
221
|
+
runScriptArgs(
|
|
222
|
+
"generated pages pass on the shipped business documents",
|
|
223
|
+
"check-generated-pages.ts",
|
|
224
|
+
["--root", path.join(skillRoot, "examples", "workspace", "business")],
|
|
225
|
+
0,
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* A business root holding only what this gate reads: every declared page plus
|
|
230
|
+
* every Markdown source. Copying the whole of business/ would work and would
|
|
231
|
+
* cost ~300 files per fixture for no extra coverage.
|
|
232
|
+
*/
|
|
233
|
+
const pagesRoot = (name: string, build: (root: string) => void): string => {
|
|
234
|
+
const root = makeEmptyFixture(name);
|
|
235
|
+
for (const [html, entry] of artifactPageEntries()) {
|
|
236
|
+
cpSync(path.join(skillRoot, "examples", "workspace", "business", html), path.join(root, html));
|
|
237
|
+
if (entry.kind === "authored-from") {
|
|
238
|
+
cpSync(path.join(skillRoot, "examples", "workspace", "business", entry.markdown), path.join(root, entry.markdown));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
build(root);
|
|
242
|
+
return root;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
runScriptArgs(
|
|
246
|
+
"generated pages fail when the business directory is absent",
|
|
247
|
+
"check-generated-pages.ts",
|
|
248
|
+
["--root", path.join(skillRoot, "examples", "workspace", "business", "no-such-directory")],
|
|
249
|
+
1,
|
|
250
|
+
"generated_pages.business_root_missing",
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
const pagesClean = pagesRoot("generated-pages-clean", () => {});
|
|
254
|
+
runScriptArgs("generated pages pass on a root holding exactly the declared set", "check-generated-pages.ts", ["--root", pagesClean], 0);
|
|
255
|
+
|
|
256
|
+
const pagesUndeclared = pagesRoot("generated-pages-undeclared", (root) => {
|
|
257
|
+
writeFileSync(path.join(root, "revenue-board.html"), "<!doctype html><html><body>hand written</body></html>", "utf8");
|
|
258
|
+
});
|
|
259
|
+
runScriptArgs(
|
|
260
|
+
"generated pages fail on a page added with no declared source",
|
|
261
|
+
"check-generated-pages.ts",
|
|
262
|
+
["--root", pagesUndeclared],
|
|
263
|
+
1,
|
|
264
|
+
"generated_pages.undeclared_page",
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
const pagesDeleted = pagesRoot("generated-pages-deleted", (root) => {
|
|
268
|
+
rmSync(path.join(root, "store/store-console.html"));
|
|
269
|
+
});
|
|
270
|
+
runScriptArgs(
|
|
271
|
+
"generated pages fail when a declared page is deleted",
|
|
272
|
+
"check-generated-pages.ts",
|
|
273
|
+
["--root", pagesDeleted],
|
|
274
|
+
1,
|
|
275
|
+
"generated_pages.missing_page",
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
const pagesSourceGone = pagesRoot("generated-pages-source-missing", (root) => {
|
|
279
|
+
rmSync(path.join(root, "trust/SECURITY.md"));
|
|
280
|
+
});
|
|
281
|
+
runScriptArgs(
|
|
282
|
+
"generated pages fail when the document a page is written from is deleted",
|
|
283
|
+
"check-generated-pages.ts",
|
|
284
|
+
["--root", pagesSourceGone],
|
|
285
|
+
1,
|
|
286
|
+
"generated_pages.source_missing",
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
// The drift case is the one the four broken pages would have been caught by:
|
|
290
|
+
// the file exists, is declared, and no longer says what its source says.
|
|
291
|
+
const pagesDrift = pagesRoot("generated-pages-drift", (root) => {
|
|
292
|
+
const page = path.join(root, "product/onboarding.html");
|
|
293
|
+
writeFileSync(page, readFileSync(page, "utf8").replace("Push permission prime", "Push permission (removed by hand)"), "utf8");
|
|
294
|
+
});
|
|
295
|
+
runScriptArgs(
|
|
296
|
+
"generated pages fail when a page is edited away from its source",
|
|
297
|
+
"check-generated-pages.ts",
|
|
298
|
+
["--root", pagesDrift],
|
|
299
|
+
1,
|
|
300
|
+
"generated_pages.drift",
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
// markdown-lite rejects constructs outside its subset instead of rendering
|
|
304
|
+
// them as something else. A silent downgrade to a paragraph is exactly how a
|
|
305
|
+
// section turns to mush behind a green gate.
|
|
306
|
+
const pagesUnsupported = pagesRoot("generated-pages-unsupported-markdown", (root) => {
|
|
307
|
+
const source = path.join(root, "operations/ORCHESTRATION.md");
|
|
308
|
+
writeFileSync(source, `${readFileSync(source, "utf8")}\n#### Too deep for this renderer\n`, "utf8");
|
|
309
|
+
});
|
|
310
|
+
runScriptArgs(
|
|
311
|
+
"generated pages fail on Markdown outside the subset rather than mangling it",
|
|
312
|
+
"check-generated-pages.ts",
|
|
313
|
+
["--root", pagesUnsupported],
|
|
314
|
+
1,
|
|
315
|
+
"generated_pages.unsupported_markdown",
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
// --page scopes assertions 2 and 3 to one declared page -- used by ONB-22's own gate
|
|
319
|
+
// (check:onboarding-page-fresh) so its acceptance does not depend on an unrelated page
|
|
320
|
+
// elsewhere in the manifest being fresh too.
|
|
321
|
+
runScriptArgs(
|
|
322
|
+
"a --page-scoped check passes on the shipped business documents",
|
|
323
|
+
"check-generated-pages.ts",
|
|
324
|
+
["--root", path.join(skillRoot, "examples", "workspace", "business"), "--page", "product/onboarding.html"],
|
|
325
|
+
0,
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
const pagesScopedDriftElsewhere = pagesRoot("generated-pages-scoped-drift-elsewhere", (root) => {
|
|
329
|
+
const source = path.join(root, "operations/ORCHESTRATION.md");
|
|
330
|
+
writeFileSync(source, `${readFileSync(source, "utf8")}\nAn unrelated stale line the rendered page no longer carries.\n`, "utf8");
|
|
331
|
+
});
|
|
332
|
+
runScriptArgs(
|
|
333
|
+
"--page product/onboarding.html passes even though an unrelated declared page has drifted",
|
|
334
|
+
"check-generated-pages.ts",
|
|
335
|
+
["--root", pagesScopedDriftElsewhere, "--page", "product/onboarding.html"],
|
|
336
|
+
0,
|
|
337
|
+
);
|
|
338
|
+
runScriptArgs(
|
|
339
|
+
"the unscoped check still fails on that same unrelated drift",
|
|
340
|
+
"check-generated-pages.ts",
|
|
341
|
+
["--root", pagesScopedDriftElsewhere],
|
|
342
|
+
1,
|
|
343
|
+
"generated_pages.drift",
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
runScriptArgs(
|
|
347
|
+
"--page product/onboarding.html still fails when onboarding.html itself has drifted",
|
|
348
|
+
"check-generated-pages.ts",
|
|
349
|
+
["--root", pagesDrift, "--page", "product/onboarding.html"],
|
|
350
|
+
1,
|
|
351
|
+
"generated_pages.drift",
|
|
352
|
+
);
|
|
353
|
+
|
|
354
|
+
runScriptArgs(
|
|
355
|
+
"a --page value with no matching manifest entry fails loudly instead of passing vacuously",
|
|
356
|
+
"check-generated-pages.ts",
|
|
357
|
+
["--root", pagesClean, "--page", "product/does-not-exist.html"],
|
|
358
|
+
1,
|
|
359
|
+
"generated_pages.page_not_declared",
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
// --- check-package-parity ---
|
|
363
|
+
const parityClean = makeEmptyFixture("package-parity-clean");
|
|
364
|
+
const cleanPair = writeParityPair(parityClean, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
365
|
+
runScriptArgs(
|
|
366
|
+
"package parity passes on a version-aligned synthetic pair",
|
|
367
|
+
"check-package-parity.ts",
|
|
368
|
+
["--repo-root", cleanPair.repoRoot, "--skill-root", cleanPair.parityScriptRoot],
|
|
369
|
+
0,
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
// ADR-0002: check-package-parity now treats the root package.json as the shipped runtime
|
|
373
|
+
// manifest (checkPackStandalone reads args.repoRoot, not args.skillRoot), so the files/
|
|
374
|
+
// dependencies mutation below has to land on the repo-root manifest to be seen at all. It is
|
|
375
|
+
// mirrored onto the skill/pkg manifest too, so this fixture exercises only the missing
|
|
376
|
+
// checkout-compiler failure it names — not an incidental shared-parser-version-drift
|
|
377
|
+
// finding from the two manifests disagreeing on every other dependency. After the compiled
|
|
378
|
+
// runtime, typescript and tsx belong in devDependencies; packed bins must not carry them.
|
|
379
|
+
const parityMissingTypeScript = makeEmptyFixture("package-parity-missing-typescript-checkout-tool");
|
|
380
|
+
const missingTypeScriptPair = writeParityPair(parityMissingTypeScript, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
381
|
+
const missingTypeScriptDependencies = {
|
|
382
|
+
"@google/design.md": "1.0.0",
|
|
383
|
+
"@mdx-js/mdx": "1.0.0",
|
|
384
|
+
"@modelcontextprotocol/sdk": "1.0.0",
|
|
385
|
+
yaml: "1.0.0",
|
|
386
|
+
zod: "1.0.0",
|
|
387
|
+
};
|
|
388
|
+
for (const manifestPath of [path.join(missingTypeScriptPair.repoRoot, "package.json"), path.join(missingTypeScriptPair.parityScriptRoot, "package.json")]) {
|
|
389
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8")) as Record<string, unknown>;
|
|
390
|
+
manifest.files = ["entrypoints"];
|
|
391
|
+
manifest.dependencies = missingTypeScriptDependencies;
|
|
392
|
+
manifest.devDependencies = { tsx: "1.0.0" };
|
|
393
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
|
|
394
|
+
}
|
|
395
|
+
mkdirSync(path.join(missingTypeScriptPair.parityScriptRoot, "entrypoints", "cli"), { recursive: true });
|
|
396
|
+
writeFileSync(path.join(missingTypeScriptPair.parityScriptRoot, "entrypoints", "cli", "b2c.mjs"), "#!/usr/bin/env node\n", "utf8");
|
|
397
|
+
runScriptArgs(
|
|
398
|
+
"package parity fails when the TypeScript compiler is missing from checkout tools",
|
|
399
|
+
"check-package-parity.ts",
|
|
400
|
+
["--repo-root", missingTypeScriptPair.repoRoot, "--skill-root", missingTypeScriptPair.parityScriptRoot],
|
|
401
|
+
1,
|
|
402
|
+
"typescript is a checkout/build tool and must live in devDependencies",
|
|
403
|
+
);
|
|
404
|
+
|
|
405
|
+
const parityMissingMdx = makeEmptyFixture("package-parity-missing-mdx-runtime-dependency");
|
|
406
|
+
const missingMdxPair = writeParityPair(parityMissingMdx, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
407
|
+
const missingMdxDependencies = {
|
|
408
|
+
"@modelcontextprotocol/sdk": "1.0.0",
|
|
409
|
+
tsx: "1.0.0",
|
|
410
|
+
typescript: "1.0.0",
|
|
411
|
+
yaml: "1.0.0",
|
|
412
|
+
zod: "1.0.0",
|
|
413
|
+
};
|
|
414
|
+
for (const manifestPath of [path.join(missingMdxPair.repoRoot, "package.json"), path.join(missingMdxPair.parityScriptRoot, "package.json")]) {
|
|
415
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8")) as Record<string, unknown>;
|
|
416
|
+
manifest.files = ["entrypoints"];
|
|
417
|
+
manifest.dependencies = missingMdxDependencies;
|
|
418
|
+
manifest.devDependencies = { "@mdx-js/mdx": "1.0.0" };
|
|
419
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
|
|
420
|
+
}
|
|
421
|
+
mkdirSync(path.join(missingMdxPair.parityScriptRoot, "entrypoints", "cli"), { recursive: true });
|
|
422
|
+
writeFileSync(path.join(missingMdxPair.parityScriptRoot, "entrypoints", "cli", "b2c.mjs"), "#!/usr/bin/env node\n", "utf8");
|
|
423
|
+
runScriptArgs(
|
|
424
|
+
"package parity fails when the shipped MDX parser remains dev-only",
|
|
425
|
+
"check-package-parity.ts",
|
|
426
|
+
["--repo-root", missingMdxPair.repoRoot, "--skill-root", missingMdxPair.parityScriptRoot],
|
|
427
|
+
1,
|
|
428
|
+
"@mdx-js/mdx is imported (or execed)",
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
const parityParserDrift = makeEmptyFixture("package-parity-parser-version-drift");
|
|
432
|
+
const parserDriftPair = writeParityPair(parityParserDrift, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
433
|
+
const parserDriftRootManifestPath = path.join(parserDriftPair.repoRoot, "package.json");
|
|
434
|
+
const parserDriftRuntimeManifestPath = path.join(parserDriftPair.parityScriptRoot, "package.json");
|
|
435
|
+
const parserDriftRootManifest = JSON.parse(readFileSync(parserDriftRootManifestPath, "utf8")) as Record<string, unknown>;
|
|
436
|
+
const parserDriftRuntimeManifest = JSON.parse(readFileSync(parserDriftRuntimeManifestPath, "utf8")) as Record<string, unknown>;
|
|
437
|
+
parserDriftRootManifest.dependencies = { "@mdx-js/mdx": "3.1.1" };
|
|
438
|
+
parserDriftRuntimeManifest.dependencies = { "@mdx-js/mdx": "3.1.0" };
|
|
439
|
+
writeFileSync(parserDriftRootManifestPath, JSON.stringify(parserDriftRootManifest, null, 2), "utf8");
|
|
440
|
+
writeFileSync(parserDriftRuntimeManifestPath, JSON.stringify(parserDriftRuntimeManifest, null, 2), "utf8");
|
|
441
|
+
runScriptArgs(
|
|
442
|
+
"package parity fails when shared parser versions drift",
|
|
443
|
+
"check-package-parity.ts",
|
|
444
|
+
["--repo-root", parserDriftPair.repoRoot, "--skill-root", parserDriftPair.parityScriptRoot],
|
|
445
|
+
1,
|
|
446
|
+
"package_parity.shared_runtime_dependency_version_drift",
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
const parityTypeScriptDrift = makeEmptyFixture("package-parity-typescript-version-drift");
|
|
450
|
+
const typeScriptDriftPair = writeParityPair(parityTypeScriptDrift, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
451
|
+
const typeScriptDriftRootManifestPath = path.join(typeScriptDriftPair.repoRoot, "package.json");
|
|
452
|
+
const typeScriptDriftRuntimeManifestPath = path.join(typeScriptDriftPair.parityScriptRoot, "package.json");
|
|
453
|
+
const typeScriptDriftRootManifest = JSON.parse(readFileSync(typeScriptDriftRootManifestPath, "utf8")) as Record<string, unknown>;
|
|
454
|
+
const typeScriptDriftRuntimeManifest = JSON.parse(readFileSync(typeScriptDriftRuntimeManifestPath, "utf8")) as Record<string, unknown>;
|
|
455
|
+
typeScriptDriftRootManifest.dependencies = { typescript: "7.0.2" };
|
|
456
|
+
typeScriptDriftRuntimeManifest.dependencies = { typescript: "7.0.1" };
|
|
457
|
+
writeFileSync(typeScriptDriftRootManifestPath, JSON.stringify(typeScriptDriftRootManifest, null, 2), "utf8");
|
|
458
|
+
writeFileSync(typeScriptDriftRuntimeManifestPath, JSON.stringify(typeScriptDriftRuntimeManifest, null, 2), "utf8");
|
|
459
|
+
runScriptArgs(
|
|
460
|
+
"package parity fails when shared TypeScript versions drift",
|
|
461
|
+
"check-package-parity.ts",
|
|
462
|
+
["--repo-root", typeScriptDriftPair.repoRoot, "--skill-root", typeScriptDriftPair.parityScriptRoot],
|
|
463
|
+
1,
|
|
464
|
+
"package_parity.shared_runtime_dependency_version_drift",
|
|
465
|
+
);
|
|
466
|
+
|
|
467
|
+
const parityNoPin = makeEmptyFixture("package-parity-missing-node-pin");
|
|
468
|
+
const noPinPair = writeParityPair(parityNoPin, { rootVersion: "0.0.1", skillVersion: "0.0.1", nodePin: false });
|
|
469
|
+
runScriptArgs(
|
|
470
|
+
"package parity fails when the synthetic pair omits engines.node and the Node pin files",
|
|
471
|
+
"check-package-parity.ts",
|
|
472
|
+
["--repo-root", noPinPair.repoRoot, "--skill-root", noPinPair.parityScriptRoot],
|
|
473
|
+
1,
|
|
474
|
+
"package_parity.root_engines_missing",
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
const parityDrift = makeEmptyFixture("package-parity-version-drift");
|
|
478
|
+
const driftPair = writeParityPair(parityDrift, { rootVersion: "0.0.1", skillVersion: "0.0.2" });
|
|
479
|
+
runScriptArgs(
|
|
480
|
+
"package parity fails when versions drift from skill-version.json",
|
|
481
|
+
"check-package-parity.ts",
|
|
482
|
+
["--repo-root", driftPair.repoRoot, "--skill-root", driftPair.parityScriptRoot],
|
|
483
|
+
1,
|
|
484
|
+
"must match skill-version.json",
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
// A wired validator absent from run-launchbench.ts's knownValidators literal
|
|
488
|
+
// is structurally barred from scenario coverage — the drift that let five real
|
|
489
|
+
// PR-blocking gates go scenario-invisible. The parity check now reads the
|
|
490
|
+
// literal and fails on the gap.
|
|
491
|
+
const parityAllowlist = makeEmptyFixture("package-parity-launchbench-allowlist-gap");
|
|
492
|
+
const allowlistPair = writeParityPair(parityAllowlist, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
493
|
+
mkdirSync(path.join(allowlistPair.parityScriptRoot, "tooling"), { recursive: true });
|
|
494
|
+
writeFileSync(path.join(allowlistPair.parityScriptRoot, "tooling", "validate-project-state.ts"), "// stub\n", "utf8");
|
|
495
|
+
writeFileSync(
|
|
496
|
+
path.join(allowlistPair.parityScriptRoot, "tooling", "run-launchbench.ts"),
|
|
497
|
+
'const knownValidators = new Set(["validate-project-state"]);\nexport { knownValidators };\n',
|
|
498
|
+
"utf8",
|
|
499
|
+
);
|
|
500
|
+
runScriptArgs(
|
|
501
|
+
"package parity fails when a wired validator is missing from the launchbench allowlist",
|
|
502
|
+
"check-package-parity.ts",
|
|
503
|
+
["--repo-root", allowlistPair.repoRoot, "--skill-root", allowlistPair.parityScriptRoot],
|
|
504
|
+
1,
|
|
505
|
+
"package_parity.launchbench_validator_missing",
|
|
506
|
+
);
|
|
507
|
+
|
|
508
|
+
// A wired validator whose command names no script under checks/validation/business/, checks/validation/repository/ or
|
|
509
|
+
// tooling/ used to be skipped in silence: the basename regex simply failed to
|
|
510
|
+
// match and the loop moved on, so the allowlist cross-check above could grade
|
|
511
|
+
// nothing while still exiting 0. That is the exact shape of failure the
|
|
512
|
+
// checks/validation/business/ + checks/validation/repository/ split could have reintroduced, so the unparseable command
|
|
513
|
+
// is now an error in its own right and is proven to fail here.
|
|
514
|
+
const parityUnparseable = makeEmptyFixture("package-parity-unparseable-validator-command");
|
|
515
|
+
const unparseablePair = writeParityPair(parityUnparseable, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
516
|
+
mkdirSync(path.join(unparseablePair.parityScriptRoot, "tooling"), { recursive: true });
|
|
517
|
+
writeFileSync(path.join(unparseablePair.parityScriptRoot, "tooling", "validate-project-state.ts"), "// stub\n", "utf8");
|
|
518
|
+
writeFileSync(
|
|
519
|
+
path.join(unparseablePair.parityScriptRoot, "tooling", "run-launchbench.ts"),
|
|
520
|
+
'const knownValidators = new Set(["validate-project-state"]);\nexport { knownValidators };\n',
|
|
521
|
+
"utf8",
|
|
522
|
+
);
|
|
523
|
+
for (const packagePath of [path.join(unparseablePair.repoRoot, "package.json"), path.join(unparseablePair.parityScriptRoot, "package.json")]) {
|
|
524
|
+
const parsed = JSON.parse(readFileSync(packagePath, "utf8")) as { scripts: Record<string, string> };
|
|
525
|
+
// tools/ is not one of the three script roots, so no basename can be read.
|
|
526
|
+
parsed.scripts["check:revenue"] = "tsx tools/check-revenue.ts";
|
|
527
|
+
writeFileSync(packagePath, JSON.stringify(parsed, null, 2), "utf8");
|
|
528
|
+
}
|
|
529
|
+
runScriptArgs(
|
|
530
|
+
"package parity fails loudly when a wired validator command names no known script root",
|
|
531
|
+
"check-package-parity.ts",
|
|
532
|
+
["--repo-root", unparseablePair.repoRoot, "--skill-root", unparseablePair.parityScriptRoot],
|
|
533
|
+
1,
|
|
534
|
+
"package_parity.launchbench_validator_unparseable",
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
const templateFiles = [
|
|
538
|
+
["surfaces/workspace-template/repo-agent-entrypoints/AGENTS.md", "# agents\n"],
|
|
539
|
+
["surfaces/workspace-template/repo-agent-entrypoints/CLAUDE.md", "# claude\n"],
|
|
540
|
+
["surfaces/workspace-template/repo-agent-entrypoints/.cursor/rules/agents.mdc", "# cursor\n"],
|
|
541
|
+
["surfaces/workspace-template/repo-agent-entrypoints/.claude/settings.json", "{}\n"],
|
|
542
|
+
] as const;
|
|
543
|
+
const writeTemplateEntrypoints = (repoRoot: string): void => {
|
|
544
|
+
for (const [relative, body] of templateFiles) {
|
|
545
|
+
mkdirSync(path.join(repoRoot, path.dirname(relative)), { recursive: true });
|
|
546
|
+
writeFileSync(path.join(repoRoot, relative), body, "utf8");
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
const trackedClean = makeEmptyFixture("package-parity-template-tracked");
|
|
551
|
+
const trackedCleanPair = writeParityPair(trackedClean, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
552
|
+
writeTemplateEntrypoints(trackedCleanPair.repoRoot);
|
|
553
|
+
git(trackedCleanPair.repoRoot, ["init", "-q"]);
|
|
554
|
+
git(trackedCleanPair.repoRoot, ["config", "user.email", "fixture@example.test"]);
|
|
555
|
+
git(trackedCleanPair.repoRoot, ["config", "user.name", "Fixture"]);
|
|
556
|
+
git(trackedCleanPair.repoRoot, ["add", "-A"]);
|
|
557
|
+
git(trackedCleanPair.repoRoot, ["add", "-f", "surfaces/workspace-template/repo-agent-entrypoints/.claude/settings.json"]);
|
|
558
|
+
git(trackedCleanPair.repoRoot, ["commit", "-qm", "tracked templates"]);
|
|
559
|
+
runScriptArgs(
|
|
560
|
+
"package parity passes when every workspace-template entrypoint is tracked",
|
|
561
|
+
"check-package-parity.ts",
|
|
562
|
+
["--repo-root", trackedCleanPair.repoRoot, "--skill-root", trackedCleanPair.parityScriptRoot],
|
|
563
|
+
0,
|
|
564
|
+
);
|
|
565
|
+
|
|
566
|
+
const untrackedSettings = makeEmptyFixture("package-parity-template-untracked");
|
|
567
|
+
const untrackedPair = writeParityPair(untrackedSettings, { rootVersion: "0.0.1", skillVersion: "0.0.1" });
|
|
568
|
+
writeTemplateEntrypoints(untrackedPair.repoRoot);
|
|
569
|
+
git(untrackedPair.repoRoot, ["init", "-q"]);
|
|
570
|
+
git(untrackedPair.repoRoot, ["config", "user.email", "fixture@example.test"]);
|
|
571
|
+
git(untrackedPair.repoRoot, ["config", "user.name", "Fixture"]);
|
|
572
|
+
git(untrackedPair.repoRoot, [
|
|
573
|
+
"add",
|
|
574
|
+
"-f",
|
|
575
|
+
"package.json",
|
|
576
|
+
"package-lock.json",
|
|
577
|
+
".nvmrc",
|
|
578
|
+
".node-version",
|
|
579
|
+
"skill",
|
|
580
|
+
"surfaces/workspace-template/repo-agent-entrypoints/AGENTS.md",
|
|
581
|
+
"surfaces/workspace-template/repo-agent-entrypoints/CLAUDE.md",
|
|
582
|
+
"surfaces/workspace-template/repo-agent-entrypoints/.cursor/rules/agents.mdc",
|
|
583
|
+
]);
|
|
584
|
+
git(untrackedPair.repoRoot, ["commit", "-qm", "missing claude settings"]);
|
|
585
|
+
runScriptArgs(
|
|
586
|
+
"package parity names a workspace-template entrypoint that is on disk but not tracked",
|
|
587
|
+
"check-package-parity.ts",
|
|
588
|
+
["--repo-root", untrackedPair.repoRoot, "--skill-root", untrackedPair.parityScriptRoot],
|
|
589
|
+
1,
|
|
590
|
+
"package_parity.template_untracked",
|
|
591
|
+
);
|
|
592
|
+
|
|
593
|
+
// --- audit-skill-links ---
|
|
594
|
+
const wireLinkRoot = (root: string): void => {
|
|
595
|
+
mkdirSync(path.join(root, "knowledge"), { recursive: true });
|
|
596
|
+
mkdirSync(path.join(root, "examples", "workspace", "business"), { recursive: true });
|
|
597
|
+
writeFileSync(
|
|
598
|
+
path.join(root, "knowledge", "guide.md"),
|
|
599
|
+
"See [the template](../examples/workspace/business/artifact.md) for the artifact contract.\n",
|
|
600
|
+
"utf8",
|
|
601
|
+
);
|
|
602
|
+
writeFileSync(
|
|
603
|
+
path.join(root, "examples", "workspace", "business", "artifact.md"),
|
|
604
|
+
"# Artifact\nRouted from references/guide.md — keep both sides linked.\n",
|
|
605
|
+
"utf8",
|
|
606
|
+
);
|
|
607
|
+
};
|
|
608
|
+
|
|
609
|
+
const linksClean = makeEmptyFixture("skill-links-clean");
|
|
610
|
+
wireLinkRoot(linksClean);
|
|
611
|
+
runScriptArgs("link audit passes on a wired reference/template pair", "audit-skill-links.ts", ["--skill-root", linksClean], 0);
|
|
612
|
+
|
|
613
|
+
const linksBroken = makeEmptyFixture("skill-links-broken");
|
|
614
|
+
wireLinkRoot(linksBroken);
|
|
615
|
+
writeFileSync(
|
|
616
|
+
path.join(linksBroken, "knowledge", "guide.md"),
|
|
617
|
+
"See [the template](../examples/workspace/business/missing.md); artifact.md still routes.\n",
|
|
618
|
+
"utf8",
|
|
619
|
+
);
|
|
620
|
+
runScriptArgs("link audit fails on a broken local link", "audit-skill-links.ts", ["--skill-root", linksBroken], 1, "skill_links.broken_local_link");
|
|
621
|
+
|
|
622
|
+
const linksOrphan = makeEmptyFixture("skill-links-orphan");
|
|
623
|
+
wireLinkRoot(linksOrphan);
|
|
624
|
+
writeFileSync(path.join(linksOrphan, "knowledge", "unrouted.md"), "No other file mentions this reference, so no agent can load it.\n", "utf8");
|
|
625
|
+
runScriptArgs("link audit fails on an orphaned reference file", "audit-skill-links.ts", ["--skill-root", linksOrphan], 1, "skill_links.orphan_file");
|
|
626
|
+
|
|
627
|
+
// Regression (verification pass): a basename that is a substring of another
|
|
628
|
+
// mentioned file's basename ("lane.md" inside "sub-lane.md") is not a mention.
|
|
629
|
+
const linksSubstringOrphan = makeEmptyFixture("skill-links-substring-orphan");
|
|
630
|
+
wireLinkRoot(linksSubstringOrphan);
|
|
631
|
+
writeFileSync(path.join(linksSubstringOrphan, "knowledge", "lane.md"), "Nothing references this file by its own name.\n", "utf8");
|
|
632
|
+
writeFileSync(
|
|
633
|
+
path.join(linksSubstringOrphan, "knowledge", "guide.md"),
|
|
634
|
+
"See [the template](../examples/workspace/business/artifact.md); also read sub-lane.md notes.\n",
|
|
635
|
+
"utf8",
|
|
636
|
+
);
|
|
637
|
+
writeFileSync(path.join(linksSubstringOrphan, "knowledge", "sub-lane.md"), "Routed from references/guide.md.\n", "utf8");
|
|
638
|
+
runScriptArgs("link audit flags a basename-substring orphan", "audit-skill-links.ts", ["--skill-root", linksSubstringOrphan], 1, "skill_links.orphan_file");
|
|
639
|
+
|
|
640
|
+
const linksDuplicate = makeEmptyFixture("skill-links-duplicate");
|
|
641
|
+
wireLinkRoot(linksDuplicate);
|
|
642
|
+
const duplicateBody =
|
|
643
|
+
"# Duplicate body\nThis exact content is shipped twice under business/, which will drift apart silently over time once one copy is edited and the other is forgotten.\n";
|
|
644
|
+
writeFileSync(path.join(linksDuplicate, "examples", "workspace", "business", "copy-one.md"), duplicateBody, "utf8");
|
|
645
|
+
writeFileSync(path.join(linksDuplicate, "examples", "workspace", "business", "copy-two.md"), duplicateBody, "utf8");
|
|
646
|
+
writeFileSync(
|
|
647
|
+
path.join(linksDuplicate, "knowledge", "guide.md"),
|
|
648
|
+
"See [the template](../examples/workspace/business/artifact.md), plus copy-one.md and copy-two.md.\n",
|
|
649
|
+
"utf8",
|
|
650
|
+
);
|
|
651
|
+
runScriptArgs(
|
|
652
|
+
"link audit fails on byte-identical template duplicates",
|
|
653
|
+
"audit-skill-links.ts",
|
|
654
|
+
["--skill-root", linksDuplicate],
|
|
655
|
+
1,
|
|
656
|
+
"skill_links.duplicate_template",
|
|
657
|
+
);
|
|
658
|
+
|
|
659
|
+
// --- check-template-safety ---
|
|
660
|
+
const templateSafetyClean = makeEmptyFixture("template-safety-clean");
|
|
661
|
+
writeFileSync(path.join(templateSafetyClean, "component.tsx"), 'import { View } from "react-native";\nexport const Ok = View;\n', "utf8");
|
|
662
|
+
runFixture("template safety passes on native-animation-only code", templateSafetyClean, "check-template-safety.ts", 0);
|
|
663
|
+
|
|
664
|
+
const templateSafetyStaleMobai = makeEmptyFixture("template-safety-stale-mobai");
|
|
665
|
+
writeFileSync(path.join(templateSafetyStaleMobai, "TESTING.md"), "Call mcp__mobai__get_screenshot directly.\n", "utf8");
|
|
666
|
+
runFixture(
|
|
667
|
+
"template safety rejects hardcoded MobAI MCP identifiers",
|
|
668
|
+
templateSafetyStaleMobai,
|
|
669
|
+
"check-template-safety.ts",
|
|
670
|
+
1,
|
|
671
|
+
"template_safety.stale_mobai_mcp_name",
|
|
672
|
+
);
|
|
673
|
+
|
|
674
|
+
const templateSafetyBad = makeEmptyFixture("template-safety-framer-motion");
|
|
675
|
+
writeFileSync(path.join(templateSafetyBad, "component.tsx"), 'import { motion } from "framer-motion";\nexport const Bad = motion.div;\n', "utf8");
|
|
676
|
+
runFixture(
|
|
677
|
+
"template safety fails on a framer-motion import in template code",
|
|
678
|
+
templateSafetyBad,
|
|
679
|
+
"check-template-safety.ts",
|
|
680
|
+
1,
|
|
681
|
+
"template_safety.framer_motion_in_template",
|
|
682
|
+
);
|
|
683
|
+
|
|
684
|
+
// The landing section library is a web-only surface where motion/react is
|
|
685
|
+
// mandated (knowledge/design/landing-motion-craft.md); the same import outside
|
|
686
|
+
// landing/ still fails above.
|
|
687
|
+
const templateSafetyLanding = makeEmptyFixture("template-safety-landing-pack");
|
|
688
|
+
mkdirSync(path.join(templateSafetyLanding, "growth", "landing", "sections"), { recursive: true });
|
|
689
|
+
writeFileSync(
|
|
690
|
+
path.join(templateSafetyLanding, "growth", "landing", "sections", "Hero.tsx"),
|
|
691
|
+
'import { motion } from "motion/react";\nexport const Hero = motion.section;\n',
|
|
692
|
+
"utf8",
|
|
693
|
+
);
|
|
694
|
+
runFixture("template safety allows motion/react inside the landing web pack", templateSafetyLanding, "check-template-safety.ts", 0);
|
|
695
|
+
|
|
696
|
+
// Regression (verification pass): the exception is anchored to the TOP-LEVEL
|
|
697
|
+
// landing/ pack; a nested directory named landing stays covered by the gate.
|
|
698
|
+
const templateSafetyNestedLanding = makeEmptyFixture("template-safety-nested-landing");
|
|
699
|
+
mkdirSync(path.join(templateSafetyNestedLanding, "mobile", "landing"), { recursive: true });
|
|
700
|
+
writeFileSync(
|
|
701
|
+
path.join(templateSafetyNestedLanding, "mobile", "landing", "Screen.tsx"),
|
|
702
|
+
'import { motion } from "framer-motion";\nexport const Screen = motion.div;\n',
|
|
703
|
+
"utf8",
|
|
704
|
+
);
|
|
705
|
+
runFixture(
|
|
706
|
+
"template safety still fails motion imports in nested landing dirs",
|
|
707
|
+
templateSafetyNestedLanding,
|
|
708
|
+
"check-template-safety.ts",
|
|
709
|
+
1,
|
|
710
|
+
"template_safety.framer_motion_in_template",
|
|
711
|
+
);
|
|
712
|
+
|
|
713
|
+
// --- check-founder-copy ---
|
|
714
|
+
// The gate had zero fixture coverage: nothing proved it could fail.
|
|
715
|
+
runScriptArgs(
|
|
716
|
+
"founder copy passes on the shipped skill and templates",
|
|
717
|
+
"check-founder-copy.ts",
|
|
718
|
+
["--root", path.join(skillRoot, "examples", "workspace", "business"), "--skill-root", skillRoot],
|
|
719
|
+
0,
|
|
720
|
+
);
|
|
721
|
+
|
|
722
|
+
const founderCopyRawId = makeEmptyFixture("founder-copy-raw-identifier");
|
|
723
|
+
writeFileSync(
|
|
724
|
+
path.join(founderCopyRawId, "design/design-room.html"),
|
|
725
|
+
"<html><body><h2>Progress</h2><p>paid_tool_routing | not_started</p></body></html>\n",
|
|
726
|
+
"utf8",
|
|
727
|
+
);
|
|
728
|
+
runScriptArgs(
|
|
729
|
+
"raw snake_case on a founder surface fails founder copy",
|
|
730
|
+
"check-founder-copy.ts",
|
|
731
|
+
["--root", founderCopyRawId, "--skill-root", skillRoot],
|
|
732
|
+
1,
|
|
733
|
+
"founder_copy.raw_identifier",
|
|
734
|
+
);
|
|
735
|
+
|
|
736
|
+
// Rule 3's general banned-vocabulary scan against founder-visible prose had
|
|
737
|
+
// no fixture of its own -- only the narrower rule-4b technique-naming
|
|
738
|
+
// special case exercised the dictionary. This is the direct case: a banned
|
|
739
|
+
// term in ordinary prose, not a technique name.
|
|
740
|
+
const founderCopyBannedVocabulary = makeEmptyFixture("founder-copy-banned-vocabulary");
|
|
741
|
+
writeFileSync(
|
|
742
|
+
path.join(founderCopyBannedVocabulary, "design/design-room.html"),
|
|
743
|
+
"<html><body><h2>Progress</h2><p>Your onboarding lane is almost done.</p></body></html>\n",
|
|
744
|
+
"utf8",
|
|
745
|
+
);
|
|
746
|
+
runScriptArgs(
|
|
747
|
+
"banned internal vocabulary in founder-visible prose fails founder copy",
|
|
748
|
+
"check-founder-copy.ts",
|
|
749
|
+
["--root", founderCopyBannedVocabulary, "--skill-root", skillRoot],
|
|
750
|
+
1,
|
|
751
|
+
"founder_copy.internal_vocabulary",
|
|
752
|
+
);
|
|
753
|
+
|
|
754
|
+
// tooling/lib/artifact-pages.ts's renderSourceArtifactPage base64-embeds real Markdown in a
|
|
755
|
+
// <script> and decodes it client-side into a target element by id -- a raw <script> body is
|
|
756
|
+
// dropped from the scan as code, not prose, so without decoding it here too, that payload
|
|
757
|
+
// could carry any internal vocabulary straight past this gate. These two fixtures prove the
|
|
758
|
+
// decode step actually runs: a payload landing outside the sanctioned <details> disclosure
|
|
759
|
+
// must still fail, and the identical payload landing inside it must still pass.
|
|
760
|
+
const decodedPayload = Buffer.from("Your onboarding lane is almost done.", "utf8").toString("base64");
|
|
761
|
+
const founderCopyDecodedScriptLeak = makeEmptyFixture("founder-copy-decoded-script-leak");
|
|
762
|
+
writeFileSync(
|
|
763
|
+
path.join(founderCopyDecodedScriptLeak, "product/onboarding.html"),
|
|
764
|
+
[
|
|
765
|
+
"<html><body>",
|
|
766
|
+
'<section><pre id="source"></pre></section>',
|
|
767
|
+
"<script>",
|
|
768
|
+
`document.getElementById("source").textContent = atob("${decodedPayload}");`,
|
|
769
|
+
"</script>",
|
|
770
|
+
"</body></html>",
|
|
771
|
+
"",
|
|
772
|
+
].join("\n"),
|
|
773
|
+
"utf8",
|
|
774
|
+
);
|
|
775
|
+
runScriptArgs(
|
|
776
|
+
"a base64-decoded script payload outside the technical-details disclosure fails founder copy",
|
|
777
|
+
"check-founder-copy.ts",
|
|
778
|
+
["--root", founderCopyDecodedScriptLeak, "--skill-root", skillRoot],
|
|
779
|
+
1,
|
|
780
|
+
"founder_copy.internal_vocabulary",
|
|
781
|
+
);
|
|
782
|
+
|
|
783
|
+
const founderCopyDecodedScriptInDetails = makeEmptyFixture("founder-copy-decoded-script-in-details");
|
|
784
|
+
writeFileSync(
|
|
785
|
+
path.join(founderCopyDecodedScriptInDetails, "product/onboarding.html"),
|
|
786
|
+
[
|
|
787
|
+
"<html><body>",
|
|
788
|
+
'<details><summary>Technical details</summary><pre id="source"></pre></details>',
|
|
789
|
+
"<script>",
|
|
790
|
+
`document.getElementById("source").textContent = atob("${decodedPayload}");`,
|
|
791
|
+
"</script>",
|
|
792
|
+
"</body></html>",
|
|
793
|
+
"",
|
|
794
|
+
].join("\n"),
|
|
795
|
+
"utf8",
|
|
796
|
+
);
|
|
797
|
+
runScriptArgs(
|
|
798
|
+
"the identical decoded payload passes founder copy once its target sits inside the technical-details disclosure",
|
|
799
|
+
"check-founder-copy.ts",
|
|
800
|
+
["--root", founderCopyDecodedScriptInDetails, "--skill-root", skillRoot],
|
|
801
|
+
0,
|
|
802
|
+
);
|
|
803
|
+
|
|
804
|
+
// Empty narrative after orientation fails the current founder-copy contract.
|
|
805
|
+
const founderCopyStaleNarrative = makeEmptyFixture("founder-copy-stale-narrative");
|
|
806
|
+
writeFileSync(
|
|
807
|
+
path.join(founderCopyStaleNarrative, "state/business-state.json"),
|
|
808
|
+
JSON.stringify({ narrative: { sinceLastTime: "", rightNow: "", yourCall: "" }, project: { phase: "phase_1" } }),
|
|
809
|
+
"utf8",
|
|
810
|
+
);
|
|
811
|
+
runScriptArgs(
|
|
812
|
+
"empty narrative past orient fails founder copy",
|
|
813
|
+
"check-founder-copy.ts",
|
|
814
|
+
["--root", founderCopyStaleNarrative, "--skill-root", skillRoot],
|
|
815
|
+
1,
|
|
816
|
+
"founder_copy.narrative_stale.sinceLastTime",
|
|
817
|
+
);
|
|
818
|
+
|
|
819
|
+
const founderCopyTemplateName = makeEmptyFixture("founder-copy-template-name");
|
|
820
|
+
writeFileSync(
|
|
821
|
+
path.join(founderCopyTemplateName, "state/business-state.json"),
|
|
822
|
+
JSON.stringify({
|
|
823
|
+
narrative: {
|
|
824
|
+
sinceLastTime: "The market review is complete.",
|
|
825
|
+
rightNow: "I am turning the findings into the product decision.",
|
|
826
|
+
yourCall: "No action is needed from you right now.",
|
|
827
|
+
},
|
|
828
|
+
project: { name: "App Name", phase: "phase_1" },
|
|
829
|
+
}),
|
|
830
|
+
"utf8",
|
|
831
|
+
);
|
|
832
|
+
runScriptArgs(
|
|
833
|
+
"template project name after setup fails founder copy",
|
|
834
|
+
"check-founder-copy.ts",
|
|
835
|
+
["--root", founderCopyTemplateName, "--skill-root", skillRoot],
|
|
836
|
+
1,
|
|
837
|
+
"founder_copy.template_project_name",
|
|
838
|
+
);
|
|
839
|
+
|
|
840
|
+
const founderCopyRepeatedUpdate = makeEmptyFixture("founder-copy-repeated-update");
|
|
841
|
+
writeFileSync(
|
|
842
|
+
path.join(founderCopyRepeatedUpdate, "state/business-state.json"),
|
|
843
|
+
JSON.stringify({
|
|
844
|
+
narrative: {
|
|
845
|
+
sinceLastTime: "The first device flow now works from start to finish.",
|
|
846
|
+
rightNow: "The first device flow now works from start to finish.",
|
|
847
|
+
yourCall: "No action is needed from you right now.",
|
|
848
|
+
},
|
|
849
|
+
project: { name: "Shelf", phase: "phase_5b" },
|
|
850
|
+
}),
|
|
851
|
+
"utf8",
|
|
852
|
+
);
|
|
853
|
+
runScriptArgs(
|
|
854
|
+
"repeated milestone narration fails founder copy",
|
|
855
|
+
"check-founder-copy.ts",
|
|
856
|
+
["--root", founderCopyRepeatedUpdate, "--skill-root", skillRoot],
|
|
857
|
+
1,
|
|
858
|
+
"founder_copy.repeated_update",
|
|
859
|
+
);
|
|
860
|
+
|
|
861
|
+
const founderCopyConnectedBlocked = makeEmptyFixture("founder-copy-connected-blocked");
|
|
862
|
+
writeFileSync(
|
|
863
|
+
path.join(founderCopyConnectedBlocked, "state/business-state.json"),
|
|
864
|
+
JSON.stringify({ project: { name: "Shelf", phase: "phase_0_orient" }, providers: { posthog: { connectionStatus: "connected", accessRoute: "blocked" } } }),
|
|
865
|
+
"utf8",
|
|
866
|
+
);
|
|
867
|
+
runScriptArgs(
|
|
868
|
+
"connected service with blocked route fails founder copy",
|
|
869
|
+
"check-founder-copy.ts",
|
|
870
|
+
["--root", founderCopyConnectedBlocked, "--skill-root", skillRoot],
|
|
871
|
+
1,
|
|
872
|
+
"founder_copy.connected_tool_contradiction",
|
|
873
|
+
);
|
|
874
|
+
|
|
875
|
+
const noCommitCheckpoint = makeEmptyFixture("source-checkpoint-no-commit");
|
|
876
|
+
writeFileSync(
|
|
877
|
+
path.join(noCommitCheckpoint, "state/business-state.json"),
|
|
878
|
+
JSON.stringify({ project: { phase: "phase_5b" }, lanes: { engineering: { status: "running" } } }),
|
|
879
|
+
"utf8",
|
|
880
|
+
);
|
|
881
|
+
git(noCommitCheckpoint, ["init"]);
|
|
882
|
+
runScriptArgs(
|
|
883
|
+
"build work without a first commit fails source checkpoint",
|
|
884
|
+
"check-source-checkpoint.ts",
|
|
885
|
+
["--root", noCommitCheckpoint],
|
|
886
|
+
1,
|
|
887
|
+
"source_checkpoint.no_commit",
|
|
888
|
+
);
|
|
889
|
+
|
|
890
|
+
const untrackedCheckpoint = makeEmptyFixture("source-checkpoint-untracked-source");
|
|
891
|
+
writeFileSync(
|
|
892
|
+
path.join(untrackedCheckpoint, "state/business-state.json"),
|
|
893
|
+
JSON.stringify({ project: { phase: "phase_5b" }, lanes: { engineering: { status: "running" } } }),
|
|
894
|
+
"utf8",
|
|
895
|
+
);
|
|
896
|
+
writeFileSync(path.join(untrackedCheckpoint, "README.md"), "# Fixture\n", "utf8");
|
|
897
|
+
git(untrackedCheckpoint, ["init"]);
|
|
898
|
+
git(untrackedCheckpoint, ["config", "user.email", "fixture@example.test"]);
|
|
899
|
+
git(untrackedCheckpoint, ["config", "user.name", "Fixture"]);
|
|
900
|
+
git(untrackedCheckpoint, ["add", "state/business-state.json", "README.md"]);
|
|
901
|
+
git(untrackedCheckpoint, ["commit", "-m", "initial checkpoint"]);
|
|
902
|
+
mkdirSync(path.join(untrackedCheckpoint, "lib"), { recursive: true });
|
|
903
|
+
writeFileSync(path.join(untrackedCheckpoint, "lib/app.dart"), "void main() {}\n", "utf8");
|
|
904
|
+
runScriptArgs(
|
|
905
|
+
"untracked app source during build work fails source checkpoint",
|
|
906
|
+
"check-source-checkpoint.ts",
|
|
907
|
+
["--root", untrackedCheckpoint],
|
|
908
|
+
1,
|
|
909
|
+
"source_checkpoint.untracked_source",
|
|
910
|
+
);
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* Rule 4 — the experience-card naming decision. The twelve technique names are
|
|
914
|
+
* deliberately NOT translated for a founder, which is a decision that leaves no trace in
|
|
915
|
+
* the tree and so rots faster than a change would. These four fixtures are the trace.
|
|
916
|
+
*
|
|
917
|
+
* Each builds a fake skill root: the real dictionary (so rules 1–3 stay
|
|
918
|
+
* quiet) plus a card-stub directory whose tiers and names the fixture controls.
|
|
919
|
+
*/
|
|
920
|
+
function makeCardSkillRoot(name: string, stubs: { file: string; heading: string; tier: string }[], dictionary?: string): string {
|
|
921
|
+
const root = makeEmptyFixture(name);
|
|
922
|
+
const skill = path.join(root, "skill");
|
|
923
|
+
mkdirSync(path.join(skill, "tooling", "lib"), { recursive: true });
|
|
924
|
+
mkdirSync(path.join(skill, "knowledge", "experience", "experience-cards"), { recursive: true });
|
|
925
|
+
writeFileSync(
|
|
926
|
+
path.join(skill, "tooling", "lib", "founder-copy.ts"),
|
|
927
|
+
dictionary ?? readFileSync(path.join(skillRoot, "tooling", "lib", "founder-copy.ts"), "utf8"),
|
|
928
|
+
"utf8",
|
|
929
|
+
);
|
|
930
|
+
for (const stub of stubs) {
|
|
931
|
+
writeFileSync(
|
|
932
|
+
path.join(skill, "knowledge", "experience", "experience-cards", stub.file),
|
|
933
|
+
[`# ${stub.heading} Card`, "", `**Risk tier.** ${stub.tier} — canonical in the routing table.`, ""].join("\n"),
|
|
934
|
+
"utf8",
|
|
935
|
+
);
|
|
936
|
+
}
|
|
937
|
+
return root;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
/** The shipped HIGH set. A fixture that keeps both of these leaves rule 4a quiet. */
|
|
941
|
+
const attestedStubs = [
|
|
942
|
+
{ file: "variable-reward-card.md", heading: "Variable Reward", tier: "HIGH" },
|
|
943
|
+
{ file: "streak-and-loss-aversion-card.md", heading: "Streak and Loss Aversion", tier: "HIGH" },
|
|
944
|
+
];
|
|
945
|
+
|
|
946
|
+
runScriptArgs(
|
|
947
|
+
"card stubs matching the attested HIGH set pass founder copy",
|
|
948
|
+
"check-founder-copy.ts",
|
|
949
|
+
["--root", makeEmptyFixture("founder-copy-cards-clean"), "--skill-root", path.join(makeCardSkillRoot("cards-clean", attestedStubs), "skill")],
|
|
950
|
+
0,
|
|
951
|
+
);
|
|
952
|
+
|
|
953
|
+
// 4a — demoting a HIGH card in its stub must not silently shrink what the founder
|
|
954
|
+
// attests to by name. This is the rule that makes the stub tiers load-bearing.
|
|
955
|
+
const cardsDemoted = makeCardSkillRoot("cards-high-demoted", [
|
|
956
|
+
{ file: "variable-reward-card.md", heading: "Variable Reward", tier: "MEDIUM" },
|
|
957
|
+
{ file: "streak-and-loss-aversion-card.md", heading: "Streak and Loss Aversion", tier: "HIGH" },
|
|
958
|
+
]);
|
|
959
|
+
runScriptArgs(
|
|
960
|
+
"a HIGH card demoted in its stub fails the attested-technique tie",
|
|
961
|
+
"check-founder-copy.ts",
|
|
962
|
+
["--root", makeEmptyFixture("founder-copy-cards-demoted"), "--skill-root", path.join(cardsDemoted, "skill")],
|
|
963
|
+
1,
|
|
964
|
+
"founder_copy.attested_technique_drift",
|
|
965
|
+
);
|
|
966
|
+
|
|
967
|
+
// 4a, other direction — promoting a card to HIGH without adding it to attestedTechniques
|
|
968
|
+
// would leave a founder signing off on a mechanic the copy layer never named.
|
|
969
|
+
const cardsPromoted = makeCardSkillRoot("cards-extra-high", [...attestedStubs, { file: "peak-end-card.md", heading: "Peak-End", tier: "HIGH" }]);
|
|
970
|
+
runScriptArgs(
|
|
971
|
+
"a card promoted to HIGH without founder copy fails the attested-technique tie",
|
|
972
|
+
"check-founder-copy.ts",
|
|
973
|
+
["--root", makeEmptyFixture("founder-copy-cards-promoted"), "--skill-root", path.join(cardsPromoted, "skill")],
|
|
974
|
+
1,
|
|
975
|
+
"founder_copy.attested_technique_drift",
|
|
976
|
+
);
|
|
977
|
+
|
|
978
|
+
// 4b — banning a technique name is how the decision gets reversed by accident: the
|
|
979
|
+
// banned list's contract is "say this instead", which is exactly the euphemism these
|
|
980
|
+
// names must not acquire. "Proof" is already banned vocabulary, so a technique that
|
|
981
|
+
// takes that name must fail rather than quietly inherit a replacement.
|
|
982
|
+
const cardsBannedName = makeCardSkillRoot("cards-banned-name", [...attestedStubs, { file: "proof-card.md", heading: "Proof", tier: "MEDIUM" }]);
|
|
983
|
+
runScriptArgs(
|
|
984
|
+
"a technique named as banned vocabulary fails founder copy",
|
|
985
|
+
"check-founder-copy.ts",
|
|
986
|
+
["--root", makeEmptyFixture("founder-copy-cards-banned"), "--skill-root", path.join(cardsBannedName, "skill")],
|
|
987
|
+
1,
|
|
988
|
+
"founder_copy.technique_alias_banned",
|
|
989
|
+
);
|
|
990
|
+
|
|
991
|
+
// 4c — the umbrella phrase is what a founder gets instead of twelve new words. Declaring
|
|
992
|
+
// it as a constant proves nothing; it has to survive in the lane blurb they read.
|
|
993
|
+
const cardsNoUmbrella = makeCardSkillRoot(
|
|
994
|
+
"cards-umbrella-reworded",
|
|
995
|
+
attestedStubs,
|
|
996
|
+
readFileSync(path.join(skillRoot, "tooling", "lib", "founder-copy.ts"), "utf8").replace(
|
|
997
|
+
"The moments that make the app satisfying to use, and the limits we hold ourselves to.",
|
|
998
|
+
"How we handle engagement mechanics and their limits.",
|
|
999
|
+
),
|
|
1000
|
+
);
|
|
1001
|
+
runScriptArgs(
|
|
1002
|
+
"an emotional-design blurb that drops the umbrella phrase fails founder copy",
|
|
1003
|
+
"check-founder-copy.ts",
|
|
1004
|
+
["--root", makeEmptyFixture("founder-copy-cards-umbrella"), "--skill-root", path.join(cardsNoUmbrella, "skill")],
|
|
1005
|
+
1,
|
|
1006
|
+
"founder_copy.umbrella_unreachable",
|
|
1007
|
+
);
|
|
1008
|
+
|
|
1009
|
+
// --- check-motion-contract ---
|
|
1010
|
+
// The real contract files are copied in rather than invented, so each failing
|
|
1011
|
+
// fixture is the shipped skill plus exactly one seeded drift — if the shipped
|
|
1012
|
+
// files and the parser ever stop agreeing, the passing fixture goes red too.
|
|
1013
|
+
const motionContractFiles = [
|
|
1014
|
+
"knowledge/design/motion-craft-benchmarks.md",
|
|
1015
|
+
"knowledge/design/premium-mobile-craft.md",
|
|
1016
|
+
"examples/workspace/business/design/system/tokens.json",
|
|
1017
|
+
"examples/workspace/business/design/system/DesignTokens.swift",
|
|
1018
|
+
"examples/workspace/business/design/system/PremiumCraft.swift",
|
|
1019
|
+
"knowledge/experience/experience-cards/peak-end-card.md",
|
|
1020
|
+
"knowledge/experience/experience-cards/mastery-and-status-card.md",
|
|
1021
|
+
"knowledge/experience/experience-cards/variable-reward-card.md",
|
|
1022
|
+
"examples/workspace/business/DESIGN.md",
|
|
1023
|
+
"examples/workspace/business/state/business-state.json",
|
|
1024
|
+
"examples/workspace/business/product/experience/emotional-design/EMOTIONAL_DESIGN.md",
|
|
1025
|
+
"examples/workspace/business/design/motion-catalog/TokenSpring.swift",
|
|
1026
|
+
"examples/workspace/business/design/motion-catalog/motion-tokens.ts",
|
|
1027
|
+
];
|
|
1028
|
+
const writeMotionContractRoot = (name: string, mutate?: (rel: string, text: string) => string): string => {
|
|
1029
|
+
const root = makeEmptyFixture(name);
|
|
1030
|
+
for (const rel of motionContractFiles) {
|
|
1031
|
+
const target = path.join(root, rel);
|
|
1032
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
1033
|
+
const source = readFileSync(path.join(skillRoot, rel), "utf8");
|
|
1034
|
+
// These mutations address table cells, not the source formatter's column padding.
|
|
1035
|
+
const text =
|
|
1036
|
+
rel === "examples/workspace/business/DESIGN.md"
|
|
1037
|
+
? source.replace(/^\|.*\|$/gm, (row) =>
|
|
1038
|
+
row
|
|
1039
|
+
.split(/(?<!\\)\|/)
|
|
1040
|
+
.map((cell) => cell.trim().replace(/^(:?)-{3,}(:?)$/, "$1---$2"))
|
|
1041
|
+
.join(" | ")
|
|
1042
|
+
.trim(),
|
|
1043
|
+
)
|
|
1044
|
+
: source;
|
|
1045
|
+
writeFileSync(target, mutate ? mutate(rel, text) : text, "utf8");
|
|
1046
|
+
}
|
|
1047
|
+
return root;
|
|
1048
|
+
};
|
|
1049
|
+
|
|
1050
|
+
runScriptArgs("motion contract passes on the shipped skill", "check-motion-contract.ts", ["--skill-root", skillRoot], 0);
|
|
1051
|
+
|
|
1052
|
+
const motionStarterHeaderMissing = writeMotionContractRoot("motion-contract-starter-live-surface-header-missing", (rel, text) => {
|
|
1053
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1054
|
+
assert(text.includes("| Surface | Real state or relationship | Recipe |"), "live-surface header fixture must match the current template");
|
|
1055
|
+
return text.replace(
|
|
1056
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1057
|
+
"| Surface omitted | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1060
|
+
return text;
|
|
1061
|
+
});
|
|
1062
|
+
runScriptArgs(
|
|
1063
|
+
"motion contract validates the packaged starter live-effect table structure",
|
|
1064
|
+
"check-motion-contract.ts",
|
|
1065
|
+
["--skill-root", motionStarterHeaderMissing],
|
|
1066
|
+
1,
|
|
1067
|
+
"motion_contract.live_surface.template_incomplete",
|
|
1068
|
+
);
|
|
1069
|
+
|
|
1070
|
+
const motionLiveSurfaceMissing = writeMotionContractRoot("motion-contract-live-surface-missing", (rel, text) =>
|
|
1071
|
+
rel.endsWith("motion-craft-benchmarks.md") ? text.replace("### R18 — Semantic thinking orb", "### Removed semantic thinking orb") : text,
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
const motionLiveWorkspaceIncomplete = writeMotionContractRoot("motion-contract-live-workspace-incomplete", (rel, text) => {
|
|
1075
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6b");
|
|
1076
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1077
|
+
return text.replace(
|
|
1078
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1079
|
+
"| AI status | Processing state | R18 | Active orb | Not defined | Static status text | Static status text |",
|
|
1080
|
+
);
|
|
1081
|
+
}
|
|
1082
|
+
return text;
|
|
1083
|
+
});
|
|
1084
|
+
runScriptArgs(
|
|
1085
|
+
"motion contract validates the launched active workspace live-effect rows",
|
|
1086
|
+
"check-motion-contract.ts",
|
|
1087
|
+
["--skill-root", motionLiveWorkspaceIncomplete, "--workspace-root", path.join(motionLiveWorkspaceIncomplete, "examples/workspace/business")],
|
|
1088
|
+
1,
|
|
1089
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1090
|
+
);
|
|
1091
|
+
|
|
1092
|
+
const motionLiveWorkspacePartialRow = writeMotionContractRoot("motion-contract-live-workspace-partial-row", (rel, text) => {
|
|
1093
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1094
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1095
|
+
return text.replace(
|
|
1096
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1097
|
+
"| AI status | Processing state | R18 | Active orb | Processing ends | Static status text | Static status text |\n| Relationship | Connected state |",
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
return text;
|
|
1101
|
+
});
|
|
1102
|
+
runScriptArgs(
|
|
1103
|
+
"motion contract rejects any truncated live-effect row in a launched workspace",
|
|
1104
|
+
"check-motion-contract.ts",
|
|
1105
|
+
["--skill-root", motionLiveWorkspacePartialRow, "--workspace-root", path.join(motionLiveWorkspacePartialRow, "examples/workspace/business")],
|
|
1106
|
+
1,
|
|
1107
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1108
|
+
);
|
|
1109
|
+
const motionLiveWorkspaceDiscontiguousTable = writeMotionContractRoot("motion-contract-live-workspace-discontiguous-table", (rel, text) => {
|
|
1110
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1111
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1112
|
+
return text.replace(
|
|
1113
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1114
|
+
"This prose ends the Markdown table.\n| AI status | Processing state | R18 | Active orb | Processing ends | Static status text | Static status text |",
|
|
1115
|
+
);
|
|
1116
|
+
}
|
|
1117
|
+
return text;
|
|
1118
|
+
});
|
|
1119
|
+
runScriptArgs(
|
|
1120
|
+
"motion contract does not join discontiguous pipe lines into a live-effect table",
|
|
1121
|
+
"check-motion-contract.ts",
|
|
1122
|
+
[
|
|
1123
|
+
"--skill-root",
|
|
1124
|
+
motionLiveWorkspaceDiscontiguousTable,
|
|
1125
|
+
"--workspace-root",
|
|
1126
|
+
path.join(motionLiveWorkspaceDiscontiguousTable, "examples/workspace/business"),
|
|
1127
|
+
],
|
|
1128
|
+
1,
|
|
1129
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1130
|
+
);
|
|
1131
|
+
for (const [label, open, close] of [
|
|
1132
|
+
["fenced", "```markdown\n", "\n```"],
|
|
1133
|
+
["commented", "<!--\n", "\n-->"],
|
|
1134
|
+
["unterminated-comment", "<!--\n", ""],
|
|
1135
|
+
["script-block", '<script type="text/plain">\n', "\n</script>"],
|
|
1136
|
+
["style-block", "<style>\n", "\n</style>"],
|
|
1137
|
+
] as const) {
|
|
1138
|
+
const hiddenLiveEffectTable = writeMotionContractRoot(`motion-contract-live-workspace-${label}-table`, (rel, text) => {
|
|
1139
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1140
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1141
|
+
const completeTable = [
|
|
1142
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1143
|
+
"| --- | --- | --- | --- | --- | --- | --- |",
|
|
1144
|
+
"| AI status | Processing state | R18 | Active orb and status text | Processing ends | Static status text | Static status text |",
|
|
1145
|
+
].join("\n");
|
|
1146
|
+
return text.replace("### Live-surface effects", `### Live-surface effects\n\n${open}${completeTable}${close}`);
|
|
1147
|
+
}
|
|
1148
|
+
return text;
|
|
1149
|
+
});
|
|
1150
|
+
runScriptArgs(
|
|
1151
|
+
`motion contract ignores a ${label} live-effect table`,
|
|
1152
|
+
"check-motion-contract.ts",
|
|
1153
|
+
["--skill-root", hiddenLiveEffectTable, "--workspace-root", path.join(hiddenLiveEffectTable, "examples/workspace/business")],
|
|
1154
|
+
1,
|
|
1155
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1156
|
+
);
|
|
1157
|
+
}
|
|
1158
|
+
const motionNestedFenceTable = writeMotionContractRoot("motion-contract-live-workspace-nested-fence-table", (rel, text) => {
|
|
1159
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1160
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1161
|
+
const completeTable = [
|
|
1162
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1163
|
+
"| --- | --- | --- | --- | --- | --- | --- |",
|
|
1164
|
+
"| AI status | Processing state | R18 | Active orb and status text | Processing ends | Static status text | Static status text |",
|
|
1165
|
+
].join("\n");
|
|
1166
|
+
const hiddenTable = `\`\`\`\`markdown\n\`\`\`text\n\`\`\`\`text\n${completeTable}\n\`\`\`\n\`\`\`\``;
|
|
1167
|
+
return text.replace("### Live-surface effects", `### Live-surface effects\n\n${hiddenTable}`);
|
|
1168
|
+
}
|
|
1169
|
+
return text;
|
|
1170
|
+
});
|
|
1171
|
+
runScriptArgs(
|
|
1172
|
+
"motion contract honors a longer outer fence and rejects info-suffixed closers",
|
|
1173
|
+
"check-motion-contract.ts",
|
|
1174
|
+
["--skill-root", motionNestedFenceTable, "--workspace-root", path.join(motionNestedFenceTable, "examples/workspace/business")],
|
|
1175
|
+
1,
|
|
1176
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1177
|
+
);
|
|
1178
|
+
const motionIndentedCodeTable = writeMotionContractRoot("motion-contract-live-workspace-indented-code-table", (rel, text) => {
|
|
1179
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1180
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1181
|
+
const hiddenTable = [
|
|
1182
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1183
|
+
"| --- | --- | --- | --- | --- | --- | --- |",
|
|
1184
|
+
"| AI status | Processing state | R18 | Active orb and status text | Processing ends | Static status text | Static status text |",
|
|
1185
|
+
]
|
|
1186
|
+
.map((line) => ` ${line}`)
|
|
1187
|
+
.join("\n");
|
|
1188
|
+
return text.replace("### Live-surface effects", `### Live-surface effects\n\n${hiddenTable}`);
|
|
1189
|
+
}
|
|
1190
|
+
return text;
|
|
1191
|
+
});
|
|
1192
|
+
runScriptArgs(
|
|
1193
|
+
"motion contract ignores an indented-code live-effect table",
|
|
1194
|
+
"check-motion-contract.ts",
|
|
1195
|
+
["--skill-root", motionIndentedCodeTable, "--workspace-root", path.join(motionIndentedCodeTable, "examples/workspace/business")],
|
|
1196
|
+
1,
|
|
1197
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1198
|
+
);
|
|
1199
|
+
const motionLiveWorkspaceUnsupportedRecipe = writeMotionContractRoot("motion-contract-live-workspace-unsupported-recipe", (rel, text) => {
|
|
1200
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1201
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1202
|
+
return text.replace(
|
|
1203
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1204
|
+
"| AI status | Processing state | R19 | Active orb | Processing ends | Static status text | Static status text |",
|
|
1205
|
+
);
|
|
1206
|
+
}
|
|
1207
|
+
return text;
|
|
1208
|
+
});
|
|
1209
|
+
runScriptArgs(
|
|
1210
|
+
"motion contract rejects an unsupported live-effect recipe",
|
|
1211
|
+
"check-motion-contract.ts",
|
|
1212
|
+
["--skill-root", motionLiveWorkspaceUnsupportedRecipe, "--workspace-root", path.join(motionLiveWorkspaceUnsupportedRecipe, "examples/workspace/business")],
|
|
1213
|
+
1,
|
|
1214
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1215
|
+
);
|
|
1216
|
+
const motionLiveWorkspaceReorderedRecipe = writeMotionContractRoot("motion-contract-live-workspace-reordered-recipe", (rel, text) => {
|
|
1217
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1218
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1219
|
+
return text
|
|
1220
|
+
.replace(
|
|
1221
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1222
|
+
"| Surface | Real state or relationship | Low-power fallback | Visible or semantic signal | Stop condition | Reduced-motion result | Recipe |",
|
|
1223
|
+
)
|
|
1224
|
+
.replace(
|
|
1225
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1226
|
+
"| AI status | Processing state | none | Active orb | Processing ends | Static status text | R19 |",
|
|
1227
|
+
);
|
|
1228
|
+
}
|
|
1229
|
+
return text;
|
|
1230
|
+
});
|
|
1231
|
+
runScriptArgs(
|
|
1232
|
+
"motion contract resolves Recipe from reordered live-effect headers",
|
|
1233
|
+
"check-motion-contract.ts",
|
|
1234
|
+
["--skill-root", motionLiveWorkspaceReorderedRecipe, "--workspace-root", path.join(motionLiveWorkspaceReorderedRecipe, "examples/workspace/business")],
|
|
1235
|
+
1,
|
|
1236
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1237
|
+
);
|
|
1238
|
+
const motionLiveWorkspaceMissingSeparator = writeMotionContractRoot("motion-contract-live-workspace-missing-separator", (rel, text) => {
|
|
1239
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1240
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1241
|
+
return text
|
|
1242
|
+
.replace(
|
|
1243
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |\n| --- | --- | --- | --- | --- | --- | --- |",
|
|
1244
|
+
"| Surface | Real state or relationship | Recipe | Visible or semantic signal | Stop condition | Reduced-motion result | Low-power fallback |",
|
|
1245
|
+
)
|
|
1246
|
+
.replace(
|
|
1247
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1248
|
+
"| AI status | Processing state | R19 | Active orb | Processing ends | Static status text | Static status text |\n| AI status | Processing state | R18 | Active orb | Processing ends | Static status text | Static status text |",
|
|
1249
|
+
);
|
|
1250
|
+
}
|
|
1251
|
+
return text;
|
|
1252
|
+
});
|
|
1253
|
+
runScriptArgs(
|
|
1254
|
+
"motion contract rejects a live-effect table without a Markdown separator",
|
|
1255
|
+
"check-motion-contract.ts",
|
|
1256
|
+
["--skill-root", motionLiveWorkspaceMissingSeparator, "--workspace-root", path.join(motionLiveWorkspaceMissingSeparator, "examples/workspace/business")],
|
|
1257
|
+
1,
|
|
1258
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1259
|
+
);
|
|
1260
|
+
const motionPrelaunchActiveWorkspace = writeMotionContractRoot("motion-contract-prelaunch-active-workspace");
|
|
1261
|
+
const prelaunchBusinessRoot = path.join(motionPrelaunchActiveWorkspace, "active-business");
|
|
1262
|
+
cpSync(path.join(motionPrelaunchActiveWorkspace, "examples/workspace/business"), prelaunchBusinessRoot, { recursive: true });
|
|
1263
|
+
{
|
|
1264
|
+
const contractPath = path.join(prelaunchBusinessRoot, "DESIGN.md");
|
|
1265
|
+
const contract = readFileSync(contractPath, "utf8").replace(
|
|
1266
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1267
|
+
"| AI status | Processing state | R19 | Active orb | Processing ends | Static status text | Static status text |",
|
|
1268
|
+
);
|
|
1269
|
+
writeFileSync(contractPath, contract, "utf8");
|
|
1270
|
+
}
|
|
1271
|
+
runScriptArgs(
|
|
1272
|
+
"motion contract validates an explicit active workspace before phase 6",
|
|
1273
|
+
"check-motion-contract.ts",
|
|
1274
|
+
["--skill-root", motionPrelaunchActiveWorkspace, "--workspace-root", prelaunchBusinessRoot],
|
|
1275
|
+
1,
|
|
1276
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1277
|
+
);
|
|
1278
|
+
const motionLiveWorkspaceEscapedPipe = writeMotionContractRoot("motion-contract-live-workspace-escaped-pipe", (rel, text) => {
|
|
1279
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1280
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1281
|
+
assert(text.includes("| Not defined | Not defined | R15, R16, R17, R18, or none |"), "escaped-pipe fixture must replace the live-effect row");
|
|
1282
|
+
return text.replace(
|
|
1283
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1284
|
+
"| AI status | Processing state | R18 | Active \\| idle orb | Processing ends | Static status text | Static status text |",
|
|
1285
|
+
);
|
|
1286
|
+
}
|
|
1287
|
+
return text;
|
|
1288
|
+
});
|
|
1289
|
+
runScriptArgs(
|
|
1290
|
+
"motion contract preserves escaped pipes inside a live-effect cell",
|
|
1291
|
+
"check-motion-contract.ts",
|
|
1292
|
+
["--skill-root", motionLiveWorkspaceEscapedPipe, "--workspace-root", path.join(motionLiveWorkspaceEscapedPipe, "examples/workspace/business")],
|
|
1293
|
+
0,
|
|
1294
|
+
);
|
|
1295
|
+
const motionLiveWorkspaceAlternatePlaceholders = writeMotionContractRoot("motion-contract-live-workspace-alternate-placeholders", (rel, text) => {
|
|
1296
|
+
if (rel.endsWith("business-state.json")) return text.replaceAll("phase_0_orient", "phase_6_live");
|
|
1297
|
+
if (rel === "examples/workspace/business/DESIGN.md") {
|
|
1298
|
+
return text.replace(
|
|
1299
|
+
"| Not defined | Not defined | R15, R16, R17, R18, or none | Not defined | Not defined | Not defined | Not defined |",
|
|
1300
|
+
"| TBD | TODO | none | Pending | Not reviewed | Not captured | Not recorded |",
|
|
1301
|
+
);
|
|
1302
|
+
}
|
|
1303
|
+
return text;
|
|
1304
|
+
});
|
|
1305
|
+
runScriptArgs(
|
|
1306
|
+
"motion contract rejects alternate placeholders in launched live-effect rows",
|
|
1307
|
+
"check-motion-contract.ts",
|
|
1308
|
+
[
|
|
1309
|
+
"--skill-root",
|
|
1310
|
+
motionLiveWorkspaceAlternatePlaceholders,
|
|
1311
|
+
"--workspace-root",
|
|
1312
|
+
path.join(motionLiveWorkspaceAlternatePlaceholders, "examples/workspace/business"),
|
|
1313
|
+
],
|
|
1314
|
+
1,
|
|
1315
|
+
"motion_contract.live_surface.workspace_incomplete",
|
|
1316
|
+
);
|
|
1317
|
+
runScriptArgs(
|
|
1318
|
+
"motion contract fails when one live-surface recipe disappears",
|
|
1319
|
+
"check-motion-contract.ts",
|
|
1320
|
+
["--skill-root", motionLiveSurfaceMissing],
|
|
1321
|
+
1,
|
|
1322
|
+
"motion_contract.live_surface.recipe_missing",
|
|
1323
|
+
);
|
|
1324
|
+
|
|
1325
|
+
const motionLiveSurfaceHeadingOnly = writeMotionContractRoot("motion-contract-live-surface-heading-only", (rel, text) =>
|
|
1326
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1327
|
+
? text.replace(/### R16 — State-bound perimeter beam[\s\S]*?(?=\n### R17 — Liquid-metal priority ring)/, "### R16 — State-bound perimeter beam\n")
|
|
1328
|
+
: text,
|
|
1329
|
+
);
|
|
1330
|
+
runScriptArgs(
|
|
1331
|
+
"motion contract fails when a live-surface recipe keeps only its heading",
|
|
1332
|
+
"check-motion-contract.ts",
|
|
1333
|
+
["--skill-root", motionLiveSurfaceHeadingOnly],
|
|
1334
|
+
1,
|
|
1335
|
+
"motion_contract.live_surface.recipe_incomplete",
|
|
1336
|
+
);
|
|
1337
|
+
|
|
1338
|
+
const motionMirrorDrift = writeMotionContractRoot("motion-contract-mirror-drift", (rel, text) =>
|
|
1339
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1340
|
+
? text.replace("celebrate (response 0.45–0.5 / damping 0.5–0.7)", "celebrate (response 0.45–0.6 / damping 0.5–0.7)")
|
|
1341
|
+
: text,
|
|
1342
|
+
);
|
|
1343
|
+
runScriptArgs(
|
|
1344
|
+
"motion contract fails when the benchmarks spring-family mirror drifts from the craft table",
|
|
1345
|
+
"check-motion-contract.ts",
|
|
1346
|
+
["--skill-root", motionMirrorDrift],
|
|
1347
|
+
1,
|
|
1348
|
+
"motion_contract.family_mirror.drift",
|
|
1349
|
+
);
|
|
1350
|
+
|
|
1351
|
+
// The motion tokens the contract compares against live in DESIGN.md's b2c-motion-tokens block,
|
|
1352
|
+
// not in design/system/tokens.json — that file is a promoted output. Mutating the output left
|
|
1353
|
+
// the authored value untouched, so this negative control silently stopped drifting anything.
|
|
1354
|
+
const motionTokenDrift = writeMotionContractRoot("motion-contract-token-drift", (rel, text) =>
|
|
1355
|
+
rel === "examples/workspace/business/DESIGN.md" ? text.replace("durationBase: 220ms", "durationBase: 200ms") : text,
|
|
1356
|
+
);
|
|
1357
|
+
runScriptArgs(
|
|
1358
|
+
"motion contract fails when a documented token value drifts from DESIGN.md",
|
|
1359
|
+
"check-motion-contract.ts",
|
|
1360
|
+
["--skill-root", motionTokenDrift],
|
|
1361
|
+
1,
|
|
1362
|
+
"motion_contract.token_row.value_drift",
|
|
1363
|
+
);
|
|
1364
|
+
|
|
1365
|
+
const motionRecipeWindowDrift = writeMotionContractRoot("motion-contract-recipe-window-drift", (rel, text) =>
|
|
1366
|
+
rel.endsWith("motion-craft-benchmarks.md") ? text.replace("window (360–600ms total)", "window (360–650ms total)") : text,
|
|
1367
|
+
);
|
|
1368
|
+
runScriptArgs(
|
|
1369
|
+
"motion contract fails when a recipe's own restated window drifts from tokens.json",
|
|
1370
|
+
"check-motion-contract.ts",
|
|
1371
|
+
["--skill-root", motionRecipeWindowDrift],
|
|
1372
|
+
1,
|
|
1373
|
+
"motion_contract.recipe_window.value_drift",
|
|
1374
|
+
);
|
|
1375
|
+
|
|
1376
|
+
const motionRecipeWindowReworded = writeMotionContractRoot("motion-contract-recipe-window-reworded", (rel, text) =>
|
|
1377
|
+
rel.endsWith("motion-craft-benchmarks.md") ? text.replace("window (360–600ms total)", "window (fits comfortably inside the cap)") : text,
|
|
1378
|
+
);
|
|
1379
|
+
runScriptArgs(
|
|
1380
|
+
"motion contract fails when no recipe window statement is parseable, instead of silently checking nothing",
|
|
1381
|
+
"check-motion-contract.ts",
|
|
1382
|
+
["--skill-root", motionRecipeWindowReworded],
|
|
1383
|
+
1,
|
|
1384
|
+
"motion_contract.recipe_window.none_found",
|
|
1385
|
+
);
|
|
1386
|
+
|
|
1387
|
+
const motionRecipeFamilyInlineDrift = writeMotionContractRoot("motion-contract-recipe-family-inline-drift", (rel, text) =>
|
|
1388
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1389
|
+
? text.replace("press-family spring (response 0.3–0.4s, damping 0.7–0.8)", "press-family spring (response 0.3–0.4s, damping 0.7–0.9)")
|
|
1390
|
+
: text,
|
|
1391
|
+
);
|
|
1392
|
+
runScriptArgs(
|
|
1393
|
+
"motion contract fails when a recipe's inline spring-family restatement drifts from the craft table",
|
|
1394
|
+
"check-motion-contract.ts",
|
|
1395
|
+
["--skill-root", motionRecipeFamilyInlineDrift],
|
|
1396
|
+
1,
|
|
1397
|
+
"motion_contract.recipe_family_inline.drift",
|
|
1398
|
+
);
|
|
1399
|
+
|
|
1400
|
+
const motionRecipeFamilyInlineReworded = writeMotionContractRoot("motion-contract-recipe-family-inline-reworded", (rel, text) =>
|
|
1401
|
+
rel.endsWith("motion-craft-benchmarks.md") ? text.replace("press-family spring (response 0.3–0.4s, damping 0.7–0.8)", "a calm, restrained spring") : text,
|
|
1402
|
+
);
|
|
1403
|
+
runScriptArgs(
|
|
1404
|
+
"motion contract fails when no recipe spring-family restatement is parseable, instead of silently checking nothing",
|
|
1405
|
+
"check-motion-contract.ts",
|
|
1406
|
+
["--skill-root", motionRecipeFamilyInlineReworded],
|
|
1407
|
+
1,
|
|
1408
|
+
"motion_contract.recipe_family_inline.none_found",
|
|
1409
|
+
);
|
|
1410
|
+
|
|
1411
|
+
const motionOffsetTableRowDrift = writeMotionContractRoot("motion-contract-offset-table-row-drift", (rel, text) =>
|
|
1412
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1413
|
+
? text.replace(
|
|
1414
|
+
"| 3 | 2 | 100ms | up to 100ms | 600ms |",
|
|
1415
|
+
"| 3 | 2 | 100ms | up to 180ms | 600ms |",
|
|
1416
|
+
)
|
|
1417
|
+
: text,
|
|
1418
|
+
);
|
|
1419
|
+
runScriptArgs(
|
|
1420
|
+
"motion contract fails when an offset-table row's offset and total disagree with each other",
|
|
1421
|
+
"check-motion-contract.ts",
|
|
1422
|
+
["--skill-root", motionOffsetTableRowDrift],
|
|
1423
|
+
1,
|
|
1424
|
+
"motion_contract.recipe_offset_table.row_internally_inconsistent",
|
|
1425
|
+
);
|
|
1426
|
+
|
|
1427
|
+
const motionOffsetTableBoundaryDrift = writeMotionContractRoot("motion-contract-offset-table-boundary-drift", (rel, text) =>
|
|
1428
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1429
|
+
? text.replace(
|
|
1430
|
+
"| 5+ | 4+ | ≤50ms | below the 60ms stagger floor — not achievable as pure stagger | — |",
|
|
1431
|
+
"| 6+ | 5+ | ≤50ms | below the 60ms stagger floor — not achievable as pure stagger | — |",
|
|
1432
|
+
)
|
|
1433
|
+
: text,
|
|
1434
|
+
);
|
|
1435
|
+
runScriptArgs(
|
|
1436
|
+
"motion contract fails when the offset table's unachievable-asset-count boundary drifts from the recomputed value",
|
|
1437
|
+
"check-motion-contract.ts",
|
|
1438
|
+
["--skill-root", motionOffsetTableBoundaryDrift],
|
|
1439
|
+
1,
|
|
1440
|
+
"motion_contract.recipe_offset_table.boundary_drift",
|
|
1441
|
+
);
|
|
1442
|
+
|
|
1443
|
+
const motionOffsetTableDrift = writeMotionContractRoot("motion-contract-offset-table-drift", (rel, text) =>
|
|
1444
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1445
|
+
? text.replace(
|
|
1446
|
+
"| 4 | 3 | 66ms | up to 66ms (still ≥ the 60ms stagger floor) | 598ms |",
|
|
1447
|
+
"| 4 | 3 | 66ms | up to 66ms (still ≥ the 60ms stagger floor) | 588ms |",
|
|
1448
|
+
)
|
|
1449
|
+
: text,
|
|
1450
|
+
);
|
|
1451
|
+
runScriptArgs(
|
|
1452
|
+
"motion contract fails when an offset-table row's total drifts from what its own offset computes",
|
|
1453
|
+
"check-motion-contract.ts",
|
|
1454
|
+
["--skill-root", motionOffsetTableDrift],
|
|
1455
|
+
1,
|
|
1456
|
+
"motion_contract.recipe_offset_table.row_internally_inconsistent",
|
|
1457
|
+
);
|
|
1458
|
+
|
|
1459
|
+
const motionOffsetTableGapsDrift = writeMotionContractRoot("motion-contract-offset-table-gaps-drift", (rel, text) =>
|
|
1460
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1461
|
+
? text.replace(
|
|
1462
|
+
"| 3 | 2 | 100ms | up to 100ms | 600ms |",
|
|
1463
|
+
"| 3 | 3 | 100ms | up to 100ms | 600ms |",
|
|
1464
|
+
)
|
|
1465
|
+
: text,
|
|
1466
|
+
);
|
|
1467
|
+
runScriptArgs(
|
|
1468
|
+
"motion contract fails when an offset-table row's Gaps cell disagrees with its own asset count",
|
|
1469
|
+
"check-motion-contract.ts",
|
|
1470
|
+
["--skill-root", motionOffsetTableGapsDrift],
|
|
1471
|
+
1,
|
|
1472
|
+
"motion_contract.recipe_offset_table.gaps_drift",
|
|
1473
|
+
);
|
|
1474
|
+
|
|
1475
|
+
const motionOffsetTableGapBudgetDrift = writeMotionContractRoot("motion-contract-offset-table-gap-budget-drift", (rel, text) =>
|
|
1476
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1477
|
+
? text.replace(
|
|
1478
|
+
"| 3 | 2 | 100ms | up to 100ms | 600ms |",
|
|
1479
|
+
"| 3 | 2 | 120ms | up to 100ms | 600ms |",
|
|
1480
|
+
)
|
|
1481
|
+
: text,
|
|
1482
|
+
);
|
|
1483
|
+
runScriptArgs(
|
|
1484
|
+
"motion contract fails when an offset-table row's Gap-budget-÷-gaps cell disagrees with the recomputed value",
|
|
1485
|
+
"check-motion-contract.ts",
|
|
1486
|
+
["--skill-root", motionOffsetTableGapBudgetDrift],
|
|
1487
|
+
1,
|
|
1488
|
+
"motion_contract.recipe_offset_table.gap_budget_drift",
|
|
1489
|
+
);
|
|
1490
|
+
|
|
1491
|
+
const motionOffsetTableMissingAssetCountRow = writeMotionContractRoot("motion-contract-offset-table-missing-row", (rel, text) =>
|
|
1492
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1493
|
+
? text.replace("| 3 | 2 | 100ms | up to 100ms | 600ms |\n", "")
|
|
1494
|
+
: text,
|
|
1495
|
+
);
|
|
1496
|
+
runScriptArgs(
|
|
1497
|
+
"motion contract fails when an achievable asset count has no row at all in the offset table",
|
|
1498
|
+
"check-motion-contract.ts",
|
|
1499
|
+
["--skill-root", motionOffsetTableMissingAssetCountRow],
|
|
1500
|
+
1,
|
|
1501
|
+
"motion_contract.recipe_offset_table.missing_asset_count_row",
|
|
1502
|
+
);
|
|
1503
|
+
|
|
1504
|
+
const motionCanonDrift = writeMotionContractRoot("motion-contract-canon-outside-band", (rel, text) =>
|
|
1505
|
+
rel.endsWith("peak-end-card.md") ? text.replace(".spring(response: 0.45, dampingFraction: 0.7)", ".spring(response: 0.45, dampingFraction: 0.85)") : text,
|
|
1506
|
+
);
|
|
1507
|
+
runScriptArgs(
|
|
1508
|
+
"motion contract fails when a canon card's spring falls outside the stated celebrate band",
|
|
1509
|
+
"check-motion-contract.ts",
|
|
1510
|
+
["--skill-root", motionCanonDrift],
|
|
1511
|
+
1,
|
|
1512
|
+
"motion_contract.canon.outside_band",
|
|
1513
|
+
);
|
|
1514
|
+
|
|
1515
|
+
const motionPresetDrift = writeMotionContractRoot("motion-contract-preset-duration-drift", (rel, text) =>
|
|
1516
|
+
rel.endsWith("PremiumCraft.swift") ? text.replace("duration: DesignTokens.Motion.durationFast,", "duration: DesignTokens.Motion.durationBase,") : text,
|
|
1517
|
+
);
|
|
1518
|
+
runScriptArgs(
|
|
1519
|
+
"motion contract fails when a preset rides a different duration token than the table maps",
|
|
1520
|
+
"check-motion-contract.ts",
|
|
1521
|
+
["--skill-root", motionPresetDrift],
|
|
1522
|
+
1,
|
|
1523
|
+
"motion_contract.preset.duration_mismatch",
|
|
1524
|
+
);
|
|
1525
|
+
|
|
1526
|
+
const motionRowLost = writeMotionContractRoot("motion-contract-table-row-lost", (rel, text) =>
|
|
1527
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1528
|
+
? text
|
|
1529
|
+
.split("\n")
|
|
1530
|
+
.filter((line) => !line.startsWith("| `durationSlow`"))
|
|
1531
|
+
.join("\n")
|
|
1532
|
+
: text,
|
|
1533
|
+
);
|
|
1534
|
+
runScriptArgs(
|
|
1535
|
+
"motion contract fails when the token table silently loses a required row",
|
|
1536
|
+
"check-motion-contract.ts",
|
|
1537
|
+
["--skill-root", motionRowLost],
|
|
1538
|
+
1,
|
|
1539
|
+
"motion_contract.token_table.row_missing",
|
|
1540
|
+
);
|
|
1541
|
+
|
|
1542
|
+
// The durationCelebrate row carries TWO presets; the gate must validate the
|
|
1543
|
+
// second annotation, not just the first, and must notice the row vanishing.
|
|
1544
|
+
const motionLandingBounceDrift = writeMotionContractRoot("motion-contract-landing-bounce-drift", (rel, text) =>
|
|
1545
|
+
rel.endsWith("PremiumCraft.swift") ? text.replace("bounce: 0.45", "bounce: 0.5") : text,
|
|
1546
|
+
);
|
|
1547
|
+
runScriptArgs(
|
|
1548
|
+
"motion contract fails when the celebrateLanding preset bounce drifts from the table",
|
|
1549
|
+
"check-motion-contract.ts",
|
|
1550
|
+
["--skill-root", motionLandingBounceDrift],
|
|
1551
|
+
1,
|
|
1552
|
+
"motion_contract.preset.bounce_drift",
|
|
1553
|
+
);
|
|
1554
|
+
|
|
1555
|
+
const motionCelebrateRowLost = writeMotionContractRoot("motion-contract-celebrate-row-lost", (rel, text) =>
|
|
1556
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1557
|
+
? text
|
|
1558
|
+
.split("\n")
|
|
1559
|
+
.filter((line) => !line.startsWith("| `durationCelebrate`"))
|
|
1560
|
+
.join("\n")
|
|
1561
|
+
: text,
|
|
1562
|
+
);
|
|
1563
|
+
runScriptArgs(
|
|
1564
|
+
"motion contract fails when the celebrate mapping row is removed from the table",
|
|
1565
|
+
"check-motion-contract.ts",
|
|
1566
|
+
["--skill-root", motionCelebrateRowLost],
|
|
1567
|
+
1,
|
|
1568
|
+
"motion_contract.token_table.row_missing",
|
|
1569
|
+
);
|
|
1570
|
+
|
|
1571
|
+
const motionAnnotationLost = writeMotionContractRoot("motion-contract-preset-annotation-lost", (rel, text) =>
|
|
1572
|
+
rel.endsWith("motion-craft-benchmarks.md") ? text.replace("`PremiumMotion.press` (bounce 0.18)", "`PremiumMotion.press`") : text,
|
|
1573
|
+
);
|
|
1574
|
+
runScriptArgs(
|
|
1575
|
+
"motion contract fails when a preset row loses its bounce annotation",
|
|
1576
|
+
"check-motion-contract.ts",
|
|
1577
|
+
["--skill-root", motionAnnotationLost],
|
|
1578
|
+
1,
|
|
1579
|
+
"motion_contract.preset.annotation_missing",
|
|
1580
|
+
);
|
|
1581
|
+
|
|
1582
|
+
const motionMalformedRef = writeMotionContractRoot("motion-contract-malformed-token-ref", (rel, text) =>
|
|
1583
|
+
rel.endsWith("motion-craft-benchmarks.md") ? `${text}\nWeb loops may also ride \`motion.durationReveal2\` or \`motion.constructor\` when staged.\n` : text,
|
|
1584
|
+
);
|
|
1585
|
+
runScriptArgs(
|
|
1586
|
+
"motion contract fails on a malformed token reference that truncation used to let pass",
|
|
1587
|
+
"check-motion-contract.ts",
|
|
1588
|
+
["--skill-root", motionMalformedRef],
|
|
1589
|
+
1,
|
|
1590
|
+
"motion_contract.token_reference.unknown",
|
|
1591
|
+
);
|
|
1592
|
+
|
|
1593
|
+
const motionSymbolUnresolvable = writeMotionContractRoot("motion-contract-symbol-unresolvable", (rel, text) =>
|
|
1594
|
+
rel.endsWith("variable-reward-card.md")
|
|
1595
|
+
? text.replace(".spring(response: 0.5, dampingFraction: 0.6)", ".spring(response: DesignTokens.Motion.expressive, dampingFraction: 0.6)")
|
|
1596
|
+
: text,
|
|
1597
|
+
);
|
|
1598
|
+
runScriptArgs(
|
|
1599
|
+
"motion contract fails when a canon spring cites a Motion member the enum does not define",
|
|
1600
|
+
"check-motion-contract.ts",
|
|
1601
|
+
["--skill-root", motionSymbolUnresolvable],
|
|
1602
|
+
1,
|
|
1603
|
+
"motion_contract.canon.symbol_unresolvable",
|
|
1604
|
+
);
|
|
1605
|
+
|
|
1606
|
+
const motionVocabMember = writeMotionContractRoot("motion-contract-vocab-phantom-member", (rel, text) =>
|
|
1607
|
+
rel.endsWith("mastery-and-status-card.md") ? `${text}\nThe badge scale-in rides \`DesignTokens.Motion.expressive\` timing.\n` : text,
|
|
1608
|
+
);
|
|
1609
|
+
runScriptArgs(
|
|
1610
|
+
"motion contract fails on a prose reference to a Motion member the enum does not define",
|
|
1611
|
+
"check-motion-contract.ts",
|
|
1612
|
+
["--skill-root", motionVocabMember],
|
|
1613
|
+
1,
|
|
1614
|
+
"motion_contract.vocabulary.member_unknown",
|
|
1615
|
+
);
|
|
1616
|
+
|
|
1617
|
+
const motionVocabToken = writeMotionContractRoot("motion-contract-vocab-phantom-token", (rel, text) =>
|
|
1618
|
+
rel.endsWith("peak-end-card.md") ? `${text}\nThe stamp fade rides \`motion.brief\` timing.\n` : text,
|
|
1619
|
+
);
|
|
1620
|
+
runScriptArgs(
|
|
1621
|
+
"motion contract fails on a card token reference tokens.json does not define",
|
|
1622
|
+
"check-motion-contract.ts",
|
|
1623
|
+
["--skill-root", motionVocabToken],
|
|
1624
|
+
1,
|
|
1625
|
+
"motion_contract.vocabulary.token_unknown",
|
|
1626
|
+
);
|
|
1627
|
+
|
|
1628
|
+
const motionVocabCssVar = writeMotionContractRoot("motion-contract-vocab-phantom-css-var", (rel, text) =>
|
|
1629
|
+
rel.endsWith("variable-reward-card.md") ? `${text}\nWeb pulses read the \`--motion-brief\` variable.\n` : text,
|
|
1630
|
+
);
|
|
1631
|
+
runScriptArgs(
|
|
1632
|
+
"motion contract fails on a CSS variable the token promotion pipeline does not mint",
|
|
1633
|
+
"check-motion-contract.ts",
|
|
1634
|
+
["--skill-root", motionVocabCssVar],
|
|
1635
|
+
1,
|
|
1636
|
+
"motion_contract.vocabulary.css_var_unknown",
|
|
1637
|
+
);
|
|
1638
|
+
|
|
1639
|
+
const motionVocabPunctuatedToken = writeMotionContractRoot("motion-contract-vocab-punctuated-token", (rel, text) =>
|
|
1640
|
+
rel.endsWith("peak-end-card.md") ? `${text}\nStaged loops may also ride \`motion.durationReveal-extra\` cycles.\n` : text,
|
|
1641
|
+
);
|
|
1642
|
+
runScriptArgs(
|
|
1643
|
+
"motion contract fails on a punctuated card token reference outside the benchmarks",
|
|
1644
|
+
"check-motion-contract.ts",
|
|
1645
|
+
["--skill-root", motionVocabPunctuatedToken],
|
|
1646
|
+
1,
|
|
1647
|
+
"motion_contract.vocabulary.token_unknown",
|
|
1648
|
+
);
|
|
1649
|
+
|
|
1650
|
+
const motionVocabEmbeddedToken = writeMotionContractRoot("motion-contract-vocab-embedded-token", (rel, text) =>
|
|
1651
|
+
rel.endsWith("variable-reward-card.md") ? `${text}\nWeb: \`transition={{ repeat: Infinity, duration: motion.moderate }}\` for anticipation.\n` : text,
|
|
1652
|
+
);
|
|
1653
|
+
runScriptArgs(
|
|
1654
|
+
"motion contract fails on a phantom token embedded in an implementation code span",
|
|
1655
|
+
"check-motion-contract.ts",
|
|
1656
|
+
["--skill-root", motionVocabEmbeddedToken],
|
|
1657
|
+
1,
|
|
1658
|
+
"motion_contract.vocabulary.token_unknown",
|
|
1659
|
+
);
|
|
1660
|
+
|
|
1661
|
+
const motionVocabFencedToken = writeMotionContractRoot("motion-contract-vocab-fenced-token", (rel, text) =>
|
|
1662
|
+
rel.endsWith("peak-end-card.md") ? `${text}\n\`\`\`swift\nlet duration = motion.moderate\n\`\`\`\n` : text,
|
|
1663
|
+
);
|
|
1664
|
+
runScriptArgs(
|
|
1665
|
+
"motion contract fails on a phantom token inside a fenced code block",
|
|
1666
|
+
"check-motion-contract.ts",
|
|
1667
|
+
["--skill-root", motionVocabFencedToken],
|
|
1668
|
+
1,
|
|
1669
|
+
"motion_contract.vocabulary.token_unknown",
|
|
1670
|
+
);
|
|
1671
|
+
|
|
1672
|
+
const motionVocabIntrinsics = writeMotionContractRoot("motion-contract-vocab-intrinsic-elements", (rel, text) =>
|
|
1673
|
+
rel.endsWith("peak-end-card.md")
|
|
1674
|
+
? `${text}\nWrap the section in \`motion.article\` or \`<motion.nav layout>\`; \`motion.form\` and \`motion.main\` also animate.\n`
|
|
1675
|
+
: text,
|
|
1676
|
+
);
|
|
1677
|
+
runScriptArgs(
|
|
1678
|
+
"motion contract accepts motion/react intrinsic elements beyond a fixed tag list",
|
|
1679
|
+
"check-motion-contract.ts",
|
|
1680
|
+
["--skill-root", motionVocabIntrinsics],
|
|
1681
|
+
0,
|
|
1682
|
+
);
|
|
1683
|
+
|
|
1684
|
+
const motionPackBounceDrift = writeMotionContractRoot("motion-contract-pack-bounce-drift", (rel, text) =>
|
|
1685
|
+
rel.endsWith("TokenSpring.swift")
|
|
1686
|
+
? text.replace(
|
|
1687
|
+
"TokenSpring(duration: DesignTokens.Motion.durationCelebrate, bounce: 0.45)",
|
|
1688
|
+
"TokenSpring(duration: DesignTokens.Motion.durationCelebrate, bounce: 0.5)",
|
|
1689
|
+
)
|
|
1690
|
+
: text,
|
|
1691
|
+
);
|
|
1692
|
+
runScriptArgs(
|
|
1693
|
+
"motion contract fails when TokenSpring.swift's copied bounce drifts from PremiumCraft",
|
|
1694
|
+
"check-motion-contract.ts",
|
|
1695
|
+
["--skill-root", motionPackBounceDrift],
|
|
1696
|
+
1,
|
|
1697
|
+
"motion_contract.token_spring.bounce_drift",
|
|
1698
|
+
);
|
|
1699
|
+
|
|
1700
|
+
const motionPackTsValueDrift = writeMotionContractRoot("motion-contract-pack-ts-value-drift", (rel, text) =>
|
|
1701
|
+
rel.endsWith("motion-tokens.ts") ? text.replace("durationCelebrate: 500,", "durationCelebrate: 450,") : text,
|
|
1702
|
+
);
|
|
1703
|
+
runScriptArgs(
|
|
1704
|
+
"motion contract fails when motion-tokens.ts's ms table drifts from tokens.json",
|
|
1705
|
+
"check-motion-contract.ts",
|
|
1706
|
+
["--skill-root", motionPackTsValueDrift],
|
|
1707
|
+
1,
|
|
1708
|
+
"motion_contract.motion_tokens.token_value_drift",
|
|
1709
|
+
);
|
|
1710
|
+
|
|
1711
|
+
const motionPackPresetMissing = writeMotionContractRoot("motion-contract-pack-preset-missing", (rel, text) =>
|
|
1712
|
+
rel.endsWith("motion-tokens.ts") ? text.replace(" celebrateLanding: springFromPreset(Motion.durationCelebrate, 0.45),\n", "") : text,
|
|
1713
|
+
);
|
|
1714
|
+
runScriptArgs(
|
|
1715
|
+
"motion contract fails when motion-tokens.ts drops a PremiumCraft preset",
|
|
1716
|
+
"check-motion-contract.ts",
|
|
1717
|
+
["--skill-root", motionPackPresetMissing],
|
|
1718
|
+
1,
|
|
1719
|
+
"motion_contract.motion_tokens.preset_missing",
|
|
1720
|
+
);
|
|
1721
|
+
|
|
1722
|
+
const motionCardMomentDrift = writeMotionContractRoot("motion-contract-card-moment-drift", (rel, text) => {
|
|
1723
|
+
if (!rel.endsWith("examples/workspace/business/DESIGN.md")) return text;
|
|
1724
|
+
assert(text.includes("| Intent Mirror | Use `motion.durationReveal`"), "card-moment fixture must replace the current token");
|
|
1725
|
+
return text.replace("| Intent Mirror | Use `motion.durationReveal`", "| Intent Mirror | Use `motion.durationSlow`");
|
|
1726
|
+
});
|
|
1727
|
+
runScriptArgs(
|
|
1728
|
+
"motion contract fails when the two seeded templates disagree on a card moment's tokens",
|
|
1729
|
+
"check-motion-contract.ts",
|
|
1730
|
+
["--skill-root", motionCardMomentDrift],
|
|
1731
|
+
1,
|
|
1732
|
+
"motion_contract.card_moments.drift",
|
|
1733
|
+
);
|
|
1734
|
+
|
|
1735
|
+
const motionVocabCssVarSuffix = writeMotionContractRoot("motion-contract-vocab-css-var-suffix", (rel, text) =>
|
|
1736
|
+
rel.endsWith("variable-reward-card.md") ? `${text}\nWeb pulses may read the \`--motion-duration-fast_extra\` variable.\n` : text,
|
|
1737
|
+
);
|
|
1738
|
+
runScriptArgs(
|
|
1739
|
+
"motion contract fails on a CSS variable that extends a promoted name past an identifier boundary",
|
|
1740
|
+
"check-motion-contract.ts",
|
|
1741
|
+
["--skill-root", motionVocabCssVarSuffix],
|
|
1742
|
+
1,
|
|
1743
|
+
"motion_contract.vocabulary.css_var_unknown",
|
|
1744
|
+
);
|
|
1745
|
+
|
|
1746
|
+
const motionFamilyDuplicate = writeMotionContractRoot("motion-contract-family-duplicate", (rel, text) =>
|
|
1747
|
+
rel.endsWith("premium-mobile-craft.md")
|
|
1748
|
+
? text.replace(
|
|
1749
|
+
"| **celebrate** | response 0.45\u20130.5, dampingFraction 0.5\u20130.7",
|
|
1750
|
+
"| **press** | response 0.2\u20130.3, dampingFraction 0.9\u20130.95 | stale contradictory row | none |\n| **celebrate** | response 0.45\u20130.5, dampingFraction 0.5\u20130.7",
|
|
1751
|
+
)
|
|
1752
|
+
: text,
|
|
1753
|
+
);
|
|
1754
|
+
runScriptArgs(
|
|
1755
|
+
"motion contract fails when the spring table states a family twice",
|
|
1756
|
+
"check-motion-contract.ts",
|
|
1757
|
+
["--skill-root", motionFamilyDuplicate],
|
|
1758
|
+
1,
|
|
1759
|
+
"motion_contract.family_table.duplicate",
|
|
1760
|
+
);
|
|
1761
|
+
|
|
1762
|
+
const motionPunctuatedRef = writeMotionContractRoot("motion-contract-punctuated-token-ref", (rel, text) =>
|
|
1763
|
+
rel.endsWith("motion-craft-benchmarks.md") ? `${text}\nStaged loops may also ride \`motion.durationReveal-extra\` cycles.\n` : text,
|
|
1764
|
+
);
|
|
1765
|
+
runScriptArgs(
|
|
1766
|
+
"motion contract fails on a punctuated token reference the closing-backtick rule now captures",
|
|
1767
|
+
"check-motion-contract.ts",
|
|
1768
|
+
["--skill-root", motionPunctuatedRef],
|
|
1769
|
+
1,
|
|
1770
|
+
"motion_contract.token_reference.unknown",
|
|
1771
|
+
);
|
|
1772
|
+
|
|
1773
|
+
const motionMalformedSpring = writeMotionContractRoot("motion-contract-malformed-spring-literal", (rel, text) =>
|
|
1774
|
+
rel.endsWith("mastery-and-status-card.md")
|
|
1775
|
+
? text.replace(".spring(response: 0.5, dampingFraction: 0.7)", ".spring(response: 0..5, dampingFraction: 0.7)")
|
|
1776
|
+
: text,
|
|
1777
|
+
);
|
|
1778
|
+
runScriptArgs(
|
|
1779
|
+
"motion contract fails when a canon spring literal does not parse as a valid decimal",
|
|
1780
|
+
"check-motion-contract.ts",
|
|
1781
|
+
["--skill-root", motionMalformedSpring],
|
|
1782
|
+
1,
|
|
1783
|
+
"motion_contract.canon.spring_malformed",
|
|
1784
|
+
);
|
|
1785
|
+
|
|
1786
|
+
const motionPresetValueDrift = writeMotionContractRoot("motion-contract-preset-value-drift", (rel, text) =>
|
|
1787
|
+
rel.endsWith("DesignTokens.swift") ? text.replace("static let durationFast: Double = 0.12", "static let durationFast: Double = 0.15") : text,
|
|
1788
|
+
);
|
|
1789
|
+
runScriptArgs(
|
|
1790
|
+
"motion contract fails when the Swift duration value drifts from the documented milliseconds",
|
|
1791
|
+
"check-motion-contract.ts",
|
|
1792
|
+
["--skill-root", motionPresetValueDrift],
|
|
1793
|
+
1,
|
|
1794
|
+
"motion_contract.token_row.swift_value_drift",
|
|
1795
|
+
);
|
|
1796
|
+
|
|
1797
|
+
const motionMirrorDuplicate = writeMotionContractRoot("motion-contract-mirror-duplicate", (rel, text) =>
|
|
1798
|
+
rel.endsWith("motion-craft-benchmarks.md")
|
|
1799
|
+
? `${text}\nStale: press (response 0.2\u20130.3 / damping 0.9\u20130.95) and celebrate (response 0.7\u20130.8 / damping 0.3\u20130.4) were the old bands.\n`
|
|
1800
|
+
: text,
|
|
1801
|
+
);
|
|
1802
|
+
runScriptArgs(
|
|
1803
|
+
"motion contract fails when a second stale spring-family mirror statement appears",
|
|
1804
|
+
"check-motion-contract.ts",
|
|
1805
|
+
["--skill-root", motionMirrorDuplicate],
|
|
1806
|
+
1,
|
|
1807
|
+
"motion_contract.family_mirror.duplicate",
|
|
1808
|
+
);
|
|
1809
|
+
|
|
1810
|
+
const motionInvertedRange = writeMotionContractRoot("motion-contract-inverted-range", (rel, text) =>
|
|
1811
|
+
rel.endsWith("premium-mobile-craft.md")
|
|
1812
|
+
? text.replace(
|
|
1813
|
+
"| **press** | response 0.3\u20130.4, dampingFraction 0.7\u20130.8",
|
|
1814
|
+
"| **press** | response 0.4\u20130.3, dampingFraction 0.7\u20130.8",
|
|
1815
|
+
)
|
|
1816
|
+
: text,
|
|
1817
|
+
);
|
|
1818
|
+
runScriptArgs(
|
|
1819
|
+
"motion contract fails when a spring-family range is inverted",
|
|
1820
|
+
"check-motion-contract.ts",
|
|
1821
|
+
["--skill-root", motionInvertedRange],
|
|
1822
|
+
1,
|
|
1823
|
+
"motion_contract.family_table.inverted_range",
|
|
1824
|
+
);
|
|
1825
|
+
|
|
1826
|
+
const motionSwiftMemberLost = writeMotionContractRoot("motion-contract-swift-member-lost", (rel, text) =>
|
|
1827
|
+
rel.endsWith("DesignTokens.swift")
|
|
1828
|
+
? text
|
|
1829
|
+
.split("\n")
|
|
1830
|
+
.filter((line) => !line.includes("static let stagger: Double"))
|
|
1831
|
+
.join("\n")
|
|
1832
|
+
: text,
|
|
1833
|
+
);
|
|
1834
|
+
runScriptArgs(
|
|
1835
|
+
"motion contract fails when a documented token member is deleted from the Swift enum",
|
|
1836
|
+
"check-motion-contract.ts",
|
|
1837
|
+
["--skill-root", motionSwiftMemberLost],
|
|
1838
|
+
1,
|
|
1839
|
+
"motion_contract.token_row.swift_member_missing",
|
|
1840
|
+
);
|
|
1841
|
+
|
|
1842
|
+
const motionCinematicLeak = writeMotionContractRoot("motion-contract-cinematic-leak", (rel, text) =>
|
|
1843
|
+
rel.endsWith("premium-mobile-craft.md") ? `${text}\nUse durationCinematic for hero moments.\n` : text,
|
|
1844
|
+
);
|
|
1845
|
+
runScriptArgs(
|
|
1846
|
+
"motion contract fails when the cinematic token leaks into the in-app craft doctrine",
|
|
1847
|
+
"check-motion-contract.ts",
|
|
1848
|
+
["--skill-root", motionCinematicLeak],
|
|
1849
|
+
1,
|
|
1850
|
+
"motion_contract.cinematic.in_craft_doctrine",
|
|
1851
|
+
);
|
|
1852
|
+
|
|
1853
|
+
// --- check-no-slop ---
|
|
1854
|
+
//
|
|
1855
|
+
// The gate had zero fixture coverage: nothing proved the tier split (public
|
|
1856
|
+
// front-door docs error, maintainer-only docs warn) or the advisory-only
|
|
1857
|
+
// status of empty adverbs/phrases could actually fire. The real
|
|
1858
|
+
// no-slop-writing.md is copied in rather than a fixture-only word list, so a
|
|
1859
|
+
// rule added there is exercised here without duplicating it.
|
|
1860
|
+
// The installed skill runtime intentionally contains only the skill package,
|
|
1861
|
+
// not the B2C App Builder repository's public front-door files. Exercise this
|
|
1862
|
+
// repository-positive control only when the checkout's actual front door is
|
|
1863
|
+
// present; the synthetic positive/negative controls below still run in both
|
|
1864
|
+
// source and installed-runtime audits.
|
|
1865
|
+
const shippedRepoRoot = path.resolve(skillRoot, "../..");
|
|
1866
|
+
if (
|
|
1867
|
+
existsSync(path.join(shippedRepoRoot, "README.md")) &&
|
|
1868
|
+
existsSync(path.join(shippedRepoRoot, "CONTRIBUTING.md")) &&
|
|
1869
|
+
existsSync(path.join(shippedRepoRoot, ".github", "SECURITY.md")) &&
|
|
1870
|
+
existsSync(path.join(shippedRepoRoot, ".github", "CODE_OF_CONDUCT.md"))
|
|
1871
|
+
) {
|
|
1872
|
+
runScriptArgs("no-slop passes on the shipped repo's own front door", "check-no-slop.ts", ["--repo-root", shippedRepoRoot, "--skill-root", skillRoot], 0);
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
function writeNoSlopRoot(name: string, overrides: Partial<Record<string, string>> = {}): { repoRoot: string; skillRoot: string } {
|
|
1876
|
+
const root = makeEmptyFixture(name);
|
|
1877
|
+
const repoRoot = path.join(root, "repo");
|
|
1878
|
+
const fixtureSkillRoot = path.join(repoRoot, "skill", "pkg");
|
|
1879
|
+
mkdirSync(path.join(fixtureSkillRoot, "knowledge", "words"), { recursive: true });
|
|
1880
|
+
const defaults: Record<string, string> = {
|
|
1881
|
+
"README.md": "# Example\n\nA plain description of what this project does.\n",
|
|
1882
|
+
"CONTRIBUTING.md": "# Contributing\n\nOpen a pull request with a clear description of the change.\n",
|
|
1883
|
+
".github/SECURITY.md": "# Security\n\nReport issues to security@example.com.\n",
|
|
1884
|
+
".github/CODE_OF_CONDUCT.md": "# Code Of Conduct\n\nBe respectful in every interaction.\n",
|
|
1885
|
+
"AGENTS.md": "# Agents\n\nFollow the repository conventions documented here.\n",
|
|
1886
|
+
"CLAUDE.md": "# Claude Instructions\n\nFollow the repository conventions documented here.\n",
|
|
1887
|
+
};
|
|
1888
|
+
for (const [relative, content] of Object.entries({ ...defaults, ...overrides })) {
|
|
1889
|
+
if (content === undefined) continue;
|
|
1890
|
+
const target = path.join(repoRoot, relative);
|
|
1891
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
1892
|
+
writeFileSync(target, content, "utf8");
|
|
1893
|
+
}
|
|
1894
|
+
cpSync(path.join(skillRoot, "knowledge", "words", "no-slop-writing.md"), path.join(fixtureSkillRoot, "knowledge", "words", "no-slop-writing.md"));
|
|
1895
|
+
return { repoRoot, skillRoot: fixtureSkillRoot };
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
const noSlopClean = writeNoSlopRoot("no-slop-clean");
|
|
1899
|
+
runScriptArgs(
|
|
1900
|
+
"no-slop passes on a synthetic clean front door",
|
|
1901
|
+
"check-no-slop.ts",
|
|
1902
|
+
["--repo-root", noSlopClean.repoRoot, "--skill-root", noSlopClean.skillRoot],
|
|
1903
|
+
0,
|
|
1904
|
+
);
|
|
1905
|
+
|
|
1906
|
+
const noSlopMissing = writeNoSlopRoot("no-slop-missing-file");
|
|
1907
|
+
rmSync(path.join(noSlopMissing.repoRoot, "CONTRIBUTING.md"));
|
|
1908
|
+
runScriptArgs(
|
|
1909
|
+
"no-slop fails when a declared front-door file is missing",
|
|
1910
|
+
"check-no-slop.ts",
|
|
1911
|
+
["--repo-root", noSlopMissing.repoRoot, "--skill-root", noSlopMissing.skillRoot],
|
|
1912
|
+
1,
|
|
1913
|
+
"no_slop.front_door_missing",
|
|
1914
|
+
);
|
|
1915
|
+
|
|
1916
|
+
const noSlopBannedReadme = writeNoSlopRoot("no-slop-banned-word-readme", {
|
|
1917
|
+
"README.md": "# Example\n\nThis tool leverages a robust workflow.\n",
|
|
1918
|
+
});
|
|
1919
|
+
runScriptArgs(
|
|
1920
|
+
"no-slop fails when the repo's own README uses a banned word",
|
|
1921
|
+
"check-no-slop.ts",
|
|
1922
|
+
["--repo-root", noSlopBannedReadme.repoRoot, "--skill-root", noSlopBannedReadme.skillRoot],
|
|
1923
|
+
1,
|
|
1924
|
+
"no_slop.banned_word",
|
|
1925
|
+
);
|
|
1926
|
+
|
|
1927
|
+
const noSlopPattern = writeNoSlopRoot("no-slop-pattern-throat-clearing", {
|
|
1928
|
+
"CONTRIBUTING.md": "# Contributing\n\nHere's the thing: open a pull request with a clear description.\n",
|
|
1929
|
+
});
|
|
1930
|
+
runScriptArgs(
|
|
1931
|
+
"no-slop fails on a mechanical slop pattern, not just banned words",
|
|
1932
|
+
"check-no-slop.ts",
|
|
1933
|
+
["--repo-root", noSlopPattern.repoRoot, "--skill-root", noSlopPattern.skillRoot],
|
|
1934
|
+
1,
|
|
1935
|
+
"no_slop.pattern.throat_clearing",
|
|
1936
|
+
);
|
|
1937
|
+
|
|
1938
|
+
const noSlopMetadiscourse = writeNoSlopRoot("no-slop-pattern-interpretive-metadiscourse", {
|
|
1939
|
+
"README.md": "# Example\n\nThe key point is that this command writes the report to disk.\n",
|
|
1940
|
+
});
|
|
1941
|
+
runScriptArgs(
|
|
1942
|
+
"no-slop fails when interpretive metadiscourse replaces direct support",
|
|
1943
|
+
"check-no-slop.ts",
|
|
1944
|
+
["--repo-root", noSlopMetadiscourse.repoRoot, "--skill-root", noSlopMetadiscourse.skillRoot],
|
|
1945
|
+
1,
|
|
1946
|
+
"no_slop.pattern.interpretive_metadiscourse",
|
|
1947
|
+
);
|
|
1948
|
+
|
|
1949
|
+
// AGENTS.md and CLAUDE.md are maintainer-only guidance: the same banned word
|
|
1950
|
+
// that fails the gate on README.md only warns here, per no-slop-writing.md
|
|
1951
|
+
// §2's own documented tier split.
|
|
1952
|
+
const noSlopBannedAgents = writeNoSlopRoot("no-slop-banned-word-agents", {
|
|
1953
|
+
"AGENTS.md": "# Agents\n\nThis skill leverages a shared runtime.\n",
|
|
1954
|
+
});
|
|
1955
|
+
runScriptArgs(
|
|
1956
|
+
"no-slop demotes the same banned word to a warning on maintainer-only docs",
|
|
1957
|
+
"check-no-slop.ts",
|
|
1958
|
+
["--repo-root", noSlopBannedAgents.repoRoot, "--skill-root", noSlopBannedAgents.skillRoot],
|
|
1959
|
+
0,
|
|
1960
|
+
"WARNING no_slop.banned_word",
|
|
1961
|
+
);
|
|
1962
|
+
|
|
1963
|
+
// Empty adverbs/phrases are documented as advisory-only in every
|
|
1964
|
+
// no-slop-rules.ts consumer, never promoted to an error even on a
|
|
1965
|
+
// public-front-door file — this is the fixture that proves it.
|
|
1966
|
+
const noSlopAdverb = writeNoSlopRoot("no-slop-empty-adverb-readme", {
|
|
1967
|
+
"README.md": "# Example\n\nThis actually just describes what the project does.\n",
|
|
1968
|
+
});
|
|
1969
|
+
runScriptArgs(
|
|
1970
|
+
"no-slop keeps an empty adverb a warning even on a public front-door file",
|
|
1971
|
+
"check-no-slop.ts",
|
|
1972
|
+
["--repo-root", noSlopAdverb.repoRoot, "--skill-root", noSlopAdverb.skillRoot],
|
|
1973
|
+
0,
|
|
1974
|
+
"WARNING no_slop.empty_adverb",
|
|
1975
|
+
);
|
|
1976
|
+
|
|
1977
|
+
// --- check-technical-docs-ste100 ---
|
|
1978
|
+
//
|
|
1979
|
+
// The mechanical subset of knowledge/engineering/technical-documentation-ste100.md: sentence
|
|
1980
|
+
// length and present-perfect tense, at two severity tiers (error on the one file the
|
|
1981
|
+
// reference can currently guarantee compliant, warning on the rest of the governed surface),
|
|
1982
|
+
// the same tier split check-no-slop.ts proves above. Every case here proves the checker can
|
|
1983
|
+
// actually fire, not just pass — a gate is only real once it has been watched to fail.
|
|
1984
|
+
runScriptArgs("ste100 passes on the shipped repo's own error-tier file", "check-technical-docs-ste100.ts", ["--skill-root", skillRoot], 0);
|
|
1985
|
+
|
|
1986
|
+
function writeSte100Root(
|
|
1987
|
+
name: string,
|
|
1988
|
+
overrides: {
|
|
1989
|
+
steFile?: string;
|
|
1990
|
+
extraKnowledgeFile?: { relative: string; content: string };
|
|
1991
|
+
readmeContent?: string;
|
|
1992
|
+
extraSkillFile?: { relative: string; content: string };
|
|
1993
|
+
} = {},
|
|
1994
|
+
): { repoRoot: string; skillRoot: string } {
|
|
1995
|
+
const root = makeEmptyFixture(name);
|
|
1996
|
+
const repoRoot = path.join(root, "repo");
|
|
1997
|
+
const fixtureSkillRoot = path.join(repoRoot, "skill", "pkg");
|
|
1998
|
+
mkdirSync(path.join(fixtureSkillRoot, "knowledge", "engineering"), { recursive: true });
|
|
1999
|
+
const steContent =
|
|
2000
|
+
overrides.steFile ??
|
|
2001
|
+
"# Technical Documentation In Simplified Technical English (ASD-STE100)\n\nThis file follows its own rule. Every sentence stays short. The checker reads this file first.\n";
|
|
2002
|
+
writeFileSync(path.join(fixtureSkillRoot, "knowledge", "engineering", "technical-documentation-ste100.md"), steContent, "utf8");
|
|
2003
|
+
if (overrides.extraKnowledgeFile) {
|
|
2004
|
+
const target = path.join(fixtureSkillRoot, "knowledge", overrides.extraKnowledgeFile.relative);
|
|
2005
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
2006
|
+
writeFileSync(target, overrides.extraKnowledgeFile.content, "utf8");
|
|
2007
|
+
}
|
|
2008
|
+
if (overrides.readmeContent) {
|
|
2009
|
+
writeFileSync(path.join(fixtureSkillRoot, "README.md"), overrides.readmeContent, "utf8");
|
|
2010
|
+
}
|
|
2011
|
+
if (overrides.extraSkillFile) {
|
|
2012
|
+
const target = path.join(fixtureSkillRoot, overrides.extraSkillFile.relative);
|
|
2013
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
2014
|
+
writeFileSync(target, overrides.extraSkillFile.content, "utf8");
|
|
2015
|
+
}
|
|
2016
|
+
return { repoRoot, skillRoot: fixtureSkillRoot };
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
const ste100Clean = writeSte100Root("ste100-clean");
|
|
2020
|
+
runScriptArgs(
|
|
2021
|
+
"ste100 passes on a synthetic clean error-tier file",
|
|
2022
|
+
"check-technical-docs-ste100.ts",
|
|
2023
|
+
["--repo-root", ste100Clean.repoRoot, "--skill-root", ste100Clean.skillRoot],
|
|
2024
|
+
0,
|
|
2025
|
+
);
|
|
2026
|
+
|
|
2027
|
+
const ste100LongSentence = writeSte100Root("ste100-long-sentence", {
|
|
2028
|
+
steFile:
|
|
2029
|
+
"# Doc\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2030
|
+
});
|
|
2031
|
+
runScriptArgs(
|
|
2032
|
+
"ste100 fails the error-tier file on a sentence over the 20-word ceiling",
|
|
2033
|
+
"check-technical-docs-ste100.ts",
|
|
2034
|
+
["--repo-root", ste100LongSentence.repoRoot, "--skill-root", ste100LongSentence.skillRoot],
|
|
2035
|
+
1,
|
|
2036
|
+
"ste100.sentence_too_long",
|
|
2037
|
+
);
|
|
2038
|
+
|
|
2039
|
+
const ste100PresentPerfect = writeSte100Root("ste100-present-perfect", {
|
|
2040
|
+
steFile: "# Doc\n\nThe validator has checked this file already.\n",
|
|
2041
|
+
});
|
|
2042
|
+
runScriptArgs(
|
|
2043
|
+
"ste100 fails the error-tier file on present-perfect tense",
|
|
2044
|
+
"check-technical-docs-ste100.ts",
|
|
2045
|
+
["--repo-root", ste100PresentPerfect.repoRoot, "--skill-root", ste100PresentPerfect.skillRoot],
|
|
2046
|
+
1,
|
|
2047
|
+
"ste100.present_perfect",
|
|
2048
|
+
);
|
|
2049
|
+
|
|
2050
|
+
// A violation in a file outside the error-tier list is real, visible signal — but a warning,
|
|
2051
|
+
// never a build failure, matching no-slop's own maintainer-tier demotion above.
|
|
2052
|
+
const ste100WarningTier = writeSte100Root("ste100-warning-tier", {
|
|
2053
|
+
extraKnowledgeFile: {
|
|
2054
|
+
relative: "product/notes.md",
|
|
2055
|
+
content:
|
|
2056
|
+
"# Notes\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2057
|
+
},
|
|
2058
|
+
});
|
|
2059
|
+
runScriptArgs(
|
|
2060
|
+
"ste100 demotes the same violation to a warning outside the error-tier file",
|
|
2061
|
+
"check-technical-docs-ste100.ts",
|
|
2062
|
+
["--repo-root", ste100WarningTier.repoRoot, "--skill-root", ste100WarningTier.skillRoot],
|
|
2063
|
+
0,
|
|
2064
|
+
"WARNING ste100.sentence_too_long",
|
|
2065
|
+
);
|
|
2066
|
+
|
|
2067
|
+
// SKILL.md is the technical router named in the STE100 trigger. README is a mixed
|
|
2068
|
+
// front-door document: no-slop owns narrative, so the 20-word scan must not cover it.
|
|
2069
|
+
const ste100SkillMd = writeSte100Root("ste100-skill-scanned", {
|
|
2070
|
+
extraSkillFile: {
|
|
2071
|
+
relative: "SKILL.md",
|
|
2072
|
+
content:
|
|
2073
|
+
"# Skill\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2074
|
+
},
|
|
2075
|
+
readmeContent:
|
|
2076
|
+
"# Package\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2077
|
+
});
|
|
2078
|
+
runScriptArgs(
|
|
2079
|
+
"ste100 scans SKILL.md named in the reference trigger line",
|
|
2080
|
+
"check-technical-docs-ste100.ts",
|
|
2081
|
+
["--repo-root", ste100SkillMd.repoRoot, "--skill-root", ste100SkillMd.skillRoot],
|
|
2082
|
+
0,
|
|
2083
|
+
"WARNING ste100.sentence_too_long [skill/pkg/SKILL.md]",
|
|
2084
|
+
);
|
|
2085
|
+
|
|
2086
|
+
// A trailing prose paragraph with no terminal punctuation used to fall off the end of the
|
|
2087
|
+
// sentence match entirely — a real gap Codex caught: an oversized or present-perfect closing
|
|
2088
|
+
// sentence passed silently as long as the file just stopped instead of ending in . ! ? or :
|
|
2089
|
+
const ste100Unterminated = writeSte100Root("ste100-unterminated-final-sentence", {
|
|
2090
|
+
steFile:
|
|
2091
|
+
"# Doc\n\nShort opening sentence here.\n\nThis closing sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces",
|
|
2092
|
+
});
|
|
2093
|
+
runScriptArgs(
|
|
2094
|
+
"ste100 still catches a violation in the final sentence when the file ends with no terminal punctuation",
|
|
2095
|
+
"check-technical-docs-ste100.ts",
|
|
2096
|
+
["--repo-root", ste100Unterminated.repoRoot, "--skill-root", ste100Unterminated.skillRoot],
|
|
2097
|
+
1,
|
|
2098
|
+
"ste100.sentence_too_long",
|
|
2099
|
+
);
|
|
2100
|
+
|
|
2101
|
+
// A colon inside a real, single grammatical sentence must NOT end the sentence-length count
|
|
2102
|
+
// early — a real gap Codex caught: this 23-word instruction splits into a 9-word half and a
|
|
2103
|
+
// 14-word half at its mid-sentence colon, and the old "colon always ends a chunk" rule let
|
|
2104
|
+
// both halves pass individually while the sentence as a whole broke the 20-word ceiling.
|
|
2105
|
+
const ste100MidSentenceColon = writeSte100Root("ste100-mid-sentence-colon", {
|
|
2106
|
+
steFile:
|
|
2107
|
+
"# Doc\n\nFollow this procedure carefully and read every step twice: open the file first, then check the value against the reference table before continuing.\n",
|
|
2108
|
+
});
|
|
2109
|
+
runScriptArgs(
|
|
2110
|
+
"ste100 keeps a mid-sentence colon inside the same sentence, not a second short one",
|
|
2111
|
+
"check-technical-docs-ste100.ts",
|
|
2112
|
+
["--repo-root", ste100MidSentenceColon.repoRoot, "--skill-root", ste100MidSentenceColon.skillRoot],
|
|
2113
|
+
1,
|
|
2114
|
+
"ste100.sentence_too_long",
|
|
2115
|
+
);
|
|
2116
|
+
|
|
2117
|
+
// The list-introducing colon exception must stay narrow: it fires only when the very next
|
|
2118
|
+
// line is a list item, never for an ordinary colon-joined sentence sitting in plain prose.
|
|
2119
|
+
const ste100ColonNoList = writeSte100Root("ste100-colon-no-list-follows", {
|
|
2120
|
+
steFile: "# Doc\n\nRead this short line: it stays one sentence.\n\nA second short paragraph follows here with no list after it at all.\n",
|
|
2121
|
+
});
|
|
2122
|
+
runScriptArgs(
|
|
2123
|
+
"ste100 passes a colon-joined sentence under the ceiling when no list follows it",
|
|
2124
|
+
"check-technical-docs-ste100.ts",
|
|
2125
|
+
["--repo-root", ste100ColonNoList.repoRoot, "--skill-root", ste100ColonNoList.skillRoot],
|
|
2126
|
+
0,
|
|
2127
|
+
);
|
|
2128
|
+
|
|
2129
|
+
// A real gap Codex caught: an active maintenance runbook (checks/validation/repository/*.md) named
|
|
2130
|
+
// by the reference's own scope ("a runbook") was outside both the hardcoded docs/ list and
|
|
2131
|
+
// the knowledge/ walk, so an edit to it got no signal at all.
|
|
2132
|
+
const ste100Runbook = writeSte100Root("ste100-runbook-scanned", {
|
|
2133
|
+
extraSkillFile: {
|
|
2134
|
+
relative: "checks/validation/repository/some-runbook.md",
|
|
2135
|
+
content:
|
|
2136
|
+
"# Some Runbook\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2137
|
+
},
|
|
2138
|
+
});
|
|
2139
|
+
runScriptArgs(
|
|
2140
|
+
"ste100 scans checks/validation/repository/, a maintainer-runbook directory outside docs/ and knowledge/",
|
|
2141
|
+
"check-technical-docs-ste100.ts",
|
|
2142
|
+
["--repo-root", ste100Runbook.repoRoot, "--skill-root", ste100Runbook.skillRoot],
|
|
2143
|
+
0,
|
|
2144
|
+
"WARNING ste100.sentence_too_long [skill/pkg/checks/validation/repository/some-runbook.md]",
|
|
2145
|
+
);
|
|
2146
|
+
|
|
2147
|
+
// A real gap Codex caught: table rows were dropped outright, so an unquoted present-perfect
|
|
2148
|
+
// sentence hiding in a table cell got no signal — even inside the error-tier reference file.
|
|
2149
|
+
const ste100TableViolation = writeSte100Root("ste100-table-cell-violation", {
|
|
2150
|
+
steFile: "# Doc\n\n| Rule | Example |\n|---|---|\n| Tense | The validator has read the file already |\n",
|
|
2151
|
+
});
|
|
2152
|
+
runScriptArgs(
|
|
2153
|
+
"ste100 now scans table cells and catches a violation hiding inside one",
|
|
2154
|
+
"check-technical-docs-ste100.ts",
|
|
2155
|
+
["--repo-root", ste100TableViolation.repoRoot, "--skill-root", ste100TableViolation.skillRoot],
|
|
2156
|
+
1,
|
|
2157
|
+
"ste100.present_perfect",
|
|
2158
|
+
);
|
|
2159
|
+
|
|
2160
|
+
// Scanning table cells must not break on this reference's own §3 table, whose "Don't"
|
|
2161
|
+
// column intentionally quotes bad examples (including a present-perfect one) to teach the
|
|
2162
|
+
// rule — a quoted example is cited text, not the document's own assertion.
|
|
2163
|
+
const ste100TableQuotedExample = writeSte100Root("ste100-table-quoted-example-exempt", {
|
|
2164
|
+
steFile: '# Doc\n\n| Rule | Don\'t |\n|---|---|\n| Tense | "The validator has read the file." |\n',
|
|
2165
|
+
});
|
|
2166
|
+
runScriptArgs(
|
|
2167
|
+
"ste100 exempts a quoted illustrative example inside a table cell from the tense rule",
|
|
2168
|
+
"check-technical-docs-ste100.ts",
|
|
2169
|
+
["--repo-root", ste100TableQuotedExample.repoRoot, "--skill-root", ste100TableQuotedExample.skillRoot],
|
|
2170
|
+
0,
|
|
2171
|
+
);
|
|
2172
|
+
|
|
2173
|
+
// A real gap Codex caught (originally via a platform ADR, since moved out with the platform):
|
|
2174
|
+
// a governed doc named only in the repo-root allowlist — not under the knowledge/ walk — must
|
|
2175
|
+
// really be scanned, or an edit to it gets no signal despite the repo policy governing it.
|
|
2176
|
+
const ste100Adr = writeSte100Root("ste100-adr-scanned");
|
|
2177
|
+
mkdirSync(path.join(ste100Adr.repoRoot, "docs", "implementation"), { recursive: true });
|
|
2178
|
+
writeFileSync(
|
|
2179
|
+
path.join(ste100Adr.repoRoot, "docs", "implementation", "graph-execution-v2.md"),
|
|
2180
|
+
"# Graph Execution\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2181
|
+
"utf8",
|
|
2182
|
+
);
|
|
2183
|
+
runScriptArgs(
|
|
2184
|
+
"ste100 scans a doc named only in the repo-root allowlist (not found by the knowledge walk)",
|
|
2185
|
+
"check-technical-docs-ste100.ts",
|
|
2186
|
+
["--repo-root", ste100Adr.repoRoot, "--skill-root", ste100Adr.skillRoot],
|
|
2187
|
+
0,
|
|
2188
|
+
"WARNING ste100.sentence_too_long [docs/implementation/graph-execution-v2.md]",
|
|
2189
|
+
);
|
|
2190
|
+
|
|
2191
|
+
// A real gap Codex caught: the prior blanket double-quote strip erased ANY quoted span before
|
|
2192
|
+
// grading, not just a whole-cell illustrative example — so an ordinary quoted UI string or
|
|
2193
|
+
// error message sitting inside real prose lost its own violation along with its quote marks.
|
|
2194
|
+
// A quoted span in plain prose is the author's own sentence, not a cited example, and must
|
|
2195
|
+
// stay fully counted.
|
|
2196
|
+
const ste100QuotedProseViolation = writeSte100Root("ste100-quoted-prose-still-counted", {
|
|
2197
|
+
steFile: '# Doc\n\nThe tooltip literally says "the validator has confirmed this already" every time it runs.\n',
|
|
2198
|
+
});
|
|
2199
|
+
runScriptArgs(
|
|
2200
|
+
"ste100 still catches present-perfect tense hiding inside a quoted phrase in plain prose",
|
|
2201
|
+
"check-technical-docs-ste100.ts",
|
|
2202
|
+
["--repo-root", ste100QuotedProseViolation.repoRoot, "--skill-root", ste100QuotedProseViolation.skillRoot],
|
|
2203
|
+
1,
|
|
2204
|
+
"ste100.present_perfect",
|
|
2205
|
+
);
|
|
2206
|
+
|
|
2207
|
+
// The table-cell exemption is narrow on purpose: it drops a cell only when the ENTIRE trimmed
|
|
2208
|
+
// cell is one quoted string. A cell that merely contains a quote alongside other text is not
|
|
2209
|
+
// an illustrative example — it is prose with a quote in it — and must stay fully counted.
|
|
2210
|
+
const ste100PartialQuoteInCell = writeSte100Root("ste100-partial-quote-in-cell-counted", {
|
|
2211
|
+
steFile: '# Doc\n\n| Rule | Example |\n|---|---|\n| Tense | Example: "the validator has confirmed this" already |\n',
|
|
2212
|
+
});
|
|
2213
|
+
runScriptArgs(
|
|
2214
|
+
"ste100 still catches a violation in a table cell whose quote is partial, not whole-cell",
|
|
2215
|
+
"check-technical-docs-ste100.ts",
|
|
2216
|
+
["--repo-root", ste100PartialQuoteInCell.repoRoot, "--skill-root", ste100PartialQuoteInCell.skillRoot],
|
|
2217
|
+
1,
|
|
2218
|
+
"ste100.present_perfect",
|
|
2219
|
+
);
|
|
2220
|
+
|
|
2221
|
+
// A real gap Codex caught: docs/implementation/graph-execution-v2.md, the current guide for
|
|
2222
|
+
// the graph compiler, durable runtime, scheduler, and verification boundary (named as such
|
|
2223
|
+
// by docs/implementation/README.md), was outside the hardcoded docs/ list.
|
|
2224
|
+
const ste100GraphExecutionGuide = writeSte100Root("ste100-graph-execution-guide-scanned");
|
|
2225
|
+
mkdirSync(path.join(ste100GraphExecutionGuide.repoRoot, "docs", "implementation"), { recursive: true });
|
|
2226
|
+
writeFileSync(
|
|
2227
|
+
path.join(ste100GraphExecutionGuide.repoRoot, "docs", "implementation", "graph-execution-v2.md"),
|
|
2228
|
+
"# Graph Execution V2\n\nThis sentence intentionally runs on for quite a long while with many extra words strung together well past the twenty word ceiling this rule enforces.\n",
|
|
2229
|
+
"utf8",
|
|
2230
|
+
);
|
|
2231
|
+
runScriptArgs(
|
|
2232
|
+
"ste100 scans docs/implementation/graph-execution-v2.md, the current graph-compiler guide",
|
|
2233
|
+
"check-technical-docs-ste100.ts",
|
|
2234
|
+
["--repo-root", ste100GraphExecutionGuide.repoRoot, "--skill-root", ste100GraphExecutionGuide.skillRoot],
|
|
2235
|
+
0,
|
|
2236
|
+
"WARNING ste100.sentence_too_long [docs/implementation/graph-execution-v2.md]",
|
|
2237
|
+
);
|
|
2238
|
+
|
|
2239
|
+
// A real gap Codex caught: the sentence-splitting regex reads every period as a boundary,
|
|
2240
|
+
// including the two inside "e.g." — so a real sentence over the word ceiling could pass by
|
|
2241
|
+
// fragmenting into short-looking pieces at an abbreviation. This 24-word sentence splits
|
|
2242
|
+
// into three fragments of 14, 1, and 10 words at "e.g." without the fix, none over the
|
|
2243
|
+
// ceiling; with the fix it stays one sentence and is caught.
|
|
2244
|
+
const ste100AbbreviationPeriod = writeSte100Root("ste100-abbreviation-period-not-a-boundary", {
|
|
2245
|
+
steFile:
|
|
2246
|
+
"# Doc\n\nPick the canonical product name once and reuse it everywhere across every screen, e.g. onboarding, paywall, and email subjects, without ever renaming it again.\n",
|
|
2247
|
+
});
|
|
2248
|
+
runScriptArgs(
|
|
2249
|
+
"ste100 does not let e.g. fragment a real sentence into short-looking pieces under the ceiling",
|
|
2250
|
+
"check-technical-docs-ste100.ts",
|
|
2251
|
+
["--repo-root", ste100AbbreviationPeriod.repoRoot, "--skill-root", ste100AbbreviationPeriod.skillRoot],
|
|
2252
|
+
1,
|
|
2253
|
+
"ste100.sentence_too_long",
|
|
2254
|
+
);
|
|
2255
|
+
|
|
2256
|
+
// A decimal or version-number period ("v0.114.0") must not be read as a sentence boundary
|
|
2257
|
+
// either — the same class of bug, a different period shape.
|
|
2258
|
+
const ste100VersionNumberPeriod = writeSte100Root("ste100-version-number-period-not-a-boundary", {
|
|
2259
|
+
steFile: "# Doc\n\nThe fixture suite runs clean against release v0.114.0 and every prior tagged release before it, including the ones from last quarter.\n",
|
|
2260
|
+
});
|
|
2261
|
+
runScriptArgs(
|
|
2262
|
+
"ste100 does not let a version-number period fragment a real sentence into short-looking pieces",
|
|
2263
|
+
"check-technical-docs-ste100.ts",
|
|
2264
|
+
["--repo-root", ste100VersionNumberPeriod.repoRoot, "--skill-root", ste100VersionNumberPeriod.skillRoot],
|
|
2265
|
+
1,
|
|
2266
|
+
"ste100.sentence_too_long",
|
|
2267
|
+
);
|
|
2268
|
+
|
|
2269
|
+
// A real gap Codex caught: the list-item marker ("-", "1.", "- [ ]") was left in place before
|
|
2270
|
+
// counting words, so it counted as a word itself -- a genuinely compliant 20-word bullet was
|
|
2271
|
+
// reported as 21 and failed. This exact bullet is 20 words without its marker.
|
|
2272
|
+
const ste100ListMarkerNotAWord = writeSte100Root("ste100-list-marker-not-a-word", {
|
|
2273
|
+
steFile:
|
|
2274
|
+
"# Doc\n\n- One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty.\n",
|
|
2275
|
+
});
|
|
2276
|
+
runScriptArgs(
|
|
2277
|
+
"ste100 does not count a bullet's own marker as one of its words",
|
|
2278
|
+
"check-technical-docs-ste100.ts",
|
|
2279
|
+
["--repo-root", ste100ListMarkerNotAWord.repoRoot, "--skill-root", ste100ListMarkerNotAWord.skillRoot],
|
|
2280
|
+
0,
|
|
2281
|
+
);
|
|
2282
|
+
|
|
2283
|
+
// Same bug, the GFM task-list shape: the checkbox ("[ ]"/"[x]") is formatting too, and must
|
|
2284
|
+
// not inflate the count either.
|
|
2285
|
+
const ste100TaskListCheckboxNotAWord = writeSte100Root("ste100-task-list-checkbox-not-a-word", {
|
|
2286
|
+
steFile:
|
|
2287
|
+
"# Doc\n\n- [ ] One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty.\n",
|
|
2288
|
+
});
|
|
2289
|
+
runScriptArgs(
|
|
2290
|
+
"ste100 does not count a task-list checkbox as one of its bullet's words",
|
|
2291
|
+
"check-technical-docs-ste100.ts",
|
|
2292
|
+
["--repo-root", ste100TaskListCheckboxNotAWord.repoRoot, "--skill-root", ste100TaskListCheckboxNotAWord.skillRoot],
|
|
2293
|
+
0,
|
|
2294
|
+
);
|
|
2295
|
+
|
|
2296
|
+
// Stripping the marker must not blind the checker to a real violation: this bullet is 21
|
|
2297
|
+
// words even with its marker removed.
|
|
2298
|
+
const ste100ListMarkerStillCatchesReal = writeSte100Root("ste100-list-marker-strip-still-catches-real-violation", {
|
|
2299
|
+
steFile:
|
|
2300
|
+
"# Doc\n\n- One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone.\n",
|
|
2301
|
+
});
|
|
2302
|
+
runScriptArgs(
|
|
2303
|
+
"ste100 still catches a real violation in a bullet after stripping its marker",
|
|
2304
|
+
"check-technical-docs-ste100.ts",
|
|
2305
|
+
["--repo-root", ste100ListMarkerStillCatchesReal.repoRoot, "--skill-root", ste100ListMarkerStillCatchesReal.skillRoot],
|
|
2306
|
+
1,
|
|
2307
|
+
"ste100.sentence_too_long",
|
|
2308
|
+
);
|
|
2309
|
+
|
|
2310
|
+
// A real gap Codex caught: the abbreviation-period fix from the previous round protected the
|
|
2311
|
+
// period whenever whitespace followed, even when that period was ALSO the end of its own
|
|
2312
|
+
// sentence -- so two independent, individually compliant sentences ("Use the standard
|
|
2313
|
+
// process, etc." + a fresh 16-word sentence) merged into one 21-word blob and produced a
|
|
2314
|
+
// false violation. Each half is under the ceiling alone; only the false merge is over it.
|
|
2315
|
+
const ste100AbbreviationSentenceFinal = writeSte100Root("ste100-abbreviation-sentence-final-still-a-boundary", {
|
|
2316
|
+
steFile:
|
|
2317
|
+
"# Doc\n\nUse the standard process, etc. Read the next instruction that follows immediately after this one very carefully every single time now.\n",
|
|
2318
|
+
});
|
|
2319
|
+
runScriptArgs(
|
|
2320
|
+
"ste100 keeps a sentence-final abbreviation period as a real boundary, not a false merge",
|
|
2321
|
+
"check-technical-docs-ste100.ts",
|
|
2322
|
+
["--repo-root", ste100AbbreviationSentenceFinal.repoRoot, "--skill-root", ste100AbbreviationSentenceFinal.skillRoot],
|
|
2323
|
+
0,
|
|
2324
|
+
);
|
|
2325
|
+
|
|
2326
|
+
// The sentence-final fix must not reopen the mid-sentence bug the previous round fixed: an
|
|
2327
|
+
// abbreviation followed by a lowercase continuation must still protect its period.
|
|
2328
|
+
const ste100AbbreviationMidSentenceStillProtected = writeSte100Root("ste100-abbreviation-mid-sentence-still-protected", {
|
|
2329
|
+
steFile:
|
|
2330
|
+
"# Doc\n\nPick the canonical product name once and reuse it everywhere across every screen, e.g. onboarding, paywall, and email subjects, without ever renaming it again.\n",
|
|
2331
|
+
});
|
|
2332
|
+
runScriptArgs(
|
|
2333
|
+
"ste100 still protects a mid-sentence abbreviation period followed by a lowercase continuation",
|
|
2334
|
+
"check-technical-docs-ste100.ts",
|
|
2335
|
+
["--repo-root", ste100AbbreviationMidSentenceStillProtected.repoRoot, "--skill-root", ste100AbbreviationMidSentenceStillProtected.skillRoot],
|
|
2336
|
+
1,
|
|
2337
|
+
"ste100.sentence_too_long",
|
|
2338
|
+
);
|
|
2339
|
+
|
|
2340
|
+
// A real gap Codex caught, grounded in this repo's own knowledge/engineering/backend-data-
|
|
2341
|
+
// contract.md ("a migration tool (e.g. Prisma Migrate, Alembic, node-pg-migrate) in the
|
|
2342
|
+
// contract"): the previous round's lowercase-only check assumed a capitalized continuation
|
|
2343
|
+
// always starts a new sentence, but "e.g." is routinely followed by a capitalized product
|
|
2344
|
+
// name mid-sentence. Only "etc." keeps the lowercase-only check; "e.g." and its siblings are
|
|
2345
|
+
// protected unconditionally.
|
|
2346
|
+
const ste100AbbreviationBeforeCapitalizedTerm = writeSte100Root("ste100-abbreviation-before-capitalized-term-still-protected", {
|
|
2347
|
+
steFile:
|
|
2348
|
+
"# Doc\n\nUse supported databases, e.g. PostgreSQL, MySQL, SQLite, or another relational engine your team already knows well from a prior production deployment.\n",
|
|
2349
|
+
});
|
|
2350
|
+
runScriptArgs(
|
|
2351
|
+
"ste100 still protects e.g. even when a capitalized product name follows it",
|
|
2352
|
+
"check-technical-docs-ste100.ts",
|
|
2353
|
+
["--repo-root", ste100AbbreviationBeforeCapitalizedTerm.repoRoot, "--skill-root", ste100AbbreviationBeforeCapitalizedTerm.skillRoot],
|
|
2354
|
+
1,
|
|
2355
|
+
"ste100.sentence_too_long",
|
|
2356
|
+
);
|
|
2357
|
+
|
|
2358
|
+
// A real gap Codex caught: "+" is a valid CommonMark unordered-list marker alongside "-" and
|
|
2359
|
+
// "*", but the marker pattern only recognized the other two -- a compliant 20-word "+" bullet
|
|
2360
|
+
// was left undetected as a list item at all, so its marker counted as an extra word (21) and
|
|
2361
|
+
// it also never got a forced sentence boundary.
|
|
2362
|
+
const ste100PlusMarkerNotAWord = writeSte100Root("ste100-plus-list-marker-not-a-word", {
|
|
2363
|
+
steFile:
|
|
2364
|
+
"# Doc\n\n+ One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty.\n",
|
|
2365
|
+
});
|
|
2366
|
+
runScriptArgs(
|
|
2367
|
+
"ste100 does not count a + bullet's own marker as one of its words",
|
|
2368
|
+
"check-technical-docs-ste100.ts",
|
|
2369
|
+
["--repo-root", ste100PlusMarkerNotAWord.repoRoot, "--skill-root", ste100PlusMarkerNotAWord.skillRoot],
|
|
2370
|
+
0,
|
|
2371
|
+
);
|
|
2372
|
+
|
|
2373
|
+
// Recognizing "+" as a marker must not blind the checker to a real violation in a "+" bullet.
|
|
2374
|
+
const ste100PlusMarkerStillCatchesReal = writeSte100Root("ste100-plus-list-marker-still-catches-real-violation", {
|
|
2375
|
+
steFile:
|
|
2376
|
+
"# Doc\n\n+ One two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone.\n",
|
|
2377
|
+
});
|
|
2378
|
+
runScriptArgs(
|
|
2379
|
+
"ste100 still catches a real violation in a + bullet after stripping its marker",
|
|
2380
|
+
"check-technical-docs-ste100.ts",
|
|
2381
|
+
["--repo-root", ste100PlusMarkerStillCatchesReal.repoRoot, "--skill-root", ste100PlusMarkerStillCatchesReal.skillRoot],
|
|
2382
|
+
1,
|
|
2383
|
+
"ste100.sentence_too_long",
|
|
2384
|
+
);
|
|
2385
|
+
|
|
2386
|
+
// A real gap Codex caught: a list item that wraps onto a following physical line (no blank
|
|
2387
|
+
// line between) is one logical sentence, but each physical line got its own forced boundary,
|
|
2388
|
+
// so a real over-ceiling instruction could hide by fragmenting across its own soft wrap.
|
|
2389
|
+
const ste100WrappedListContinuation = writeSte100Root("ste100-wrapped-list-continuation-stays-one-sentence", {
|
|
2390
|
+
steFile:
|
|
2391
|
+
"# Doc\n\n- This instruction wraps onto a second physical line before its own terminal\n punctuation lands, which pushes the true combined word count well past the limit.\n",
|
|
2392
|
+
});
|
|
2393
|
+
runScriptArgs(
|
|
2394
|
+
"ste100 keeps a wrapped list continuation as one sentence and catches a violation split across it",
|
|
2395
|
+
"check-technical-docs-ste100.ts",
|
|
2396
|
+
["--repo-root", ste100WrappedListContinuation.repoRoot, "--skill-root", ste100WrappedListContinuation.skillRoot],
|
|
2397
|
+
1,
|
|
2398
|
+
"ste100.sentence_too_long",
|
|
2399
|
+
);
|
|
2400
|
+
|
|
2401
|
+
// Grouping continuations must not merge across a genuine paragraph break: a blank line, or a
|
|
2402
|
+
// following line that is itself a new list item, table row, or heading, must start fresh. Each
|
|
2403
|
+
// half here is a compliant 12 words; merged across the blank line they would be 24 -- over the
|
|
2404
|
+
// ceiling -- so an incorrect merge is directly visible as a false violation.
|
|
2405
|
+
const ste100ListContinuationStopsAtBlankLine = writeSte100Root("ste100-list-continuation-stops-at-blank-line", {
|
|
2406
|
+
steFile:
|
|
2407
|
+
"# Doc\n\n- One two three four five six seven eight nine ten eleven twelve.\n\nAlpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu.\n",
|
|
2408
|
+
});
|
|
2409
|
+
runScriptArgs(
|
|
2410
|
+
"ste100 does not merge a list item with an unrelated paragraph across a blank line",
|
|
2411
|
+
"check-technical-docs-ste100.ts",
|
|
2412
|
+
["--repo-root", ste100ListContinuationStopsAtBlankLine.repoRoot, "--skill-root", ste100ListContinuationStopsAtBlankLine.skillRoot],
|
|
2413
|
+
0,
|
|
2414
|
+
);
|
|
2415
|
+
|
|
2416
|
+
// A real gap Codex caught: the previous round's continuation grouping required the follow-on
|
|
2417
|
+
// line to be indented, but CommonMark's "lazy continuation" rule counts an UNindented follow-on
|
|
2418
|
+
// line (no blank line before it) as part of the same list item too. This bullet's second line
|
|
2419
|
+
// has no leading whitespace at all.
|
|
2420
|
+
const ste100UnindentedLazyContinuation = writeSte100Root("ste100-unindented-lazy-continuation-stays-one-sentence", {
|
|
2421
|
+
steFile:
|
|
2422
|
+
"# Doc\n\n- This instruction wraps onto a second physical line before its own terminal\npunctuation lands, which pushes the true combined word count well past the limit.\n",
|
|
2423
|
+
});
|
|
2424
|
+
runScriptArgs(
|
|
2425
|
+
"ste100 keeps an unindented lazy list continuation as one sentence and catches a violation split across it",
|
|
2426
|
+
"check-technical-docs-ste100.ts",
|
|
2427
|
+
["--repo-root", ste100UnindentedLazyContinuation.repoRoot, "--skill-root", ste100UnindentedLazyContinuation.skillRoot],
|
|
2428
|
+
1,
|
|
2429
|
+
"ste100.sentence_too_long",
|
|
2430
|
+
);
|
|
2431
|
+
|
|
2432
|
+
// A real gap Codex caught: the present-perfect heuristic only recognized five hard-coded
|
|
2433
|
+
// intervening modifiers (not/never/already/just/recently), so any other adverb between the
|
|
2434
|
+
// auxiliary and the participle -- "successfully" here -- let a present-perfect sentence pass
|
|
2435
|
+
// undetected, even in the error-tier reference itself.
|
|
2436
|
+
const ste100AdverbInPresentPerfect = writeSte100Root("ste100-adverb-in-present-perfect-still-caught", {
|
|
2437
|
+
steFile: "# Doc\n\nThe validator has successfully checked the file against every governed rule today.\n",
|
|
2438
|
+
});
|
|
2439
|
+
runScriptArgs(
|
|
2440
|
+
"ste100 still catches present-perfect tense with a general adverb between auxiliary and participle",
|
|
2441
|
+
"check-technical-docs-ste100.ts",
|
|
2442
|
+
["--repo-root", ste100AdverbInPresentPerfect.repoRoot, "--skill-root", ste100AdverbInPresentPerfect.skillRoot],
|
|
2443
|
+
1,
|
|
2444
|
+
"ste100.present_perfect",
|
|
2445
|
+
);
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
function git(root: string, args: string[]): void {
|
|
2449
|
+
const result = spawnSync("git", ["-C", root, "-c", "core.excludesfile=", ...args], { encoding: "utf8" });
|
|
2450
|
+
if (result.status !== 0) throw new Error(`Git fixture setup failed: ${result.stderr}`);
|
|
2451
|
+
}
|