@bongos/core 1.21.175 → 1.21.176
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 +3551 -1516
- package/.claude/skills/ask-for-help/SKILL.md +4 -4
- package/.claude/skills/backlog-review/SKILL.md +1 -1
- package/.claude/skills/blocker-review/SKILL.md +2 -2
- package/.claude/skills/blocker-solve/SKILL.md +4 -4
- package/.claude/skills/bongos-feedback/SKILL.md +1 -1
- package/.claude/skills/bug-triage/SKILL.md +8 -8
- package/.claude/skills/builder-backup/SKILL.md +3 -3
- package/.claude/skills/builder-claim/SKILL.md +5 -5
- package/.claude/skills/builder-cost/SKILL.md +5 -5
- package/.claude/skills/builder-end/SKILL.md +6 -6
- package/.claude/skills/builder-exit/SKILL.md +2 -2
- package/.claude/skills/builder-key/SKILL.md +6 -6
- package/.claude/skills/builder-reauth/SKILL.md +4 -4
- package/.claude/skills/builder-redteam/SKILL.md +3 -3
- package/.claude/skills/builder-release/SKILL.md +3 -3
- package/.claude/skills/builder-sequence/SKILL.md +8 -8
- package/.claude/skills/builder-setup/SKILL.md +4 -4
- package/.claude/skills/builder-ship/SKILL.md +7 -7
- package/.claude/skills/builder-stage/SKILL.md +8 -8
- package/.claude/skills/builder-start/SKILL.md +4 -4
- package/.claude/skills/collab-review/SKILL.md +5 -5
- package/.claude/skills/design/SKILL.md +6 -4
- package/.claude/skills/design-sync/SKILL.md +3 -3
- package/.claude/skills/figma-design-sync/SKILL.md +4 -4
- package/.claude/skills/fix-task/SKILL.md +8 -8
- package/.claude/skills/goal-close/SKILL.md +9 -9
- package/.claude/skills/goal-create/SKILL.md +18 -18
- package/.claude/skills/grade-recover/SKILL.md +8 -8
- package/.claude/skills/grade-sweep/SKILL.md +15 -15
- package/.claude/skills/idea-triage/SKILL.md +15 -15
- package/.claude/skills/merge-mode/SKILL.md +14 -14
- package/.claude/skills/new-project/SKILL.md +5 -5
- package/.claude/skills/owner-review/SKILL.md +1 -1
- package/.claude/skills/planning-session/SKILL.md +14 -14
- package/.claude/skills/priority-session/SKILL.md +6 -6
- package/.claude/skills/read-session-export/SKILL.md +3 -3
- package/.claude/skills/recall/SKILL.md +7 -7
- package/.claude/skills/scan-before-install/SKILL.md +3 -3
- package/.claude/skills/session-handoff/SKILL.md +1 -1
- package/.claude/skills/ship-check/SKILL.md +3 -3
- package/.claude/skills/status/SKILL.md +3 -3
- package/.claude/skills/strand-fix/SKILL.md +6 -6
- package/.claude/skills/worktree-clean/SKILL.md +4 -4
- package/.gitattributes +12 -32
- package/GOVERNMENT.md +1 -1
- package/README.md +8 -8
- package/bin/bongos.js +23 -23
- package/clients/bongos-client/README.md +2 -2
- package/clients/bongos-client/bongos-client.global.js +22 -4
- package/clients/bongos-client/index.cjs +22 -4
- package/clients/bongos-client/index.d.ts +33 -4
- package/clients/bongos-client/index.mjs +21 -3
- package/config/branding.neutral.json +1 -1
- package/config/design-tokens.schema.json +1 -1
- package/config/modules.neutral.json +1 -3
- package/docs/adr/0029-status-page-outage-resilience.md +6 -6
- package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
- package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
- package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
- package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
- package/docs/adr/README.md +2 -0
- package/docs/api/openapi.json +606 -44
- package/docs/api-reference.md +25 -12
- package/docs/architecture.md +8 -7
- package/docs/canonical-permissions.md +3 -3
- package/docs/copy-inventory.md +1370 -1411
- package/docs/copy-registry.json +2136 -2536
- package/docs/design/demonolith-plan.md +6 -6
- package/docs/design/modular-architecture/00-research-report.md +1 -1
- package/docs/design/project-startup-direction.md +2 -2
- package/docs/design/projects-hub-direction-v2.md +1 -1
- package/docs/design/reviews/hall-v2/README.md +2 -2
- package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
- package/docs/file-map.md +89 -88
- package/docs/handoff-template.md +4 -4
- package/docs/module-api-changelog.md +5 -3
- package/docs/modules-contract.md +8 -7
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
- package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
- package/docs/onboarding/diagrams/README.md +2 -2
- package/docs/onboarding/diagrams/assertions.json +2 -2
- package/docs/onboarding/slash-commands.md +2 -2
- package/docs/packs/artist.md +4 -4
- package/docs/packs/engineer.md +11 -10
- package/docs/packs/ideator.md +7 -7
- package/docs/page-inventory.json +20 -1
- package/docs/page-readings.json +4387 -4603
- package/docs/recipes/README.md +1 -1
- package/docs/recipes/audit-replay.md +4 -4
- package/docs/recipes/autobongos-windows-host.md +6 -6
- package/docs/recipes/bongos-cli-release.md +2 -2
- package/docs/recipes/claude-design-loop.md +7 -7
- package/docs/recipes/core-release-pipeline.md +19 -19
- package/docs/recipes/failed-ship-recovery-proof.md +2 -2
- package/docs/recipes/figma-design-loop.md +6 -6
- package/docs/recipes/gds-db-backup.md +9 -9
- package/docs/recipes/instance-deploy.md +3 -3
- package/docs/recipes/instance-first-run.md +1 -1
- package/docs/recipes/multi-builder-merge.md +2 -2
- package/docs/recipes/ops-gotchas.md +10 -9
- package/docs/recipes/packaging-the-core.md +6 -6
- package/docs/recipes/parallel-goal-waves.md +4 -4
- package/docs/recipes/private-npm-distribution.md +9 -9
- package/docs/recipes/redteam-patrol.md +5 -5
- package/docs/recipes/render-pilot.md +2 -2
- package/docs/recipes/reranking-a-goals-board.md +2 -2
- package/docs/recipes/search-index-ingestion.md +5 -5
- package/docs/recipes/self-host.md +1 -1
- package/docs/recipes/ship-and-regrade.md +4 -4
- package/docs/recipes/staging-environment.md +1 -1
- package/docs/recipes/standalone-live-docs.md +1 -1
- package/docs/recipes/ui-look-before-you-ship.md +2 -2
- package/docs/recipes/upgrading-the-core.md +11 -11
- package/docs/recipes/windows-builders.md +18 -18
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
- package/docs/research/task-network-map-readability.md +3 -3
- package/migrations/core_278_builder_tester_tag.sql +18 -0
- package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
- package/modules/agents/lib/answer-hold.js +1 -1
- package/modules/agents/lib/gate.js +1 -1
- package/modules/agents/lib/validate.js +1 -1
- package/modules/autonomy/gauge.js +1 -1
- package/modules/autonomy/governor-docket.js +2 -2
- package/modules/autonomy/pollers/routine-timers.js +3 -3
- package/modules/autonomy/routes/autonomy.js +3 -3
- package/modules/builder-settings/interaction-prefs.js +1 -1
- package/modules/builder-settings/render-prefs.js +1 -1
- package/modules/builder-settings/routes/settings.js +1 -1
- package/modules/builder-settings/skill-prefs.js +2 -2
- package/modules/builder-settings/wandering-prefs.js +2 -2
- package/modules/copy-desk/module.json +2 -2
- package/modules/copy-desk/page-data.js +5 -5
- package/modules/copy-desk/page-decisions.js +13 -1
- package/modules/copy-desk/proposals.js +4 -4
- package/modules/copy-desk/registry.js +2 -2
- package/modules/copy-desk/routes/copy-desk-release.js +119 -0
- package/modules/copy-desk/routes/copy-desk.js +3 -12
- package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
- package/modules/copy-desk/tests/copy_flags.mjs +1 -1
- package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
- package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
- package/modules/copy-desk/tests/copy_queue.mjs +1 -1
- package/modules/design-styles/skills/README.md +4 -4
- package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
- package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
- package/modules/discord/bug-attachments.js +1 -1
- package/modules/discord/ship-broadcast.js +1 -1
- package/modules/economy/achievements.js +49 -7
- package/modules/economy/cost-classify.js +6 -6
- package/modules/economy/cost-report.js +1 -1
- package/modules/economy/cost.js +1 -1
- package/modules/economy/credits.js +2 -1
- package/modules/economy/idea-size.js +2 -2
- package/modules/economy/reward.js +2 -0
- package/modules/economy/routes/cost.js +1 -1
- package/modules/economy/streak.js +43 -4
- package/modules/government/asks.js +1 -1
- package/modules/government/board.js +19 -2
- package/modules/government/catalog.js +3 -0
- package/modules/government/migrations/government_033_idea_vote.sql +46 -0
- package/modules/government/protected-surfaces.json +48 -47
- package/modules/government/recommendations.js +6 -2
- package/modules/government/routes/government.js +1 -1
- package/modules/grading/generated-provenance.js +13 -5
- package/modules/grading/grade-engine.js +1 -1
- package/modules/grading/grader-rubric.json +1 -1
- package/modules/grading/grader-score.js +1 -1
- package/modules/grading/grader-workers/index.js +1 -1
- package/modules/grading/grader.js +1 -1
- package/modules/grading/routes/grade.js +1 -1
- package/modules/hall-ui/public/atlas.html +5 -7
- package/modules/hall-ui/public/atlas.js +1 -1
- package/modules/hall-ui/public/atlas.states.json +1 -1
- package/modules/hall-ui/public/blockers.css +9 -0
- package/modules/hall-ui/public/blockers.html +4 -4
- package/modules/hall-ui/public/blockers.js +29 -30
- package/modules/hall-ui/public/board-room.css +5 -17
- package/modules/hall-ui/public/board-room.html +5 -6
- package/modules/hall-ui/public/board-room.js +41 -23
- package/modules/hall-ui/public/board-room.states.json +1 -1
- package/modules/hall-ui/public/brand-apply.js +1 -1
- package/modules/hall-ui/public/brand-holes.js +1 -1
- package/modules/hall-ui/public/builders.js +40 -86
- package/modules/hall-ui/public/city-decide.js +18 -4
- package/modules/hall-ui/public/city.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +6 -9
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/copy-desk.js +2 -2
- package/modules/hall-ui/public/craft-mode.js +4 -0
- package/modules/hall-ui/public/deploy.html +6 -2
- package/modules/hall-ui/public/deploy.js +21 -13
- package/modules/hall-ui/public/diagrams.css +1 -1
- package/modules/hall-ui/public/diagrams.html +5 -8
- package/modules/hall-ui/public/diagrams.states.json +1 -1
- package/modules/hall-ui/public/drachmae.html +3 -7
- package/modules/hall-ui/public/fleet.html +3 -2
- package/modules/hall-ui/public/fleet.js +0 -4
- package/modules/hall-ui/public/gate.html +7 -7
- package/modules/hall-ui/public/gate.js +58 -77
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals-page.js +5 -5
- package/modules/hall-ui/public/goals-render.js +10 -11
- package/modules/hall-ui/public/goals.css +10 -0
- package/modules/hall-ui/public/goals.html +14 -7
- package/modules/hall-ui/public/government.html +3 -5
- package/modules/hall-ui/public/government.js +1 -5
- package/modules/hall-ui/public/hall-render.js +117 -57
- package/modules/hall-ui/public/hall-widgets.js +11 -11
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +3 -1
- package/modules/hall-ui/public/ideas.js +1 -0
- package/modules/hall-ui/public/index.html +12 -6
- package/modules/hall-ui/public/index.states.json +1 -1
- package/modules/hall-ui/public/mine-lens.js +1 -1
- package/modules/hall-ui/public/modules.html +7 -10
- package/modules/hall-ui/public/modules.js +0 -2
- package/modules/hall-ui/public/my-agents.html +1 -1
- package/modules/hall-ui/public/palette.js +5 -5
- package/modules/hall-ui/public/primer.html +4 -9
- package/modules/hall-ui/public/profile-connections.js +10 -2
- package/modules/hall-ui/public/profile-roles.js +3 -10
- package/modules/hall-ui/public/profile.html +12 -10
- package/modules/hall-ui/public/profile.js +13 -17
- package/modules/hall-ui/public/project-settings.html +3 -4
- package/modules/hall-ui/public/project-settings.js +0 -3
- package/modules/hall-ui/public/ranks.html +5 -11
- package/modules/hall-ui/public/ranks.js +6 -8
- package/modules/hall-ui/public/roadmap.css +0 -2
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roadmap.js +16 -51
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +6 -8
- package/modules/hall-ui/public/sessions.js +7 -7
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell-trail.js +1 -1
- package/modules/hall-ui/public/shell.js +17 -17
- package/modules/hall-ui/public/street-deck.css +2 -1
- package/modules/hall-ui/public/street-deck.js +10 -2
- package/modules/hall-ui/public/street-desk.js +16 -5
- package/modules/hall-ui/public/street.html +1 -1
- package/modules/hall-ui/public/studio-lib.js +4 -0
- package/modules/hall-ui/public/studio.css +2 -0
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/studio.js +27 -1
- package/modules/hall-ui/public/style.css +43 -26
- package/modules/hall-ui/public/task-detail.js +10 -7
- package/modules/hall-ui/public/task.css +2 -0
- package/modules/hall-ui/public/task.html +3 -1
- package/modules/hall-ui/public/task.js +23 -7
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/vote-control.js +208 -0
- package/modules/hall-ui/public/watch.html +3 -5
- package/modules/hall-ui/public/watch.js +5 -4
- package/modules/hall-ui/public/welcome-boot.css +130 -0
- package/modules/hall-ui/public/welcome-boot.js +334 -0
- package/modules/hall-ui/public/welcome-day.webp +0 -0
- package/modules/hall-ui/public/welcome-night.webp +0 -0
- package/modules/hall-ui/public/work-summary.js +1 -1
- package/modules/hall-ui/public/work.css +1 -0
- package/modules/hall-ui/public/work.html +3 -1
- package/modules/hall-ui/public/work.js +2 -1
- package/modules/hall-ui/records/accomplishments.md +16 -0
- package/modules/hall-ui/records/hall-ask-card.md +9 -0
- package/modules/hall-ui/records/karma-vote-control.md +13 -0
- package/modules/hall-ui/records/oversight-family.md +1 -1
- package/modules/hall-ui/records/profile-connections.md +2 -0
- package/modules/hall-ui/records/profile-roles.md +1 -1
- package/modules/hall-ui/records/reading-rooms.md +1 -1
- package/modules/hall-ui/records/welcome-tower.md +50 -0
- package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
- package/modules/ideas/projection.js +1 -1
- package/modules/ideas/routes/blockers.js +3 -3
- package/modules/ideas/routes/inbox.js +29 -1
- package/modules/ideas/routes/ratify-goal.js +1 -1
- package/modules/ideas/routing.js +1 -1
- package/modules/ideas/templates.js +1 -1
- package/modules/ideas/trail-descent.js +1 -1
- package/modules/ideas/trail-size.js +1 -1
- package/modules/ideas/votes.js +93 -0
- package/modules/lifecycle/abandon-leftovers.js +1 -1
- package/modules/lifecycle/cascade.js +1 -1
- package/modules/lifecycle/conflict-resolve.js +13 -21
- package/modules/lifecycle/criterion-ref.js +1 -1
- package/modules/lifecycle/db-analytics.js +57 -4
- package/modules/lifecycle/db-deps-criteria.js +1 -1
- package/modules/lifecycle/db-ship.js +2 -2
- package/modules/lifecycle/db-tasks.js +2 -2
- package/modules/lifecycle/db-versions.js +1 -1
- package/modules/lifecycle/db.js +2 -0
- package/modules/lifecycle/dead-deps.js +3 -3
- package/modules/lifecycle/dependency-advisory.js +3 -3
- package/modules/lifecycle/goal-category.js +1 -1
- package/modules/lifecycle/goal-forest.js +1 -1
- package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
- package/modules/lifecycle/kickoff-checklist.js +1 -1
- package/modules/lifecycle/kickoff-seed.js +1 -1
- package/modules/lifecycle/lifecycle.js +2 -0
- package/modules/lifecycle/merge-reach.js +29 -15
- package/modules/lifecycle/missing-dep-classify.js +3 -3
- package/modules/lifecycle/module.json +2 -1
- package/modules/lifecycle/page-tweak-approve.js +85 -1
- package/modules/lifecycle/page-tweak-hold.js +1 -1
- package/modules/lifecycle/publish-reconciler.js +1 -2
- package/modules/lifecycle/rot.js +1 -1
- package/modules/lifecycle/routes/artist-gate.js +1 -1
- package/modules/lifecycle/routes/gate-approvals.js +22 -1
- package/modules/lifecycle/routes/goals.js +1 -1
- package/modules/lifecycle/routes/task-route-helpers.js +1 -1
- package/modules/lifecycle/routes/task-votes.js +54 -0
- package/modules/lifecycle/routes/task-write-routes.js +1 -1
- package/modules/lifecycle/routes/tasks.js +2 -2
- package/modules/lifecycle/routes/versions.js +2 -2
- package/modules/lifecycle/ship-card.js +4 -4
- package/modules/lifecycle/ship-preflight.js +1 -1
- package/modules/lifecycle/task-classifier.js +1 -1
- package/modules/lifecycle/task-status.js +1 -1
- package/modules/lifecycle/task-visual-db.js +1 -1
- package/modules/memory/learnings.js +1 -1
- package/modules/memory/pollers/search-index.js +2 -2
- package/modules/memory/routes/learnings.js +1 -1
- package/modules/memory/routes/memory.js +1 -1
- package/modules/memory/search.js +2 -2
- package/modules/npm-release/release.js +1 -1
- package/modules/onboarding/howto-moments.js +1 -1
- package/modules/onboarding/newcomer-restock.js +3 -3
- package/modules/onboarding/onboarding.js +1 -1
- package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
- package/modules/platform-identity/origin-containment.js +1 -1
- package/modules/platform-identity/publish-gate.js +1 -1
- package/modules/platform-identity/tests/platform-identity.mjs +1 -1
- package/modules/provisioning/capacity.js +1 -1
- package/modules/provisioning/core-upgrade.js +15 -9
- package/modules/provisioning/credential-preflight.js +3 -3
- package/modules/provisioning/disconnect.js +1 -1
- package/modules/provisioning/dns-resolves.js +1 -1
- package/modules/provisioning/module.json +1 -1
- package/modules/provisioning/onboard-plan.js +1 -1
- package/modules/provisioning/paid-shape-gate.js +2 -2
- package/modules/provisioning/planet-physics.js +11 -2
- package/modules/provisioning/pollers/liveness-sweep.js +1 -1
- package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/render-lookup.js +1 -1
- package/modules/provisioning/render-standup.js +3 -3
- package/modules/provisioning/repo-private.js +1 -1
- package/modules/provisioning/routes/callback-page.js +1 -1
- package/modules/provisioning/routes/core-upgrade.js +23 -3
- package/modules/provisioning/routes/provisioning.js +2 -2
- package/modules/provisioning/routes/render-standup.js +1 -1
- package/modules/provisioning/routes/repo-private.js +1 -1
- package/modules/provisioning/soft-limits.js +1 -1
- package/modules/provisioning/starter-bundles.js +4 -2
- package/modules/provisioning/tests/provisioning.mjs +1 -1
- package/modules/public-landing/public/account.html +4 -6
- package/modules/public-landing/public/assets/cosmos.css +13 -6
- package/modules/public-landing/public/connections.html +4 -6
- package/modules/public-landing/public/contact.html +4 -6
- package/modules/public-landing/public/guild.html +4 -6
- package/modules/public-landing/public/index.html +11 -9
- package/modules/public-landing/public/invitations.html +4 -6
- package/modules/public-landing/public/privacy.html +4 -6
- package/modules/public-landing/public/projects.html +168 -46
- package/modules/public-landing/public/terms.html +4 -6
- package/modules/raise/content/copy.json +40 -0
- package/modules/raise/content/nda.html +39 -0
- package/modules/raise/content/settings.json +49 -0
- package/modules/raise/db.js +95 -0
- package/modules/raise/migrations/raise_001_tables.sql +71 -0
- package/modules/raise/module.json +28 -0
- package/modules/raise/page.js +194 -0
- package/modules/raise/public/edit.js +152 -0
- package/modules/raise/public/favicon.svg +1 -0
- package/modules/raise/public/logo-ink.svg +1 -0
- package/modules/raise/public/logo-night.svg +1 -0
- package/modules/raise/public/mode.js +8 -0
- package/modules/raise/public/raise.css +234 -0
- package/modules/raise/public/raise.js +91 -0
- package/modules/raise/raise.js +174 -0
- package/modules/raise/routes/raise.js +152 -0
- package/modules/raise/views/gate.html +39 -0
- package/modules/raise/views/nda.html +21 -0
- package/modules/raise/views/page.html +133 -0
- package/modules/raise/web.js +72 -0
- package/modules/render-deploy/deploys.js +1 -1
- package/modules/render-deploy/render.js +2 -2
- package/modules/security/secret-scrub.js +3 -3
- package/modules/security/security.js +1 -1
- package/modules/security/tests/artifact_scan.mjs +1 -1
- package/modules/security/tests/mirror.mjs +1 -1
- package/modules/security/tests/scan_store.mjs +1 -1
- package/modules/sessions/db.js +2 -2
- package/modules/sessions/pulse.js +2 -2
- package/modules/sessions/routes/sessions.js +1 -1
- package/modules/specialities/specialities.js +1 -1
- package/modules/status-ui/public/README.md +3 -4
- package/modules/status-ui/public/index.html +5 -31
- package/modules/status-ui/public/status.js +6 -174
- package/modules/status-ui/public/style.css +4 -133
- package/modules/ui-design/docs/design-contract.md +3 -3
- package/modules/ui-design/kit/README.md +1 -1
- package/modules/ui-design/kit/serve.js +13 -4
- package/modules/ui-design/scripts/design-sync.js +1 -1
- package/modules/ui-design/scripts/figma-design-sync.js +1 -1
- package/modules/ui-design/scripts/validate-design.js +1 -1
- package/package-lock.json +27 -11
- package/package.json +2 -3
- package/release-notes.json +172 -0
- package/scripts/bongos/CLAUDE.md +15 -0
- package/scripts/bongos/abandon.js +137 -0
- package/scripts/bongos/accessibility-replay.js +195 -0
- package/scripts/bongos/address-park-sweep.sh +91 -0
- package/scripts/bongos/adopt-detect.js +123 -0
- package/scripts/bongos/adopt-import.js +111 -0
- package/scripts/bongos/adopt-preflight.js +187 -0
- package/scripts/bongos/adr-namespace.js +273 -0
- package/scripts/bongos/agent-invoke.js +689 -0
- package/scripts/bongos/agents-sync.js +502 -0
- package/scripts/bongos/api-alias-caller-scan.js +256 -0
- package/scripts/bongos/api-artifacts.js +91 -0
- package/scripts/bongos/api.js +86 -0
- package/scripts/bongos/api.ps1 +26 -0
- package/scripts/bongos/architect-audit.js +294 -0
- package/scripts/bongos/artifact-audit.js +326 -0
- package/scripts/bongos/artifact-format.js +203 -0
- package/scripts/bongos/artifact-staleness.js +267 -0
- package/scripts/bongos/ask.js +231 -0
- package/scripts/bongos/audit-authorship.sh +329 -0
- package/scripts/bongos/audit-deps.js +189 -0
- package/scripts/bongos/audit-gate.js +121 -0
- package/scripts/bongos/audit-rank-roles.js +172 -0
- package/scripts/bongos/audit-replay.sh +205 -0
- package/scripts/bongos/autobongos-digest.js +123 -0
- package/scripts/bongos/autobongos-grade-cap.js +187 -0
- package/scripts/bongos/autobongos-loop.js +210 -0
- package/scripts/bongos/autobongos-run.js +1361 -0
- package/scripts/bongos/autobongos-service.cmd +50 -0
- package/scripts/bongos/autobongos-service.ps1 +270 -0
- package/scripts/bongos/autobongos-tweak-lane.js +262 -0
- package/scripts/bongos/autobongos-verify.js +618 -0
- package/scripts/bongos/autonomy-gate.js +135 -0
- package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
- package/scripts/bongos/autonomy-gauge.js +84 -0
- package/scripts/bongos/backfill-cost.js +176 -0
- package/scripts/bongos/backfill-disciplines.js +144 -0
- package/scripts/bongos/backfill-session-earnings.js +123 -0
- package/scripts/bongos/backfill-session-types.js +87 -0
- package/scripts/bongos/backfill-sessions.js +411 -0
- package/scripts/bongos/backfill-subagent-rewards.js +485 -0
- package/scripts/bongos/backfill-task-rewards.js +413 -0
- package/scripts/bongos/backlog-review.js +399 -0
- package/scripts/bongos/backup-dropin-sweep.sh +95 -0
- package/scripts/bongos/backup.js +116 -0
- package/scripts/bongos/baseline-staleness.js +217 -0
- package/scripts/bongos/bfg-principal-token.js +65 -0
- package/scripts/bongos/bug-attachment-audit.js +149 -0
- package/scripts/bongos/bug-attachment-recover.js +198 -0
- package/scripts/bongos/bug-triage.js +292 -0
- package/scripts/bongos/build-bongos.js +94 -0
- package/scripts/bongos/bump-version.js +221 -0
- package/scripts/bongos/capture.js +481 -0
- package/scripts/bongos/category-advisory-guard.js +206 -0
- package/scripts/bongos/ci-grade.js +82 -0
- package/scripts/bongos/claim-recall.js +112 -0
- package/scripts/bongos/claim.js +789 -0
- package/scripts/bongos/classify-discipline.js +153 -0
- package/scripts/bongos/claude-materialize.js +1200 -0
- package/scripts/bongos/claude-md-template.js +142 -0
- package/scripts/bongos/cleanup-orphans.js +74 -0
- package/scripts/bongos/cli-lib.js +1226 -0
- package/scripts/bongos/client-baseurl-guard.js +116 -0
- package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
- package/scripts/bongos/codemod-rename-src-gds.js +145 -0
- package/scripts/bongos/conductor-dispatch.js +535 -0
- package/scripts/bongos/context-pack.js +326 -0
- package/scripts/bongos/control-manifest.js +199 -0
- package/scripts/bongos/copy-apply.js +758 -0
- package/scripts/bongos/copy-inventory.js +571 -0
- package/scripts/bongos/core-origin-follow.js +185 -0
- package/scripts/bongos/core-pin-sync.js +260 -0
- package/scripts/bongos/coreB-carve-proof.sh +725 -0
- package/scripts/bongos/cost-report.js +63 -0
- package/scripts/bongos/cost.js +47 -0
- package/scripts/bongos/credential-presence.js +296 -0
- package/scripts/bongos/cutover-codemod.js +240 -0
- package/scripts/bongos/db-backup-nightly.sh +232 -0
- package/scripts/bongos/db-backup-offsite.sh +267 -0
- package/scripts/bongos/demote.js +45 -0
- package/scripts/bongos/deploy-divergence.js +454 -0
- package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
- package/scripts/bongos/design-sync.js +12 -0
- package/scripts/bongos/dev-box-guard.js +166 -0
- package/scripts/bongos/dev-lib.js +722 -0
- package/scripts/bongos/dev.js +645 -0
- package/scripts/bongos/device-flow-help.js +72 -0
- package/scripts/bongos/diagnose-achievements.js +118 -0
- package/scripts/bongos/diagram-facts.js +355 -0
- package/scripts/bongos/discord-channels.js +77 -0
- package/scripts/bongos/do-api.js +109 -0
- package/scripts/bongos/doc-cli-guard.js +274 -0
- package/scripts/bongos/doc-comment-coverage.js +139 -0
- package/scripts/bongos/doc-control-claims.js +170 -0
- package/scripts/bongos/docs-entropy.js +453 -0
- package/scripts/bongos/doctor.js +493 -0
- package/scripts/bongos/enroll-control-plane.js +101 -0
- package/scripts/bongos/exec-path-guard.js +564 -0
- package/scripts/bongos/feedback-send.js +249 -0
- package/scripts/bongos/fetch-art-key.js +106 -0
- package/scripts/bongos/fetch-sound-prefs.js +126 -0
- package/scripts/bongos/figma-design-sync.js +11 -0
- package/scripts/bongos/find-untested.js +371 -0
- package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
- package/scripts/bongos/fitness-checks-identity.js +343 -0
- package/scripts/bongos/fitness-checks-packaging.js +132 -0
- package/scripts/bongos/fitness-checks-route-pins.js +76 -0
- package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
- package/scripts/bongos/fitness-checks-write-validation.js +157 -0
- package/scripts/bongos/fitness-lib.js +127 -0
- package/scripts/bongos/fitness-migration-contraction.js +50 -0
- package/scripts/bongos/fitness-ratchets.js +594 -0
- package/scripts/bongos/fitness.js +1498 -0
- package/scripts/bongos/forwarder.js +80 -0
- package/scripts/bongos/gate-review.js +330 -0
- package/scripts/bongos/gating.js +348 -0
- package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
- package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
- package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
- package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
- package/scripts/bongos/gds-literal-scan.js +196 -0
- package/scripts/bongos/gen-api-client.js +576 -0
- package/scripts/bongos/gen-api-docs.js +1111 -0
- package/scripts/bongos/gen-atlas.js +366 -0
- package/scripts/bongos/gen-diagrams.js +608 -0
- package/scripts/bongos/gen-file-map.js +337 -0
- package/scripts/bongos/gen-freshness.js +32 -0
- package/scripts/bongos/gen-interaction-posture.js +122 -0
- package/scripts/bongos/gen-repo-map.js +540 -0
- package/scripts/bongos/gen-role-responsibilities.js +134 -0
- package/scripts/bongos/gen-session-index.js +243 -0
- package/scripts/bongos/gen-sounds.js +176 -0
- package/scripts/bongos/git-merge-regen.js +254 -0
- package/scripts/bongos/go-live.js +1071 -0
- package/scripts/bongos/goal-names.js +102 -0
- package/scripts/bongos/goal.js +272 -0
- package/scripts/bongos/government-walk.js +1477 -0
- package/scripts/bongos/grade-correlation-audit.js +310 -0
- package/scripts/bongos/grade-replay.js +237 -0
- package/scripts/bongos/grade-smoke.js +205 -0
- package/scripts/bongos/home-isolation-guard.js +126 -0
- package/scripts/bongos/hooks/pre-push.js +211 -0
- package/scripts/bongos/howto.js +145 -0
- package/scripts/bongos/http-api-client.js +81 -0
- package/scripts/bongos/identity-strip.js +75 -0
- package/scripts/bongos/init.js +1159 -0
- package/scripts/bongos/install-git-hooks.js +200 -0
- package/scripts/bongos/instance-apex.js +38 -0
- package/scripts/bongos/intent-retry.js +52 -0
- package/scripts/bongos/key-card.js +222 -0
- package/scripts/bongos/key-status.js +126 -0
- package/scripts/bongos/land-watch.js +201 -0
- package/scripts/bongos/leak-scan-allowlist.js +293 -0
- package/scripts/bongos/learning-capture.js +145 -0
- package/scripts/bongos/lib.sh +74 -0
- package/scripts/bongos/linkify-refs.js +655 -0
- package/scripts/bongos/lint-infra-exec.js +70 -0
- package/scripts/bongos/lint-migrations.js +102 -0
- package/scripts/bongos/lint-workflow-exec.js +63 -0
- package/scripts/bongos/local-preview-lib.js +128 -0
- package/scripts/bongos/local-preview.js +82 -0
- package/scripts/bongos/login.js +360 -0
- package/scripts/bongos/main-audit.js +625 -0
- package/scripts/bongos/me.js +97 -0
- package/scripts/bongos/memory-map.js +176 -0
- package/scripts/bongos/merge-lock.js +71 -0
- package/scripts/bongos/migration-namespace.js +313 -0
- package/scripts/bongos/mirror-lineage-check.js +343 -0
- package/scripts/bongos/mirror-redact.js +350 -0
- package/scripts/bongos/module-artifact.js +289 -0
- package/scripts/bongos/module-assess-docs.js +238 -0
- package/scripts/bongos/module-assess-installs.js +228 -0
- package/scripts/bongos/module-assess-score.js +111 -0
- package/scripts/bongos/module-assess-security.js +252 -0
- package/scripts/bongos/module-assess-tests.js +278 -0
- package/scripts/bongos/module-assess-version.js +92 -0
- package/scripts/bongos/module-error-report.js +148 -0
- package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
- package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
- package/scripts/bongos/module-test-runner.js +414 -0
- package/scripts/bongos/module.js +1376 -0
- package/scripts/bongos/move-escalation.js +141 -0
- package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
- package/scripts/bongos/newcomer-floor.js +421 -0
- package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
- package/scripts/bongos/newcomer-floor.test.js +235 -0
- package/scripts/bongos/next-number.js +163 -0
- package/scripts/bongos/oauth-secret.js +202 -0
- package/scripts/bongos/onboard.js +267 -0
- package/scripts/bongos/onboarding-analyze.js +226 -0
- package/scripts/bongos/onboarding-config.js +179 -0
- package/scripts/bongos/onboarding-ship.js +92 -0
- package/scripts/bongos/pack-env-prefix.js +73 -0
- package/scripts/bongos/package-core.js +1200 -0
- package/scripts/bongos/page-inventory.js +348 -0
- package/scripts/bongos/page-reader.js +722 -0
- package/scripts/bongos/paste-token.js +212 -0
- package/scripts/bongos/plain-cards.js +351 -0
- package/scripts/bongos/portability-smoke-art.sh +85 -0
- package/scripts/bongos/portability-smoke-memory.sh +176 -0
- package/scripts/bongos/preflight.js +214 -0
- package/scripts/bongos/probe-cache.js +246 -0
- package/scripts/bongos/prove-strict-versioning.js +284 -0
- package/scripts/bongos/provision-auto-upgrade.js +162 -0
- package/scripts/bongos/provision-byo-host.js +68 -0
- package/scripts/bongos/provision-capacity.js +79 -0
- package/scripts/bongos/provision-caps.js +63 -0
- package/scripts/bongos/provision-config.js +233 -0
- package/scripts/bongos/provision-core-upgrade.js +1166 -0
- package/scripts/bongos/provision-disconnect.js +88 -0
- package/scripts/bongos/provision-github-setup.js +168 -0
- package/scripts/bongos/provision-net.js +357 -0
- package/scripts/bongos/provision-pin-key.js +176 -0
- package/scripts/bongos/provision-pin-replay.js +126 -0
- package/scripts/bongos/provision-process.js +170 -0
- package/scripts/bongos/provision-render.js +201 -0
- package/scripts/bongos/provision-repo-auth.js +164 -0
- package/scripts/bongos/provision-repo-private.js +98 -0
- package/scripts/bongos/provision-repo.js +1337 -0
- package/scripts/bongos/provision-teardown.js +106 -0
- package/scripts/bongos/provision-units.js +469 -0
- package/scripts/bongos/provision.js +1479 -0
- package/scripts/bongos/publish-credential-check.js +66 -0
- package/scripts/bongos/publish-integration-gate.js +142 -0
- package/scripts/bongos/publish-manifest.js +440 -0
- package/scripts/bongos/publish-watch.js +268 -0
- package/scripts/bongos/pulse.js +336 -0
- package/scripts/bongos/push-main.js +56 -0
- package/scripts/bongos/push-path-brief.js +100 -0
- package/scripts/bongos/read-session-export.js +359 -0
- package/scripts/bongos/reauth.js +155 -0
- package/scripts/bongos/recall.js +183 -0
- package/scripts/bongos/redteam-patrol.js +437 -0
- package/scripts/bongos/regen-instance-docs.js +47 -0
- package/scripts/bongos/release-core.js +80 -0
- package/scripts/bongos/release-notes.js +271 -0
- package/scripts/bongos/release.js +139 -0
- package/scripts/bongos/rename-goals.js +109 -0
- package/scripts/bongos/rename-history-check.js +369 -0
- package/scripts/bongos/rename-ledger-prose.js +482 -0
- package/scripts/bongos/render-api.js +197 -0
- package/scripts/bongos/render-check.js +206 -0
- package/scripts/bongos/render-ideas.js +226 -0
- package/scripts/bongos/render-payload.js +85 -0
- package/scripts/bongos/repo-metrics.js +363 -0
- package/scripts/bongos/review-sheet.js +108 -0
- package/scripts/bongos/role-pack-guard.js +142 -0
- package/scripts/bongos/route-shadow-guard.js +175 -0
- package/scripts/bongos/routine-schedule.js +283 -0
- package/scripts/bongos/run-routine.js +257 -0
- package/scripts/bongos/run-unit-tests.js +654 -0
- package/scripts/bongos/runner-drift.js +151 -0
- package/scripts/bongos/sandbox-stage.js +459 -0
- package/scripts/bongos/scope-map-guard.js +300 -0
- package/scripts/bongos/scope-roster-guard.js +118 -0
- package/scripts/bongos/seam-wiring-guard.js +275 -0
- package/scripts/bongos/search-ingest-db.js +288 -0
- package/scripts/bongos/search-ingest-md.js +269 -0
- package/scripts/bongos/seed-adopt-tasks.js +75 -0
- package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/bongos/seed-board-room-tasks.js +196 -0
- package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
- package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/bongos/seed-bongos-tasks.js +214 -0
- package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
- package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
- package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
- package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
- package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
- package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
- package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
- package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
- package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
- package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
- package/scripts/bongos/seed-governance-tasks.js +340 -0
- package/scripts/bongos/seed-medusa-tasks.js +440 -0
- package/scripts/bongos/seed-module-upstreaming.js +219 -0
- package/scripts/bongos/seed-productization-tasks.js +235 -0
- package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
- package/scripts/bongos/seed-provisioning-tasks.js +83 -0
- package/scripts/bongos/seed-staging.sh +117 -0
- package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
- package/scripts/bongos/seed-v2-world-tasks.js +283 -0
- package/scripts/bongos/seed-verify-criteria.js +124 -0
- package/scripts/bongos/sequence.js +597 -0
- package/scripts/bongos/session-cost.js +430 -0
- package/scripts/bongos/session-digest-build.js +293 -0
- package/scripts/bongos/session-digest.js +200 -0
- package/scripts/bongos/session-eval.js +631 -0
- package/scripts/bongos/session-transcript-build.js +155 -0
- package/scripts/bongos/session-transcript-upload.js +29 -0
- package/scripts/bongos/session.js +404 -0
- package/scripts/bongos/setup.js +646 -0
- package/scripts/bongos/ship-check.js +89 -0
- package/scripts/bongos/ship-deploy-target.js +393 -0
- package/scripts/bongos/ship-escalation.js +167 -0
- package/scripts/bongos/ship-finish.js +420 -0
- package/scripts/bongos/ship-flow.js +1217 -0
- package/scripts/bongos/ship-git.js +100 -0
- package/scripts/bongos/ship-grade-steps.js +547 -0
- package/scripts/bongos/ship-grade.js +426 -0
- package/scripts/bongos/ship-honesty.js +314 -0
- package/scripts/bongos/ship-io.js +139 -0
- package/scripts/bongos/ship-land.js +1130 -0
- package/scripts/bongos/ship-memory-sync.js +249 -0
- package/scripts/bongos/ship-merge-gate.js +225 -0
- package/scripts/bongos/ship-merge.js +466 -0
- package/scripts/bongos/ship-mode-ask.js +138 -0
- package/scripts/bongos/ship-mode-manual.js +54 -0
- package/scripts/bongos/ship-preflight-steps.js +399 -0
- package/scripts/bongos/ship-regen.js +292 -0
- package/scripts/bongos/ship-resume.js +201 -0
- package/scripts/bongos/ship-session-upload.js +313 -0
- package/scripts/bongos/ship-state.js +110 -0
- package/scripts/bongos/ship-surprise.js +84 -0
- package/scripts/bongos/ship-visual.js +75 -0
- package/scripts/bongos/ship.js +382 -0
- package/scripts/bongos/shipping-mode.js +71 -0
- package/scripts/bongos/skill-lint.js +250 -0
- package/scripts/bongos/skill-preflight.js +361 -0
- package/scripts/bongos/smoke-batch-claim.sh +238 -0
- package/scripts/bongos/smoke-batch-release.sh +316 -0
- package/scripts/bongos/smoke-claim-consistency.sh +222 -0
- package/scripts/bongos/smoke-dependencies.sh +143 -0
- package/scripts/bongos/smoke-gds.js +256 -0
- package/scripts/bongos/smoke-write.sh +275 -0
- package/scripts/bongos/source-text-test-scan.js +106 -0
- package/scripts/bongos/spark.js +294 -0
- package/scripts/bongos/stale-worktrees.js +212 -0
- package/scripts/bongos/start-goals.js +102 -0
- package/scripts/bongos/start.js +1090 -0
- package/scripts/bongos/status.js +545 -0
- package/scripts/bongos/strand-watch.js +315 -0
- package/scripts/bongos/stranded-rows.js +200 -0
- package/scripts/bongos/stray-unit-sweep.sh +71 -0
- package/scripts/bongos/surface.js +101 -0
- package/scripts/bongos/task.js +273 -0
- package/scripts/bongos/test-path-guard.js +99 -0
- package/scripts/bongos/triage.js +742 -0
- package/scripts/bongos/turn-end-sound.js +74 -0
- package/scripts/bongos/tweak-halt.js +70 -0
- package/scripts/bongos/tweak-renders.js +200 -0
- package/scripts/bongos/uat.js +120 -0
- package/scripts/bongos/ui-kit-transform.js +43 -0
- package/scripts/bongos/update-channel.js +512 -0
- package/scripts/bongos/update-sweep.js +829 -0
- package/scripts/bongos/upgrade-artist-gate.js +46 -0
- package/scripts/bongos/upgrade-commit-identity.js +32 -0
- package/scripts/bongos/upgrade-migrate.js +224 -0
- package/scripts/bongos/upgrade-operator.js +73 -0
- package/scripts/bongos/upgrade-outcome.js +174 -0
- package/scripts/bongos/upgrade.js +1499 -0
- package/scripts/bongos/validate-design.js +12 -0
- package/scripts/bongos/version-close.js +621 -0
- package/scripts/bongos/version-literal-guard.js +140 -0
- package/scripts/bongos/version-select.js +79 -0
- package/scripts/bongos/visual-review-nudge.js +39 -0
- package/scripts/bongos/wedge-remedy.js +174 -0
- package/scripts/bongos/worktree-claim-guard.js +130 -0
- package/scripts/bongos/worktree.js +449 -0
- package/scripts/discord/post.js +1 -1
- package/scripts/gds/README.md +9 -0
- package/scripts/gds/abandon.js +6 -136
- package/scripts/gds/accessibility-replay.js +5 -194
- package/scripts/gds/address-park-sweep.sh +7 -90
- package/scripts/gds/adopt-detect.js +5 -121
- package/scripts/gds/adopt-import.js +5 -109
- package/scripts/gds/adopt-preflight.js +5 -185
- package/scripts/gds/adr-namespace.js +5 -271
- package/scripts/gds/agent-invoke.js +5 -687
- package/scripts/gds/agents-sync.js +5 -500
- package/scripts/gds/api-alias-caller-scan.js +5 -255
- package/scripts/gds/api-artifacts.js +6 -0
- package/scripts/gds/api.js +6 -85
- package/scripts/gds/api.ps1 +8 -26
- package/scripts/gds/architect-audit.js +6 -293
- package/scripts/gds/artifact-audit.js +5 -324
- package/scripts/gds/artifact-format.js +6 -203
- package/scripts/gds/artifact-staleness.js +5 -265
- package/scripts/gds/ask.js +5 -229
- package/scripts/gds/audit-authorship.sh +7 -328
- package/scripts/gds/audit-deps.js +6 -188
- package/scripts/gds/audit-gate.js +5 -119
- package/scripts/gds/audit-rank-roles.js +6 -171
- package/scripts/gds/audit-replay.sh +7 -204
- package/scripts/gds/autobongos-digest.js +5 -121
- package/scripts/gds/autobongos-grade-cap.js +5 -186
- package/scripts/gds/autobongos-loop.js +5 -208
- package/scripts/gds/autobongos-run.js +5 -1359
- package/scripts/gds/autobongos-service.cmd +8 -49
- package/scripts/gds/autobongos-service.ps1 +8 -270
- package/scripts/gds/autobongos-tweak-lane.js +5 -261
- package/scripts/gds/autobongos-verify.js +5 -616
- package/scripts/gds/autonomy-gate.js +5 -133
- package/scripts/gds/autonomy-gauge-statusline.js +5 -122
- package/scripts/gds/autonomy-gauge.js +5 -82
- package/scripts/gds/backfill-cost.js +6 -175
- package/scripts/gds/backfill-disciplines.js +5 -142
- package/scripts/gds/backfill-session-earnings.js +5 -121
- package/scripts/gds/backfill-session-types.js +5 -85
- package/scripts/gds/backfill-sessions.js +5 -409
- package/scripts/gds/backfill-subagent-rewards.js +5 -483
- package/scripts/gds/backfill-task-rewards.js +5 -411
- package/scripts/gds/backlog-review.js +6 -398
- package/scripts/gds/backup-dropin-sweep.sh +7 -94
- package/scripts/gds/backup.js +6 -115
- package/scripts/gds/baseline-staleness.js +5 -215
- package/scripts/gds/bfg-principal-token.js +6 -64
- package/scripts/gds/bug-attachment-audit.js +5 -147
- package/scripts/gds/bug-attachment-recover.js +5 -196
- package/scripts/gds/bug-triage.js +6 -291
- package/scripts/gds/build-bongos.js +5 -92
- package/scripts/gds/bump-version.js +5 -219
- package/scripts/gds/capture.js +6 -480
- package/scripts/gds/category-advisory-guard.js +5 -205
- package/scripts/gds/ci-grade.js +6 -81
- package/scripts/gds/claim-recall.js +6 -111
- package/scripts/gds/claim.js +6 -788
- package/scripts/gds/classify-discipline.js +6 -152
- package/scripts/gds/claude-materialize.js +5 -1198
- package/scripts/gds/claude-md-template.js +5 -140
- package/scripts/gds/cleanup-orphans.js +6 -73
- package/scripts/gds/cli-lib.js +6 -1204
- package/scripts/gds/client-baseurl-guard.js +5 -114
- package/scripts/gds/codemod-rename-src-gds.js +6 -144
- package/scripts/gds/conductor-dispatch.js +6 -534
- package/scripts/gds/context-pack.js +6 -325
- package/scripts/gds/control-manifest.js +5 -197
- package/scripts/gds/copy-apply.js +5 -756
- package/scripts/gds/copy-inventory.js +5 -569
- package/scripts/gds/core-origin-follow.js +5 -184
- package/scripts/gds/core-pin-sync.js +5 -258
- package/scripts/gds/coreB-carve-proof.sh +7 -724
- package/scripts/gds/cost-report.js +6 -62
- package/scripts/gds/cost.js +6 -46
- package/scripts/gds/credential-presence.js +5 -294
- package/scripts/gds/cutover-codemod.js +5 -239
- package/scripts/gds/db-backup-nightly.sh +7 -231
- package/scripts/gds/db-backup-offsite.sh +7 -266
- package/scripts/gds/demote.js +6 -44
- package/scripts/gds/deploy-divergence.js +6 -445
- package/scripts/gds/deploy-main-audit-gate.sh +7 -96
- package/scripts/gds/design-sync.js +5 -10
- package/scripts/gds/dev-box-guard.js +5 -164
- package/scripts/gds/dev-lib.js +5 -721
- package/scripts/gds/dev.js +5 -643
- package/scripts/gds/device-flow-help.js +5 -70
- package/scripts/gds/diagnose-achievements.js +5 -116
- package/scripts/gds/diagram-facts.js +6 -355
- package/scripts/gds/discord-channels.js +5 -75
- package/scripts/gds/do-api.js +6 -109
- package/scripts/gds/doc-cli-guard.js +5 -266
- package/scripts/gds/doc-comment-coverage.js +5 -137
- package/scripts/gds/doc-control-claims.js +5 -166
- package/scripts/gds/docs-entropy.js +5 -443
- package/scripts/gds/doctor.js +6 -492
- package/scripts/gds/enroll-control-plane.js +5 -99
- package/scripts/gds/exec-path-guard.js +5 -562
- package/scripts/gds/feedback-send.js +5 -247
- package/scripts/gds/fetch-art-key.js +5 -104
- package/scripts/gds/fetch-sound-prefs.js +5 -124
- package/scripts/gds/figma-design-sync.js +5 -9
- package/scripts/gds/find-untested.js +5 -369
- package/scripts/gds/fitness-checks-error-envelope.js +5 -133
- package/scripts/gds/fitness-checks-identity.js +5 -342
- package/scripts/gds/fitness-checks-packaging.js +5 -131
- package/scripts/gds/fitness-checks-route-pins.js +5 -75
- package/scripts/gds/fitness-checks-vocabulary.js +5 -391
- package/scripts/gds/fitness-checks-write-validation.js +5 -156
- package/scripts/gds/fitness-lib.js +5 -126
- package/scripts/gds/fitness-migration-contraction.js +5 -49
- package/scripts/gds/fitness-ratchets.js +5 -563
- package/scripts/gds/fitness.js +5 -1493
- package/scripts/gds/gate-review.js +5 -328
- package/scripts/gds/gating.js +5 -346
- package/scripts/gds/gds-literal-scan.js +5 -194
- package/scripts/gds/gen-api-client.js +5 -555
- package/scripts/gds/gen-api-docs.js +5 -1100
- package/scripts/gds/gen-atlas.js +5 -364
- package/scripts/gds/gen-diagrams.js +6 -607
- package/scripts/gds/gen-file-map.js +5 -335
- package/scripts/gds/gen-freshness.js +5 -31
- package/scripts/gds/gen-interaction-posture.js +5 -120
- package/scripts/gds/gen-repo-map.js +5 -538
- package/scripts/gds/gen-role-responsibilities.js +5 -133
- package/scripts/gds/gen-session-index.js +5 -241
- package/scripts/gds/gen-sounds.js +5 -174
- package/scripts/gds/git-merge-regen.js +6 -291
- package/scripts/gds/go-live.js +5 -1069
- package/scripts/gds/goal-names.js +5 -100
- package/scripts/gds/goal.js +6 -271
- package/scripts/gds/government-walk.js +5 -1475
- package/scripts/gds/grade-correlation-audit.js +5 -308
- package/scripts/gds/grade-replay.js +5 -235
- package/scripts/gds/grade-smoke.js +6 -204
- package/scripts/gds/home-isolation-guard.js +5 -125
- package/scripts/gds/hooks/pre-push.js +5 -209
- package/scripts/gds/howto.js +5 -143
- package/scripts/gds/http-api-client.js +6 -81
- package/scripts/gds/identity-strip.js +5 -74
- package/scripts/gds/init.js +5 -1157
- package/scripts/gds/install-git-hooks.js +5 -198
- package/scripts/gds/instance-apex.js +5 -37
- package/scripts/gds/intent-retry.js +5 -51
- package/scripts/gds/key-card.js +6 -221
- package/scripts/gds/key-status.js +5 -124
- package/scripts/gds/land-watch.js +5 -199
- package/scripts/gds/leak-scan-allowlist.js +5 -291
- package/scripts/gds/learning-capture.js +6 -144
- package/scripts/gds/lib.sh +7 -73
- package/scripts/gds/linkify-refs.js +6 -654
- package/scripts/gds/lint-infra-exec.js +5 -68
- package/scripts/gds/lint-migrations.js +5 -100
- package/scripts/gds/lint-workflow-exec.js +5 -61
- package/scripts/gds/local-preview-lib.js +6 -128
- package/scripts/gds/local-preview.js +6 -81
- package/scripts/gds/login.js +5 -358
- package/scripts/gds/main-audit.js +5 -623
- package/scripts/gds/me.js +6 -96
- package/scripts/gds/memory-map.js +5 -174
- package/scripts/gds/merge-lock.js +6 -70
- package/scripts/gds/migration-namespace.js +5 -311
- package/scripts/gds/mirror-lineage-check.js +5 -341
- package/scripts/gds/mirror-redact.js +5 -348
- package/scripts/gds/module-artifact.js +6 -289
- package/scripts/gds/module-assess-docs.js +6 -237
- package/scripts/gds/module-assess-installs.js +6 -227
- package/scripts/gds/module-assess-score.js +6 -110
- package/scripts/gds/module-assess-security.js +6 -251
- package/scripts/gds/module-assess-tests.js +6 -277
- package/scripts/gds/module-assess-version.js +6 -91
- package/scripts/gds/module-error-report.js +5 -146
- package/scripts/gds/module-test-runner.js +6 -413
- package/scripts/gds/module.js +5 -1374
- package/scripts/gds/move-escalation.js +5 -140
- package/scripts/gds/newcomer-floor.js +6 -420
- package/scripts/gds/newcomer-floor.test.js +6 -234
- package/scripts/gds/next-number.js +6 -162
- package/scripts/gds/oauth-secret.js +5 -200
- package/scripts/gds/onboard.js +5 -265
- package/scripts/gds/onboarding-analyze.js +6 -225
- package/scripts/gds/onboarding-config.js +6 -179
- package/scripts/gds/onboarding-ship.js +6 -91
- package/scripts/gds/pack-env-prefix.js +5 -72
- package/scripts/gds/package-core.js +5 -1102
- package/scripts/gds/page-inventory.js +5 -346
- package/scripts/gds/page-reader.js +5 -720
- package/scripts/gds/paste-token.js +6 -211
- package/scripts/gds/plain-cards.js +5 -350
- package/scripts/gds/portability-smoke-art.sh +7 -84
- package/scripts/gds/portability-smoke-memory.sh +7 -175
- package/scripts/gds/preflight.js +5 -212
- package/scripts/gds/probe-cache.js +5 -244
- package/scripts/gds/prove-strict-versioning.js +6 -283
- package/scripts/gds/provision-auto-upgrade.js +5 -161
- package/scripts/gds/provision-byo-host.js +5 -67
- package/scripts/gds/provision-capacity.js +5 -78
- package/scripts/gds/provision-caps.js +5 -62
- package/scripts/gds/provision-config.js +5 -232
- package/scripts/gds/provision-core-upgrade.js +5 -1165
- package/scripts/gds/provision-disconnect.js +5 -87
- package/scripts/gds/provision-github-setup.js +5 -167
- package/scripts/gds/provision-net.js +5 -356
- package/scripts/gds/provision-pin-key.js +5 -175
- package/scripts/gds/provision-pin-replay.js +5 -125
- package/scripts/gds/provision-process.js +5 -169
- package/scripts/gds/provision-render.js +5 -200
- package/scripts/gds/provision-repo-auth.js +5 -163
- package/scripts/gds/provision-repo-private.js +5 -97
- package/scripts/gds/provision-repo.js +5 -1336
- package/scripts/gds/provision-teardown.js +5 -105
- package/scripts/gds/provision-units.js +5 -468
- package/scripts/gds/provision.js +5 -1477
- package/scripts/gds/publish-credential-check.js +6 -65
- package/scripts/gds/publish-integration-gate.js +5 -140
- package/scripts/gds/publish-manifest.js +5 -437
- package/scripts/gds/publish-watch.js +5 -266
- package/scripts/gds/pulse.js +6 -335
- package/scripts/gds/push-main.js +5 -54
- package/scripts/gds/push-path-brief.js +5 -98
- package/scripts/gds/read-session-export.js +5 -357
- package/scripts/gds/reauth.js +6 -154
- package/scripts/gds/recall.js +6 -182
- package/scripts/gds/redteam-patrol.js +5 -435
- package/scripts/gds/regen-instance-docs.js +5 -45
- package/scripts/gds/release-core.js +5 -78
- package/scripts/gds/release-notes.js +5 -270
- package/scripts/gds/release.js +6 -138
- package/scripts/gds/rename-goals.js +5 -107
- package/scripts/gds/rename-history-check.js +5 -367
- package/scripts/gds/rename-ledger-prose.js +5 -480
- package/scripts/gds/render-api.js +5 -196
- package/scripts/gds/render-check.js +5 -204
- package/scripts/gds/render-ideas.js +6 -225
- package/scripts/gds/render-payload.js +5 -84
- package/scripts/gds/repo-metrics.js +6 -362
- package/scripts/gds/review-sheet.js +5 -106
- package/scripts/gds/role-pack-guard.js +5 -141
- package/scripts/gds/route-shadow-guard.js +5 -173
- package/scripts/gds/routine-schedule.js +5 -281
- package/scripts/gds/run-routine.js +5 -255
- package/scripts/gds/run-unit-tests.js +6 -659
- package/scripts/gds/runner-drift.js +5 -149
- package/scripts/gds/sandbox-stage.js +6 -458
- package/scripts/gds/scope-map-guard.js +5 -299
- package/scripts/gds/scope-roster-guard.js +5 -117
- package/scripts/gds/seam-wiring-guard.js +5 -274
- package/scripts/gds/search-ingest-db.js +6 -287
- package/scripts/gds/search-ingest-md.js +6 -268
- package/scripts/gds/seed-adopt-tasks.js +6 -74
- package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
- package/scripts/gds/seed-board-room-tasks.js +6 -196
- package/scripts/gds/seed-bongos-app-tasks.js +6 -293
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
- package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
- package/scripts/gds/seed-bongos-tasks.js +6 -213
- package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
- package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
- package/scripts/gds/seed-bv1-community-tasks.js +6 -131
- package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
- package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
- package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
- package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
- package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
- package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
- package/scripts/gds/seed-gds-v4-tasks.js +6 -623
- package/scripts/gds/seed-governance-tasks.js +6 -339
- package/scripts/gds/seed-medusa-tasks.js +6 -439
- package/scripts/gds/seed-module-upstreaming.js +5 -217
- package/scripts/gds/seed-productization-tasks.js +6 -234
- package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
- package/scripts/gds/seed-provisioning-tasks.js +6 -82
- package/scripts/gds/seed-staging.sh +7 -116
- package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
- package/scripts/gds/seed-v2-world-tasks.js +6 -282
- package/scripts/gds/seed-verify-criteria.js +6 -124
- package/scripts/gds/sequence.js +6 -596
- package/scripts/gds/session-cost.js +6 -429
- package/scripts/gds/session-digest-build.js +6 -293
- package/scripts/gds/session-digest.js +6 -199
- package/scripts/gds/session-eval.js +6 -630
- package/scripts/gds/session-transcript-build.js +6 -155
- package/scripts/gds/session-transcript-upload.js +6 -29
- package/scripts/gds/session.js +6 -403
- package/scripts/gds/setup.js +6 -645
- package/scripts/gds/ship-check.js +5 -85
- package/scripts/gds/ship-deploy-target.js +5 -392
- package/scripts/gds/ship-escalation.js +5 -166
- package/scripts/gds/ship-finish.js +5 -419
- package/scripts/gds/ship-flow.js +5 -1216
- package/scripts/gds/ship-git.js +5 -99
- package/scripts/gds/ship-grade-steps.js +5 -546
- package/scripts/gds/ship-grade.js +5 -425
- package/scripts/gds/ship-honesty.js +5 -312
- package/scripts/gds/ship-io.js +5 -138
- package/scripts/gds/ship-land.js +5 -1129
- package/scripts/gds/ship-memory-sync.js +5 -248
- package/scripts/gds/ship-merge-gate.js +5 -224
- package/scripts/gds/ship-merge.js +5 -465
- package/scripts/gds/ship-mode-ask.js +5 -137
- package/scripts/gds/ship-mode-manual.js +5 -53
- package/scripts/gds/ship-preflight-steps.js +5 -398
- package/scripts/gds/ship-regen.js +5 -313
- package/scripts/gds/ship-resume.js +5 -200
- package/scripts/gds/ship-session-upload.js +5 -312
- package/scripts/gds/ship-state.js +5 -109
- package/scripts/gds/ship-surprise.js +5 -83
- package/scripts/gds/ship-visual.js +5 -74
- package/scripts/gds/ship.js +5 -380
- package/scripts/gds/shipping-mode.js +5 -69
- package/scripts/gds/skill-lint.js +5 -248
- package/scripts/gds/skill-preflight.js +5 -359
- package/scripts/gds/smoke-batch-claim.sh +7 -237
- package/scripts/gds/smoke-batch-release.sh +7 -315
- package/scripts/gds/smoke-claim-consistency.sh +7 -221
- package/scripts/gds/smoke-dependencies.sh +7 -142
- package/scripts/gds/smoke-gds.js +6 -255
- package/scripts/gds/smoke-write.sh +7 -274
- package/scripts/gds/source-text-test-scan.js +7 -0
- package/scripts/gds/spark.js +6 -293
- package/scripts/gds/stale-worktrees.js +5 -210
- package/scripts/gds/start-goals.js +5 -101
- package/scripts/gds/start.js +6 -1089
- package/scripts/gds/status.js +6 -544
- package/scripts/gds/strand-watch.js +5 -313
- package/scripts/gds/stranded-rows.js +5 -198
- package/scripts/gds/stray-unit-sweep.sh +7 -70
- package/scripts/gds/surface.js +5 -100
- package/scripts/gds/task.js +6 -272
- package/scripts/gds/test-path-guard.js +5 -97
- package/scripts/gds/triage.js +6 -741
- package/scripts/gds/turn-end-sound.js +5 -72
- package/scripts/gds/tweak-halt.js +5 -68
- package/scripts/gds/tweak-renders.js +5 -198
- package/scripts/gds/uat.js +6 -119
- package/scripts/gds/ui-kit-transform.js +5 -41
- package/scripts/gds/update-channel.js +5 -510
- package/scripts/gds/update-sweep.js +5 -827
- package/scripts/gds/upgrade-artist-gate.js +5 -45
- package/scripts/gds/upgrade-commit-identity.js +5 -31
- package/scripts/gds/upgrade-migrate.js +5 -223
- package/scripts/gds/upgrade-operator.js +6 -73
- package/scripts/gds/upgrade-outcome.js +5 -173
- package/scripts/gds/upgrade.js +5 -1497
- package/scripts/gds/validate-design.js +5 -10
- package/scripts/gds/version-close.js +6 -620
- package/scripts/gds/version-literal-guard.js +5 -138
- package/scripts/gds/version-select.js +5 -77
- package/scripts/gds/visual-review-nudge.js +5 -38
- package/scripts/gds/wedge-remedy.js +5 -173
- package/scripts/gds/worktree-claim-guard.js +5 -129
- package/scripts/gds/worktree.js +6 -448
- package/scripts/hall-preview/refresh-fixtures.js +1 -1
- package/scripts/hall-preview/server.js +2 -2
- package/scripts/migrate.sh +3 -3
- package/scripts/public-mirror-export.js +3 -3
- package/scripts/setup-builder.js +7 -7
- package/src/bongos/api-errors.js +1 -0
- package/src/bongos/api-prefix.js +1 -1
- package/src/bongos/auth-github.js +19 -3
- package/src/bongos/auth-idp.js +7 -0
- package/src/bongos/claim-attribution.js +2 -2
- package/src/bongos/core-moves.js +1 -1
- package/src/bongos/core-update.js +3 -3
- package/src/bongos/craft-mode.js +2 -2
- package/src/bongos/db-kernel.js +15 -3
- package/src/bongos/db.js +30 -4
- package/src/bongos/github-repos.js +1 -1
- package/src/bongos/llm-cache.js +1 -1
- package/src/bongos/llm-pricing.js +1 -1
- package/src/bongos/metrics.js +1 -1
- package/src/bongos/middleware/rate-limit.js +2 -2
- package/src/bongos/module-listing.js +93 -1
- package/src/bongos/module-scope-map.js +90 -85
- package/src/bongos/module-store.js +1 -1
- package/src/bongos/module-submissions.js +1 -1
- package/src/bongos/optimizer.js +1 -1
- package/src/bongos/package-registry.js +1 -1
- package/src/bongos/path-match.js +1 -1
- package/src/bongos/permission-path-check.js +3 -3
- package/src/bongos/platform-visibility-gate.js +3 -5
- package/src/bongos/prelaunch-gate.js +7 -6
- package/src/bongos/route-rank-check.js +2 -2
- package/src/bongos/routes/auth.js +15 -2
- package/src/bongos/routes/backup.js +1 -1
- package/src/bongos/routes/builders.js +29 -1
- package/src/bongos/routes/me.js +49 -18
- package/src/bongos/routes/modules.js +29 -9
- package/src/bongos/routes/public.js +3 -72
- package/src/bongos/schema-lag.js +1 -1
- package/src/bongos/sensitive-surfaces.js +1 -1
- package/src/bongos/serve-internal.js +65 -16
- package/src/bongos/software-update.js +2 -2
- package/src/bongos/upgrade-hold.js +3 -3
- package/src/hall-look.js +6 -5
- package/src/module-api.js +3 -3
- package/src/module-loader/catalog.js +1 -1
- package/src/module-loader/error-tally.js +3 -3
- package/src/module-loader/manifest-schema.js +3 -3
- package/src/platform-server.js +10 -0
- package/src/role-responsibilities.js +1 -1
- package/src/stale-timer.js +2 -2
- package/tests/accessibility_replay.mjs +1 -1
- package/tests/activity_rollup_order_db.mjs +1 -1
- package/tests/activity_snapshots_db.mjs +1 -1
- package/tests/adopt_detect.mjs +1 -1
- package/tests/adopt_import.mjs +1 -1
- package/tests/adopt_preflight.mjs +1 -1
- package/tests/adr_0089_scope.mjs +10 -7
- package/tests/adr_0162_citation.mjs +1 -1
- package/tests/adr_0162_gate_citation.mjs +1 -1
- package/tests/agent_invoke.mjs +1 -1
- package/tests/agent_invoke_live.mjs +3 -3
- package/tests/agents_cron_trigger.mjs +2 -2
- package/tests/agents_roster.mjs +1 -1
- package/tests/agents_sync.mjs +4 -4
- package/tests/allow_rule_guard.mjs +20 -20
- package/tests/api_alias_caller_ratchet.mjs +9 -10
- package/tests/api_alias_exceptions.mjs +7 -6
- package/tests/api_artifacts.mjs +214 -0
- package/tests/api_cli_flags.mjs +3 -3
- package/tests/api_client.mjs +56 -54
- package/tests/api_docs.mjs +30 -9
- package/tests/api_error_envelope_buildcheck.mjs +1 -1
- package/tests/api_msys_path_repair.mjs +2 -2
- package/tests/architect.mjs +1 -1
- package/tests/art_stage.mjs +2 -2
- package/tests/artifact_audit.mjs +2 -2
- package/tests/artifact_staleness.mjs +9 -9
- package/tests/atlas.mjs +1 -1
- package/tests/audit_deps.mjs +1 -1
- package/tests/audit_gate.mjs +1 -1
- package/tests/auth_flow_slice1.mjs +3 -3
- package/tests/auth_inactive_builder.mjs +43 -5
- package/tests/auth_session_expiry_db.mjs +16 -4
- package/tests/auth_session_ttl.mjs +23 -0
- package/tests/authorship_audit.mjs +2 -2
- package/tests/autobongos_cadence.mjs +1 -1
- package/tests/autobongos_fence.mjs +1 -1
- package/tests/autobongos_grade_cap.mjs +2 -2
- package/tests/autobongos_heartbeat_head.mjs +1 -1
- package/tests/autobongos_host_access.mjs +3 -3
- package/tests/autobongos_loop.mjs +17 -17
- package/tests/autobongos_service_ps1.mjs +3 -3
- package/tests/autobongos_tweak_lane.mjs +2 -2
- package/tests/autobongos_verify.mjs +2 -2
- package/tests/autonomous_fit_protected_paths.mjs +3 -3
- package/tests/autonomy_config_idle.mjs +1 -1
- package/tests/autonomy_digest.mjs +1 -1
- package/tests/autonomy_gate.mjs +1 -1
- package/tests/autonomy_gauge.mjs +2 -2
- package/tests/autonomy_runner_identity.mjs +1 -1
- package/tests/backfill_sessions.mjs +8 -8
- package/tests/backfill_subagent_rewards.mjs +1 -1
- package/tests/backfill_task_rewards.mjs +2 -2
- package/tests/backlog_review.mjs +3 -3
- package/tests/baseline_staleness.mjs +2 -2
- package/tests/bfg.mjs +11 -5
- package/tests/bfg_write.mjs +20 -11
- package/tests/blockers_hall.mjs +14 -4
- package/tests/blockers_page_ui.mjs +56 -12
- package/tests/bongos_dispatch.mjs +5 -5
- package/tests/bongos_login.mjs +2 -2
- package/tests/bug_attachment_audit.mjs +1 -1
- package/tests/bug_attachment_recover.mjs +2 -2
- package/tests/bug_triage.mjs +3 -3
- package/tests/build_info.mjs +1 -1
- package/tests/builder_tester_tag.mjs +184 -0
- package/tests/bump_version.mjs +3 -3
- package/tests/canonical_profile_url.mjs +1 -1
- package/tests/capture_error_format.mjs +1 -1
- package/tests/capture_goal_routing.mjs +2 -2
- package/tests/category_advisory_guard.mjs +3 -3
- package/tests/claim_error_surface.mjs +2 -2
- package/tests/claim_from_task_and_home.mjs +1 -1
- package/tests/claim_gate_open_blocker.mjs +7 -4
- package/tests/claim_gate_rebase.mjs +12 -8
- package/tests/claim_recall.mjs +4 -4
- package/tests/claim_resolve_worktree_lock.mjs +1 -1
- package/tests/claude_materialize.mjs +58 -58
- package/tests/clawback_confirmed_backlog.mjs +8 -5
- package/tests/cli_allowlist_permissions.mjs +11 -11
- package/tests/cli_dispatcher.mjs +2 -2
- package/tests/cli_err_code.mjs +6 -6
- package/tests/cli_exit_no_abort.mjs +7 -7
- package/tests/cli_lib_formatters.mjs +2 -2
- package/tests/cli_sessions.mjs +5 -5
- package/tests/cli_surface.mjs +15 -15
- package/tests/cli_token_reissue.mjs +2 -2
- package/tests/client_baseurl_guard.mjs +1 -1
- package/tests/client_bundle_route.mjs +35 -4
- package/tests/cloud_bongos_pack.mjs +1 -1
- package/tests/community_leaderboard_db.mjs +1 -1
- package/tests/conductor.mjs +18 -18
- package/tests/conflict_resolve.mjs +14 -16
- package/tests/consumer_layout_boot.mjs +12 -12
- package/tests/context_pack.mjs +6 -6
- package/tests/control_manifest.mjs +4 -4
- package/tests/copy_desk_page_reads.mjs +1 -1
- package/tests/copy_desk_page_release.mjs +192 -0
- package/tests/copy_inventory.mjs +2 -2
- package/tests/core_auto_upgrade.mjs +1 -1
- package/tests/core_move_notice.mjs +2 -2
- package/tests/core_origin_follow.mjs +7 -7
- package/tests/core_pin_sync.mjs +3 -3
- package/tests/core_upgrade_door.mjs +2 -2
- package/tests/core_upgrade_owner_door.mjs +34 -1
- package/tests/core_upgrade_runner.mjs +19 -19
- package/tests/credential_presence.mjs +2 -2
- package/tests/credit_grant.mjs +3 -3
- package/tests/credit_log_single_writer.mjs +5 -5
- package/tests/criterion_ref_status.mjs +2 -2
- package/tests/cross_discipline_priority_direction.mjs +3 -3
- package/tests/cutover_codemod.mjs +2 -4
- package/tests/db_backup_nightly.mjs +1 -1
- package/tests/db_backup_offsite.mjs +1 -1
- package/tests/db_ownership_handover.mjs +2 -2
- package/tests/dead_deps.mjs +3 -3
- package/tests/dependency_advisory.mjs +1 -1
- package/tests/deploy_audit_gate.mjs +4 -4
- package/tests/deploy_divergence_line.mjs +36 -16
- package/tests/deploy_page_projects.mjs +35 -4
- package/tests/dev_lib.mjs +2 -2
- package/tests/dev_windows.mjs +2 -2
- package/tests/diagram_facts_offset.mjs +1 -1
- package/tests/diagram_repo_slug.mjs +1 -1
- package/tests/diff_derived_signals.mjs +2 -2
- package/tests/dns_preflight.mjs +2 -2
- package/tests/do_api.mjs +3 -3
- package/tests/doc_cli_guard.mjs +28 -28
- package/tests/doc_comment_coverage.mjs +1 -1
- package/tests/doc_control_claims.mjs +11 -11
- package/tests/docs_entropy.mjs +2 -2
- package/tests/docs_openapi_route.mjs +8 -6
- package/tests/doctor_hooks.mjs +1 -1
- package/tests/edit_hints.mjs +3 -2
- package/tests/effective_visibility_predicate.mjs +3 -3
- package/tests/env_knobs_neutral_prefix.mjs +13 -13
- package/tests/exec_path_guard.mjs +4 -4
- package/tests/executed_closure.mjs +18 -12
- package/tests/file_map.mjs +1 -1
- package/tests/find_untested.mjs +13 -13
- package/tests/first_admin_bootstrap.mjs +1 -1
- package/tests/fitness.mjs +16 -16
- package/tests/fitness_gds_ratchet.mjs +2 -2
- package/tests/fitness_installed_core.mjs +3 -3
- package/tests/fitness_no_raw_nul.mjs +1 -1
- package/tests/fitness_ratchets.mjs +3 -3
- package/tests/fitness_scope_roster.mjs +2 -2
- package/tests/fitness_two_root.mjs +8 -8
- package/tests/fixtures/accessibility-replay.json +5 -5
- package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
- package/tests/fixtures/ideator-prefold/README.md +1 -1
- package/tests/fixtures/page-ledger.mjs +22 -0
- package/tests/fixtures/session-506-digest.json +5 -5
- package/tests/gate_approvals.mjs +50 -0
- package/tests/gate_review.mjs +8 -8
- package/tests/gating_review_retired.mjs +2 -2
- package/tests/gen_freshness.mjs +3 -3
- package/tests/git_guard.mjs +3 -3
- package/tests/git_merge_regen.mjs +41 -65
- package/tests/github_one_trip.mjs +4 -4
- package/tests/github_pick_up.mjs +2 -2
- package/tests/github_push_merge_driver.mjs +1 -1
- package/tests/go_live.mjs +3 -2
- package/tests/goal_category.mjs +1 -1
- package/tests/goal_cli.mjs +2 -2
- package/tests/goal_create_spec_entry.mjs +1 -1
- package/tests/goal_invite_consent.mjs +3 -1
- package/tests/goal_move.mjs +1 -1
- package/tests/goal_names.mjs +2 -2
- package/tests/goal_working_area.mjs +1 -1
- package/tests/government_agent_asks.mjs +7 -7
- package/tests/government_board_room_copy.mjs +6 -1
- package/tests/government_board_view.mjs +39 -0
- package/tests/government_board_vote_ui.mjs +39 -1
- package/tests/government_config.mjs +2 -2
- package/tests/government_live_proof_shape.mjs +1 -1
- package/tests/government_protected_surfaces.mjs +54 -53
- package/tests/government_require_permission.mjs +9 -1
- package/tests/government_vanilla_boot.mjs +1 -1
- package/tests/government_vocabulary.mjs +2 -2
- package/tests/government_walk.mjs +2 -2
- package/tests/grade_body_limit.mjs +6 -4
- package/tests/grade_correlation_audit.mjs +3 -3
- package/tests/grade_diff_hash.mjs +1 -1
- package/tests/grade_engine_replay.mjs +2 -2
- package/tests/grade_server_authoritative.mjs +1 -1
- package/tests/grade_unavailable_display.mjs +1 -1
- package/tests/grader.mjs +8 -24
- package/tests/grader_generated_provenance.mjs +14 -14
- package/tests/grader_no_artifact.mjs +1 -1
- package/tests/grader_prompt_fencing.mjs +1 -1
- package/tests/grader_quality_window_overflow.mjs +1 -1
- package/tests/grader_reader_lens.mjs +3 -3
- package/tests/grader_regrade_delta.mjs +1 -1
- package/tests/grader_unbacked_score.mjs +2 -2
- package/tests/hall_acclaim_vote_control.mjs +113 -0
- package/tests/hall_asset_cache.mjs +127 -0
- package/tests/hall_audit.mjs +63 -0
- package/tests/hall_board_world.mjs +20 -0
- package/tests/hall_city_card_words.mjs +61 -0
- package/tests/hall_client_request_shape.mjs +5 -1
- package/tests/hall_home_ships_bounded.mjs +160 -0
- package/tests/hall_landing_boot.mjs +15 -2
- package/tests/hall_nav.mjs +33 -0
- package/tests/hall_onboarding_bongos_setup.mjs +1 -1
- package/tests/hall_oversight_world.mjs +44 -4
- package/tests/hall_palette.mjs +12 -9
- package/tests/hall_preview_security.mjs +1 -1
- package/tests/hall_profile_world.mjs +17 -0
- package/tests/hall_reading_world.mjs +16 -1
- package/tests/hall_roster_world.mjs +2 -1
- package/tests/hall_studio_world.mjs +4 -1
- package/tests/hall_work_history_id.mjs +39 -0
- package/tests/held_tweak_reporting.mjs +4 -4
- package/tests/helpers.mjs +3 -3
- package/tests/home_bounded_reads.mjs +1 -1
- package/tests/home_isolation_guard.mjs +1 -1
- package/tests/hook_core_resolve.mjs +7 -7
- package/tests/hook_user_agents.mjs +1 -1
- package/tests/hooks_drain.mjs +2 -2
- package/tests/host_topology_skips.mjs +1 -1
- package/tests/howto_guide.mjs +1 -1
- package/tests/howto_moments.mjs +3 -3
- package/tests/hub_account_page.mjs +1 -1
- package/tests/idea_capture_grades.mjs +2 -2
- package/tests/idea_develop_spark.mjs +1 -1
- package/tests/idea_filed_via.mjs +2 -2
- package/tests/idea_ideate_full.mjs +1 -1
- package/tests/idea_spark_mark.mjs +1 -1
- package/tests/idea_spark_queue.mjs +1 -1
- package/tests/idea_triage.mjs +1 -1
- package/tests/idea_triage_grade.mjs +3 -3
- package/tests/idea_vote_permission.mjs +113 -0
- package/tests/idea_votes_fold_db.mjs +123 -0
- package/tests/infra_exec_paths.mjs +12 -12
- package/tests/init.mjs +2 -2
- package/tests/instance_db_migrated_on_code_move.mjs +5 -5
- package/tests/instance_feedback.mjs +9 -9
- package/tests/instance_mismatch_guard.mjs +2 -2
- package/tests/integration_parked_ratchet.mjs +24 -2
- package/tests/intent_retry.mjs +1 -1
- package/tests/interaction_posture.mjs +3 -3
- package/tests/invite_expiry_db.mjs +1 -1
- package/tests/joinability_invite_only.mjs +1 -1
- package/tests/karma_vote_lists.mjs +270 -0
- package/tests/key-card.mjs +2 -2
- package/tests/key-status.mjs +2 -2
- package/tests/knip_ratchet_ambient.mjs +2 -2
- package/tests/known_failing_ratchet.mjs +1 -1
- package/tests/land_watch.mjs +2 -2
- package/tests/landing_legal_pages.mjs +1 -1
- package/tests/landing_page.mjs +2 -2
- package/tests/leaderboard_roles.mjs +4 -1
- package/tests/leak_scan_allowlist.mjs +8 -8
- package/tests/leak_scan_fail_closed.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +9 -9
- package/tests/lifecycle-card.mjs +7 -7
- package/tests/linkify_check.mjs +2 -2
- package/tests/linkify_refs.mjs +1 -1
- package/tests/llm-cache-route.mjs +1 -1
- package/tests/local_preview.mjs +2 -2
- package/tests/main_audit.mjs +3 -3
- package/tests/main_audit_attestation.mjs +1 -1
- package/tests/main_audit_db_roster.mjs +2 -2
- package/tests/main_worktree_busy_reason.mjs +3 -3
- package/tests/markdown_line_endings.mjs +2 -2
- package/tests/me_streak_leaderboard_queries.mjs +193 -0
- package/tests/membership_kind_lockstep.mjs +1 -1
- package/tests/memory_isolation.mjs +16 -8
- package/tests/memory_map.mjs +2 -2
- package/tests/memory_pull.mjs +33 -25
- package/tests/merge_driver_register.mjs +3 -3
- package/tests/migration_allocation.mjs +2 -2
- package/tests/migration_namespace.mjs +1 -1
- package/tests/migrations_forward_safe.mjs +1 -1
- package/tests/mingle.mjs +1 -1
- package/tests/mirror_lineage_fulltree.mjs +3 -3
- package/tests/mirror_lineage_proof.mjs +2 -2
- package/tests/mirror_redact.mjs +4 -4
- package/tests/missing_dep_classify.mjs +3 -3
- package/tests/module-scope-map.mjs +22 -22
- package/tests/module_api_lazy.mjs +1 -1
- package/tests/module_assess_docs.mjs +2 -2
- package/tests/module_assess_installs.mjs +3 -3
- package/tests/module_assess_price_parity.mjs +5 -5
- package/tests/module_assess_score.mjs +5 -5
- package/tests/module_assess_security.mjs +4 -4
- package/tests/module_assess_tests.mjs +3 -3
- package/tests/module_assessments_migration.mjs +1 -1
- package/tests/module_catalog.mjs +2 -2
- package/tests/module_cli.mjs +3 -3
- package/tests/module_entitlements.mjs +1 -1
- package/tests/module_error_counts.mjs +1 -1
- package/tests/module_install.mjs +4 -4
- package/tests/module_loader.mjs +3 -1
- package/tests/module_owned_tests.mjs +1 -1
- package/tests/module_release_channels.mjs +1 -1
- package/tests/module_store_howto.mjs +3 -3
- package/tests/module_store_listing.mjs +139 -2
- package/tests/module_store_publish.mjs +4 -4
- package/tests/module_store_publish_route.mjs +1 -1
- package/tests/module_store_reassess.mjs +1 -1
- package/tests/module_store_registry_migration.mjs +1 -1
- package/tests/module_test_runner.mjs +3 -3
- package/tests/module_update.mjs +4 -4
- package/tests/module_upgrade_updates.mjs +1 -1
- package/tests/move_escalation.mjs +2 -2
- package/tests/nav_permission_atoms.mjs +3 -2
- package/tests/needs_rebase.mjs +7 -3
- package/tests/newcomer_floor.mjs +1 -1
- package/tests/newcomer_generator.mjs +48 -0
- package/tests/next_number.mjs +1 -1
- package/tests/no_artifact_escalation.mjs +3 -3
- package/tests/npm_release_where.mjs +1 -1
- package/tests/oauth_secret.mjs +2 -2
- package/tests/onboard.mjs +6 -6
- package/tests/onboarding_gate.mjs +2 -2
- package/tests/opt_in_skill_modules.mjs +3 -3
- package/tests/own_scope_guard.mjs +1 -1
- package/tests/own_session_revoke.mjs +4 -1
- package/tests/package_core.mjs +10 -11
- package/tests/page_inventory.mjs +5 -5
- package/tests/page_reader.mjs +7 -7
- package/tests/page_tweak_hold.mjs +6 -6
- package/tests/parallel-load.mjs +1 -1
- package/tests/paste_token_api_base.mjs +1 -1
- package/tests/paste_token_session_store.mjs +2 -2
- package/tests/pending_invite_purge_db.mjs +1 -1
- package/tests/permission_path.mjs +1 -1
- package/tests/pin_replay.mjs +1 -1
- package/tests/pin_write_key.mjs +7 -7
- package/tests/plain_cards.mjs +15 -15
- package/tests/pr_assign.mjs +1 -1
- package/tests/pre_push_hook.mjs +3 -3
- package/tests/preflight_checks.mjs +2 -2
- package/tests/prelaunch_gate.mjs +1 -1
- package/tests/privacy_matrix.mjs +1 -1
- package/tests/probe_cache.mjs +6 -6
- package/tests/profile_connections_ui.mjs +4 -3
- package/tests/profile_fields.mjs +11 -1
- package/tests/profile_privacy_owner_view.mjs +1 -1
- package/tests/profile_role_headline.mjs +10 -9
- package/tests/project_admin_console_model.mjs +1 -1
- package/tests/projects_hub.mjs +1 -1
- package/tests/projects_hub_cloud_hop.mjs +1 -1
- package/tests/promote_goal_id.mjs +6 -6
- package/tests/promotion_sweep.mjs +1 -1
- package/tests/provision.mjs +24 -24
- package/tests/provision_account_identity.mjs +2 -2
- package/tests/provision_byo_host.mjs +1 -1
- package/tests/provision_caddy_wiring.mjs +2 -2
- package/tests/provision_disconnect.mjs +2 -2
- package/tests/provision_dns_first.mjs +1 -1
- package/tests/provision_render.mjs +9 -9
- package/tests/provision_repo_private.mjs +3 -3
- package/tests/provision_resource_caps.mjs +5 -5
- package/tests/provision_restart.mjs +3 -3
- package/tests/provision_settings_apply.mjs +7 -7
- package/tests/provision_teardown_address.mjs +2 -2
- package/tests/provisioning_capacity.mjs +5 -5
- package/tests/provisioning_credential_preflight.mjs +1 -1
- package/tests/provisioning_disconnect.mjs +1 -1
- package/tests/provisioning_error_note_scope.mjs +4 -4
- package/tests/provisioning_paid_shape_gate.mjs +2 -2
- package/tests/provisioning_planet_physics.mjs +16 -0
- package/tests/provisioning_runner_drift_notice.mjs +2 -2
- package/tests/provisioning_settings_env.mjs +1 -1
- package/tests/pruned_lockfile_integrity.mjs +1 -1
- package/tests/public_mirror_export.mjs +1 -1
- package/tests/publish_integration_gate.mjs +2 -2
- package/tests/publish_manifest.mjs +6 -6
- package/tests/publish_watch.mjs +1 -1
- package/tests/push_path_brief.mjs +2 -2
- package/tests/raise.mjs +248 -0
- package/tests/rank_roles_audit.mjs +1 -1
- package/tests/rank_tier_single_source.mjs +2 -2
- package/tests/rate_limit_public.mjs +1 -1
- package/tests/read_default_meter.mjs +2 -2
- package/tests/read_session_export.mjs +1 -1
- package/tests/rebase_gate_set_aside.mjs +1 -1
- package/tests/recall_cli.mjs +1 -1
- package/tests/recall_corpus_health.mjs +3 -2
- package/tests/recall_hints.mjs +1 -1
- package/tests/recruiter_sliver_boundary.mjs +1 -1
- package/tests/redteam_patrol.mjs +2 -2
- package/tests/regrade_actual_minutes.mjs +2 -2
- package/tests/regrade_eligibility.mjs +2 -2
- package/tests/release_core.mjs +2 -2
- package/tests/release_notes.mjs +4 -4
- package/tests/rename_history_restraint.mjs +3 -3
- package/tests/rename_ledger_prose.mjs +6 -6
- package/tests/render_api.mjs +1 -1
- package/tests/render_check.mjs +4 -4
- package/tests/render_deploy.mjs +1 -1
- package/tests/repo_info_binding.mjs +1 -1
- package/tests/repo_map.mjs +5 -5
- package/tests/reward_mode_cost_plus_only.mjs +7 -3
- package/tests/reward_mode_surfacing.mjs +1 -1
- package/tests/role_responsibilities.mjs +1 -1
- package/tests/route_permission_check.mjs +1 -1
- package/tests/route_shadow_guard.mjs +1 -1
- package/tests/route_validation.mjs +1 -1
- package/tests/routine_capture_kind.mjs +6 -6
- package/tests/routine_schedule.mjs +9 -9
- package/tests/run_routine.mjs +5 -5
- package/tests/run_routine_two_root.mjs +5 -5
- package/tests/runner_drift.mjs +17 -17
- package/tests/sandbox_stage.mjs +5 -5
- package/tests/scope_map_guard.mjs +7 -7
- package/tests/scouting_owner_access_and_reach.mjs +1 -1
- package/tests/scripts_gds_forwarders.mjs +224 -0
- package/tests/scrubber_corpus.mjs +2 -2
- package/tests/seam_wiring_guard.mjs +1 -1
- package/tests/search_ingest.mjs +2 -2
- package/tests/search_ingest_db.mjs +1 -1
- package/tests/search_ingest_nul.mjs +6 -6
- package/tests/seed_verify_criteria.mjs +3 -3
- package/tests/sequence.mjs +3 -3
- package/tests/served_paths_shipped.mjs +3 -3
- package/tests/session_506_regression.mjs +1 -1
- package/tests/session_accessibility.mjs +1 -1
- package/tests/session_caps.mjs +1 -1
- package/tests/session_cost.mjs +1 -1
- package/tests/session_digest.mjs +2 -2
- package/tests/session_eval.mjs +6 -6
- package/tests/session_index.mjs +1 -1
- package/tests/session_records.mjs +4 -4
- package/tests/session_rename_fallback.mjs +2 -2
- package/tests/session_reward_on_land.mjs +7 -149
- package/tests/session_reward_on_land_db.mjs +191 -0
- package/tests/session_reward_reconcile.mjs +6 -88
- package/tests/session_reward_reconcile_db.mjs +132 -0
- package/tests/session_transcript.mjs +1 -1
- package/tests/sessions_kit_pager.mjs +2 -1
- package/tests/setup_device_flow_fallback.mjs +2 -2
- package/tests/setup_smoke.mjs +12 -5
- package/tests/setup_status_facts.mjs +54 -12
- package/tests/ship_autolinkify.mjs +2 -2
- package/tests/ship_automerge_injection.mjs +1 -1
- package/tests/ship_base_flag.mjs +1 -1
- package/tests/ship_broadcast_routing.mjs +1 -1
- package/tests/ship_broadcast_server.mjs +2 -2
- package/tests/ship_builder_model.mjs +1 -1
- package/tests/ship_cannot_lie.mjs +9 -9
- package/tests/ship_card.mjs +2 -2
- package/tests/ship_ci_deploy.mjs +7 -7
- package/tests/ship_error_shape.mjs +1 -1
- package/tests/ship_land_ci_not_started.mjs +3 -3
- package/tests/ship_land_conflict.mjs +3 -3
- package/tests/ship_land_proof.mjs +3 -3
- package/tests/ship_land_red_pr.mjs +5 -5
- package/tests/ship_merge_gate.mjs +14 -14
- package/tests/ship_mode.mjs +1 -1
- package/tests/ship_mode_first_ship.mjs +4 -4
- package/tests/ship_mode_hands_off.mjs +8 -8
- package/tests/ship_post_land_verify.mjs +1 -1
- package/tests/ship_preflight.mjs +19 -19
- package/tests/ship_premerge.mjs +1 -1
- package/tests/ship_publish_error.mjs +2 -2
- package/tests/ship_push_diagnosis.mjs +1 -1
- package/tests/ship_regen_copy_inventory.mjs +3 -3
- package/tests/ship_resume.mjs +4 -4
- package/tests/ship_smoke_gate.mjs +1 -1
- package/tests/ship_upload_skip.mjs +1 -1
- package/tests/ship_upstream_deletion.mjs +1 -1
- package/tests/ship_vendored_instance.mjs +8 -8
- package/tests/ship_visual_regrade.mjs +3 -3
- package/tests/ship_zero_commit.mjs +1 -1
- package/tests/skill_docs_unavailable_regrade.mjs +3 -3
- package/tests/skill_friction_kind.mjs +1 -1
- package/tests/skill_grade_recover.mjs +1 -1
- package/tests/skill_grader_health.mjs +1 -1
- package/tests/skill_lint.mjs +1 -1
- package/tests/skill_menu_ruling.mjs +1 -1
- package/tests/skill_preflight.mjs +7 -7
- package/tests/skip_is_not_pass.mjs +22 -1
- package/tests/smoke_dependencies_witness.mjs +2 -2
- package/tests/smoke_preflight.mjs +1 -1
- package/tests/smoke_target.mjs +2 -2
- package/tests/smoke_write_contract.mjs +2 -2
- package/tests/sound_player.mjs +8 -8
- package/tests/source_text_test_ratchet.mjs +97 -0
- package/tests/speciality_corpus_scope.mjs +1 -1
- package/tests/speciality_session_skills.mjs +1 -1
- package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
- package/tests/stale_timer.mjs +3 -3
- package/tests/stale_worktrees.mjs +1 -1
- package/tests/start_env_guard.mjs +1 -1
- package/tests/start_goal_first.mjs +3 -3
- package/tests/start_inbox_count.mjs +1 -1
- package/tests/start_rebase_warning.mjs +1 -1
- package/tests/status_default_version.mjs +3 -3
- package/tests/status_mirror_sync.mjs +1 -1
- package/tests/status_page_no_dead_uptime.mjs +80 -0
- package/tests/stop_refcheck.mjs +1 -1
- package/tests/strand_watch.mjs +1 -1
- package/tests/stranded_rows.mjs +1 -1
- package/tests/stuck_detector.mjs +14 -14
- package/tests/sweep_app_account.mjs +3 -3
- package/tests/task_cli.mjs +2 -2
- package/tests/task_detail_ui.mjs +11 -1
- package/tests/task_discipline_required.mjs +2 -2
- package/tests/task_list_paging.mjs +1 -1
- package/tests/task_visual_slots.mjs +2 -2
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/terms_grandfather_db.mjs +1 -1
- package/tests/test_path_guard.mjs +1 -1
- package/tests/triage_development.mjs +1 -1
- package/tests/tweak_batch_apply.mjs +2 -2
- package/tests/tweak_land_heal.mjs +3 -3
- package/tests/tweak_unattended.mjs +3 -3
- package/tests/ui_design_skills.mjs +2 -2
- package/tests/unit_report_status.mjs +2 -2
- package/tests/unit_runner_serial.mjs +2 -2
- package/tests/unit_runner_teardown_abort.mjs +1 -1
- package/tests/update_channel.mjs +2 -2
- package/tests/update_channel_db.mjs +4 -4
- package/tests/update_subscription_engine.mjs +26 -26
- package/tests/update_sweep_home.mjs +14 -14
- package/tests/upgrade.mjs +11 -11
- package/tests/upgrade_artist_gate.mjs +4 -4
- package/tests/upgrade_commit_identity.mjs +2 -2
- package/tests/upgrade_migrate.mjs +7 -7
- package/tests/upgrade_operator.mjs +2 -2
- package/tests/upgrade_outcome.mjs +2 -2
- package/tests/upgrade_persist_pin.mjs +5 -5
- package/tests/upkeep_home.mjs +1 -1
- package/tests/version_close.mjs +2 -2
- package/tests/version_close_cli.mjs +2 -2
- package/tests/version_close_route.mjs +1 -1
- package/tests/version_literals.mjs +23 -23
- package/tests/visual_review.mjs +5 -5
- package/tests/wedge_remedy.mjs +5 -5
- package/tests/welcome_boot.mjs +116 -0
- package/tests/welcome_boot_browser.mjs +271 -0
- package/tests/wizard_born_first_board.mjs +3 -3
- package/tests/wizard_demo.mjs +1 -1
- package/tests/wizard_one_page.mjs +4 -3
- package/tests/wizard_physics.mjs +3 -1
- package/tests/wizard_physics_more.mjs +42 -3
- package/tests/work_title_wrap.mjs +1 -1
- package/tests/workflow_exec_paths.mjs +6 -6
- package/tests/worktree_claim_guard.mjs +1 -1
- package/tests/worktree_helper.mjs +2 -2
- package/tests/write_validation_gaps.mjs +3 -3
- package/scripts/gds/api.sh +0 -6
- package/scripts/gds/audit-exports.js +0 -128
- package/scripts/gds/resolve-skill-model.js +0 -57
- package/scripts/gds/security-baseline-check.sh +0 -180
- package/scripts/gds/spike-task-map.js +0 -899
- package/scripts/status-probe.mjs +0 -213
- package/src/bongos/uptime-poller.js +0 -93
- package/tests/government_fold_bench.mjs +0 -50
- package/tests/spike_task_map.mjs +0 -422
- package/tests/status-probe.mjs +0 -89
- /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
- /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
- /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
- /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// linkify-refs.js — rewrite bare "#NNN" GDS references in docs into explicit
|
|
3
|
+
// markdown links to the Builders' Hall deep-link resolver, so they STOP
|
|
4
|
+
// colliding with GitHub's built-in PR/issue autolinker when the docs are read
|
|
5
|
+
// on github.com.
|
|
6
|
+
//
|
|
7
|
+
// THE PROBLEM. Our docs reference GDS ids as bare "#NNN". GitHub, viewing
|
|
8
|
+
// markdown in the repo, auto-links every "#NNN" to PR/issue #NNN — a SEPARATE
|
|
9
|
+
// number space from our task/idea/blocker ids. Early on task#≈PR# so it
|
|
10
|
+
// coincidentally worked; they've since diverged, so "#170" now lands on an
|
|
11
|
+
// unrelated PR (or a dead number). An explicit markdown link —
|
|
12
|
+
// [#170](https://…/#/task/170) — suppresses GitHub's autolinker AND points at
|
|
13
|
+
// the right record.
|
|
14
|
+
//
|
|
15
|
+
// THREE RESOLVABLE KINDS (#629). The hall resolves /#/task/N, /#/idea/N and
|
|
16
|
+
// /#/blocker/N (DEEPLINK_RE in public-builders/builders.js), so this linkifier
|
|
17
|
+
// classifies a ref by its surrounding noun and links it to the matching
|
|
18
|
+
// resolver. A ref whose id is NOT in the matching public id set, and any other
|
|
19
|
+
// entity that has no resolver (session/migration/report/learning/builder/…),
|
|
20
|
+
// is NEUTRALIZED instead — wrapped in a code span (`#N`) that GitHub never
|
|
21
|
+
// autolinks — so it can't 404 yet also can't mis-link.
|
|
22
|
+
//
|
|
23
|
+
// THE RISK. A WRONG rewrite (pointing a number at the wrong thing) just
|
|
24
|
+
// recreates the complaint. So the classifier is deliberately conservative —
|
|
25
|
+
// it links a "#NNN" ONLY when ALL of these hold:
|
|
26
|
+
// • NNN is a real id of the classified kind (fetched live from the public
|
|
27
|
+
// /api/bongos/public/ref-ids allow-list; PR-only numbers are therefore never
|
|
28
|
+
// touched, and an idea id is never linked as a task).
|
|
29
|
+
// • It is a bare reference — NOT a markdown heading anchor like
|
|
30
|
+
// `](#12-session-update-protocol)` (digits followed by `-`/word chars), and
|
|
31
|
+
// NOT already link text `[#170]` or a link target `](#170)`.
|
|
32
|
+
// • It is not inside an inline code span or a fenced code block (with the one
|
|
33
|
+
// exception of upgrading a prior `#N` idea/blocker NEUTRALIZATION — see
|
|
34
|
+
// upgradeLineCodeSpans).
|
|
35
|
+
// Anything ambiguous is left bare/neutralized — a missed link is strictly safer
|
|
36
|
+
// than a wrong one.
|
|
37
|
+
//
|
|
38
|
+
// USAGE
|
|
39
|
+
// node scripts/bongos/linkify-refs.js # dry-run on the default index docs
|
|
40
|
+
// node scripts/bongos/linkify-refs.js --apply # write the changes
|
|
41
|
+
// node scripts/bongos/linkify-refs.js --check # CI gate: non-zero exit if any bare/upgradeable ref remains
|
|
42
|
+
// node scripts/bongos/linkify-refs.js --apply docs/x.md CLAUDE.md # explicit file set
|
|
43
|
+
// node scripts/bongos/linkify-refs.js --ids 1,2,3 ... # offline: supply the task-id set
|
|
44
|
+
//
|
|
45
|
+
// The core linkifyText() is a pure function (exported) so it can be unit-tested
|
|
46
|
+
// without the API or the filesystem (see tests/linkify_refs.mjs).
|
|
47
|
+
|
|
48
|
+
const fs = require('node:fs');
|
|
49
|
+
const path = require('node:path');
|
|
50
|
+
|
|
51
|
+
// The Builders' Hall deep-link resolver bases (task/idea/blocker), derived from the
|
|
52
|
+
// instance's STABLE public hall — branding.domains.buildersOrigin, falling back to
|
|
53
|
+
// publicOrigin. Deliberately NOT the env-overridable API_BASE: these bases get
|
|
54
|
+
// WRITTEN INTO COMMITTED markdown, so a per-dev CLOUDBONGOS_API_BASE=localhost
|
|
55
|
+
// override must never leak into a committed doc link (task 1002234; the committed-doc
|
|
56
|
+
// twin of the task-1002233 printed-link fix, which purged the last hardcoded
|
|
57
|
+
// `https://example.com`). When branding is unreadable the base is the
|
|
58
|
+
// root-relative '/builders#/…' — never a hardcoded founder host. Reading branding is
|
|
59
|
+
// a sync file read (no network), safe at module scope for this token-free CI gate.
|
|
60
|
+
// A LOOPBACK origin is treated exactly like an unreadable one — root-relative,
|
|
61
|
+
// never written out (task 1003542; the committed-doc half of task 1002975).
|
|
62
|
+
//
|
|
63
|
+
// The header above promises a per-dev localhost override "must never leak into a
|
|
64
|
+
// committed doc link", and the API_BASE half of that holds. But the BRANDING half
|
|
65
|
+
// did not: config/branding.neutral.json — the neutral core's own default, used by
|
|
66
|
+
// every checkout with no instance branding — sets buildersOrigin to
|
|
67
|
+
// http://localhost:3000. So `--apply` on a core checkout rewrote bare refs into
|
|
68
|
+
// http://localhost:3000/builders#/task/N and committed them.
|
|
69
|
+
//
|
|
70
|
+
// That was survivable only while the gate was blind: it matched \d{1,5} and this
|
|
71
|
+
// instance's ids are 7 digits, so --apply found nothing to rewrite. Widening the
|
|
72
|
+
// width in this task ARMS it — the first honest run wanted to rewrite 33 refs
|
|
73
|
+
// across 10 committed docs, ADRs included. Hence this guard lands with the widening
|
|
74
|
+
// rather than after it.
|
|
75
|
+
//
|
|
76
|
+
// Root-relative is the right fallback, not a guess: it is what the catch below
|
|
77
|
+
// already returns, and it resolves correctly on whatever host actually serves the
|
|
78
|
+
// hall — which is more than a baked absolute origin can promise.
|
|
79
|
+
function isLoopbackOrigin(origin) {
|
|
80
|
+
try {
|
|
81
|
+
// URL keeps an IPv6 literal in its brackets ('[::1]'), so strip them before
|
|
82
|
+
// comparing — a caught-by-its-own-test detail, not a hypothetical.
|
|
83
|
+
const host = new URL(origin).hostname.replace(/^\[|\]$/g, '');
|
|
84
|
+
return host === 'localhost' || host === '::1' || host === '0.0.0.0'
|
|
85
|
+
|| host.endsWith('.localhost')
|
|
86
|
+
|| /^127\./.test(host); // the whole 127.0.0.0/8 loopback block, not just .0.1
|
|
87
|
+
} catch (_) {
|
|
88
|
+
return false; // not a parseable absolute URL → not a loopback origin
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function resolverHallRoot() {
|
|
93
|
+
try {
|
|
94
|
+
const d = (require('../../src/branding').branding().domains) || {};
|
|
95
|
+
const origin = (typeof d.buildersOrigin === 'string' && d.buildersOrigin.trim())
|
|
96
|
+
|| (typeof d.publicOrigin === 'string' && d.publicOrigin.trim())
|
|
97
|
+
|| '';
|
|
98
|
+
if (!origin || isLoopbackOrigin(origin)) return '/builders#';
|
|
99
|
+
return `${String(origin).replace(/\/+$/, '')}/builders#`;
|
|
100
|
+
} catch (_) {
|
|
101
|
+
return '/builders#';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const RESOLVER_HALL_ROOT = resolverHallRoot();
|
|
105
|
+
const RESOLVER_BASE = `${RESOLVER_HALL_ROOT}/task/`;
|
|
106
|
+
const RESOLVER_BASE_IDEA = `${RESOLVER_HALL_ROOT}/idea/`;
|
|
107
|
+
const RESOLVER_BASE_BLOCKER = `${RESOLVER_HALL_ROOT}/blocker/`;
|
|
108
|
+
// API_BASE (env → session → branding default) comes from cli-lib (the single
|
|
109
|
+
// source) — used ONLY for the RUNTIME /public/ref-ids fetch below, never for the
|
|
110
|
+
// committed link bases above. Safe for this token-free CI gate: cli-lib does no
|
|
111
|
+
// eager session read or network at module scope.
|
|
112
|
+
const { API_BASE } = require('./cli-lib');
|
|
113
|
+
|
|
114
|
+
// Every hand-authored markdown file that a reader sees rendered on github.com:
|
|
115
|
+
// the root CLAUDE.md/README.md plus all of docs/** (session-logs included). A
|
|
116
|
+
// "GENERATED FILE" marker means the bare refs reappear on the next regen, so
|
|
117
|
+
// the generator — not its output — is where those get fixed; skip them here.
|
|
118
|
+
// PATHS COME BACK POSIX-STYLE, on every platform (task 1003935). path.join gives
|
|
119
|
+
// OS-native separators, so on Windows this used to return 'docs\\adr\\0001-….md'.
|
|
120
|
+
// Three things read these paths and only one of them tolerates that: fs accepts
|
|
121
|
+
// either separator on Windows, but the --check report PRINTS them (so CI output
|
|
122
|
+
// differed by platform for identical content) and the test that pins recursion
|
|
123
|
+
// into docs/ compares against 'docs/' — which is how a permanently-red case hid
|
|
124
|
+
// for months in a file no lane ran. Normalising here, at the one boundary that
|
|
125
|
+
// produces them, is cheaper than teaching every consumer to be separator-aware.
|
|
126
|
+
function discoverDocs() {
|
|
127
|
+
const out = [];
|
|
128
|
+
const walk = (rel) => {
|
|
129
|
+
const abs = path.resolve(process.cwd(), rel);
|
|
130
|
+
if (!fs.existsSync(abs)) return;
|
|
131
|
+
if (fs.statSync(abs).isDirectory()) {
|
|
132
|
+
for (const name of fs.readdirSync(abs).sort()) walk(path.join(rel, name));
|
|
133
|
+
} else if (rel.endsWith('.md')) {
|
|
134
|
+
out.push(rel.split(path.sep).join('/'));
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
for (const root of ['CLAUDE.md', 'README.md', 'docs']) walk(root);
|
|
138
|
+
// The skip marker matched only the literal "GENERATED FILE" — and NO generator in
|
|
139
|
+
// this repo writes that (task 1003542). gen-api-docs.js heads both of its outputs
|
|
140
|
+
// with "GENERATED by scripts/bongos/gen-api-docs.js", so docs/api-reference.md and
|
|
141
|
+
// docs/routes-permissions.md were being linkified despite the rule above: their
|
|
142
|
+
// rewrites survive exactly until the next regen, and meanwhile ship-check reports
|
|
143
|
+
// api-docs STALE. Two gates fighting over one file, each correctly.
|
|
144
|
+
//
|
|
145
|
+
// Latent until now for the same reason as the loopback leak: the matcher was too
|
|
146
|
+
// narrow to rewrite anything, so nothing was ever written into a generated file.
|
|
147
|
+
// Widening it in this task is what surfaced this.
|
|
148
|
+
//
|
|
149
|
+
// NOTE docs/copy-inventory.md heads with "**Generated** by" — bolded, so not
|
|
150
|
+
// contiguous and still unmatched here. Left alone deliberately: it carries no bare
|
|
151
|
+
// refs today, and inventing a looser pattern risks skipping a hand-authored doc
|
|
152
|
+
// that merely mentions being generated. Fix its marker at the generator if it ever
|
|
153
|
+
// grows one.
|
|
154
|
+
return out.filter((rel) =>
|
|
155
|
+
!/GENERATED (?:FILE|by)\b/i.test(fs.readFileSync(path.resolve(process.cwd(), rel), 'utf8').slice(0, 200))
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// "#NNN" preceded by an IDEA / BLOCKER noun → that kind's resolver (#629). These
|
|
160
|
+
// are checked before the generic ENTITY_RE so an idea/blocker ref links rather
|
|
161
|
+
// than merely neutralizing.
|
|
162
|
+
const IDEA_CTX_RE = /\b(idea_inbox|ideas?)[`'")\s(:]*$/i;
|
|
163
|
+
const BLOCKER_CTX_RE = /\b(blockers?)[`'")\s(:]*$/i;
|
|
164
|
+
// "#NNN" preceded by one of these nouns denotes a DIFFERENT entity that shares
|
|
165
|
+
// the integer space with tasks but has NO resolver (a session ordinal, a
|
|
166
|
+
// migration number, a security-report id, a learning, a builder, …). Those must
|
|
167
|
+
// never be rewritten to a resolver URL — a wrong link is the exact bug we're
|
|
168
|
+
// fixing. But leaving them BARE is also a bug: GitHub autolinks any bare "#NNN"
|
|
169
|
+
// to its own PR/issue space, which 404s. So these are NEUTRALIZED — wrapped in a
|
|
170
|
+
// code span (`#170`) GitHub never autolinks. ("task"/"tasks" is deliberately
|
|
171
|
+
// NOT here: those ARE refs we want to linkify; idea/blocker are handled above.)
|
|
172
|
+
// The trailing class tolerates a closing backtick / quote / opening paren /
|
|
173
|
+
// colon so "`security_reports` (#2)" still classifies.
|
|
174
|
+
const ENTITY_RE = /\b(idea_inbox|ideas?|blockers?|sessions?|migrations?|criteri(?:on|a)|(?:security[_ ]?)?reports?|learnings?|builders?|claims?|intents?|findings?|achievements?)[`'")\s(:]*$/i;
|
|
175
|
+
// "#NNN" preceded by a GitHub-namespace noun (a PR ref) genuinely lives in
|
|
176
|
+
// GitHub's number space — a bare "#NNN" there autolinks CORRECTLY, so it is
|
|
177
|
+
// the one class we leave completely alone.
|
|
178
|
+
const GITHUB_NS_RE = /\b(pull requests?|pull|prs?)[`'")\s(:]*$/i;
|
|
179
|
+
// Pure list glue between two refs ("#1, #2" / "#1 and #2" / "#2–#11") — lets a
|
|
180
|
+
// classification carry across a list or range so "blockers #1, #2" and
|
|
181
|
+
// "reports #2–#11" treat BOTH ends the same way.
|
|
182
|
+
const LIST_GLUE_RE = /^[\s,–—-]*(?:and|&|\+|or|to|through)?[\s,–—-]*$/i;
|
|
183
|
+
|
|
184
|
+
// An existing markdown link of the TASK-resolver form this script writes:
|
|
185
|
+
// [#N](…/builders#/task/N). Used only to undo PAST task-resolver mis-links of
|
|
186
|
+
// entity/idea/blocker refs; the idea/blocker resolver links are left alone.
|
|
187
|
+
// HOST-AGNOSTIC (task 1002234 part b): matches any http(s) host OR a root-relative
|
|
188
|
+
// '/builders#/…', so the mislink-cleanup path still recognizes a link a PRIOR run
|
|
189
|
+
// committed under a DIFFERENT host — the legacy `example.com` links, a
|
|
190
|
+
// co-tenant's, or this instance's own — not only the current RESOLVER_BASE host.
|
|
191
|
+
// How many digits a bare "#NNN" may carry — ONE source of truth, because the
|
|
192
|
+
// width had drifted out of date in five places at once (task 1003542).
|
|
193
|
+
//
|
|
194
|
+
// It was {1,5}, a PRE-IMPORT id width. This instance renumbered imported tasks
|
|
195
|
+
// +1,000,000, so every live id is SEVEN digits — and both enforcement points
|
|
196
|
+
// silently stopped enforcing: `linkify-refs.js --check` (the CI gate) passed
|
|
197
|
+
// trivially on a doc containing a bare #1003365, and .claude/hooks/stop-refcheck.js
|
|
198
|
+
// fast-path-exited before it even fetched the allow-list. A guard that matches
|
|
199
|
+
// nothing reports clean, which is indistinguishable from a guard that works.
|
|
200
|
+
//
|
|
201
|
+
// 7 keeps the property {1,5} was chosen for — not over-matching PR-shaped numbers.
|
|
202
|
+
// GitHub PR numbers on this repo are 3 digits, well inside the old range, so the
|
|
203
|
+
// bound was never what separated them; classifyKind's `PR #NNN` left-context test
|
|
204
|
+
// is, and it is untouched here.
|
|
205
|
+
//
|
|
206
|
+
// Exported as the SOURCE STRING, not a RegExp: a /g/ regex carries lastIndex
|
|
207
|
+
// between calls, so a shared instance would skip matches depending on who scanned
|
|
208
|
+
// last. Each site builds its own.
|
|
209
|
+
const REF_DIGITS = '\\d{1,7}';
|
|
210
|
+
|
|
211
|
+
// ---- the ordinal-prose guard (task 1002975) --------------------------------
|
|
212
|
+
//
|
|
213
|
+
// THE BUG. With no context word, a bare `#N` was linkified on ID EXISTENCE ALONE:
|
|
214
|
+
// the prose "side door #1" became a link to task 1, while its sibling "side door
|
|
215
|
+
// #2" survived only because no id 2 exists. That is luck, not grammar, and task
|
|
216
|
+
// 1002974 had to repair a committed doc because of it.
|
|
217
|
+
//
|
|
218
|
+
// THE RULE, AND WHY IT IS A WIDTH RULE. The originating row proposed "a preceding
|
|
219
|
+
// bare noun without task/idea/blocker context words → leave alone". Measured
|
|
220
|
+
// against the actual corpus, that is far too broad: running linkifyText over every
|
|
221
|
+
// committed .md with a maximally permissive id set rewrites 231 context-less refs,
|
|
222
|
+
// 77 of them preceded by a bare word — and 49 of those are GENUINE ("the #506",
|
|
223
|
+
// "by #435", "under #436"). Skipping on the preceding noun alone would leave ~49
|
|
224
|
+
// real refs bare, which is exactly the GitHub-mis-autolink harm this script exists
|
|
225
|
+
// to prevent. So the noun test alone would have traded one defect for a worse one.
|
|
226
|
+
//
|
|
227
|
+
// What DOES separate them in the corpus is WIDTH. All 28 word-preceded refs of 1–2
|
|
228
|
+
// digits are ordinal prose — "§Decision #4" (an ADR section, 13 of them), "limiter
|
|
229
|
+
// #4", "limiter #5", "idea fixture #1", "fixture #4", "ask #1", "and #7", "with
|
|
230
|
+
// #5" — and every word-preceded ref of 3+ digits is a real task. Ordinals in
|
|
231
|
+
// English prose are small; the ids these docs cite are not. Hence: no context
|
|
232
|
+
// word, AND a bare word immediately before, AND at most two digits.
|
|
233
|
+
//
|
|
234
|
+
// Both conjuncts are load-bearing. Drop the width and 49 real refs go bare; drop
|
|
235
|
+
// the preceding-word test and "(#1)" or a line-leading "#7" — which the corpus
|
|
236
|
+
// shows are ordinarily genuine — stop linking too.
|
|
237
|
+
//
|
|
238
|
+
// Known cost, accepted: "PMS-V2 #37" and "the #54" are legacy two-digit refs that
|
|
239
|
+
// now stay bare. Two ambiguous links lost against ~26 false ones fixed, and a bare
|
|
240
|
+
// "#37" with no entity word is ambiguous to a human reader as well.
|
|
241
|
+
//
|
|
242
|
+
// This lands in linkifyText rather than beside it because `.claude/hooks/
|
|
243
|
+
// stop-refcheck.js` classifies by CALLING linkifyText — so the same prose stops
|
|
244
|
+
// being flagged in chat by the same change, with no second copy of the rule.
|
|
245
|
+
// The one context word the guard must stand down for. There is deliberately NO
|
|
246
|
+
// task entry in classifyKind — "task #170" is handled by the DEFAULT path (no
|
|
247
|
+
// kind, id exists → link), because a task is the thing this resolver is for. That
|
|
248
|
+
// leaves "task #3" looking exactly like "limiter #4" to a width rule, and the
|
|
249
|
+
// first cut of this guard ate it. Caught by its own test, which is why the test
|
|
250
|
+
// exists. Not folded into ENTITY_RE: that set means "shares the integer space
|
|
251
|
+
// with tasks but is NOT one", and adding `task` there would neutralize every
|
|
252
|
+
// "task #N" into a code span.
|
|
253
|
+
const TASK_CTX_RE = /\b(tasks?)[`'")\s(:]*$/i;
|
|
254
|
+
// Words that INTRODUCE a reference rather than being the noun it counts. The row
|
|
255
|
+
// asked for "a preceding bare NOUN", and these are not nouns: "see #2" is a real
|
|
256
|
+
// ref and the Stop hook is right to block it in chat, which is how this omission
|
|
257
|
+
// was caught — tests/stop_refcheck.mjs went red on exactly that string.
|
|
258
|
+
//
|
|
259
|
+
// Kept deliberately short, and checked against the corpus rather than guessed: the
|
|
260
|
+
// 1–2 digit word-preceded refs in committed docs are preceded by pms-v2 · task ·
|
|
261
|
+
// the · ask · and · decision · limiter · fixture · sr · with · fixing. None of
|
|
262
|
+
// these six appears there, so exempting them re-breaks nothing that was measured.
|
|
263
|
+
// Words like "the", "and", "with" and "of" are NOT here on purpose — they precede
|
|
264
|
+
// ordinal phrases at least as often as references ("ask #1 and #7" means the
|
|
265
|
+
// questions, not two tasks).
|
|
266
|
+
const ORDINAL_EXEMPT_RE = /\b(see|from|per|via|in|at)[`'")\s(:]*$/i;
|
|
267
|
+
const ORDINAL_MAX_DIGITS = 2;
|
|
268
|
+
// A bare word (letters, then letters/digits/'/-) immediately before the '#',
|
|
269
|
+
// separated by spaces or tabs or nothing at all. Anchored at the end of the left
|
|
270
|
+
// context. The whitespace is OPTIONAL because the corpus contains "SR#11" — a
|
|
271
|
+
// security-review finding number, unspaced and just as much a false positive as
|
|
272
|
+
// the spaced ones. Widening it is safe precisely because the width conjunct is
|
|
273
|
+
// what protects real refs: every word-adjacent ref of 3+ digits is untouched
|
|
274
|
+
// either way, so this only ever admits more of the same two-digit class.
|
|
275
|
+
const ORDINAL_PROSE_LEFT_RE = /[A-Za-z][A-Za-z0-9'-]*[ \t]*$/;
|
|
276
|
+
|
|
277
|
+
const RESOLVER_LINK_RE = new RegExp(`\\[#(${REF_DIGITS})\\]\\((?:https?:\\/\\/[^/)\\s]+)?\\/builders#\\/task\\/(${REF_DIGITS})\\)`, 'g');
|
|
278
|
+
|
|
279
|
+
// Classify a ref by its left context (+ list-glue carry). Returns one of
|
|
280
|
+
// 'github' | 'idea' | 'blocker' | 'entity' | null (null = candidate task ref).
|
|
281
|
+
function classifyKind(left, carried, prevKind) {
|
|
282
|
+
if (GITHUB_NS_RE.test(left)) return 'github';
|
|
283
|
+
if (IDEA_CTX_RE.test(left)) return 'idea';
|
|
284
|
+
if (BLOCKER_CTX_RE.test(left)) return 'blocker';
|
|
285
|
+
if (ENTITY_RE.test(left)) return 'entity';
|
|
286
|
+
if (carried) return prevKind;
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Accept a bare Set (legacy: task ids only) or {tasks, ideas, blockers}.
|
|
291
|
+
function normalizeIdSets(ids) {
|
|
292
|
+
const toSet = (v) => (v instanceof Set ? v : new Set((v || []).map(Number).filter(Number.isInteger)));
|
|
293
|
+
if (ids instanceof Set) return { tasks: ids, ideas: new Set(), blockers: new Set() };
|
|
294
|
+
return { tasks: toSet(ids && ids.tasks), ideas: toSet(ids && ids.ideas), blockers: toSet(ids && ids.blockers) };
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Undo PAST mis-linkifications: an entity/idea/blocker-context ref that an
|
|
298
|
+
// earlier, less careful run rewrote into a TASK link ("learning [#53](task/53)"
|
|
299
|
+
// — wrong target). Such links become neutral code spans (Phase 2 then upgrades
|
|
300
|
+
// idea/blocker ones to their proper resolver); a GitHub-namespace one (a PR ref
|
|
301
|
+
// wrongly sent to the task resolver) goes back to bare so GitHub's own
|
|
302
|
+
// autolinker works again. Same accumulating left-context + list-glue carry as
|
|
303
|
+
// linkifySegment so ranges ("reports [#2](u)–[#11](u)") unwrap on both ends.
|
|
304
|
+
function unlinkEntitySegment(segment, leftContext, stats) {
|
|
305
|
+
let out = '';
|
|
306
|
+
let last = 0;
|
|
307
|
+
let prevEnd = 0;
|
|
308
|
+
let hadPrev = false;
|
|
309
|
+
let prevKind = null; // 'entity' | 'idea' | 'blocker' | 'github' | null
|
|
310
|
+
let m;
|
|
311
|
+
RESOLVER_LINK_RE.lastIndex = 0;
|
|
312
|
+
while ((m = RESOLVER_LINK_RE.exec(segment)) !== null) {
|
|
313
|
+
if (m[1] !== m[2]) continue; // text/target number mismatch — not ours
|
|
314
|
+
const num = m[1];
|
|
315
|
+
const start = m.index;
|
|
316
|
+
const left = leftContext + out + segment.slice(last, start);
|
|
317
|
+
const gap = segment.slice(prevEnd, start);
|
|
318
|
+
const carried = hadPrev && prevKind && LIST_GLUE_RE.test(gap);
|
|
319
|
+
const kind = classifyKind(left, carried, prevKind);
|
|
320
|
+
|
|
321
|
+
prevEnd = start + m[0].length;
|
|
322
|
+
hadPrev = true;
|
|
323
|
+
prevKind = kind;
|
|
324
|
+
if (!kind) continue; // a genuine task link — leave it
|
|
325
|
+
|
|
326
|
+
out += segment.slice(last, start);
|
|
327
|
+
out += kind === 'github' ? `#${num}` : `\`#${num}\``;
|
|
328
|
+
last = prevEnd;
|
|
329
|
+
stats.unlinked = (stats.unlinked || 0) + 1;
|
|
330
|
+
}
|
|
331
|
+
out += segment.slice(last);
|
|
332
|
+
return out;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Replace bare "#NNN" refs in a single non-code text segment. `leftContext` is
|
|
336
|
+
// everything already emitted on this line (for left-context tests). `ids` is
|
|
337
|
+
// {tasks, ideas, blockers} Sets. Returns the transformed segment; mutates `stats`.
|
|
338
|
+
function linkifySegment(segment, ids, leftContext, stats) {
|
|
339
|
+
let out = '';
|
|
340
|
+
const re = new RegExp(`#(${REF_DIGITS})`, 'g');
|
|
341
|
+
let m;
|
|
342
|
+
let last = 0;
|
|
343
|
+
let prevEnd = 0; // index in `segment` just past the previous match
|
|
344
|
+
let hadPrev = false;
|
|
345
|
+
let prevKind = null; // carries across list glue
|
|
346
|
+
// Index ranges covered by the TEXT of a markdown link `[text](url)`. A "#NNN"
|
|
347
|
+
// inside link text is already part of a link; rewriting it nests one link
|
|
348
|
+
// inside another (`[task [#415](resolver)](url)`). prevChar==='[' only caught
|
|
349
|
+
// "#" right after the bracket — this catches it anywhere in the text.
|
|
350
|
+
const linkRanges = [];
|
|
351
|
+
{ const lre = /\[([^\]]*)\]\([^)]*\)/g; let lm;
|
|
352
|
+
while ((lm = lre.exec(segment)) !== null) linkRanges.push([lm.index + 1, lm.index + 1 + lm[1].length]); }
|
|
353
|
+
while ((m = re.exec(segment)) !== null) {
|
|
354
|
+
const num = m[1];
|
|
355
|
+
const start = m.index;
|
|
356
|
+
const matchEnd = start + m[0].length;
|
|
357
|
+
const endChar = segment[matchEnd]; // char immediately after the digits
|
|
358
|
+
// Left context = the line so far + this segment up to the match.
|
|
359
|
+
const left = leftContext + segment.slice(0, start);
|
|
360
|
+
const prevChar = left.length ? left[left.length - 1] : '';
|
|
361
|
+
const gap = segment.slice(prevEnd, start);
|
|
362
|
+
|
|
363
|
+
// Classification = directly preceded by an entity / idea / blocker / GitHub
|
|
364
|
+
// noun, OR inherited across a pure list-glue gap.
|
|
365
|
+
const carried = hadPrev && prevKind && LIST_GLUE_RE.test(gap);
|
|
366
|
+
const kind = classifyKind(left, carried, prevKind);
|
|
367
|
+
|
|
368
|
+
// Positional skips first — these positions must never be rewritten in ANY
|
|
369
|
+
// direction (anchors, existing link text/targets).
|
|
370
|
+
let skipReason = null;
|
|
371
|
+
if (prevChar === '`' && endChar === '`') {
|
|
372
|
+
// Already a neutralized code-span ref (`#170`) — Phase 2 owns upgrading
|
|
373
|
+
// those; never wrap one again here.
|
|
374
|
+
skipReason = 'already-neutralized';
|
|
375
|
+
} else if (endChar === '-' || /[A-Za-z0-9_]/.test(endChar || '')) {
|
|
376
|
+
// `#12-session-update-protocol` (heading anchor) or `#170abc` — not a bare ref.
|
|
377
|
+
skipReason = 'anchor-or-slug';
|
|
378
|
+
} else if (prevChar === '[') {
|
|
379
|
+
// Already link text: `[#170](...)`.
|
|
380
|
+
skipReason = 'already-link-text';
|
|
381
|
+
} else if (linkRanges.some(([s, e]) => start >= s && start < e)) {
|
|
382
|
+
// Inside link text mid-string: `[task #170](url)` — would nest links.
|
|
383
|
+
skipReason = 'in-link-text';
|
|
384
|
+
} else if (/\]\($/.test(left)) {
|
|
385
|
+
// Link target: `](#170)`.
|
|
386
|
+
skipReason = 'link-target';
|
|
387
|
+
} else if (kind === 'github') {
|
|
388
|
+
// "PR #475" — genuinely GitHub's number space; the bare autolink is CORRECT.
|
|
389
|
+
skipReason = 'github-namespace';
|
|
390
|
+
} else if (!kind && !TASK_CTX_RE.test(left) && !ORDINAL_EXEMPT_RE.test(left)
|
|
391
|
+
&& ORDINAL_PROSE_LEFT_RE.test(left) && num.length <= ORDINAL_MAX_DIGITS) {
|
|
392
|
+
// "side door #1", "limiter #4", "§Decision #4" — a noun followed by a small
|
|
393
|
+
// ordinal, not a ref. See ORDINAL_MAX_DIGITS for the corpus evidence.
|
|
394
|
+
skipReason = 'ordinal-prose';
|
|
395
|
+
} else if (!kind && !ids.tasks.has(Number(num))) {
|
|
396
|
+
// No context and not a known task id — too ambiguous to touch (a bare PR
|
|
397
|
+
// ref, a future task, a numeric color). Left bare.
|
|
398
|
+
skipReason = 'not-a-task';
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Advance list state for the NEXT match regardless of this one's outcome.
|
|
402
|
+
prevEnd = matchEnd;
|
|
403
|
+
hadPrev = true;
|
|
404
|
+
prevKind = kind;
|
|
405
|
+
|
|
406
|
+
if (skipReason) {
|
|
407
|
+
stats.skipped[skipReason] = (stats.skipped[skipReason] || 0) + 1;
|
|
408
|
+
continue; // leave the match untouched; regex keeps scanning after it
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
out += segment.slice(last, start);
|
|
412
|
+
if (kind === 'idea' || kind === 'blocker') {
|
|
413
|
+
// An idea/blocker ref: link to that resolver when the id is real, else
|
|
414
|
+
// neutralize (a stale/typo'd id bare would still autolink to a GitHub 404).
|
|
415
|
+
const set = kind === 'idea' ? ids.ideas : ids.blockers;
|
|
416
|
+
if (set.has(Number(num))) {
|
|
417
|
+
const base = kind === 'idea' ? RESOLVER_BASE_IDEA : RESOLVER_BASE_BLOCKER;
|
|
418
|
+
out += `[#${num}](${base}${num})`;
|
|
419
|
+
stats[kind === 'idea' ? 'linkified_idea' : 'linkified_blocker'] =
|
|
420
|
+
(stats[kind === 'idea' ? 'linkified_idea' : 'linkified_blocker'] || 0) + 1;
|
|
421
|
+
} else {
|
|
422
|
+
out += `\`#${num}\``;
|
|
423
|
+
stats.neutralized = (stats.neutralized || 0) + 1;
|
|
424
|
+
}
|
|
425
|
+
} else if (kind === 'entity') {
|
|
426
|
+
// A different entity's id with no resolver — neutralize.
|
|
427
|
+
out += `\`#${num}\``;
|
|
428
|
+
stats.neutralized = (stats.neutralized || 0) + 1;
|
|
429
|
+
} else {
|
|
430
|
+
// A task ref (validated above).
|
|
431
|
+
out += `[#${num}](${RESOLVER_BASE}${num})`;
|
|
432
|
+
stats.linkified += 1;
|
|
433
|
+
}
|
|
434
|
+
last = matchEnd;
|
|
435
|
+
}
|
|
436
|
+
out += segment.slice(last);
|
|
437
|
+
return out;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Phase 2 (#629): upgrade a PRIOR idea/blocker NEUTRALIZATION (`#N`, emitted by
|
|
441
|
+
// an earlier run before those resolvers existed) into a proper resolver link.
|
|
442
|
+
// Operates on the rejoined line and matches ONLY the exact lone `#N` code-span
|
|
443
|
+
// token, gated on (a) idea/blocker left-context (with list-glue carry) AND (b)
|
|
444
|
+
// the id being in the matching public id set — so a legitimate code span like
|
|
445
|
+
// "the `#197` marker" (no entity noun) and an other-entity neutralization
|
|
446
|
+
// ("learning `#53`") are left untouched. Idempotent: once upgraded to a link
|
|
447
|
+
// the `#N` code span is gone, so a second pass is a no-op.
|
|
448
|
+
function upgradeLineCodeSpans(line, ids, stats) {
|
|
449
|
+
let out = '';
|
|
450
|
+
let last = 0;
|
|
451
|
+
let prevEnd = 0;
|
|
452
|
+
let hadPrev = false;
|
|
453
|
+
let prevKind = null; // only 'idea' | 'blocker' carry here
|
|
454
|
+
const re = new RegExp('`#(' + REF_DIGITS + ')`', 'g');
|
|
455
|
+
let m;
|
|
456
|
+
while ((m = re.exec(line)) !== null) {
|
|
457
|
+
const num = m[1];
|
|
458
|
+
const start = m.index;
|
|
459
|
+
const matchEnd = start + m[0].length;
|
|
460
|
+
const left = line.slice(0, start);
|
|
461
|
+
const gap = line.slice(prevEnd, start);
|
|
462
|
+
const carried = hadPrev && prevKind && LIST_GLUE_RE.test(gap);
|
|
463
|
+
let kind = null;
|
|
464
|
+
if (IDEA_CTX_RE.test(left)) kind = 'idea';
|
|
465
|
+
else if (BLOCKER_CTX_RE.test(left)) kind = 'blocker';
|
|
466
|
+
else if (carried) kind = prevKind;
|
|
467
|
+
|
|
468
|
+
prevEnd = matchEnd;
|
|
469
|
+
hadPrev = true;
|
|
470
|
+
prevKind = kind === 'idea' || kind === 'blocker' ? kind : null;
|
|
471
|
+
|
|
472
|
+
if (kind === 'idea' || kind === 'blocker') {
|
|
473
|
+
const set = kind === 'idea' ? ids.ideas : ids.blockers;
|
|
474
|
+
if (set.has(Number(num))) {
|
|
475
|
+
out += line.slice(last, start);
|
|
476
|
+
const base = kind === 'idea' ? RESOLVER_BASE_IDEA : RESOLVER_BASE_BLOCKER;
|
|
477
|
+
out += `[#${num}](${base}${num})`;
|
|
478
|
+
last = matchEnd;
|
|
479
|
+
stats.upgraded = (stats.upgraded || 0) + 1;
|
|
480
|
+
}
|
|
481
|
+
// valid-set miss → leave the code span as-is (correctly still neutralized)
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
out += line.slice(last);
|
|
485
|
+
return out;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// Pure: rewrite all eligible "#NNN" refs in `text`. `ids` is a Set of task ids
|
|
489
|
+
// (legacy) or {tasks, ideas, blockers}. Skips fenced code blocks and inline code
|
|
490
|
+
// spans (except the Phase-2 idea/blocker neutralization upgrade).
|
|
491
|
+
function linkifyText(text, ids, stats) {
|
|
492
|
+
ids = normalizeIdSets(ids);
|
|
493
|
+
stats = stats || { linkified: 0, skipped: {} };
|
|
494
|
+
if (!stats.skipped) stats.skipped = {};
|
|
495
|
+
const lines = text.split('\n');
|
|
496
|
+
let inFence = false;
|
|
497
|
+
const result = lines.map((line) => {
|
|
498
|
+
const fenceToggle = /^\s*(```|~~~)/.test(line);
|
|
499
|
+
if (fenceToggle) {
|
|
500
|
+
inFence = !inFence;
|
|
501
|
+
return line; // the fence line itself is never transformed
|
|
502
|
+
}
|
|
503
|
+
if (inFence) return line;
|
|
504
|
+
// Phase 1. Split on inline code spans (single backtick). Even indices are
|
|
505
|
+
// outside code, odd indices are inside — only transform the outside segments.
|
|
506
|
+
const parts = line.split('`');
|
|
507
|
+
let leftContext = '';
|
|
508
|
+
for (let k = 0; k < parts.length; k++) {
|
|
509
|
+
if (k % 2 === 1) {
|
|
510
|
+
leftContext += '`' + parts[k]; // odd index = inside a code span; never transformed
|
|
511
|
+
} else {
|
|
512
|
+
// First undo past mis-linkifications (entity refs wrongly sent to the
|
|
513
|
+
// task resolver), then classify what's left.
|
|
514
|
+
const unlinked = unlinkEntitySegment(parts[k], leftContext, stats);
|
|
515
|
+
const transformed = linkifySegment(unlinked, ids, leftContext, stats);
|
|
516
|
+
leftContext += transformed;
|
|
517
|
+
parts[k] = transformed;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// Phase 2. Upgrade pre-existing idea/blocker `#N` neutralizations to links.
|
|
521
|
+
return upgradeLineCodeSpans(parts.join('`'), ids, stats);
|
|
522
|
+
});
|
|
523
|
+
return { text: result.join('\n'), stats };
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// ---- CLI ----------------------------------------------------------------
|
|
527
|
+
|
|
528
|
+
// Token-free: the public id allow-list, so this script (and the CI gate) work
|
|
529
|
+
// with no builder session. Override the host with GDS_API_BASE for local dev.
|
|
530
|
+
async function fetchRefIds() {
|
|
531
|
+
const res = await fetch(`${API_BASE}/api/bongos/public/ref-ids`);
|
|
532
|
+
if (!res.ok) throw new Error(`/public/ref-ids fetch failed (HTTP ${res.status})`);
|
|
533
|
+
const data = await res.json();
|
|
534
|
+
const toSet = (a) => new Set((a || []).map(Number).filter(Number.isInteger));
|
|
535
|
+
const tasks = toSet(data.tasks);
|
|
536
|
+
if (!tasks.size) throw new Error('no task ids returned from /public/ref-ids');
|
|
537
|
+
return { tasks, ideas: toSet(data.ideas), blockers: toSet(data.blockers) };
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
function unifiedish(file, before, after) {
|
|
541
|
+
// Print only the lines that changed, with a little context — enough for a
|
|
542
|
+
// human to eyeball without drowning in a full-file diff.
|
|
543
|
+
const a = before.split('\n');
|
|
544
|
+
const b = after.split('\n');
|
|
545
|
+
const out = [];
|
|
546
|
+
for (let i = 0; i < a.length; i++) {
|
|
547
|
+
if (a[i] !== b[i]) {
|
|
548
|
+
out.push(` ${file}:${i + 1}`);
|
|
549
|
+
out.push(` - ${a[i]}`);
|
|
550
|
+
out.push(` + ${b[i]}`);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return out.join('\n');
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
async function main() {
|
|
557
|
+
const args = process.argv.slice(2);
|
|
558
|
+
const apply = args.includes('--apply');
|
|
559
|
+
const check = args.includes('--check'); // CI gate: report + non-zero exit, no writes
|
|
560
|
+
const idsArgIdx = args.indexOf('--ids');
|
|
561
|
+
let ids;
|
|
562
|
+
const files = args.filter((a, i) => !a.startsWith('--') && !(idsArgIdx >= 0 && i === idsArgIdx + 1));
|
|
563
|
+
const targets = files.length ? files : discoverDocs();
|
|
564
|
+
|
|
565
|
+
if (idsArgIdx >= 0) {
|
|
566
|
+
const tasks = new Set(String(args[idsArgIdx + 1] || '').split(',').map((s) => Number(s.trim())).filter(Number.isInteger));
|
|
567
|
+
ids = { tasks, ideas: new Set(), blockers: new Set() };
|
|
568
|
+
} else {
|
|
569
|
+
try {
|
|
570
|
+
ids = await fetchRefIds();
|
|
571
|
+
} catch (err) {
|
|
572
|
+
// Fail OPEN on infra in --check: a network blip or a not-yet-deployed
|
|
573
|
+
// endpoint must never red-X an unrelated build. Real bare refs still get
|
|
574
|
+
// caught on the next run once the id list is reachable.
|
|
575
|
+
if (check) {
|
|
576
|
+
console.warn(`⚠ skipping check — id allow-list unavailable (${err.message}).`);
|
|
577
|
+
process.exit(0);
|
|
578
|
+
}
|
|
579
|
+
throw err;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
const mode = check ? 'check (CI gate — non-zero exit if any bare/upgradeable ref remains)'
|
|
583
|
+
: apply ? 'apply (writing changes)'
|
|
584
|
+
: 'dry-run (no files written; pass --apply to write)';
|
|
585
|
+
console.log(`Linkify refs → task/idea/blocker resolvers (${ids.tasks.size} task · ${ids.ideas.size} idea · ${ids.blockers.size} blocker ids · ${targets.length} docs)`);
|
|
586
|
+
console.log(`MODE: ${mode}\n`);
|
|
587
|
+
|
|
588
|
+
const totals = { linkified: 0, linkified_idea: 0, linkified_blocker: 0, neutralized: 0, unlinked: 0, upgraded: 0, skipped: {} };
|
|
589
|
+
const offenders = [];
|
|
590
|
+
for (const rel of targets) {
|
|
591
|
+
const abs = path.resolve(process.cwd(), rel);
|
|
592
|
+
if (!fs.existsSync(abs)) {
|
|
593
|
+
console.log(` (skip — not found: ${rel})`);
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
const before = fs.readFileSync(abs, 'utf8');
|
|
597
|
+
const { text: after, stats } = linkifyText(before, ids);
|
|
598
|
+
totals.linkified += stats.linkified;
|
|
599
|
+
totals.linkified_idea += stats.linkified_idea || 0;
|
|
600
|
+
totals.linkified_blocker += stats.linkified_blocker || 0;
|
|
601
|
+
totals.neutralized += stats.neutralized || 0;
|
|
602
|
+
totals.unlinked += stats.unlinked || 0;
|
|
603
|
+
totals.upgraded += stats.upgraded || 0;
|
|
604
|
+
for (const [k, v] of Object.entries(stats.skipped)) totals.skipped[k] = (totals.skipped[k] || 0) + v;
|
|
605
|
+
if (after !== before) {
|
|
606
|
+
const changed = (stats.linkified || 0) + (stats.linkified_idea || 0) + (stats.linkified_blocker || 0) + (stats.upgraded || 0) + (stats.neutralized || 0) + (stats.unlinked || 0);
|
|
607
|
+
offenders.push({ rel, count: changed });
|
|
608
|
+
if (!check) {
|
|
609
|
+
console.log(`■ ${rel} — ${changed} change(s)`);
|
|
610
|
+
console.log(unifiedish(rel, before, after));
|
|
611
|
+
console.log('');
|
|
612
|
+
}
|
|
613
|
+
if (apply) fs.writeFileSync(abs, after);
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
console.log('— summary —');
|
|
618
|
+
console.log(` docs needing rewrites: ${offenders.length}`);
|
|
619
|
+
console.log(` task refs ${apply ? 'linkified' : 'pending'}: ${totals.linkified}`);
|
|
620
|
+
console.log(` idea refs ${apply ? 'linkified' : 'pending'}: ${totals.linkified_idea}`);
|
|
621
|
+
console.log(` blocker refs ${apply ? 'linkified' : 'pending'}: ${totals.linkified_blocker}`);
|
|
622
|
+
console.log(` prior idea/blocker neutralizations ${apply ? 'upgraded' : 'to upgrade'}: ${totals.upgraded}`);
|
|
623
|
+
console.log(` entity refs ${apply ? 'neutralized' : 'to neutralize'} (code-spanned): ${totals.neutralized}`);
|
|
624
|
+
console.log(` past mis-links ${apply ? 'unwrapped' : 'to unwrap'}: ${totals.unlinked}`);
|
|
625
|
+
console.log(` skipped: ${JSON.stringify(totals.skipped)}`);
|
|
626
|
+
|
|
627
|
+
if (check && offenders.length) {
|
|
628
|
+
console.error(`\n✖ ${offenders.length} doc(s) still have a bare/upgradeable "#NNN" that mis-renders on github.com:`);
|
|
629
|
+
for (const o of offenders) console.error(` - ${o.rel} (${o.count})`);
|
|
630
|
+
console.error('\n Fix locally: node scripts/bongos/linkify-refs.js --apply');
|
|
631
|
+
process.exit(1);
|
|
632
|
+
}
|
|
633
|
+
if (!apply && !check && offenders.length) console.log('\n Re-run with --apply to write these changes.');
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
if (require.main === module) {
|
|
637
|
+
main().catch((e) => {
|
|
638
|
+
console.error('ERR', e.message);
|
|
639
|
+
process.exit(1);
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
module.exports = {
|
|
644
|
+
linkifyText, linkifySegment, unlinkEntitySegment, upgradeLineCodeSpans,
|
|
645
|
+
classifyKind, normalizeIdSets, discoverDocs,
|
|
646
|
+
RESOLVER_BASE, RESOLVER_BASE_IDEA, RESOLVER_BASE_BLOCKER,
|
|
647
|
+
// task 1003542: the bare-ref digit width, exported so the OTHER enforcement
|
|
648
|
+
// point (.claude/hooks/stop-refcheck.js) reads it here instead of keeping its
|
|
649
|
+
// own copy — the drift that let 7-digit ids past both guards at once.
|
|
650
|
+
REF_DIGITS,
|
|
651
|
+
// task 1003542: the loopback test behind the resolver base. Exported because
|
|
652
|
+
// RESOLVER_BASE is computed once at module load, so the DECISION is the only
|
|
653
|
+
// part a unit test can reach without re-requiring under a mocked branding.
|
|
654
|
+
isLoopbackOrigin,
|
|
655
|
+
};
|