Version Packages#52
Conversation
evaOS review status: stale headPR: #52 - Version Packages evaOS review stopped because this queued head is no longer the live PR head. Automation note: agents should wait for this comment to reach PR URL: #52 |
2a2e0db to
e04bca3
Compare
evaOS review status: completedPR: #52 - Version Packages evaOS review completed for this PR head. Automation note: agents should wait for this comment to reach PR URL: #52 Review URL: #52 (review) |
There was a problem hiding this comment.
Walkthrough
PR: #52 - Version Packages
Head: e04bca370b7de678ccbf8878120c980218e819af into main. Review event: COMMENT.
Provider: GLM/Z.ai through ZCode (zcode-glm, zcode, model GLM-5.2).
Estimated review effort: 5/5 (~70 min)
Changed Files
| File | Status | Churn | Purpose | Risk |
|---|---|---|---|---|
.changeset/agent-replace-grant-gate.md |
removed | +0/-9 | Documentation | Low |
.changeset/broker-mcp-client-manager.md |
removed | +0/-27 | Documentation | Low |
.changeset/m5-schema-train.md |
removed | +0/-24 | Documentation | Low |
conformance/CHANGELOG.md |
modified | +9/-0 | Documentation | Low |
conformance/package.json |
modified | +1/-1 | Configuration | Low |
examples/app/CHANGELOG.md |
modified | +12/-0 | Documentation | Low |
examples/app/package.json |
modified | +1/-1 | Configuration | Low |
examples/standalone/CHANGELOG.md |
modified | +11/-0 | Documentation | Low |
examples/standalone/package.json |
modified | +1/-1 | Configuration | Low |
packages/agent/CHANGELOG.md |
modified | +8/-0 | Documentation | Low |
packages/agent/package.json |
modified | +1/-1 | Configuration | Low |
packages/broker/CHANGELOG.md |
added | +34/-0 | Documentation | Low |
packages/broker/package.json |
modified | +1/-1 | Configuration | Low |
packages/core/CHANGELOG.md |
modified | +29/-0 | Documentation | Low |
packages/core/package.json |
modified | +1/-1 | Configuration | Low |
packages/host/CHANGELOG.md |
modified | +8/-0 | Documentation | Low |
packages/host/package.json |
modified | +1/-1 | Configuration | Low |
packages/lit/CHANGELOG.md |
modified | +9/-0 | Documentation | Low |
packages/lit/package.json |
modified | +1/-1 | Configuration | Low |
packages/mcp/CHANGELOG.md |
modified | +10/-0 | Documentation | Low |
packages/mcp/package.json |
modified | +1/-1 | Configuration | Low |
packages/react/CHANGELOG.md |
modified | +10/-0 | Documentation | Low |
packages/react/package.json |
modified | +1/-1 | Configuration | Low |
packages/schema/CHANGELOG.md |
modified | +24/-0 | Documentation | Low |
packages/schema/package.json |
modified | +1/-1 | Configuration | Low |
2 additional changed files omitted from this walkthrough.
Review Signal
No validated inline findings.
Dropped findings before posting: 0. High-severity findings: 0.
Risk Taxonomy
No finding categories.
Validation and Proof
1 required validation/proof recommendation(s) selected from changed files.
- required: TypeScript/web build or CI proof - Runtime TypeScript/web files or package/config files changed. Proof: npm run build; typecheck; focused Vitest; green GitHub check.
Proof status: missing - 1 required validation/proof recommendation(s) missing from PR metadata.
Profile validation hints: Prefer correctness, security, data-loss, release, and regression findings over style-only feedback.
Profile proof expectations: Look for focused validation, rollback notes, and evidence appropriate to the changed surface.
Related Context
Related issues/PRs: #50, #37, #51, #41, #45.
Suggested labels: docs.
Suggested reviewers: 100yenadmin.
Review Settings Preview
- Profile: assertive
- Enabled sections: Review summary (inline_review); Walkthrough (inline_review); Changed-files table (walkthrough); Effort estimate (walkthrough); Related issues/PRs (walkthrough); Review status comment (sticky_status)
- Path instructions: none
- Label suggestions: none
- Reviewer suggestions: none
- Suggestion behavior: suggestions only; labels and reviewers are not auto-applied.
- Roadmap-only settings: auto-apply labels; auto-request reviewers; required status checks
Pre-merge checklist
- Inline comments target current RIGHT-side diff lines.
- No secret-like content survived into posted inline comments.
- REQUEST_CHANGES is only used when eligible P0/P1 findings survive validation.
- Required behavior proof is present or not applicable.
- Labels and reviewers are suggestions only; the bot did not auto-apply them.
e04bca3 to
946788c
Compare
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@boardstate/broker@0.2.0
Minor Changes
#50
e96a33fThanks @100yenadmin! - New package@boardstate/broker— the MCP CLIENT manager (M5a-1, epic #37). It connectsoutward to the external MCP servers an operator declares in a
boardstate.connectors.jsonconfig, discovers their tools into a namespaced
ToolManifest, and calls them behind anarrow API the host/server layers consume.
loadConnectorsConfig(path)+ a programmaticnew McpBroker(config). A connector name not in the config is inert.envvalues areprocess-env var NAMES (references), never literal secrets — validated up front and never
echoed into errors or logs.
StdioClientTransportfor local servers,StreamableHTTPClientTransportwith SSE fallback for remotes. Lazy connect on first use, warm/pooled clients, capped
exponential-backoff reconnect, clean close.
listTools()→ToolManifest:connector:toolids AND provider-safeconnector__toolnames (both inside a 64-char budget, collisions fail loud), inputschemas,
readOnlyHinthonored (absent ⇒ treated as a mutation — fail-safe), and astable manifest hash over sorted (id + canonical input-schema) pairs — the anti-rug-pull
snapshot the grant lifecycle (M5b-2) pins to.
callTool(id, args, { timeout }): resolves the client, strips the namespace,enforces a hard timeout, and normalizes
isError: trueresults into a typedBrokerToolError.Depends only on
@modelcontextprotocol/sdkand@boardstate/server(types only). Shipsan in-repo fake MCP server fixture (stdio child + in-process HTTP) so CI needs no network.
#53
a0feba7Thanks @100yenadmin! - M5 trust layer (M5b-2 + M5b-3, epic #37): the grant lifecycle for external MCP toolsand the server-enforced pending-action engine — closes #40 and #41.
Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, #40)
installBrokerActions(@boardstate/server/node) registers each configured connector'sdiscovered tools as a
requestedtools-only grant (explicitmethods: []/streams: [],a
toolsid snapshot, and a subset-scopedtoolsHash), mirroringinstallConnector'srequest-on-install. An already-
grantedgrant survives a restart; real manifest drift iscaught at invoke time.
to the stored
toolsHash; a mismatch re-pends the grant torequestedBEFORE any callsucceeds.
reconcileReplaceApprovalnow forces agrantedgrant back torequestedon ANYtools/toolsHashmutation (not just status flips) — closing thered-team hole where an agent could append a tool id to a granted grant through
workspace.replaceor import.dashboard.capability.approvegains an optionaltoolssubset; thedecision applies to the intersection with the requested set and the granted subset gets
its OWN hash (
McpBroker.hashToolSubset, injected ascapabilityToolsHash).(approve-all = one click); the core transform + lit renderer + strings render it.
Pending-action engine (SPEC §18, #41)
dashboard.action.invokeAND-gates a call (granted atinvoke time + connector configured + hash unchanged): a
readOnlygranted tool executesdirectly; a mutation parks as a
PendingActionRecordand returns{ pending: true, id, expiresAt }.dashboard.action.confirm/dashboard.action.denyare operator-only(
OPERATOR_ONLY_METHODS) — a networked client can directly execute onlyreadOnlytools.server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on
dashboard.action.changed.confirmAndExecute(id)is exposed as the awaitable an agent-mediated call (M5c-1) blockson: it resolves with the tool result on confirm and rejects on deny/expiry.
The engine consumes the broker through the narrow structural
ActionBrokerinterface —@boardstate/brokernever enters@boardstate/server(no dependency cycle); the realMcpBrokerfits it structurally. SPEC §17.1/§18 normative text filled where the schematrain (#39) left implementation-pending markers.
Patch Changes
c895241,a0feba7]:@boardstate/core@1.2.0
Minor Changes
#51
b05c7cdThanks @100yenadmin! - feat(schema): SPEC §17 v2 tool grants + all M5 schema surface (one schema train, M5b-1)The single S5-1 schema train — all M5 (Operational Workspace) schema surface rides
one release so later sprints consume a released schema. Fully additive: boards using
none of the new surface validate + normalize byte-identically (regression-tested).
DashboardCapabilityGrantgainstools?: string[](namespaced
connector:toolids, shape-validated — NOT againstDATA_READ_RPC_ALLOWLIST) andtoolsHash?.methods/streams/toolsareoptional-in / always-array-out.
PendingActionRecordtype +validatePendingActionshape guard for the #41 engine (type + validation only).
builtin:action-buttonkind + props validator{connector, tool, args?, label?}.mode:"tool":mode/connector/tool/argsFromextend thefixed key-set; prompt mode stays the default and byte-identical.
source:"mcp"binding:{source:"mcp", connector, tool, args?}(shape only;host resolution is #45).
dashboard.connector.listadded toDATA_READ_RPC_ALLOWLIST(broker status read).action-buttonentry + action-form tool-mode example (honesty-gate valid).#53
a0feba7Thanks @100yenadmin! - M5 trust layer (M5b-2 + M5b-3, epic #37): the grant lifecycle for external MCP toolsand the server-enforced pending-action engine — closes #40 and #41.
Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, #40)
installBrokerActions(@boardstate/server/node) registers each configured connector'sdiscovered tools as a
requestedtools-only grant (explicitmethods: []/streams: [],a
toolsid snapshot, and a subset-scopedtoolsHash), mirroringinstallConnector'srequest-on-install. An already-
grantedgrant survives a restart; real manifest drift iscaught at invoke time.
to the stored
toolsHash; a mismatch re-pends the grant torequestedBEFORE any callsucceeds.
reconcileReplaceApprovalnow forces agrantedgrant back torequestedon ANYtools/toolsHashmutation (not just status flips) — closing thered-team hole where an agent could append a tool id to a granted grant through
workspace.replaceor import.dashboard.capability.approvegains an optionaltoolssubset; thedecision applies to the intersection with the requested set and the granted subset gets
its OWN hash (
McpBroker.hashToolSubset, injected ascapabilityToolsHash).(approve-all = one click); the core transform + lit renderer + strings render it.
Pending-action engine (SPEC §18, #41)
dashboard.action.invokeAND-gates a call (granted atinvoke time + connector configured + hash unchanged): a
readOnlygranted tool executesdirectly; a mutation parks as a
PendingActionRecordand returns{ pending: true, id, expiresAt }.dashboard.action.confirm/dashboard.action.denyare operator-only(
OPERATOR_ONLY_METHODS) — a networked client can directly execute onlyreadOnlytools.server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on
dashboard.action.changed.confirmAndExecute(id)is exposed as the awaitable an agent-mediated call (M5c-1) blockson: it resolves with the tool result on confirm and rejects on deny/expiry.
The engine consumes the broker through the narrow structural
ActionBrokerinterface —@boardstate/brokernever enters@boardstate/server(no dependency cycle); the realMcpBrokerfits it structurally. SPEC §17.1/§18 normative text filled where the schematrain (#39) left implementation-pending markers.
Patch Changes
b05c7cd,a0feba7]:@boardstate/lit@0.4.0
Minor Changes
#53
a0feba7Thanks @100yenadmin! - M5 trust layer (M5b-2 + M5b-3, epic #37): the grant lifecycle for external MCP toolsand the server-enforced pending-action engine — closes #40 and #41.
Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, #40)
installBrokerActions(@boardstate/server/node) registers each configured connector'sdiscovered tools as a
requestedtools-only grant (explicitmethods: []/streams: [],a
toolsid snapshot, and a subset-scopedtoolsHash), mirroringinstallConnector'srequest-on-install. An already-
grantedgrant survives a restart; real manifest drift iscaught at invoke time.
to the stored
toolsHash; a mismatch re-pends the grant torequestedBEFORE any callsucceeds.
reconcileReplaceApprovalnow forces agrantedgrant back torequestedon ANYtools/toolsHashmutation (not just status flips) — closing thered-team hole where an agent could append a tool id to a granted grant through
workspace.replaceor import.dashboard.capability.approvegains an optionaltoolssubset; thedecision applies to the intersection with the requested set and the granted subset gets
its OWN hash (
McpBroker.hashToolSubset, injected ascapabilityToolsHash).(approve-all = one click); the core transform + lit renderer + strings render it.
Pending-action engine (SPEC §18, #41)
dashboard.action.invokeAND-gates a call (granted atinvoke time + connector configured + hash unchanged): a
readOnlygranted tool executesdirectly; a mutation parks as a
PendingActionRecordand returns{ pending: true, id, expiresAt }.dashboard.action.confirm/dashboard.action.denyare operator-only(
OPERATOR_ONLY_METHODS) — a networked client can directly execute onlyreadOnlytools.server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on
dashboard.action.changed.confirmAndExecute(id)is exposed as the awaitable an agent-mediated call (M5c-1) blockson: it resolves with the tool result on confirm and rejects on deny/expiry.
The engine consumes the broker through the narrow structural
ActionBrokerinterface —@boardstate/brokernever enters@boardstate/server(no dependency cycle); the realMcpBrokerfits it structurally. SPEC §17.1/§18 normative text filled where the schematrain (#39) left implementation-pending markers.
Patch Changes
b05c7cd,a0feba7]:@boardstate/schema@1.2.0
Minor Changes
#51
b05c7cdThanks @100yenadmin! - feat(schema): SPEC §17 v2 tool grants + all M5 schema surface (one schema train, M5b-1)The single S5-1 schema train — all M5 (Operational Workspace) schema surface rides
one release so later sprints consume a released schema. Fully additive: boards using
none of the new surface validate + normalize byte-identically (regression-tested).
DashboardCapabilityGrantgainstools?: string[](namespaced
connector:toolids, shape-validated — NOT againstDATA_READ_RPC_ALLOWLIST) andtoolsHash?.methods/streams/toolsareoptional-in / always-array-out.
PendingActionRecordtype +validatePendingActionshape guard for the #41 engine (type + validation only).
builtin:action-buttonkind + props validator{connector, tool, args?, label?}.mode:"tool":mode/connector/tool/argsFromextend thefixed key-set; prompt mode stays the default and byte-identical.
source:"mcp"binding:{source:"mcp", connector, tool, args?}(shape only;host resolution is #45).
dashboard.connector.listadded toDATA_READ_RPC_ALLOWLIST(broker status read).action-buttonentry + action-form tool-mode example (honesty-gate valid).Patch Changes
#53
a0feba7Thanks @100yenadmin! - M5 trust layer (M5b-2 + M5b-3, epic #37): the grant lifecycle for external MCP toolsand the server-enforced pending-action engine — closes #40 and #41.
Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, #40)
installBrokerActions(@boardstate/server/node) registers each configured connector'sdiscovered tools as a
requestedtools-only grant (explicitmethods: []/streams: [],a
toolsid snapshot, and a subset-scopedtoolsHash), mirroringinstallConnector'srequest-on-install. An already-
grantedgrant survives a restart; real manifest drift iscaught at invoke time.
to the stored
toolsHash; a mismatch re-pends the grant torequestedBEFORE any callsucceeds.
reconcileReplaceApprovalnow forces agrantedgrant back torequestedon ANYtools/toolsHashmutation (not just status flips) — closing thered-team hole where an agent could append a tool id to a granted grant through
workspace.replaceor import.dashboard.capability.approvegains an optionaltoolssubset; thedecision applies to the intersection with the requested set and the granted subset gets
its OWN hash (
McpBroker.hashToolSubset, injected ascapabilityToolsHash).(approve-all = one click); the core transform + lit renderer + strings render it.
Pending-action engine (SPEC §18, #41)
dashboard.action.invokeAND-gates a call (granted atinvoke time + connector configured + hash unchanged): a
readOnlygranted tool executesdirectly; a mutation parks as a
PendingActionRecordand returns{ pending: true, id, expiresAt }.dashboard.action.confirm/dashboard.action.denyare operator-only(
OPERATOR_ONLY_METHODS) — a networked client can directly execute onlyreadOnlytools.server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on
dashboard.action.changed.confirmAndExecute(id)is exposed as the awaitable an agent-mediated call (M5c-1) blockson: it resolves with the tool result on confirm and rejects on deny/expiry.
The engine consumes the broker through the narrow structural
ActionBrokerinterface —@boardstate/brokernever enters@boardstate/server(no dependency cycle); the realMcpBrokerfits it structurally. SPEC §17.1/§18 normative text filled where the schematrain (#39) left implementation-pending markers.
@boardstate/server@1.2.0
Minor Changes
#53
a0feba7Thanks @100yenadmin! - M5 trust layer (M5b-2 + M5b-3, epic #37): the grant lifecycle for external MCP toolsand the server-enforced pending-action engine — closes #40 and #41.
Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, #40)
installBrokerActions(@boardstate/server/node) registers each configured connector'sdiscovered tools as a
requestedtools-only grant (explicitmethods: []/streams: [],a
toolsid snapshot, and a subset-scopedtoolsHash), mirroringinstallConnector'srequest-on-install. An already-
grantedgrant survives a restart; real manifest drift iscaught at invoke time.
to the stored
toolsHash; a mismatch re-pends the grant torequestedBEFORE any callsucceeds.
reconcileReplaceApprovalnow forces agrantedgrant back torequestedon ANYtools/toolsHashmutation (not just status flips) — closing thered-team hole where an agent could append a tool id to a granted grant through
workspace.replaceor import.dashboard.capability.approvegains an optionaltoolssubset; thedecision applies to the intersection with the requested set and the granted subset gets
its OWN hash (
McpBroker.hashToolSubset, injected ascapabilityToolsHash).(approve-all = one click); the core transform + lit renderer + strings render it.
Pending-action engine (SPEC §18, #41)
dashboard.action.invokeAND-gates a call (granted atinvoke time + connector configured + hash unchanged): a
readOnlygranted tool executesdirectly; a mutation parks as a
PendingActionRecordand returns{ pending: true, id, expiresAt }.dashboard.action.confirm/dashboard.action.denyare operator-only(
OPERATOR_ONLY_METHODS) — a networked client can directly execute onlyreadOnlytools.server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on
dashboard.action.changed.confirmAndExecute(id)is exposed as the awaitable an agent-mediated call (M5c-1) blockson: it resolves with the tool result on confirm and rejects on deny/expiry.
The engine consumes the broker through the narrow structural
ActionBrokerinterface —@boardstate/brokernever enters@boardstate/server(no dependency cycle); the realMcpBrokerfits it structurally. SPEC §17.1/§18 normative text filled where the schematrain (#39) left implementation-pending markers.
Patch Changes
c895241- Security: thedashboard_workspace_replaceagent tool now passes the structuralreplace gate (
reconcileReplaceApproval), so an agent can no longer self-grant acapability by writing
status: "granted"intocapabilitiesRegistry. Onlydashboard.capability.approve(operator-only) grants. The RPC replace path wasalready gated; this closes the agent-tool path.
b05c7cd,a0feba7]:@boardstate/conformance@0.1.11
Patch Changes
c895241,b05c7cd,a0feba7]:@boardstate/agent@0.2.8
Patch Changes
c895241,b05c7cd,a0feba7]:@boardstate/host@1.2.0
Patch Changes
#53
a0feba7Thanks @100yenadmin! - M5 trust layer (M5b-2 + M5b-3, epic #37): the grant lifecycle for external MCP toolsand the server-enforced pending-action engine — closes #40 and #41.
Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, #40)
installBrokerActions(@boardstate/server/node) registers each configured connector'sdiscovered tools as a
requestedtools-only grant (explicitmethods: []/streams: [],a
toolsid snapshot, and a subset-scopedtoolsHash), mirroringinstallConnector'srequest-on-install. An already-
grantedgrant survives a restart; real manifest drift iscaught at invoke time.
to the stored
toolsHash; a mismatch re-pends the grant torequestedBEFORE any callsucceeds.
reconcileReplaceApprovalnow forces agrantedgrant back torequestedon ANYtools/toolsHashmutation (not just status flips) — closing thered-team hole where an agent could append a tool id to a granted grant through
workspace.replaceor import.dashboard.capability.approvegains an optionaltoolssubset; thedecision applies to the intersection with the requested set and the granted subset gets
its OWN hash (
McpBroker.hashToolSubset, injected ascapabilityToolsHash).(approve-all = one click); the core transform + lit renderer + strings render it.
Pending-action engine (SPEC §18, #41)
dashboard.action.invokeAND-gates a call (granted atinvoke time + connector configured + hash unchanged): a
readOnlygranted tool executesdirectly; a mutation parks as a
PendingActionRecordand returns{ pending: true, id, expiresAt }.dashboard.action.confirm/dashboard.action.denyare operator-only(
OPERATOR_ONLY_METHODS) — a networked client can directly execute onlyreadOnlytools.server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on
dashboard.action.changed.confirmAndExecute(id)is exposed as the awaitable an agent-mediated call (M5c-1) blockson: it resolves with the tool result on confirm and rejects on deny/expiry.
The engine consumes the broker through the narrow structural
ActionBrokerinterface —@boardstate/brokernever enters@boardstate/server(no dependency cycle); the realMcpBrokerfits it structurally. SPEC §17.1/§18 normative text filled where the schematrain (#39) left implementation-pending markers.
Updated dependencies [
b05c7cd,a0feba7]:@boardstate/mcp@0.2.4
Patch Changes
c895241,b05c7cd,a0feba7]:@boardstate/react@0.1.8
Patch Changes
b05c7cd,a0feba7]:boardstate-example-app@0.0.12
Patch Changes
c895241,b05c7cd,a0feba7]:boardstate-example-standalone@0.0.12
Patch Changes
c895241,b05c7cd,a0feba7]: