@bongos/core 1.21.64 → 1.21.66
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 +45 -35
- package/docs/adr/0367-the-support-bot-answers-from-public-docs-only.md +69 -0
- package/docs/adr/README.md +1 -0
- package/docs/copy-inventory.md +19 -20
- package/docs/copy-registry.json +22 -31
- package/docs/file-map.md +1 -1
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +0 -1
- package/docs/page-readings.json +10 -10
- package/modules/discord/db.js +32 -0
- package/modules/discord/discord-bot.js +14 -0
- package/modules/discord/discord-support.js +493 -0
- package/modules/discord/module.json +2 -2
- package/modules/hall-ui/public/profile.html +4 -7
- package/modules/hall-ui/public/profile.js +0 -5
- package/modules/memory/module.json +3 -1
- package/modules/memory/routes/search.js +9 -0
- package/modules/memory/search.js +68 -3
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/gds/credential-presence.js +5 -0
- package/src/module-api.js +1 -1
- package/tests/canonical_profile_url.mjs +23 -157
- package/tests/discord_support.mjs +399 -0
- package/tests/search_isolation.mjs +21 -0
- package/modules/hall-ui/public/profile-canonical.js +0 -137
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.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.66",
|
|
6
|
+
"core_contract": "1.21.66",
|
|
7
|
+
"source_commit": "7d5fb4a32c7bde51ddbc429756639ecba23c987f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-06T15:22:33.015Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 587,
|
|
13
13
|
"agent_docs_stubbed": 28,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2953,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3569,
|
|
20
|
+
"tree_sha256": "5267240f0d28ca05c97ca9e9911fb79f57f5027e6d0434e2c9a1c1f1b45bd600",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2289,10 +2289,15 @@
|
|
|
2289
2289
|
"mode": "0000644",
|
|
2290
2290
|
"sha256": "29c841d193efa7b6f6479e14a6056057138574fcd7b526f667da6f219dece5a7"
|
|
2291
2291
|
},
|
|
2292
|
+
{
|
|
2293
|
+
"path": "docs/adr/0367-the-support-bot-answers-from-public-docs-only.md",
|
|
2294
|
+
"mode": "0000644",
|
|
2295
|
+
"sha256": "6d02d69a8d1bc0378f143960b280e06b4d7777b0ef4d3e7aa8c2d5a4337f85b8"
|
|
2296
|
+
},
|
|
2292
2297
|
{
|
|
2293
2298
|
"path": "docs/adr/README.md",
|
|
2294
2299
|
"mode": "0000644",
|
|
2295
|
-
"sha256": "
|
|
2300
|
+
"sha256": "2d9e4ea00f57234d18adc9a8b95b1ccabb3fca6b61b859d629eb8e8f533cc9f8"
|
|
2296
2301
|
},
|
|
2297
2302
|
{
|
|
2298
2303
|
"path": "docs/api-reference.md",
|
|
@@ -2327,12 +2332,12 @@
|
|
|
2327
2332
|
{
|
|
2328
2333
|
"path": "docs/copy-inventory.md",
|
|
2329
2334
|
"mode": "0000644",
|
|
2330
|
-
"sha256": "
|
|
2335
|
+
"sha256": "deee182912a3b4f6827af242e28d903b85ab53fc563d122a8c1c842739413ae3"
|
|
2331
2336
|
},
|
|
2332
2337
|
{
|
|
2333
2338
|
"path": "docs/copy-registry.json",
|
|
2334
2339
|
"mode": "0000644",
|
|
2335
|
-
"sha256": "
|
|
2340
|
+
"sha256": "55481321c3bbf249cff8cf69935f95b2ca8901239310ea1093d6d58d45f81c08"
|
|
2336
2341
|
},
|
|
2337
2342
|
{
|
|
2338
2343
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2832,7 +2837,7 @@
|
|
|
2832
2837
|
{
|
|
2833
2838
|
"path": "docs/file-map.md",
|
|
2834
2839
|
"mode": "0000644",
|
|
2835
|
-
"sha256": "
|
|
2840
|
+
"sha256": "30be6ac52963f8b85a7b608b21505279e0560f208aba36d52cfc42350be663b5"
|
|
2836
2841
|
},
|
|
2837
2842
|
{
|
|
2838
2843
|
"path": "docs/handoff-template.md",
|
|
@@ -2842,7 +2847,7 @@
|
|
|
2842
2847
|
{
|
|
2843
2848
|
"path": "docs/module-api-changelog.md",
|
|
2844
2849
|
"mode": "0000644",
|
|
2845
|
-
"sha256": "
|
|
2850
|
+
"sha256": "243f9810e7be9a77ae9e4aa5f0fbcf084ea2e261f521053aba2beb2d57667af9"
|
|
2846
2851
|
},
|
|
2847
2852
|
{
|
|
2848
2853
|
"path": "docs/modules-contract.md",
|
|
@@ -2927,12 +2932,12 @@
|
|
|
2927
2932
|
{
|
|
2928
2933
|
"path": "docs/page-inventory.json",
|
|
2929
2934
|
"mode": "0000644",
|
|
2930
|
-
"sha256": "
|
|
2935
|
+
"sha256": "9ac8290512a1b7dee3b6b2ab836473beea4589d6ed9407d884659c3bd973c78b"
|
|
2931
2936
|
},
|
|
2932
2937
|
{
|
|
2933
2938
|
"path": "docs/page-readings.json",
|
|
2934
2939
|
"mode": "0000644",
|
|
2935
|
-
"sha256": "
|
|
2940
|
+
"sha256": "79c99779b57ad095968f0173411caa5a521b4ad4ffd76c7a54a8a93682854573"
|
|
2936
2941
|
},
|
|
2937
2942
|
{
|
|
2938
2943
|
"path": "docs/project-context.template.md",
|
|
@@ -4647,7 +4652,7 @@
|
|
|
4647
4652
|
{
|
|
4648
4653
|
"path": "modules/discord/db.js",
|
|
4649
4654
|
"mode": "0000644",
|
|
4650
|
-
"sha256": "
|
|
4655
|
+
"sha256": "130cdbc84ce8298c6dffd03bc125d5c3b102ccff11fb95d24d6e7e999ac2aaa7"
|
|
4651
4656
|
},
|
|
4652
4657
|
{
|
|
4653
4658
|
"path": "modules/discord/discord-approvals.js",
|
|
@@ -4662,7 +4667,7 @@
|
|
|
4662
4667
|
{
|
|
4663
4668
|
"path": "modules/discord/discord-bot.js",
|
|
4664
4669
|
"mode": "0000644",
|
|
4665
|
-
"sha256": "
|
|
4670
|
+
"sha256": "a96d9e55db1d66813fd552419bee6548edf2587e9510ae0c2e61640d1e80fc34"
|
|
4666
4671
|
},
|
|
4667
4672
|
{
|
|
4668
4673
|
"path": "modules/discord/discord-bugs.js",
|
|
@@ -4694,6 +4699,11 @@
|
|
|
4694
4699
|
"mode": "0000644",
|
|
4695
4700
|
"sha256": "852abc58bdec011b6d3bf222a35e198c6ea98a761d57a76be85477ef85ae54f5"
|
|
4696
4701
|
},
|
|
4702
|
+
{
|
|
4703
|
+
"path": "modules/discord/discord-support.js",
|
|
4704
|
+
"mode": "0000644",
|
|
4705
|
+
"sha256": "68c32e054d07133f685ce9dd80a4b6d53fada4b1e97939491b958b1bb8994a9e"
|
|
4706
|
+
},
|
|
4697
4707
|
{
|
|
4698
4708
|
"path": "modules/discord/lifecycle-port.js",
|
|
4699
4709
|
"mode": "0000644",
|
|
@@ -4707,7 +4717,7 @@
|
|
|
4707
4717
|
{
|
|
4708
4718
|
"path": "modules/discord/module.json",
|
|
4709
4719
|
"mode": "0000644",
|
|
4710
|
-
"sha256": "
|
|
4720
|
+
"sha256": "f3b7314eaea0977841d71a02fdc032c2fea7f4cf242450161b2d17824409b7f7"
|
|
4711
4721
|
},
|
|
4712
4722
|
{
|
|
4713
4723
|
"path": "modules/discord/pollers/discord-bot.js",
|
|
@@ -5954,11 +5964,6 @@
|
|
|
5954
5964
|
"mode": "0000644",
|
|
5955
5965
|
"sha256": "ade6ff2b23d9b7e7b01f893148c53733f1c9bd11c50d0f01c662b9726239fd98"
|
|
5956
5966
|
},
|
|
5957
|
-
{
|
|
5958
|
-
"path": "modules/hall-ui/public/profile-canonical.js",
|
|
5959
|
-
"mode": "0000644",
|
|
5960
|
-
"sha256": "4f010fd2a4e77447839eb77f5e294ea62c525fc47f392e916790f37078a92726"
|
|
5961
|
-
},
|
|
5962
5967
|
{
|
|
5963
5968
|
"path": "modules/hall-ui/public/profile-charts.js",
|
|
5964
5969
|
"mode": "0000644",
|
|
@@ -5992,12 +5997,12 @@
|
|
|
5992
5997
|
{
|
|
5993
5998
|
"path": "modules/hall-ui/public/profile.html",
|
|
5994
5999
|
"mode": "0000644",
|
|
5995
|
-
"sha256": "
|
|
6000
|
+
"sha256": "a43f55145547d63da5c38e9173d227853904b508caa3282f34585c2cd4bf678e"
|
|
5996
6001
|
},
|
|
5997
6002
|
{
|
|
5998
6003
|
"path": "modules/hall-ui/public/profile.js",
|
|
5999
6004
|
"mode": "0000644",
|
|
6000
|
-
"sha256": "
|
|
6005
|
+
"sha256": "4a16a4b2a5bb5e444f514723656a3775bf65aef9180d4d25ed0a6693101060fb"
|
|
6001
6006
|
},
|
|
6002
6007
|
{
|
|
6003
6008
|
"path": "modules/hall-ui/public/profile.states.json",
|
|
@@ -7447,7 +7452,7 @@
|
|
|
7447
7452
|
{
|
|
7448
7453
|
"path": "modules/memory/module.json",
|
|
7449
7454
|
"mode": "0000644",
|
|
7450
|
-
"sha256": "
|
|
7455
|
+
"sha256": "f04e13545b12ef46a1233bf295cc696f64bad72866207b6be9c8166528bf8208"
|
|
7451
7456
|
},
|
|
7452
7457
|
{
|
|
7453
7458
|
"path": "modules/memory/pollers/search-index.js",
|
|
@@ -7467,7 +7472,7 @@
|
|
|
7467
7472
|
{
|
|
7468
7473
|
"path": "modules/memory/routes/search.js",
|
|
7469
7474
|
"mode": "0000644",
|
|
7470
|
-
"sha256": "
|
|
7475
|
+
"sha256": "3b8fffea8e90c461c9fdc2957ca60300734b44257f9b3d5aca49e73d04019b0e"
|
|
7471
7476
|
},
|
|
7472
7477
|
{
|
|
7473
7478
|
"path": "modules/memory/search-chunker.js",
|
|
@@ -7477,7 +7482,7 @@
|
|
|
7477
7482
|
{
|
|
7478
7483
|
"path": "modules/memory/search.js",
|
|
7479
7484
|
"mode": "0000644",
|
|
7480
|
-
"sha256": "
|
|
7485
|
+
"sha256": "0540c9034480a9ee78159449b9cbc86b8415a9c70b9d108f1d4fafa66bd997a5"
|
|
7481
7486
|
},
|
|
7482
7487
|
{
|
|
7483
7488
|
"path": "modules/npm-release/module.json",
|
|
@@ -9967,12 +9972,12 @@
|
|
|
9967
9972
|
{
|
|
9968
9973
|
"path": "package-lock.json",
|
|
9969
9974
|
"mode": "0000644",
|
|
9970
|
-
"sha256": "
|
|
9975
|
+
"sha256": "6c64398d62e13b46e7372422ead03873bc142124c89e02e92ed923cec360e9e8"
|
|
9971
9976
|
},
|
|
9972
9977
|
{
|
|
9973
9978
|
"path": "package.json",
|
|
9974
9979
|
"mode": "0000644",
|
|
9975
|
-
"sha256": "
|
|
9980
|
+
"sha256": "a6a8fcb855c7bc3af08820abdee41c3a9aecdb1b0f368429edf413e17106c9d7"
|
|
9976
9981
|
},
|
|
9977
9982
|
{
|
|
9978
9983
|
"path": "public-docs/index.html",
|
|
@@ -9992,7 +9997,7 @@
|
|
|
9992
9997
|
{
|
|
9993
9998
|
"path": "release-notes.json",
|
|
9994
9999
|
"mode": "0000644",
|
|
9995
|
-
"sha256": "
|
|
10000
|
+
"sha256": "5849cac3f0e8260822d39216ad50c17560c8ef4cbed7a48d760a3b2f8247b38f"
|
|
9996
10001
|
},
|
|
9997
10002
|
{
|
|
9998
10003
|
"path": "scripts/cron/style_guide_audit.sh",
|
|
@@ -10372,7 +10377,7 @@
|
|
|
10372
10377
|
{
|
|
10373
10378
|
"path": "scripts/gds/credential-presence.js",
|
|
10374
10379
|
"mode": "0000644",
|
|
10375
|
-
"sha256": "
|
|
10380
|
+
"sha256": "36ecef8da86e9905c8c3e8431881828aba0ecca7e10b63db014f86658c5bf58b"
|
|
10376
10381
|
},
|
|
10377
10382
|
{
|
|
10378
10383
|
"path": "scripts/gds/cutover-codemod.js",
|
|
@@ -12212,7 +12217,7 @@
|
|
|
12212
12217
|
{
|
|
12213
12218
|
"path": "src/module-api.js",
|
|
12214
12219
|
"mode": "0000644",
|
|
12215
|
-
"sha256": "
|
|
12220
|
+
"sha256": "476059af8acd597e4ecfc9d3beb9447f6473475d15fc93ed16339d42f5c3ffa2"
|
|
12216
12221
|
},
|
|
12217
12222
|
{
|
|
12218
12223
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12897,7 +12902,7 @@
|
|
|
12897
12902
|
{
|
|
12898
12903
|
"path": "tests/canonical_profile_url.mjs",
|
|
12899
12904
|
"mode": "0000644",
|
|
12900
|
-
"sha256": "
|
|
12905
|
+
"sha256": "328e949ff0c675cdf1f54f445f36517e740454fe57f1a4ab5fd10edbc20a2f8f"
|
|
12901
12906
|
},
|
|
12902
12907
|
{
|
|
12903
12908
|
"path": "tests/cap_newcomer_tasks.mjs",
|
|
@@ -13539,6 +13544,11 @@
|
|
|
13539
13544
|
"mode": "0000644",
|
|
13540
13545
|
"sha256": "858e20374f392b3444ea6ef65253eb6563425ab772c4988a33434f350effac54"
|
|
13541
13546
|
},
|
|
13547
|
+
{
|
|
13548
|
+
"path": "tests/discord_support.mjs",
|
|
13549
|
+
"mode": "0000644",
|
|
13550
|
+
"sha256": "3823845cfaf33c108d96f23d2f652a51df0ae859aff827fb18556a2cd7110cca"
|
|
13551
|
+
},
|
|
13542
13552
|
{
|
|
13543
13553
|
"path": "tests/display_name.mjs",
|
|
13544
13554
|
"mode": "0000644",
|
|
@@ -16777,7 +16787,7 @@
|
|
|
16777
16787
|
{
|
|
16778
16788
|
"path": "tests/search_isolation.mjs",
|
|
16779
16789
|
"mode": "0000644",
|
|
16780
|
-
"sha256": "
|
|
16790
|
+
"sha256": "5833e5642257d933a7245e44a8dd9b8365d4e050df2deb0bde7a1456901cbcd2"
|
|
16781
16791
|
},
|
|
16782
16792
|
{
|
|
16783
16793
|
"path": "tests/search_route.mjs",
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# ADR 0367 — The Discord support bot answers from public docs only, under a monthly cap that fails closed
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-10-06
|
|
5
|
+
- **Task:** [task 1002534](https://cloudbongos.com/builders#/task/1002534) (goal 1000110, BONGOS-V2), promoted from idea 1000440
|
|
6
|
+
- **Builds on:** [ADR 0033](0033-discord-bot-service-principal.md) (the bot is a service principal and a mirror, never authority; every bot action is audited), [ADR 0060](0060-gds-retrieval-layer.md) (recall: `search_chunks`, scoped in SQL), [ADR 0080](0080-llm-cache-api-transport-and-trust-model.md) (anything a stranger can type is untrusted input to a model), [ADR 0083](0083-modular-architecture-strangler-build-plan.md) (modules talk through ports, never a require)
|
|
7
|
+
- **Decided with:** the owner. Scope at the 2026-07-29 inbox triage: read-only, public docs only, one support channel, no writes. The rest on 2026-10-06, all five the recommended option: a $5/month cap, `claude-haiku-4-5`, answer only when @-mentioned, the newcomer docs as the corpus, and ship it switched off until a key is on the server.
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
Support questions in Discord are answered by whoever happens to be around. The answers mostly already exist in the docs. A bot can point people at them, but it sits outside the trust boundary in a channel anyone can read and type into. That raises three risks the triage named: leaking rank-gated content into a public channel, prompt injection from channel text, and per-message model spend on a bootstrapped budget.
|
|
12
|
+
|
|
13
|
+
Two facts shaped the design. First, `search_chunks` at `min_rank='xenos'` is not "public". Every tracked `.md` is ingested at xenos unless it is in the protected set: session logs, every ADR, `.claude/` skills, `docs/credentials.md`, `docs/architecture.md`, the red-team recipe. Xenos is still a signed-in builder, and `#support` is visible to everyone. Second, nothing on the server calls a model today. The Claude login lives on builders' machines (`docs/credentials.md`), never on the host.
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
|
|
17
|
+
**D1 — Where and when.** The bot answers in ONE channel (`DISCORD_SUPPORT_CHANNEL_ID`, the guild's existing `support` channel) and only when a message @-mentions it. A reply ping does not count. Bots, webhooks and DMs are ignored. This is the first feature that replies through the gateway (every other post is a webhook), so the bot needs Send Messages in that channel.
|
|
18
|
+
|
|
19
|
+
**D2 — What it may read: an allowlist, enforced in SQL.** The corpus is `SUPPORT_DOC_REFS` in `modules/discord/discord-support.js`: `README.md`, `docs/onboarding/`, and `docs/api-reference.md`. The memory module serves it through a new port, `memory.searchPublicDocs`, whose scope is fixed inside the function and never taken from the caller:
|
|
20
|
+
- `source_kind='doc'`;
|
|
21
|
+
- `min_rank='xenos'`;
|
|
22
|
+
- no owner;
|
|
23
|
+
- `source_ref` on the allowlist.
|
|
24
|
+
|
|
25
|
+
The allowlist predicate rides into the same scoped CTE as the rank predicate, never a post-filter, and the body read re-applies the whole scope. An empty allowlist returns nothing. Widening the corpus is a code change reviewed by merge, because the list *is* the privacy boundary. The asker is never looked up: who they are cannot change what the bot reads.
|
|
26
|
+
|
|
27
|
+
**D3 — What it may write: nothing but the reply and its audit row.** It does not file an idea, a bug, a task or a blocker, and it requires no port that does. Each answer writes one `audit_log` row:
|
|
28
|
+
- `route='discord:support'`, `surface='discord_bot'`;
|
|
29
|
+
- booked to the bot's own principal (migration 067);
|
|
30
|
+
- carrying the cost, token counts, message and channel ids, and the doc refs.
|
|
31
|
+
|
|
32
|
+
ADR 0033 already audits every bot action, and the `discord:bugs` rate cap reads audit_log the same way. That row is also the spend ledger (D5), so the feature needs no migration.
|
|
33
|
+
|
|
34
|
+
**D4 — Untrusted text.**
|
|
35
|
+
- The question and the passages are fenced with a per-call random marker, and any fence-shaped run in either is rewritten first (the page-notes split's posture).
|
|
36
|
+
- The model gets no tools, so a jailbroken reply can only be one wrong message.
|
|
37
|
+
- That message cannot ping anyone. Mentions are rewritten in the text, and the reply is sent with `allowedMentions: { parse: [] }`.
|
|
38
|
+
- An injection's most useful payload is a link under the bot's name ("reset your account here"). So a masked link is rewritten to show its address, any URL not found verbatim in the passages the model was given is replaced with `[link removed]`, and the reply goes out with embeds suppressed.
|
|
39
|
+
- A rate limit (D5) applies before every reply, including the fixed lines, so repeating a bare mention cannot farm a reply flood.
|
|
40
|
+
- The model never sees anything private, so there is nothing for an injection to extract.
|
|
41
|
+
|
|
42
|
+
**D5 — Spend: Haiku, a monthly cap, fail closed.**
|
|
43
|
+
- **Model and price.** The model is `claude-haiku-4-5` (about $0.008 an answer at ≤600 output tokens), called through the official SDK. The SDK is lazily required, so an instance with the feature off never loads it.
|
|
44
|
+
- **The cap.** `DISCORD_SUPPORT_MONTHLY_CAP_USD`, default $5, is read before every call from month-to-date spend: the sum of the D3 rows in the current UTC month.
|
|
45
|
+
- **Failing closed.** No answer is given when the cap is set to anything but a positive number, when the ledger read fails, or when there is no bot principal to book against. The rule is the agents spend-ceiling's (task 1001393).
|
|
46
|
+
- **The ledger read is indexed.** Its `route = 'discord:support' AND recorded_at >= <month start>` is the shape of migration 033's `idx_audit_log_route (route, recorded_at DESC)`, so it reads one month of one route, not the whole log.
|
|
47
|
+
- **Concurrency.** Answers in flight are reserved at a worst case derived from the price table, and at most two run at once, so concurrency cannot overshoot. The reservation is per process, which holds because there is one: a bot token is one gateway connection, run in the single web process. A second answering process would need a shared reservation first.
|
|
48
|
+
- **Unbooked spend.** A cost that could not be booked counts in memory until the month turns. So does a call that died after it may have been billed (a timeout or a 5xx). A 4xx costs nothing.
|
|
49
|
+
- **Reaching the cap.** The bot posts one "out of answers for this month" line, then stays quiet until the month turns.
|
|
50
|
+
- **Per-asker limit.** A silent in-memory rate limit (4 per 10 minutes) bounds a burst. It is not the bill.
|
|
51
|
+
|
|
52
|
+
**D6 — Off by default, with its own switch and its own key.**
|
|
53
|
+
- **The switch.** `DISCORD_SUPPORT_ENABLED` must be exactly `true`, on top of `DISCORD_BOT_ENABLED`.
|
|
54
|
+
- **The key.** `DISCORD_SUPPORT_ANTHROPIC_API_KEY` is read from env only and namespaced on purpose. A host-wide `ANTHROPIC_API_KEY` would also be picked up by the `claude` CLI the grader spawns, and bill that key for grading.
|
|
55
|
+
- **Inert states.** Missing the switch, the channel or the key makes the feature inert, and the boot log says which one.
|
|
56
|
+
|
|
57
|
+
**D7 — Who reviews wrong answers.** The humans in the channel, as before. Each answer names its sources and has an audit row with the message id. The fix for a wrong answer is the doc it was drawn from, not the bot.
|
|
58
|
+
|
|
59
|
+
## Consequences
|
|
60
|
+
|
|
61
|
+
- On cloudbongos.com it does nothing until the bot itself runs there ([task 1002506](https://cloudbongos.com/builders#/task/1002506)) and the owner sets the switch, the channel and the key (`docs/discord/support.md`).
|
|
62
|
+
- A question the newcomer docs do not cover gets "I couldn't find that". That is the intended answer, not a gap to fill by widening the corpus to internal docs.
|
|
63
|
+
- The memory module now provides a port. A future public surface that wants recall must go through `searchPublicDocs` and bring its own allowlist; there is still no unauthenticated HTTP search route.
|
|
64
|
+
- The audit-log ledger is approximate in one direction only: a lost booking undercounts until a restart forgets it. The in-flight reservation and the small per-answer cost keep that inside cents.
|
|
65
|
+
|
|
66
|
+
## Reproduce / verify
|
|
67
|
+
|
|
68
|
+
- `node tests/discord_support.mjs`: config and kill switch, the message guard, the fence, mention-proofing, the cap, the reservation and fail-closed paths, the model request (no tools), read-only by source, and the port's fixed SQL scope.
|
|
69
|
+
- `node tests/search_isolation.mjs`, Layer C (needs a Postgres): the public port never returns a metic chunk, an owned chunk, a DB-prose row, or a doc off the allowlist.
|
package/docs/adr/README.md
CHANGED
|
@@ -485,3 +485,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
|
|
|
485
485
|
| 0364 | [**Repo access is asked at sign-in on the hub, and held for as long as the builder stays signed in** ([task 1004549](https://cloudbongos.com/builders#/task/1004549)). Amends ADR 0143 and 0155. **D1:** every sign-in door on the hub's own pages carries `repos=1`; the hall and CLI stay identity-only. **D2:** the repo token's TTL is the web session's remaining life; a web sign-out deletes it, a CLI logout does not. **D3:** a draft at a wizard step beside a stored create keeps its place on a reload or a GitHub round-trip.](0364-repo-access-is-asked-at-sign-in-and-held-for-the-session.md) | auth / GitHub / create wizard |
|
|
486
486
|
| 0365 | [**A guild engages a project through each member's own door** ([task 1002303](https://cloudbongos.com/builders#/task/1002303)). Amends ADR 0336 D7's invite half after ADR 0353. **D1:** the engagement row as D7 specified, plus `guild_id` on the echo (the latest application decides the label). **D2:** a guild applies = each member applies as themselves through the relay, naming the engagement. **D3:** a project invites a guild = the hub records it and returns one hall hand-off link per public-roster member; no hub-written invites, the one-step relay stays deferred. **D4:** a project is named only when on the map and public, for both kinds. **D5:** the label rides the applicant-profile read; the queue is R28's. **D6:** the D4.4 guild cards are their own task.](0365-a-guild-engages-a-project-through-each-members-own-door.md) | guilds / invites / applications |
|
|
487
487
|
| 0366 | [**Hall planning is forms; a goal made there carries its own spec task, and the interviews stay in the CLI** ([task 1003461](https://cloudbongos.com/builders#/task/1003461), goal 1000089). Spike answer. **D1:** form-shaped, build in the hall: create a task under a goal, create a goal (name + subtitle, version, category, no scope field), attach a criterion to a goal you hold; every server refusal rendered as copy. **D2:** interview-shaped, deliberately absent from the hall: version planning, scope inference, drafting criteria and seed tasks, reuse-vs-create judgement, carry-forward. **D3 (owner):** a hall-made goal is created with a "Spec goal N" task (`POST /goals` `spec_task: true`, `source_ref goal-<id>-spec`) and every task in the goal depends on it until it ships; no new permission, no migration. **D4:** an optional "Plan with Claude" hand-off button.](0366-hall-planning-is-forms-and-a-goal-made-there-carries-its-own-spec-task.md) | lifecycle / planning |
|
|
488
|
+
| 0367 | [**The Discord support bot answers from public docs only, under a monthly cap that fails closed** ([task 1002534](https://cloudbongos.com/builders#/task/1002534), goal 1000110). **D1:** one pinned channel, only when @-mentioned; the first gateway reply. **D2:** the corpus is an allowlist (`README.md`, `docs/onboarding/`, `docs/api-reference.md`) served by a new `memory.searchPublicDocs` port whose scope (doc, xenos, no owner, allowlisted ref) is fixed in SQL; the asker is never looked up. **D3:** no writes but the reply and one `audit_log` row per answer, which is also the spend ledger, so no migration. **D4:** a nonce-fenced prompt, no tools, mentions disabled. **D5:** `claude-haiku-4-5`, `DISCORD_SUPPORT_MONTHLY_CAP_USD` default $5, fail closed, with in-flight answers reserved at worst case. **D6:** off by default; its own switch and an env-only, namespaced key. **D7:** the channel's humans review wrong answers; the fix is the doc.](0367-the-support-bot-answers-from-public-docs-only.md) | discord / support / spend |
|
package/docs/copy-inventory.md
CHANGED
|
@@ -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
|
-
**
|
|
7
|
+
**2556 strings** across 3 surfaces · 2183 distinct pieces of copy · 2556 certain, 0 heuristic · 227 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` |
|
|
13
|
+
| `builders-hall` | `modules/hall-ui/public` | 133 | 1828 |
|
|
14
14
|
| `status-dashboard` | `modules/status-ui/public` | 4 | 100 |
|
|
15
15
|
| `landing` | `modules/public-landing/public` | 7 | 628 |
|
|
16
16
|
|
|
@@ -78,7 +78,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
78
78
|
| `f6f68ba322be` | 3x | Open {…} | modules/hall-ui/public/goal-inbox.js:53, modules/hall-ui/public/goal-inbox.js:69, modules/hall-ui/public/goals.js:67 |
|
|
79
79
|
| … | | _187 more in the JSON registry_ | |
|
|
80
80
|
|
|
81
|
-
## `builders-hall` —
|
|
81
|
+
## `builders-hall` — 1828 strings
|
|
82
82
|
|
|
83
83
|
| id | conf | text | where |
|
|
84
84
|
|---|---|---|---|
|
|
@@ -104,7 +104,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
104
104
|
| `ac57fe1ccd6e` | certain | , follow its acceptance criteria, stay within touches[], /builder-ship | `modules/hall-ui/public/bulk-toolbar.js:78` |
|
|
105
105
|
| `574acf2f93bb` | certain | , never quietly ratified — so a clock is worth proposing. The recommended sitting is | `modules/hall-ui/public/government.js:605` |
|
|
106
106
|
| `741e355954ac` | certain | , not at ship). | `modules/hall-ui/public/diagrams.html:52` |
|
|
107
|
-
| `b31a6bd7edc5` | certain | , or | `modules/hall-ui/public/profile.js:
|
|
107
|
+
| `b31a6bd7edc5` | certain | , or | `modules/hall-ui/public/profile.js:977` |
|
|
108
108
|
| `c7c9b0afc38e` | certain | , then mark it as read on the Home page. | `modules/hall-ui/public/work.html:45` |
|
|
109
109
|
| `7627d5c3aa29` | certain | 0 decided | `modules/hall-ui/public/street.html:73` |
|
|
110
110
|
| `24174ce79df3` | certain | 1 · Task lifecycle | `modules/hall-ui/public/diagrams.html:49` |
|
|
@@ -146,7 +146,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
146
146
|
| `6ca31dd5eb91` | certain | Acknowledge the primer | `modules/hall-ui/public/primer.html:99` |
|
|
147
147
|
| `74cc57f76b42` | certain | Active recently | `modules/hall-ui/public/watch.js:458` |
|
|
148
148
|
| `524188fe0078` | certain | Active sessions | `modules/hall-ui/public/settings.html:159` |
|
|
149
|
-
| `d628b36ec58e` | certain | Activity, by role | `modules/hall-ui/public/profile.html:
|
|
149
|
+
| `d628b36ec58e` | certain | Activity, by role | `modules/hall-ui/public/profile.html:138` |
|
|
150
150
|
| `2b94171ce525` | certain | Add dependency | `modules/hall-ui/public/task.js:592` |
|
|
151
151
|
| `a70b72ec4dcc` | certain | Add images | `modules/hall-ui/public/page-notes.js:97` |
|
|
152
152
|
| `da8659b0099b` | certain | Add something you wrote — notes, a standard, a worked example. It is indexed for recall, not pasted into every | `modules/hall-ui/public/settings-specialities.js:354` |
|
|
@@ -240,7 +240,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
240
240
|
| `46b33550d52b` | certain | Bulk claim | `modules/hall-ui/public/work.html:164` |
|
|
241
241
|
| `6d6d626fc518` | certain | Bulk release | `modules/hall-ui/public/goals.html:183` |
|
|
242
242
|
| `6d6d626fc518` | certain | Bulk release | `modules/hall-ui/public/work.html:165` |
|
|
243
|
-
| `181cfa50b127` | certain | By the numbers | `modules/hall-ui/public/profile.html:
|
|
243
|
+
| `181cfa50b127` | certain | By the numbers | `modules/hall-ui/public/profile.html:65` |
|
|
244
244
|
| `a015a43bfc7f` | certain | CLI access | `modules/hall-ui/public/settings.html:141` |
|
|
245
245
|
| `09e863eb90af` | certain | Can: {…} | `modules/hall-ui/public/government.js:873` |
|
|
246
246
|
| `084eb64bce72` | certain | Capabilities held by a machine identity, never by a person or a rank. Shown for completeness; nothing here can | `modules/hall-ui/public/government.html:123` |
|
|
@@ -353,7 +353,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
353
353
|
| `a2f2e8babef5` | certain | Could not load that page. Try again. | `modules/hall-ui/public/blockers.js:276` |
|
|
354
354
|
| `9d8192ac9098` | certain | Could not load the earnings. | `modules/hall-ui/public/profile-charts.js:546` |
|
|
355
355
|
| `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:1000` |
|
|
356
|
-
| `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:
|
|
356
|
+
| `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:1054` |
|
|
357
357
|
| `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:458` |
|
|
358
358
|
| `edd5bafbe075` | certain | Could not load the queue just now. | `modules/hall-ui/public/ideas.js:885` |
|
|
359
359
|
| `02bb0570996a` | certain | Could not load the ranks. | `modules/hall-ui/public/ranks.js:197` |
|
|
@@ -415,7 +415,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
415
415
|
| `af21de422c14` | certain | Create speciality | `modules/hall-ui/public/settings.html:292` |
|
|
416
416
|
| `d7beb841395e` | certain | Create task | `modules/hall-ui/public/task-detail.js:465` |
|
|
417
417
|
| `e91a4d2e3e1c` | certain | Created rank {…}. | `modules/hall-ui/public/government.js:442` |
|
|
418
|
-
| `a55e423263f0` | certain | Cross-project record | `modules/hall-ui/public/profile.html:
|
|
418
|
+
| `a55e423263f0` | certain | Cross-project record | `modules/hall-ui/public/profile.html:99` |
|
|
419
419
|
| `24013a074724` | certain | Custom rank | `modules/hall-ui/public/government.html:113` |
|
|
420
420
|
| `13b22e48d9fb` | certain | Danger zone | `modules/hall-ui/public/project-settings.html:57` |
|
|
421
421
|
| `cf7d7d5d5e83` | certain | Database behind. | `modules/hall-ui/public/deploy.js:582` |
|
|
@@ -477,7 +477,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
477
477
|
| `6604d63c2fb4` | certain | Everyone who joined while this project was being founded, in the order they arrived. The mark is for good. | `modules/hall-ui/public/hall-widgets.js:124` |
|
|
478
478
|
| `04bbccfe7465` | certain | Everything a new builder needs before claiming their first task. About a ten-minute read. | `modules/hall-ui/public/primer.html:42` |
|
|
479
479
|
| `89d9c0962048` | certain | Everything that fell out of it | `modules/hall-ui/public/idea.js:420` |
|
|
480
|
-
| `37110f7e2b27` | certain | Everything this builder has shipped. Seen one role at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:
|
|
480
|
+
| `37110f7e2b27` | certain | Everything this builder has shipped. Seen one role at a time, with goals and ideas, under | `modules/hall-ui/public/profile.html:113` |
|
|
481
481
|
| `efdb46f76b02` | certain | Everything this instance can run: what the core ships, what this project built, and who keeps each one true as | `modules/hall-ui/public/modules.html:35` |
|
|
482
482
|
| `57d5ba0fdefb` | certain | Exit full screen | `modules/hall-ui/public/shell.js:581` |
|
|
483
483
|
| `94339ddaeeea` | certain | Explore: the sky reveals itself as you follow routes from where you begin. | `modules/hall-ui/public/goal-map.html:74` |
|
|
@@ -550,7 +550,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
550
550
|
| `8a421ae268e6` | certain | Goal {…} removed. | `modules/hall-ui/public/gate.js:504` |
|
|
551
551
|
| `e0bc28d10785` | certain | Goals could not be loaded. Refresh to try again. | `modules/hall-ui/public/goals-page.js:883` |
|
|
552
552
|
| `4517f2253d0f` | certain | Goals couldn’t be loaded just now. Refresh to try again. | `modules/hall-ui/public/goals.js:121` |
|
|
553
|
-
| `6a85997bda21` | certain | Goals created | `modules/hall-ui/public/profile.html:
|
|
553
|
+
| `6a85997bda21` | certain | Goals created | `modules/hall-ui/public/profile.html:154` |
|
|
554
554
|
| `6bbd703b5aad` | certain | Goals it can work on | `modules/hall-ui/public/gate.js:376` |
|
|
555
555
|
| `2ed2cb8fbffd` | certain | Goals page | `modules/hall-ui/public/goals.js:94` |
|
|
556
556
|
| `320a0516a33e` | certain | Goals seeded — awaiting kickoff | `modules/hall-ui/public/roadmap.js:271` |
|
|
@@ -680,7 +680,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
680
680
|
| `3b49f0fcd19c` | certain | Load more turns | `modules/hall-ui/public/sessions.html:101` |
|
|
681
681
|
| `daf84bba41b1` | certain | Loading goals… | `modules/hall-ui/public/goals.html:36` |
|
|
682
682
|
| `93ceeaa4e226` | certain | Loading idea | `modules/hall-ui/public/idea.html:30` |
|
|
683
|
-
| `2b5826012538` | certain | Loading profile… | `modules/hall-ui/public/profile.html:
|
|
683
|
+
| `2b5826012538` | certain | Loading profile… | `modules/hall-ui/public/profile.html:36` |
|
|
684
684
|
| `554b156a08d6` | certain | Loading sessions… | `modules/hall-ui/public/sessions.html:32` |
|
|
685
685
|
| `a0c18cece568` | certain | Loading sittings… | `modules/hall-ui/public/board-room.js:553` |
|
|
686
686
|
| `7ca55f9ba183` | certain | Loading task | `modules/hall-ui/public/task.html:32` |
|
|
@@ -756,7 +756,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
756
756
|
| `c255749ec989` | certain | No achievements earned yet. | `modules/hall-ui/public/profile.js:199` |
|
|
757
757
|
| `479c1a45f39d` | certain | No backlog tasks match these filters. Try widening them. | `modules/hall-ui/public/work.js:831` |
|
|
758
758
|
| `83f62fc94271` | certain | No builder account found for this sign-in. | `modules/hall-ui/public/settings.js:1204` |
|
|
759
|
-
| `2e9c154c09cd` | certain | No builder selected. Open a builder from the | `modules/hall-ui/public/profile.js:
|
|
759
|
+
| `2e9c154c09cd` | certain | No builder selected. Open a builder from the | `modules/hall-ui/public/profile.js:977` |
|
|
760
760
|
| `449db2ead464` | certain | No changes are listed for this version. | `modules/hall-ui/public/settings-software-update.js:103` |
|
|
761
761
|
| `6d6fd2314248` | certain | No cross-project activity reported yet. | `modules/hall-ui/public/profile.js:402` |
|
|
762
762
|
| `b1ada579483c` | certain | No custom ranks yet | `modules/hall-ui/public/government.js:358` |
|
|
@@ -885,7 +885,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
885
885
|
| `569980a263ae` | certain | Optional. This is the ledger link — a copy change ships as a task like every other change. | `modules/hall-ui/public/copy-desk.html:130` |
|
|
886
886
|
| `f2e9e8f21e8e` | certain | Or add someone without asking… | `modules/hall-ui/public/goals-render.js:1264` |
|
|
887
887
|
| `d89d1923ecf9` | certain | Over the last {…} days | `modules/hall-ui/public/watch.js:1274` |
|
|
888
|
-
| `695ffff13730` | certain | Over time | `modules/hall-ui/public/profile.html:
|
|
888
|
+
| `695ffff13730` | certain | Over time | `modules/hall-ui/public/profile.html:77` |
|
|
889
889
|
| `5ded44da0cc5` | certain | Override requests | `modules/hall-ui/public/watch.html:139` |
|
|
890
890
|
| `0046e08db06a` | certain | Owner’s bill / month (est.) | `modules/hall-ui/public/fleet-costs.js:70` |
|
|
891
891
|
| `15a49bf15007` | certain | Page {…} of {…} | `modules/hall-ui/public/hall-kit.js:112` |
|
|
@@ -919,7 +919,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
919
919
|
| `92d8fad6dc91` | certain | Private account — this is all they share by applying. | `modules/hall-ui/public/watch.js:459` |
|
|
920
920
|
| `2b88c01d1697` | certain | Private — join is by invitation or an approved request | `modules/hall-ui/public/goals-render.js:877` |
|
|
921
921
|
| `a5cd9cbfe82a` | certain | Profile and privacy | `modules/hall-ui/public/settings.html:103` |
|
|
922
|
-
| `f796836eac4e` | certain | Profile sections | `modules/hall-ui/public/profile.html:
|
|
922
|
+
| `f796836eac4e` | certain | Profile sections | `modules/hall-ui/public/profile.html:46` |
|
|
923
923
|
| `935b317ce2d8` | certain | Profile — {{worldName}} | `modules/hall-ui/public/profile.html:6` |
|
|
924
924
|
| `935b317ce2d8` | certain | Profile — {{worldName}} | `modules/hall-ui/public/profile.html:6` |
|
|
925
925
|
| `cf8d14410264` | certain | Project founding mode | `modules/hall-ui/public/shell.js:950` |
|
|
@@ -1048,7 +1048,6 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1048
1048
|
| `324af64c8b6e` | certain | See all {…} goals {…} | `modules/hall-ui/public/roadmap.js:128` |
|
|
1049
1049
|
| `324af64c8b6e` | certain | See all {…} goals {…} | `modules/hall-ui/public/roadmap.js:260` |
|
|
1050
1050
|
| `00473a773fd7` | certain | See the UAT | `modules/hall-ui/public/criterion-uat-ui.js:80` |
|
|
1051
|
-
| `a9c398651862` | certain | See the cross-project record | `modules/hall-ui/public/profile-canonical.js:114` |
|
|
1052
1051
|
| `17d5b5739f46` | certain | See the work board → | `modules/hall-ui/public/hall-render.js:948` |
|
|
1053
1052
|
| `55cde0774831` | certain | See what would change | `modules/hall-ui/public/deploy.js:425` |
|
|
1054
1053
|
| `292761c89fae` | certain | See which goals wait on each other → | `modules/hall-ui/public/goals.html:39` |
|
|
@@ -1417,7 +1416,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1417
1416
|
| `e179870922a3` | certain | What the session did, derived from its own transcript: whether it wrote files, used tools, and how many prompt | `modules/hall-ui/public/sessions.html:74` |
|
|
1418
1417
|
| `868cf4bbe616` | certain | What the start-it markers mean | `modules/hall-ui/public/commands.html:35` |
|
|
1419
1418
|
| `5a58392783fd` | certain | What this brings in | `modules/hall-ui/public/deploy.js:553` |
|
|
1420
|
-
| `a444ad812e4f` | certain | What this builder has done, seen one role at a time. | `modules/hall-ui/public/profile.html:
|
|
1419
|
+
| `a444ad812e4f` | certain | What this builder has done, seen one role at a time. | `modules/hall-ui/public/profile.html:139` |
|
|
1421
1420
|
| `32d675a2b022` | certain | What this rank is for (optional) | `modules/hall-ui/public/government.html:90` |
|
|
1422
1421
|
| `04b3ff4c4f4c` | certain | What users can see | `modules/hall-ui/public/deploy.html:47` |
|
|
1423
1422
|
| `1d5bfd09068c` | certain | What you saw | `modules/hall-ui/public/studio.js:191` |
|
|
@@ -1453,7 +1452,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1453
1452
|
| `c5fd76a9e03d` | certain | Won {…} | `modules/hall-ui/public/profile.js:206` |
|
|
1454
1453
|
| `986514f35589` | certain | Work board | `modules/hall-ui/public/work.html:31` |
|
|
1455
1454
|
| `520d139df9eb` | certain | Work is complete but the version is held — no tasks are being claimed here right now. | `modules/hall-ui/public/roadmap.js:289` |
|
|
1456
|
-
| `0e6b8e8f26cc` | certain | Works completed | `modules/hall-ui/public/profile.html:
|
|
1455
|
+
| `0e6b8e8f26cc` | certain | Works completed | `modules/hall-ui/public/profile.html:149` |
|
|
1457
1456
|
| `52e5fe3c6075` | certain | Write a Full Idea | `modules/hall-ui/public/ideas.html:145` |
|
|
1458
1457
|
| `ad1e1ab1ecac` | certain | Write a reply… | `modules/hall-ui/public/collab.js:175` |
|
|
1459
1458
|
| `a79ca1e2463b` | certain | Write another | `modules/hall-ui/public/page-notes.js:143` |
|
|
@@ -1703,7 +1702,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1703
1702
|
| `b250b5c4eb03` | certain | shuttle · {…} | `modules/hall-ui/public/sky-interaction.js:45` |
|
|
1704
1703
|
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile-charts.js:605` |
|
|
1705
1704
|
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile.js:841` |
|
|
1706
|
-
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile.js:
|
|
1705
|
+
| `ec6d8c900bc8` | certain | sign in | `modules/hall-ui/public/profile.js:977` |
|
|
1707
1706
|
| `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/goal-map.html:121` |
|
|
1708
1707
|
| `c8c2551006dc` | certain | skip the tour | `modules/hall-ui/public/thinking.html:122` |
|
|
1709
1708
|
| `1e737a57eb20` | certain | start governing | `modules/hall-ui/public/city.html:79` |
|
|
@@ -1737,7 +1736,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1737
1736
|
| `abddfb2b1022` | certain | the newest {…} only | `modules/hall-ui/public/sky-interaction.js:124` |
|
|
1738
1737
|
| `4ad74172c874` | certain | the next page to tweak | `modules/hall-ui/public/studio.html:118` |
|
|
1739
1738
|
| `2be732b11690` | certain | the owner’s blockers | `modules/hall-ui/public/deploy.js:229` |
|
|
1740
|
-
| `95854f8315ca` | certain | the page everyone else reads | `modules/hall-ui/public/profile.html:
|
|
1739
|
+
| `95854f8315ca` | certain | the page everyone else reads | `modules/hall-ui/public/profile.html:34` |
|
|
1741
1740
|
| `2f48995206d4` | certain | the pages /tweak has applied | `modules/hall-ui/public/studio.html:122` |
|
|
1742
1741
|
| `4bde7b562cf4` | certain | the record | `modules/hall-ui/public/sky-panel.js:51` |
|
|
1743
1742
|
| `4bde7b562cf4` | certain | the record | `modules/hall-ui/public/street.html:173` |
|
|
@@ -1755,7 +1754,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1755
1754
|
| `94735a2353aa` | certain | to run it. | `modules/hall-ui/public/commands.html:37` |
|
|
1756
1755
|
| `7d54a818850d` | certain | to see the full record. | `modules/hall-ui/public/profile.js:263` |
|
|
1757
1756
|
| `3c9ba5dc851d` | certain | to see this list there. | `modules/hall-ui/public/commands.html:45` |
|
|
1758
|
-
| `47204e5f11de` | certain | to see your own profile. | `modules/hall-ui/public/profile.js:
|
|
1757
|
+
| `47204e5f11de` | certain | to see your own profile. | `modules/hall-ui/public/profile.js:977` |
|
|
1759
1758
|
| `23488ca48320` | certain | to take a task right here — no terminal needed. Then click | `modules/hall-ui/public/work.html:103` |
|
|
1760
1759
|
| `1b88ce51fd84` | certain | to tend now · {…} | `modules/hall-ui/public/studio.js:233` |
|
|
1761
1760
|
| `1b88ce51fd84` | certain | to tend now · {…} | `modules/hall-ui/public/studio.js:248` |
|