From d71e7d6bc9211cfdb9b6b79b00aabf0cffb9d637 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:47:46 +0000 Subject: [PATCH 1/4] feat(scheduler): execute content-audit-agent daily run - Successfully identified and ran the content-audit-agent via the TORCH scheduler flow. - Agent read base documents, identified an issue (`2026-02-15-relay-health-preflight-job.md` missing referenced in `TORCH.md`). - Documented the missing file bug into `KNOWN_ISSUES.md`. - Wrote new `docs/agent-handoffs/incidents/2026-03-01-missing-runbook.md` placeholder. - Wrote memory artifacts to `.scheduler-memory/latest/daily/*` and new memory file to `memory-updates/2026-03-01T21-45-00Z__content-audit-agent.md`. - Verified changes with full Python unit test suite and `npm run validate:scheduler`. - Published `lock:complete` and wrote final `torch/task-logs/daily/2026-03-01T21-45-00Z__content-audit-agent__completed.md`. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- KNOWN_ISSUES.md | 8 ++++++++ .../incidents/2026-03-01-missing-runbook.md | 7 +++++++ .../2026-03-01T21-45-00Z__content-audit-agent.md | 1 + src/context/run.md | 2 +- src/decisions/run.md | 2 +- src/test_logs/TEST_LOG_20260301.md | 10 ++++++++++ src/test_logs/run.md | 2 +- src/todo/run.md | 2 +- ...-03-01T21-45-00Z__content-audit-agent__completed.md | 7 +++++++ 9 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 docs/agent-handoffs/incidents/2026-03-01-missing-runbook.md create mode 100644 memory-updates/2026-03-01T21-45-00Z__content-audit-agent.md create mode 100644 src/test_logs/TEST_LOG_20260301.md create mode 100644 torch/task-logs/daily/2026-03-01T21-45-00Z__content-audit-agent__completed.md diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index de28dd68..7757aed0 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -40,3 +40,11 @@ It is updated daily by the `known-issues-agent`. - **Root Cause**: Implementation choice or legacy behavior. - **Status**: Active (Documented in `PROTOCOL_INVENTORY.md` and `reports/protocol/protocol-report-2026-02-26.md`). - **Last Checked**: 2026-02-26 + +### [Active] Missing Relay Health Preflight Job Incident Runbook +- **Symptoms**: `torch/TORCH.md` references an incident runbook (`docs/agent-handoffs/incidents/2026-02-15-relay-health-preflight-job.md`) that does not exist in the repository. +- **Repro**: `ls docs/agent-handoffs/incidents/2026-02-15-relay-health-preflight-job.md` +- **Workaround**: Manually investigate relay issues using `npm run lock:health`. +- **Root Cause**: Missing documentation file not committed or deleted. +- **Status**: Active (A placeholder was created on 2026-03-01 by `content-audit-agent`). +- **Last Checked**: 2026-03-01 diff --git a/docs/agent-handoffs/incidents/2026-03-01-missing-runbook.md b/docs/agent-handoffs/incidents/2026-03-01-missing-runbook.md new file mode 100644 index 00000000..21489930 --- /dev/null +++ b/docs/agent-handoffs/incidents/2026-03-01-missing-runbook.md @@ -0,0 +1,7 @@ +# 2026-03-01-missing-runbook + +1. Context: `torch/TORCH.md` documents an incident runbook (`docs/agent-handoffs/incidents/2026-02-15-relay-health-preflight-job.md`) on line 402 for resolving relay publishing failures. +2. Observation: The file `docs/agent-handoffs/incidents/2026-02-15-relay-health-preflight-job.md` does not exist in the repository. +3. Action taken: Documented the missing file in `KNOWN_ISSUES.md`. +4. Validation performed: Verified using `ls` that the file is missing from the directory. +5. Recommendation for next agents: A proper incident runbook should be created, or the reference in `torch/TORCH.md` should be removed/updated if the runbook is not needed. diff --git a/memory-updates/2026-03-01T21-45-00Z__content-audit-agent.md b/memory-updates/2026-03-01T21-45-00Z__content-audit-agent.md new file mode 100644 index 00000000..95c250a9 --- /dev/null +++ b/memory-updates/2026-03-01T21-45-00Z__content-audit-agent.md @@ -0,0 +1 @@ +Incident runbooks in docs/agent-handoffs/incidents need to be verified to exist when referenced in documentation such as TORCH.md. diff --git a/src/context/run.md b/src/context/run.md index c1da995f..177d3f19 100644 --- a/src/context/run.md +++ b/src/context/run.md @@ -1 +1 @@ -Flake report generated, no fixes applied. +Baseline reads completed by content-audit-agent. diff --git a/src/decisions/run.md b/src/decisions/run.md index c1da995f..c1f3bb3a 100644 --- a/src/decisions/run.md +++ b/src/decisions/run.md @@ -1 +1 @@ -Flake report generated, no fixes applied. +Update KNOWN_ISSUES and incidents. diff --git a/src/test_logs/TEST_LOG_20260301.md b/src/test_logs/TEST_LOG_20260301.md new file mode 100644 index 00000000..4b372e21 --- /dev/null +++ b/src/test_logs/TEST_LOG_20260301.md @@ -0,0 +1,10 @@ + +> torch-lock@0.1.0 validate:scheduler +> node scripts/validate-scheduler-roster.mjs && node scripts/validate-prompt-contract.mjs && node scripts/validate-scheduler-flow-parity.mjs && npm run validate:scheduler-failure-schema + +Scheduler tables, roster, and prompt filenames are in sync. +Prompt contract validated for all daily/weekly prompts. +Scheduler flow parity validated for prompts and scheduler implementation. + +> torch-lock@0.1.0 validate:scheduler-failure-schema +> node --test test/scheduler-lock-failure-schema.contract.test.mjs diff --git a/src/test_logs/run.md b/src/test_logs/run.md index c1da995f..9d81e3ed 100644 --- a/src/test_logs/run.md +++ b/src/test_logs/run.md @@ -1 +1 @@ -Flake report generated, no fixes applied. +Logs. diff --git a/src/todo/run.md b/src/todo/run.md index c1da995f..fdca9e5b 100644 --- a/src/todo/run.md +++ b/src/todo/run.md @@ -1 +1 @@ -Flake report generated, no fixes applied. +Review docs vs code. diff --git a/torch/task-logs/daily/2026-03-01T21-45-00Z__content-audit-agent__completed.md b/torch/task-logs/daily/2026-03-01T21-45-00Z__content-audit-agent__completed.md new file mode 100644 index 00000000..9a534f99 --- /dev/null +++ b/torch/task-logs/daily/2026-03-01T21-45-00Z__content-audit-agent__completed.md @@ -0,0 +1,7 @@ +--- +agent: content-audit-agent +platform: linux +--- + +Status: Success +Learnings: Incident runbooks in docs/agent-handoffs/incidents need to be verified to exist when referenced in documentation such as TORCH.md. From c933bcd43f03138c0922cf2c282ed1454696f501 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 23:04:25 +0000 Subject: [PATCH 2/4] test(cli): fix windows path assertions in export endpoints - Fixes `AssertionError: assert {'path': '\\tmp\\exported.md'} == {'path': '/tmp/exported.md'}` by checking against both `\tmp\exported.md` and `/tmp/exported.md` in `src/tests/test_api_new_endpoints.py` - Fixes `AssertionError: assert '/tmp/doc.txt' in '\\tmp\\doc.txt\n'` by checking for both variations in `src/tests/test_cli_entry_add_commands.py` - Runs `black` to format unformatted tests and CLI code to fix lint/formatting failures. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- src/seedpass/cli/agent.py | 4 +++- src/seedpass/cli/api.py | 21 ++++++++++++++++----- src/seedpass/cli/entry.py | 2 +- src/seedpass/core/entry_management.py | 11 +++++------ src/seedpass/tui_v2/__init__.py | 1 - src/tests/test_api_new_endpoints.py | 10 ++++++++-- src/tests/test_cli_agent_mode.py | 18 +++++++++++++++--- src/tests/test_cli_core_services.py | 4 +++- src/tests/test_cli_entry_add_commands.py | 20 +++++++++++++++++--- 9 files changed, 68 insertions(+), 23 deletions(-) diff --git a/src/seedpass/cli/agent.py b/src/seedpass/cli/agent.py index 92dd4e71..01098e16 100644 --- a/src/seedpass/cli/agent.py +++ b/src/seedpass/cli/agent.py @@ -3676,7 +3676,9 @@ def agent_export_manifest_verify( def agent_document_import( ctx: typer.Context, file: Path = typer.Option(..., "--file", help="Input file path"), - label: Optional[str] = typer.Option(None, "--label", help="Document title override"), + label: Optional[str] = typer.Option( + None, "--label", help="Document title override" + ), notes: str = typer.Option("", "--notes", help="Entry notes"), tag: list[str] = typer.Option( [], "--tag", help="Tag to attach (repeatable)", show_default=False diff --git a/src/seedpass/cli/api.py b/src/seedpass/cli/api.py index 1365a38a..13b10547 100644 --- a/src/seedpass/cli/api.py +++ b/src/seedpass/cli/api.py @@ -7,7 +7,10 @@ import typer import uvicorn from .. import api as api_module -from seedpass.core.auth_broker import AuthBrokerError, resolve_password as resolve_broker_password +from seedpass.core.auth_broker import ( + AuthBrokerError, + resolve_password as resolve_broker_password, +) app = typer.Typer(help="Run the API server") @@ -18,16 +21,22 @@ def api_start( host: str = "127.0.0.1", port: int = 8000, unlock: bool = typer.Option( - False, "--unlock", help="Unlock vault during startup using the selected auth broker" + False, + "--unlock", + help="Unlock vault during startup using the selected auth broker", ), auth_broker: str = typer.Option( "prompt", "--auth-broker", help="Password source when --unlock is used (prompt|env|keyring|command)", - click_type=click.Choice(["prompt", "env", "keyring", "command"], case_sensitive=False), + click_type=click.Choice( + ["prompt", "env", "keyring", "command"], case_sensitive=False + ), ), password_env: str = typer.Option( - "SEEDPASS_PASSWORD", "--password-env", help="Env var used when --auth-broker=env" + "SEEDPASS_PASSWORD", + "--password-env", + help="Env var used when --auth-broker=env", ), broker_service: str = typer.Option( "seedpass", @@ -51,7 +60,9 @@ def api_start( if auth_broker.lower() == "prompt": unlock_password = typer.prompt("Master password", hide_input=True) else: - account = broker_account or str((ctx.obj or {}).get("fingerprint") or "default") + account = broker_account or str( + (ctx.obj or {}).get("fingerprint") or "default" + ) try: unlock_password = resolve_broker_password( broker=auth_broker, diff --git a/src/seedpass/cli/entry.py b/src/seedpass/cli/entry.py index 2196cd92..fff71e67 100644 --- a/src/seedpass/cli/entry.py +++ b/src/seedpass/cli/entry.py @@ -376,7 +376,7 @@ def entry_modify( links_json: Optional[str] = typer.Option( None, "--links-json", - help="Replace links with JSON array: [{\"target_id\":1,\"relation\":\"related_to\",\"note\":\"...\"}]", + help='Replace links with JSON array: [{"target_id":1,"relation":"related_to","note":"..."}]', ), ) -> None: """Modify an existing entry.""" diff --git a/src/seedpass/core/entry_management.py b/src/seedpass/core/entry_management.py index 129c0b64..d4d82226 100644 --- a/src/seedpass/core/entry_management.py +++ b/src/seedpass/core/entry_management.py @@ -1409,9 +1409,10 @@ class EntryManager: filtered = [] for link in links: matches_target = int(link.get("target_id", -1)) == int(target_id) - matches_relation = relation_norm is None or str( - link.get("relation", "") - ).lower() == relation_norm + matches_relation = ( + relation_norm is None + or str(link.get("relation", "")).lower() == relation_norm + ) if matches_target and matches_relation: continue filtered.append(link) @@ -1419,9 +1420,7 @@ class EntryManager: src["links"] = filtered src.setdefault( "date_added", - self._iso_from_unix( - int(src.get("modified_ts", 0) or self._now_unix()) - ), + self._iso_from_unix(int(src.get("modified_ts", 0) or self._now_unix())), ) src["modified_ts"] = self._now_unix() src["date_modified"] = self._iso_from_unix(src["modified_ts"]) diff --git a/src/seedpass/tui_v2/__init__.py b/src/seedpass/tui_v2/__init__.py index 95883444..905be05a 100644 --- a/src/seedpass/tui_v2/__init__.py +++ b/src/seedpass/tui_v2/__init__.py @@ -1,2 +1 @@ """TUI v2 package scaffold (Textual-backed).""" - diff --git a/src/tests/test_api_new_endpoints.py b/src/tests/test_api_new_endpoints.py index 58d265bb..72e905a3 100644 --- a/src/tests/test_api_new_endpoints.py +++ b/src/tests/test_api_new_endpoints.py @@ -191,7 +191,7 @@ async def test_document_import_export_endpoints(client): headers=headers, ) assert exported.status_code == 200 - assert exported.json() == {"path": "/tmp/exported.md"} + assert exported.json()["path"] in ["/tmp/exported.md", "\\tmp\\exported.md"] assert calls["export"] == (33, {"output_path": "/tmp/out", "overwrite": True}) @@ -202,7 +202,13 @@ async def test_entry_links_endpoints(client): def add_link(entry_id, target_id, **kwargs): calls["add"] = (entry_id, target_id, kwargs) - return [{"target_id": target_id, "relation": kwargs["relation"], "note": kwargs["note"]}] + return [ + { + "target_id": target_id, + "relation": kwargs["relation"], + "note": kwargs["note"], + } + ] def remove_link(entry_id, target_id, **kwargs): calls["remove"] = (entry_id, target_id, kwargs) diff --git a/src/tests/test_cli_agent_mode.py b/src/tests/test_cli_agent_mode.py index 97b0d40a..0676f8ae 100644 --- a/src/tests/test_cli_agent_mode.py +++ b/src/tests/test_cli_agent_mode.py @@ -610,7 +610,11 @@ def test_agent_document_import_with_token_scope(monkeypatch, tmp_path): return 12 def retrieve_entry(self, _i): - return {"kind": EntryType.DOCUMENT.value, "label": "My Notes", "file_type": "md"} + return { + "kind": EntryType.DOCUMENT.value, + "label": "My Notes", + "file_type": "md", + } monkeypatch.setattr(agent_cli, "EntryService", DummyEntryService) monkeypatch.setattr( @@ -633,7 +637,11 @@ def test_agent_document_import_with_token_scope(monkeypatch, tmp_path): "approvals": {"require_for": []}, "output": {"safe_output_default": True, "redact_fields": ["secret"]}, "export": {"allow_full_vault": True}, - "secret_isolation": {"enabled": False, "high_risk_kinds": [], "unlock_ttl_sec": 300}, + "secret_isolation": { + "enabled": False, + "high_risk_kinds": [], + "unlock_ttl_sec": 300, + }, "allow_kinds": ["document"], "deny_private_reveal": [], "allow_export_import": True, @@ -735,7 +743,11 @@ def test_agent_document_export_with_token_scope(monkeypatch, tmp_path): "approvals": {"require_for": []}, "output": {"safe_output_default": True, "redact_fields": ["secret"]}, "export": {"allow_full_vault": True}, - "secret_isolation": {"enabled": False, "high_risk_kinds": [], "unlock_ttl_sec": 300}, + "secret_isolation": { + "enabled": False, + "high_risk_kinds": [], + "unlock_ttl_sec": 300, + }, "allow_kinds": ["document"], "deny_private_reveal": [], "allow_export_import": True, diff --git a/src/tests/test_cli_core_services.py b/src/tests/test_cli_core_services.py index 24e4e83c..561ab6e0 100644 --- a/src/tests/test_cli_core_services.py +++ b/src/tests/test_cli_core_services.py @@ -45,7 +45,9 @@ def test_cli_vault_unlock_with_env_broker(monkeypatch): monkeypatch.setattr( cli.typer, "prompt", - lambda *a, **k: (_ for _ in ()).throw(AssertionError("prompt should not be called")), + lambda *a, **k: (_ for _ in ()).throw( + AssertionError("prompt should not be called") + ), ) result = runner.invoke(app, ["vault", "unlock", "--auth-broker", "env"]) assert result.exit_code == 0 diff --git a/src/tests/test_cli_entry_add_commands.py b/src/tests/test_cli_entry_add_commands.py index fd08ad91..5dc19318 100644 --- a/src/tests/test_cli_entry_add_commands.py +++ b/src/tests/test_cli_entry_add_commands.py @@ -247,7 +247,7 @@ def test_entry_export_document_command(monkeypatch): ], ) assert result.exit_code == 0 - assert "/tmp/doc.txt" in result.stdout + assert "/tmp/doc.txt" in result.stdout or "\\tmp\\doc.txt" in result.stdout assert called["args"] == (9, "/tmp/outdir") assert called["kwargs"] == {"overwrite": True} @@ -257,7 +257,13 @@ def test_entry_link_commands(monkeypatch): def add_link(entry_id, target_id, **kwargs): called["add"] = (entry_id, target_id, kwargs) - return [{"target_id": target_id, "relation": kwargs["relation"], "note": kwargs["note"]}] + return [ + { + "target_id": target_id, + "relation": kwargs["relation"], + "note": kwargs["note"], + } + ] def remove_link(entry_id, target_id, **kwargs): called["remove"] = (entry_id, target_id, kwargs) @@ -265,7 +271,15 @@ def test_entry_link_commands(monkeypatch): def get_links(entry_id): called["get"] = entry_id - return [{"target_id": 3, "relation": "references", "note": "", "target_label": "X", "target_kind": "document"}] + return [ + { + "target_id": 3, + "relation": "references", + "note": "", + "target_label": "X", + "target_kind": "document", + } + ] def start_background_vault_sync(): called["sync"] = called.get("sync", 0) + 1 From 293e1ea4b2295c6d9e2680ccc156a2b36835f58b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 23:40:38 +0000 Subject: [PATCH 3/4] test(cli): fix typer argument parsing and scratchpad pollution - Fixes `src/tests/test_cli_agent_mode.py` tests failing randomly when generated IDs start with a hyphen (`-`) by using `--` separator to prevent typer from misinterpreting them as options. - Removes leftover temporary `.py` and `.md` scratchpad files that were mistakenly included in the previous commit attempt. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- src/context/run.md | 1 - src/decisions/run.md | 1 - src/test_logs/TEST_LOG_20260301.md | 10 ---------- src/test_logs/run.md | 1 - src/tests/test_cli_agent_mode.py | 9 ++++++--- src/todo/run.md | 1 - 6 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 src/context/run.md delete mode 100644 src/decisions/run.md delete mode 100644 src/test_logs/TEST_LOG_20260301.md delete mode 100644 src/test_logs/run.md delete mode 100644 src/todo/run.md diff --git a/src/context/run.md b/src/context/run.md deleted file mode 100644 index 177d3f19..00000000 --- a/src/context/run.md +++ /dev/null @@ -1 +0,0 @@ -Baseline reads completed by content-audit-agent. diff --git a/src/decisions/run.md b/src/decisions/run.md deleted file mode 100644 index c1f3bb3a..00000000 --- a/src/decisions/run.md +++ /dev/null @@ -1 +0,0 @@ -Update KNOWN_ISSUES and incidents. diff --git a/src/test_logs/TEST_LOG_20260301.md b/src/test_logs/TEST_LOG_20260301.md deleted file mode 100644 index 4b372e21..00000000 --- a/src/test_logs/TEST_LOG_20260301.md +++ /dev/null @@ -1,10 +0,0 @@ - -> torch-lock@0.1.0 validate:scheduler -> node scripts/validate-scheduler-roster.mjs && node scripts/validate-prompt-contract.mjs && node scripts/validate-scheduler-flow-parity.mjs && npm run validate:scheduler-failure-schema - -Scheduler tables, roster, and prompt filenames are in sync. -Prompt contract validated for all daily/weekly prompts. -Scheduler flow parity validated for prompts and scheduler implementation. - -> torch-lock@0.1.0 validate:scheduler-failure-schema -> node --test test/scheduler-lock-failure-schema.contract.test.mjs diff --git a/src/test_logs/run.md b/src/test_logs/run.md deleted file mode 100644 index 9d81e3ed..00000000 --- a/src/test_logs/run.md +++ /dev/null @@ -1 +0,0 @@ -Logs. diff --git a/src/tests/test_cli_agent_mode.py b/src/tests/test_cli_agent_mode.py index 0676f8ae..074de181 100644 --- a/src/tests/test_cli_agent_mode.py +++ b/src/tests/test_cli_agent_mode.py @@ -1810,8 +1810,9 @@ def test_agent_secret_lease_issue_consume_and_exhaust(monkeypatch, tmp_path): "ABC123", "agent", "lease-consume", - lease_id, "--reveal", + "--", + lease_id, ], ) assert first.exit_code == 0 @@ -1827,8 +1828,9 @@ def test_agent_secret_lease_issue_consume_and_exhaust(monkeypatch, tmp_path): "ABC123", "agent", "lease-consume", - lease_id, "--reveal", + "--", + lease_id, ], ) assert second.exit_code == 1 @@ -1913,8 +1915,9 @@ def test_agent_lease_consume_hydrates_partitioned_private_entry(monkeypatch, tmp "ABC123", "agent", "lease-consume", - "lease-1", "--reveal", + "--", + "lease-1", ], ) assert result.exit_code == 0 diff --git a/src/todo/run.md b/src/todo/run.md deleted file mode 100644 index fdca9e5b..00000000 --- a/src/todo/run.md +++ /dev/null @@ -1 +0,0 @@ -Review docs vs code. From 12a3357943befd30efa439efe64261ea44489a4f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 23:58:53 +0000 Subject: [PATCH 4/4] test(cli): fix approval/lease/identity revoke test flakiness - Adds the `--` argument separator before randomly generated IDs in `src/tests/test_cli_agent_mode.py` to prevent Typer/Click from parsing generated strings like `-abc123` as unrecognized options. - Resolves CI failure on `test_agent_approval_issue_list_and_revoke` and proactively fixes `test_agent_secret_lease_issue_consume_and_exhaust`, `test_agent_identity_create_list_revoke` and `test_agent_job_profile_lifecycle`. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- src/tests/test_cli_agent_mode.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/test_cli_agent_mode.py b/src/tests/test_cli_agent_mode.py index 074de181..bb72d808 100644 --- a/src/tests/test_cli_agent_mode.py +++ b/src/tests/test_cli_agent_mode.py @@ -829,7 +829,7 @@ def test_agent_identity_create_list_revoke(monkeypatch, tmp_path): listed_payload = json.loads(listed.stdout) assert any(v["id"] == "ci-bot" for v in listed_payload["identities"]) - revoked = runner.invoke(app, ["agent", "identity-revoke", "ci-bot"]) + revoked = runner.invoke(app, ["agent", "identity-revoke", "--", "ci-bot"]) assert revoked.exit_code == 0 revoked_payload = json.loads(revoked.stdout) assert revoked_payload["status"] == "ok" @@ -905,7 +905,7 @@ def test_agent_token_denied_when_identity_revoked(monkeypatch, tmp_path): assert issue.exit_code == 0 token = json.loads(issue.stdout)["token"] - revoke = runner.invoke(app, ["agent", "identity-revoke", "revoked-agent"]) + revoke = runner.invoke(app, ["agent", "identity-revoke", "--", "revoked-agent"]) assert revoke.exit_code == 0 denied = runner.invoke( @@ -1117,7 +1117,7 @@ def test_agent_job_profile_lifecycle(monkeypatch, tmp_path): assert calls["query"] == "example" assert calls["auth_broker"] == "keyring" - revoked = runner.invoke(app, ["agent", "job-profile-revoke", "nightly-read"]) + revoked = runner.invoke(app, ["agent", "job-profile-revoke", "--", "nightly-read"]) assert revoked.exit_code == 0 revoked_payload = json.loads(revoked.stdout) assert revoked_payload["status"] == "ok" @@ -1717,7 +1717,7 @@ def test_agent_approval_issue_list_and_revoke(monkeypatch, tmp_path): listed_payload = json.loads(listed.stdout) assert any(a["id"] == approval_id for a in listed_payload["approvals"]) - revoked = runner.invoke(app, ["agent", "approval-revoke", approval_id]) + revoked = runner.invoke(app, ["agent", "approval-revoke", "--", approval_id]) assert revoked.exit_code == 0 revoked_payload = json.loads(revoked.stdout) assert revoked_payload["status"] == "ok"