Repository navigation
Releases
Releases · AIops-tools/Postgres-AIops
v0.13.0
Security and observability (BREAKING)
- BREAKING: Writes now require a durable audit intent before contacting the upstream platform. If the audit database cannot accept the intent, the write fails closed; a failed final audit update leaves an unresolved
pendingintent. - Real writes now commit a durable
pendingaudit intent before the upstream call. If audit storage is unavailable, the write does not start; a failed final update leaves a visible pending intent and blocks further writes in that process. - Audit rows retain outcome metadata instead of full business responses.
AIOPS_WORKFLOW_IDlinks calls across a workflow; optionalAIOPS_TELEMETRY=1emits metadata-only JSON events andAuditEngine.health()reports audit failures and pending intents.
v0.12.0
Fixed
- The MCP server moved from a top-level
mcp_serverpackage to
postgres_aiops.mcp_server. Every AIops tool used to ship its own top-level
mcp_server, so installing two of them into one environment merged the two
into one package:postgres-aiops-mcpcould start another tool's server, and
postgres-aiops undowrote audit and undo rows into the other tool's home
directory. Installs throughuvx, the Claude Code plugin or the OpenClaw
bundle were isolated and unaffected. Thepostgres-aiops-mcpcommand is
unchanged; only code that importedmcp_serverdirectly must now import
postgres_aiops.mcp_server.
v0.11.0
Added
- MCP tool annotations derived from each tool's governance
risk_level, so
clients can gate approval fromtools/listalone.lowtools advertise
readOnlyHint: true; every other tool advertisesreadOnlyHint: falseand
destructiveHint: true. Themediumtier includes deletes and hard
power-offs, so a tool is never advertised as non-destructive on the strength
of its tier.idempotentHintonly repeats an explicit declaration. The exact
level is published in_metaunderio.github.AIops-tools/riskLevel. These
are hints for the client; audit and undo are unchanged.
Fixed
blocking_lock_chain_rca: the chain root's state was dropped and a missing
query became"". For a backend that isidle in transaction,rootQueryis
the last statement it ran, not a running one, so the recommended
cancel_queryhad nothing to cancel. Roots now carryrootStateand
rootIdle(true for anyidle*state, including plainidlewith session-level locks), a missing query staysnull, and the action for an
idle root points atterminate_backend(which rolls the transaction back).
v0.10.3
Fixed
- CLI commands that read the engine without calling an MCP tool now write an
audit row, as every MCP call does: they run through the same@governed_tool
harness, budget and runaway guard included. Before, an operator's CLI reads
left no trace inaudit.db, contrary to the documented guarantee that MCP
and CLI are audited alike. A test fails if any engine command escapes it.
v0.10.2
Changed
- The ClawHub bundle plugin moved from
@aiops-tools/postgres-aiopsto
@zw008/postgres-aiops, matching the publisher the skill has always been under.
ClawHub cannot move a package between scopes — the scope is the publisher
identity — so this is a republish under the new name; the old name is
withdrawn. Install with:
openclaw plugins install clawhub:@zw008/postgres-aiops. Nothing about the Python
package, the CLI, the MCP server or the Claude Code plugin changes.
v0.10.1
Added
- The OpenClaw install path is documented. The ClawHub bundle channel went
live but neither the README nor this skill said how to install from it:
openclaw plugins install clawhub:@aiops-tools/postgres-aiops. States theuvx
prerequisite (without it the skill installs but reportsVisible to model: no) and that the MCP server is pinned to this exact release. - Where an exported master password lives is now stated next to the
instruction to export it: readable by every process the shell starts, and
kept in shell history.
v0.10.0
Added
- Installable as a Claude Code plugin.
.claude-plugin/plugin.jsonplus a
root.mcp.jsonmake this repo a plugin, so/plugin install postgres-aiops@aiops-tools
delivers the skill and registers the MCP server in one step. The server is
pinned to the exact package version the manifest declares, so an audit row
stays traceable to the code that produced it. Nothing about the tool itself
changed — the CLI and the standalone MCP server work exactly as before. - Installable from ClawHub as an OpenClaw bundle plugin (
@aiops-tools/postgres-aiops): one install delivers the skill and its MCP
server, pinned to this exact release.clawhub.ai/plugins.
Fixed
- The skill was invisible to the model in OpenClaw. Its metadata
declaredrequires.config(OpenClaw reads that as config keys, not file
paths, so it can never be satisfied),requires.envandrequires.bins
naming our own CLI — which a plugin user never has on PATH — plus a
primaryEnvthat turned a config path into an API-key prompt. Measured on
OpenClaw 2026.6.35:Visible to model: no. It now requires
anyBins: [postgres-aiops, uvx]— either one suffices — with every variable kept
inoptional.env(still declared, no longer a load gate), which the same
command reports asVisible to model: yes.
v0.9.0
Fixed
- An undetermined outcome no longer exits as a plain failure. A write whose response was lost carries both
errorandoutcomeUnknown, and the harness deliberately judges unknown first when writing the audit row — the change may have taken effect, so a blind retry could apply it twice. The CLI guard judgederrorfirst, so the audit said "may have taken effect" while the exit status told a script it had not happened. The two layers now agree (exit 2, not 1), and a test pins the ordering so it cannot silently flip back. - The CLI reported a refused or failed governed write as a success. 10 write call sites printed the governed twin's payload and exited 0 whatever it said — and
@tool_errorsflattens every refusal, guard rejection and upstream failure into{"error": ...}rather than raising, so nothing downstream of a&&chain or a CI step could tell a blocked write from a landed one. The dry-run path already exited non-zero, which made the asymmetry worse: the preview was stricter than the write it previews. Results now route through achecked()helper — exit 1 on an error payload, exit 2 on an undetermined outcome, unchanged on success. This defect class had been fixed repo-by-repo several times and kept coming back; an audit across the whole line found it live in 18 of the 24 tools at once (87 call sites), so each tool now carries an invariant test that fails if any future CLI command prints a governed result without checking it.
v0.8.0
Fixed
undo applyreplays against the target the original write ran on. It dispatched the inverse against whatever target the caller named — in practice the config's first entry — while the write's own target sat unused in the undo record. On a multi-target config the inverse therefore ran against the wrong host; it only looks harmless because the resource usually is not there, but two hosts holding the same name and the inverse succeeds on the wrong one, silently. An explicitly named target still wins. Line-wide: all 24 copies had the identical defect. Caught live in container-host-aiops, where a stop recorded against a Podman target replayed against a Portainer one.- Undoing an
ALTER SYSTEM SETno longer leaves the parameter pinned. The inverse wrote the prior value back with anotherALTER SYSTEM SET, so a parameter that had nopostgresql.auto.confentry beforehand ended up with one. The number was right, butpostgresql.auto.confoverridespostgresql.conf, so the "undo" silently shadowed the operator's config file from then on — a later edit there would have no effect.update_settingnow records where the value came from (pg_settings.sourcefile), and the inverse isALTER SYSTEM RESETunless the parameter was already carried by auto.conf. Live-verified on PostgreSQL 16.14 in both directions, checkingpostgresql.auto.confitself after each undo.
Added
update_setting(reset=True)/remediate set <name> --reset—ALTER SYSTEM RESETa parameter, dropping itspostgresql.auto.confentry sopostgresql.confor the built-in default applies again. This is what the corrected undo replays.priorStateon a setting change now carriessourceandpinnedInAutoConf, so a caller can see whether a value was explicitly pinned or inherited.
v0.7.0
Changed (BREAKING)
- Requires MCP SDK 2.0 (
mcp[cli]>=2.0,<3.0).mcp.server.fastmcpno longer exists in 2.0; the server is now built withMCPServerand reports its package version in the stdio handshake.
Fixed
undo applyworks from the CLI. Every write tool is imported lazily inside its own CLI command, so a CLI-driven undo ran in a process where the inverse tool was never registered and failed with "inverse tool is not registered" — for every write tool. Only the MCP entry point, which imports the whole server, worked. Found while live-verifying against a real cluster.- An undetermined outcome is audited
unknown, notok. The harness only classified a result as undetermined when the payload also carried anerrorkey, so a write that looked successful but had not been confirmed was recorded as a success.