@bongos/core 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +5727 -0
- package/.claude/skills/blocker-review/SKILL.md +91 -0
- package/.claude/skills/blocker-solve/SKILL.md +96 -0
- package/.claude/skills/builder-backup/SKILL.md +54 -0
- package/.claude/skills/builder-box/SKILL.md +45 -0
- package/.claude/skills/builder-claim/SKILL.md +76 -0
- package/.claude/skills/builder-connect/SKILL.md +59 -0
- package/.claude/skills/builder-cost/SKILL.md +47 -0
- package/.claude/skills/builder-end/SKILL.md +81 -0
- package/.claude/skills/builder-exit/SKILL.md +88 -0
- package/.claude/skills/builder-key/SKILL.md +40 -0
- package/.claude/skills/builder-reauth/SKILL.md +50 -0
- package/.claude/skills/builder-redteam/SKILL.md +109 -0
- package/.claude/skills/builder-release/SKILL.md +41 -0
- package/.claude/skills/builder-setup/SKILL.md +62 -0
- package/.claude/skills/builder-ship/SKILL.md +79 -0
- package/.claude/skills/builder-stage/SKILL.md +51 -0
- package/.claude/skills/builder-start/SKILL.md +46 -0
- package/.claude/skills/close-box/SKILL.md +43 -0
- package/.claude/skills/design-sync/SKILL.md +69 -0
- package/.claude/skills/dev/SKILL.md +49 -0
- package/.claude/skills/feedback/SKILL.md +32 -0
- package/.claude/skills/figma-design-sync/SKILL.md +74 -0
- package/.claude/skills/goal-review/SKILL.md +89 -0
- package/.claude/skills/idea-triage/SKILL.md +144 -0
- package/.claude/skills/ideate/SKILL.md +82 -0
- package/.claude/skills/merge-mode/SKILL.md +169 -0
- package/.claude/skills/new-project/SKILL.md +108 -0
- package/.claude/skills/otb-character-review/SKILL.md +71 -0
- package/.claude/skills/otb-design-review/SKILL.md +47 -0
- package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
- package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
- package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
- package/.claude/skills/paint/SKILL.md +70 -0
- package/.claude/skills/planning-session/SKILL.md +299 -0
- package/.claude/skills/priority-session/SKILL.md +134 -0
- package/.claude/skills/read-session-export/SKILL.md +58 -0
- package/.claude/skills/recall/SKILL.md +52 -0
- package/.claude/skills/session-handoff/SKILL.md +46 -0
- package/.claude/skills/status/SKILL.md +33 -0
- package/.devcontainer/Dockerfile +69 -0
- package/.devcontainer/README.md +73 -0
- package/.devcontainer/devcontainer-lock.json +19 -0
- package/.devcontainer/devcontainer.json +93 -0
- package/.devcontainer/healthcheck.sh +84 -0
- package/.devcontainer/init-firewall.sh +198 -0
- package/.devcontainer/post-create.sh +153 -0
- package/.dockerignore +36 -0
- package/.env.local.example +32 -0
- package/.gitattributes +83 -0
- package/.gitignore +91 -0
- package/CLAUDE.md +242 -0
- package/CODE_OF_CONDUCT.md +46 -0
- package/CONTRIBUTING.md +51 -0
- package/Dockerfile +46 -0
- package/GOVERNANCE.md +44 -0
- package/LICENSE +661 -0
- package/README.md +88 -0
- package/bin/bongos.js +222 -0
- package/clients/bongos-client/README.md +48 -0
- package/clients/bongos-client/bongos-client.global.js +617 -0
- package/clients/bongos-client/examples/hello-world.mjs +62 -0
- package/clients/bongos-client/index.cjs +619 -0
- package/clients/bongos-client/index.d.ts +793 -0
- package/clients/bongos-client/index.mjs +614 -0
- package/clients/bongos-client/package.json +32 -0
- package/config/branding.neutral.json +60 -0
- package/config/design-tokens.neutral.json +51 -0
- package/config/design-tokens.schema.json +96 -0
- package/config/modules.neutral.json +9 -0
- package/docker-compose.yml +52 -0
- package/docker-entrypoint.sh +30 -0
- package/docs/adr/0001-stack-choice-single-vps.md +45 -0
- package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
- package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
- package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
- package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
- package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
- package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
- package/docs/adr/0008-family-based-tile-generation.md +86 -0
- package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
- package/docs/adr/0009-autotile-architecture.md +181 -0
- package/docs/adr/0010-pms-architecture.md +70 -0
- package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
- package/docs/adr/0012-ground-object-cell-split.md +208 -0
- package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
- package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
- package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
- package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
- package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
- package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
- package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
- package/docs/adr/0020-security-model-public-stub.md +70 -0
- package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
- package/docs/adr/0022-secrets-policy.md +124 -0
- package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
- package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
- package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
- package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
- package/docs/adr/0025-structured-criterion-task-link.md +44 -0
- package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
- package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
- package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
- package/docs/adr/0029-status-page-outage-resilience.md +59 -0
- package/docs/adr/0030-builders-hall-live-updates.md +59 -0
- package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
- package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
- package/docs/adr/0033-discord-bot-service-principal.md +82 -0
- package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
- package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
- package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
- package/docs/adr/0037-discord-channel-management.md +51 -0
- package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
- package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
- package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
- package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
- package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
- package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
- package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
- package/docs/adr/0044-per-box-live-game-preview.md +57 -0
- package/docs/adr/0045-devbox-desktop-app.md +133 -0
- package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
- package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
- package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
- package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
- package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
- package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
- package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
- package/docs/adr/0053-scoped-dev-box-session.md +55 -0
- package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
- package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
- package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
- package/docs/adr/0057-container-cost-ledger.md +28 -0
- package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
- package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
- package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
- package/docs/adr/0060-gds-retrieval-layer.md +97 -0
- package/docs/adr/0061-context-layer-decomposition.md +61 -0
- package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
- package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
- package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
- package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
- package/docs/adr/0066-generated-file-map-sections.md +51 -0
- package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
- package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
- package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
- package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
- package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
- package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
- package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
- package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
- package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
- package/docs/adr/0074-memory-map-stays-light.md +32 -0
- package/docs/adr/0075-per-system-cost-attribution.md +37 -0
- package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
- package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
- package/docs/adr/0078-deterministic-first-cron.md +48 -0
- package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
- package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
- package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
- package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
- package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
- package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
- package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
- package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
- package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
- package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
- package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
- package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
- package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
- package/docs/adr/0090-metic-task-authoring.md +73 -0
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
- package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
- package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
- package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
- package/docs/adr/0095-cross-agent-context-management.md +58 -0
- package/docs/adr/0096-require-reward-before-workable.md +209 -0
- package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
- package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
- package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
- package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
- package/docs/adr/0100-two-repo-instance-model.md +60 -0
- package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
- package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
- package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
- package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
- package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
- package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
- package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
- package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
- package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
- package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
- package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
- package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
- package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
- package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
- package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
- package/docs/adr/0115-scheduled-routines-portability.md +31 -0
- package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
- package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
- package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
- package/docs/adr/0119-api-pagination-contract.md +34 -0
- package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
- package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
- package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
- package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
- package/docs/adr/0124-typed-api-response-bodies.md +37 -0
- package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
- package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
- package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
- package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
- package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
- package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
- package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
- package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
- package/docs/adr/0134-private-first-npm-distribution.md +38 -0
- package/docs/adr/README.md +208 -0
- package/docs/api/openapi.json +13720 -0
- package/docs/api-reference.md +437 -0
- package/docs/architecture.md +244 -0
- package/docs/branding-contract.md +66 -0
- package/docs/branding-fill-prompt.md +25 -0
- package/docs/canonical-permissions.md +241 -0
- package/docs/design/container-exterior-tiles.md +49 -0
- package/docs/design/container-exterior.md +81 -0
- package/docs/design/container-interior.md +77 -0
- package/docs/design/modular-architecture/00-research-report.md +107 -0
- package/docs/design/modular-architecture/01-architecture.md +125 -0
- package/docs/design/modular-architecture/02-module-map.md +116 -0
- package/docs/design/modular-architecture/03-builder-flows.md +104 -0
- package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
- package/docs/design/modular-architecture/README.md +27 -0
- package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
- package/docs/design/world-map-scroll.md +41 -0
- package/docs/design-contract.md +320 -0
- package/docs/file-map.md +418 -0
- package/docs/handoff-template.md +92 -0
- package/docs/modules-contract.md +293 -0
- package/docs/onboarding/browser-terminal-guide.md +73 -0
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
- package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
- package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
- package/docs/onboarding/diagrams/README.md +94 -0
- package/docs/onboarding/diagrams/assertions.json +170 -0
- package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
- package/docs/onboarding/diagrams/render-config.json +9 -0
- package/docs/onboarding/drachmae-and-karma.md +178 -0
- package/docs/onboarding/primer.md +202 -0
- package/docs/project-context.template.md +67 -0
- package/docs/recipes/README.md +35 -0
- package/docs/recipes/audit-replay.md +100 -0
- package/docs/recipes/bongos-cli-release.md +66 -0
- package/docs/recipes/builder-box-lifecycle.md +152 -0
- package/docs/recipes/claude-design-loop.md +143 -0
- package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
- package/docs/recipes/cloudbongos-staging-gate.md +139 -0
- package/docs/recipes/cloudbongos-standup.md +111 -0
- package/docs/recipes/devbox-app-release.md +93 -0
- package/docs/recipes/devbox-app-windows-test.md +128 -0
- package/docs/recipes/failed-ship-recovery-proof.md +102 -0
- package/docs/recipes/figma-design-loop.md +129 -0
- package/docs/recipes/gds-db-backup.md +255 -0
- package/docs/recipes/instance-deploy.md +37 -0
- package/docs/recipes/managed-settings-remote-control.md +416 -0
- package/docs/recipes/memory-backup.md +71 -0
- package/docs/recipes/memory-sync-conflicts.md +98 -0
- package/docs/recipes/multi-builder-merge.md +78 -0
- package/docs/recipes/ops-gotchas.md +212 -0
- package/docs/recipes/overnight-builder.md +53 -0
- package/docs/recipes/packaging-the-core.md +49 -0
- package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
- package/docs/recipes/parallel-load-test.md +32 -0
- package/docs/recipes/pixel-art-pipeline.md +411 -0
- package/docs/recipes/private-npm-distribution.md +79 -0
- package/docs/recipes/search-index-ingestion.md +67 -0
- package/docs/recipes/self-host.md +60 -0
- package/docs/recipes/ship-and-regrade.md +72 -0
- package/docs/recipes/staging-data.md +50 -0
- package/docs/recipes/staging-environment.md +215 -0
- package/docs/recipes/upgrading-the-core.md +58 -0
- package/docs/research/cursor-competitive-analysis.md +255 -0
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
- package/migrations/003_pms.sql +284 -0
- package/migrations/004_pms_cost_idempotency.sql +13 -0
- package/migrations/005_pms_smoke_filter.sql +44 -0
- package/migrations/006_pms_v2.sql +378 -0
- package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
- package/migrations/008_pms_v2_migration_allocator.sql +27 -0
- package/migrations/009_pms_v2_blockers_table.sql +68 -0
- package/migrations/010_uptime.sql +29 -0
- package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
- package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
- package/migrations/013_claim_locking.sql +22 -0
- package/migrations/014_pms_task_discipline.sql +86 -0
- package/migrations/015_pms_estimation_calibration.sql +140 -0
- package/migrations/016_pms_task_grades.sql +60 -0
- package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
- package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
- package/migrations/020_task_dependencies.sql +99 -0
- package/migrations/021_v3_renumber_and_deps.sql +224 -0
- package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
- package/migrations/023_pms_rank.sql +30 -0
- package/migrations/025_builder_exit_status.sql +15 -0
- package/migrations/027_builders_preferred_disciplines.sql +46 -0
- package/migrations/028_tasks_parallel_safe.sql +71 -0
- package/migrations/029_rank_three_live.sql +32 -0
- package/migrations/030_vulnerability_reports.sql +61 -0
- package/migrations/031_reward_simplification.sql +57 -0
- package/migrations/032_repo_health_snapshots.sql +56 -0
- package/migrations/033_audit_log.sql +64 -0
- package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
- package/migrations/035_auth_token_hygiene.sql +66 -0
- package/migrations/037_builder_skill_model_prefs.sql +44 -0
- package/migrations/038_task_override_requests.sql +51 -0
- package/migrations/039_newcomer_friendly_column.sql +124 -0
- package/migrations/040_builder_karma.sql +58 -0
- package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
- package/migrations/042_criterion_proposal_workflow.sql +78 -0
- package/migrations/043_builder_onboarding_observability.sql +66 -0
- package/migrations/044_tasks_requires_rank.sql +97 -0
- package/migrations/045_builder_onboarding_state.sql +147 -0
- package/migrations/046_cost_log_builder_attribution.sql +42 -0
- package/migrations/054_builder_memory.sql +108 -0
- package/migrations/055_task_criteria.sql +90 -0
- package/migrations/058_peer_votes.sql +41 -0
- package/migrations/059_onboarding_pick_disciplines.sql +59 -0
- package/migrations/060_access_requests.sql +46 -0
- package/migrations/061_backfill_override_ship_attribution.sql +29 -0
- package/migrations/062_session_records.sql +34 -0
- package/migrations/063_session_records_tool_errors_idx.sql +11 -0
- package/migrations/064_grade_attempts.sql +18 -0
- package/migrations/065_bfg_principal.sql +58 -0
- package/migrations/066_live_notify_triggers.sql +69 -0
- package/migrations/067_builder_boxes.sql +117 -0
- package/migrations/067_discord_bot_foundation.sql +69 -0
- package/migrations/068_thetes_requires_rank.sql +27 -0
- package/migrations/069_builder_ssh_keys.sql +66 -0
- package/migrations/070_box_intents.sql +101 -0
- package/migrations/071_box_first_provision_approval.sql +46 -0
- package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
- package/migrations/073_box_terminal_access.sql +46 -0
- package/migrations/075_builder_sound_prefs.sql +28 -0
- package/migrations/078_box_claude_active.sql +22 -0
- package/migrations/079_box_first_connected_at.sql +20 -0
- package/migrations/081_tasks_needs_migration.sql +34 -0
- package/migrations/084_tasks_security_sensitive.sql +24 -0
- package/migrations/085_security_engagement_docs.sql +34 -0
- package/migrations/086_rename_disciplines.sql +125 -0
- package/migrations/088_builders_anthropic_link.sql +28 -0
- package/migrations/089_builders_monthly_budget.sql +19 -0
- package/migrations/090_box_scoped_sessions.sql +38 -0
- package/migrations/091_session_token_reward.sql +44 -0
- package/migrations/093_tasks_sandbox_review.sql +22 -0
- package/migrations/102_remove_box_first_provision_approval.sql +58 -0
- package/migrations/103_search_chunks.sql +90 -0
- package/migrations/104_builder_box_blocked.sql +34 -0
- package/migrations/105_box_host_keys.sql +35 -0
- package/migrations/111_medusa_customer0_framing.sql +35 -0
- package/migrations/112_drop_track_check.sql +25 -0
- package/migrations/113_merge_lease.sql +16 -0
- package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
- package/migrations/118_currency_label_decoupling.sql +23 -0
- package/migrations/119_builder_behavior_prefs.sql +31 -0
- package/migrations/121_box_code_version.sql +37 -0
- package/migrations/122_builder_gemini_key.sql +30 -0
- package/migrations/123_cost_log_tiers.sql +33 -0
- package/migrations/124_cost_baseline.sql +45 -0
- package/migrations/125_llm_cache.sql +54 -0
- package/migrations/126_autonomy_runs.sql +33 -0
- package/migrations/143_cost_calibration.sql +63 -0
- package/migrations/145_backfill_task_requires_rank.sql +84 -0
- package/migrations/160_goal_tier.sql +88 -0
- package/migrations/163_polymorphic_dependencies.sql +187 -0
- package/migrations/164_event_sound_prefs.sql +20 -0
- package/migrations/165_task_module_key.sql +15 -0
- package/migrations/171_claims_published_head_sha.sql +24 -0
- package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
- package/migrations/175_task_grades_diff_hash.sql +9 -0
- package/migrations/176_promotion_respects_open_blockers.sql +58 -0
- package/migrations/176_ui_discipline.sql +40 -0
- package/migrations/177_require_reward_before_workable.sql +76 -0
- package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
- package/migrations/179_search_chunk_usefulness.sql +33 -0
- package/migrations/180_one_active_claim_per_session.sql +54 -0
- package/migrations/181_cost_log_skill_name.sql +33 -0
- package/migrations/184_claim_release_requested.sql +25 -0
- package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
- package/migrations/187_goal_sort_order.sql +30 -0
- package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
- package/migrations/README.md +88 -0
- package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
- package/migrations/core_189_core_upgrades_ledger.sql +37 -0
- package/migrations/core_189_credit_log_task_id_index.sql +19 -0
- package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
- package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
- package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
- package/migrations/instance/110_medusa_planning_seed.sql +70 -0
- package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
- package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
- package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
- package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
- package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
- package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
- package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
- package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
- package/modules/autonomy/CLAUDE.md +49 -0
- package/modules/autonomy/db.js +50 -0
- package/modules/autonomy/module.json +13 -0
- package/modules/autonomy/pollers/routine-timers.js +146 -0
- package/modules/autonomy/routes/autonomy.js +37 -0
- package/modules/builder-settings/CLAUDE.md +58 -0
- package/modules/builder-settings/builder-needs.js +115 -0
- package/modules/builder-settings/db.js +168 -0
- package/modules/builder-settings/display-name.js +84 -0
- package/modules/builder-settings/event-sound-prefs.js +169 -0
- package/modules/builder-settings/interaction-prefs.js +201 -0
- package/modules/builder-settings/model-alloc-prefs.js +147 -0
- package/modules/builder-settings/module.json +10 -0
- package/modules/builder-settings/render-prefs.js +103 -0
- package/modules/builder-settings/routes/settings.js +417 -0
- package/modules/builder-settings/settings.js +52 -0
- package/modules/builder-settings/skill-prefs.js +196 -0
- package/modules/builder-settings/sound-prefs.js +178 -0
- package/modules/builder-settings/wandering-prefs.js +282 -0
- package/modules/dev-box/CLAUDE.md +38 -0
- package/modules/dev-box/box-access.js +275 -0
- package/modules/dev-box/box-credential.js +94 -0
- package/modules/dev-box/box-onboard.js +486 -0
- package/modules/dev-box/boxes.js +842 -0
- package/modules/dev-box/db.js +39 -0
- package/modules/dev-box/module.json +14 -0
- package/modules/dev-box/routes/box.js +977 -0
- package/modules/discord/CLAUDE.md +50 -0
- package/modules/discord/auth.js +54 -0
- package/modules/discord/bug-attachments.js +210 -0
- package/modules/discord/db.js +96 -0
- package/modules/discord/discord-approvals.js +145 -0
- package/modules/discord/discord-audit.js +29 -0
- package/modules/discord/discord-bot.js +545 -0
- package/modules/discord/discord-bugs.js +257 -0
- package/modules/discord/discord-channels.js +412 -0
- package/modules/discord/discord-inbound.js +147 -0
- package/modules/discord/discord-message-buffer.js +54 -0
- package/modules/discord/discord-reaction.js +186 -0
- package/modules/discord/discord-role-sync.js +318 -0
- package/modules/discord/module.json +14 -0
- package/modules/discord/pollers/discord-bot.js +19 -0
- package/modules/discord/routes/bug-attachments.js +44 -0
- package/modules/discord/routes/discord.js +102 -0
- package/modules/discord/ship-broadcast.js +78 -0
- package/modules/discord/webhook.js +74 -0
- package/modules/economy/CLAUDE.md +48 -0
- package/modules/economy/achievements.js +594 -0
- package/modules/economy/cost-classify.js +331 -0
- package/modules/economy/cost-summary-shape.js +90 -0
- package/modules/economy/cost.js +438 -0
- package/modules/economy/credits.js +430 -0
- package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
- package/modules/economy/module.json +10 -0
- package/modules/economy/reward.js +61 -0
- package/modules/economy/routes/cost.js +97 -0
- package/modules/economy/routes/leaderboard.js +26 -0
- package/modules/economy/routes/reward.js +42 -0
- package/modules/economy/streak.js +285 -0
- package/modules/grading/CLAUDE.md +42 -0
- package/modules/grading/db.js +39 -0
- package/modules/grading/grader-rubric.json +151 -0
- package/modules/grading/grader-workers/efficiency.js +213 -0
- package/modules/grading/grader-workers/extract-json.js +80 -0
- package/modules/grading/grader-workers/fence.js +100 -0
- package/modules/grading/grader-workers/hacker.js +239 -0
- package/modules/grading/grader-workers/index.js +183 -0
- package/modules/grading/grader-workers/narc.js +207 -0
- package/modules/grading/grader-workers/quality.js +198 -0
- package/modules/grading/grader-workers/rubric.js +20 -0
- package/modules/grading/grader-workers/worker-prompt.js +89 -0
- package/modules/grading/grader-workers/worker-verdict.js +50 -0
- package/modules/grading/grader.js +1790 -0
- package/modules/grading/module.json +12 -0
- package/modules/grading/routes/grade.js +51 -0
- package/modules/hall-ui/CLAUDE.md +61 -0
- package/modules/hall-ui/module.json +14 -0
- package/modules/hall-ui/public/atlas.html +180 -0
- package/modules/hall-ui/public/atlas.js +336 -0
- package/modules/hall-ui/public/box-panel.js +423 -0
- package/modules/hall-ui/public/brand-apply.js +117 -0
- package/modules/hall-ui/public/builders.js +3028 -0
- package/modules/hall-ui/public/chime.wav +0 -0
- package/modules/hall-ui/public/copy-on-click.js +174 -0
- package/modules/hall-ui/public/cursors/arrow.png +0 -0
- package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier.png +0 -0
- package/modules/hall-ui/public/diagram-viewer.css +125 -0
- package/modules/hall-ui/public/diagram-viewer.js +330 -0
- package/modules/hall-ui/public/diagrams.html +113 -0
- package/modules/hall-ui/public/dom-utils.js +212 -0
- package/modules/hall-ui/public/drachmae.html +68 -0
- package/modules/hall-ui/public/drachmae.js +136 -0
- package/modules/hall-ui/public/gate.html +143 -0
- package/modules/hall-ui/public/gate.js +228 -0
- package/modules/hall-ui/public/goals-page.js +1297 -0
- package/modules/hall-ui/public/goals.html +376 -0
- package/modules/hall-ui/public/goals.js +119 -0
- package/modules/hall-ui/public/hall-widgets.js +189 -0
- package/modules/hall-ui/public/harbor.html +167 -0
- package/modules/hall-ui/public/harbor.js +335 -0
- package/modules/hall-ui/public/index.html +116 -0
- package/modules/hall-ui/public/instances-panel.js +172 -0
- package/modules/hall-ui/public/md-reader.js +234 -0
- package/modules/hall-ui/public/modules.html +119 -0
- package/modules/hall-ui/public/modules.js +154 -0
- package/modules/hall-ui/public/new-project-wizard.js +186 -0
- package/modules/hall-ui/public/not-ready.html +48 -0
- package/modules/hall-ui/public/pair.html +119 -0
- package/modules/hall-ui/public/pair.js +132 -0
- package/modules/hall-ui/public/primer.css +404 -0
- package/modules/hall-ui/public/primer.html +85 -0
- package/modules/hall-ui/public/primer.js +641 -0
- package/modules/hall-ui/public/profile.html +85 -0
- package/modules/hall-ui/public/profile.js +236 -0
- package/modules/hall-ui/public/ranks.html +69 -0
- package/modules/hall-ui/public/ranks.js +206 -0
- package/modules/hall-ui/public/roadmap.html +209 -0
- package/modules/hall-ui/public/roadmap.js +375 -0
- package/modules/hall-ui/public/sessions.html +92 -0
- package/modules/hall-ui/public/sessions.js +222 -0
- package/modules/hall-ui/public/settings.html +640 -0
- package/modules/hall-ui/public/settings.js +1219 -0
- package/modules/hall-ui/public/shell.js +495 -0
- package/modules/hall-ui/public/style.css +1748 -0
- package/modules/hall-ui/public/task-detail.js +253 -0
- package/modules/hall-ui/public/task.html +83 -0
- package/modules/hall-ui/public/task.js +326 -0
- package/modules/hall-ui/public/watch.html +333 -0
- package/modules/hall-ui/public/watch.js +859 -0
- package/modules/hall-ui/public/work.html +469 -0
- package/modules/hall-ui/public/work.js +1292 -0
- package/modules/ideas/CLAUDE.md +37 -0
- package/modules/ideas/blockers.js +100 -0
- package/modules/ideas/inbox.js +459 -0
- package/modules/ideas/module.json +10 -0
- package/modules/ideas/routes/blockers.js +120 -0
- package/modules/ideas/routes/inbox.js +230 -0
- package/modules/lifecycle/CLAUDE.md +63 -0
- package/modules/lifecycle/conflict-resolve.js +436 -0
- package/modules/lifecycle/db.js +4970 -0
- package/modules/lifecycle/done-when.js +355 -0
- package/modules/lifecycle/github-push.js +969 -0
- package/modules/lifecycle/goal-conflicts.js +133 -0
- package/modules/lifecycle/hierarchy.js +104 -0
- package/modules/lifecycle/lifecycle.js +58 -0
- package/modules/lifecycle/merge-lock.js +261 -0
- package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
- package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
- package/modules/lifecycle/module.json +13 -0
- package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
- package/modules/lifecycle/publish-reconciler.js +418 -0
- package/modules/lifecycle/routes/analytics.js +63 -0
- package/modules/lifecycle/routes/claims.js +506 -0
- package/modules/lifecycle/routes/dependencies.js +82 -0
- package/modules/lifecycle/routes/done-when.js +136 -0
- package/modules/lifecycle/routes/gate-approvals.js +197 -0
- package/modules/lifecycle/routes/goals.js +1419 -0
- package/modules/lifecycle/routes/lifecycle.js +43 -0
- package/modules/lifecycle/routes/tasks.js +1703 -0
- package/modules/lifecycle/routes/versions.js +128 -0
- package/modules/lifecycle/ship-card.js +505 -0
- package/modules/lifecycle/ship-preflight.js +225 -0
- package/modules/lifecycle/task-classifier.js +512 -0
- package/modules/lifecycle/version-close.js +106 -0
- package/modules/memory/CLAUDE.md +40 -0
- package/modules/memory/learnings.js +275 -0
- package/modules/memory/memory.js +572 -0
- package/modules/memory/module.json +12 -0
- package/modules/memory/routes/learnings.js +90 -0
- package/modules/memory/routes/memory.js +916 -0
- package/modules/memory/routes/search.js +188 -0
- package/modules/memory/search-chunker.js +252 -0
- package/modules/memory/search.js +320 -0
- package/modules/onboarding/CLAUDE.md +55 -0
- package/modules/onboarding/approval-broadcast.js +59 -0
- package/modules/onboarding/db.js +54 -0
- package/modules/onboarding/module.json +10 -0
- package/modules/onboarding/newcomer-restock.js +212 -0
- package/modules/onboarding/onboarding-state.js +532 -0
- package/modules/onboarding/onboarding.js +508 -0
- package/modules/onboarding/port.js +63 -0
- package/modules/onboarding/routes/access-requests.js +208 -0
- package/modules/onboarding/routes/onboarding.js +54 -0
- package/modules/security/CLAUDE.md +44 -0
- package/modules/security/module.json +10 -0
- package/modules/security/routes/reports.js +251 -0
- package/modules/security/secret-scrub.js +201 -0
- package/modules/security/security.js +294 -0
- package/modules/sessions/CLAUDE.md +39 -0
- package/modules/sessions/bfg.js +357 -0
- package/modules/sessions/db.js +326 -0
- package/modules/sessions/module.json +10 -0
- package/modules/sessions/pulse.js +149 -0
- package/modules/sessions/routes/sessions.js +331 -0
- package/modules/status-ui/CLAUDE.md +47 -0
- package/modules/status-ui/module.json +14 -0
- package/modules/status-ui/public/README.md +29 -0
- package/modules/status-ui/public/cursors/arrow.png +0 -0
- package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/status-ui/public/index.html +363 -0
- package/modules/status-ui/public/snapshots/.gitkeep +0 -0
- package/modules/status-ui/public/status.js +1375 -0
- package/modules/status-ui/public/style.css +1342 -0
- package/package-lock.json +975 -0
- package/package.json +28 -0
- package/public-docs/index.html +35 -0
- package/public-docs/redoc.standalone.js +1838 -0
- package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
- package/public-landing/buddha.png +0 -0
- package/public-landing/create.html +868 -0
- package/public-landing/index.html +168 -0
- package/scripts/bongos-mcp.js +28 -0
- package/scripts/cron/style_guide_audit.sh +134 -0
- package/scripts/discord/README.md +52 -0
- package/scripts/discord/lib.js +80 -0
- package/scripts/discord/post.js +51 -0
- package/scripts/gds/CLAUDE.md +144 -0
- package/scripts/gds/abandon.js +58 -0
- package/scripts/gds/adopt-detect.js +123 -0
- package/scripts/gds/adopt-import.js +111 -0
- package/scripts/gds/adopt-preflight.js +121 -0
- package/scripts/gds/api.js +78 -0
- package/scripts/gds/architect-audit.js +288 -0
- package/scripts/gds/art-stage.js +152 -0
- package/scripts/gds/audit-authorship.sh +243 -0
- package/scripts/gds/audit-deps.js +121 -0
- package/scripts/gds/audit-exports.js +128 -0
- package/scripts/gds/audit-replay.sh +161 -0
- package/scripts/gds/audit-ships.js +251 -0
- package/scripts/gds/autonomy-gate.js +135 -0
- package/scripts/gds/backfill-cost.js +165 -0
- package/scripts/gds/backfill-sessions.js +351 -0
- package/scripts/gds/backfill-task-rewards.js +408 -0
- package/scripts/gds/backup.js +94 -0
- package/scripts/gds/bfg-principal-token.js +65 -0
- package/scripts/gds/box-auth-check.js +160 -0
- package/scripts/gds/box-connect-lib.js +453 -0
- package/scripts/gds/box.js +1258 -0
- package/scripts/gds/build-bongos.js +94 -0
- package/scripts/gds/capture.js +123 -0
- package/scripts/gds/cf-tunnel.js +419 -0
- package/scripts/gds/ci-grade.js +82 -0
- package/scripts/gds/claim-recall.js +112 -0
- package/scripts/gds/claim.js +333 -0
- package/scripts/gds/classify-discipline.js +153 -0
- package/scripts/gds/claude-materialize.js +176 -0
- package/scripts/gds/cleanup-orphans.js +74 -0
- package/scripts/gds/cli-lib.js +518 -0
- package/scripts/gds/code.js +101 -0
- package/scripts/gds/codemod-rename-src-gds.js +145 -0
- package/scripts/gds/conductor-dispatch.js +426 -0
- package/scripts/gds/context-pack.js +228 -0
- package/scripts/gds/coreB-carve-proof.sh +716 -0
- package/scripts/gds/cost.js +47 -0
- package/scripts/gds/db-backup-nightly.sh +160 -0
- package/scripts/gds/db-backup-offsite.sh +152 -0
- package/scripts/gds/demote.js +40 -0
- package/scripts/gds/design-sync.js +62 -0
- package/scripts/gds/diagnose-achievements.js +118 -0
- package/scripts/gds/diagram-facts.js +319 -0
- package/scripts/gds/discipline-modes.json +25 -0
- package/scripts/gds/discord-channels.js +66 -0
- package/scripts/gds/do-api.js +176 -0
- package/scripts/gds/docs-entropy.js +403 -0
- package/scripts/gds/doctor.js +389 -0
- package/scripts/gds/feedback-latest.js +94 -0
- package/scripts/gds/fetch-art-key.js +106 -0
- package/scripts/gds/fetch-sound-prefs.js +88 -0
- package/scripts/gds/figma-design-sync.js +61 -0
- package/scripts/gds/fitness.js +1446 -0
- package/scripts/gds/gate-review.js +322 -0
- package/scripts/gds/gating.js +325 -0
- package/scripts/gds/gds-db-backup.service +24 -0
- package/scripts/gds/gds-db-backup.timer +20 -0
- package/scripts/gds/gds-db-offsite.service +29 -0
- package/scripts/gds/gds-db-offsite.timer +18 -0
- package/scripts/gds/gen-api-client.js +508 -0
- package/scripts/gds/gen-api-docs.js +1037 -0
- package/scripts/gds/gen-atlas.js +366 -0
- package/scripts/gds/gen-diagrams.js +608 -0
- package/scripts/gds/gen-file-map.js +196 -0
- package/scripts/gds/gen-repo-map.js +519 -0
- package/scripts/gds/gen-session-index.js +210 -0
- package/scripts/gds/git-merge-regen.js +147 -0
- package/scripts/gds/grade-smoke.js +205 -0
- package/scripts/gds/hooks/pre-push.js +169 -0
- package/scripts/gds/http-api-client.js +88 -0
- package/scripts/gds/init.js +903 -0
- package/scripts/gds/install-git-hooks.js +114 -0
- package/scripts/gds/key-card.js +213 -0
- package/scripts/gds/key-status.js +126 -0
- package/scripts/gds/land-watch.js +168 -0
- package/scripts/gds/learning-capture.js +145 -0
- package/scripts/gds/lib.sh +44 -0
- package/scripts/gds/linkify-refs.js +473 -0
- package/scripts/gds/local-preview-lib.js +159 -0
- package/scripts/gds/local-preview.js +95 -0
- package/scripts/gds/login.js +225 -0
- package/scripts/gds/main-audit.js +279 -0
- package/scripts/gds/me.js +88 -0
- package/scripts/gds/memory-map.js +174 -0
- package/scripts/gds/merge-lock.js +71 -0
- package/scripts/gds/migration-namespace.js +200 -0
- package/scripts/gds/mirror-lineage-check.js +319 -0
- package/scripts/gds/mirror-redact.js +305 -0
- package/scripts/gds/module.js +482 -0
- package/scripts/gds/newcomer-floor.config.json +13 -0
- package/scripts/gds/newcomer-floor.js +415 -0
- package/scripts/gds/newcomer-floor.templates.json +86 -0
- package/scripts/gds/newcomer-floor.test.js +235 -0
- package/scripts/gds/next-number.js +163 -0
- package/scripts/gds/oauth-secret.js +197 -0
- package/scripts/gds/onboard.js +217 -0
- package/scripts/gds/onboarding-analyze.js +226 -0
- package/scripts/gds/onboarding-config.js +178 -0
- package/scripts/gds/onboarding-ship.js +92 -0
- package/scripts/gds/package-core.js +684 -0
- package/scripts/gds/paste-token.js +131 -0
- package/scripts/gds/portability-smoke-art.sh +85 -0
- package/scripts/gds/portability-smoke-memory.sh +147 -0
- package/scripts/gds/provision.js +1324 -0
- package/scripts/gds/publish-manifest.js +307 -0
- package/scripts/gds/pulse.js +309 -0
- package/scripts/gds/push-main.js +45 -0
- package/scripts/gds/read-session-export.js +359 -0
- package/scripts/gds/reauth.js +149 -0
- package/scripts/gds/recall.js +135 -0
- package/scripts/gds/release.js +71 -0
- package/scripts/gds/render-ideas.js +173 -0
- package/scripts/gds/repo-metrics.js +363 -0
- package/scripts/gds/resolve-skill-model.js +57 -0
- package/scripts/gds/run-routine.js +197 -0
- package/scripts/gds/run-unit-tests.js +178 -0
- package/scripts/gds/sandbox-stage.js +653 -0
- package/scripts/gds/search-ingest-db.js +209 -0
- package/scripts/gds/search-ingest-md.js +225 -0
- package/scripts/gds/security-baseline-check.sh +180 -0
- package/scripts/gds/seed-adopt-tasks.js +75 -0
- package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/gds/seed-bongos-app-tasks.js +294 -0
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/gds/seed-bongos-tasks.js +214 -0
- package/scripts/gds/seed-gds-v4-tasks.js +624 -0
- package/scripts/gds/seed-governance-tasks.js +340 -0
- package/scripts/gds/seed-medusa-tasks.js +440 -0
- package/scripts/gds/seed-module-upstreaming.js +219 -0
- package/scripts/gds/seed-productization-tasks.js +235 -0
- package/scripts/gds/seed-provisioning-tasks.js +83 -0
- package/scripts/gds/seed-staging.sh +104 -0
- package/scripts/gds/seed-v2-world-tasks.js +283 -0
- package/scripts/gds/seed-v3-tasks.js +1981 -0
- package/scripts/gds/session-cost.js +393 -0
- package/scripts/gds/session-digest.js +179 -0
- package/scripts/gds/session-eval.js +576 -0
- package/scripts/gds/session.js +404 -0
- package/scripts/gds/setup.js +504 -0
- package/scripts/gds/shell.js +100 -0
- package/scripts/gds/ship.js +3618 -0
- package/scripts/gds/smoke-batch-claim.sh +213 -0
- package/scripts/gds/smoke-batch-release.sh +296 -0
- package/scripts/gds/smoke-box.sh +150 -0
- package/scripts/gds/smoke-claim-consistency.sh +212 -0
- package/scripts/gds/smoke-dependencies.sh +84 -0
- package/scripts/gds/smoke-gds.js +125 -0
- package/scripts/gds/smoke-write.sh +168 -0
- package/scripts/gds/start.js +782 -0
- package/scripts/gds/status.js +365 -0
- package/scripts/gds/triage.js +366 -0
- package/scripts/gds/upgrade.js +421 -0
- package/scripts/gds/validate-design.js +254 -0
- package/scripts/gds/version-close.js +549 -0
- package/scripts/migrate.sh +183 -0
- package/scripts/migrate_cost_ledger.sh +178 -0
- package/scripts/public-mirror-export.js +291 -0
- package/scripts/render-diagrams.sh +88 -0
- package/scripts/security/dep-audit.js +276 -0
- package/scripts/setup-builder.js +274 -0
- package/scripts/setup-builder.sh +28 -0
- package/scripts/snapshots/backfill-history.mjs +292 -0
- package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
- package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
- package/scripts/snapshots/render-world.mjs +322 -0
- package/scripts/status-mirror-sync.js +192 -0
- package/scripts/status-probe.mjs +185 -0
- package/server.js +212 -0
- package/src/asset-version.js +71 -0
- package/src/bongos/CLAUDE.md +64 -0
- package/src/bongos/api-errors.js +281 -0
- package/src/bongos/api-path-404.js +67 -0
- package/src/bongos/api-prefix.js +38 -0
- package/src/bongos/app-pair.js +172 -0
- package/src/bongos/auth.js +979 -0
- package/src/bongos/cascade-dispatch.js +123 -0
- package/src/bongos/db-kernel.js +252 -0
- package/src/bongos/db.js +911 -0
- package/src/bongos/goal-scope-check.js +120 -0
- package/src/bongos/hierarchy-config.js +189 -0
- package/src/bongos/live-channel.js +145 -0
- package/src/bongos/llm-cache.js +260 -0
- package/src/bongos/llm-pricing.js +220 -0
- package/src/bongos/metrics.js +286 -0
- package/src/bongos/middleware/audit.js +274 -0
- package/src/bongos/middleware/error-envelope.js +93 -0
- package/src/bongos/middleware/rate-limit.js +195 -0
- package/src/bongos/module-scope-map.js +271 -0
- package/src/bongos/optimizer.js +166 -0
- package/src/bongos/path-match.js +47 -0
- package/src/bongos/permission-path-check.js +248 -0
- package/src/bongos/pool.js +55 -0
- package/src/bongos/repo-info.js +91 -0
- package/src/bongos/route-rank-check.js +420 -0
- package/src/bongos/routes/CLAUDE.md +43 -0
- package/src/bongos/routes/_helpers.js +369 -0
- package/src/bongos/routes/audit-log.js +59 -0
- package/src/bongos/routes/auth.js +755 -0
- package/src/bongos/routes/backup.js +104 -0
- package/src/bongos/routes/builders.js +526 -0
- package/src/bongos/routes/healthz.js +16 -0
- package/src/bongos/routes/instance.js +129 -0
- package/src/bongos/routes/live.js +125 -0
- package/src/bongos/routes/llm-cache.js +119 -0
- package/src/bongos/routes/me.js +380 -0
- package/src/bongos/routes/modules.js +131 -0
- package/src/bongos/routes/optimizer.js +54 -0
- package/src/bongos/routes/public.js +476 -0
- package/src/bongos/routes/security.js +207 -0
- package/src/bongos/routes.js +166 -0
- package/src/bongos/secret-box.js +177 -0
- package/src/bongos/sensitive-surfaces.js +30 -0
- package/src/bongos/serve-internal.js +889 -0
- package/src/bongos/uptime-poller.js +90 -0
- package/src/bongos-downloads.js +70 -0
- package/src/branding.js +182 -0
- package/src/build-info.js +77 -0
- package/src/devbox-downloads.js +67 -0
- package/src/instance-config.js +200 -0
- package/src/module-api.js +366 -0
- package/src/module-loader/loader.js +268 -0
- package/src/module-loader/manifest-schema.js +140 -0
- package/src/module-loader/provenance.js +28 -0
- package/src/module-loader/semver.js +100 -0
- package/src/module-seams.js +291 -0
- package/src/modules.js +254 -0
- package/src/platform-server.js +135 -0
- package/src/ui/adapters/claude-design/index.js +333 -0
- package/src/ui/adapters/figma/index.js +328 -0
- package/tests/abandon_task.mjs +138 -0
- package/tests/achievements_reconcile.mjs +167 -0
- package/tests/adopt_detect.mjs +141 -0
- package/tests/adopt_import.mjs +132 -0
- package/tests/adopt_preflight.mjs +105 -0
- package/tests/anti_grid.mjs +89 -0
- package/tests/api_client.mjs +231 -0
- package/tests/api_docs.mjs +283 -0
- package/tests/api_error_envelope_buildcheck.mjs +56 -0
- package/tests/api_error_envelope_middleware.mjs +99 -0
- package/tests/api_error_registry.mjs +108 -0
- package/tests/api_pagination_contract.mjs +51 -0
- package/tests/api_path_404.mjs +96 -0
- package/tests/app_pair.mjs +168 -0
- package/tests/architect.mjs +140 -0
- package/tests/art_key.mjs +121 -0
- package/tests/art_stage.mjs +121 -0
- package/tests/asset_version.mjs +94 -0
- package/tests/atlas.mjs +69 -0
- package/tests/audit_deps.mjs +74 -0
- package/tests/audit_middleware.mjs +385 -0
- package/tests/auth_admission_gate.mjs +164 -0
- package/tests/auth_anthropic_identity.mjs +95 -0
- package/tests/auth_duplicate_cookie.mjs +56 -0
- package/tests/auth_error_brand.mjs +77 -0
- package/tests/auth_flow_slice1.mjs +223 -0
- package/tests/auth_inactive_builder.mjs +94 -0
- package/tests/auth_page_gate.mjs +92 -0
- package/tests/auth_session_ttl.mjs +155 -0
- package/tests/autonomous_fit_protected_paths.mjs +115 -0
- package/tests/autonomy_gate.mjs +85 -0
- package/tests/autotile_variants.mjs +256 -0
- package/tests/autotile_xverify.mjs +133 -0
- package/tests/backfill_sessions.mjs +101 -0
- package/tests/backfill_task_rewards.mjs +152 -0
- package/tests/backup_cli.mjs +104 -0
- package/tests/bfg.mjs +327 -0
- package/tests/bfg_write.mjs +423 -0
- package/tests/bongos_box_connect.mjs +89 -0
- package/tests/bongos_dispatch.mjs +74 -0
- package/tests/bongos_downloads.mjs +118 -0
- package/tests/bongos_login.mjs +34 -0
- package/tests/box_access.mjs +186 -0
- package/tests/box_auth_check.mjs +114 -0
- package/tests/box_code_staleness.mjs +116 -0
- package/tests/box_connect_e2e.mjs +196 -0
- package/tests/box_cost.mjs +70 -0
- package/tests/box_dns_repoint.mjs +151 -0
- package/tests/box_host_keys.mjs +102 -0
- package/tests/box_onboard.mjs +317 -0
- package/tests/box_scope_session.mjs +115 -0
- package/tests/box_ship_permissions.mjs +71 -0
- package/tests/box_terminal_ssrf.mjs +90 -0
- package/tests/boxes.mjs +1255 -0
- package/tests/branding.mjs +88 -0
- package/tests/bug_attachments.mjs +189 -0
- package/tests/build_info.mjs +88 -0
- package/tests/builder_needs.mjs +99 -0
- package/tests/cap_newcomer_tasks.mjs +114 -0
- package/tests/cascade-dispatch.mjs +95 -0
- package/tests/cf_tunnel.mjs +459 -0
- package/tests/claim_recall.mjs +150 -0
- package/tests/claims_bind_session.mjs +47 -0
- package/tests/claude_materialize.mjs +148 -0
- package/tests/cli_box_scope.mjs +52 -0
- package/tests/cli_lib_formatters.mjs +87 -0
- package/tests/cli_token_reissue.mjs +147 -0
- package/tests/client_bundle_route.mjs +47 -0
- package/tests/cloud_bongos_pack.mjs +85 -0
- package/tests/conductor.mjs +496 -0
- package/tests/confirm_attribution.mjs +156 -0
- package/tests/conflict_resolve.mjs +462 -0
- package/tests/context_pack.mjs +240 -0
- package/tests/cost.mjs +94 -0
- package/tests/cost_audit.mjs +122 -0
- package/tests/cost_budget_status.mjs +78 -0
- package/tests/cost_reconcile.mjs +102 -0
- package/tests/cost_summary_shape.mjs +94 -0
- package/tests/credit_grant.mjs +376 -0
- package/tests/criterion_progress.mjs +220 -0
- package/tests/criterion_proposal.mjs +109 -0
- package/tests/criterion_ref_parse.mjs +53 -0
- package/tests/currency_label.mjs +119 -0
- package/tests/day_cycle.mjs +197 -0
- package/tests/dependencies_migration.mjs +77 -0
- package/tests/dependencies_polymorphic.mjs +212 -0
- package/tests/deploy_instance.mjs +78 -0
- package/tests/devbox_downloads.mjs +122 -0
- package/tests/diff_derived_signals.mjs +115 -0
- package/tests/discord_approvals.mjs +174 -0
- package/tests/discord_autojoin.mjs +158 -0
- package/tests/discord_bot.mjs +94 -0
- package/tests/discord_bugs.mjs +297 -0
- package/tests/discord_channels.mjs +337 -0
- package/tests/discord_foundation.mjs +76 -0
- package/tests/discord_inbound.mjs +190 -0
- package/tests/discord_message_buffer.mjs +87 -0
- package/tests/discord_oauth.mjs +55 -0
- package/tests/discord_reaction.mjs +170 -0
- package/tests/discord_role_sync.mjs +151 -0
- package/tests/display_name.mjs +123 -0
- package/tests/dns_preflight.mjs +74 -0
- package/tests/event_sound_prefs.mjs +194 -0
- package/tests/eviction_policy.mjs +279 -0
- package/tests/figma_adapter.mjs +199 -0
- package/tests/file_map.mjs +91 -0
- package/tests/first_admin_bootstrap.mjs +40 -0
- package/tests/fitness.mjs +435 -0
- package/tests/fitness_two_root.mjs +104 -0
- package/tests/fixtures/session-506-digest.json +34 -0
- package/tests/gate_approvals.mjs +451 -0
- package/tests/gate_review.mjs +152 -0
- package/tests/git_merge_regen.mjs +151 -0
- package/tests/github_push_ancestry.mjs +119 -0
- package/tests/github_push_land_proof.mjs +127 -0
- package/tests/github_push_merge_driver.mjs +175 -0
- package/tests/goal_abuse_matrix.mjs +187 -0
- package/tests/goal_achievement.mjs +146 -0
- package/tests/goal_conflicts.mjs +305 -0
- package/tests/goal_dependencies_read.mjs +73 -0
- package/tests/goal_member_roles.mjs +420 -0
- package/tests/goal_membership_requests.mjs +332 -0
- package/tests/goal_routes.mjs +203 -0
- package/tests/goal_scope_check.mjs +167 -0
- package/tests/goal_tier.mjs +312 -0
- package/tests/goal_wall_proof.mjs +112 -0
- package/tests/grade_attempts.mjs +73 -0
- package/tests/grade_attribution.mjs +117 -0
- package/tests/grade_diff_hash.mjs +191 -0
- package/tests/grade_server_authoritative.mjs +305 -0
- package/tests/grade_unavailable_display.mjs +66 -0
- package/tests/grader.mjs +1960 -0
- package/tests/grader_bypass.mjs +57 -0
- package/tests/grader_panel.mjs +252 -0
- package/tests/grader_prompt_fencing.mjs +192 -0
- package/tests/helpers.mjs +52 -0
- package/tests/hierarchy-config.mjs +81 -0
- package/tests/init.mjs +463 -0
- package/tests/instance_config.mjs +76 -0
- package/tests/instance_manifest.mjs +110 -0
- package/tests/interaction_prefs.mjs +72 -0
- package/tests/key-card.mjs +110 -0
- package/tests/key-status.mjs +45 -0
- package/tests/land_watch.mjs +115 -0
- package/tests/lifecycle-card.mjs +145 -0
- package/tests/lifecycle_breakdown_view.mjs +236 -0
- package/tests/linkify_refs.mjs +264 -0
- package/tests/live_channel.mjs +128 -0
- package/tests/live_sse.mjs +122 -0
- package/tests/llm-cache-route.mjs +110 -0
- package/tests/llm-cache.mjs +140 -0
- package/tests/llm-pricing.mjs +152 -0
- package/tests/local_preview.mjs +136 -0
- package/tests/main_audit.mjs +137 -0
- package/tests/memory_isolation.mjs +431 -0
- package/tests/memory_map.mjs +107 -0
- package/tests/memory_pull.mjs +429 -0
- package/tests/merge_lease.mjs +100 -0
- package/tests/merge_lock.mjs +312 -0
- package/tests/metrics.mjs +147 -0
- package/tests/migration_allocation.mjs +146 -0
- package/tests/migration_namespace.mjs +185 -0
- package/tests/migrations_fresh_replay_guard.mjs +38 -0
- package/tests/mirror_lineage_fulltree.mjs +45 -0
- package/tests/mirror_lineage_proof.mjs +72 -0
- package/tests/mirror_redact.mjs +193 -0
- package/tests/model_alloc_prefs.mjs +63 -0
- package/tests/module-scope-map.mjs +88 -0
- package/tests/module_api.mjs +110 -0
- package/tests/module_cli.mjs +292 -0
- package/tests/module_contributions.mjs +148 -0
- package/tests/module_loader.mjs +286 -0
- package/tests/module_manifest.mjs +194 -0
- package/tests/module_owned_tests.mjs +105 -0
- package/tests/module_provenance.mjs +34 -0
- package/tests/module_route_rank.mjs +147 -0
- package/tests/module_seams.mjs +68 -0
- package/tests/modules.mjs +156 -0
- package/tests/modules_route.mjs +38 -0
- package/tests/newcomer_floor.mjs +17 -0
- package/tests/newcomer_restock.mjs +80 -0
- package/tests/next_number.mjs +154 -0
- package/tests/oauth_secret.mjs +60 -0
- package/tests/onboard.mjs +70 -0
- package/tests/onboarding_gate.mjs +267 -0
- package/tests/onboarding_observability.mjs +344 -0
- package/tests/onboarding_route_signals.mjs +175 -0
- package/tests/onboarding_state.mjs +346 -0
- package/tests/one_active_claim_per_session.mjs +111 -0
- package/tests/orphaned_claim_ship.mjs +135 -0
- package/tests/override_attribution.mjs +142 -0
- package/tests/override_request_ownership.mjs +235 -0
- package/tests/package_core.mjs +435 -0
- package/tests/parallel-load.mjs +402 -0
- package/tests/path_match.mjs +62 -0
- package/tests/permission_path.mjs +151 -0
- package/tests/platform_boot.mjs +167 -0
- package/tests/pre_compact.mjs +60 -0
- package/tests/preview_server.mjs +127 -0
- package/tests/profile_route.mjs +197 -0
- package/tests/provision.mjs +805 -0
- package/tests/provisioning_github_app_routes.mjs +98 -0
- package/tests/public_mirror_export.mjs +124 -0
- package/tests/public_task_resolver.mjs +112 -0
- package/tests/publish_branch_route.mjs +422 -0
- package/tests/publish_manifest.mjs +184 -0
- package/tests/publish_reconciler.mjs +728 -0
- package/tests/rank_gate.mjs +463 -0
- package/tests/rate_limit_public.mjs +217 -0
- package/tests/read_session_export.mjs +89 -0
- package/tests/recall_cli.mjs +82 -0
- package/tests/recall_hints.mjs +119 -0
- package/tests/recent_shipped_window.mjs +80 -0
- package/tests/regrade_eligibility.mjs +202 -0
- package/tests/render_prefs.mjs +122 -0
- package/tests/repo_map.mjs +92 -0
- package/tests/reward_gate.mjs +284 -0
- package/tests/route_rank_check.mjs +243 -0
- package/tests/route_validation.mjs +490 -0
- package/tests/routine_timers.mjs +72 -0
- package/tests/rubric_fixtures.mjs +140 -0
- package/tests/run_routine.mjs +69 -0
- package/tests/sandbox_stage.mjs +582 -0
- package/tests/scrubber_corpus.mjs +257 -0
- package/tests/search_chunker.mjs +209 -0
- package/tests/search_ingest.mjs +96 -0
- package/tests/search_ingest_db.mjs +88 -0
- package/tests/search_isolation.mjs +204 -0
- package/tests/search_route.mjs +95 -0
- package/tests/secret_box.mjs +189 -0
- package/tests/security_docs.mjs +186 -0
- package/tests/security_route.mjs +108 -0
- package/tests/served_paths_shipped.mjs +118 -0
- package/tests/session-cards.mjs +142 -0
- package/tests/session_506_regression.mjs +69 -0
- package/tests/session_caps.mjs +238 -0
- package/tests/session_cost.mjs +133 -0
- package/tests/session_digest.mjs +73 -0
- package/tests/session_eval.mjs +386 -0
- package/tests/session_index.mjs +105 -0
- package/tests/session_records.mjs +369 -0
- package/tests/session_search.mjs +78 -0
- package/tests/session_start_freshness.mjs +123 -0
- package/tests/setup_smoke.mjs +154 -0
- package/tests/ship_autolinkify.mjs +60 -0
- package/tests/ship_automerge_injection.mjs +174 -0
- package/tests/ship_broadcast_routing.mjs +125 -0
- package/tests/ship_broadcast_server.mjs +175 -0
- package/tests/ship_card.mjs +280 -0
- package/tests/ship_ci_deploy.mjs +374 -0
- package/tests/ship_preflight.mjs +368 -0
- package/tests/ship_premerge.mjs +75 -0
- package/tests/ship_resume.mjs +129 -0
- package/tests/ship_upload_skip.mjs +89 -0
- package/tests/ship_zero_commit.mjs +60 -0
- package/tests/single_host_hall.mjs +98 -0
- package/tests/skill_prefs.mjs +150 -0
- package/tests/smoke_preflight.mjs +66 -0
- package/tests/snapshot_picker.mjs +233 -0
- package/tests/sound_prefs.mjs +198 -0
- package/tests/sprite_facing.mjs +35 -0
- package/tests/status-probe.mjs +89 -0
- package/tests/status_backfill.mjs +94 -0
- package/tests/stop_refcheck.mjs +127 -0
- package/tests/streak.mjs +175 -0
- package/tests/subdomain_auth.mjs +58 -0
- package/tests/task_classifier_vocab.mjs +41 -0
- package/tests/task_create_idempotency.mjs +96 -0
- package/tests/task_goal_link.mjs +93 -0
- package/tests/task_ownership_gate.mjs +125 -0
- package/tests/terrain_picker.mjs +298 -0
- package/tests/touches_overlap.mjs +75 -0
- package/tests/triage_development.mjs +140 -0
- package/tests/turn_in_place.mjs +280 -0
- package/tests/upgrade.mjs +357 -0
- package/tests/verify_task_guard.mjs +64 -0
- package/tests/version_close.mjs +76 -0
- package/tests/versions_route.mjs +93 -0
- package/tests/walkability.mjs +188 -0
- package/tests/wandering_prefs.mjs +176 -0
- package/tests/worktree_disambiguation.mjs +105 -0
- package/tests/worktree_guard.mjs +90 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
// GDS onboarding friction analysis — pure domain logic (V3.R79 / #298).
|
|
2
|
+
//
|
|
3
|
+
// Criterion C1: "feedback without asking." Instead of asking a new builder
|
|
4
|
+
// "what was confusing?", we read their actual onboarding session transcripts
|
|
5
|
+
// and let an Opus subagent surface the friction. Each flagged session becomes
|
|
6
|
+
// one idea_inbox row so a trusted builder can act on it during triage.
|
|
7
|
+
//
|
|
8
|
+
// This module is the *pure* half of the pipeline: parse a Claude Code
|
|
9
|
+
// transcript, compute deterministic friction signals, build the subagent
|
|
10
|
+
// prompt, validate the subagent's JSON, and shape the idea_inbox payload.
|
|
11
|
+
// No filesystem, no network, no DB — that lives in scripts/gds/onboarding-*.js
|
|
12
|
+
// so this stays unit-testable and side-effect free (mirrors how grader.js
|
|
13
|
+
// keeps buildPrompt/validateAndScore pure while runSubagent does the I/O).
|
|
14
|
+
//
|
|
15
|
+
// ## Why a title prefix instead of kind='onboarding-friction'
|
|
16
|
+
//
|
|
17
|
+
// The done-when asks for idea_inbox rows tagged kind='onboarding-friction'.
|
|
18
|
+
// But idea_inbox.kind carries a CHECK constraint (migration 006) that only
|
|
19
|
+
// admits the fixed task-kind enum, and a migration is out of this task's
|
|
20
|
+
// touches[]. So we follow the exact precedent the sibling R70 feature set for
|
|
21
|
+
// 'skill-friction' (see src/bongos/inbox.js SKILL_FRICTION_TAG): the row's kind
|
|
22
|
+
// stays a valid enum value and a stable title prefix is the machine-checkable
|
|
23
|
+
// marker. When GDS adds a real idea_inbox.kind migration, this prefix can be
|
|
24
|
+
// promoted to a first-class kind and the marker collapses to a kind check.
|
|
25
|
+
|
|
26
|
+
// Machine-checkable marker for onboarding-friction ideas. Mirrors
|
|
27
|
+
// inbox.js's SKILL_FRICTION_TAG convention.
|
|
28
|
+
const ONBOARDING_FRICTION_TAG = '[onboarding-friction]';
|
|
29
|
+
|
|
30
|
+
// The underlying idea_inbox.kind these rows carry — a valid enum value
|
|
31
|
+
// (idea_inbox CHECK). Friction surfaced from a transcript is a thing we
|
|
32
|
+
// learned about the system, so 'learning-capture' is the honest kind.
|
|
33
|
+
const ONBOARDING_FRICTION_KIND = 'learning-capture';
|
|
34
|
+
|
|
35
|
+
// -------------------------------------------------------------------------
|
|
36
|
+
// Transcript parsing
|
|
37
|
+
//
|
|
38
|
+
// A Claude Code transcript is JSONL: one JSON event per line. We only care
|
|
39
|
+
// about user/assistant turns. Each turn's `message.content` is either a
|
|
40
|
+
// string or an array of blocks ({type:'text'|'tool_use'|'tool_result', ...}).
|
|
41
|
+
// tool_result blocks with is_error=true are the error signal; text blocks on
|
|
42
|
+
// user turns are the human prompts. Everything is parsed defensively — a
|
|
43
|
+
// malformed or unfamiliar line is skipped, never throws.
|
|
44
|
+
// -------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
function blockText(block) {
|
|
47
|
+
if (typeof block === 'string') return block;
|
|
48
|
+
if (block && typeof block === 'object') {
|
|
49
|
+
if (typeof block.text === 'string') return block.text;
|
|
50
|
+
// tool_result content can itself be a string or an array of text blocks.
|
|
51
|
+
if (block.type === 'tool_result') {
|
|
52
|
+
if (typeof block.content === 'string') return block.content;
|
|
53
|
+
if (Array.isArray(block.content)) {
|
|
54
|
+
return block.content.map(blockText).join(' ');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A user message that carries only tool_result blocks is the harness feeding
|
|
62
|
+
// tool output back to the model — NOT a human prompt. We want the real human
|
|
63
|
+
// prompts for repeated-prompt detection, so we extract text blocks only when
|
|
64
|
+
// the message isn't purely tool_result.
|
|
65
|
+
function extractHumanPrompt(content) {
|
|
66
|
+
if (typeof content === 'string') return content.trim();
|
|
67
|
+
if (!Array.isArray(content)) return '';
|
|
68
|
+
const hasToolResult = content.some((b) => b && b.type === 'tool_result');
|
|
69
|
+
const hasNonToolResult = content.some(
|
|
70
|
+
(b) => b && b.type !== 'tool_result'
|
|
71
|
+
);
|
|
72
|
+
if (hasToolResult && !hasNonToolResult) return ''; // pure tool-output turn
|
|
73
|
+
return content
|
|
74
|
+
.filter((b) => !b || b.type !== 'tool_result')
|
|
75
|
+
.map(blockText)
|
|
76
|
+
.join('\n')
|
|
77
|
+
.trim();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function contentHasError(content) {
|
|
81
|
+
if (!Array.isArray(content)) return false;
|
|
82
|
+
return content.some(
|
|
83
|
+
(b) => b && b.type === 'tool_result' && b.is_error === true
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Strip <system-reminder>…</system-reminder> and similar machine-injected
|
|
88
|
+
// wrappers so similarity/length heuristics see the human's actual words.
|
|
89
|
+
function stripMachineNoise(text) {
|
|
90
|
+
return String(text || '')
|
|
91
|
+
.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, ' ')
|
|
92
|
+
.replace(/<command-[a-z-]+>[\s\S]*?<\/command-[a-z-]+>/g, ' ')
|
|
93
|
+
.replace(/\s+/g, ' ')
|
|
94
|
+
.trim();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Parse JSONL → normalized turns. Returns { turns, meta }.
|
|
98
|
+
// turn = { role, text, ts, isError }
|
|
99
|
+
// role is 'user' | 'assistant'. text is the human prompt (user) or the
|
|
100
|
+
// assistant's visible text (assistant). isError flags a tool error on the turn.
|
|
101
|
+
function parseTranscript(jsonlText) {
|
|
102
|
+
const lines = String(jsonlText || '').split('\n');
|
|
103
|
+
const turns = [];
|
|
104
|
+
let sessionId = null;
|
|
105
|
+
let firstTs = null;
|
|
106
|
+
let lastTs = null;
|
|
107
|
+
|
|
108
|
+
for (const line of lines) {
|
|
109
|
+
const trimmed = line.trim();
|
|
110
|
+
if (!trimmed) continue;
|
|
111
|
+
let evt;
|
|
112
|
+
try {
|
|
113
|
+
evt = JSON.parse(trimmed);
|
|
114
|
+
} catch (_) {
|
|
115
|
+
continue; // skip unparseable line
|
|
116
|
+
}
|
|
117
|
+
if (!evt || typeof evt !== 'object') continue;
|
|
118
|
+
if (!sessionId && typeof evt.sessionId === 'string') sessionId = evt.sessionId;
|
|
119
|
+
const ts = evt.timestamp || evt.message?.timestamp || null;
|
|
120
|
+
if (ts) {
|
|
121
|
+
if (!firstTs) firstTs = ts;
|
|
122
|
+
lastTs = ts;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const msg = evt.message;
|
|
126
|
+
const role = msg?.role || (evt.type === 'user' || evt.type === 'assistant' ? evt.type : null);
|
|
127
|
+
if (role !== 'user' && role !== 'assistant') continue;
|
|
128
|
+
const content = msg?.content ?? '';
|
|
129
|
+
|
|
130
|
+
if (role === 'user') {
|
|
131
|
+
const human = stripMachineNoise(extractHumanPrompt(content));
|
|
132
|
+
const isError = contentHasError(content);
|
|
133
|
+
// Keep the turn if it carries a human prompt OR an error result (so
|
|
134
|
+
// error-recovery counting sees it); drop pure-noise turns.
|
|
135
|
+
if (human || isError) {
|
|
136
|
+
turns.push({ role: 'user', text: human, ts, isError });
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
let text = '';
|
|
140
|
+
if (typeof content === 'string') text = content;
|
|
141
|
+
else if (Array.isArray(content)) {
|
|
142
|
+
text = content
|
|
143
|
+
.filter((b) => b && b.type === 'text')
|
|
144
|
+
.map(blockText)
|
|
145
|
+
.join('\n');
|
|
146
|
+
}
|
|
147
|
+
turns.push({ role: 'assistant', text: stripMachineNoise(text), ts, isError: false });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
turns,
|
|
153
|
+
meta: { sessionId, firstTs, lastTs, turnCount: turns.length },
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// -------------------------------------------------------------------------
|
|
158
|
+
// Deterministic friction signals
|
|
159
|
+
//
|
|
160
|
+
// Cheap, free, computed before (and fed into) the subagent. They pre-filter
|
|
161
|
+
// obviously-clean sessions and give the subagent concrete evidence to anchor
|
|
162
|
+
// on. Mirrors the family pipeline's "deterministic checks before Gemini" move.
|
|
163
|
+
// -------------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
const LONG_RESPONSE_CHARS = 4000; // a notably long assistant turn
|
|
166
|
+
const SIMILARITY_THRESHOLD = 0.6; // token-Jaccard above this = "repeated"
|
|
167
|
+
const CORRECTION_RE = /\b(no|not|nope|wait|stop|wrong|actually|isn'?t|aren'?t|doesn'?t|didn'?t|won'?t|that'?s not|still|again|undo|revert|never\s?mind)\b/i;
|
|
168
|
+
|
|
169
|
+
function tokenSet(text) {
|
|
170
|
+
return new Set(
|
|
171
|
+
String(text || '')
|
|
172
|
+
.toLowerCase()
|
|
173
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
174
|
+
.split(/\s+/)
|
|
175
|
+
.filter((w) => w.length > 2)
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function jaccard(a, b) {
|
|
180
|
+
if (a.size === 0 || b.size === 0) return 0;
|
|
181
|
+
let inter = 0;
|
|
182
|
+
for (const t of a) if (b.has(t)) inter += 1;
|
|
183
|
+
const union = a.size + b.size - inter;
|
|
184
|
+
return union === 0 ? 0 : inter / union;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function detectFrictionSignals(turns) {
|
|
188
|
+
const humanPrompts = turns.filter((t) => t.role === 'user' && t.text);
|
|
189
|
+
const tokenSets = humanPrompts.map((t) => tokenSet(t.text));
|
|
190
|
+
|
|
191
|
+
// Repeated/similar prompts: count human prompts that closely echo an earlier
|
|
192
|
+
// one (the builder rephrasing because the first attempt didn't land).
|
|
193
|
+
let repeatedSimilarPrompts = 0;
|
|
194
|
+
const repeatedExamples = [];
|
|
195
|
+
for (let i = 1; i < tokenSets.length; i += 1) {
|
|
196
|
+
let best = 0;
|
|
197
|
+
let bestJ = -1;
|
|
198
|
+
for (let j = 0; j < i; j += 1) {
|
|
199
|
+
const s = jaccard(tokenSets[i], tokenSets[j]);
|
|
200
|
+
if (s > best) {
|
|
201
|
+
best = s;
|
|
202
|
+
bestJ = j;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (best >= SIMILARITY_THRESHOLD) {
|
|
206
|
+
repeatedSimilarPrompts += 1;
|
|
207
|
+
if (repeatedExamples.length < 3) {
|
|
208
|
+
repeatedExamples.push({
|
|
209
|
+
similarity: Math.round(best * 100) / 100,
|
|
210
|
+
prompt: humanPrompts[i].text.slice(0, 200),
|
|
211
|
+
echoes: humanPrompts[bestJ].text.slice(0, 200),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Long-then-correction: a long assistant response immediately followed by a
|
|
218
|
+
// corrective human prompt — the strongest "Claude answered but didn't
|
|
219
|
+
// resolve it" signal.
|
|
220
|
+
let longResponses = 0;
|
|
221
|
+
let longThenCorrection = 0;
|
|
222
|
+
const longExamples = [];
|
|
223
|
+
for (let i = 0; i < turns.length; i += 1) {
|
|
224
|
+
const t = turns[i];
|
|
225
|
+
if (t.role !== 'assistant' || t.text.length < LONG_RESPONSE_CHARS) continue;
|
|
226
|
+
longResponses += 1;
|
|
227
|
+
// Next human prompt after this response.
|
|
228
|
+
for (let k = i + 1; k < turns.length; k += 1) {
|
|
229
|
+
if (turns[k].role === 'user' && turns[k].text) {
|
|
230
|
+
if (CORRECTION_RE.test(turns[k].text)) {
|
|
231
|
+
longThenCorrection += 1;
|
|
232
|
+
if (longExamples.length < 3) {
|
|
233
|
+
longExamples.push({
|
|
234
|
+
response_chars: t.text.length,
|
|
235
|
+
followed_by: turns[k].text.slice(0, 200),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Error-recovery attempts: tool errors the session had to work past.
|
|
245
|
+
const errorRecoveryAttempts = turns.filter((t) => t.isError).length;
|
|
246
|
+
|
|
247
|
+
const score =
|
|
248
|
+
longThenCorrection * 2 + repeatedSimilarPrompts * 2 + Math.min(errorRecoveryAttempts, 6);
|
|
249
|
+
const flagged =
|
|
250
|
+
longThenCorrection >= 1 || repeatedSimilarPrompts >= 1 || errorRecoveryAttempts >= 3;
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
longResponses,
|
|
254
|
+
longThenCorrection,
|
|
255
|
+
repeatedSimilarPrompts,
|
|
256
|
+
errorRecoveryAttempts,
|
|
257
|
+
humanPromptCount: humanPrompts.length,
|
|
258
|
+
score,
|
|
259
|
+
flagged,
|
|
260
|
+
examples: { repeated: repeatedExamples, longThenCorrection: longExamples },
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// -------------------------------------------------------------------------
|
|
265
|
+
// Subagent prompt + response validation
|
|
266
|
+
// -------------------------------------------------------------------------
|
|
267
|
+
|
|
268
|
+
// Cap the transcript text fed to the subagent so a marathon session can't
|
|
269
|
+
// blow the context window or the bill. We compact to a role-tagged turn list
|
|
270
|
+
// and truncate each turn; the deterministic signals carry the structural
|
|
271
|
+
// evidence the truncation might drop.
|
|
272
|
+
const MAX_PROMPT_CHARS = 60_000;
|
|
273
|
+
const MAX_TURN_CHARS = 1_500;
|
|
274
|
+
|
|
275
|
+
function compactTranscript(turns) {
|
|
276
|
+
const lines = [];
|
|
277
|
+
for (const t of turns) {
|
|
278
|
+
const tag = t.role === 'user' ? 'BUILDER' : 'CLAUDE';
|
|
279
|
+
let body = t.text || (t.isError ? '(tool error)' : '');
|
|
280
|
+
if (!body) continue;
|
|
281
|
+
if (body.length > MAX_TURN_CHARS) {
|
|
282
|
+
body = `${body.slice(0, MAX_TURN_CHARS)} …[${body.length - MAX_TURN_CHARS} more chars]`;
|
|
283
|
+
}
|
|
284
|
+
lines.push(`[${tag}]${t.isError ? ' (tool error)' : ''} ${body}`);
|
|
285
|
+
}
|
|
286
|
+
let text = lines.join('\n\n');
|
|
287
|
+
if (text.length > MAX_PROMPT_CHARS) {
|
|
288
|
+
// Keep the head and tail — onboarding friction tends to cluster at the
|
|
289
|
+
// start (confusion) and end (giving up / finally resolving).
|
|
290
|
+
const half = Math.floor(MAX_PROMPT_CHARS / 2);
|
|
291
|
+
text = `${text.slice(0, half)}\n\n…[middle elided]…\n\n${text.slice(-half)}`;
|
|
292
|
+
}
|
|
293
|
+
return text;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// The instance's project name, injected into the analysis prompt so a non-OTB
|
|
297
|
+
// Cloud Bongos instance onboards against ITS OWN project rather than a hardcoded
|
|
298
|
+
// "Off the Boats" (ADR 0062 §3/§5; the branding contract's llmProjectName field).
|
|
299
|
+
// Resolved LAZILY (inside the header builder, not at module load) so this module
|
|
300
|
+
// stays side-effect-free at require time — it is the *pure* half of the pipeline.
|
|
301
|
+
// Falls back to a neutral phrase if branding fails to resolve.
|
|
302
|
+
function llmProjectName() {
|
|
303
|
+
try { return require('../../src/module-api').branding().llmProjectName || 'this project'; }
|
|
304
|
+
catch { return 'this project'; }
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const analysisHeader = () => `You are reviewing one Claude Code session transcript from a NEW builder being onboarded onto the ${llmProjectName()} project. Your job is to detect moments of FRICTION — places where the builder was confused, blocked, or where the system made onboarding harder than it should be. This is "feedback without asking": the builder consented to this analysis so we can improve onboarding instead of interrogating them.
|
|
308
|
+
|
|
309
|
+
Look specifically for:
|
|
310
|
+
- long Claude responses that did NOT resolve the builder's question (the builder pushes back, repeats, or corrects right after a wall of text)
|
|
311
|
+
- the builder asking the same thing two or more times in different words (a sign the answer never landed)
|
|
312
|
+
- error-recovery loops (commands or tool calls that failed and had to be retried)
|
|
313
|
+
- the builder expressing confusion, frustration, or "I don't understand how X works"
|
|
314
|
+
|
|
315
|
+
You are given deterministic signals computed from the transcript (counts of the above) plus a compacted transcript. Use the signals as anchors but make your own judgement from the transcript text.
|
|
316
|
+
|
|
317
|
+
Return ONLY JSON matching this schema — no prose, no markdown fences:
|
|
318
|
+
{
|
|
319
|
+
"flagged": <boolean>, // true if this session contains real onboarding friction worth acting on
|
|
320
|
+
"confidence": <number 0-1>, // your confidence in the flagged decision
|
|
321
|
+
"summary": <string>, // 2-4 line plain-English summary of what tripped the builder up (or why it was smooth)
|
|
322
|
+
"friction_moments": [ // empty array if flagged=false
|
|
323
|
+
{
|
|
324
|
+
"kind": "long_unresolved" | "repeated_prompt" | "error_recovery" | "confusion" | "other",
|
|
325
|
+
"evidence": <string>, // short quote or paraphrase from the transcript
|
|
326
|
+
"suggestion": <string> // one concrete way onboarding could remove this friction
|
|
327
|
+
}
|
|
328
|
+
]
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
Be specific and concrete. A flagged=true with an empty friction_moments array is not useful. If the session was genuinely smooth, return flagged=false with a one-line summary.`;
|
|
332
|
+
|
|
333
|
+
function buildAnalysisPrompt({ sessionMeta = {}, signals = {}, turns = [] }) {
|
|
334
|
+
const lines = [];
|
|
335
|
+
lines.push(analysisHeader());
|
|
336
|
+
lines.push('');
|
|
337
|
+
lines.push('---');
|
|
338
|
+
lines.push('## Session');
|
|
339
|
+
lines.push(`session_id: ${sessionMeta.sessionId || '(unknown)'}`);
|
|
340
|
+
lines.push(`turns: ${sessionMeta.turnCount ?? turns.length}`);
|
|
341
|
+
if (sessionMeta.firstTs) lines.push(`started: ${sessionMeta.firstTs}`);
|
|
342
|
+
lines.push('');
|
|
343
|
+
lines.push('## Deterministic signals');
|
|
344
|
+
lines.push('```json');
|
|
345
|
+
lines.push(
|
|
346
|
+
JSON.stringify(
|
|
347
|
+
{
|
|
348
|
+
longResponses: signals.longResponses,
|
|
349
|
+
longThenCorrection: signals.longThenCorrection,
|
|
350
|
+
repeatedSimilarPrompts: signals.repeatedSimilarPrompts,
|
|
351
|
+
errorRecoveryAttempts: signals.errorRecoveryAttempts,
|
|
352
|
+
humanPromptCount: signals.humanPromptCount,
|
|
353
|
+
},
|
|
354
|
+
null,
|
|
355
|
+
2
|
|
356
|
+
)
|
|
357
|
+
);
|
|
358
|
+
lines.push('```');
|
|
359
|
+
lines.push('');
|
|
360
|
+
lines.push('## Compacted transcript');
|
|
361
|
+
lines.push('');
|
|
362
|
+
lines.push(compactTranscript(turns));
|
|
363
|
+
lines.push('');
|
|
364
|
+
lines.push('Now analyze. Output ONLY the JSON object — nothing before or after it.');
|
|
365
|
+
return lines.join('\n');
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Tolerant JSON extraction — same approach grader.js uses (models sometimes
|
|
369
|
+
// wrap JSON in fences or add a stray line).
|
|
370
|
+
function extractJson(raw) {
|
|
371
|
+
if (raw && typeof raw === 'object') return raw;
|
|
372
|
+
if (typeof raw !== 'string') return null;
|
|
373
|
+
const fenced = /```(?:json)?\s*\n?([\s\S]*?)```/.exec(raw);
|
|
374
|
+
const candidate = (fenced ? fenced[1] : raw).trim();
|
|
375
|
+
const first = candidate.indexOf('{');
|
|
376
|
+
const last = candidate.lastIndexOf('}');
|
|
377
|
+
if (first < 0 || last < 0 || last <= first) return null;
|
|
378
|
+
try {
|
|
379
|
+
return JSON.parse(candidate.slice(first, last + 1));
|
|
380
|
+
} catch (_) {
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
const VALID_MOMENT_KINDS = [
|
|
386
|
+
'long_unresolved',
|
|
387
|
+
'repeated_prompt',
|
|
388
|
+
'error_recovery',
|
|
389
|
+
'confusion',
|
|
390
|
+
'other',
|
|
391
|
+
];
|
|
392
|
+
|
|
393
|
+
// Normalize the subagent response into a stable shape. Never throws — a
|
|
394
|
+
// malformed response returns { ok:false, flagged:false } so the caller can
|
|
395
|
+
// decide to fall back to deterministic signals.
|
|
396
|
+
function validateAnalysis(raw) {
|
|
397
|
+
const parsed = extractJson(raw);
|
|
398
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
399
|
+
return { ok: false, flagged: false, confidence: 0, summary: '', friction_moments: [], parse_error: true };
|
|
400
|
+
}
|
|
401
|
+
const confidence = Number.isFinite(Number(parsed.confidence))
|
|
402
|
+
? Math.max(0, Math.min(1, Number(parsed.confidence)))
|
|
403
|
+
: null;
|
|
404
|
+
const moments = Array.isArray(parsed.friction_moments)
|
|
405
|
+
? parsed.friction_moments
|
|
406
|
+
.filter((m) => m && typeof m === 'object')
|
|
407
|
+
.slice(0, 20)
|
|
408
|
+
.map((m) => ({
|
|
409
|
+
kind: VALID_MOMENT_KINDS.includes(m.kind) ? m.kind : 'other',
|
|
410
|
+
evidence: String(m.evidence || '').slice(0, 500),
|
|
411
|
+
suggestion: String(m.suggestion || '').slice(0, 500),
|
|
412
|
+
}))
|
|
413
|
+
: [];
|
|
414
|
+
return {
|
|
415
|
+
ok: true,
|
|
416
|
+
flagged: parsed.flagged === true,
|
|
417
|
+
confidence,
|
|
418
|
+
summary: String(parsed.summary || '').slice(0, 2000),
|
|
419
|
+
friction_moments: moments,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// -------------------------------------------------------------------------
|
|
424
|
+
// idea_inbox payload
|
|
425
|
+
// -------------------------------------------------------------------------
|
|
426
|
+
|
|
427
|
+
function shortSession(sessionId) {
|
|
428
|
+
if (!sessionId) return 'unknown-session';
|
|
429
|
+
return String(sessionId).slice(0, 8);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// Build the { title, body_md, kind } payload for POST /api/gds/inbox. The
|
|
433
|
+
// title carries ONBOARDING_FRICTION_TAG so triage (and the future kind
|
|
434
|
+
// migration) can find these rows; the body holds the subagent summary, each
|
|
435
|
+
// friction moment, and the deterministic signals as an audit trail.
|
|
436
|
+
function buildIdeaPayload({ sessionMeta = {}, analysis, signals = {} }) {
|
|
437
|
+
const sid = shortSession(sessionMeta.sessionId);
|
|
438
|
+
const moments = analysis?.friction_moments || [];
|
|
439
|
+
const n = moments.length;
|
|
440
|
+
const title = `${ONBOARDING_FRICTION_TAG} session ${sid} — ${n} friction moment${n === 1 ? '' : 's'}`.slice(0, 200);
|
|
441
|
+
|
|
442
|
+
const lines = [];
|
|
443
|
+
lines.push(`Auto-filed from a consented onboarding session transcript (V3.R79 / C1 — feedback without asking).`);
|
|
444
|
+
lines.push('');
|
|
445
|
+
lines.push(`**Session:** \`${sessionMeta.sessionId || '(unknown)'}\``);
|
|
446
|
+
if (sessionMeta.firstTs) lines.push(`**Started:** ${sessionMeta.firstTs}`);
|
|
447
|
+
lines.push(`**Turns:** ${sessionMeta.turnCount ?? '?'}`);
|
|
448
|
+
if (analysis?.confidence != null) lines.push(`**Subagent confidence:** ${analysis.confidence}`);
|
|
449
|
+
lines.push('');
|
|
450
|
+
if (analysis?.summary) {
|
|
451
|
+
lines.push('### Summary');
|
|
452
|
+
lines.push(analysis.summary.trim());
|
|
453
|
+
lines.push('');
|
|
454
|
+
}
|
|
455
|
+
if (n > 0) {
|
|
456
|
+
lines.push('### Friction moments');
|
|
457
|
+
for (const m of moments) {
|
|
458
|
+
lines.push(`- **${m.kind}** — ${m.evidence}`);
|
|
459
|
+
if (m.suggestion) lines.push(` - _suggestion:_ ${m.suggestion}`);
|
|
460
|
+
}
|
|
461
|
+
lines.push('');
|
|
462
|
+
}
|
|
463
|
+
lines.push('### Deterministic signals');
|
|
464
|
+
lines.push('```json');
|
|
465
|
+
lines.push(
|
|
466
|
+
JSON.stringify(
|
|
467
|
+
{
|
|
468
|
+
longResponses: signals.longResponses,
|
|
469
|
+
longThenCorrection: signals.longThenCorrection,
|
|
470
|
+
repeatedSimilarPrompts: signals.repeatedSimilarPrompts,
|
|
471
|
+
errorRecoveryAttempts: signals.errorRecoveryAttempts,
|
|
472
|
+
humanPromptCount: signals.humanPromptCount,
|
|
473
|
+
score: signals.score,
|
|
474
|
+
},
|
|
475
|
+
null,
|
|
476
|
+
2
|
|
477
|
+
)
|
|
478
|
+
);
|
|
479
|
+
lines.push('```');
|
|
480
|
+
lines.push('');
|
|
481
|
+
lines.push('_Raw transcript was NOT uploaded — only this distilled friction signal. Filed during the builder\'s onboarding window with explicit consent._');
|
|
482
|
+
|
|
483
|
+
return {
|
|
484
|
+
title,
|
|
485
|
+
body_md: lines.join('\n'),
|
|
486
|
+
kind: ONBOARDING_FRICTION_KIND,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
module.exports = {
|
|
491
|
+
ONBOARDING_FRICTION_TAG,
|
|
492
|
+
ONBOARDING_FRICTION_KIND,
|
|
493
|
+
// parsing
|
|
494
|
+
parseTranscript,
|
|
495
|
+
stripMachineNoise,
|
|
496
|
+
// signals
|
|
497
|
+
detectFrictionSignals,
|
|
498
|
+
LONG_RESPONSE_CHARS,
|
|
499
|
+
SIMILARITY_THRESHOLD,
|
|
500
|
+
// subagent
|
|
501
|
+
buildAnalysisPrompt,
|
|
502
|
+
compactTranscript,
|
|
503
|
+
extractJson,
|
|
504
|
+
validateAnalysis,
|
|
505
|
+
VALID_MOMENT_KINDS,
|
|
506
|
+
// payload
|
|
507
|
+
buildIdeaPayload,
|
|
508
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// modules/onboarding/port.js — the `onboarding` kernel PORT provider surface
|
|
4
|
+
// (BV1.R81 / ADR 0093 §1).
|
|
5
|
+
//
|
|
6
|
+
// onboarding owns admission · the newcomer onboarding state machine · the
|
|
7
|
+
// evergreen-chore restock. Two of those surfaces are reached HTTP-side through
|
|
8
|
+
// the module's own routes (routes/onboarding.js mounts the access-requests
|
|
9
|
+
// admission endpoints). But several CORE files legitimately need a sliver of the
|
|
10
|
+
// STATE-MACHINE + RESTOCK surface and must NOT `require()` a module (the one-way
|
|
11
|
+
// boundary, ADR 0083). They resolve THIS port instead:
|
|
12
|
+
// • src/bongos/db.js (lifecycle) — claimTask/shipTask tick the onboarding state
|
|
13
|
+
// machine INSIDE their transaction (`markStage`) and fire the graduation
|
|
14
|
+
// broadcast after COMMIT (`broadcastGraduation`). This is the core→module
|
|
15
|
+
// direction the economy `reward` port already established.
|
|
16
|
+
// • src/bongos/auth.js — the Device-Flow + web auth callbacks mark `auth_complete`
|
|
17
|
+
// (`safeMarkStage`).
|
|
18
|
+
// • src/bongos/routes/me.js — the GET /me aggregator reads + shapes the builder's
|
|
19
|
+
// onboarding checklist (`getState`/`shapeForApi`) and PATCH /me/disciplines
|
|
20
|
+
// marks `pick_disciplines` (`safeMarkStage`).
|
|
21
|
+
// • src/bongos/routes/builders.js — GET /builders/:id/onboarding reads + shapes the
|
|
22
|
+
// roster-visible checklist (`getState`/`shapeForApi`).
|
|
23
|
+
// • src/bongos/routes/tasks.js — GET /tasks/claimable marks `first_start`
|
|
24
|
+
// (`safeMarkStage`); POST /tasks/newcomer-restock is the Archon backstop
|
|
25
|
+
// (`restockAll`); a chore claim restocks its shelf (`restockForClaim`,
|
|
26
|
+
// `SOURCE_TAG`).
|
|
27
|
+
// • src/bongos/routes/claims.js — POST /claims restocks the newcomer-chore shelf
|
|
28
|
+
// the instant one is claimed (`restockForClaim`, `SOURCE_TAG`).
|
|
29
|
+
//
|
|
30
|
+
// onboarding is default-on, so the provider is present in prod; every consumer
|
|
31
|
+
// degrades gracefully when it isn't (a vanilla instance without the module): the
|
|
32
|
+
// state-machine ticks become best-effort no-ops and the restock is skipped (the
|
|
33
|
+
// chore shelf simply isn't maintained), exactly as the surrounding try/catch
|
|
34
|
+
// already tolerated.
|
|
35
|
+
//
|
|
36
|
+
// We DELEGATE (do not spread) every method so a test that stubs a function on the
|
|
37
|
+
// live onboarding-state / newcomer-restock module object still bites at call time
|
|
38
|
+
// (the economy reward.js / builder-settings settings.js precedent — a spread
|
|
39
|
+
// captures the original reference at module-load).
|
|
40
|
+
|
|
41
|
+
const onboardingState = require('./onboarding-state');
|
|
42
|
+
const newcomerRestock = require('./newcomer-restock');
|
|
43
|
+
|
|
44
|
+
module.exports = {
|
|
45
|
+
// --- the newcomer onboarding state machine (onboarding-state.js) ---------
|
|
46
|
+
// read + shape the builder's checklist (me.js / builders.js).
|
|
47
|
+
getState: (...a) => onboardingState.getState(...a),
|
|
48
|
+
shapeForApi: (...a) => onboardingState.shapeForApi(...a),
|
|
49
|
+
// mark a stage; safeMarkStage swallows errors + fires the graduation broadcast
|
|
50
|
+
// (auth.js / me.js / tasks.js). markStage is the raw, transaction-participant
|
|
51
|
+
// form the lifecycle (db.js) runs inside its own BEGIN/COMMIT.
|
|
52
|
+
safeMarkStage: (...a) => onboardingState.safeMarkStage(...a),
|
|
53
|
+
markStage: (...a) => onboardingState.markStage(...a),
|
|
54
|
+
broadcastGraduation: (...a) => onboardingState.broadcastGraduation(...a),
|
|
55
|
+
|
|
56
|
+
// --- the evergreen newcomer-chore restock (newcomer-restock.js) ----------
|
|
57
|
+
// restock the just-claimed chore's shelf (claims.js / tasks.js); the Archon
|
|
58
|
+
// backstop tops every chore up (tasks.js). SOURCE_TAG is the marker the claim
|
|
59
|
+
// path tests a task against before restocking.
|
|
60
|
+
restockForClaim: (...a) => newcomerRestock.restockForClaim(...a),
|
|
61
|
+
restockAll: (...a) => newcomerRestock.restockAll(...a),
|
|
62
|
+
SOURCE_TAG: newcomerRestock.SOURCE_TAG,
|
|
63
|
+
};
|