@bongos/core 1.17.1 → 1.17.3

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.
Files changed (233) hide show
  1. package/.bongos-core.json +521 -281
  2. package/.claude/skills/blocker-review/SKILL.md +1 -1
  3. package/.claude/skills/builder-claim/SKILL.md +2 -0
  4. package/.claude/skills/builder-exit/SKILL.md +2 -2
  5. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  6. package/.claude/skills/builder-setup/SKILL.md +2 -2
  7. package/.claude/skills/builder-start/SKILL.md +1 -1
  8. package/.claude/skills/dev/SKILL.md +1 -1
  9. package/.claude/skills/idea-triage/SKILL.md +2 -2
  10. package/.claude/skills/ideate/SKILL.md +1 -1
  11. package/.claude/skills/merge-mode/SKILL.md +1 -1
  12. package/.claude/skills/new-project/SKILL.md +3 -0
  13. package/.claude/skills/paint/SKILL.md +1 -1
  14. package/GOVERNANCE.md +1 -1
  15. package/README.md +1 -1
  16. package/clients/bongos-client/README.md +1 -1
  17. package/clients/bongos-client/bongos-client.global.js +2 -0
  18. package/clients/bongos-client/index.cjs +2 -0
  19. package/clients/bongos-client/index.d.ts +4 -2
  20. package/clients/bongos-client/index.mjs +2 -0
  21. package/docs/adr/0001-stack-choice-single-vps.md +1 -1
  22. package/docs/adr/0008-google-chat-oauth-user-auth.md +1 -1
  23. package/docs/adr/0019-red-team-bounty-payout-table.md +3 -3
  24. package/docs/adr/0020-security-model-public-stub.md +1 -1
  25. package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +1 -1
  26. package/docs/adr/0024-cloneable-repo-local-first-memory.md +1 -1
  27. package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +4 -4
  28. package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +3 -3
  29. package/docs/adr/0030-builders-hall-live-updates.md +1 -1
  30. package/docs/adr/0031-cloud-dev-environments-for-builders.md +4 -4
  31. package/docs/adr/0032-discord-mirror-of-gds.md +2 -2
  32. package/docs/adr/0034-thetes-graduated-newcomer-rank.md +1 -1
  33. package/docs/adr/0044-mediterranean-palette-replacement.md +1 -1
  34. package/docs/adr/0044-per-box-live-game-preview.md +1 -1
  35. package/docs/adr/0054-session-token-reward-cost-plus.md +10 -10
  36. package/docs/adr/0057-container-cost-ledger.md +3 -3
  37. package/docs/adr/0062-medusa-instance-model-decoupling.md +4 -4
  38. package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +2 -2
  39. package/docs/adr/0085-remove-default-per-builder-spend-cap.md +1 -1
  40. package/docs/adr/0086-goal-scoped-work-hierarchy.md +1 -1
  41. package/docs/adr/0096-require-reward-before-workable.md +9 -9
  42. package/docs/adr/0097-retroactive-reward-backfill.md +3 -3
  43. package/docs/adr/0100-two-repo-instance-model.md +1 -1
  44. package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +3 -3
  45. package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +3 -3
  46. package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +1 -1
  47. package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +6 -6
  48. package/docs/adr/0136-update-channel-subscription-policy.md +51 -0
  49. package/docs/adr/0137-upstream-publish-policy-manual-owner-gated.md +40 -0
  50. package/docs/adr/0138-bundled-module-deps-declared-per-module.md +45 -0
  51. package/docs/adr/README.md +9 -6
  52. package/docs/api/openapi.json +65 -26
  53. package/docs/api-reference.md +3 -2
  54. package/docs/architecture.md +2 -2
  55. package/docs/branding-contract.md +5 -4
  56. package/docs/canonical-permissions.md +1 -1
  57. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  58. package/docs/file-map.md +18 -17
  59. package/docs/handoff-template.md +2 -2
  60. package/docs/modules-contract.md +6 -1
  61. package/docs/onboarding/diagrams/README.md +7 -7
  62. package/docs/onboarding/drachmae-and-karma.md +18 -18
  63. package/docs/onboarding/primer.md +9 -9
  64. package/docs/recipes/audit-replay.md +2 -2
  65. package/docs/recipes/builder-box-lifecycle.md +2 -2
  66. package/docs/recipes/claude-design-loop.md +1 -1
  67. package/docs/recipes/ops-gotchas.md +1 -1
  68. package/docs/recipes/private-npm-distribution.md +17 -0
  69. package/docs/recipes/staging-environment.md +1 -1
  70. package/docs/recipes/upgrading-the-core.md +55 -0
  71. package/docs/research/cursor-competitive-analysis.md +1 -1
  72. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +1 -1
  73. package/modules/discord/module.json +2 -1
  74. package/modules/economy/achievements.js +9 -1
  75. package/modules/economy/credits.js +10 -1
  76. package/modules/hall-ui/public/builders.js +137 -620
  77. package/modules/hall-ui/public/goal-inbox.js +232 -0
  78. package/modules/hall-ui/public/goals-page.js +4 -1
  79. package/modules/hall-ui/public/goals.html +8 -0
  80. package/modules/hall-ui/public/hall-kit.js +474 -0
  81. package/modules/hall-ui/public/hall-widgets.js +14 -5
  82. package/modules/hall-ui/public/index.html +3 -0
  83. package/modules/hall-ui/public/instances-panel.js +24 -3
  84. package/modules/hall-ui/public/new-project-wizard.js +7 -5
  85. package/modules/hall-ui/public/style.css +168 -0
  86. package/modules/hall-ui/public/work.css +194 -0
  87. package/modules/hall-ui/public/work.html +46 -374
  88. package/modules/hall-ui/public/work.js +137 -102
  89. package/modules/lifecycle/criterion-suggest.js +80 -0
  90. package/modules/lifecycle/db.js +42 -5
  91. package/modules/lifecycle/routes/goals.js +26 -0
  92. package/modules/lifecycle/routes/tasks.js +21 -0
  93. package/modules/provisioning/CLAUDE.md +15 -0
  94. package/modules/provisioning/migrations/provisioning_001_tables.sql +160 -0
  95. package/modules/provisioning/migrations/provisioning_002_standalone_shape.sql +11 -0
  96. package/modules/provisioning/migrations/provisioning_003_github_app_manifest.sql +95 -0
  97. package/modules/provisioning/module.json +17 -0
  98. package/modules/provisioning/onboard-plan.js +37 -0
  99. package/modules/provisioning/provisioning.js +539 -0
  100. package/modules/provisioning/rate-limit.js +35 -0
  101. package/modules/provisioning/routes/provisioning.js +607 -0
  102. package/modules/provisioning/tests/provisioning.mjs +232 -0
  103. package/modules/provisioning/ui/.gitkeep +0 -0
  104. package/modules/security/secret-scrub.js +10 -0
  105. package/package-lock.json +2 -2
  106. package/package.json +7 -2
  107. package/scripts/discord/README.md +1 -1
  108. package/scripts/gds/claim.js +98 -48
  109. package/scripts/gds/claude-materialize.js +30 -9
  110. package/scripts/gds/cutover-codemod.js +241 -0
  111. package/scripts/gds/fitness.js +54 -0
  112. package/scripts/gds/init.js +59 -3
  113. package/scripts/gds/lint-infra-exec.js +70 -0
  114. package/scripts/gds/lint-workflow-exec.js +63 -0
  115. package/scripts/gds/mirror-lineage-check.js +14 -5
  116. package/scripts/gds/mirror-redact.js +8 -0
  117. package/scripts/gds/onboard.js +4 -0
  118. package/scripts/gds/package-core.js +18 -3
  119. package/scripts/gds/publish-manifest.js +60 -2
  120. package/scripts/gds/run-routine.js +51 -13
  121. package/scripts/gds/run-unit-tests.js +4 -0
  122. package/scripts/gds/update-channel.js +186 -0
  123. package/scripts/gds/upgrade.js +116 -9
  124. package/scripts/hall-preview/README.md +103 -0
  125. package/scripts/hall-preview/fixtures/access-requests.json +1 -0
  126. package/scripts/hall-preview/fixtures/achievements.json +76 -0
  127. package/scripts/hall-preview/fixtures/analytics__builder.json +251 -0
  128. package/scripts/hall-preview/fixtures/audit-log.json +1 -0
  129. package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +1 -0
  130. package/scripts/hall-preview/fixtures/builders__active-claims.json +1 -0
  131. package/scripts/hall-preview/fixtures/builders__directory.json +81 -0
  132. package/scripts/hall-preview/fixtures/builders__roster.json +1 -0
  133. package/scripts/hall-preview/fixtures/goals.json +502 -0
  134. package/scripts/hall-preview/fixtures/goals__25.json +96 -0
  135. package/scripts/hall-preview/fixtures/goals__26.json +67 -0
  136. package/scripts/hall-preview/fixtures/goals__3.json +103 -0
  137. package/scripts/hall-preview/fixtures/goals__35.json +49 -0
  138. package/scripts/hall-preview/fixtures/goals__conflicts.json +154 -0
  139. package/scripts/hall-preview/fixtures/goals__detail.json +96 -0
  140. package/scripts/hall-preview/fixtures/goals__inbox.json +5 -0
  141. package/scripts/hall-preview/fixtures/goals__requests.json +3 -0
  142. package/scripts/hall-preview/fixtures/grades__by-builder.json +1 -0
  143. package/scripts/hall-preview/fixtures/inbox.json +330 -0
  144. package/scripts/hall-preview/fixtures/instance.json +124 -0
  145. package/scripts/hall-preview/fixtures/leaderboard.json +184 -0
  146. package/scripts/hall-preview/fixtures/me.json +476 -0
  147. package/scripts/hall-preview/fixtures/me__recent-ships.json +304 -0
  148. package/scripts/hall-preview/fixtures/override-requests.json +1 -0
  149. package/scripts/hall-preview/fixtures/provisioning__fleet.json +1 -0
  150. package/scripts/hall-preview/fixtures/provisioning__fleet__cost-ledger.json +1 -0
  151. package/scripts/hall-preview/fixtures/provisioning__instances.json +1 -0
  152. package/scripts/hall-preview/fixtures/public__analytics__ecosystem.json +516 -0
  153. package/scripts/hall-preview/fixtures/public__bounty-table.json +37 -0
  154. package/scripts/hall-preview/fixtures/public__cost-summary.json +742 -0
  155. package/scripts/hall-preview/fixtures/public__estimation-drift.json +41 -0
  156. package/scripts/hall-preview/fixtures/public__grades.json +50 -0
  157. package/scripts/hall-preview/fixtures/public__progress.json +124 -0
  158. package/scripts/hall-preview/fixtures/public__recent-shipped.json +426 -0
  159. package/scripts/hall-preview/fixtures/public__repo-health.json +160 -0
  160. package/scripts/hall-preview/fixtures/public__repo-info.json +5 -0
  161. package/scripts/hall-preview/fixtures/security__docs.json +1 -0
  162. package/scripts/hall-preview/fixtures/security__reports.json +1 -0
  163. package/scripts/hall-preview/fixtures/sessions__search.json +1 -0
  164. package/scripts/hall-preview/fixtures/tasks.json +2420 -0
  165. package/scripts/hall-preview/fixtures/tasks__claimable.json +2555 -0
  166. package/scripts/hall-preview/fixtures/tasks__detail.json +111 -0
  167. package/scripts/hall-preview/fixtures/tasks__peer-votes__feed.json +330 -0
  168. package/scripts/hall-preview/fixtures/versions.json +89 -0
  169. package/scripts/hall-preview/refresh-fixtures.js +77 -0
  170. package/scripts/hall-preview/server.js +178 -0
  171. package/scripts/migrate.sh +29 -4
  172. package/src/bongos/auth.js +14 -1
  173. package/src/bongos/optimizer.js +37 -2
  174. package/src/bongos/serve-internal.js +10 -1
  175. package/src/branding.js +1 -0
  176. package/src/module-api.js +12 -1
  177. package/src/module-loader/loader.js +36 -4
  178. package/src/module-loader/manifest-schema.js +16 -1
  179. package/tests/branding.mjs +11 -0
  180. package/tests/claim_error_surface.mjs +107 -0
  181. package/tests/claude_materialize.mjs +20 -0
  182. package/tests/consumer_layout_boot.mjs +302 -0
  183. package/tests/criterion_suggest.mjs +106 -0
  184. package/tests/cutover_codemod.mjs +184 -0
  185. package/tests/device_flow_start.mjs +25 -2
  186. package/tests/hook_core_resolve.mjs +125 -0
  187. package/tests/infra_exec_paths.mjs +104 -0
  188. package/tests/init.mjs +47 -0
  189. package/tests/migrate_root_resolution.mjs +97 -0
  190. package/tests/mirror_lineage_proof.mjs +14 -0
  191. package/tests/module_loader.mjs +42 -0
  192. package/tests/module_manifest.mjs +19 -0
  193. package/tests/onboard.mjs +13 -0
  194. package/tests/package_core.mjs +8 -0
  195. package/tests/provisioning_github_app_routes.mjs +15 -0
  196. package/tests/publish_manifest.mjs +52 -1
  197. package/tests/run_routine.mjs +26 -1
  198. package/tests/run_routine_two_root.mjs +77 -0
  199. package/tests/scrubber_corpus.mjs +17 -0
  200. package/tests/update_channel.mjs +186 -0
  201. package/tests/upgrade.mjs +131 -0
  202. package/tests/workflow_exec_paths.mjs +98 -0
  203. package/docs/design/container-exterior-tiles.md +0 -49
  204. package/docs/design/container-exterior.md +0 -81
  205. package/docs/design/container-interior.md +0 -77
  206. package/docs/design/world-map-scroll.md +0 -41
  207. package/docs/recipes/claude-gemini-bongos-doors.md +0 -155
  208. package/docs/recipes/cloudbongos-staging-gate.md +0 -139
  209. package/docs/recipes/cloudbongos-standup.md +0 -111
  210. package/docs/recipes/parallel-load-results-2026-05-30.md +0 -63
  211. package/docs/recipes/parallel-load-test.md +0 -32
  212. package/docs/recipes/pixel-art-pipeline.md +0 -411
  213. package/docs/recipes/staging-data.md +0 -50
  214. package/migrations/instance/018_pms_v3_planning_seed.sql +0 -131
  215. package/migrations/instance/080_gds_v4_planning_seed.sql +0 -75
  216. package/migrations/instance/110_medusa_planning_seed.sql +0 -70
  217. package/migrations/instance/120_bongos_v1_planning_seed.sql +0 -69
  218. package/migrations/instance/144_bongos_v1_module_system_criterion.sql +0 -26
  219. package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +0 -29
  220. package/migrations/instance/172_v2_world_planning_seed.sql +0 -163
  221. package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +0 -33
  222. package/migrations/instance/182_gdsv4_bongos_consolidation.sql +0 -132
  223. package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +0 -116
  224. package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +0 -69
  225. package/scripts/gds/art-stage.js +0 -152
  226. package/server.js +0 -212
  227. package/tests/art_key.mjs +0 -121
  228. package/tests/day_cycle.mjs +0 -197
  229. package/tests/snapshot_picker.mjs +0 -233
  230. package/tests/sprite_facing.mjs +0 -35
  231. package/tests/terrain_picker.mjs +0 -298
  232. package/tests/turn_in_place.mjs +0 -280
  233. package/tests/walkability.mjs +0 -188
@@ -105,6 +105,22 @@ html[data-theme="dark"] body { background: var(--bg); }
105
105
  html:not([data-theme]) body { background: var(--bg); }
106
106
  }
107
107
 
108
+ /* ---------- table of contents (task 2166) ----------
109
+ Section banners in file order — grep "----------" to jump:
110
+ tokens + dark theme (ABOVE — the theming contract; never move/rename)
111
+ base · app shell · responsive shell · cards (.scroll) · stat tiles
112
+ Standing layout (section rail) · legacy page chrome compat
113
+ ledger tables · filters / pager / buttons · profile / standing
114
+ rank badges + tooltip · karma / acclaim · achievements · dev curve
115
+ onboarding checklist · welcome panel + setup selector · landing
116
+ goals · work-board task cards · ranks page
117
+ security / roster / admin leftovers (dead — removed by task 2179)
118
+ toast + overlays · misc shared bits · widget one-offs (wizard, triage,
119
+ goal inbox) · hall-kit components (END — the shared kit, task 2166).
120
+ New page-SPECIFIC styles belong in that page's own <page>.css (the
121
+ primer.css precedent), not here; new SHARED components join the kit
122
+ section at the end. */
123
+
108
124
  /* ---------- base ---------- */
109
125
 
110
126
  * { box-sizing: border-box; }
