Skip to content

feat(tower): Control Tower 0.9 runbook tools (0.5.1) - #53

Merged
pramodbn27 merged 12 commits into
mainfrom
feat/tower-0.9-runbook-tools
Oct 31, 2026
Merged

pramodbn27 merged 12 commits into
mainfrom
feat/tower-0.9-runbook-tools

Conversation

@pramodbn27

Copy link
Copy Markdown
Member

Adds local MCP tools for Control Tower 0.9.0's automated runbooks (DeepAgentLabs/agenticops-control-tower#42) and prepares the 0.5.1 patch release.

Changes

  • Reader tools: tower.runbooks, tower.runbook_recommendations, tower.runbook_executions, tower.runbook_execution
  • Writer tools: tower.runbook_preview, tower.runbook_execute, tower.runbook_cancel, tower.runbook_verify
  • parameters is the only structured argument. It accepts at most 20 string-to-string entries and is allowed only on preview.
  • No approval or revocation tool. A human approves the exact digest through Tower HTTP/CLI with the separate approver credential.
  • The tower.investigation prompt now recommends only eligible runbooks returned by tower.runbook_recommendations.
  • Docs: docs/tower-0.9-runbooks.md (in nav), regenerated docs/tools.md, plus README, ROADMAP and CHANGELOG updates.
  • Version 0.5.1 in pyproject.toml, __init__, server.json and uv.lock.

Validation

  • make check: 345 passed, 7 skipped
  • Strict mkdocs build
  • End to end against a live Tower 0.9 server with the staging runbook connector:
    • recommend → preview → execute before approval returns 409
    • human approval over HTTP → execute → verify resolves the incident
    • history reads back the execution
    • cancel on a resolved runbook returns 409

Hosted MCP still hides and refuses all tower.* tools. Docs links to Tower v0.9.0 resolve once that tag is pushed.

Reader tools list runbooks, recommendations and executions; writer tools
preview, execute, cancel and verify over Tower's runbook HTTP routes. Runbook
parameters are the only structured argument, limited to 20 string-to-string
entries. No approval or revocation tool is exposed.
With Tower 0.9 the model may recommend only an eligible runbook returned by
tower.runbook_recommendations and must show its parameters and steps.
Copilot AI lite review requested due to automatic review settings October 31, 2026 22:04
@pramodbn27
pramodbn27 requested a review from a team as a code owner October 31, 2026 22:04
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-31T22:05:56.382212Z 0921b4f PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Active findings remain, including a critical deadline mismatch that can falsely report valid long-running executions as failed, plus metadata, input-validation, and release-documentation inconsistencies.

5 open issues
What changed in this PR

Adds local MCP support for Control Tower 0.9 versioned runbooks and prepares the 0.5.1 release, while preserving human-only approval and hosted Tower restrictions.

Changes:

  • Added eight runbook reader and writer tools with bounded parameters and role-specific credentials.
  • Updated investigation guidance, documentation, generated tool references, roadmap, README, and changelog.
  • Added route, credential, schema, validation, and hosted-restriction tests.
  • Bumped package, registry, and lockfile versions to 0.5.1.
File Description
uv.lock Updates the locked package version to 0.5.1.
tests/​test_tower.py Tests runbook dispatch, credentials, routes, validation, schemas, and hosted restrictions.
src/​deep_agentic_core_mcp/​tools/​tower.py Defines runbook routes, validation, metadata, and connector dispatch.
src/​deep_agentic_core_mcp/​prompts/​registry.py Updates investigation guidance to use eligible Tower runbooks.
src/​deep_agentic_core_mcp/​__init__.py Sets the package version to 0.5.1.
server.json Updates MCP registry metadata to 0.5.1.
ROADMAP.md Records the completed Control Tower 0.9 runbook milestone.
README.md Documents the new local runbook capabilities.
pyproject.toml Bumps the project release version.
mkdocs.yml Adds the runbook guide to documentation navigation.
docs/​tower-0.9-runbooks.md Documents tools, routes, credentials, limits, and workflow behavior.
docs/​tools.md Regenerates the MCP tool reference with eight runbook tools.
CHANGELOG.md Adds the 0.5.1 release notes and compatibility details.

This pull request requires changes.

Review effort: Lite

Comment on lines +39 to +40
"runbook_execute": ("/runbook-executions/{execution_id}/execute", {"preview_digest"}),
"runbook_cancel": ("/runbook-executions/{execution_id}/cancel", set()),

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: tower.runbook_execute now waits up to 150 seconds (the 120-second runbook budget plus lease slack), and the HTTP worker receives the matching timeout. All other Tower tools keep the 10-second deadline.

Comment on lines 87 to +99
if set(args) - allowed:
return {"ok": False, "error": "Unsupported Tower arguments"}
parameters = args.pop("parameters", None) if operation == "runbook_preview" else None
if parameters is not None and not (
isinstance(parameters, dict)
and len(parameters) <= MAX_RUNBOOK_PARAMETERS
and all(isinstance(k, str) and isinstance(v, str) for k, v in parameters.items())
):
return {"ok": False, "error": "Runbook parameters must map strings to strings"}
if any(not isinstance(value, (str, int)) or isinstance(value, bool) for value in args.values()):
return {"ok": False, "error": "Tower arguments must be scalar strings or integers"}
if parameters is not None:
args["parameters"] = parameters

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: required arguments, including a non-null parameters, are now checked against a shared REQUIRED_ARGUMENTS table before the worker is spawned. The same table generates the advertised schemas.

Comment thread README.md
Comment on lines +724 to +733
## Control Tower 0.9.0 runbooks (MCP 0.5.1)

Local stdio adds eight `tower.runbook*` tools (twenty `tower.*` tools in total).
Reader tools list installed runbooks, recommendations for an incident and
execution history. Writer tools preview a catalog version with string
parameters, execute the exact human-approved digest, cancel and verify. There is
still no approval or revocation tool: a human approves through Tower HTTP/CLI
with the separate approver credential. Recommendations come only from installed
runbook versions, and hosted MCP still refuses Tower tools. See the
[runbook tools guide](docs/tower-0.9-runbooks.md).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: the current-surface heading now says 0.5.1 and lists the tower.* tools, including the runbook tools.

Comment thread ROADMAP.md
Comment on lines +969 to +979
## Control Tower 0.9.0 runbook tools (MCP 0.5.1)

Tower Phase 9 ships versioned runbooks with exact-digest approval, bounded steps,
compensation, cancellation, reconciliation and verified recovery. MCP 0.5.1 adds
local `tower.runbooks`, `tower.runbook_recommendations`,
`tower.runbook_executions`, `tower.runbook_execution`, `tower.runbook_preview`,
`tower.runbook_execute`, `tower.runbook_cancel` and `tower.runbook_verify`.
Approval stays human-only through Tower; hosted MCP keeps rejecting Tower tools
until per-user credential binding (Phase 6). Tower's existing
`deep-agentic-core-mcp>=0.3.6,<1` range admits 0.5.1, so no Tower change is needed.
See [runbook tools](docs/tower-0.9-runbooks.md).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed: Release Status now names 0.5.1 as current and keeps 0.5.0 as history.

tower.runbook_execute now waits up to 150 seconds (Tower's 120-second runbook
budget plus lease slack) and is advertised as slow; other Tower tools keep the
ten-second deadline. Required arguments are checked from one shared table
before any worker is spawned, and the same table drives the input schemas.
@pramodbn27
pramodbn27 merged commit 1533b80 into main Oct 31, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants