@bongos/core 1.18.3 → 1.18.19
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 +1576 -286
- package/.claude/skills/builder-box/SKILL.md +6 -0
- package/.claude/skills/builder-sequence/SKILL.md +97 -0
- package/.claude/skills/builder-ship/SKILL.md +8 -2
- package/.claude/skills/builder-start/SKILL.md +11 -0
- package/.claude/skills/builder-sync/SKILL.md +41 -0
- package/.claude/skills/fix-task/SKILL.md +64 -0
- package/.claude/skills/goal-create/SKILL.md +158 -0
- package/.claude/skills/goal-review/SKILL.md +3 -1
- package/.claude/skills/idea-triage/SKILL.md +14 -8
- package/.claude/skills/merge-mode/SKILL.md +2 -2
- package/.claude/skills/new-project/SKILL.md +1 -0
- package/.claude/skills/planning-session/SKILL.md +45 -18
- package/.env.local.example +4 -3
- package/README.md +4 -2
- package/bin/bongos.js +1 -0
- package/clients/bongos-client/README.md +2 -2
- package/clients/bongos-client/bongos-client.global.js +82 -18
- package/clients/bongos-client/index.cjs +82 -18
- package/clients/bongos-client/index.d.ts +131 -29
- package/clients/bongos-client/index.mjs +82 -18
- package/config/branding.neutral.json +6 -1
- package/config/governance.neutral.json +21 -0
- package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +24 -0
- package/docs/adr/0090-metic-task-authoring.md +1 -1
- package/docs/adr/0144-devbox-rehome-onto-cloudbongos-plane.md +41 -0
- package/docs/adr/0144-federated-single-logout-backchannel.md +42 -0
- package/docs/adr/0145-devbox-app-branding-driven-module.md +44 -0
- package/docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +62 -0
- package/docs/adr/0146-configurable-reward-mode-cost-plus-only.md +53 -0
- package/docs/adr/0147-standalone-live-docs-regen.md +39 -0
- package/docs/adr/0148-task-scoped-box-source-access.md +48 -0
- package/docs/adr/0149-bongos-dev-local-launcher.md +57 -0
- package/docs/adr/0150-box-first-boot-bringup-vendored-instances.md +68 -0
- package/docs/adr/0151-governance-permissions-as-atom-ranks-as-roles.md +229 -0
- package/docs/adr/0152-landing-gate-served-by-the-core-app.md +92 -0
- package/docs/adr/0152-metic-task-abandonment.md +67 -0
- package/docs/adr/0153-sequential-chain-runner.md +51 -0
- package/docs/adr/0154-goal-owner-criterion-authoring.md +86 -0
- package/docs/adr/README.md +10 -0
- package/docs/api/openapi.json +843 -17
- package/docs/api-reference.md +23 -10
- package/docs/architecture.md +4 -2
- package/docs/branding-contract.md +3 -1
- package/docs/canonical-permissions.md +21 -8
- package/docs/file-map.md +8 -0
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +2 -2
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +3 -1
- package/docs/onboarding/diagrams/05-versioning.mmd +1 -3
- package/docs/onboarding/diagrams/assertions.json +4 -7
- package/docs/onboarding/drachmae-and-karma.md +3 -3
- package/docs/onboarding/primer.md +17 -16
- package/docs/onboarding/slash-commands.md +124 -0
- package/docs/recipes/builder-box-lifecycle.md +23 -0
- package/docs/recipes/devbox-app-release.md +14 -4
- package/docs/recipes/instance-first-run.md +16 -0
- package/docs/recipes/local-dev.md +81 -0
- package/docs/recipes/ops-gotchas.md +19 -1
- package/docs/recipes/overnight-builder.md +1 -1
- package/docs/recipes/parallel-goal-waves.md +174 -0
- package/docs/recipes/ship-and-regrade.md +2 -2
- package/docs/recipes/standalone-live-docs.md +48 -0
- package/docs/recipes/work-on-a-task-from-your-dev-box.md +108 -0
- package/migrations/003_pms.sql +6 -7
- package/migrations/006_pms_v2.sql +3 -31
- package/migrations/core_193_task_needs_rebase.sql +28 -0
- package/migrations/core_194_confirmed_backlog_clawback.sql +63 -0
- package/migrations/core_195_idea_triage_provenance.sql +57 -0
- package/migrations/core_196_session_reward_topup.sql +69 -0
- package/modules/autonomy/pollers/routine-timers.js +9 -8
- package/modules/builder-settings/wandering-prefs.js +61 -18
- package/modules/dev-box/app/README.md +73 -0
- package/modules/dev-box/app/assets/tray/mac-alertTemplate.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-alertTemplate@2x.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-busyTemplate.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-busyTemplate@2x.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-offTemplate.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-offTemplate@2x.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-onTemplate.png +0 -0
- package/modules/dev-box/app/assets/tray/mac-onTemplate@2x.png +0 -0
- package/modules/dev-box/app/assets/tray/win-alert.png +0 -0
- package/modules/dev-box/app/assets/tray/win-busy.png +0 -0
- package/modules/dev-box/app/assets/tray/win-off.png +0 -0
- package/modules/dev-box/app/assets/tray/win-on.png +0 -0
- package/modules/dev-box/app/build-resources/dmg-background.png +0 -0
- package/modules/dev-box/app/build-resources/dmg-background@2x.png +0 -0
- package/modules/dev-box/app/build-resources/icon.png +0 -0
- package/modules/dev-box/app/electron-builder.tmpl.yml +95 -0
- package/modules/dev-box/app/electron-builder.yml +95 -0
- package/modules/dev-box/app/package-lock.json +5291 -0
- package/modules/dev-box/app/package.json +30 -0
- package/modules/dev-box/app/renderer/app.js +319 -0
- package/modules/dev-box/app/renderer/index.html +45 -0
- package/modules/dev-box/app/renderer/styles.css +246 -0
- package/modules/dev-box/app/renderer/theme.generated.css +16 -0
- package/modules/dev-box/app/scripts/apply-dmg-backdrop.sh +82 -0
- package/modules/dev-box/app/scripts/dmgbuild-settings.py +39 -0
- package/modules/dev-box/app/scripts/gen-brand.js +138 -0
- package/modules/dev-box/app/scripts/gen-dmg-backdrop.py +323 -0
- package/modules/dev-box/app/scripts/gen-icons.js +286 -0
- package/modules/dev-box/app/scripts/vendor-client.js +23 -0
- package/modules/dev-box/app/src/box-controller.js +287 -0
- package/modules/dev-box/app/src/brand.generated.json +13 -0
- package/modules/dev-box/app/src/brand.js +16 -0
- package/modules/dev-box/app/src/config.js +19 -0
- package/modules/dev-box/app/src/gds-client.js +90 -0
- package/modules/dev-box/app/src/main.js +610 -0
- package/modules/dev-box/app/src/pairing.js +57 -0
- package/modules/dev-box/app/src/preload.js +29 -0
- package/modules/dev-box/app/src/session-store.js +58 -0
- package/modules/dev-box/app/src/ssh-setup.js +569 -0
- package/modules/dev-box/app/src/task-picker.js +70 -0
- package/modules/dev-box/app/src/tray.js +99 -0
- package/modules/dev-box/app/src/updater.js +55 -0
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +698 -0
- package/modules/dev-box/app/test/unit.mjs +526 -0
- package/modules/dev-box/box-access.js +121 -4
- package/modules/dev-box/boxes.js +20 -0
- package/modules/dev-box/module.json +1 -1
- package/modules/dev-box/routes/box.js +87 -3
- package/modules/economy/credits.js +116 -25
- package/modules/economy/reward.js +8 -0
- package/modules/economy/streak.js +2 -1
- package/modules/governance/CLAUDE.md +15 -0
- package/modules/governance/catalog.js +419 -0
- package/modules/governance/config.js +174 -0
- package/modules/governance/db.js +125 -0
- package/modules/governance/migrations/governance_001_tables.sql +81 -0
- package/modules/governance/migrations/governance_002_seed_and_backfill.sql +103 -0
- package/modules/governance/migrations/governance_003_task_abandon_metic.sql +28 -0
- package/modules/governance/migrations/governance_004_criterion_create.sql +39 -0
- package/modules/governance/migrations/governance_005_resync_builder_rank_roles.sql +56 -0
- package/modules/governance/module.json +10 -0
- package/modules/governance/protected-surfaces.js +88 -0
- package/modules/governance/protected-surfaces.json +80 -0
- package/modules/governance/rank-roles.js +83 -0
- package/modules/governance/resolver.js +221 -0
- package/modules/governance/routes/governance.js +89 -0
- package/modules/governance/routes/role-sync.js +49 -0
- package/modules/governance/session-scopes.js +127 -0
- package/modules/governance/session-scopes.json +38 -0
- package/modules/hall-ui/public/atlas.css +117 -0
- package/modules/hall-ui/public/atlas.html +3 -114
- package/modules/hall-ui/public/brand-apply.js +34 -6
- package/modules/hall-ui/public/builders.js +187 -219
- package/modules/hall-ui/public/diagrams.html +2 -0
- package/modules/hall-ui/public/dom-utils.js +27 -0
- package/modules/hall-ui/public/drachmae.html +2 -0
- package/modules/hall-ui/public/drachmae.js +54 -1
- package/modules/hall-ui/public/gate.css +98 -0
- package/modules/hall-ui/public/gate.html +3 -95
- package/modules/hall-ui/public/goal-inbox.js +4 -1
- package/modules/hall-ui/public/goals-page.js +626 -114
- package/modules/hall-ui/public/goals.css +79 -1
- package/modules/hall-ui/public/goals.html +38 -11
- package/modules/hall-ui/public/hall-widgets.js +62 -52
- package/modules/hall-ui/public/harbor.css +123 -0
- package/modules/hall-ui/public/harbor.html +3 -120
- package/modules/hall-ui/public/index.html +11 -4
- package/modules/hall-ui/public/instances-panel.js +4 -1
- package/modules/hall-ui/public/modules.css +63 -0
- package/modules/hall-ui/public/modules.html +3 -60
- package/modules/hall-ui/public/new-project-wizard.js +7 -3
- package/modules/hall-ui/public/not-ready.html +2 -0
- package/modules/hall-ui/public/pair.css +73 -0
- package/modules/hall-ui/public/pair.html +3 -70
- package/modules/hall-ui/public/palette.js +302 -0
- package/modules/hall-ui/public/primer.css +13 -0
- package/modules/hall-ui/public/primer.html +2 -0
- package/modules/hall-ui/public/profile.html +2 -0
- package/modules/hall-ui/public/ranks.html +2 -0
- package/modules/hall-ui/public/roadmap.css +179 -0
- package/modules/hall-ui/public/roadmap.html +9 -172
- package/modules/hall-ui/public/roadmap.js +329 -316
- package/modules/hall-ui/public/sessions.css +16 -0
- package/modules/hall-ui/public/sessions.html +3 -13
- package/modules/hall-ui/public/settings.html +2 -0
- package/modules/hall-ui/public/settings.js +4 -4
- package/modules/hall-ui/public/shell.js +143 -18
- package/modules/hall-ui/public/style.css +231 -39
- package/modules/hall-ui/public/task-detail.js +347 -26
- package/modules/hall-ui/public/task.html +6 -1
- package/modules/hall-ui/public/watch.html +2 -0
- package/modules/hall-ui/public/work.html +8 -6
- package/modules/hall-ui/public/work.js +1 -1
- package/modules/ideas/inbox.js +61 -11
- package/modules/ideas/routes/inbox.js +23 -0
- package/modules/lifecycle/claim-eligibility.js +72 -0
- package/modules/lifecycle/db.js +519 -139
- package/modules/lifecycle/done-when.js +18 -3
- package/modules/lifecycle/github-push.js +19 -2
- package/modules/lifecycle/goal-advisory.js +114 -0
- package/modules/lifecycle/goal-authz.js +62 -0
- package/modules/lifecycle/lifecycle.js +9 -0
- package/modules/lifecycle/publish-reconciler.js +109 -6
- package/modules/lifecycle/routes/claims.js +68 -23
- package/modules/lifecycle/routes/done-when.js +110 -15
- package/modules/lifecycle/routes/goals.js +8 -38
- package/modules/lifecycle/routes/tasks.js +38 -6
- package/modules/lifecycle/ship-card.js +6 -0
- package/modules/onboarding/onboarding-state.js +1 -1
- package/modules/platform-identity/CLAUDE.md +15 -0
- package/modules/platform-identity/hub-device.js +147 -0
- package/modules/platform-identity/hub-keys.js +151 -0
- package/modules/platform-identity/migrations/platform_identity_001_tables.sql +114 -0
- package/modules/platform-identity/migrations/platform_identity_002_client_origin_index.sql +18 -0
- package/modules/platform-identity/migrations/platform_identity_003_project_memberships.sql +42 -0
- package/modules/platform-identity/migrations/platform_identity_004_projects.sql +44 -0
- package/modules/platform-identity/migrations/platform_identity_005_builder_activity.sql +42 -0
- package/modules/platform-identity/module.json +18 -0
- package/modules/platform-identity/platform-identity.js +531 -0
- package/modules/platform-identity/pollers/code-sweep.js +43 -0
- package/modules/platform-identity/routes/my-projects.js +140 -0
- package/modules/platform-identity/routes/projects.js +107 -0
- package/modules/platform-identity/routes/scouting.js +35 -0
- package/modules/platform-identity/routes/sso.js +402 -0
- package/modules/platform-identity/tests/platform-identity.mjs +388 -0
- package/modules/platform-identity/ui/.gitkeep +0 -0
- package/modules/security/routes/reports.js +10 -0
- package/modules/sessions/db.js +166 -21
- package/modules/sessions/module.json +1 -1
- package/modules/sessions/pollers/session-reward-reconcile.js +78 -0
- package/modules/sessions/routes/sessions.js +33 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/anim/idle/frame_00.webp +0 -0
- package/public-landing/assets/anim/idle/frame_01.webp +0 -0
- package/public-landing/assets/anim/idle/frame_02.webp +0 -0
- package/public-landing/assets/anim/idle/frame_03.webp +0 -0
- package/public-landing/assets/anim/idle/frame_04.webp +0 -0
- package/public-landing/assets/anim/idle/frame_05.webp +0 -0
- package/public-landing/assets/anim/idle/frame_06.webp +0 -0
- package/public-landing/assets/anim/idle/frame_07.webp +0 -0
- package/public-landing/assets/anim/idle/frame_08.webp +0 -0
- package/public-landing/assets/anim/idle/frame_09.webp +0 -0
- package/public-landing/assets/anim/idle/frame_10.webp +0 -0
- package/public-landing/assets/anim/idle/frame_11.webp +0 -0
- package/public-landing/assets/anim/idle/frame_12.webp +0 -0
- package/public-landing/assets/anim/idle/frame_13.webp +0 -0
- package/public-landing/assets/anim/idle/frame_14.webp +0 -0
- package/public-landing/assets/anim/idle/frame_15.webp +0 -0
- package/public-landing/assets/anim/idle/frame_16.webp +0 -0
- package/public-landing/assets/anim/idle/frame_17.webp +0 -0
- package/public-landing/assets/anim/idle/frame_18.webp +0 -0
- package/public-landing/assets/anim/idle/frame_19.webp +0 -0
- package/public-landing/assets/anim/idle/frame_20.webp +0 -0
- package/public-landing/assets/anim/idle/frame_21.webp +0 -0
- package/public-landing/assets/anim/idle/frame_22.webp +0 -0
- package/public-landing/assets/anim/idle/frame_23.webp +0 -0
- package/public-landing/assets/anim/idle/frame_24.webp +0 -0
- package/public-landing/assets/anim/idle/frame_25.webp +0 -0
- package/public-landing/assets/anim/idle/frame_26.webp +0 -0
- package/public-landing/assets/anim/idle/frame_27.webp +0 -0
- package/public-landing/assets/anim/idle/frame_28.webp +0 -0
- package/public-landing/assets/anim/idle/frame_29.webp +0 -0
- package/public-landing/assets/anim/idle/frame_30.webp +0 -0
- package/public-landing/assets/anim/idle/frame_31.webp +0 -0
- package/public-landing/assets/anim/idle/frame_32.webp +0 -0
- package/public-landing/assets/anim/idle/frame_33.webp +0 -0
- package/public-landing/assets/anim/idle/frame_34.webp +0 -0
- package/public-landing/assets/anim/idle/frame_35.webp +0 -0
- package/public-landing/assets/anim/idle/frame_36.webp +0 -0
- package/public-landing/assets/anim/idle/frame_37.webp +0 -0
- package/public-landing/assets/anim/idle/frame_38.webp +0 -0
- package/public-landing/assets/anim/idle/frame_39.webp +0 -0
- package/public-landing/assets/anim/idle/frame_40.webp +0 -0
- package/public-landing/assets/anim/idle/frame_41.webp +0 -0
- package/public-landing/assets/anim/idle/frame_42.webp +0 -0
- package/public-landing/assets/anim/idle/frame_43.webp +0 -0
- package/public-landing/create.html +51 -58
- package/public-landing/gate/README.md +137 -0
- package/public-landing/gate/dispmaps/bar.png +0 -0
- package/public-landing/gate/dispmaps/flat.png +0 -0
- package/public-landing/gate/dispmaps/key.png +0 -0
- package/public-landing/gate/index.html +587 -0
- package/public-landing/gate/previews/cloud-bongos.jpg +0 -0
- package/public-landing/gate/previews/off-the-boats.jpg +0 -0
- package/public-landing/gate/space.css +799 -0
- package/public-landing/gate/space.js +1826 -0
- package/public-landing/gate/sprites/enter.png +0 -0
- package/public-landing/gate/sprites/search.png +0 -0
- package/public-landing/gate/sprites/terminal-blank.png +0 -0
- package/public-landing/gate/sprites/tile.png +0 -0
- package/public-landing/world/assets/clouds/cloud-island-large.png +0 -0
- package/public-landing/world/assets/clouds/cloud-puff.png +0 -0
- package/public-landing/world/assets/creatures/creature-whale-cargo.png +0 -0
- package/public-landing/world/assets/creatures/creature-whale-glide.png +0 -0
- package/public-landing/world/assets/plates/plate-clouds-near.png +0 -0
- package/public-landing/world/assets/plates/scene-establishing.png +0 -0
- package/scripts/gds/abandon.js +6 -4
- package/scripts/gds/api.js +10 -5
- package/scripts/gds/api.ps1 +26 -0
- package/scripts/gds/api.sh +6 -0
- package/scripts/gds/audit-ships.js +7 -1
- package/scripts/gds/backfill-sessions.js +78 -18
- package/scripts/gds/backup.js +23 -1
- package/scripts/gds/box-connect-lib.js +124 -31
- package/scripts/gds/box-sync.js +66 -0
- package/scripts/gds/box.js +225 -53
- package/scripts/gds/cf-tunnel.js +145 -6
- package/scripts/gds/claim.js +34 -3
- package/scripts/gds/cli-lib.js +161 -27
- package/scripts/gds/code.js +6 -2
- package/scripts/gds/deploy-divergence.js +209 -0
- package/scripts/gds/dev-lib.js +309 -0
- package/scripts/gds/dev.js +322 -0
- package/scripts/gds/doctor.js +90 -61
- package/scripts/gds/fetch-art-key.js +1 -1
- package/scripts/gds/fetch-sound-prefs.js +2 -2
- package/scripts/gds/fitness.js +228 -12
- package/scripts/gds/gds-db-backup.service +16 -1
- package/scripts/gds/gds-db-offsite.service +9 -1
- package/scripts/gds/gen-api-client.js +1 -1
- package/scripts/gds/gen-api-docs.js +36 -14
- package/scripts/gds/gen-diagrams.js +45 -28
- package/scripts/gds/gen-file-map.js +2 -1
- package/scripts/gds/gen-freshness.js +32 -0
- package/scripts/gds/gen-repo-map.js +3 -2
- package/scripts/gds/gen-session-index.js +14 -5
- package/scripts/gds/hooks/pre-push.js +2 -2
- package/scripts/gds/init.js +60 -3
- package/scripts/gds/install-git-hooks.js +1 -1
- package/scripts/gds/key-card.js +15 -6
- package/scripts/gds/key-status.js +1 -1
- package/scripts/gds/linkify-refs.js +35 -9
- package/scripts/gds/login.js +16 -1
- package/scripts/gds/paste-token.js +7 -1
- package/scripts/gds/preflight.js +126 -0
- package/scripts/gds/provision.js +123 -12
- package/scripts/gds/publish-manifest.js +7 -1
- package/scripts/gds/reauth.js +7 -3
- package/scripts/gds/regen-instance-docs.js +47 -0
- package/scripts/gds/run-unit-tests.js +4 -2
- package/scripts/gds/seed-bongos-v1-seo-tasks.js +104 -0
- package/scripts/gds/seed-bv1-profiles-tasks.js +126 -0
- package/scripts/gds/sequence.js +425 -0
- package/scripts/gds/session-cost.js +10 -1
- package/scripts/gds/setup.js +31 -5
- package/scripts/gds/shell.js +5 -3
- package/scripts/gds/ship.js +319 -29
- package/scripts/gds/smoke-gds.js +139 -8
- package/scripts/gds/start.js +171 -22
- package/scripts/gds/status.js +1 -1
- package/scripts/gds/triage.js +10 -9
- package/scripts/gds/upgrade.js +124 -2
- package/scripts/migrate.sh +99 -14
- package/scripts/status-mirror-sync.js +114 -84
- package/src/bongos/api-errors.js +1 -0
- package/src/bongos/auth.js +447 -102
- package/src/bongos/db-kernel.js +27 -0
- package/src/bongos/db.js +39 -0
- package/src/bongos/module-scope-map.js +27 -1
- package/src/bongos/permission-path-check.js +136 -102
- package/src/bongos/repo-info.js +47 -11
- package/src/bongos/route-rank-check.js +429 -46
- package/src/bongos/routes/_helpers.js +12 -1
- package/src/bongos/routes/auth.js +219 -2
- package/src/bongos/routes/backup.js +58 -2
- package/src/bongos/routes/me.js +35 -1
- package/src/bongos/serve-internal.js +84 -15
- package/src/branding.js +32 -0
- package/src/instance-config.js +30 -0
- package/src/module-api.js +124 -1
- package/src/platform-server.js +86 -9
- package/tests/abandon_task.mjs +59 -3
- package/tests/api_cli_flags.mjs +53 -0
- package/tests/auth_page_gate.mjs +13 -0
- package/tests/backfill_sessions.mjs +127 -1
- package/tests/backup_cli.mjs +54 -0
- package/tests/bongos_box_connect.mjs +77 -0
- package/tests/box_access.mjs +130 -1
- package/tests/box_credential.mjs +125 -0
- package/tests/box_host_keys.mjs +24 -0
- package/tests/box_infra_resolve.mjs +149 -0
- package/tests/box_scope_session.mjs +6 -2
- package/tests/box_sync.mjs +55 -0
- package/tests/box_task_scope.mjs +99 -0
- package/tests/branding.mjs +12 -0
- package/tests/cf_ruleset_preflight.mjs +142 -0
- package/tests/cf_tunnel.mjs +37 -0
- package/tests/claim_gate_rebase.mjs +98 -0
- package/tests/clawback_confirmed_backlog.mjs +103 -0
- package/tests/cli_lib_formatters.mjs +20 -0
- package/tests/confirm_attribution.mjs +30 -46
- package/tests/credit_grant.mjs +198 -10
- package/tests/criterion_authoring_gate.mjs +272 -0
- package/tests/criterion_progress.mjs +33 -1
- package/tests/dev_lib.mjs +253 -0
- package/tests/devbox_artifact_gate.mjs +75 -0
- package/tests/devbox_dmg_backdrop.mjs +137 -0
- package/tests/devbox_icons.mjs +304 -0
- package/tests/devbox_installer_brand.mjs +232 -0
- package/tests/devbox_key_register.mjs +234 -0
- package/tests/docs_openapi_route.mjs +110 -0
- package/tests/doctor_hooks.mjs +141 -0
- package/tests/extract_json.mjs +140 -0
- package/tests/fitness.mjs +89 -0
- package/tests/gen_freshness.mjs +96 -0
- package/tests/goal_advisory.mjs +251 -0
- package/tests/goal_criterion_confirm_ui.mjs +269 -0
- package/tests/goal_routes.mjs +59 -4
- package/tests/goal_tier.mjs +12 -3
- package/tests/governance_catalog.mjs +129 -0
- package/tests/governance_claim_eligibility.mjs +262 -0
- package/tests/governance_config.mjs +187 -0
- package/tests/governance_ownership_scope.mjs +410 -0
- package/tests/governance_page_gates.mjs +324 -0
- package/tests/governance_parity.mjs +336 -0
- package/tests/governance_principals.mjs +232 -0
- package/tests/governance_protected_surfaces.mjs +208 -0
- package/tests/governance_require_permission.mjs +223 -0
- package/tests/governance_resolver.mjs +84 -0
- package/tests/governance_role_sync.mjs +231 -0
- package/tests/governance_seed.mjs +127 -0
- package/tests/governance_session_scope.mjs +434 -0
- package/tests/governance_vanilla_boot.mjs +203 -0
- package/tests/grade_attribution.mjs +7 -7
- package/tests/hall_audit.mjs +223 -0
- package/tests/hall_nav.mjs +191 -0
- package/tests/hall_palette.mjs +206 -0
- package/tests/hall_signout.mjs +124 -0
- package/tests/hook_user_agents.mjs +10 -0
- package/tests/idea_triage.mjs +162 -0
- package/tests/idp_device_exchange.mjs +93 -0
- package/tests/init.mjs +51 -0
- package/tests/instance_config.mjs +65 -0
- package/tests/instance_mismatch_guard.mjs +23 -6
- package/tests/instance_release_config.mjs +104 -0
- package/tests/linkify_refs.mjs +15 -2
- package/tests/migrate_root_resolution.mjs +124 -1
- package/tests/module_contributions.mjs +55 -0
- package/tests/module_loader.mjs +10 -5
- package/tests/module_scope_active_claims.mjs +94 -0
- package/tests/needs_rebase.mjs +92 -0
- package/tests/one_active_claim_per_session.mjs +76 -0
- package/tests/override_attribution.mjs +10 -8
- package/tests/override_request_ownership.mjs +8 -4
- package/tests/parse_cookie_decode.mjs +42 -0
- package/tests/pay_on_land.mjs +129 -0
- package/tests/platform_boot.mjs +100 -1
- package/tests/post_login_landing.mjs +42 -0
- package/tests/preflight_checks.mjs +72 -0
- package/tests/provision.mjs +132 -7
- package/tests/publish_branch_route.mjs +53 -0
- package/tests/publish_reconciler.mjs +187 -2
- package/tests/repo_info_binding.mjs +248 -0
- package/tests/reward_gate.mjs +11 -2
- package/tests/reward_mode_cost_plus_only.mjs +116 -0
- package/tests/reward_mode_surfacing.mjs +168 -0
- package/tests/route_permission_check.mjs +301 -0
- package/tests/route_rank_check.mjs +254 -12
- package/tests/route_validation.mjs +30 -0
- package/tests/sequence.mjs +267 -0
- package/tests/session_digest.mjs +44 -0
- package/tests/session_index.mjs +18 -6
- package/tests/session_records.mjs +39 -1
- package/tests/session_reward_on_land.mjs +381 -0
- package/tests/session_reward_reconcile.mjs +229 -0
- package/tests/ship_api_client_pathspec.mjs +100 -0
- package/tests/ship_base_flag.mjs +93 -0
- package/tests/ship_ci_deploy.mjs +80 -3
- package/tests/ship_upstream_deletion.mjs +57 -0
- package/tests/smoke_target.mjs +233 -0
- package/tests/start_env_guard.mjs +87 -0
- package/tests/start_rebase_warning.mjs +103 -0
- package/tests/status_mirror_sync.mjs +122 -0
- package/tests/stop_refcheck.mjs +19 -1
- package/tests/task_goal_link.mjs +15 -6
- package/tests/upgrade.mjs +139 -0
- package/tests/web_admission_status.mjs +162 -0
- package/tests/write_validation_gaps.mjs +110 -0
|
@@ -145,11 +145,38 @@
|
|
|
145
145
|
// to it by id exactly as before.
|
|
146
146
|
// Empty until something registers → builders.js renders the hall it does today
|
|
147
147
|
// once it registers the core widgets unconditionally.
|
|
148
|
+
//
|
|
149
|
+
// task 2177 — placement governance. The rules and their rationale live in
|
|
150
|
+
// ../CLAUDE.md §Placement, which every reject message below links to; these
|
|
151
|
+
// vocabularies are the browser twin of builders.js VIEW_CONTAINERS/ZONE_BUDGETS.
|
|
152
|
+
// Violations console.error + return null rather than throw, so one bad
|
|
153
|
+
// third-party widget can't blank the hall (the structural id/label/mount
|
|
154
|
+
// contract below still throws — that one is first-party programmer error).
|
|
155
|
+
const HALL_ZONES = ['home-banner', 'home-stats', 'home-band', 'home-main'];
|
|
156
|
+
const HALL_VIEWS = ['home', 'standing', 'leaderboard'];
|
|
157
|
+
|
|
148
158
|
const _hallWidgets = [];
|
|
149
159
|
function contributeHallWidget(widget) {
|
|
150
160
|
if (!widget || typeof widget.mount !== 'function' || !widget.id || !widget.label) {
|
|
151
161
|
throw new Error('contributeHallWidget({ id, label, order?, rank?, module?, mount }) requires id + label + mount()');
|
|
152
162
|
}
|
|
163
|
+
const reject = (why) => {
|
|
164
|
+
console.error(`[hall] widget "${widget.id}" rejected: ${why} See modules/hall-ui/CLAUDE.md §Placement.`);
|
|
165
|
+
return null;
|
|
166
|
+
};
|
|
167
|
+
if (widget.view && !HALL_VIEWS.includes(widget.view)) {
|
|
168
|
+
return reject(`unknown view "${widget.view}" — expected one of ${HALL_VIEWS.join(', ')}.`);
|
|
169
|
+
}
|
|
170
|
+
if (widget.zone && !HALL_ZONES.includes(widget.zone)) {
|
|
171
|
+
return reject(`unknown zone "${widget.zone}" — expected one of ${HALL_ZONES.join(', ')}.`);
|
|
172
|
+
}
|
|
173
|
+
const view = widget.view || 'home';
|
|
174
|
+
if (view === 'home' && !widget.zone) {
|
|
175
|
+
return reject(`Home widgets must declare a zone (${HALL_ZONES.join(', ')}); there is no default.`);
|
|
176
|
+
}
|
|
177
|
+
if (widget.zone === 'home-main' && !widget.core && !widget.summary && !widget.collapsedByDefault) {
|
|
178
|
+
return reject('a non-core home-main widget must declare summary:true (row-capped, no pager/filter) or collapsedByDefault:true.');
|
|
179
|
+
}
|
|
153
180
|
if (widget.module && !moduleOn(widget.module)) return null; // off module → not registered
|
|
154
181
|
_hallWidgets.push(widget);
|
|
155
182
|
return widget;
|
|
@@ -61,6 +61,8 @@
|
|
|
61
61
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
62
62
|
|
|
63
63
|
<script src="/builders/shell.js?v=2026-07-02-shell1"></script>
|
|
64
|
+
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
65
|
+
<script src="/builders/palette.js" defer></script>
|
|
64
66
|
<script src="/builders/md-reader.js?v=2026-07-05-mdreader-1"></script>
|
|
65
67
|
<script src="/builders/drachmae.js?v=2026-07-05-drachmae-1" defer></script>
|
|
66
68
|
<script src="/builders/copy-on-click.js?v=2026-06-01-copy-1" defer></script>
|
|
@@ -5,6 +5,14 @@
|
|
|
5
5
|
// so builders can read exactly how they get paid without leaving the hall for
|
|
6
6
|
// GitHub. Reuses the primer's layout/TOC/progress DOM + primer.css; no ack gate
|
|
7
7
|
// (this is reference reading, not an onboarding checkpoint).
|
|
8
|
+
//
|
|
9
|
+
// task 2174: the red-team bounty rate card moved here off Standing. It is a
|
|
10
|
+
// published reward SCHEDULE — reference material that reads the same for every
|
|
11
|
+
// builder — so it belongs with the rest of the reward model, not in a personal
|
|
12
|
+
// standing view. The doc's §"Red-team / security bounty" describes it in prose;
|
|
13
|
+
// the LIVE numbers come from /public/bounty-table and are appended as a real
|
|
14
|
+
// section (h2 + table) so the TOC, scrollspy and progress bar pick it up like
|
|
15
|
+
// any other section of the article.
|
|
8
16
|
|
|
9
17
|
(() => {
|
|
10
18
|
'use strict';
|
|
@@ -12,6 +20,9 @@
|
|
|
12
20
|
const DOC_URL = '/builders/drachmae-and-karma.md';
|
|
13
21
|
// The doc lives at docs/onboarding/, so relative links resolve against it.
|
|
14
22
|
const DOC_DIR = 'docs/onboarding/';
|
|
23
|
+
const BOUNTY_URL = '/api/gds/public/bounty-table';
|
|
24
|
+
const BOUNTY_SECTION_ID = 'security-bounty-rates';
|
|
25
|
+
const BOUNTY_SECTION_TITLE = 'Security bounty rates';
|
|
15
26
|
|
|
16
27
|
let repoBlobBase = null;
|
|
17
28
|
let repoTreeBase = null;
|
|
@@ -28,6 +39,45 @@
|
|
|
28
39
|
} catch (_) { /* links degrade to the original href */ }
|
|
29
40
|
}
|
|
30
41
|
|
|
42
|
+
// Append the live bounty rate card to the article and return its TOC heading,
|
|
43
|
+
// or null when the schedule can't be read (the prose section stays; we just
|
|
44
|
+
// don't show an empty table or a TOC entry that leads nowhere).
|
|
45
|
+
async function appendBountySection(article) {
|
|
46
|
+
let payload;
|
|
47
|
+
try {
|
|
48
|
+
const r = await fetch(BOUNTY_URL, { credentials: 'same-origin' });
|
|
49
|
+
if (!r.ok) throw new Error(`${BOUNTY_URL} → ${r.status}`);
|
|
50
|
+
payload = await r.json();
|
|
51
|
+
} catch (err) {
|
|
52
|
+
console.warn('[drachmae] bounty schedule unavailable:', err.message);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const rows = Array.isArray(payload && payload.table) ? payload.table : [];
|
|
56
|
+
if (!rows.length) return null;
|
|
57
|
+
|
|
58
|
+
const esc = window.OTBMdReader.escapeHtml;
|
|
59
|
+
const currency = payload.currency || 'credits';
|
|
60
|
+
const section = document.createElement('section');
|
|
61
|
+
section.innerHTML =
|
|
62
|
+
`<h2 id="${esc(BOUNTY_SECTION_ID)}">${esc(BOUNTY_SECTION_TITLE)}</h2>` +
|
|
63
|
+
`<p>Find a flaw in the system’s own walls and report it — rewards are paid in ` +
|
|
64
|
+
`${esc(currency)} by severity. These are the live numbers, read from the server ` +
|
|
65
|
+
`just now, so a tuned rate shows up here immediately.</p>` +
|
|
66
|
+
'<table><thead><tr><th>Severity</th>' +
|
|
67
|
+
`<th>${esc(currency.charAt(0).toUpperCase() + currency.slice(1))}</th>` +
|
|
68
|
+
'<th>What counts</th></tr></thead><tbody>' +
|
|
69
|
+
rows.map((r) => {
|
|
70
|
+
// `overridden` means this instance tuned the tier off its default.
|
|
71
|
+
const tuned = r.overridden ? ' <em>(tuned)</em>' : '';
|
|
72
|
+
return `<tr><td><strong>${esc(r.severity || '')}</strong></td>` +
|
|
73
|
+
`<td>${esc(String(r.drachmae ?? ''))}${tuned}</td>` +
|
|
74
|
+
`<td>${esc(r.blurb || '')}</td></tr>`;
|
|
75
|
+
}).join('') +
|
|
76
|
+
'</tbody></table>';
|
|
77
|
+
article.appendChild(section);
|
|
78
|
+
return { level: 2, id: BOUNTY_SECTION_ID, text: BOUNTY_SECTION_TITLE };
|
|
79
|
+
}
|
|
80
|
+
|
|
31
81
|
function renderToc(headings) {
|
|
32
82
|
const list = $('#primer-toc-list');
|
|
33
83
|
if (!list) return [];
|
|
@@ -122,7 +172,10 @@
|
|
|
122
172
|
const { html, headings } = window.OTBMdReader.parseMarkdown(md, resolveLinkHref);
|
|
123
173
|
article.innerHTML = html;
|
|
124
174
|
article.removeAttribute('aria-busy');
|
|
125
|
-
|
|
175
|
+
// Awaited before the TOC is built so the rate card gets a TOC entry and a
|
|
176
|
+
// scrollspy target; the article itself is already on screen by now.
|
|
177
|
+
const bountyHeading = await appendBountySection(article);
|
|
178
|
+
const tocSections = renderToc(bountyHeading ? [...headings, bountyHeading] : headings);
|
|
126
179
|
setupTocToggle();
|
|
127
180
|
setupScrollspy(tocSections);
|
|
128
181
|
setupProgressBar(article);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* gate.css — Page-local styles for the Gate page (Archon-only).
|
|
2
|
+
Lifted verbatim out of the page's inline <style> block (task 1002176);
|
|
3
|
+
the ?v= cache-bust is stamped automatically from this file's content hash
|
|
4
|
+
at boot (src/asset-version.js). */
|
|
5
|
+
|
|
6
|
+
/* Page-local styles for the Gate — approvals for held pull requests. Built
|
|
7
|
+
on the shared design tokens (style.css): each held PR is a card with a
|
|
8
|
+
verdict-colored top band and per-file reasons for the hold. */
|
|
9
|
+
.gate-summary {
|
|
10
|
+
display: grid;
|
|
11
|
+
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
|
12
|
+
gap: 14px;
|
|
13
|
+
margin: 6px 0 22px;
|
|
14
|
+
}
|
|
15
|
+
.gate-stat {
|
|
16
|
+
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
|
17
|
+
background: var(--surface); padding: 12px 14px;
|
|
18
|
+
}
|
|
19
|
+
.gate-stat__label {
|
|
20
|
+
font-size: 11.5px; font-weight: 600;
|
|
21
|
+
letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-soft);
|
|
22
|
+
}
|
|
23
|
+
.gate-stat__value {
|
|
24
|
+
font-size: 1.6rem; font-weight: 600; color: var(--ink);
|
|
25
|
+
font-variant-numeric: tabular-nums; margin-top: 2px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.gate-list { display: flex; flex-direction: column; gap: 16px; }
|
|
29
|
+
|
|
30
|
+
.gate-crate {
|
|
31
|
+
border: 1px solid var(--border); border-radius: var(--radius);
|
|
32
|
+
background: var(--surface); overflow: hidden;
|
|
33
|
+
}
|
|
34
|
+
/* Verdict band along the top, painted by the held-verdict. */
|
|
35
|
+
.gate-crate__seal { height: 4px; background-color: var(--danger); }
|
|
36
|
+
.gate-crate--needs_trust .gate-crate__seal { background-color: var(--warn); }
|
|
37
|
+
.gate-crate__body { padding: 14px 16px 16px; display: flex; flex-direction: column; gap: 10px; }
|
|
38
|
+
.gate-crate__head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
|
|
39
|
+
.gate-crate__title { font-weight: 600; color: var(--ink); font-size: 15px; }
|
|
40
|
+
.gate-crate__title a { color: inherit; text-decoration: none; }
|
|
41
|
+
.gate-crate__title a:hover { text-decoration: underline; }
|
|
42
|
+
.gate-crate__meta { color: var(--ink-soft); font-size: 12.5px; }
|
|
43
|
+
.gate-crate__meta a { color: var(--accent-text); }
|
|
44
|
+
|
|
45
|
+
.gate-pill {
|
|
46
|
+
font-size: 11px; font-weight: 600;
|
|
47
|
+
letter-spacing: 0.04em; text-transform: uppercase;
|
|
48
|
+
padding: 2px 8px; border-radius: 999px; white-space: nowrap;
|
|
49
|
+
border: 1px solid var(--border); color: var(--ink-soft); background: var(--surface-2);
|
|
50
|
+
}
|
|
51
|
+
.gate-pill--escalate { background: var(--danger-weak); border-color: color-mix(in srgb, var(--danger) 30%, transparent); color: var(--danger); }
|
|
52
|
+
.gate-pill--needs_trust { background: var(--warn-weak); border-color: color-mix(in srgb, var(--warn) 30%, transparent); color: var(--warn); }
|
|
53
|
+
.gate-pill--trusted { background: var(--info-weak); border-color: color-mix(in srgb, var(--info) 30%, transparent); color: var(--info); }
|
|
54
|
+
|
|
55
|
+
.gate-reasons { list-style: none; padding: 0; margin: 0; }
|
|
56
|
+
.gate-reasons li {
|
|
57
|
+
padding: 6px 0; border-bottom: 1px solid var(--border);
|
|
58
|
+
font-size: 13px; color: var(--ink);
|
|
59
|
+
}
|
|
60
|
+
.gate-reasons li:last-child { border-bottom: 0; }
|
|
61
|
+
.gate-reasons code {
|
|
62
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px;
|
|
63
|
+
color: var(--accent-text); background: var(--surface-2);
|
|
64
|
+
padding: 1px 5px; border-radius: 4px;
|
|
65
|
+
}
|
|
66
|
+
.gate-reasons .floor { color: var(--danger); font-weight: 600; }
|
|
67
|
+
|
|
68
|
+
.gate-files { font-size: 12.5px; color: var(--ink-soft); }
|
|
69
|
+
.gate-files code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
|
|
70
|
+
|
|
71
|
+
.gate-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-top: 2px; }
|
|
72
|
+
.gate-btn {
|
|
73
|
+
font: inherit; font-size: 13px; font-weight: 600;
|
|
74
|
+
padding: 7px 16px; border: 1px solid var(--accent);
|
|
75
|
+
background: var(--accent); color: #fff;
|
|
76
|
+
border-radius: var(--radius-sm); cursor: pointer;
|
|
77
|
+
}
|
|
78
|
+
.gate-btn:hover:not(:disabled) { background: var(--accent-deep); border-color: var(--accent-deep); }
|
|
79
|
+
.gate-btn:disabled { opacity: 0.45; cursor: default; }
|
|
80
|
+
.gate-btn--ghost { background: var(--surface); color: var(--ink); border-color: var(--border-strong); }
|
|
81
|
+
.gate-btn--ghost:hover:not(:disabled) { background: var(--surface-2); border-color: var(--border-strong); }
|
|
82
|
+
.gate-approved-note { color: var(--ok); font-size: 13px; }
|
|
83
|
+
|
|
84
|
+
.gate-empty, .gate-sealed { color: var(--ink-soft); padding: 16px 0; }
|
|
85
|
+
.gate-checking { color: var(--ink-faint); font-size: 12.5px; margin-top: 10px; }
|
|
86
|
+
|
|
87
|
+
/* Lightweight confirm modal (mirrors harbor). */
|
|
88
|
+
.gate-modal-bg {
|
|
89
|
+
position: fixed; inset: 0; background: color-mix(in srgb, var(--ink) 40%, transparent);
|
|
90
|
+
display: flex; align-items: center; justify-content: center; z-index: 50; padding: 20px;
|
|
91
|
+
}
|
|
92
|
+
.gate-modal {
|
|
93
|
+
background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius);
|
|
94
|
+
max-width: 480px; width: 100%; padding: 20px 22px; box-shadow: var(--shadow-pop);
|
|
95
|
+
}
|
|
96
|
+
.gate-modal h2 { color: var(--ink); margin: 0 0 8px; font-size: 17px; font-weight: 600; }
|
|
97
|
+
.gate-modal p { color: var(--ink); font-size: 13.5px; margin: 0 0 12px; }
|
|
98
|
+
.gate-modal__actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 18px; }
|
|
@@ -10,101 +10,7 @@
|
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
11
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
12
12
|
<link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
|
|
13
|
-
<
|
|
14
|
-
/* Page-local styles for the Gate — approvals for held pull requests. Built
|
|
15
|
-
on the shared design tokens (style.css): each held PR is a card with a
|
|
16
|
-
verdict-colored top band and per-file reasons for the hold. */
|
|
17
|
-
.gate-summary {
|
|
18
|
-
display: grid;
|
|
19
|
-
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
|
20
|
-
gap: 14px;
|
|
21
|
-
margin: 6px 0 22px;
|
|
22
|
-
}
|
|
23
|
-
.gate-stat {
|
|
24
|
-
border: 1px solid var(--border); border-radius: var(--radius-sm);
|
|
25
|
-
background: var(--surface); padding: 12px 14px;
|
|
26
|
-
}
|
|
27
|
-
.gate-stat__label {
|
|
28
|
-
font-size: 11.5px; font-weight: 600;
|
|
29
|
-
letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-soft);
|
|
30
|
-
}
|
|
31
|
-
.gate-stat__value {
|
|
32
|
-
font-size: 1.6rem; font-weight: 600; color: var(--ink);
|
|
33
|
-
font-variant-numeric: tabular-nums; margin-top: 2px;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.gate-list { display: flex; flex-direction: column; gap: 16px; }
|
|
37
|
-
|
|
38
|
-
.gate-crate {
|
|
39
|
-
border: 1px solid var(--border); border-radius: var(--radius);
|
|
40
|
-
background: var(--surface); overflow: hidden;
|
|
41
|
-
}
|
|
42
|
-
/* Verdict band along the top, painted by the held-verdict. */
|
|
43
|
-
.gate-crate__seal { height: 4px; background-color: var(--danger); }
|
|
44
|
-
.gate-crate--needs_trust .gate-crate__seal { background-color: var(--warn); }
|
|
45
|
-
.gate-crate__body { padding: 14px 16px 16px; display: flex; flex-direction: column; gap: 10px; }
|
|
46
|
-
.gate-crate__head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
|
|
47
|
-
.gate-crate__title { font-weight: 600; color: var(--ink); font-size: 15px; }
|
|
48
|
-
.gate-crate__title a { color: inherit; text-decoration: none; }
|
|
49
|
-
.gate-crate__title a:hover { text-decoration: underline; }
|
|
50
|
-
.gate-crate__meta { color: var(--ink-soft); font-size: 12.5px; }
|
|
51
|
-
.gate-crate__meta a { color: var(--accent-text); }
|
|
52
|
-
|
|
53
|
-
.gate-pill {
|
|
54
|
-
font-size: 11px; font-weight: 600;
|
|
55
|
-
letter-spacing: 0.04em; text-transform: uppercase;
|
|
56
|
-
padding: 2px 8px; border-radius: 999px; white-space: nowrap;
|
|
57
|
-
border: 1px solid var(--border); color: var(--ink-soft); background: var(--surface-2);
|
|
58
|
-
}
|
|
59
|
-
.gate-pill--escalate { background: var(--danger-weak); border-color: color-mix(in srgb, var(--danger) 30%, transparent); color: var(--danger); }
|
|
60
|
-
.gate-pill--needs_trust { background: var(--warn-weak); border-color: color-mix(in srgb, var(--warn) 30%, transparent); color: var(--warn); }
|
|
61
|
-
.gate-pill--trusted { background: var(--info-weak); border-color: color-mix(in srgb, var(--info) 30%, transparent); color: var(--info); }
|
|
62
|
-
|
|
63
|
-
.gate-reasons { list-style: none; padding: 0; margin: 0; }
|
|
64
|
-
.gate-reasons li {
|
|
65
|
-
padding: 6px 0; border-bottom: 1px solid var(--border);
|
|
66
|
-
font-size: 13px; color: var(--ink);
|
|
67
|
-
}
|
|
68
|
-
.gate-reasons li:last-child { border-bottom: 0; }
|
|
69
|
-
.gate-reasons code {
|
|
70
|
-
font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px;
|
|
71
|
-
color: var(--accent-text); background: var(--surface-2);
|
|
72
|
-
padding: 1px 5px; border-radius: 4px;
|
|
73
|
-
}
|
|
74
|
-
.gate-reasons .floor { color: var(--danger); font-weight: 600; }
|
|
75
|
-
|
|
76
|
-
.gate-files { font-size: 12.5px; color: var(--ink-soft); }
|
|
77
|
-
.gate-files code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
|
|
78
|
-
|
|
79
|
-
.gate-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; margin-top: 2px; }
|
|
80
|
-
.gate-btn {
|
|
81
|
-
font: inherit; font-size: 13px; font-weight: 600;
|
|
82
|
-
padding: 7px 16px; border: 1px solid var(--accent);
|
|
83
|
-
background: var(--accent); color: #fff;
|
|
84
|
-
border-radius: var(--radius-sm); cursor: pointer;
|
|
85
|
-
}
|
|
86
|
-
.gate-btn:hover:not(:disabled) { background: var(--accent-deep); border-color: var(--accent-deep); }
|
|
87
|
-
.gate-btn:disabled { opacity: 0.45; cursor: default; }
|
|
88
|
-
.gate-btn--ghost { background: var(--surface); color: var(--ink); border-color: var(--border-strong); }
|
|
89
|
-
.gate-btn--ghost:hover:not(:disabled) { background: var(--surface-2); border-color: var(--border-strong); }
|
|
90
|
-
.gate-approved-note { color: var(--ok); font-size: 13px; }
|
|
91
|
-
|
|
92
|
-
.gate-empty, .gate-sealed { color: var(--ink-soft); padding: 16px 0; }
|
|
93
|
-
.gate-checking { color: var(--ink-faint); font-size: 12.5px; margin-top: 10px; }
|
|
94
|
-
|
|
95
|
-
/* Lightweight confirm modal (mirrors harbor). */
|
|
96
|
-
.gate-modal-bg {
|
|
97
|
-
position: fixed; inset: 0; background: color-mix(in srgb, var(--ink) 40%, transparent);
|
|
98
|
-
display: flex; align-items: center; justify-content: center; z-index: 50; padding: 20px;
|
|
99
|
-
}
|
|
100
|
-
.gate-modal {
|
|
101
|
-
background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius);
|
|
102
|
-
max-width: 480px; width: 100%; padding: 20px 22px; box-shadow: var(--shadow-pop);
|
|
103
|
-
}
|
|
104
|
-
.gate-modal h2 { color: var(--ink); margin: 0 0 8px; font-size: 17px; font-weight: 600; }
|
|
105
|
-
.gate-modal p { color: var(--ink); font-size: 13.5px; margin: 0 0 12px; }
|
|
106
|
-
.gate-modal__actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 18px; }
|
|
107
|
-
</style>
|
|
13
|
+
<link rel="stylesheet" href="/builders/gate.css">
|
|
108
14
|
</head>
|
|
109
15
|
<body data-page="gate" data-page-title="Gate">
|
|
110
16
|
|
|
@@ -137,6 +43,8 @@
|
|
|
137
43
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
138
44
|
|
|
139
45
|
<script src="/builders/shell.js?v=2026-07-02-shell1"></script>
|
|
46
|
+
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
47
|
+
<script src="/builders/palette.js" defer></script>
|
|
140
48
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
141
49
|
<script src="/builders/gate.js?v=2026-07-03-gate-shell"></script>
|
|
142
50
|
</body>
|
|
@@ -225,8 +225,11 @@
|
|
|
225
225
|
|
|
226
226
|
// order 20 → the top of the Home main zone: personal + actionable beats
|
|
227
227
|
// informational. hiddenByDefault so a quiet inbox costs nothing.
|
|
228
|
+
// core: true (task 2177) — this is the hall's own Needs-attention inbox, the
|
|
229
|
+
// designated landing place for anything awaiting the builder, so it is exempt
|
|
230
|
+
// from the summary/collapsed rule that keeps OTHER cards off home-main.
|
|
228
231
|
window.OTB.contributeHallWidget({
|
|
229
|
-
id: 'attention-scroll', label: 'Needs your attention', order: 20, mount,
|
|
232
|
+
id: 'attention-scroll', label: 'Needs your attention', order: 20, mount, core: true,
|
|
230
233
|
labelledby: 'attention-h', view: 'home', zone: 'home-main', hiddenByDefault: true,
|
|
231
234
|
});
|
|
232
235
|
})();
|