@bongos/core 1.19.183 → 1.19.185
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 +102 -92
- package/clients/bongos-client/bongos-client.global.js +19 -19
- package/clients/bongos-client/index.cjs +19 -19
- package/clients/bongos-client/index.d.ts +29 -29
- package/clients/bongos-client/index.mjs +19 -19
- package/docs/adr/0157-archon-is-rank-and-identity-only.md +2 -2
- package/docs/api/openapi.json +117 -117
- package/docs/api-reference.md +10 -10
- package/docs/canonical-permissions.md +6 -6
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +19 -19
- package/modules/{governance → government}/catalog.js +8 -8
- package/modules/{governance → government}/config.js +6 -6
- package/modules/{governance → government}/db.js +44 -44
- package/modules/government/migrations/government_001_rename_from_governance.sql +213 -0
- package/modules/government/migrations/government_002_rename_permission_keys.sql +112 -0
- package/modules/government/module.json +22 -0
- package/modules/{governance → government}/protected-surfaces.json +0 -1
- package/modules/{governance/rank-roles.js → government/ranks.js} +18 -18
- package/modules/{governance/routes/governance.js → government/routes/government.js} +109 -84
- package/modules/{governance/routes/role-sync.js → government/routes/rank-sync.js} +7 -7
- package/modules/hall-ui/public/gate.js +1 -1
- package/modules/hall-ui/public/governance.js +38 -38
- package/modules/hall-ui/public/harbor.js +2 -2
- package/modules/hall-ui/public/shell.js +3 -3
- package/modules/hall-ui/public/watch.js +1 -1
- package/modules/lifecycle/db.js +6 -6
- package/modules/lifecycle/routes/gate-approvals.js +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/fitness.js +11 -1
- package/scripts/gds/migration-namespace.js +15 -3
- package/scripts/gds/publish-manifest.js +2 -3
- package/scripts/gds/seed-governance-tasks.js +3 -3
- package/src/bongos/auth.js +16 -16
- package/src/bongos/db.js +6 -6
- package/src/bongos/module-scope-map.js +7 -22
- package/src/bongos/permission-path-check.js +3 -3
- package/src/bongos/route-rank-check.js +15 -21
- package/src/bongos/serve-internal.js +2 -2
- package/src/module-api.js +7 -3
- package/tests/auth_page_gate.mjs +2 -2
- package/tests/criterion_authoring_gate.mjs +1 -1
- package/tests/governance_abuse_matrix.mjs +38 -38
- package/tests/governance_catalog.mjs +4 -4
- package/tests/governance_claim_eligibility.mjs +1 -1
- package/tests/governance_config.mjs +7 -7
- package/tests/governance_fold.mjs +4 -4
- package/tests/governance_fold_bench.mjs +2 -2
- package/tests/governance_live_proof.mjs +6 -6
- package/tests/governance_ownership_scope.mjs +2 -2
- package/tests/governance_page_gates.mjs +10 -10
- package/tests/governance_parity.mjs +3 -3
- package/tests/governance_principals.mjs +3 -3
- package/tests/governance_protected_surfaces.mjs +44 -19
- package/tests/governance_require_permission.mjs +11 -11
- package/tests/governance_resolver.mjs +4 -4
- package/tests/governance_role_sync.mjs +35 -35
- package/tests/governance_routes.mjs +98 -98
- package/tests/governance_seed.mjs +27 -4
- package/tests/governance_session_scope.mjs +5 -5
- package/tests/governance_vanilla_boot.mjs +4 -4
- package/tests/hall_page_gate_map.mjs +3 -3
- package/tests/memory_isolation.mjs +2 -2
- package/tests/module_loader.mjs +1 -1
- package/tests/onboarding_observability.mjs +2 -2
- package/tests/rank_tier_single_source.mjs +2 -2
- package/tests/route_permission_check.mjs +2 -2
- package/modules/governance/module.json +0 -11
- /package/config/{governance.neutral.json → government.neutral.json} +0 -0
- /package/modules/{governance → government}/CLAUDE.md +0 -0
- /package/modules/{governance → government}/migrations/governance_001_tables.sql +0 -0
- /package/modules/{governance → government}/migrations/governance_002_seed_and_backfill.sql +0 -0
- /package/modules/{governance → government}/migrations/governance_003_task_abandon_metic.sql +0 -0
- /package/modules/{governance → government}/migrations/governance_004_criterion_create.sql +0 -0
- /package/modules/{governance → government}/migrations/governance_005_resync_builder_rank_roles.sql +0 -0
- /package/modules/{governance → government}/migrations/governance_006_version_create.sql +0 -0
- /package/modules/{governance → government}/migrations/governance_007_delegate_archon_ops_to_metic.sql +0 -0
- /package/modules/{governance → government}/protected-surfaces.js +0 -0
- /package/modules/{governance → government}/resolver.js +0 -0
- /package/modules/{governance → government}/session-scopes.js +0 -0
- /package/modules/{governance → government}/session-scopes.json +0 -0
|
@@ -338,25 +338,25 @@ function createClient(opts = {}) {
|
|
|
338
338
|
// POST /goals/reorder — rank: metic+archon — POST /goals/reorder
|
|
339
339
|
postGoalsReorder: (args) => request("POST", "/goals/reorder", { hasBody: true }, args),
|
|
340
340
|
},
|
|
341
|
-
"
|
|
342
|
-
// GET /
|
|
343
|
-
|
|
344
|
-
// POST /
|
|
345
|
-
|
|
346
|
-
// DELETE /
|
|
347
|
-
|
|
348
|
-
// GET /
|
|
349
|
-
|
|
350
|
-
// GET /
|
|
351
|
-
|
|
352
|
-
// POST /
|
|
353
|
-
|
|
354
|
-
// DELETE /
|
|
355
|
-
|
|
356
|
-
// PUT /
|
|
357
|
-
|
|
358
|
-
// POST /
|
|
359
|
-
|
|
341
|
+
"government": {
|
|
342
|
+
// GET /government/assignments — rank: archon — GET /government/assignments
|
|
343
|
+
getGovernmentAssignments: (args) => request("GET", "/government/assignments", { hasBody: false }, args),
|
|
344
|
+
// POST /government/assignments — rank: archon — POST /government/assignments
|
|
345
|
+
postGovernmentAssignments: (args) => request("POST", "/government/assignments", { hasBody: true }, args),
|
|
346
|
+
// DELETE /government/assignments/{builderId}/{rankKey} — rank: archon — DELETE /government/assignments/:builderId/:rankKey
|
|
347
|
+
deleteGovernmentAssignmentsBuilderIdRankKey: (args) => request("DELETE", "/government/assignments/{builderId}/{rankKey}", { hasBody: false }, args),
|
|
348
|
+
// GET /government/permissions — rank: archon — GET /government/permissions
|
|
349
|
+
getGovernmentPermissions: (args) => request("GET", "/government/permissions", { hasBody: false }, args),
|
|
350
|
+
// GET /government/ranks — rank: archon — GET /government/ranks
|
|
351
|
+
getGovernmentRanks: (args) => request("GET", "/government/ranks", { hasBody: false }, args),
|
|
352
|
+
// POST /government/ranks — rank: archon — POST /government/ranks
|
|
353
|
+
postGovernmentRanks: (args) => request("POST", "/government/ranks", { hasBody: true }, args),
|
|
354
|
+
// DELETE /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon — DELETE /government/ranks/:rankKey/permissions/:permissionKey
|
|
355
|
+
deleteGovernmentRanksRankKeyPermissionsPermissionKey: (args) => request("DELETE", "/government/ranks/{rankKey}/permissions/{permissionKey}", { hasBody: false }, args),
|
|
356
|
+
// PUT /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon — PUT /government/ranks/:rankKey/permissions/:permissionKey
|
|
357
|
+
putGovernmentRanksRankKeyPermissionsPermissionKey: (args) => request("PUT", "/government/ranks/{rankKey}/permissions/{permissionKey}", { hasBody: true }, args),
|
|
358
|
+
// POST /government/ranks/{rankKey}/reset — rank: archon — POST /government/ranks/:rankKey/reset
|
|
359
|
+
postGovernmentRanksRankKeyReset: (args) => request("POST", "/government/ranks/{rankKey}/reset", { hasBody: true }, args),
|
|
360
360
|
},
|
|
361
361
|
"grades": {
|
|
362
362
|
// GET /grades/by-builder — rank: metic+archon — GET /grades/by-builder
|
|
@@ -337,25 +337,25 @@ function createClient(opts = {}) {
|
|
|
337
337
|
// POST /goals/reorder — rank: metic+archon — POST /goals/reorder
|
|
338
338
|
postGoalsReorder: (args) => request("POST", "/goals/reorder", { hasBody: true }, args),
|
|
339
339
|
},
|
|
340
|
-
"
|
|
341
|
-
// GET /
|
|
342
|
-
|
|
343
|
-
// POST /
|
|
344
|
-
|
|
345
|
-
// DELETE /
|
|
346
|
-
|
|
347
|
-
// GET /
|
|
348
|
-
|
|
349
|
-
// GET /
|
|
350
|
-
|
|
351
|
-
// POST /
|
|
352
|
-
|
|
353
|
-
// DELETE /
|
|
354
|
-
|
|
355
|
-
// PUT /
|
|
356
|
-
|
|
357
|
-
// POST /
|
|
358
|
-
|
|
340
|
+
"government": {
|
|
341
|
+
// GET /government/assignments — rank: archon — GET /government/assignments
|
|
342
|
+
getGovernmentAssignments: (args) => request("GET", "/government/assignments", { hasBody: false }, args),
|
|
343
|
+
// POST /government/assignments — rank: archon — POST /government/assignments
|
|
344
|
+
postGovernmentAssignments: (args) => request("POST", "/government/assignments", { hasBody: true }, args),
|
|
345
|
+
// DELETE /government/assignments/{builderId}/{rankKey} — rank: archon — DELETE /government/assignments/:builderId/:rankKey
|
|
346
|
+
deleteGovernmentAssignmentsBuilderIdRankKey: (args) => request("DELETE", "/government/assignments/{builderId}/{rankKey}", { hasBody: false }, args),
|
|
347
|
+
// GET /government/permissions — rank: archon — GET /government/permissions
|
|
348
|
+
getGovernmentPermissions: (args) => request("GET", "/government/permissions", { hasBody: false }, args),
|
|
349
|
+
// GET /government/ranks — rank: archon — GET /government/ranks
|
|
350
|
+
getGovernmentRanks: (args) => request("GET", "/government/ranks", { hasBody: false }, args),
|
|
351
|
+
// POST /government/ranks — rank: archon — POST /government/ranks
|
|
352
|
+
postGovernmentRanks: (args) => request("POST", "/government/ranks", { hasBody: true }, args),
|
|
353
|
+
// DELETE /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon — DELETE /government/ranks/:rankKey/permissions/:permissionKey
|
|
354
|
+
deleteGovernmentRanksRankKeyPermissionsPermissionKey: (args) => request("DELETE", "/government/ranks/{rankKey}/permissions/{permissionKey}", { hasBody: false }, args),
|
|
355
|
+
// PUT /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon — PUT /government/ranks/:rankKey/permissions/:permissionKey
|
|
356
|
+
putGovernmentRanksRankKeyPermissionsPermissionKey: (args) => request("PUT", "/government/ranks/{rankKey}/permissions/{permissionKey}", { hasBody: true }, args),
|
|
357
|
+
// POST /government/ranks/{rankKey}/reset — rank: archon — POST /government/ranks/:rankKey/reset
|
|
358
|
+
postGovernmentRanksRankKeyReset: (args) => request("POST", "/government/ranks/{rankKey}/reset", { hasBody: true }, args),
|
|
359
359
|
},
|
|
360
360
|
"grades": {
|
|
361
361
|
// GET /grades/by-builder — rank: metic+archon — GET /grades/by-builder
|
|
@@ -7,8 +7,8 @@ export declare const DEFAULT_BASE_URL: string;
|
|
|
7
7
|
export interface ApiErrorObject { code: string; message: string; details?: unknown }
|
|
8
8
|
export interface DeleteBoxSshKeyIdResponse { ok: boolean; deleted: unknown }
|
|
9
9
|
export interface DeleteDependenciesResponse { ok: boolean }
|
|
10
|
-
export interface
|
|
11
|
-
export interface
|
|
10
|
+
export interface DeleteGovernmentAssignmentsBuilderIdRankKeyResponse { ok: boolean; builder_id: unknown; rank_key: unknown; removed: unknown }
|
|
11
|
+
export interface DeleteGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; removed: unknown }
|
|
12
12
|
export interface DeleteMemoryFileResponse { deleted: boolean; builder_id: unknown; path: unknown }
|
|
13
13
|
export interface DeleteTasksIdCriteriaCriterionIdResponse { ok: boolean; removed: unknown }
|
|
14
14
|
export interface DeleteTasksIdDependenciesDepIdResponse { ok: boolean; removed: unknown }
|
|
@@ -41,9 +41,9 @@ export interface GetGoalsIdRequestsResponse { requests: unknown }
|
|
|
41
41
|
export interface GetGoalsIdResponse { goal: unknown; members: unknown; criteria: unknown; dependencies: unknown }
|
|
42
42
|
export interface GetGoalsIdSuggestCriteriaResponse { goal_id: unknown; suggestions: unknown }
|
|
43
43
|
export interface GetGoalsResponse { goals: unknown }
|
|
44
|
-
export interface
|
|
45
|
-
export interface
|
|
46
|
-
export interface
|
|
44
|
+
export interface GetGovernmentAssignmentsResponse { assignments: unknown }
|
|
45
|
+
export interface GetGovernmentPermissionsResponse { permissions: unknown; principals: unknown }
|
|
46
|
+
export interface GetGovernmentRanksResponse { roles: unknown }
|
|
47
47
|
export interface GetGradesByBuilderResponse { window_days: unknown; builders: unknown }
|
|
48
48
|
export interface GetHealthzResponse { ok: boolean; auth_configured: unknown }
|
|
49
49
|
export interface GetInboxIdResponse { idea: unknown }
|
|
@@ -225,10 +225,10 @@ export interface PostGoalsReorderRequest { version_id: string; ordered_ids: numb
|
|
|
225
225
|
export interface PostGoalsReorderResponse { ok: boolean; goals: unknown }
|
|
226
226
|
export interface PostGoalsRequest { version_id: string; title: string; description?: string; scope_modules?: string[]; succeeds_goal_id?: number }
|
|
227
227
|
export interface PostGoalsResponse { ok: boolean; goal: unknown; succeeds_goal_id: unknown }
|
|
228
|
-
export interface
|
|
229
|
-
export interface
|
|
230
|
-
export interface
|
|
231
|
-
export interface
|
|
228
|
+
export interface PostGovernmentAssignmentsRequest { builder_id: number; rank_key: string }
|
|
229
|
+
export interface PostGovernmentRanksRankKeyResetResponse { ok: boolean; rank_key: unknown; seeded_rank: unknown; permission_count: unknown }
|
|
230
|
+
export interface PostGovernmentRanksRequest { rank_key: string; label: string; description?: string }
|
|
231
|
+
export interface PostGovernmentRanksResponse { role: unknown }
|
|
232
232
|
export interface PostInboxIdRatifyRequest { notes_md?: string }
|
|
233
233
|
export interface PostInboxRequest { title: string; body_md?: string; kind?: string; suggested_version?: string; suggested_priority?: number; grade?: string; template_key?: string; field_values?: Record<string, unknown> }
|
|
234
234
|
export interface PostLearningsRequest { title: string; body_md: string; tags?: string[]; related_files?: string[]; source?: string; source_ref?: string; task_id?: number }
|
|
@@ -311,7 +311,7 @@ export interface PostVersionsIdDoneWhenRequest { criterion_id: string; criterion
|
|
|
311
311
|
export interface PostVersionsIdDoneWhenResponse { ok: boolean; criterion: unknown }
|
|
312
312
|
export interface PostVersionsRequest { id: string; name: string; status?: string; track?: string; done_when?: string; scope_doc_path?: string; criteria?: unknown[] }
|
|
313
313
|
export interface PostVersionsResponse { version: unknown; criteria: unknown }
|
|
314
|
-
export interface
|
|
314
|
+
export interface PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse { ok: boolean; rank_key: unknown; permission_key: unknown; granted: unknown }
|
|
315
315
|
export interface PutTasksIdDependenciesRequest { depends_on_task_ids: unknown[] }
|
|
316
316
|
export interface PutTasksIdDependenciesResponse { ok: boolean; written: unknown; dependencies: unknown }
|
|
317
317
|
export type StringifiableId = number | string;
|
|
@@ -582,25 +582,25 @@ export interface BongosClient {
|
|
|
582
582
|
/** POST /goals/reorder — rank: metic+archon */
|
|
583
583
|
postGoalsReorder(args: RequestArgs & { body: PostGoalsReorderRequest }): Promise<PostGoalsReorderResponse>;
|
|
584
584
|
};
|
|
585
|
-
"
|
|
586
|
-
/** GET /
|
|
587
|
-
|
|
588
|
-
/** POST /
|
|
589
|
-
|
|
590
|
-
/** DELETE /
|
|
591
|
-
|
|
592
|
-
/** GET /
|
|
593
|
-
|
|
594
|
-
/** GET /
|
|
595
|
-
|
|
596
|
-
/** POST /
|
|
597
|
-
|
|
598
|
-
/** DELETE /
|
|
599
|
-
|
|
600
|
-
/** PUT /
|
|
601
|
-
|
|
602
|
-
/** POST /
|
|
603
|
-
|
|
585
|
+
"government": {
|
|
586
|
+
/** GET /government/assignments — rank: archon */
|
|
587
|
+
getGovernmentAssignments(args?: RequestArgs): Promise<GetGovernmentAssignmentsResponse>;
|
|
588
|
+
/** POST /government/assignments — rank: archon */
|
|
589
|
+
postGovernmentAssignments(args: RequestArgs & { body: PostGovernmentAssignmentsRequest }): Promise<ApiResponse>;
|
|
590
|
+
/** DELETE /government/assignments/{builderId}/{rankKey} — rank: archon */
|
|
591
|
+
deleteGovernmentAssignmentsBuilderIdRankKey(args?: RequestArgs): Promise<DeleteGovernmentAssignmentsBuilderIdRankKeyResponse>;
|
|
592
|
+
/** GET /government/permissions — rank: archon */
|
|
593
|
+
getGovernmentPermissions(args?: RequestArgs): Promise<GetGovernmentPermissionsResponse>;
|
|
594
|
+
/** GET /government/ranks — rank: archon */
|
|
595
|
+
getGovernmentRanks(args?: RequestArgs): Promise<GetGovernmentRanksResponse>;
|
|
596
|
+
/** POST /government/ranks — rank: archon */
|
|
597
|
+
postGovernmentRanks(args: RequestArgs & { body: PostGovernmentRanksRequest }): Promise<PostGovernmentRanksResponse>;
|
|
598
|
+
/** DELETE /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon */
|
|
599
|
+
deleteGovernmentRanksRankKeyPermissionsPermissionKey(args?: RequestArgs): Promise<DeleteGovernmentRanksRankKeyPermissionsPermissionKeyResponse>;
|
|
600
|
+
/** PUT /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon */
|
|
601
|
+
putGovernmentRanksRankKeyPermissionsPermissionKey(args?: RequestArgs): Promise<PutGovernmentRanksRankKeyPermissionsPermissionKeyResponse>;
|
|
602
|
+
/** POST /government/ranks/{rankKey}/reset — rank: archon */
|
|
603
|
+
postGovernmentRanksRankKeyReset(args?: RequestArgs): Promise<PostGovernmentRanksRankKeyResetResponse>;
|
|
604
604
|
};
|
|
605
605
|
"grades": {
|
|
606
606
|
/** GET /grades/by-builder — rank: metic+archon */
|
|
@@ -334,25 +334,25 @@ export function createClient(opts = {}) {
|
|
|
334
334
|
// POST /goals/reorder — rank: metic+archon — POST /goals/reorder
|
|
335
335
|
postGoalsReorder: (args) => request("POST", "/goals/reorder", { hasBody: true }, args),
|
|
336
336
|
},
|
|
337
|
-
"
|
|
338
|
-
// GET /
|
|
339
|
-
|
|
340
|
-
// POST /
|
|
341
|
-
|
|
342
|
-
// DELETE /
|
|
343
|
-
|
|
344
|
-
// GET /
|
|
345
|
-
|
|
346
|
-
// GET /
|
|
347
|
-
|
|
348
|
-
// POST /
|
|
349
|
-
|
|
350
|
-
// DELETE /
|
|
351
|
-
|
|
352
|
-
// PUT /
|
|
353
|
-
|
|
354
|
-
// POST /
|
|
355
|
-
|
|
337
|
+
"government": {
|
|
338
|
+
// GET /government/assignments — rank: archon — GET /government/assignments
|
|
339
|
+
getGovernmentAssignments: (args) => request("GET", "/government/assignments", { hasBody: false }, args),
|
|
340
|
+
// POST /government/assignments — rank: archon — POST /government/assignments
|
|
341
|
+
postGovernmentAssignments: (args) => request("POST", "/government/assignments", { hasBody: true }, args),
|
|
342
|
+
// DELETE /government/assignments/{builderId}/{rankKey} — rank: archon — DELETE /government/assignments/:builderId/:rankKey
|
|
343
|
+
deleteGovernmentAssignmentsBuilderIdRankKey: (args) => request("DELETE", "/government/assignments/{builderId}/{rankKey}", { hasBody: false }, args),
|
|
344
|
+
// GET /government/permissions — rank: archon — GET /government/permissions
|
|
345
|
+
getGovernmentPermissions: (args) => request("GET", "/government/permissions", { hasBody: false }, args),
|
|
346
|
+
// GET /government/ranks — rank: archon — GET /government/ranks
|
|
347
|
+
getGovernmentRanks: (args) => request("GET", "/government/ranks", { hasBody: false }, args),
|
|
348
|
+
// POST /government/ranks — rank: archon — POST /government/ranks
|
|
349
|
+
postGovernmentRanks: (args) => request("POST", "/government/ranks", { hasBody: true }, args),
|
|
350
|
+
// DELETE /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon — DELETE /government/ranks/:rankKey/permissions/:permissionKey
|
|
351
|
+
deleteGovernmentRanksRankKeyPermissionsPermissionKey: (args) => request("DELETE", "/government/ranks/{rankKey}/permissions/{permissionKey}", { hasBody: false }, args),
|
|
352
|
+
// PUT /government/ranks/{rankKey}/permissions/{permissionKey} — rank: archon — PUT /government/ranks/:rankKey/permissions/:permissionKey
|
|
353
|
+
putGovernmentRanksRankKeyPermissionsPermissionKey: (args) => request("PUT", "/government/ranks/{rankKey}/permissions/{permissionKey}", { hasBody: true }, args),
|
|
354
|
+
// POST /government/ranks/{rankKey}/reset — rank: archon — POST /government/ranks/:rankKey/reset
|
|
355
|
+
postGovernmentRanksRankKeyReset: (args) => request("POST", "/government/ranks/{rankKey}/reset", { hasBody: true }, args),
|
|
356
356
|
},
|
|
357
357
|
"grades": {
|
|
358
358
|
// GET /grades/by-builder — rank: metic+archon — GET /grades/by-builder
|
|
@@ -22,7 +22,7 @@ Lars's directive (2026-08-05): **"Move all of these to metic, and make archon ju
|
|
|
22
22
|
|
|
23
23
|
The literal reading of that directive — edit 41 `requireRank('archon')` call sites — was the wrong shape, and briefly the plan. BV1.R104/R105 (jaxri, tasks [1001846](https://cloudbongos.com/builders#/task/1001846)/[1001847](https://cloudbongos.com/builders#/task/1001847)) had migrated the route gates to `requirePermission(...)` and were sitting at `confirmed` — graded, verified, unmerged — for five days. They landed mid-session.
|
|
24
24
|
|
|
25
|
-
Once every gate reads `requirePermission('<atom>')`, the rank floor is declared in exactly one place: `floor:` in [`modules/governance/catalog.js`](../../modules/
|
|
25
|
+
Once every gate reads `requirePermission('<atom>')`, the rank floor is declared in exactly one place: `floor:` in [`modules/governance/catalog.js`](../../modules/government/catalog.js). The delegation collapses from 41 call-site edits to **20 one-word floor changes in one table**. That is the ADR 0151 payoff arriving in practice, and it is worth recording as the concrete return on that refactor: the same owner decision was a 41-file diff on Monday and a 1-file diff on Tuesday.
|
|
26
26
|
|
|
27
27
|
## Decision
|
|
28
28
|
|
|
@@ -82,7 +82,7 @@ Left alone, a Metic would open `/gate` and get a page rendering nothing but a 40
|
|
|
82
82
|
1. **The exploit cookbook widened.** `security.report.adjudicate` guards `/security/docs` — the engagement-report store holding attacker-usable exploit detail — so that is now Metic-readable. Every other delegated atom widens who may *act*; this one widens who may *read*. If unwanted, the fix mirrors §4: split a `security.docs.read` at archon and let adjudication delegate. Recorded in `tests/security_docs.mjs` at the assertion that used to guard it.
|
|
83
83
|
2. **The backward ratchet delegated.** [ADR 0154](<redacted>.md) made "unsatisfy stays Archon" the explicit safety argument for delegating criterion *create* — the forward ratchet moved, the backward one did not. `criterion.unsatisfy` is neither rank/identity nor an escalation key, so under this directive it moved, superseding that carve-out. What still holds is the part that never depended on rank: satisfy and unsatisfy remain **separate atoms**, so confirming a criterion never confers the power to un-confirm one.
|
|
84
84
|
|
|
85
|
-
**A floor change needs a migration.** `governance_002`'s compat seed is run-once, so an edited `floor:` never reaches an already-migrated database. [`<redacted>.sql`](../../modules/
|
|
85
|
+
**A floor change needs a migration.** `governance_002`'s compat seed is run-once, so an edited `floor:` never reaches an already-migrated database. [`<redacted>.sql`](../../modules/government/migrations/<redacted>.sql) grants the 20 to `metic` (+ `gate_approval.read` to both, since it is new). Lowering a floor is additive, so `tests/governance_seed.mjs`'s union model handles it and revokes nothing.
|
|
86
86
|
|
|
87
87
|
**`requireArchonPage` is now a misnomer** — it resolves `page.view.governance`, floor metic. Renaming it touches serve-internal, auth, and several test files; left deliberately to keep this diff small in authz code, and filed separately. The hall nav group was relabelled **Archon → Governance**, because a header reading "Archon" over items a Metic can open misdescribes the ladder to exactly the builders still learning it.
|
|
88
88
|
|