The controller grants a read only from the owner's announcement (ADR 0495 clause 3). gitea announced `bound` unreadable, so mesh-provisioner bound no forge account; disk-load announced `readings` unreadable, refused to restic, nfs-server and mounts; restic announced `good` unreadable, which the self-check reads. Nothing in the catalogue compared readers with announcements since the gate's manifest check went (clause 5). Quick fix: mark those three states readable. Thorough fix: also checks/readable, which reads every owner's Go and TypeScript announcement and refuses any `reads` of a state it does not announce readable, so the next owner to announce cannot repeat it. Chose thorough: the same kind hit three owners at once. Reads of other repositories' owners (mesh-controller.lease, mesh-grants.accounts) are not judged here.
27 lines
1.8 KiB
TypeScript
27 lines
1.8 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { test } from "node:test";
|
|
import { readFileSync } from "node:fs";
|
|
|
|
// 1790: the states the module announces are the states its manifest declares, no more, no fewer; `bound` is readable,
|
|
// because mesh-provisioner's manifest reads it (the sweep of 2026-10-30, issue 774: announced unreadable, the read was
|
|
// refused and no forge account was bound).
|
|
test("the states the module announces are the states its manifest declares", async () => {
|
|
const { KEPT } = await import("../kept.ts");
|
|
const manifest = JSON.parse(readFileSync(new URL("../module.json", import.meta.url), "utf8"));
|
|
const declared = (manifest.state as (string | { name: string })[]).map((s) => (typeof s === "string" ? s : s.name)).sort();
|
|
assert.deepEqual(KEPT.map((k) => k.name).sort(), declared);
|
|
assert.deepEqual(KEPT.filter((k) => k.readable).map((k) => k.name), ["bound"], "bound alone is readable: mesh-provisioner reads it");
|
|
});
|
|
|
|
test("the announcement has the layout mesh-sdk's go/announce reads: version 1, the module, the node, the states sorted by name", async () => {
|
|
const { statesAnnouncement } = await import("../kept.ts");
|
|
assert.deepEqual(statesAnnouncement("gitea", "ace"), { v: 1, module: "gitea", node: "ace", states: [{ name: "announced" }, { name: "bound", readable: true }] });
|
|
assert.deepEqual(statesAnnouncement("gitea", undefined), { v: 1, module: "gitea", states: [{ name: "announced" }, { name: "bound", readable: true }] });
|
|
});
|
|
|
|
test("index.ts says the announcement as the event `states` before the tools are served", () => {
|
|
const source = readFileSync(new URL("../index.ts", import.meta.url), "utf8");
|
|
assert.match(source, /await emit\("states", statesAnnouncement\(/);
|
|
assert.ok(source.indexOf('await emit("states"') < source.indexOf('registerModuleTools("gitea"'), "announced before the tools are served");
|
|
});
|