@@ -1746,3 +1762,155 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
1746
1762
  .np-kv span { color: var(--ink-faint); font-size: 0.85rem; min-width: 12rem; }
1747
1763
  .np-kv code, .np-steps code { background: var(--surface-2); padding: 0.1rem 0.35rem; border-radius: 4px; word-break: break-all; }
1748
1764
  .np-done { margin-top: 0.5rem; }
1765
+
1766
+ /* ---- task 1471: idea-inbox triage cue (Home widget, Metic+) ---- */
1767
+ /* Shared .count-pill — work.html defines its own page-scoped copy; the hall
1768
+ index widget needs the same look, so it lives in the shared sheet now. */
1769
+ .count-pill {
1770
+ display: inline-flex; align-items: center; justify-content: center;
1771
+ min-width: 20px; height: 18px; padding: 0 6px; margin-left: 8px;
1772
+ border-radius: 999px; background: var(--surface-2); color: var(--ink-soft);
1773
+ font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums;
1774
+ vertical-align: 2px;
1775
+ }
1776
+ .triage-inbox { list-style: none; margin: 0; padding: 0; }
1777
+ .triage-inbox__item {
1778
+ display: flex; align-items: baseline; gap: 0.5rem;
1779
+ padding: 0.3rem 0; border-top: 1px solid var(--rule-soft);
1780
+ }
1781
+ .triage-inbox__item:first-child { border-top: 0; }
1782
+ .triage-inbox__link { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1783
+ .triage-inbox__kind {
1784
+ flex: 0 0 auto; font-size: 11px; color: var(--ink-faint);
1785
+ text-transform: uppercase; letter-spacing: 0.04em;
1786
+ }
1787
+ .triage-inbox__empty { color: var(--ink-faint); padding: 0.3rem 0; }
1788
+
1789
+ /* Goal inbox (task 1954, ADR 0112) — the home-page two-sided membership queue:
1790
+ invitations to accept + join-requests to approve. Matches the home widgets'
1791
+ card language (.scroll host); each row is body-left / actions-right. */
1792
+ .ginbox { list-style: none; margin: 0 0 4px; padding: 0; }
1793
+ .ginbox__sec-h {
1794
+ margin: 14px 0 6px; font-size: 12px; font-weight: 600;
1795
+ text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-faint);
1796
+ }
1797
+ .ginbox__item {
1798
+ display: flex; align-items: flex-start; gap: 12px;
1799
+ padding: 9px 0; border-top: 1px solid var(--rule-soft);
1800
+ }
1801
+ .ginbox__item:first-child { border-top: 0; }
1802
+ .ginbox__body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
1803
+ .ginbox__goal { font-weight: 600; font-size: 13.5px; }
1804
+ .ginbox__sub { font-size: 12.5px; color: var(--ink-soft); }
1805
+ .ginbox__note { margin: 3px 0 0; font-size: 12.5px; color: var(--ink-soft); font-style: italic; }
1806
+ .ginbox__actions { flex: 0 0 auto; display: flex; gap: 6px; }
1807
+ .ginbox__pending { font-size: 12.5px; margin: 10px 0 0; color: var(--ink-soft); }
1808
+
1809
+ /* ---------- hall-kit components (task 2166) ----------
1810
+ Styles for the shared kit (hall-kit.js / window.OTBKit): pager bar,
1811
+ filter-bar disclosure + chips, tab strip, empty state, skeleton shimmer,
1812
+ collapsible card. The kit reuses .ledger/.pager/.filters/.setup__tab/
1813
+ .rail-link defined above; only what is new lives here. The .pager--paged
1814
+ block is promoted VERBATIM from work.html's page-local <style> (task 1931)
1815
+ so every page can render the standard bar — work.html's identical copy
1816
+ retires with task 2170 (duplicate rules, no visual change meanwhile). */
1817
+
1818
+ .pager--paged { justify-content: space-between; flex-wrap: wrap; gap: 10px 16px; }
1819
+ .pager__nav { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
1820
+ .pager__perpage {
1821
+ display: inline-flex; align-items: center; gap: 6px;
1822
+ font-size: 12px; color: var(--ink-faint);
1823
+ }
1824
+ .pager__perpage select { height: 30px; padding: 2px 8px; font-size: 13px; }
1825
+ .pager__page {
1826
+ font-size: 12.5px; color: var(--ink-soft);
1827
+ font-variant-numeric: tabular-nums; min-width: 6.5em; text-align: center;
1828
+ }
1829
+ .pager__nav .pager__btn:disabled { opacity: 0.4; cursor: default; }
1830
+
1831
+ /* filter-bar disclosure ("Filters" button) + removable active-filter chips */
1832
+ .filters__more-count { margin-left: 6px; }
1833
+ .filters--overflow {
1834
+ padding: 10px 12px;
1835
+ border: 1px dashed var(--border-strong);
1836
+ border-radius: var(--radius-sm);
1837
+ background: var(--surface-2);
1838
+ margin-bottom: 14px;
1839
+ }
1840
+ .filter-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 12px; }
1841
+ .chip {
1842
+ display: inline-flex; align-items: center; gap: 6px;
1843
+ padding: 3px 10px;
1844
+ font-size: 12.5px;
1845
+ color: var(--accent-text);
1846
+ background: var(--accent-weak);
1847
+ border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--border));
1848
+ border-radius: 999px;
1849
+ cursor: pointer;
1850
+ }
1851
+ .chip:hover { background: color-mix(in srgb, var(--accent) 16%, var(--bg-card)); }
1852
+
1853
+ /* tab strip — the .setup__tab idiom in the .setup__toggle frame, promoted */
1854
+ .kit-tabs {
1855
+ display: inline-flex;
1856
+ max-width: 100%;
1857
+ overflow-x: auto;
1858
+ border: 1px solid var(--border-strong);
1859
+ border-radius: var(--radius-sm);
1860
+ margin: 0 0 14px;
1861
+ }
1862
+ .kit-tabs .setup__tab { white-space: nowrap; }
1863
+ .kit-tabs .setup__tab .count-pill { margin-left: 6px; }
1864
+
1865
+ /* empty state — one short line + at most one action link */
1866
+ .empty-state { padding: 6px 0; }
1867
+ .empty-state p { margin: 0; font-size: 13px; color: var(--ink-faint); }
1868
+ .empty-state__action { display: inline-block; margin-top: 6px; font-size: 13px; }
1869
+
1870
+ /* skeleton shimmer — standard-height placeholder rows while data loads, so
1871
+ cards don't jump; derives from the ink/bg tokens like everything else */
1872
+ .kit-skel {
1873
+ display: inline-block;
1874
+ width: 60%;
1875
+ min-width: 80px;
1876
+ height: 12px;
1877
+ border-radius: 6px;
1878
+ background: linear-gradient(90deg,
1879
+ color-mix(in srgb, var(--ink) 7%, var(--bg-card)) 25%,
1880
+ color-mix(in srgb, var(--ink) 13%, var(--bg-card)) 45%,
1881
+ color-mix(in srgb, var(--ink) 7%, var(--bg-card)) 65%);
1882
+ background-size: 200% 100%;
1883
+ animation: kit-skel-shimmer 1.2s ease-in-out infinite;
1884
+ }
1885
+ .kit-skel-row td { border-bottom: 1px solid var(--rule-soft); }
1886
+ @keyframes kit-skel-shimmer {
1887
+ from { background-position: 120% 0; }
1888
+ to { background-position: -80% 0; }
1889
+ }
1890
+ @media (prefers-reduced-motion: reduce) {
1891
+ .kit-skel { animation: none; }
1892
+ }
1893
+
1894
+ /* collapsible card body — the Work-backlog <details> idiom, generalized */
1895
+ .kit-collapse__summary {
1896
+ cursor: pointer;
1897
+ display: flex;
1898
+ align-items: baseline;
1899
+ gap: 8px;
1900
+ }
1901
+ .kit-collapse__summary .scroll__h { display: inline; margin: 0; }
1902
+ .kit-collapse__body { margin-top: 12px; }
1903
+
1904
+ /* ---- Home dashboard (task 2169) ---- */
1905
+ /* Stat tiles are links now — inherit ink, reveal affordance on hover. */
1906
+ a.stat-tile { color: inherit; }
1907
+ a.stat-tile:hover {
1908
+ text-decoration: none;
1909
+ border-color: color-mix(in srgb, var(--accent) 35%, var(--border));
1910
+ background: color-mix(in srgb, var(--accent) 3%, var(--surface));
1911
+ }
1912
+ /* Projects card header: title left, "Start a project" disclosure right. */
1913
+ .proj-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
1914
+ .proj-head .scroll__h { margin: 0; }
1915
+ /* The over-budget "More" row — one quiet line, not a card. */
1916
+ .home-more { margin: 0; font-size: 13px; color: var(--ink-soft); }
@@ -0,0 +1,194 @@
1
+ /* work.css — page-local styles for the Work Board (task 2170; extracted from
2
+ work.html's old inline <style> per the hall placement rules). Only what the
3
+ shared kit doesn't carry lives here: in-flight actions, claimable task
4
+ cards (dense 2-line layout), history list, bulk toolbar. Shared pieces —
5
+ .pager--paged, .count-pill, .kit-tabs, .filters overflow — are in
6
+ style.css. Everything derives from the shared design tokens so instance
7
+ packs reskin this page along with the rest of the hall. */
8
+
9
+ .kbd {
10
+ display: inline-block;
11
+ padding: 0 6px;
12
+ border: 1px solid var(--border-strong);
13
+ border-radius: 5px;
14
+ background: var(--surface-2);
15
+ font-size: 0.85em;
16
+ font-weight: 600;
17
+ color: var(--ink-soft);
18
+ }
19
+
20
+ .wip-builder { color: var(--ink); font-weight: 600; }
21
+ .wip-builder small { color: var(--ink-soft); font-weight: 400; }
22
+
23
+ /* Filtered-count line under the filter bar. */
24
+ .claim-count-line {
25
+ margin: 0 0 10px;
26
+ font-size: 12.5px;
27
+ color: var(--ink-faint);
28
+ }
29
+
30
+ /* ---- #616 / task 2170: claim/release actions + the dense task card ---- */
31
+
32
+ /* task 2170 (owner call 2026-07-10): denser 2-line cards. The card keeps its
33
+ grid but tightens padding and type, actions go horizontal, and the touches
34
+ path-dump becomes a "✎ N files" chip with the full list in the tooltip. */
35
+ .task { padding: 8px 12px; gap: 2px 12px; }
36
+ .task__title { font-size: 13px; line-height: 1.35; }
37
+ .task__meta { margin-top: 1px; row-gap: 2px; }
38
+
39
+ .task__actions {
40
+ display: flex;
41
+ align-items: center;
42
+ gap: 6px;
43
+ }
44
+ /* Claim is the primary action — filled accent so it reads above Copy. */
45
+ .task__claim {
46
+ background: var(--accent);
47
+ border: 1px solid var(--accent-deep);
48
+ color: #fff;
49
+ border-radius: var(--radius-sm);
50
+ font-size: 12.5px;
51
+ font-weight: 600;
52
+ padding: 5px 14px;
53
+ cursor: pointer;
54
+ white-space: nowrap;
55
+ transition: background 150ms, opacity 150ms;
56
+ }
57
+ .task__claim:hover { background: var(--accent-deep); }
58
+ .task__claim:disabled { opacity: 0.55; cursor: default; }
59
+
60
+ /* Files a claimable task is responsible for — a compact count chip in the
61
+ meta row; the full path list rides the tooltip (task 2170 density pass). */
62
+ .task__touches {
63
+ color: var(--ink-faint);
64
+ font-size: 12px;
65
+ white-space: nowrap;
66
+ cursor: help;
67
+ }
68
+
69
+ .task__tag--newcomer {
70
+ background: var(--ok-weak);
71
+ color: var(--ok);
72
+ border-color: color-mix(in srgb, var(--ok) 30%, transparent);
73
+ }
74
+ .task__tag--mine {
75
+ background: var(--accent-weak);
76
+ color: var(--accent-text);
77
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
78
+ }
79
+ /* task 1498 / ADR 0084: per-task rank floor. Outlined + emphasized (not a
80
+ filled tag) so a gated task reads as "authority required", distinct from
81
+ the filled newcomer tag. */
82
+ .task__tag--rank {
83
+ background: transparent;
84
+ color: var(--warn);
85
+ border-color: color-mix(in srgb, var(--warn) 45%, transparent);
86
+ font-weight: 600;
87
+ letter-spacing: 0.02em;
88
+ }
89
+ /* task 1752: the open (no floor) state — muted/neutral so "Any rank" reads as
90
+ "open to all", not as a warning like the gated --rank tag above. */
91
+ .task__tag--rank-open {
92
+ background: transparent;
93
+ color: var(--ink-faint);
94
+ border-color: var(--border);
95
+ }
96
+ /* task 1753: the whole card is clickable → toggles selection (task 1869). */
97
+ .task { cursor: pointer; }
98
+ .backlog-count { font-size: 13px; color: var(--ink-faint); margin-left: 8px; }
99
+ #backlog-list .history__row { cursor: pointer; }
100
+
101
+ /* In-flight table: release action on the viewer's own claims. */
102
+ .wip__action { text-align: right; white-space: nowrap; }
103
+ .wip__release {
104
+ background: var(--surface);
105
+ border: 1px solid var(--border-strong);
106
+ color: var(--ink-soft);
107
+ border-radius: var(--radius-sm);
108
+ font-size: 12px;
109
+ font-weight: 600;
110
+ padding: 4px 11px;
111
+ cursor: pointer;
112
+ transition: background 150ms, color 150ms, border-color 150ms;
113
+ }
114
+ .wip__release:hover:not(:disabled) {
115
+ background: var(--danger-weak);
116
+ color: var(--danger);
117
+ border-color: color-mix(in srgb, var(--danger) 40%, transparent);
118
+ }
119
+ .wip__release:disabled { opacity: 0.55; cursor: default; }
120
+ .wip__mine-none { color: var(--ink-faint); }
121
+ .wip__row--mine { background: var(--accent-weak); }
122
+
123
+ /* Recently-shipped history. */
124
+ .history { display: flex; flex-direction: column; gap: 2px; margin-top: 6px; }
125
+ .history__row {
126
+ display: flex; align-items: baseline; gap: 12px;
127
+ padding: 6px 4px;
128
+ border-bottom: 1px solid var(--rule-soft);
129
+ }
130
+ .history__row:last-child { border-bottom: none; }
131
+ .history__id {
132
+ font-weight: 600; color: var(--ink-soft);
133
+ font-variant-numeric: tabular-nums; min-width: 3.2em;
134
+ }
135
+ .history__title { flex: 1 1 auto; color: var(--ink); min-width: 0; }
136
+ .history__when { color: var(--ink-faint); font-size: 12.5px; white-space: nowrap; }
137
+
138
+ @media (max-width: 640px) {
139
+ .task__actions { grid-column: 2; justify-self: start; }
140
+ }
141
+
142
+ /* ---- task 1759: multi-select + the bottom bulk-action toolbar ---- */
143
+
144
+ .wip__select-cell { width: 1%; text-align: center; }
145
+ .wip__select { width: 15px; height: 15px; cursor: pointer; accent-color: var(--accent); }
146
+
147
+ .bulk-toolbar {
148
+ position: fixed;
149
+ left: 50%;
150
+ bottom: 20px;
151
+ transform: translateX(-50%);
152
+ z-index: 120;
153
+ display: flex;
154
+ align-items: center;
155
+ gap: 14px;
156
+ flex-wrap: wrap;
157
+ background: var(--ink);
158
+ color: var(--bg-card);
159
+ padding: 10px 16px;
160
+ border-radius: var(--radius);
161
+ box-shadow: var(--shadow-pop);
162
+ max-width: min(92vw, 720px);
163
+ }
164
+ .bulk-toolbar[hidden] { display: none; }
165
+ .bulk-toolbar__count { font-size: 13px; font-weight: 600; white-space: nowrap; }
166
+ .bulk-toolbar__actions { display: flex; gap: 8px; flex-wrap: wrap; }
167
+ .bulk-toolbar__btn {
168
+ background: rgba(255, 255, 255, 0.12);
169
+ border: 1px solid rgba(255, 255, 255, 0.25);
170
+ color: var(--bg-card);
171
+ border-radius: var(--radius-sm);
172
+ font-size: 12.5px;
173
+ font-weight: 600;
174
+ padding: 6px 12px;
175
+ cursor: pointer;
176
+ white-space: nowrap;
177
+ transition: background 150ms, opacity 150ms;
178
+ }
179
+ .bulk-toolbar__btn:hover:not(:disabled) { background: rgba(255, 255, 255, 0.22); }
180
+ .bulk-toolbar__btn:disabled { opacity: 0.4; cursor: not-allowed; }
181
+ .bulk-toolbar__clear {
182
+ background: transparent;
183
+ border: none;
184
+ color: var(--bg-card);
185
+ opacity: 0.75;
186
+ font-size: 12.5px;
187
+ cursor: pointer;
188
+ padding: 4px 6px;
189
+ }
190
+ .bulk-toolbar__clear:hover { opacity: 1; }
191
+
192
+ @media (max-width: 640px) {
193
+ .bulk-toolbar { left: 12px; right: 12px; bottom: 12px; transform: none; max-width: none; }
194
+ }