@bongos/core 1.21.177 → 1.21.179
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 +147 -152
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +0 -6
- package/clients/bongos-client/index.cjs +0 -6
- package/clients/bongos-client/index.d.ts +0 -6
- package/clients/bongos-client/index.mjs +0 -6
- package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +3 -2
- package/docs/api/openapi.json +1 -87
- package/docs/api-reference.md +1 -8
- package/docs/canonical-permissions.md +3 -3
- package/docs/copy-inventory.md +50 -64
- package/docs/copy-registry.json +109 -236
- package/docs/file-map.md +3 -3
- package/docs/module-api-changelog.md +4 -0
- package/docs/modules-contract.md +2 -2
- package/docs/page-inventory.json +4 -7
- package/docs/page-readings.json +1520 -1569
- package/modules/government/catalog.js +10 -7
- package/modules/government/decision-board.js +0 -1
- package/modules/government/decision-rules.js +0 -1
- package/modules/government/docket.js +0 -1
- package/modules/government/protected-surfaces.js +1 -1
- package/modules/government/protected-surfaces.json +2 -3
- package/modules/hall-ui/public/atlas.html +1 -1
- package/modules/hall-ui/public/blockers.html +1 -1
- package/modules/hall-ui/public/board-room.html +1 -1
- package/modules/hall-ui/public/city.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +1 -1
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/deploy.html +1 -1
- package/modules/hall-ui/public/diagrams.html +1 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/fleet.html +1 -1
- package/modules/hall-ui/public/gate.css +4 -26
- package/modules/hall-ui/public/gate.html +12 -27
- package/modules/hall-ui/public/gate.js +26 -176
- package/modules/hall-ui/public/gate.states.json +4 -22
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals.html +1 -1
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +1 -1
- package/modules/hall-ui/public/index.html +1 -1
- package/modules/hall-ui/public/modules.html +1 -1
- package/modules/hall-ui/public/my-agents.html +1 -1
- package/modules/hall-ui/public/primer.html +1 -1
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/ranks.html +1 -1
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell.js +1 -1
- package/modules/hall-ui/public/street-card.js +5 -9
- package/modules/hall-ui/public/street-desk.js +2 -2
- package/modules/hall-ui/public/street-inside.js +1 -1
- package/modules/hall-ui/public/street.html +1 -1
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work.html +1 -1
- package/modules/hall-ui/public/work.js +67 -14
- package/modules/lifecycle/matter-acts.js +0 -6
- package/modules/lifecycle/module.json +0 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +28 -0
- package/scripts/bongos/adopt-preflight.js +3 -3
- package/scripts/bongos/audit-authorship.sh +1 -3
- package/scripts/bongos/bump-version.js +46 -9
- package/scripts/bongos/doc-cli-guard.js +2 -0
- package/scripts/bongos/doc-control-claims.js +2 -2
- package/scripts/bongos/government-walk.js +3 -9
- package/scripts/bongos/hard-floor.js +52 -0
- package/scripts/bongos/publish-manifest.js +3 -3
- package/scripts/bongos/run-unit-tests.js +17 -5
- package/scripts/gds/hard-floor.js +6 -0
- package/src/bongos/module-scope-map.js +2 -2
- package/src/bongos/permission-path-check.js +1 -1
- package/src/bongos/route-rank-check.js +1 -8
- package/src/bongos/routes.js +1 -2
- package/src/module-api.js +1 -1
- package/src/modules.js +1 -1
- package/tests/acclaim_feed_evidence_db.mjs +42 -23
- package/tests/adr_0089_scope.mjs +7 -5
- package/tests/bump_version.mjs +52 -18
- package/tests/copy_desk_flags_db.mjs +22 -14
- package/tests/gating_review_retired.mjs +1 -1
- package/tests/goal_sort_staleness.mjs +1 -1
- package/tests/government_act_alone_buildings.mjs +1 -3
- package/tests/government_board_membership_db.mjs +35 -22
- package/tests/government_protected_surfaces.mjs +29 -13
- package/tests/governor_docket.mjs +0 -2
- package/tests/governor_matter_acts.mjs +6 -8
- package/tests/hall_city.mjs +1 -1
- package/tests/hall_matter_card.mjs +2 -2
- package/tests/hall_oversight_world.mjs +16 -12
- package/tests/hall_street_desk.mjs +4 -3
- package/tests/hall_street_inside.mjs +1 -1
- package/tests/helpers.mjs +34 -0
- package/tests/howto_state.mjs +33 -56
- package/tests/howto_state_db.mjs +68 -0
- package/tests/idea_credit_streams_db.mjs +11 -3
- package/tests/integration_parked_ratchet.mjs +7 -1
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/page_notes_db.mjs +12 -8
- package/tests/page_tweak_no_rearm.mjs +50 -0
- package/tests/publish_manifest.mjs +64 -0
- package/tests/search_isolation.mjs +5 -103
- package/tests/search_isolation_db.mjs +140 -0
- package/tests/session_earnings_mirror_db.mjs +2 -0
- package/tests/work_board_live_refresh.mjs +236 -0
- package/tests/workflow_exec_paths.mjs +9 -11
- package/modules/lifecycle/routes/gate-approvals.js +0 -299
- package/scripts/bongos/ci-grade.js +0 -82
- package/scripts/bongos/gate-review.js +0 -330
- package/scripts/gds/ci-grade.js +0 -7
- package/scripts/gds/gate-review.js +0 -7
- package/tests/gate_approvals.mjs +0 -611
- package/tests/gate_review.mjs +0 -152
|
@@ -166,7 +166,11 @@ const PERMISSIONS = [
|
|
|
166
166
|
{ key: 'dependency.cross_tier.manage', system: true, floor: 'archon', guards: 'POST|DELETE /dependencies — cross-tier structural edges (ADR 0086)' },
|
|
167
167
|
{ key: 'goal.scope.manage', system: true, floor: 'archon', guards: 'cross-tier goal-scope edges + protected-scope admission (ADR 0086)' },
|
|
168
168
|
{ key: 'government.manage', system: true, floor: 'archon', guards: 'the Government tab routes (ranks/perms/assignments CRUD, reads included — R110) — meta-escalation' },
|
|
169
|
-
|
|
169
|
+
// RETIRED (task 1004859): both gate-approval routes and the held-PR list on the /gate
|
|
170
|
+
// page were removed, because the gate-review CI check they waited on never ran. The key stays only
|
|
171
|
+
// because grant rows may still name it; dropping it from this list needs a migration
|
|
172
|
+
// that deletes those rows (the government_019 precedent, task 1003894). It guards nothing.
|
|
173
|
+
{ key: 'gate_approval.decide', system: true, floor: 'archon', guards: 'nothing since task 1004859 removed POST /gate-approvals/:pr/approve; the key is retired and awaits a grant-row cleanup' },
|
|
170
174
|
{ key: 'deploy.push_main', system: true, substrate: true, floor: 'archon', guards: 'git push origin main / the deploy — substrate-enforced (pre-push, main-audit)' },
|
|
171
175
|
{ key: 'path.protected.modify', system: true, substrate: true, floor: 'archon', guards: 'modifying a PROTECTED_GLOBS path below the Metic floor — substrate (ADR 0043)' },
|
|
172
176
|
{ key: 'infra.ssh', system: true, substrate: true, floor: 'archon', guards: 'ssh to the droplet / operator surface — substrate (credential placement)' },
|
|
@@ -305,11 +309,10 @@ const PERMISSIONS = [
|
|
|
305
309
|
{ key: 'session.search', system: false, floor: 'metic', guards: 'GET /sessions/search (ADR 0157, was archon)' },
|
|
306
310
|
{ key: 'memory.read.any', system: false, floor: 'metic', scope: 'any', resource: 'memory', verb: 'read', guards: 'GET /memory/builders/:id/file[s] — cross-builder memory read (ADR 0157, was archon)' },
|
|
307
311
|
{ key: 'audit_log.read', system: false, floor: 'metic', guards: 'GET /audit-log (ADR 0157, was archon)' },
|
|
308
|
-
//
|
|
309
|
-
//
|
|
310
|
-
//
|
|
311
|
-
|
|
312
|
-
{ key: 'gate_approval.read', system: false, floor: 'metic', guards: 'GET /gate-approvals — the Gate page read side (approve = gate_approval.decide, archon)' },
|
|
312
|
+
// RETIRED (task 1004859), with `gate_approval.decide` above: GET /gate-approvals and
|
|
313
|
+
// the held-PR list it fed are gone. Kept for the same reason — grant rows may name it,
|
|
314
|
+
// and removing the key needs a migration that deletes them. It guards nothing.
|
|
315
|
+
{ key: 'gate_approval.read', system: false, floor: 'metic', guards: 'nothing since task 1004859 removed GET /gate-approvals and the held-PR list it fed; the key is retired and awaits a grant-row cleanup' },
|
|
313
316
|
|
|
314
317
|
// ── ownership-scoped + baseline own-work (floor thetes / xenos) ───────────────
|
|
315
318
|
{ key: 'task.claim.any', system: false, floor: 'thetes', guards: 'claim the general queue (per-task requires_rank floor still applies)' },
|
|
@@ -391,7 +394,7 @@ const PERMISSIONS = [
|
|
|
391
394
|
// `requireGovernmentPage`) once the floor moved. Viewing is all this grants: every
|
|
392
395
|
// write those pages reach is its own atom, and `government.manage` (the
|
|
393
396
|
// ranks/permissions tab) stayed archon.
|
|
394
|
-
{ key: 'page.view.government', system: false, floor: 'metic', guards: 'the government/monitoring pages — /watch, /gate, /government (requireGovernmentPage; write = government.manage, archon)' },
|
|
397
|
+
{ key: 'page.view.government', system: false, floor: 'metic', guards: 'the government/monitoring pages — /watch, /gate (the Autobongos panel), /government (requireGovernmentPage; write = government.manage, archon)' },
|
|
395
398
|
];
|
|
396
399
|
|
|
397
400
|
// ── invariants asserted at module load (fail loud on an authoring typo) ─────────
|
|
@@ -246,7 +246,6 @@ const MATTER_ACTIONS = Object.freeze({
|
|
|
246
246
|
}),
|
|
247
247
|
release: Object.freeze({
|
|
248
248
|
approve_override: Object.freeze({ request_id: 'id' }),
|
|
249
|
-
approve_gate: Object.freeze({ pr: 'id' }),
|
|
250
249
|
}),
|
|
251
250
|
review: Object.freeze({
|
|
252
251
|
satisfy_criterion: Object.freeze({ criterion_id: 'id' }),
|
|
@@ -105,7 +105,6 @@ const AREAS = Object.freeze([
|
|
|
105
105
|
]) }),
|
|
106
106
|
Object.freeze({ key: 'release', name: 'Release', gate: 'core.pin.move',
|
|
107
107
|
today: 'whoever may put a release live', acts: Object.freeze([
|
|
108
|
-
'POST /gate-approvals/:pr/approve',
|
|
109
108
|
'POST /override-requests/:id/decide',
|
|
110
109
|
'POST /provisioning/instances/:id/core-upgrade',
|
|
111
110
|
'POST /provisioning/instances/:id/update-channel',
|
|
@@ -108,7 +108,6 @@ const EXPECTED_SOURCES = Object.freeze([
|
|
|
108
108
|
Object.freeze({ source: 'redteam_reports', building: 'disputes', label: 'red-team reports' }),
|
|
109
109
|
Object.freeze({ source: 'criteria_uat', building: 'review', label: 'criteria awaiting UAT' }),
|
|
110
110
|
Object.freeze({ source: 'core_update', building: 'release', label: 'core update' }),
|
|
111
|
-
Object.freeze({ source: 'gate_approvals', building: 'release', label: 'CI gate approvals' }),
|
|
112
111
|
Object.freeze({ source: 'autobongos_fence', building: 'automation', label: 'the Autobongos fence' }),
|
|
113
112
|
Object.freeze({ source: 'module_rechecks', building: 'release', label: 'module re-checks' }),
|
|
114
113
|
// task 1004712: a dry pot's borrow from the reserve, a treasury matter (treasury.js)
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
//
|
|
14
14
|
// THE OUT-OF-BAND SUBSTRATE STAYS THE ENFORCER. Nothing here enforces
|
|
15
15
|
// anything. The enforcers are the git pre-push hook, the grader pre-pass, the
|
|
16
|
-
// post-push main audit
|
|
16
|
+
// post-push main audit and the goal-scope check — they read
|
|
17
17
|
// the registry with no DB, no server and no HTTP, and they are what actually
|
|
18
18
|
// blocks a sub-floor change (ADR 0043). Re-mapping a floor here changes what
|
|
19
19
|
// the substrate protects; it can never make the request path the authority.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"",
|
|
8
8
|
"POLICY OWNS / SUBSTRATE ENFORCES. Editing this file re-maps POLICY. It does NOT move",
|
|
9
9
|
"enforcement into the app: the pre-push git hook, the grader pre-pass, main-audit.js,",
|
|
10
|
-
"
|
|
10
|
+
"and the goal-scope check all read this registry OUT OF BAND (no DB, no",
|
|
11
11
|
"server, no HTTP) and remain the enforcers (ADR 0043). A government-tab edit can widen or",
|
|
12
12
|
"narrow the protected set and re-map a floor; it can never make the request path the",
|
|
13
13
|
"authority.",
|
|
@@ -82,13 +82,12 @@
|
|
|
82
82
|
{ "glob": "scripts/bongos/ship-visual.js", "group": "pipeline", "why": "task 1004024. The 2026-08-23 carve of ship.js (task 1003205): the land path, the ship state machine, the grade gate steps, the merge and pushVia, about 6,200 lines behind a 373-line protected entry point." },
|
|
83
83
|
{ "glob": "scripts/bongos/confirm.js", "group": "pipeline", "why": "the confirm step" },
|
|
84
84
|
{ "glob": "scripts/bongos/merge-mode.js", "group": "pipeline", "why": "the manual land fallback" },
|
|
85
|
-
{ "glob": "scripts/bongos/ci-grade.js", "group": "pipeline", "why": "CI grade-gate driver — steers the grade check (ADR 0058)" },
|
|
86
85
|
{ "glob": "scripts/bongos/grade-smoke.js", "group": "pipeline", "why": "grade-smoke driver (ADR 0058)" },
|
|
87
86
|
{ "glob": "scripts/bongos/conductor-dispatch.js", "group": "pipeline", "why": "mid-flight grader dispatch (ADR 0058)" },
|
|
88
87
|
{ "glob": "scripts/bongos/main-audit.js", "group": "pipeline", "why": "the post-push audit — the authoritative substrate layer (self-protect)" },
|
|
89
88
|
{ "glob": "scripts/bongos/push-main.js", "group": "pipeline", "why": "the sanctioned main-push (carries the override)" },
|
|
90
89
|
{ "glob": "scripts/bongos/run-unit-tests.js", "group": "pipeline", "why": "the unit-gate test SELECTOR — muting tests here blunts the CI gate (ADR 0058)" },
|
|
91
|
-
{ "glob": "scripts/bongos/
|
|
90
|
+
{ "glob": "scripts/bongos/hard-floor.js", "group": "pipeline", "why": "task 1004859. The trust-boundary hard-floor list (self-protect). It moved here from scripts/bongos/gate-review.js when that never-run CI classifier was removed; publish-manifest.js and adopt-preflight.js read it." },
|
|
92
91
|
{ "glob": "scripts/bongos/setup.js", "group": "pipeline", "why": "/builder-setup — installs the pre-push hook" },
|
|
93
92
|
{ "glob": "scripts/bongos/install-git-hooks.js", "group": "pipeline", "why": "the hook installer (self-protect)" },
|
|
94
93
|
{ "glob": "scripts/bongos/hooks/", "group": "pipeline", "why": "the git hooks themselves (self-protect)" },
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
|
|
92
92
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
93
93
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
94
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
94
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
95
95
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
96
96
|
<script src="/builders/palette.js" defer></script>
|
|
97
97
|
<script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
chrome exists before the page script runs. -->
|
|
54
54
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
55
55
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
56
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
56
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
57
57
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
58
58
|
<script src="/builders/palette.js" defer></script>
|
|
59
59
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
62
62
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
63
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
63
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
64
64
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
65
65
|
<script src="/builders/palette.js" defer></script>
|
|
66
66
|
<script src="/builders/dom-utils.js?v=2026-06-16-board"></script>
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
|
|
108
108
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
109
109
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
110
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
110
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
111
111
|
<script src="/builders/palette.js" defer></script>
|
|
112
112
|
<script src="/builders/gov-living.js?v=2026-10-09-positions1"></script>
|
|
113
113
|
<script src="/builders/gov-feeds.js?v=2026-10-09-living3"></script>
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
|
|
151
151
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
152
152
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
153
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
153
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
154
154
|
<script src="/builders/palette.js" defer></script>
|
|
155
155
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
156
156
|
<script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
55
55
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
56
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
56
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
57
57
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
58
58
|
<script src="/builders/palette.js" defer></script>
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
|
|
180
180
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
181
181
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
182
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
182
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
183
183
|
<script src="/builders/palette.js" defer></script>
|
|
184
184
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
185
185
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
|
|
79
79
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
80
80
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
81
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
81
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
82
82
|
<script src="/builders/palette.js" defer></script>
|
|
83
83
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
84
84
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
97
97
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
98
98
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
99
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
99
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
100
100
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
101
101
|
<script src="/builders/palette.js" defer></script>
|
|
102
102
|
<script src="/builders/diagram-viewer.js?v=2026-06-14-diagviewer-1" defer></script>
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
|
|
97
97
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
98
98
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
99
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
99
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
100
100
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
101
101
|
<script src="/builders/palette.js" defer></script>
|
|
102
102
|
<script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
59
59
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
60
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
60
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
61
61
|
<script src="/builders/palette.js" defer></script>
|
|
62
62
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
63
63
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
/* gate.css — Page-local styles for the
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
gate's own: the hold reasons (a hard floor reads in the danger ink), and the
|
|
5
|
-
changed-file run. The ?v= cache-bust is stamped from this file's content hash
|
|
6
|
-
at boot (src/asset-version.js). */
|
|
1
|
+
/* gate.css — Page-local styles for the Autobongos panel, still served at /gate
|
|
2
|
+
(task 1004859 removed the held-PR list that used to share this page). The ?v=
|
|
3
|
+
cache-bust is stamped from this file's content hash at boot (src/asset-version.js). */
|
|
7
4
|
|
|
8
|
-
/*
|
|
9
|
-
floor is the danger ink on the path and a name on the line, never a flag glyph. */
|
|
10
|
-
.gate-reason .ov-key { max-width: 40%; }
|
|
11
|
-
.gate-reason--floor .ov-key { color: var(--danger); }
|
|
12
|
-
.gate-reason__floor { font-family: var(--label-face); font-size: 10.5px; letter-spacing: var(--label-space); text-transform: var(--label-case); color: var(--danger); white-space: nowrap; }
|
|
13
|
-
|
|
14
|
-
/* The changed files: one chip per path, wrapping, the overflow named as a count. */
|
|
15
|
-
.gate-files { display: flex; flex-wrap: wrap; gap: 6px 8px; margin: 12px 0 0; }
|
|
16
|
-
.gate-files .fact-chip { text-transform: none; letter-spacing: normal; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
|
|
17
|
-
.gate-files__more { align-self: center; font-size: 12px; color: var(--ink-faint); }
|
|
18
|
-
|
|
19
|
-
/* On a phone the path takes the line with its floor label at the right, and the
|
|
20
|
-
reason drops under it in full width. */
|
|
21
|
-
@media (max-width: 640px) {
|
|
22
|
-
.gate-reason .ov-key { max-width: none; }
|
|
23
|
-
.gate-reason > span:nth-of-type(2) { flex: 1 1 100%; order: 3; }
|
|
24
|
-
.gate-reason__floor { margin-left: auto; }
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/* The Autobongos runner panel (task 1004509): a status line with the switch,
|
|
5
|
+
/* The runner panel (task 1004509): a status line with the switch,
|
|
28
6
|
a checklist only while something is missing, goals as chips, and the
|
|
29
7
|
machine facts folded under Details. */
|
|
30
8
|
.rn-head { display: flex; align-items: center; gap: 12px; }
|
|
@@ -3,17 +3,16 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>
|
|
7
|
-
<meta name="description" content="
|
|
6
|
+
<title>Autobongos — {{worldName}}</title>
|
|
7
|
+
<meta name="description" content="The Autobongos runner: switch unattended building on or off, choose the goals it may work, and pause any builder's runner.">
|
|
8
8
|
<link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
11
|
<link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
|
|
12
12
|
<link rel="stylesheet" href="/builders/oversight.css">
|
|
13
|
-
<link rel="stylesheet" href="/builders/hall-ask.css">
|
|
14
13
|
<link rel="stylesheet" href="/builders/gate.css">
|
|
15
14
|
</head>
|
|
16
|
-
<body data-page="gate" data-page-title="
|
|
15
|
+
<body data-page="gate" data-page-title="Autobongos">
|
|
17
16
|
|
|
18
17
|
<div class="app">
|
|
19
18
|
<aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
|
|
@@ -24,7 +23,7 @@
|
|
|
24
23
|
<!-- The page's one h1, for screen readers: no page shows its head (task
|
|
25
24
|
1004836), so its sub-line went in task 1004829. -->
|
|
26
25
|
<div class="page-head page-head--board">
|
|
27
|
-
<h1 class="page-head__h">
|
|
26
|
+
<h1 class="page-head__h">Autobongos</h1>
|
|
28
27
|
</div>
|
|
29
28
|
|
|
30
29
|
<main id="hall-main">
|
|
@@ -37,17 +36,12 @@
|
|
|
37
36
|
</section>
|
|
38
37
|
|
|
39
38
|
<section id="gate-body" hidden>
|
|
40
|
-
<!-- The
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
page because the Gate is already the owner's protected-surface
|
|
47
|
-
surface, and because the switch and the held PRs answer the same
|
|
48
|
-
question from two ends: what is allowed to reach main unattended.
|
|
49
|
-
Archon-only — the panel stays hidden for a Metic, and the routes
|
|
50
|
-
behind it are system:true/archon server-side regardless. -->
|
|
39
|
+
<!-- The Autobongos fence (task 1003908, ADR 0307 §6): what is allowed to
|
|
40
|
+
reach main unattended. This page held the held-PR list too until task
|
|
41
|
+
1004859 removed it; the URL stays /gate so bookmarks keep working.
|
|
42
|
+
Archon-only — a Metic gets the note below instead, and the routes
|
|
43
|
+
behind the panel are system:true/archon server-side regardless. -->
|
|
44
|
+
<p class="scroll__lede" id="gate-archon-only" hidden></p>
|
|
51
45
|
<section class="scroll" id="fence-panel" aria-labelledby="fence-h" hidden>
|
|
52
46
|
<h2 class="scroll__h" id="fence-h">Autobongos runner</h2>
|
|
53
47
|
<!-- One panel (task 1004509): a checklist while anything the runner
|
|
@@ -58,13 +52,6 @@
|
|
|
58
52
|
work, whether you paused it, and whether it is checking in. -->
|
|
59
53
|
<div id="fence-builders"></div>
|
|
60
54
|
</section>
|
|
61
|
-
|
|
62
|
-
<section class="scroll" aria-labelledby="gate-list-h">
|
|
63
|
-
<h2 class="scroll__h" id="gate-list-h">Held pull requests</h2>
|
|
64
|
-
<p class="scroll__lede">Each one touched a protected surface and stopped at the gate check.</p>
|
|
65
|
-
<div id="gate-list"><span class="kit-skel"></span></div>
|
|
66
|
-
<p class="ov-foot" id="gate-checking" hidden></p>
|
|
67
|
-
</section>
|
|
68
55
|
</section>
|
|
69
56
|
</main>
|
|
70
57
|
|
|
@@ -77,13 +64,11 @@
|
|
|
77
64
|
|
|
78
65
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
79
66
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
80
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
67
|
+
<script src="/builders/shell.js?v=2026-10-25-autobongos"></script>
|
|
81
68
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
82
69
|
<script src="/builders/palette.js" defer></script>
|
|
83
70
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
84
71
|
<script src="/builders/hall-kit.js"></script>
|
|
85
|
-
|
|
86
|
-
<script src="/builders/hall-ask.js"></script>
|
|
87
|
-
<script src="/builders/gate.js?v=2026-10-01-runner-checklist"></script>
|
|
72
|
+
<script src="/builders/gate.js?v=2026-10-25-autobongos"></script>
|
|
88
73
|
</body>
|
|
89
74
|
</html>
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
// public-builders/gate.js —
|
|
1
|
+
// public-builders/gate.js — Autobongos, the owner's runner panel (/builders/gate).
|
|
2
2
|
//
|
|
3
|
-
// The
|
|
4
|
-
//
|
|
5
|
-
// gate-
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// gate-owner-approved status) and re-runs the check so the PR merges. It is the
|
|
9
|
-
// page's one real decision, so a held PR is the hall's ask card (task 1004829) —
|
|
10
|
-
// drawn only for a viewer the approve route would let through.
|
|
3
|
+
// The page is still served at /gate so bookmarks keep working, but it no longer
|
|
4
|
+
// holds pull requests: task 1004859 removed the held-PR list (and GET/POST
|
|
5
|
+
// /gate-approvals behind it), because the gate-review CI check it waited on never
|
|
6
|
+
// ran. The owner chose to keep the page for what else it held — the Autobongos
|
|
7
|
+
// fence: the switch, the allowed goals, the priority, each builder's runner.
|
|
11
8
|
//
|
|
12
|
-
// Like The Watch, this reads /api/bongos/me to show a Sealed notice for
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
9
|
+
// Like The Watch, this reads /api/bongos/me to show a Sealed notice for a viewer
|
|
10
|
+
// the panel is not for — DEFENCE IN DEPTH only. Every route behind the panel is
|
|
11
|
+
// gated server-side (ADR 0016), and the page itself is gated by
|
|
12
|
+
// requireGovernmentPage. On 401 → web sign-in.
|
|
16
13
|
|
|
17
14
|
(() => {
|
|
18
15
|
'use strict';
|
|
@@ -22,7 +19,7 @@
|
|
|
22
19
|
// /lib/bongos-client.js. baseUrl:'' passes the full `${API}${path}` URLs below
|
|
23
20
|
// through unchanged; result-mode ({ status, ok, data }) preserves control flow 1:1.
|
|
24
21
|
const api = window.BongosClient.createClient({ baseUrl: '', credentials: 'same-origin', throwOnError: false });
|
|
25
|
-
const { escapeHtml
|
|
22
|
+
const { escapeHtml } = window.OTB;
|
|
26
23
|
const { emptyStateHtml } = window.OTBKit;
|
|
27
24
|
const rankLabel = (rank) => window.OTB.rankLabel(rank, { empty: '' });
|
|
28
25
|
const toast = (msg) => window.OTB.toast(msg);
|
|
@@ -60,157 +57,6 @@
|
|
|
60
57
|
return `${path} → ${status}`;
|
|
61
58
|
}
|
|
62
59
|
|
|
63
|
-
// ---- formatters ----------------------------------------------------------
|
|
64
|
-
|
|
65
|
-
const shortSha = (s) => (typeof s === 'string' ? s.slice(0, 7) : '');
|
|
66
|
-
const VERDICT_LABEL = { escalate: 'Hard floor', needs_trust: 'Needs trust', pass: 'Clear' };
|
|
67
|
-
const verdictLabel = (v) => VERDICT_LABEL[v] || (v || 'held');
|
|
68
|
-
// How many files a row shows before it names the rest as a count.
|
|
69
|
-
const FILES_SHOWN = 12;
|
|
70
|
-
|
|
71
|
-
// ---- actions -------------------------------------------------------------
|
|
72
|
-
|
|
73
|
-
// The card IS the confirmation (task 1004829): its question names the PR and
|
|
74
|
-
// its answer's result line says what approving does, so the old modal that
|
|
75
|
-
// repeated both is gone. A failed press gives the chip back.
|
|
76
|
-
async function approve(pr, btn) {
|
|
77
|
-
if (btn) btn.disabled = true;
|
|
78
|
-
try {
|
|
79
|
-
const r = await sendJson('POST', `/gate-approvals/${pr.number}/approve`, {});
|
|
80
|
-
toast(r.message || 'Approval recorded.');
|
|
81
|
-
load();
|
|
82
|
-
} catch (err) {
|
|
83
|
-
if (err && err.kind === '401') return;
|
|
84
|
-
if (btn) btn.disabled = false;
|
|
85
|
-
toast(`Could not approve: ${err.message || err}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ---- render --------------------------------------------------------------
|
|
90
|
-
|
|
91
|
-
// One held PR, one oversight row (oversight.css .ov-row). This is the page
|
|
92
|
-
// that shows the most facts in the hall — title, verdict, trust, task, PR,
|
|
93
|
-
// author, sha, diff, every hold reason and the changed files — and every one
|
|
94
|
-
// of them survives the rebuild: the verdict is a state pill instead of a band,
|
|
95
|
-
// the reasons are hairline detail lines, the files are chips.
|
|
96
|
-
function renderRow(pr, mayApprove) {
|
|
97
|
-
const floor = pr.verdict !== 'needs_trust';
|
|
98
|
-
const reasons = (pr.reasons || []).map((r) =>
|
|
99
|
-
`<li class="gate-reason${r.hard_floor ? ' gate-reason--floor' : ''}">` +
|
|
100
|
-
`<span class="ov-key">${escapeHtml(r.path)}</span>` +
|
|
101
|
-
`<span>${escapeHtml(r.reason)}</span>` +
|
|
102
|
-
(r.hard_floor ? '<span class="gate-reason__floor">hard floor</span>' : '') +
|
|
103
|
-
'</li>').join('')
|
|
104
|
-
|| '<li><span>Held by the gate check.</span></li>';
|
|
105
|
-
|
|
106
|
-
const files = pr.files || [];
|
|
107
|
-
const chips = files.slice(0, FILES_SHOWN).map((f) =>
|
|
108
|
-
`<span class="fact-chip" title="${escapeHtml(f.path)}">${escapeHtml(f.path)}</span>`).join('');
|
|
109
|
-
const more = files.length > FILES_SHOWN ? `<span class="gate-files__more">+${files.length - FILES_SHOWN} more</span>` : '';
|
|
110
|
-
const filesHtml = files.length
|
|
111
|
-
? `<div class="gate-files" aria-label="Changed files"><span class="ov-fact">${fmtInt(files.length)} file${files.length === 1 ? '' : 's'}</span>${chips}${more}</div>`
|
|
112
|
-
: '';
|
|
113
|
-
|
|
114
|
-
const facts = [
|
|
115
|
-
`<span class="fact-pill fact-pill--${floor ? 'danger' : 'warn'}">${escapeHtml(verdictLabel(pr.verdict))}</span>`,
|
|
116
|
-
pr.author_trusted ? '<span class="fact-pill fact-pill--info">author trusted</span>' : '',
|
|
117
|
-
pr.task ? `<span class="ov-fact"><a href="/#/task/${encodeURIComponent(pr.task)}">task ${escapeHtml(String(pr.task))}</a></span>` : '',
|
|
118
|
-
`<span class="ov-fact">by <b>${escapeHtml(pr.author || 'unknown')}</b></span>`,
|
|
119
|
-
`<span class="ov-mono">${escapeHtml(shortSha(pr.head_sha))}</span>`,
|
|
120
|
-
`<span class="ov-fact"><a href="${escapeHtml(pr.url)}/files" target="_blank" rel="noopener">view diff</a></span>`,
|
|
121
|
-
].filter(Boolean).join('');
|
|
122
|
-
|
|
123
|
-
const title = `<a class="ov-row__title" href="${escapeHtml(pr.url)}" target="_blank" rel="noopener">${escapeHtml(pr.title || `PR #${pr.number}`)}<span class="ov-mono">#${escapeHtml(String(pr.number))}</span></a>`;
|
|
124
|
-
const detail = `<div class="ov-row__facts">${facts}</div>
|
|
125
|
-
<ul class="ov-lines">${reasons}</ul>
|
|
126
|
-
${filesHtml}`;
|
|
127
|
-
|
|
128
|
-
// The decision, as the ask card — only where the server said this viewer's
|
|
129
|
-
// approval would be let through (`viewer_may_approve`: the approve route's
|
|
130
|
-
// permission AND the release building's act-alone rule). Everyone else reads
|
|
131
|
-
// the same facts as a plain row.
|
|
132
|
-
if (mayApprove && !pr.already_approved && window.OTBAsk) {
|
|
133
|
-
const holder = document.createElement('ul');
|
|
134
|
-
holder.innerHTML = window.OTBAsk.html({
|
|
135
|
-
q: `Let PR #${pr.number} through?`,
|
|
136
|
-
saidHtml: title + detail,
|
|
137
|
-
row: true,
|
|
138
|
-
opts: [{
|
|
139
|
-
label: 'Approve',
|
|
140
|
-
result: `Clears the hold on ${shortSha(pr.head_sha)}; it merges once the check passes`,
|
|
141
|
-
rec: true,
|
|
142
|
-
attrs: { 'data-act': 'approve' },
|
|
143
|
-
}],
|
|
144
|
-
});
|
|
145
|
-
const card = holder.firstElementChild;
|
|
146
|
-
const btn = card.querySelector('[data-act=approve]');
|
|
147
|
-
if (btn) btn.addEventListener('click', () => approve(pr, btn));
|
|
148
|
-
return card;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const action = pr.already_approved
|
|
152
|
-
? '<span class="ov-fact ov-ok">Approved. Re-check pending.</span>'
|
|
153
|
-
: '<span class="ov-fact">Waiting for approval</span>';
|
|
154
|
-
|
|
155
|
-
const el = document.createElement('li');
|
|
156
|
-
el.className = 'ov-row';
|
|
157
|
-
el.innerHTML =
|
|
158
|
-
`<div class="ov-row__main">
|
|
159
|
-
${title}
|
|
160
|
-
${detail}
|
|
161
|
-
</div>
|
|
162
|
-
<div class="ov-row__right">${action}</div>`;
|
|
163
|
-
return el;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// The glass strip above the panel: the shell's .stat-row, each tile a figure
|
|
167
|
-
// with the one clause that makes it a fact rather than a number.
|
|
168
|
-
function renderSummary(awaiting) {
|
|
169
|
-
const floors = awaiting.filter((p) => p.verdict === 'escalate').length;
|
|
170
|
-
const trust = awaiting.filter((p) => p.verdict === 'needs_trust').length;
|
|
171
|
-
const tiles = [
|
|
172
|
-
['Held', fmtInt(awaiting.length), 'at the gate check'],
|
|
173
|
-
['Hard floor', fmtInt(floors), 'only an owner may clear'],
|
|
174
|
-
['Needs trust', fmtInt(trust), 'an author not yet trusted'],
|
|
175
|
-
];
|
|
176
|
-
document.getElementById('gate-summary').innerHTML = tiles.map(([label, num, sub]) =>
|
|
177
|
-
`<div class="stat-tile"><span class="stat-tile__label">${escapeHtml(label)}</span><span class="stat-tile__num">${num}</span><span class="stat-tile__sub">${escapeHtml(sub)}</span></div>`).join('');
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
async function load() {
|
|
181
|
-
const list = document.getElementById('gate-list');
|
|
182
|
-
const checkingEl = document.getElementById('gate-checking');
|
|
183
|
-
let resp;
|
|
184
|
-
try {
|
|
185
|
-
resp = await fetchJson('/gate-approvals');
|
|
186
|
-
} catch (err) {
|
|
187
|
-
if (err && err.kind === '401') return;
|
|
188
|
-
if (err && err.kind === '403') { showSealed(); return; }
|
|
189
|
-
list.innerHTML = emptyStateHtml('Could not load held pull requests just now.');
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const awaiting = resp.awaiting || [];
|
|
194
|
-
renderSummary(awaiting);
|
|
195
|
-
|
|
196
|
-
if (awaiting.length === 0) {
|
|
197
|
-
list.innerHTML = emptyStateHtml('Nothing is held.');
|
|
198
|
-
} else {
|
|
199
|
-
list.innerHTML = '';
|
|
200
|
-
const rows = document.createElement('ul');
|
|
201
|
-
rows.className = 'ov-rows';
|
|
202
|
-
for (const pr of awaiting) rows.appendChild(renderRow(pr, resp.viewer_may_approve === true));
|
|
203
|
-
list.appendChild(rows);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
if (resp.checking > 0) {
|
|
207
|
-
checkingEl.hidden = false;
|
|
208
|
-
checkingEl.textContent = `${resp.checking} more PR${resp.checking === 1 ? ' is' : 's are'} still being checked.`;
|
|
209
|
-
} else {
|
|
210
|
-
checkingEl.hidden = true;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
60
|
function showSealed() {
|
|
215
61
|
document.getElementById('gate-sealed').hidden = false;
|
|
216
62
|
document.getElementById('gate-body').hidden = true;
|
|
@@ -219,12 +65,18 @@
|
|
|
219
65
|
if (body) body.textContent = `Available from the ${rankLabel('metic')} rank up.`;
|
|
220
66
|
}
|
|
221
67
|
|
|
68
|
+
// A Metic is admitted to the page (page.view.government) but the runner controls
|
|
69
|
+
// are the Archon's (autonomy.fence.manage). Say so rather than draw an empty page.
|
|
70
|
+
function showArchonOnly() {
|
|
71
|
+
const note = document.getElementById('gate-archon-only');
|
|
72
|
+
note.hidden = false;
|
|
73
|
+
note.textContent = `The Autobongos controls are for the ${rankLabel('archon')}.`;
|
|
74
|
+
}
|
|
75
|
+
|
|
222
76
|
// ---- the Autobongos fence (task 1003908, ADR 0307 §6) --------------------
|
|
223
77
|
//
|
|
224
|
-
// The kill switch and the goal allowlist for the unattended runner
|
|
225
|
-
//
|
|
226
|
-
// a person in the loop; the held-PR list and this panel are the same question
|
|
227
|
-
// from two ends.
|
|
78
|
+
// The kill switch and the goal allowlist for the unattended runner — what may
|
|
79
|
+
// reach main without a person in the loop.
|
|
228
80
|
//
|
|
229
81
|
// ARCHON ONLY, and the panel simply is not rendered for anyone else. That is
|
|
230
82
|
// cosmetic: POST /autonomy/fence and the two allowlist routes carry
|
|
@@ -585,19 +437,17 @@
|
|
|
585
437
|
me = null;
|
|
586
438
|
}
|
|
587
439
|
const rank = (me && (me.builder || me).rank || '').toLowerCase();
|
|
588
|
-
// ADR 0157:
|
|
440
|
+
// ADR 0157: this page sits at the `page.view.government` floor (metic). The
|
|
589
441
|
// server's requireGovernmentPage is the wall — this only decides whether to render the
|
|
590
442
|
// body or the sealed notice, so it must agree or a Metic sees "sealed" on a page
|
|
591
443
|
// they were just admitted to.
|
|
592
444
|
if (rank !== 'metic' && rank !== 'archon') { showSealed(); return; }
|
|
593
445
|
|
|
594
446
|
document.getElementById('gate-body').hidden = false;
|
|
595
|
-
if (rank
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
}
|
|
600
|
-
await load();
|
|
447
|
+
if (rank !== 'archon') { showArchonOnly(); return; }
|
|
448
|
+
document.getElementById('fence-panel').hidden = false;
|
|
449
|
+
// Independent reads, so one round trip rather than three.
|
|
450
|
+
await Promise.all([loadRunners(), loadFence(), loadBuilderRunners()]);
|
|
601
451
|
}
|
|
602
452
|
|
|
603
453
|
init();
|