@bongos/core 1.19.850 → 1.19.852

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 CHANGED
@@ -2,22 +2,22 @@
2
2
  "artifact": "bongos-core",
3
3
  "manifest_schema": 1,
4
4
  "generator": "scripts/gds/package-core.js",
5
- "core_version": "1.19.850",
6
- "core_contract": "1.19.850",
7
- "source_commit": "232e375d3248cfc923d287f61d29cb6c5f59c5d9",
5
+ "core_version": "1.19.852",
6
+ "core_contract": "1.19.852",
7
+ "source_commit": "bf625696dfb7d52ffce6a01a498a5f9bb7fdfa75",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-09-17T20:32:54.381Z",
9
+ "built_at": "2026-09-17T21:07:34.757Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
- "docs_redacted": 496,
12
+ "docs_redacted": 497,
13
13
  "agent_docs_stubbed": 26,
14
- "functional_verbatim": 2276,
14
+ "functional_verbatim": 2278,
15
15
  "rules": 3,
16
16
  "gate_literals": 3,
17
17
  "gate": "passed"
18
18
  },
19
- "file_count": 2798,
20
- "tree_sha256": "12391d158894c3d0cb4e4073c3939f9c3e83705fa0406663fe5a30859fba4af4",
19
+ "file_count": 2801,
20
+ "tree_sha256": "d02b8c530b080946a1eeca76fc4a81f1cee5c8d893f9f41639fb880495862380",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/ask-for-help/SKILL.md",
@@ -302,7 +302,7 @@
302
302
  {
303
303
  "path": ".gitattributes",
304
304
  "mode": "0000644",
305
- "sha256": "2d993829478b5f8931e5a8248818b70279055d1af643e51f07de6161eab593aa"
305
+ "sha256": "dace360d1e995ce2a7401a275a7ed68f6ebb877da948f7cf5ff710a9ce8c8bfc"
306
306
  },
307
307
  {
308
308
  "path": "CLAUDE.md",
@@ -1097,7 +1097,7 @@
1097
1097
  {
1098
1098
  "path": "docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md",
1099
1099
  "mode": "0000644",
1100
- "sha256": "7ba60c2b7af2225c300c0a53b47da48e9417a57383bbf9525576846ea40561a2"
1100
+ "sha256": "6bfb8f4bd56438f39f9e57892653f6680bd54a4d4661d91a10018eef9e286db0"
1101
1101
  },
1102
1102
  {
1103
1103
  "path": "docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md",
@@ -2014,10 +2014,15 @@
2014
2014
  "mode": "0000644",
2015
2015
  "sha256": "104b5675fe52c1725dbbc78ab6fde9fd676b4020bf0e3f05411733c95d4342e0"
2016
2016
  },
2017
+ {
2018
+ "path": "docs/adr/0305-a-recipe-lives-with-what-it-documents.md",
2019
+ "mode": "0000644",
2020
+ "sha256": "4571564a9bf5ccb08996bd1fae58b69945c6cccbc9ce3b58c634acc087cb7698"
2021
+ },
2017
2022
  {
2018
2023
  "path": "docs/adr/README.md",
2019
2024
  "mode": "0000644",
2020
- "sha256": "61dd72c5f0d4157062fb93585252448e5493afd25cb014fb747bf0e20037a2ab"
2025
+ "sha256": "00361bb3425bda49646f676baac8ef458bb3c5c32f128767c269e96985d41ccf"
2021
2026
  },
2022
2027
  {
2023
2028
  "path": "docs/api-reference.md",
@@ -2052,12 +2057,12 @@
2052
2057
  {
2053
2058
  "path": "docs/copy-inventory.md",
2054
2059
  "mode": "0000644",
2055
- "sha256": "e457040f6938ad12012fb8ceb1b59de65d43f2fca74849181f1e448979a4c811"
2060
+ "sha256": "4f6e17550f44d1974e98338d2ab1bd59bce9681c741ebbcdad7c35d5105d1c10"
2056
2061
  },
2057
2062
  {
2058
2063
  "path": "docs/copy-registry.json",
2059
2064
  "mode": "0000644",
2060
- "sha256": "77a0c2bb223c37af27b3dac3ca8864bad9b1bcb0bc6c326c96f40cec6f9ba95d"
2065
+ "sha256": "cdfb4dc21b70a0b6ddba18951431a44e103e95be84ebb07e6fcba3ad2030379a"
2061
2066
  },
2062
2067
  {
2063
2068
  "path": "docs/design/apex-pass-2-direction.md",
@@ -2582,7 +2587,7 @@
2582
2587
  {
2583
2588
  "path": "docs/module-api-changelog.md",
2584
2589
  "mode": "0000644",
2585
- "sha256": "6c3496a323791d9b6bfc8e86faba4e433a51091e5a9d12b85ede0b207d8057a5"
2590
+ "sha256": "75cf389b149eecb2feb08521e846ec486059c4b2b56f01ec3d6d46f62e89ecf9"
2586
2591
  },
2587
2592
  {
2588
2593
  "path": "docs/modules-contract.md",
@@ -2702,7 +2707,7 @@
2702
2707
  {
2703
2708
  "path": "docs/recipes/core-release-pipeline.md",
2704
2709
  "mode": "0000644",
2705
- "sha256": "169425fb8bbdd3e54ab3eefb8ac772c3789dfe19f3f16e39b4e83bba5e831e76"
2710
+ "sha256": "747ee0cf9d43a8170f6f08668bbc7fe3ee617669272e84b92f03e321cf0eb8e4"
2706
2711
  },
2707
2712
  {
2708
2713
  "path": "docs/recipes/devbox-app-release.md",
@@ -2842,12 +2847,12 @@
2842
2847
  {
2843
2848
  "path": "docs/recipes/upgrading-the-core.md",
2844
2849
  "mode": "0000644",
2845
- "sha256": "ffe0add6718e0620144e8b786f237153aca9888a9f9052adb41948fcbc17ddec"
2850
+ "sha256": "8fe1aae25eddf1d61f8cebbd915e5fa26c26eaa1585a0a9b887b398550d4c782"
2846
2851
  },
2847
2852
  {
2848
2853
  "path": "docs/recipes/windows-builders.md",
2849
2854
  "mode": "0000644",
2850
- "sha256": "85823a0b17b646da4b17596c78819da8e7342f24395dcc2e3ea82b5e07c25cba"
2855
+ "sha256": "dba962c19bf22e5773fd05eb6667581d15f62ecda7292a37f83b12227ad14049"
2851
2856
  },
2852
2857
  {
2853
2858
  "path": "docs/recipes/work-on-a-task-from-your-dev-box.md",
@@ -4772,7 +4777,7 @@
4772
4777
  {
4773
4778
  "path": "modules/hall-ui/public/builders.js",
4774
4779
  "mode": "0000644",
4775
- "sha256": "ac1252ef25e0fe8b5774ef3d6566970657437de1151cd3e9e194859067fee789"
4780
+ "sha256": "3e0e1e9120f14a1c5c015b044bfe8cd2d37cbc261746ac62407ccf90e13f4b29"
4776
4781
  },
4777
4782
  {
4778
4783
  "path": "modules/hall-ui/public/chime.wav",
@@ -4992,12 +4997,12 @@
4992
4997
  {
4993
4998
  "path": "modules/hall-ui/public/hall-kit.js",
4994
4999
  "mode": "0000644",
4995
- "sha256": "b0647793327eb27b7d460ecb97a39b835ecedf4754910def1e69867bf87070f7"
5000
+ "sha256": "febbc27ca107c7da31f997119be95a73446bab70139339c10c951440fe2e1d28"
4996
5001
  },
4997
5002
  {
4998
5003
  "path": "modules/hall-ui/public/hall-render.js",
4999
5004
  "mode": "0000644",
5000
- "sha256": "ab4db906c2510541a77f76a3d8a8440f4e78ffa6a4064315a4b4b7849f93c4a8"
5005
+ "sha256": "c41b42b12bb33bf8e40491215d596008abb21c6b40acff9a1b4bdeb369bdc784"
5001
5006
  },
5002
5007
  {
5003
5008
  "path": "modules/hall-ui/public/hall-visual.js",
@@ -5392,7 +5397,7 @@
5392
5397
  {
5393
5398
  "path": "modules/hall-ui/public/style.css",
5394
5399
  "mode": "0000644",
5395
- "sha256": "e06903836d2a31be222aef1fda880f6a68ab86f99667fae69b77b1fc3b118c08"
5400
+ "sha256": "246523db6b1c4a3b417ab4539a0fca3cef8f3a5932b50dede637829d72bb2331"
5396
5401
  },
5397
5402
  {
5398
5403
  "path": "modules/hall-ui/public/task-detail.js",
@@ -5617,7 +5622,7 @@
5617
5622
  {
5618
5623
  "path": "modules/lifecycle/db-analytics.js",
5619
5624
  "mode": "0000644",
5620
- "sha256": "d83ba5776dee71849ac6d3ce472217db4b2559994e72f5c9b544304b8cc86641"
5625
+ "sha256": "c910371c5127e49a8952ef95b32a4065840542b036ee400d30f570812448fc31"
5621
5626
  },
5622
5627
  {
5623
5628
  "path": "modules/lifecycle/db-claim-reads.js",
@@ -5852,7 +5857,7 @@
5852
5857
  {
5853
5858
  "path": "modules/lifecycle/routes/analytics.js",
5854
5859
  "mode": "0000644",
5855
- "sha256": "fb9e0f844368d2164f3279423f24ad0238774d95ceecf7039719e0bfdb0c1fcc"
5860
+ "sha256": "b005c0e2e60cb1f7cf0c072182079301b63415c9edb0a48ee1958dd39fa62f57"
5856
5861
  },
5857
5862
  {
5858
5863
  "path": "modules/lifecycle/routes/artist-gate.js",
@@ -7907,12 +7912,12 @@
7907
7912
  {
7908
7913
  "path": "package-lock.json",
7909
7914
  "mode": "0000644",
7910
- "sha256": "1e217b4d7975b9c295c2806a83a5817f93fc38a0786a1976fe8ec19aac141b50"
7915
+ "sha256": "197f6af6f83b766818989ee6f6fb71723dcf8420ddd190c18703e8c26b5aa889"
7911
7916
  },
7912
7917
  {
7913
7918
  "path": "package.json",
7914
7919
  "mode": "0000644",
7915
- "sha256": "6943316e63bef1a867ea04e705e42a9aa28a50e2cded10e16874899c61f69f03"
7920
+ "sha256": "065f7ae763810587db17bc9522c11f8672ef9b9689a1cb8630debc9e12ae586e"
7916
7921
  },
7917
7922
  {
7918
7923
  "path": "public-docs/index.html",
@@ -8832,7 +8837,7 @@
8832
8837
  {
8833
8838
  "path": "scripts/gds/provision-repo-auth.js",
8834
8839
  "mode": "0000644",
8835
- "sha256": "b08032667c9f06495c750e4dd8d41fdc2f5aa587093cf7b4de8e7a46390f0724"
8840
+ "sha256": "a113cdae4d6dcb3f8d968d41c2f1ce67b34d77229fe0a19d6bc5023f7ed469b5"
8836
8841
  },
8837
8842
  {
8838
8843
  "path": "scripts/gds/provision-repo.js",
@@ -9407,12 +9412,12 @@
9407
9412
  {
9408
9413
  "path": "scripts/gds/update-channel.js",
9409
9414
  "mode": "0000644",
9410
- "sha256": "1aeeb6171244e1d42ee7189a3aa2ae5d83fd175bfe1ce89300d6ca7511819f0b"
9415
+ "sha256": "6418f51f933eac634a7df854af1e3a6dbde25e152e3dca0ce8df7d37d19c1d0c"
9411
9416
  },
9412
9417
  {
9413
9418
  "path": "scripts/gds/upgrade.js",
9414
9419
  "mode": "0000644",
9415
- "sha256": "6fb938914f50a8273640ca2bad871b3a3077102e36877c861e344235338ebef2"
9420
+ "sha256": "9bf33575839de86c1361f78dab69f0e4607db37bbb473a38928fa6c03447d31e"
9416
9421
  },
9417
9422
  {
9418
9423
  "path": "scripts/gds/validate-design.js",
@@ -9852,7 +9857,7 @@
9852
9857
  {
9853
9858
  "path": "src/module-api.js",
9854
9859
  "mode": "0000644",
9855
- "sha256": "d2a5ba427ce014f7940e2757f06541e25275e0c4f59c0b9c5026396c795e41f2"
9860
+ "sha256": "82b3a923d967a361a85d409528a785f2e70434289ee10cf25f3fd1e580eddacb"
9856
9861
  },
9857
9862
  {
9858
9863
  "path": "src/module-loader/catalog.js",
@@ -10794,6 +10799,11 @@
10794
10799
  "mode": "0000644",
10795
10800
  "sha256": "45c8919daeacc77a8a08ce72768a11a7ca47ad5bd65a9e815d5ec823255f743e"
10796
10801
  },
10802
+ {
10803
+ "path": "tests/curve_kind_overlay.mjs",
10804
+ "mode": "0000644",
10805
+ "sha256": "fa254f9da7db897bd3c74188455688efe76a6b1d7d377b992f38ee8c171fa2c7"
10806
+ },
10797
10807
  {
10798
10808
  "path": "tests/cutover_codemod.mjs",
10799
10809
  "mode": "0000644",
@@ -12154,6 +12164,11 @@
12154
12164
  "mode": "0000644",
12155
12165
  "sha256": "68a429b47a1ca36a41433c0d8c3298a0f54745a19b050675aedba658a2cea0ef"
12156
12166
  },
12167
+ {
12168
+ "path": "tests/markdown_line_endings.mjs",
12169
+ "mode": "0000644",
12170
+ "sha256": "629ee8bb78098296039d174b9ddd460fe86acade39f60c1d9bb5f6be9d13762f"
12171
+ },
12157
12172
  {
12158
12173
  "path": "tests/me_ship_days_bound.mjs",
12159
12174
  "mode": "0000644",
@@ -12717,7 +12732,7 @@
12717
12732
  {
12718
12733
  "path": "tests/provision.mjs",
12719
12734
  "mode": "0000644",
12720
- "sha256": "d763e2b5a10fbdd9a0e95fae493b524c7a52b437663125e3dbaf753435402e9c"
12735
+ "sha256": "edcb3a67c97291be694f06cf092233dbd78dbb56898547bc6ccb562e7c27da6b"
12721
12736
  },
12722
12737
  {
12723
12738
  "path": "tests/provision_caddy_wiring.mjs",
@@ -13842,7 +13857,7 @@
13842
13857
  {
13843
13858
  "path": "tests/update_channel.mjs",
13844
13859
  "mode": "0000644",
13845
- "sha256": "9debf9ecdb02b986c882f3d29bdf4b5fe2154cb4e7639db0fd0a0336cd4bdc3b"
13860
+ "sha256": "f20327544858053dbc1a27a7e1c3dbc40320f4414f057ba6d08647de949b0c10"
13846
13861
  },
13847
13862
  {
13848
13863
  "path": "tests/update_subscription_engine.mjs",
@@ -13852,7 +13867,7 @@
13852
13867
  {
13853
13868
  "path": "tests/upgrade.mjs",
13854
13869
  "mode": "0000644",
13855
- "sha256": "bcbba7b1c952088f43300405184849bbcbb2da789097fcc4cf38d95441e0c158"
13870
+ "sha256": "3fe93c21665f73be4e2c17198af35626b2a3a045eceadda8827195910ad64e4c"
13856
13871
  },
13857
13872
  {
13858
13873
  "path": "tests/upgrade_persist_pin.mjs",
package/.gitattributes CHANGED
@@ -37,6 +37,26 @@
37
37
  # read as environmental noise.
38
38
  *.sql text eol=lf
39
39
 
40
+ # Markdown: pinned for the same reason *.sql above is (task 1003981). Unpinned, every
41
+ # .md fell through `* text=auto`, so a Windows clone with the common core.autocrlf=true
42
+ # got CRLF in the worktree for 834 of the 835 tracked .md files while the index stayed
43
+ # LF. That is not cosmetic: this repo has several tools that read .md AS TEXT and make a
44
+ # decision from what they parse — skill-preflight.js (SKILL.md frontmatter), fitness.js
45
+ # G03, linkify-refs.js, docs-entropy.js, the role-pack guard and the doc-CLI guard. A
46
+ # CRLF-blind reader does not fail loudly; it parses nothing and so reports nothing to
47
+ # check. Measured on task 1003754: skill-preflight's /^---\n/ frontmatter regex matched
48
+ # ZERO of 53 skills, so G03 compared an empty set against an empty set and could not
49
+ # fail. Per-site normalisation (tasks 1003754, 1003935) fixes the reader that was
50
+ # noticed; this rule fixes the class, for the reader nobody has written yet.
51
+ #
52
+ # Renormalisation cost: NONE. Measured before landing — no tracked .md carries CRLF in
53
+ # the INDEX, so `git add --renormalize` stages zero files and no committed byte changes.
54
+ # The rule only changes what checkout WRITES. An existing Windows worktree keeps its
55
+ # CRLF copies (the clean filter already normalises them to LF on add, so `git status`
56
+ # stays quiet); a fresh clone, and any file git rewrites, get LF. To convert an existing
57
+ # checkout in place: `git rm --cached -r . && git reset --hard`.
58
+ *.md text eol=lf
59
+
40
60
  # Future Windows-only wrappers (none today) must be CRLF — cmd.exe/PowerShell
41
61
  # expect it. Declared up front so a later setup-builder.cmd lands correct.
42
62
  *.bat text eol=crlf
@@ -115,9 +135,13 @@ src/bongos/routes/CLAUDE.md merge=otb-regen
115
135
  # `* text=auto` above (index LF, worktree CRLF) the check reported STALE forever on
116
136
  # every Windows checkout while the committed content was already correct. The .json
117
137
  # never had the bug because `*.json text eol=lf` above already pins it; the .md fell
118
- # through to text=auto because no `*.md` rule exists (and none should — pinning all
119
- # 685 tracked .md files would renormalize the whole docs tree for one generated file).
120
- # `*.md` deliberately stays unpinned; only the GENERATED artifact is pinned here.
138
+ # through to text=auto because, at the time, no `*.md` rule existed. This entry's
139
+ # `text eol=lf` is now REDUNDANT with the blanket `*.md text eol=lf` above (task
140
+ # 1003981) — kept because it is load-bearing documentation of WHY the generated pair
141
+ # needs LF, and because tests/git_merge_regen.mjs pins this line's multi-attribute
142
+ # shape. The earlier note here argued *.md should stay unpinned, on the belief that
143
+ # pinning it would renormalize the whole docs tree; that was measured and is false —
144
+ # the index was already uniformly LF, so the blanket rule renormalized nothing.
121
145
  docs/copy-registry.json merge=otb-regen
122
146
  docs/copy-inventory.md merge=otb-regen text eol=lf
123
147
 
@@ -19,7 +19,9 @@ The greenfield "one guided flow" (`bongos init` → provision → OAuth → veri
19
19
 
20
20
  It is **idempotent** (skips once the repo carries a `package.json`) and **dry-run-safe** (every mutation goes through the injected `exec`/`writeFile`).
21
21
 
22
- **Git transport = the existing SSH deploy alias.** The clone/push use `git@<alias>:<owner>/<repo>.git` (default alias `github-deploy`, overridable via `PROVISION_GIT_SSH_ALIAS`) — the **same** transport the control-plane checkout already uses for the platform repo. No secret is interpolated into a command (SSH-key auth), so nothing leaks into journald.
22
+ **Git transport = the existing SSH deploy alias.** The clone/push use `git@<alias>:<owner>/<repo>.git` — the **same** transport the control-plane checkout already uses for the platform repo. No secret is interpolated into a command (SSH-key auth), so nothing leaks into journald.
23
+
24
+ > **Amended by task 1003996 — the alias is a property of one box, so it is probed, not assumed.** `github-deploy` exists only in the founder control plane's `~/.ssh/config`; on any other plane the scaffold's `remote add origin` and push resolved nowhere. `instanceRepoRemote` now picks the alias in this order: an explicit one → `PROVISION_GIT_SSH_ALIAS` → `github-deploy` **when `ssh -G` shows it actually resolves here** → `github.com`. The founder box keeps the alias (the probe finds it) and is unchanged; every other plane addresses GitHub directly, which is what its own deploy key is issued against. A stored remote is validated against the whole accept-set (`instanceRepoRemotes`) rather than re-running the probe, so a remote an alias-carrying box wrote stays recognised.
23
25
 
24
26
  **Operational prerequisite (the one manual grant):** the control plane's deploy public key (`~/.ssh/github_deploy.pub`) must have **write** access to each instance repo. GitHub deploy keys are per-repo, so standing up a new instance requires the owner to add that key (write) to the new repo — a one-time browser step alongside "create the empty repo," mirroring how the platform repo's deploy key is registered.
25
27
 
@@ -0,0 +1,157 @@
1
+ # ADR 0305 — A recipe lives with what it documents
2
+
3
+ **Status:** accepted · **Date:** 2026-09-17 · **Task:** [task 1002156](https://cloudbongos.com/builders#/task/1002156) (goal 1000091 — BONGOS-V2)
4
+
5
+ **Related:** [ADR 0098](0098-public-mirror-publish-manifest.md) (`isPublishable()` — the default-deny publish boundary this ADR re-aims) · [ADR 0107](0107-module-upstreaming-contribution-to-core-catalog.md) (submit → review → accept; the lifecycle this ADR declines to duplicate) · [ADR 0135](0135-module-upstream-submission-interim-queue.md) (the submission queue) · [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (the module loader and its one-way import boundary) · [ADR 0062](0062-medusa-instance-model-decoupling.md) §1 (the portable-core / host-instance / feature-module cut-line) · [ADR 0108](0108-instance-composition-configurable-root.md) §1 (the core is consumed as a versioned npm package)
6
+
7
+ ## Context
8
+
9
+ This is part A of the 2026-07-10 architecture-review sweep — the redesign deliberately
10
+ deferred until direction and learnings solidified (idea 536 / idea 537; part B shipped as
11
+ task 2155). It was held on the owner's explicit instruction not to start the ADR until the
12
+ direction was confirmed. That confirmation came on 2026-09-17.
13
+
14
+ **The thesis.** `docs/recipes/`, `scripts/` and `docs/research/` are all relevant to
15
+ *building* Cloud Bongos, but a new project built *on* Cloud Bongos wants only a subset.
16
+ Today the split is binary per file: [`scripts/gds/publish-manifest.js`](../../scripts/gds/publish-manifest.js)'s
17
+ `isPublishable()` either ships a file to every instance or traps it in this repo. The thesis
18
+ asks whether some of these assets should instead be **shareable the way modules are** —
19
+ authored, reviewed, accepted, opt-in installed.
20
+
21
+ **The binary split has already collapsed to one side.** Measured on this commit: all **36**
22
+ files in `docs/recipes/` and all **4** in `docs/research/` pass `isPublishable()`. Every one
23
+ ships to every instance. The instance-local half is empty in practice — the denylist entries
24
+ that used to hold it (`cloudbongos-standup.md`, `example-decouple-r89.md`,
25
+ `staging-data.md`) name files that no longer exist. The gate itself is sound; there is simply
26
+ nothing on the other side of it any more. So a fresh instance today receives
27
+ `figma-design-loop.md`, `redteam-patrol.md` and `parallel-goal-waves.md` whether or not any
28
+ of it applies to that instance.
29
+
30
+ **And the split is actively producing wrong documentation.** Four published recipes document
31
+ the dev-box: `devbox-app-release.md`, `devbox-app-windows-test.md`,
32
+ `work-on-a-task-from-your-dev-box.md`, `builder-box-lifecycle.md`. Goal 1000091 is in the
33
+ middle of deleting that module. None of the nine remaining removal tasks covers these four —
34
+ only task 1003896 touches `docs/recipes/`, and only to strip devcontainer mentions. Filed as
35
+ [task 1004013](https://cloudbongos.com/builders#/task/1004013).
36
+
37
+ That is the finding this ADR turns on. The recipes did not go stale through neglect; they
38
+ went stale because **nothing structurally ties a recipe to the thing it documents**. The
39
+ module is deleted in `modules/`, the recipe sits in `docs/recipes/`, and no test, no fitness
40
+ check and no reviewer diff connects them. A published doc for a deleted feature is worse than
41
+ no doc: it is a confident wrong answer, and `search-ingest-md` ingests it into the very index
42
+ builders are told to consult.
43
+
44
+ ## Decision
45
+
46
+ ### 1. The rule: a recipe lives with what it documents.
47
+
48
+ Not "which recipes are portable" — that is the question the binary split already answers
49
+ badly, one file at a time, by hand, forever. The durable question is *ownership*. A recipe
50
+ belongs in the same deletable unit as its subject, so that removing the subject removes the
51
+ recipe as a matter of file layout rather than of anybody remembering.
52
+
53
+ This yields a three-way classification, applied per file:
54
+
55
+ | Class | Home | Lifecycle |
56
+ | --- | --- | --- |
57
+ | **Core methodology** — how to operate *any* instance | `docs/recipes/` (unchanged) | ships with the core, not optional |
58
+ | **Feature-coupled** — how to use one module | `modules/<key>/recipes/` | ships, installs and **is deleted** with its module |
59
+ | **Instance-operational** — this host's own ops | instance-local, denied by `isPublishable()` | never leaves the instance |
60
+
61
+ ### 2. `scripts/` stays core-shipped, whole.
62
+
63
+ `scripts/` is not documentation with a portability question; it is the CLI. `bin/` dispatches
64
+ into it, the fitness checks, ship gates and publish boundary *are* files in it, and
65
+ `isPublishable()` already allowlists the subtree with deploy denied. Splitting it per file
66
+ would make the core's own tooling conditional on an install choice. No change.
67
+
68
+ ### 3. `docs/research/` becomes instance-local.
69
+
70
+ The four items are this instance's competitive analysis, its grader-cost evaluation and its
71
+ own task-network map. They are situated artifacts: findings about *this* project at a moment
72
+ in time, not methodology another instance can run. They are also the surface most likely to
73
+ carry a brand-name leak, since nothing about them was written to be portable. Deny the
74
+ subtree; keep any genuinely portable finding by promoting it into an ADR, which is the
75
+ artifact class that already exists for durable conclusions.
76
+
77
+ ### 4. A shared recipe is a module contribution, not a new registry.
78
+
79
+ This is the half of the thesis that is **rejected in its literal form**. The task asks whether
80
+ recipes should become "a NEW shareable/opt-in asset class parallel to modules". They should
81
+ not be parallel to modules. They should be *carried by* modules.
82
+
83
+ A module already has every mechanism a shareable recipe needs, all of it built and shipped:
84
+ a validated manifest with `author` / `origin` / `license` / `maintainer`
85
+ ([`manifest-schema.js`](../../src/module-loader/manifest-schema.js) `ATTRIBUTION_KEYS`),
86
+ submit → review → accept with a security review as a hard accept-gate (ADR 0107 §1, §5),
87
+ a submissions table (`migrations/core_191_module_submissions.sql`), default-off enablement
88
+ plus the publish-allowlist *as* the accept action (ADR 0107 §6), and a maintenance/orphaning
89
+ policy that refuses a `maintained` status without a named maintainer (ADR 0166).
90
+
91
+ Building a second registry would mean a second manifest, a second review queue, a second
92
+ attribution model and a second orphaning policy — to distribute Markdown. The precedent is
93
+ already on disk and nobody designed it: `modules/ui-design/docs/design-contract.md` is a
94
+ module-owned document that ships and dies with its module, and it has never needed a registry.
95
+
96
+ So: **no new asset class, no new lifecycle, no new CLI verb.** A recipe pack is a directory
97
+ inside a module. `bongos module submit` already carries it; enabling the module installs it;
98
+ deleting the module deletes it.
99
+
100
+ ### 5. The publish boundary follows the layout; it does not define it.
101
+
102
+ `isPublishable()` keeps its default-deny two-layer design unchanged (ADR 0098). What changes
103
+ is that it stops being the *only* thing standing between a stale recipe and every instance.
104
+ Once a feature-coupled recipe lives under `modules/<key>/`, the existing module allowlist
105
+ entries already govern it and no per-file denylist row is needed. Per-file rows remain only
106
+ for the instance-operational class — the one case where a file must stay behind for reasons
107
+ the directory structure cannot express.
108
+
109
+ ### 6. Sequencing.
110
+
111
+ This ADR decides direction only. It changes no code and moves no file. The moves are follow-on
112
+ work, and the dev-box four ([task 1004013](https://cloudbongos.com/builders#/task/1004013))
113
+ are deliberately *not* folded into it: that module is being deleted this goal, so its recipes
114
+ should be deleted outright rather than relocated into a directory that is about to disappear.
115
+ They are the worked example of the problem, not the first migration.
116
+
117
+ ## Alternatives considered (rejected)
118
+
119
+ **A new shareable asset class parallel to modules** (the thesis as literally written; the
120
+ Chef Supermarket / Ansible Galaxy / Terraform-registry shape). Rejected on cost against an
121
+ already-built alternative: it duplicates the manifest, review queue, attribution model and
122
+ orphaning policy that ADR 0107 and ADR 0135 already ship, and it would leave a recipe's
123
+ lifecycle *still* unconnected to its subject's — the actual defect. The prior art also does
124
+ not transfer cleanly: Supermarket and Galaxy distribute executable units with dependency
125
+ resolution, which is what a module already is here. A recipe has no dependencies to resolve.
126
+
127
+ **Keep the binary split and fix it by classification** (the cheaper option the owner was
128
+ offered). Rejected because it treats the symptom. Hand-classifying 36 files restores the
129
+ instance-local half for exactly as long as it takes the next module to ship a recipe, and it
130
+ does nothing to stop the next dev-box four — under this option those are found by a human
131
+ reading `ls docs/recipes/`, which is exactly how the ADR-numbering collision behind
132
+ [ADR 0300](0300-a-missing-protected-surface-registry-is-a-broken-install.md)'s sibling guard
133
+ was found, and the lesson there was to make the structure enforce the rule.
134
+
135
+ **Per-recipe front-matter declaring portability.** Rejected: it puts the ownership claim in a
136
+ place no build step reads and no deletion touches. A `portable: false` key in a file whose
137
+ module was deleted is still a file in `docs/recipes/`.
138
+
139
+ **Delete `docs/research/` rather than make it instance-local.** Rejected: the grader-cost
140
+ evaluation and the competitive analysis are live inputs to open goals. Instance-local is the
141
+ correct home for a situated artifact, not the bin.
142
+
143
+ ## Consequences
144
+
145
+ - **The stale-recipe class of defect stops being possible for module-coupled docs.** Deleting
146
+ `modules/<key>/` takes its recipes with it, in the same commit, visible in the same diff.
147
+ - **A fresh instance receives less.** Recipes for modules it has not enabled no longer arrive.
148
+ That is the thesis's goal, and it is what makes the core's own documentation honest about
149
+ what is installed.
150
+ - **Module authors gain a documentation surface with attribution already attached** — the
151
+ `author` / `origin` credit ADR 0107 §2 defines now covers the recipe as well as the code.
152
+ - **Follow-on work is a sweep, not a build.** Classify the 36 recipes against §1, move the
153
+ feature-coupled ones into their modules, deny `docs/research/`, and add a fitness check that
154
+ fails when a recipe under `modules/<key>/recipes/` outlives its module. No new machinery.
155
+ - **Revisit if a recipe ever needs to ship without a module to carry it.** That is the one
156
+ shape this decision cannot express, and it would be the real argument for §4's rejected
157
+ alternative. Nothing in the current 36 has it.
@@ -396,3 +396,4 @@ This keeps the decision history honest and traceable.
396
396
  | 0302 | [**The third identical failure stops the session and asks** ([task 1003990](https://cloudbongos.com/builders#/task/1003990), goal 1000095). Sessions looped without noticing: one PR re-shipped into the same red check nine times, and 45 of 169 claim attempts were the same refusal retried minutes apart. A PostToolUse hook now counts walls per session — the signature is the `[otb-plain]` card's "What happened" line + the task id + the RED line, so a red check naming different failing tests each run reads as progress — and on the third identical one injects a single instruction: stop retrying, diagnose (path named), or /ask-for-help. Waiting cards ("Nothing to do…") are never counted; git-guard and worktree-guard count their own blocks through the same helper; it never blocks a tool call and echoes nothing a tool printed. Rejected: counting any repeated failing command (red→green is that), blocking the fourth attempt (a new gate, ADR 0162), server-side detection (cannot see guard blocks or speak into the session).](0302-the-third-identical-failure-stops-the-session-and-asks.md) | GDS / sessions / hooks |
397
397
  | 0303 | [**Provisioning verifies the base Caddyfile, and never edits it** ([task 1002860](https://cloudbongos.com/builders#/task/1002860), goal 1000106, from idea 1000524). The runner assumed the box's `/etc/caddy/Caddyfile` carried the `on_demand_tls` tls-check ask and `import /etc/caddy/sites/*.caddy`, and reloaded with `allowFail` — a box missing either provisioned "successfully" and the instance was unreachable. It now reads Caddy's RESOLVED config (`caddy adapt`: unprivileged, no key access, indifferent to how the directives are written) before touching the box (the ask) and after writing the snippet (the domain is served ⇒ the import reaches it), refusing with the exact line to add, and the reload is loud. Rejected: editing the base file (`on_demand_tls` must sit inside the global block an append cannot place, and a bad write takes down the control plane's own apex); `caddy validate` (loads certificate keys, needs root).](0303-provisioning-verifies-the-base-caddyfile-and-never-edits-it.md) | provisioning / infra |
398
398
  | 0304 | [**Routine reads run without a prompt; anything a flag can turn into a write is exact-form** ([task 1003992](https://cloudbongos.com/builders#/task/1003992), goal 1000095). The shipped `.claude/settings.json` pre-allowed six commands, so every `gh pr view` or `git fetch` asked a non-technical builder to approve a command they cannot evaluate. The read-only subset is now pre-allowed — `git status`, `gh pr view/checks/list`, `gh run view/list` and the gds CLIs audited read-only under every flag as prefix rules; `git branch` and `git fetch` as exact forms only, because a flag turns either into a write or an exec — and the instance starter mirrors it rule for rule. `git diff/log/show` get NO rule: the harness already runs their read-only forms unprompted with a flag check, and a prefix rule switched that check off (`--output=<path>` writes anywhere, `diff --no-index` reads deny-listed files — both reproduced in review). A test pins the whole allow-list, that no rule covers a command git-guard blocks, and that no rule covers a write dressed as a read. Rejected: `Bash(git:*)`, prefix-plus-`ask` for diff/log/show (argument patterns are evaded by quoting), prefix rules for fetch/branch, `bypassPermissions` everywhere.](0304-routine-reads-run-without-a-prompt-and-anything-a-flag-can-turn-into-a-write-is-exact-form.md) | GDS / sessions / permissions |
399
+ | 0305 | [**A recipe lives with what it documents** ([task 1002156](https://cloudbongos.com/builders#/task/1002156), goal 1000091, from idea 536 / idea 537). Part A of the 2026-07-10 architecture review, held until the owner confirmed direction. The binary core-vs-instance split in `isPublishable()` has collapsed to one side: all **36** files in `docs/recipes/` and all **4** in `docs/research/` publish, and the denylist rows that once held the instance-local half name files that no longer exist. Worse, it is producing wrong docs — four published recipes document the dev-box that goal 1000091 is deleting, and none of the nine removal tasks covers them ([task 1004013](https://cloudbongos.com/builders#/task/1004013)). The cause is not neglect: **nothing structurally ties a recipe to what it documents**. So the rule is ownership, not portability — a recipe lives in the same deletable unit as its subject. Three classes: core methodology stays in `docs/recipes/`; feature-coupled moves to `modules/<key>/recipes/` and dies with its module; instance-operational stays behind the publish gate. `scripts/` is unchanged (it is the CLI, not documentation with a portability question); `docs/research/` becomes instance-local (situated artifacts, and the likeliest brand-name leak). **The thesis is rejected in its literal form**: a shared recipe is not a NEW asset class parallel to modules but a directory *inside* one, reusing the manifest attribution, submit→review→accept, security accept-gate, default-off enablement and orphaning policy that ADR 0107/0135 already ship — `modules/ui-design/docs/design-contract.md` is the undesigned precedent. Rejected: a parallel registry (a second manifest, queue, attribution model and orphaning policy, to distribute Markdown; Supermarket/Galaxy distribute executables with dependency resolution, which is what a module already is); classify-and-keep-the-binary-split (treats the symptom, restores the local half only until the next module ships a recipe); per-recipe portability front-matter (no build step reads it, no deletion touches it); deleting `docs/research/` (live inputs to open goals). Decides direction only — no file moves; the sweep and a fitness check for a recipe outliving its module are follow-on.](0305-a-recipe-lives-with-what-it-documents.md) | modules / upstreaming |
@@ -4,13 +4,13 @@
4
4
  > Deterministic on a given tree — regenerate and commit rather than hand-editing.
5
5
  > Machine-readable twin: [`copy-registry.json`](copy-registry.json).
6
6
 
7
- **1874 strings** across 3 surfaces · 1627 distinct pieces of copy · 1874 certain, 0 heuristic · 171 shown in more than one place.
7
+ **1875 strings** across 3 surfaces · 1628 distinct pieces of copy · 1875 certain, 0 heuristic · 171 shown in more than one place.
8
8
 
9
9
  ## Surfaces
10
10
 
11
11
  | surface | lives at | files | strings |
12
12
  |---|---|---|---|
13
- | `builders-hall` | `modules/hall-ui/public` | 89 | 1384 |
13
+ | `builders-hall` | `modules/hall-ui/public` | 89 | 1385 |
14
14
  | `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
15
15
  | `landing` | `modules/public-landing/public` | 5 | 390 |
16
16
 
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
78
78
  | `3e5a62bc4887` | 2x | A GitHub username is needed. | modules/hall-ui/public/hall-render.js:377, modules/hall-ui/public/watch.js:311 |
79
79
  | … | | _131 more in the JSON registry_ | |
80
80
 
81
- ## `builders-hall` — 1384 strings
81
+ ## `builders-hall` — 1385 strings
82
82
 
83
83
  | id | conf | text | where |
84
84
  |---|---|---|---|
@@ -142,7 +142,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
142
142
  | `1b326b0be1a4` | certain | A {…} — you are a {…}. Mingle pairs across crafts. | `modules/hall-ui/public/collab.js:365` |
143
143
  | `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:46` |
144
144
  | `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:61` |
145
- | `303f8d90266f` | certain | Achievements could not be loaded. | `modules/hall-ui/public/builders.js:1158` |
145
+ | `303f8d90266f` | certain | Achievements could not be loaded. | `modules/hall-ui/public/builders.js:1204` |
146
146
  | `6ca31dd5eb91` | certain | Acknowledge the primer | `modules/hall-ui/public/primer.html:99` |
147
147
  | `4461b13f95c2` | certain | Actions apply at once. Closing stops and deletes the box; you can start a fresh one anytime. | `modules/hall-ui/public/settings.html:209` |
148
148
  | `74cc57f76b42` | certain | Active recently | `modules/hall-ui/public/watch.js:435` |
@@ -155,7 +155,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
155
155
  | `cc4125ca7cff` | certain | Added to this version after it started building — an Archon override of the scope gate. Open the goal to see w | `modules/hall-ui/public/goals-render.js:184` |
156
156
  | `c600ff97ea70` | certain | Added — they are in the goal now, without being asked. | `modules/hall-ui/public/goals-render.js:1290` |
157
157
  | `ff67fba11965` | certain | Admitted into {…} mid-build | `modules/hall-ui/public/goals-render.js:873` |
158
- | `8b736e365191` | certain | All builders | `modules/hall-ui/public/hall-render.js:1145` |
158
+ | `8b736e365191` | certain | All builders | `modules/hall-ui/public/hall-render.js:1208` |
159
159
  | `b5e03617b319` | certain | All goals | `modules/hall-ui/public/goals.html:53` |
160
160
  | `e08d410571e9` | certain | All kinds | `modules/hall-ui/public/sessions.js:286` |
161
161
  | `9c34bccb06ef` | certain | All open asks | `modules/hall-ui/public/collab.html:64` |
@@ -164,7 +164,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
164
164
  | `b38c01691857` | certain | All your work → | `modules/hall-ui/public/hall-widgets.js:110` |
165
165
  | `e99cc5d37404` | certain | Already a member? | `modules/hall-ui/public/hall-render.js:346` |
166
166
  | `da5368d10f85` | certain | Amendment {…} passed{…}, and the constitution below is not the one it decided: | `modules/hall-ui/public/government.js:633` |
167
- | `69f0ca4a4d84` | certain | Analytics scope | `modules/hall-ui/public/hall-render.js:1143` |
167
+ | `69f0ca4a4d84` | certain | Analytics scope | `modules/hall-ui/public/hall-render.js:1206` |
168
168
  | `14bdceaac078` | certain | Answer the five questions and this spark becomes a Full Idea. | `modules/hall-ui/public/ideas.js:601` |
169
169
  | `0293418d5e8e` | certain | Answerable for: | `modules/hall-ui/public/profile.js:72` |
170
170
  | `05761b08ec8f` | certain | Answering is optional and declining costs nothing. Nobody is assigned by being asked. | `modules/hall-ui/public/collab.html:90` |
@@ -411,7 +411,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
411
411
  | `541127601291` | certain | Download for Mac | `modules/hall-ui/public/settings.html:224` |
412
412
  | `2ed2fd8376c0` | certain | Download for Windows | `modules/hall-ui/public/settings.html:225` |
413
413
  | `c7af57097d94` | certain | Download the Dev Box app: | `modules/hall-ui/public/hall-render.js:779` |
414
- | `9cf07334a5a9` | certain | Downvote (−1) | `modules/hall-ui/public/builders.js:739` |
414
+ | `9cf07334a5a9` | certain | Downvote (−1) | `modules/hall-ui/public/builders.js:785` |
415
415
  | `9c728558d6e7` | certain | Drachmae &amp; karma | `modules/hall-ui/public/drachmae.html:22` |
416
416
  | `9c728558d6e7` | certain | Drachmae &amp; karma | `modules/hall-ui/public/drachmae.html:22` |
417
417
  | `9c728558d6e7` | certain | Drachmae &amp; karma | `modules/hall-ui/public/drachmae.html:37` |
@@ -534,7 +534,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
534
534
  | `a4ff1e9c34e3` | certain | Idea {…} | `modules/hall-ui/public/idea.js:267` |
535
535
  | `ba82ec56f1e3` | certain | Idea — {{worldName}} | `modules/hall-ui/public/idea.html:6` |
536
536
  | `ba82ec56f1e3` | certain | Idea — {{worldName}} | `modules/hall-ui/public/idea.html:6` |
537
- | `e181637c5a5e` | certain | Ideas awaiting triage | `modules/hall-ui/public/builders.js:859` |
537
+ | `e181637c5a5e` | certain | Ideas awaiting triage | `modules/hall-ui/public/builders.js:905` |
538
538
  | `d4e21769ce1c` | certain | Ideas filed, and what became of them | `modules/hall-ui/public/profile.html:152` |
539
539
  | `379b20d548ad` | certain | Ideas whose author has said "I had the thought but not the full picture". Anyone can develop one — the author | `modules/hall-ui/public/ideas.html:42` |
540
540
  | `ef224c9de7c8` | certain | Ideas — {{worldName}} | `modules/hall-ui/public/ideas.html:6` |
@@ -571,7 +571,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
571
571
  | `fbe40b5818a3` | certain | Key removed. | `modules/hall-ui/public/settings.js:1148` |
572
572
  | `93c17262bacf` | certain | Key storage is being set up by an Archon — check back shortly. {…} | `modules/hall-ui/public/settings.js:1027` |
573
573
  | `2a3c9e501f8e` | certain | Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the | `modules/hall-ui/public/settings.js:1023` |
574
- | `7d6eaa8d4514` | certain | Kinds of work shipped | `modules/hall-ui/public/hall-render.js:1194` |
574
+ | `e3b473af2f69` | certain | Kind of work | `modules/hall-ui/public/hall-render.js:1173` |
575
+ | `7d6eaa8d4514` | certain | Kinds of work shipped | `modules/hall-ui/public/hall-render.js:1286` |
575
576
  | `81f62e066dbf` | certain | Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed). | `modules/hall-ui/public/builders.js:595` |
576
577
  | `35a15eb0a117` | certain | Last 30 days | `modules/hall-ui/public/hall-widgets.js:129` |
577
578
  | `9be8b839eff8` | certain | Last 7 days | `modules/hall-ui/public/hall-widgets.js:129` |
@@ -622,7 +623,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
622
623
  | `df335a1224ae` | certain | Member since {…} | `modules/hall-ui/public/profile.js:94` |
623
624
  | `c7a670e9552d` | certain | Merged into | `modules/hall-ui/public/profile.js:406` |
624
625
  | `6bd456635167` | certain | Merging work does not put it in front of anyone. This is the step that does: it moves this instance onto a new | `modules/hall-ui/public/deploy.html:39` |
625
- | `7637613c231b` | certain | Metic rank and above may vote | `modules/hall-ui/public/builders.js:743` |
626
+ | `7637613c231b` | certain | Metic rank and above may vote | `modules/hall-ui/public/builders.js:789` |
626
627
  | `d3fa05c5e3fe` | certain | Mingle pairs you with someone from another craft. Saying no costs nothing. | `modules/hall-ui/public/collab.html:80` |
627
628
  | `d7ce4a3bb745` | certain | Minimize the welcome panel | `modules/hall-ui/public/hall-widgets.js:52` |
628
629
  | `19b0ed5781ae` | certain | Minimum rank required to claim this task | `modules/hall-ui/public/task-lib.js:65` |
@@ -1008,7 +1009,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1008
1009
  | `381f29be7497` | certain | The most recently shipped tasks. | `modules/hall-ui/public/work.html:120` |
1009
1010
  | `82479c539fca` | certain | The name shown beside your work — in the roster, the leaderboard, and the work feed. Your sign-in and the cred | `modules/hall-ui/public/settings.html:75` |
1010
1011
  | `b88dd8b96b72` | certain | The next person to notice this sentence reads your note instead of re-litigating it. | `modules/hall-ui/public/copy-desk.html:135` |
1011
- | `aa716f3dd551` | certain | The page could not be loaded. Try again. | `modules/hall-ui/public/builders.js:1425` |
1012
+ | `aa716f3dd551` | certain | The page could not be loaded. Try again. | `modules/hall-ui/public/builders.js:1484` |
1012
1013
  | `74bc22f38140` | certain | The platform confirmed this request came from the account it names. | `modules/hall-ui/public/watch.js:373` |
1013
1014
  | `6c3d88de42de` | certain | The primer | `modules/hall-ui/public/primer.html:41` |
1014
1015
  | `dea378cd4837` | certain | The primer did not load | `modules/hall-ui/public/primer.html:88` |
@@ -1087,7 +1088,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1087
1088
  | `6516cc82021a` | certain | UI design | `modules/hall-ui/public/settings.html:303` |
1088
1089
  | `2c1c20785a6e` | certain | Unclear — a person would not know what to do | `modules/hall-ui/public/copy-desk.html:91` |
1089
1090
  | `aa445f06cc5e` | certain | Unlink failed: {…} | `modules/hall-ui/public/settings.js:876` |
1090
- | `67fbc770b3b3` | certain | Upvote (+1) | `modules/hall-ui/public/builders.js:739` |
1091
+ | `67fbc770b3b3` | certain | Upvote (+1) | `modules/hall-ui/public/builders.js:785` |
1091
1092
  | `e7e2a99a2bea` | certain | Use this | `modules/hall-ui/public/settings-specialities.js:148` |
1092
1093
  | `e1ecd543a2ca` | certain | Using this speciality. | `modules/hall-ui/public/settings-specialities.js:199` |
1093
1094
  | `6200bac6bdca` | certain | View all sessions | `modules/hall-ui/public/watch.html:106` |
@@ -1096,7 +1097,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1096
1097
  | `f8546b3e285e` | certain | View tasks {…} | `modules/hall-ui/public/roadmap.js:154` |
1097
1098
  | `71c09cda8246` | certain | Voice for {…} | `modules/hall-ui/public/settings.js:76` |
1098
1099
  | `2940b7828d26` | certain | Volume {…}%. | `modules/hall-ui/public/settings.js:218` |
1099
- | `6905f2ee5702` | certain | Vote on this work | `modules/hall-ui/public/builders.js:739` |
1100
+ | `6905f2ee5702` | certain | Vote on this work | `modules/hall-ui/public/builders.js:785` |
1100
1101
  | `b2937e14ee9b` | certain | Vote yes | `modules/hall-ui/public/board-room.js:276` |
1101
1102
  | `8cc425582984` | certain | Vulnerability reports | `modules/hall-ui/public/watch.html:132` |
1102
1103
  | `b1e63e33f739` | certain | Vulnerability reports, engagement reports, override requests, and the audit log. | `modules/hall-ui/public/watch.html:129` |
@@ -1288,7 +1289,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1288
1289
  | `fdfb8b2ce948` | certain | new identity | `modules/hall-ui/public/box-panel.js:339` |
1289
1290
  | `86f235ddfe01` | certain | new thread | `modules/hall-ui/public/settings.html:343` |
1290
1291
  | `b9f2e0d43c94` | certain | no clock | `modules/hall-ui/public/government.js:607` |
1291
- | `e02979266baf` | certain | no data | `modules/hall-ui/public/hall-kit.js:705` |
1292
+ | `e02979266baf` | certain | no data | `modules/hall-ui/public/hall-kit.js:735` |
1292
1293
  | `9e194a57d054` | certain | no reading | `modules/hall-ui/public/deploy.js:74` |
1293
1294
  | `33ca71bef112` | certain | no tasks yet | `modules/hall-ui/public/goals-render.js:163` |
1294
1295
  | `739a4bd6bd83` | certain | node scripts/setup-builder.js | `modules/hall-ui/public/hall-render.js:846` |
@@ -1431,7 +1432,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1431
1432
  | `3d74668f69e5` | certain | {…}{…} · {…} | `modules/hall-ui/public/task.js:649` |
1432
1433
  | `9588652a7aff` | certain | · follows your profile setting | `modules/hall-ui/public/settings.js:568` |
1433
1434
  | `4a5ff4f662df` | certain | — ${…} of ${…} this month ({…}%). {…} | `modules/hall-ui/public/hall-render.js:471` |
1434
- | `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:675` |
1435
+ | `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:721` |
1435
1436
  | `729d4ce22b99` | certain | — any — | `modules/hall-ui/public/hall-widgets.js:132` |
1436
1437
  | `d2c30a1ee74e` | certain | — decide — | `modules/hall-ui/public/goals-render.js:970` |
1437
1438
  | `417adabd1a00` | certain | — no goal suggested — open the goal board and pick one — | `modules/hall-ui/public/task-detail.js:324` |
@@ -1446,7 +1447,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
1446
1447
  | `5b9fa7cb4fb0` | certain | …and {…} more waiting — | `modules/hall-ui/public/goal-inbox.js:121` |
1447
1448
  | `b2a04abfead0` | certain | …{…} more awaiting a nod. | `modules/hall-ui/public/goal-inbox.js:264` |
1448
1449
  | `616fb9adf3cf` | certain | …{…} more going quiet. | `modules/hall-ui/public/goal-inbox.js:353` |
1449
- | `e35f11bdc5d7` | certain | …{…} more open ideas — triage clears them one at a time. | `modules/hall-ui/public/builders.js:857` |
1450
+ | `e35f11bdc5d7` | certain | …{…} more open ideas — triage clears them one at a time. | `modules/hall-ui/public/builders.js:903` |
1450
1451
  | `5f1d914ad45e` | certain | …{…} more — | `modules/hall-ui/public/goal-inbox.js:427` |
1451
1452
  | `de8fa5223aee` | certain | ‹ Prev | `modules/hall-ui/public/hall-kit.js:74` |
1452
1453
  | `d4b84b7fbdeb` | certain | ← All goals | `modules/hall-ui/public/goals.html:80` |