From a256475100f5bee9fffb1a6e1df903328a7f71cc Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 18 Oct 2026 15:58:11 +0200 Subject: [PATCH 1/2] chore(contract): add scoped diagnostic API read Signed-off-by: Fredrik Ahlgren --- .changeset/mcp-diagnostic-read-contract.md | 5 +++++ contract/registry.yaml | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/mcp-diagnostic-read-contract.md diff --git a/.changeset/mcp-diagnostic-read-contract.md b/.changeset/mcp-diagnostic-read-contract.md new file mode 100644 index 0000000..893adb0 --- /dev/null +++ b/.changeset/mcp-diagnostic-read-contract.md @@ -0,0 +1,5 @@ +--- +"ftw-webapp": patch +--- + +Keep the shared contract in step with Core's scoped diagnostic API read for assistants. diff --git a/contract/registry.yaml b/contract/registry.yaml index ca5bdb6..22a78b8 100644 --- a/contract/registry.yaml +++ b/contract/registry.yaml @@ -445,6 +445,7 @@ reads: - { msg: logs.get, scope: ftw.logs.read, desc: A log excerpt the box redacts } - { msg: config.get, scope: ftw.config.read, desc: A configuration section the box redacts } - { msg: diag.run, scope: ftw.diag.run, desc: A check that changes nothing } + - { msg: api.read, const: MsgAPIRead, scope: ftw.diag.run, desc: Read a diagnostic API route within its data scope } # --------------------------------------------------------------------------- # Cars. A car belongs to its owner, not to the home, and visits chargers. The From 202d5ef65a010088ca6e5b9ef2ec25355c3c9ff8 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 18 Oct 2026 16:18:35 +0200 Subject: [PATCH 2/2] Describe the full MCP diagnostic read grant --- contract/registry.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contract/registry.yaml b/contract/registry.yaml index 22a78b8..0ae5357 100644 --- a/contract/registry.yaml +++ b/contract/registry.yaml @@ -141,7 +141,7 @@ scopes: - { name: ftw.members.write, desc: Invite and revoke } - { name: ftw.logs.read, desc: Log excerpts the box redacts } - { name: ftw.config.read, desc: Configuration the box redacts } - - { name: ftw.diag.run, desc: Checks that change nothing } + - { name: ftw.diag.run, desc: Full technical diagnostics and read API } - { name: ftw.dispatch.hold, desc: Hold energy assets for a capped time } - { name: ftw.goals.request, desc: Ask an owner to change a durable goal } # Reserved: no op asks for an update yet, and no role but owner carries it. @@ -445,7 +445,7 @@ reads: - { msg: logs.get, scope: ftw.logs.read, desc: A log excerpt the box redacts } - { msg: config.get, scope: ftw.config.read, desc: A configuration section the box redacts } - { msg: diag.run, scope: ftw.diag.run, desc: A check that changes nothing } - - { msg: api.read, const: MsgAPIRead, scope: ftw.diag.run, desc: Read a diagnostic API route within its data scope } + - { msg: api.read, const: MsgAPIRead, scope: ftw.diag.run, desc: Read the full technical diagnostic API } # --------------------------------------------------------------------------- # Cars. A car belongs to its owner, not to the home, and visits chargers. The