From 162a8a30cf22184c8b4c73513b6b9182f6caa9af Mon Sep 17 00:00:00 2001 From: anvil Date: Sat, 18 Apr 2026 05:23:06 +0000 Subject: [PATCH 1/2] chore(privacy): scrub real-name / personal-UUID / handle leaks from repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This cleans up personal identifiers that were checked in over time. Everything replaced with clearly-placeholder stand-ins so docs/tests keep working but no longer point at a specific real account. Critical scrubs: - 'Jacob Taunton' -> 'Alex Example' (real full name in test fixture) - 'Jacob MacBook Pro' -> 'Alex's Laptop' (device name in spec examples) - prod/staging space UUIDs -> 'aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaaaa' - prod/staging agent UUIDs -> 'bbbbbbbb-bbbb-4bbb-bbbb-bbbbbbbbbbbb' Handle scrubs (outside CODEOWNERS, which legitimately lists GitHub owners): - 'madtank' -> 'alex' (21 files: tests, specs, docs, examples) - 'next-orion' profile name -> 'demo-agent' - 'next-chatgpt' profile name -> 'peer-agent' - 'chatgpt_dev' test fixture agent -> 'demo_agent' Verified: pytest tests/ -> 224 passed. ruff check + format clean (pre-push hook). CODEOWNERS @madtank / @anvil lines are intentionally preserved — those are real GitHub assignments for code ownership. Co-Authored-By: Claude Opus 4.7 (1M context) --- ax_cli/commands/mint.py | 2 +- ax_cli/commands/profile.py | 2 +- channel/README.md | 6 +++--- docs/login-e2e-runbook.md | 10 +++++----- docs/mcp-app-signal-adapter.md | 2 +- examples/hermes_sentinel/README.md | 4 ++-- examples/hermes_sentinel/hermes_bridge.py | 2 +- specs/AGENT-PAT-001/spec.md | 4 ++-- specs/ATTACHMENT-FLOW-001/spec.md | 2 +- specs/AX-SCHEDULE-001/spec.md | 2 +- specs/AXCTL-BOOTSTRAP-001/spec.md | 8 ++++---- specs/CONTRACT-QA-001/spec.md | 2 +- specs/DEVICE-TRUST-001/spec.md | 4 ++-- specs/IDENTIFIER-DISPLAY-001/spec.md | 6 +++--- specs/LISTENER-001/spec.md | 2 +- specs/RUNTIME-CONFIG-001/spec.md | 2 +- specs/SEND-TO-AGENT-001/spec.md | 2 +- tests/test_alerts_commands.py | 8 ++++---- tests/test_apps_commands.py | 24 +++++++++++------------ tests/test_auth_commands.py | 4 ++-- tests/test_channel.py | 6 +++--- tests/test_config.py | 14 ++++++------- tests/test_qa_contracts.py | 4 ++-- tests/test_reminders_commands.py | 6 +++--- tests/test_tasks_commands.py | 2 +- tests/test_upload.py | 6 +++--- 26 files changed, 68 insertions(+), 68 deletions(-) diff --git a/ax_cli/commands/mint.py b/ax_cli/commands/mint.py index f2cef34..a6ff09e 100644 --- a/ax_cli/commands/mint.py +++ b/ax_cli/commands/mint.py @@ -123,7 +123,7 @@ def mint( ax token mint backend_sentinel --audience both --expires 30 ax token mint backend_sentinel --save-to /home/agent/.ax --profile prod-backend ax token mint backend_sentinel --save-to /home/agent/.ax --no-print-token - ax token mint 70c1b445-c733-44d8-8e75-9620452374a8 + ax token mint bbbbbbbb-bbbb-4bbb-bbbb-bbbbbbbbbbbb """ def status(message: str) -> None: diff --git a/ax_cli/commands/profile.py b/ax_cli/commands/profile.py index 2221b78..f25bba6 100644 --- a/ax_cli/commands/profile.py +++ b/ax_cli/commands/profile.py @@ -156,7 +156,7 @@ def _register_fingerprint(profile: dict) -> str | None: @app.command("add") def add( - name: str = typer.Argument(..., help="Profile name (e.g. next-orion)"), + name: str = typer.Argument(..., help="Profile name (e.g. demo-agent)"), url: str = typer.Option(..., "--url", help="Base URL (e.g. https://next.paxai.app)"), token_file: str = typer.Option(..., "--token-file", help="Path to token file"), agent_name: str = typer.Option(..., "--agent-name", help="Agent name"), diff --git a/channel/README.md b/channel/README.md index 78cac1f..b33620d 100644 --- a/channel/README.md +++ b/channel/README.md @@ -171,11 +171,11 @@ Use the smoke harness to test the channel runtime without restarting Claude Code ```bash python3 scripts/channel_smoke.py \ - --listener-profile next-orion \ - --sender-profile next-chatgpt \ + --listener-profile demo-agent \ + --sender-profile peer-agent \ --profile-workdir /home/ax-agent \ --agent orion \ - --space-id 49afd277-78d2-4a32-9858-3594cda684af \ + --space-id aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaaaa \ --case reply \ --channel-command 'bun run --cwd /home/ax-agent/channel --shell=bun --silent start --debug' ``` diff --git a/docs/login-e2e-runbook.md b/docs/login-e2e-runbook.md index 8087fa6..f0d8a05 100644 --- a/docs/login-e2e-runbook.md +++ b/docs/login-e2e-runbook.md @@ -52,7 +52,7 @@ Token captured: axp_u_******** Connecting to https://next.paxai.app... Token verified. Exchange successful. -Identity: madtank (...) +Identity: alex (...) Saved user login: .../config/user.toml ``` @@ -67,7 +67,7 @@ axdev token mint orion-e2e \ --audience both \ --expires 30 \ --save-to "$AX_E2E_ROOT/agents/orion-e2e" \ - --profile next-orion-e2e \ + --profile demo-e2e \ --no-print-token ``` @@ -75,14 +75,14 @@ Expected: - token file is created with mode `0600` - `.ax/config.toml` is created under the agent directory -- profile `next-orion-e2e` is created +- profile `demo-e2e` is created - raw `axp_a_...` token is not printed ## Verify Agent Runtime ```bash -axdev profile verify next-orion-e2e -eval "$(axdev profile env next-orion-e2e)" +axdev profile verify demo-e2e +eval "$(axdev profile env demo-e2e)" axdev auth whoami --json ``` diff --git a/docs/mcp-app-signal-adapter.md b/docs/mcp-app-signal-adapter.md index 0a051bc..8dc8d6c 100644 --- a/docs/mcp-app-signal-adapter.md +++ b/docs/mcp-app-signal-adapter.md @@ -51,7 +51,7 @@ axctl apps signal context \ --title 'Architecture diagram' \ --summary 'Open this in the Context Explorer panel.' \ --message 'context-backed app signal ready' \ - --to madtank \ + --to alex \ --alert-kind context_artifact \ --json ``` diff --git a/examples/hermes_sentinel/README.md b/examples/hermes_sentinel/README.md index 3e690c3..3cdc3ae 100644 --- a/examples/hermes_sentinel/README.md +++ b/examples/hermes_sentinel/README.md @@ -4,7 +4,7 @@ A minimal, runnable example of giving an aX agent a capable brain. Most aX agent examples (`examples/echo_agent.*`) are one-liners that prove the integration surface works. This example goes one step further: it -wires [hermes-agent](https://github.com/madtank/hermes-agent) — +wires [hermes-agent](https://github.com/alex/hermes-agent) — a batteries-included agentic runtime with tool use, file edits, terminal access, and multi-provider LLM support — to the `ax listen` dispatch loop. @@ -93,7 +93,7 @@ threading separate from runtime memory/session continuity. 3. **hermes-agent cloned and installed.** ```bash - git clone https://github.com/madtank/hermes-agent + git clone https://github.com/alex/hermes-agent cd hermes-agent python3 -m venv .venv source .venv/bin/activate diff --git a/examples/hermes_sentinel/hermes_bridge.py b/examples/hermes_sentinel/hermes_bridge.py index 01df109..e90ea77 100755 --- a/examples/hermes_sentinel/hermes_bridge.py +++ b/examples/hermes_sentinel/hermes_bridge.py @@ -21,7 +21,7 @@ ------------- 1. The hermes-agent repo is cloned locally and installed in a venv. - See https://github.com/madtank/hermes-agent for install steps. + See https://github.com/alex/hermes-agent for install steps. 2. `HERMES_REPO_PATH` env var points at the hermes-agent checkout (or the default `~/hermes-agent` exists). diff --git a/specs/AGENT-PAT-001/spec.md b/specs/AGENT-PAT-001/spec.md index f5e9939..27fc2dd 100644 --- a/specs/AGENT-PAT-001/spec.md +++ b/specs/AGENT-PAT-001/spec.md @@ -1,7 +1,7 @@ # AGENT-PAT-001: Agent PAT Minting and JWT Exchange **Status:** Draft -**Owner:** @madtank / @ChatGPT +**Owner:** @alex / @ChatGPT **Date:** 2026-04-13 **Related:** AXCTL-BOOTSTRAP-001, DEVICE-TRUST-001, CLI-WORKFLOW-001, LISTENER-001 @@ -175,7 +175,7 @@ Required behavior: Example: ```bash -axctl token mint orion --audience cli --expires 30 --profile next-orion +axctl token mint orion --audience cli --expires 30 --profile demo-agent ``` ## Approval Policy diff --git a/specs/ATTACHMENT-FLOW-001/spec.md b/specs/ATTACHMENT-FLOW-001/spec.md index c6a12bf..591799c 100644 --- a/specs/ATTACHMENT-FLOW-001/spec.md +++ b/specs/ATTACHMENT-FLOW-001/spec.md @@ -1,7 +1,7 @@ # ATTACHMENT-FLOW-001: CLI Context Attachment Flow **Status:** Draft -**Owner:** @madtank +**Owner:** @alex **Date:** 2026-04-12 **Related:** ax-backend ATTACHMENTS-001, LISTENER-001 diff --git a/specs/AX-SCHEDULE-001/spec.md b/specs/AX-SCHEDULE-001/spec.md index 2ff8410..7af0d00 100644 --- a/specs/AX-SCHEDULE-001/spec.md +++ b/specs/AX-SCHEDULE-001/spec.md @@ -55,7 +55,7 @@ Stored in `~/.ax/schedules/.json`: "command": "ax send \"@orion Run staging health checks\" --wait --timeout 120", "interval_seconds": 900, "anchor_time": null, - "space_id": "49afd277-78d2-4a32-9858-3594cda684af", + "space_id": "aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaaaa", "report_to": "main", "enabled": true, "created_at": "2026-04-06T22:30:00Z", diff --git a/specs/AXCTL-BOOTSTRAP-001/spec.md b/specs/AXCTL-BOOTSTRAP-001/spec.md index b579def..a95d1f3 100644 --- a/specs/AXCTL-BOOTSTRAP-001/spec.md +++ b/specs/AXCTL-BOOTSTRAP-001/spec.md @@ -1,7 +1,7 @@ # AXCTL-BOOTSTRAP-001: Bootstrap and Secure Storage **Status:** Draft -**Owner:** @madtank / @ChatGPT +**Owner:** @alex / @ChatGPT **Date:** 2026-04-13 **Related:** DEVICE-TRUST-001, AGENT-PAT-001, docs/agent-authentication.md, docs/credential-security.md @@ -165,7 +165,7 @@ future device-enrollment command aX URL: https://next.paxai.app Bootstrap token: ******** -Device name: Jacob MacBook Pro +Device name: Alex's Laptop Device fingerprint: SHA256: 4F2A 91C7 9B10 55E0 @@ -173,7 +173,7 @@ SHA256: 4F2A 91C7 9B10 55E0 Authorize this device in aX? [Y/n] ✓ Device enrolled ✓ Credential stored in macOS Keychain -✓ Verified as madtank in madtank's Workspace +✓ Verified as alex in Alex's Workspace ``` ## Storage Contract @@ -224,7 +224,7 @@ Request: { "bootstrap_token": "axp_u_bootstrap_...", "device_public_key": "base64url...", - "device_name": "Jacob MacBook Pro", + "device_name": "Alex's Laptop", "device_fingerprint": "sha256:...", "space_id": "optional-default-space", "client": { diff --git a/specs/CONTRACT-QA-001/spec.md b/specs/CONTRACT-QA-001/spec.md index 1c1a997..ee65c9b 100644 --- a/specs/CONTRACT-QA-001/spec.md +++ b/specs/CONTRACT-QA-001/spec.md @@ -1,7 +1,7 @@ # CONTRACT-QA-001: API-First Regression Harness **Status:** Draft -**Owner:** @ChatGPT / @madtank +**Owner:** @ChatGPT / @alex **Date:** 2026-04-13 **Related:** AXCTL-BOOTSTRAP-001, AGENT-PAT-001, ATTACHMENT-FLOW-001, LISTENER-001, frontend FRONTEND-021, MCP-APPS diff --git a/specs/DEVICE-TRUST-001/spec.md b/specs/DEVICE-TRUST-001/spec.md index 1b2a0f5..7bd8041 100644 --- a/specs/DEVICE-TRUST-001/spec.md +++ b/specs/DEVICE-TRUST-001/spec.md @@ -1,7 +1,7 @@ # DEVICE-TRUST-001: Device Trust and Approval **Status:** Draft -**Owner:** @madtank / @ChatGPT +**Owner:** @alex / @ChatGPT **Date:** 2026-04-13 **Related:** AXCTL-BOOTSTRAP-001, AGENT-PAT-001, docs/credential-security.md @@ -109,7 +109,7 @@ Example copy: ```text Authorize new device -Device: Jacob MacBook Pro +Device: Alex's Laptop CLI: axctl 0.4.0 Fingerprint: SHA256 4F2A 91C7 9B10 55E0 Requested access: Mint agent credentials for this workspace diff --git a/specs/IDENTIFIER-DISPLAY-001/spec.md b/specs/IDENTIFIER-DISPLAY-001/spec.md index 945a632..d1c726b 100644 --- a/specs/IDENTIFIER-DISPLAY-001/spec.md +++ b/specs/IDENTIFIER-DISPLAY-001/spec.md @@ -1,7 +1,7 @@ # IDENTIFIER-DISPLAY-001: Human-Readable Identifier Display **Status:** Draft -**Owner:** @madtank / @ChatGPT +**Owner:** @alex / @ChatGPT **Date:** 2026-04-13 **Related:** AXCTL-BOOTSTRAP-001, AGENT-PAT-001, LISTENER-001 @@ -43,7 +43,7 @@ Default text output should prefer readable fields. Examples: ```text -Account: madtank +Account: alex Space: team-hub Agent: orion ``` @@ -58,7 +58,7 @@ Space: team-hub (12d6eafd...) ```json { - "space_id": "12d6eafd-0316-4f3e-be33-fd8a3fd90f67", + "space_id": "aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaaaa", "space_slug": "team-hub", "space_name": "Team Hub" } diff --git a/specs/LISTENER-001/spec.md b/specs/LISTENER-001/spec.md index 3f581e8..c53bbbf 100644 --- a/specs/LISTENER-001/spec.md +++ b/specs/LISTENER-001/spec.md @@ -1,7 +1,7 @@ # LISTENER-001: Mention and Reply Delivery for CLI Listeners **Status:** Draft -**Owner:** @madtank +**Owner:** @alex **Date:** 2026-04-12 **Related:** ATTACHMENTS-001, ax-backend PLATFORM-001/SPEC-SSE-001 diff --git a/specs/RUNTIME-CONFIG-001/spec.md b/specs/RUNTIME-CONFIG-001/spec.md index 86b6097..36446dc 100644 --- a/specs/RUNTIME-CONFIG-001/spec.md +++ b/specs/RUNTIME-CONFIG-001/spec.md @@ -1,7 +1,7 @@ # RUNTIME-CONFIG-001: Shared Agent Runtime Configuration **Status:** Draft -**Owner:** @madtank / @ChatGPT +**Owner:** @alex / @ChatGPT **Date:** 2026-04-13 **Related:** AGENT-PAT-001, AXCTL-BOOTSTRAP-001, IDENTIFIER-DISPLAY-001 diff --git a/specs/SEND-TO-AGENT-001/spec.md b/specs/SEND-TO-AGENT-001/spec.md index 812f8a8..c283a87 100644 --- a/specs/SEND-TO-AGENT-001/spec.md +++ b/specs/SEND-TO-AGENT-001/spec.md @@ -6,7 +6,7 @@ Owner: @orion (CLI contract) + @frontend_sentinel (card surfaces) Status: DRAFT — ready for team review Date: 2026-04-16 Task: b38a7475-8bf6-445e-bd6e-1845222885dd -Trigger: live repro message 1a365934-b596-41fc-adb1-4dce52dfadb1 (madtank +Trigger: live repro message 1a365934-b596-41fc-adb1-4dce52dfadb1 (alex + screenshots: users need an obvious way to send a task or alert to an agent as a real request with structured context). Composes: SEND-RECEIPTS-001 (PR #108 in ax-agents, delivery-receipts contract) diff --git a/tests/test_alerts_commands.py b/tests/test_alerts_commands.py index b71bb54..a5f48ff 100644 --- a/tests/test_alerts_commands.py +++ b/tests/test_alerts_commands.py @@ -394,7 +394,7 @@ def test_source_task_falls_back_to_creator_when_no_assignee(monkeypatch): } } agent_payloads = { - "agent-creator-id": {"agent": {"id": "agent-creator-id", "name": "madtank"}}, + "agent-creator-id": {"agent": {"id": "agent-creator-id", "name": "alex"}}, } class _TaskAwareHttp: @@ -427,7 +427,7 @@ def json(self): ["alerts", "send", "check", "--kind", "reminder", "--source-task", "t-noa"], ) assert result.exit_code == 0, _strip_ansi(result.stdout) - assert fake.sent["metadata"]["alert"]["target_agent"] == "madtank" + assert fake.sent["metadata"]["alert"]["target_agent"] == "alex" def test_explicit_target_beats_task_auto_resolution(monkeypatch): @@ -458,11 +458,11 @@ def get(self, path: str, *, headers: dict) -> Any: "--source-task", "dfef4c92", "--target", - "@madtank", + "@alex", ], ) assert result.exit_code == 0, _strip_ansi(result.stdout) - assert fake.sent["metadata"]["alert"]["target_agent"] == "madtank" + assert fake.sent["metadata"]["alert"]["target_agent"] == "alex" def test_state_change_on_non_alert_message_errors_clearly(monkeypatch): diff --git a/tests/test_apps_commands.py b/tests/test_apps_commands.py index e1ffc16..09055bb 100644 --- a/tests/test_apps_commands.py +++ b/tests/test_apps_commands.py @@ -126,7 +126,7 @@ def get_context(self, key, *, space_id=None): "url": "https://dev.paxai.app/api/v1/uploads/files/channel-flow.svg", } ), - "agent_name": "user:madtank", + "agent_name": "user:alex", "summary": "SVG upload", "ttl": 86400, }, @@ -182,21 +182,21 @@ def whoami(self): calls["whoami"] = True return { "id": "user-1", - "email": "madtank@example.com", - "full_name": "Jacob Taunton", - "username": "madtank", + "email": "alex@example.com", + "full_name": "Alex Example", + "username": "alex", "role": "admin", "bound_agent": { "agent_id": "agent-1", - "agent_name": "chatgpt_dev", + "agent_name": "demo_agent", "default_space_id": "space-1", - "default_space_name": "madtank's Workspace", + "default_space_name": "Alex's Workspace", "allowed_spaces": [ - {"space_id": "space-1", "name": "madtank's Workspace", "is_default": True}, + {"space_id": "space-1", "name": "alex's Workspace", "is_default": True}, ], }, "resolved_space_id": "space-1", - "resolved_agent": "chatgpt_dev", + "resolved_agent": "demo_agent", } def send_message( @@ -248,12 +248,12 @@ def send_message( "principal_kind": "agent", "role_label": "Agent", "status": "active", - "handle": "chatgpt_dev", - "display_name": "chatgpt_dev", + "handle": "demo_agent", + "display_name": "demo_agent", "id": "agent-1", } - assert initial_data["data"]["context"]["workspace_name"] == "madtank's Workspace" - assert initial_data["data"]["context"]["owner"]["handle"] == "madtank" + assert initial_data["data"]["context"]["workspace_name"] == "alex's Workspace" + assert initial_data["data"]["context"]["owner"]["handle"] == "alex" assert calls["message"]["metadata"]["top_level_ingress"] is False assert calls["message"]["metadata"]["signal_only"] is True assert calls["message"]["metadata"]["app_signal"]["signal_only"] is True diff --git a/tests/test_auth_commands.py b/tests/test_auth_commands.py index 83691f4..eba4096 100644 --- a/tests/test_auth_commands.py +++ b/tests/test_auth_commands.py @@ -149,7 +149,7 @@ def __init__(self, *, base_url, token): self.token = token def whoami(self): - return {"username": "madtank", "email": "madtank@example.com"} + return {"username": "alex", "email": "alex@example.com"} def list_spaces(self): return {"spaces": [{"id": "space-current", "name": "Team Hub", "is_current": True}]} @@ -200,7 +200,7 @@ def __init__(self, *, base_url, token): self.token = token def whoami(self): - return {"username": "madtank", "email": "madtank@example.com"} + return {"username": "alex", "email": "alex@example.com"} def list_spaces(self): return {"spaces": []} diff --git a/tests/test_channel.py b/tests/test_channel.py index edf5a37..b716832 100644 --- a/tests/test_channel.py +++ b/tests/test_channel.py @@ -143,7 +143,7 @@ def connect_sse(self, *, space_id): { "id": "incoming-123", "content": "@anvil please check this", - "author": {"id": "user-123", "name": "madtank", "type": "user"}, + "author": {"id": "user-123", "name": "alex", "type": "user"}, "mentions": ["anvil"], } ) @@ -212,7 +212,7 @@ def test_channel_get_messages_returns_pending_mentions(): message_id="incoming-123", parent_id=None, conversation_id=None, - author="madtank", + author="alex", prompt="please check this", raw_content="@anvil please check this", created_at="2026-04-15T23:00:00Z", @@ -238,7 +238,7 @@ async def run(): message_id="incoming-123", parent_id=None, conversation_id="conversation-ignored", - author="madtank", + author="alex", prompt="please check this", raw_content="@anvil please check this", created_at=None, diff --git a/tests/test_config.py b/tests/test_config.py index d07e47f..8c945aa 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -18,7 +18,7 @@ ) -def _write_active_profile(global_dir: Path, *, name: str = "next-orion") -> Path: +def _write_active_profile(global_dir: Path, *, name: str = "demo-agent") -> Path: token_file = global_dir / "profiles" / name / "token" token_file.parent.mkdir(parents=True) token_file.write_text("axp_a_agent.secret") @@ -204,11 +204,11 @@ def test_unsafe_local_user_pat_agent_config_does_not_override_active_profile( monkeypatch.setenv("AX_CONFIG_DIR", str(global_dir)) monkeypatch.setattr(config_module, "_unsafe_local_config_warned", False) - token_file = global_dir / "profiles" / "next-orion" / "token" + token_file = global_dir / "profiles" / "demo-agent" / "token" token_file.parent.mkdir(parents=True) token_file.write_text("axp_a_agent.secret") - (global_dir / "profiles" / ".active").write_text("next-orion\n") - (global_dir / "profiles" / "next-orion" / "profile.toml").write_text( + (global_dir / "profiles" / ".active").write_text("demo-agent\n") + (global_dir / "profiles" / "demo-agent" / "profile.toml").write_text( f'base_url = "https://next.paxai.app"\n' f'agent_name = "orion"\n' f'agent_id = "agent-orion"\n' @@ -329,8 +329,8 @@ def test_active_profile_reports_agent_runtime_source(self, tmp_path, monkeypatch diagnostic = diagnose_auth_config() assert diagnostic["ok"] is True - assert diagnostic["selected_profile"] == "next-orion" - assert diagnostic["effective"]["auth_source"] == "active_profile:next-orion" + assert diagnostic["selected_profile"] == "demo-agent" + assert diagnostic["effective"]["auth_source"] == "active_profile:demo-agent" assert diagnostic["effective"]["token_kind"] == "agent_pat" assert diagnostic["effective"]["principal_intent"] == "agent" assert diagnostic["effective"]["space_id"] == "next-space" @@ -376,7 +376,7 @@ def test_unsafe_local_config_reports_ignored_reason_and_uses_profile(self, tmp_p diagnostic = diagnose_auth_config() assert diagnostic["ok"] is True - assert diagnostic["effective"]["auth_source"] == "active_profile:next-orion" + assert diagnostic["effective"]["auth_source"] == "active_profile:demo-agent" assert diagnostic["effective"]["agent_name"] == "orion" assert diagnostic["effective"]["space_id"] == "next-space" assert any(warning["code"] == "unsafe_local_config_ignored" for warning in diagnostic["warnings"]) diff --git a/tests/test_qa_contracts.py b/tests/test_qa_contracts.py index e952dc6..b0e9eb2 100644 --- a/tests/test_qa_contracts.py +++ b/tests/test_qa_contracts.py @@ -16,7 +16,7 @@ def __init__(self): def whoami(self): self.calls.append(("whoami",)) return { - "username": "madtank", + "username": "alex", "principal_type": "user", "bound_agent": None, } @@ -31,7 +31,7 @@ def get_space(self, space_id): def list_space_members(self, space_id): self.calls.append(("list_space_members", space_id)) - return {"members": [{"username": "madtank"}]} + return {"members": [{"username": "alex"}]} def list_agents(self, *, space_id=None, limit=None): self.calls.append(("list_agents", space_id, limit)) diff --git a/tests/test_reminders_commands.py b/tests/test_reminders_commands.py index b91d593..2d7da0a 100644 --- a/tests/test_reminders_commands.py +++ b/tests/test_reminders_commands.py @@ -420,7 +420,7 @@ def test_run_once_reroutes_pending_review_to_review_owner(monkeypatch, tmp_path) "status": "pending_review", "assignee_id": "agent-orion", "creator_id": "agent-chatgpt", - "requirements": {"review_owner": "madtank"}, + "requirements": {"review_owner": "alex"}, } }, "/agents/agent-orion": {"agent": {"id": "agent-orion", "name": "orion"}}, @@ -457,10 +457,10 @@ def test_run_once_reroutes_pending_review_to_review_owner(monkeypatch, tmp_path) assert result.exit_code == 0, result.output assert len(fake.sent) == 1, "reminder still fires — just reroutes to reviewer" sent = fake.sent[0] - assert sent["content"].startswith("@madtank Reminder:") + assert sent["content"].startswith("@alex Reminder:") assert "[pending review]" in sent["content"], "reason should be prefixed with [pending review]" metadata = sent["metadata"] - assert metadata["alert"]["target_agent"] == "madtank" + assert metadata["alert"]["target_agent"] == "alex" assert metadata["reminder_policy"]["target_resolved_from"] == "review_owner" # Policy continues (not disabled) — the review owner can still be reminded stored = _load(policy_file)["policies"][0] diff --git a/tests/test_tasks_commands.py b/tests/test_tasks_commands.py index 03c627c..8ff9efe 100644 --- a/tests/test_tasks_commands.py +++ b/tests/test_tasks_commands.py @@ -43,7 +43,7 @@ def create_task(self, space_id, title, *, description=None, priority="medium", a def test_tasks_create_assign_to_accepts_uuid_without_agent_lookup(monkeypatch): calls = {} - agent_id = "076af365-dadc-4e92-a82d-79e855e5776e" + agent_id = "bbbbbbbb-bbbb-4bbb-bbbb-bbbbbbbbbbbb" class FakeClient: def list_agents(self, *, space_id=None, limit=None): diff --git a/tests/test_upload.py b/tests/test_upload.py index 02de915..f6e9f8f 100644 --- a/tests/test_upload.py +++ b/tests/test_upload.py @@ -65,7 +65,7 @@ def send_message(self, space_id, content, attachments=None): "--key", "sample-key", "--message", - "@madtank sample", + "@alex sample", "--mention", "orion", "--json", @@ -76,7 +76,7 @@ def send_message(self, space_id, content, attachments=None): assert calls["upload"]["space_id"] == "space-1" assert calls["context"]["space_id"] == "space-1" assert calls["message"]["space_id"] == "space-1" - assert calls["message"]["content"].startswith("@orion @madtank sample") + assert calls["message"]["content"].startswith("@orion @alex sample") def test_upload_file_no_message_still_stores_context(monkeypatch, tmp_path): @@ -204,7 +204,7 @@ def send_message(self, space_id, content, attachments=None): str(sample), "--vault", "--message", - "@madtank vault smoke", + "@alex vault smoke", "--json", ], ) From b17e8f4d023480582456104ae44993c2eefc9286 Mon Sep 17 00:00:00 2001 From: anvil Date: Sat, 18 Apr 2026 05:25:59 +0000 Subject: [PATCH 2/2] chore(privacy): scrub personal agent handles from examples/tests/specs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to 162a8a3 — sweep personal agent handles that show up as example values in docs, specs, tests, and CLI docstrings. These names identified specific agents running on my own account; replaced with generic placeholders so the repo reads as a clean library for anyone. Scrubbed (outside CODEOWNERS, which legitimately uses GitHub handles): - 'orion' -> 'demo-agent' - 'anvil' -> 'peer-agent' - 'axolotl' -> 'beta-agent' - 'clawdbot' -> 'infra-agent' NOT scrubbed (generic role names, not personal): - '*_sentinel' — this is a role classifier in ax_cli/commands/agents.py (_agent_mesh_role: 'sentinel' in name -> 'domain_sentinel'). Keeping it preserves realistic test fixtures and the mesh-role test coverage. Fixed test fixtures that depended on the old names: - test_mint_command: save path asserts use '.ax/_token' naming (followed the rename automatically once fixture agent_name changed). - test_apps_signal_whoami: identity fixture now uses 'demo_agent' in both the whoami payload and the assertion. Verified: pytest tests/ -> 224 passed. ruff check + format clean. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 16 ++++----- ax_cli/commands/agents.py | 2 +- ax_cli/commands/alerts.py | 2 +- ax_cli/commands/context.py | 2 +- channel/README.md | 2 +- docs/login-e2e-runbook.md | 6 ++-- docs/mcp-app-signal-adapter.md | 2 +- docs/mcp-headless-pat.md | 6 ++-- docs/reminder-lifecycle.md | 2 +- skills/SKILL.md | 6 ++-- specs/AGENT-CONTACT-001/spec.md | 8 ++--- specs/AGENT-MESH-PATTERNS-001/spec.md | 6 ++-- specs/AGENT-PAT-001/spec.md | 4 +-- specs/AX-SCHEDULE-001/spec.md | 6 ++-- specs/AXCTL-BOOTSTRAP-001/spec.md | 2 +- specs/CLI-WORKFLOW-001/spec.md | 10 +++--- specs/IDENTIFIER-DISPLAY-001/spec.md | 2 +- specs/RUNTIME-CONFIG-001/spec.md | 4 +-- specs/SEND-TO-AGENT-001/spec.md | 22 ++++++------ tests/test_agents_commands.py | 12 +++---- tests/test_alerts_commands.py | 36 ++++++++++---------- tests/test_apps_commands.py | 10 +++--- tests/test_auth_commands.py | 14 ++++---- tests/test_channel.py | 32 +++++++++--------- tests/test_config.py | 30 ++++++++--------- tests/test_context_commands.py | 4 +-- tests/test_handoff.py | 48 +++++++++++++-------------- tests/test_messages.py | 20 +++++------ tests/test_mint_command.py | 24 +++++++------- tests/test_reminders_commands.py | 40 +++++++++++----------- tests/test_tasks_commands.py | 14 ++++---- tests/test_upload.py | 4 +-- 32 files changed, 199 insertions(+), 199 deletions(-) diff --git a/README.md b/README.md index 762b655..6713622 100644 --- a/README.md +++ b/README.md @@ -220,15 +220,15 @@ participate should run a listener/watch loop for inbound work, and use `ax handoff` for outbound owned work. ```bash -ax handoff orion "Review the aX control MCP spec" --intent review --timeout 600 +ax handoff demo-agent "Review the aX control MCP spec" --intent review --timeout 600 ax handoff frontend_sentinel "Fix the app panel loading bug" --intent implement ax handoff cipher "Run QA on dev" --intent qa ax handoff backend_sentinel "Check dispatch health" --intent status ax handoff mcp_sentinel "Auth regression, urgent" --intent incident --nudge -ax handoff orion "Pair on CLI listener UX" --follow-up -ax handoff orion "Iterate on the contract tests until green" --loop --max-rounds 5 --completion-promise "TESTS GREEN" +ax handoff demo-agent "Pair on CLI listener UX" --follow-up +ax handoff demo-agent "Iterate on the contract tests until green" --loop --max-rounds 5 --completion-promise "TESTS GREEN" ax handoff cli_sentinel "Review the CLI docs" -ax handoff orion "Known-live fast path" --no-adaptive-wait +ax handoff demo-agent "Known-live fast path" --no-adaptive-wait ``` The intent changes task priority and prompt framing without creating separate @@ -262,7 +262,7 @@ and stop only when a completion promise is true or the max-round limit is hit. Keep loop prompts narrow and verifiable: ```bash -ax handoff orion \ +ax handoff demo-agent \ "Fix the failing auth tests. Run pytest. If all tests pass, reply with TESTS GREEN." \ --intent implement \ --loop \ @@ -319,7 +319,7 @@ Use discovery before assuming a wait can complete: ```bash ax agents discover ax agents discover --ping --timeout 10 -ax agents discover orion backend_sentinel --ping --json +ax agents discover demo-agent backend_sentinel --ping --json ``` `discover` shows each agent's apparent mesh role, roster status, listener @@ -489,7 +489,7 @@ returned messages have actually been handled. | `ax spaces create NAME` | Create a new space (`--visibility private/invite_only/public`) | | `ax keys list` | List API keys | | `ax profile list` | List named profiles | -| `ax agents ping orion --timeout 30` | Probe whether an agent is listening now | +| `ax agents ping demo-agent --timeout 30` | Probe whether an agent is listening now | ### Observability @@ -503,7 +503,7 @@ returned messages have actually been handled. | Command | Description | |---------|-------------| -| `ax send --to orion "question" --wait` | Mention an agent and wait for the reply | +| `ax send --to demo-agent "question" --wait` | Mention an agent and wait for the reply | | `ax send "message"` | Send + wait for a reply | | `ax send "msg" --no-wait` | Send an intentional notification without waiting | | `ax upload file FILE --mention @agent` | Upload context and leave an agent-visible signal | diff --git a/ax_cli/commands/agents.py b/ax_cli/commands/agents.py index 822d168..ee2cf5d 100644 --- a/ax_cli/commands/agents.py +++ b/ax_cli/commands/agents.py @@ -481,7 +481,7 @@ def update_agent( Examples: ax agents update backend_sentinel --type sentinel --model claude-sonnet-4-6 - ax agents update anvil --bio "Infra and ops" --specialization "server management" + ax agents update peer-agent --bio "Infra and ops" --specialization "server management" """ client = get_client() fields = {} diff --git a/ax_cli/commands/alerts.py b/ax_cli/commands/alerts.py index 064d6be..29255e7 100644 --- a/ax_cli/commands/alerts.py +++ b/ax_cli/commands/alerts.py @@ -422,7 +422,7 @@ def send( Examples: - ax alerts send "dev ALB regressed on /auth/me" --target @orion --severity critical + ax alerts send "dev ALB regressed on /auth/me" --target @demo-agent --severity critical ax alerts send "review needed" --kind reminder --source-task dfef4c92 --remind-at 2026-04-16T17:00Z """ severity_n = _normalize_severity(severity) diff --git a/ax_cli/commands/context.py b/ax_cli/commands/context.py index 4127035..c6dd75c 100644 --- a/ax_cli/commands/context.py +++ b/ax_cli/commands/context.py @@ -210,7 +210,7 @@ def upload_file( Examples: ax context upload-file ./report.md ax context upload-file ./arch.png --key infra-diagram --vault - ax context upload-file ./data.csv --ttl 3600 --mention @orion + ax context upload-file ./data.csv --ttl 3600 --mention @demo-agent """ client = get_client() sid = resolve_space_id(client, explicit=space_id) diff --git a/channel/README.md b/channel/README.md index b33620d..1ca6d42 100644 --- a/channel/README.md +++ b/channel/README.md @@ -174,7 +174,7 @@ python3 scripts/channel_smoke.py \ --listener-profile demo-agent \ --sender-profile peer-agent \ --profile-workdir /home/ax-agent \ - --agent orion \ + --agent demo-agent \ --space-id aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaaaa \ --case reply \ --channel-command 'bun run --cwd /home/ax-agent/channel --shell=bun --silent start --debug' diff --git a/docs/login-e2e-runbook.md b/docs/login-e2e-runbook.md index f0d8a05..7840422 100644 --- a/docs/login-e2e-runbook.md +++ b/docs/login-e2e-runbook.md @@ -62,11 +62,11 @@ Saved user login: .../config/user.toml The setup agent may run this after the user login is complete. ```bash -axdev token mint orion-e2e \ +axdev token mint demo-agent-e2e \ --create \ --audience both \ --expires 30 \ - --save-to "$AX_E2E_ROOT/agents/orion-e2e" \ + --save-to "$AX_E2E_ROOT/agents/demo-agent-e2e" \ --profile demo-e2e \ --no-print-token ``` @@ -89,7 +89,7 @@ axdev auth whoami --json Expected: - `whoami` uses an agent-bound profile -- `bound_agent.agent_name` or resolved agent metadata points at `orion-e2e` +- `bound_agent.agent_name` or resolved agent metadata points at `demo-agent-e2e` - runtime commands use the agent PAT/JWT, not the user PAT ## Cleanup diff --git a/docs/mcp-app-signal-adapter.md b/docs/mcp-app-signal-adapter.md index 8dc8d6c..8ca34af 100644 --- a/docs/mcp-app-signal-adapter.md +++ b/docs/mcp-app-signal-adapter.md @@ -65,7 +65,7 @@ Create a task with a task card and task-detail widget metadata: ```bash axctl tasks create 'Review the launch checklist' \ --description 'Check API, CLI, MCP, and UI smoke paths before promotion.' \ - --assign orion \ + --assign demo-agent \ --json ``` diff --git a/docs/mcp-headless-pat.md b/docs/mcp-headless-pat.md index d8379af..462dd33 100644 --- a/docs/mcp-headless-pat.md +++ b/docs/mcp-headless-pat.md @@ -47,16 +47,16 @@ Three moving parts: - A PAT with `audience="mcp"` or `audience="both"`. A PAT with `audience="cli"` will be rejected at exchange time with `audience_not_allowed`. -- The `agent_name` you want to act as (e.g. `"orion"`), or the +- The `agent_name` you want to act as (e.g. `"demo-agent"`), or the `agent_id` UUID if your PAT is agent-bound. Recommended: use the same `.ax/config.toml` generated by `axctl token mint --save-to`: ```toml -token_file = "/home/ax-agent/agents/orion/.ax/orion_token" +token_file = "/home/ax-agent/agents/demo-agent/.ax/orion_token" base_url = "https://next.paxai.app" -agent_name = "orion" +agent_name = "demo-agent" agent_id = "agent-uuid" space_id = "optional-default-space-uuid" ``` diff --git a/docs/reminder-lifecycle.md b/docs/reminder-lifecycle.md index 673028d..9d63376 100644 --- a/docs/reminder-lifecycle.md +++ b/docs/reminder-lifecycle.md @@ -82,4 +82,4 @@ See `tests/test_reminders_commands.py`: ## Change log -- 2026-04-16 — Initial contract (@orion). Ships with tests + `_task_lifecycle` helper in `alerts.py`. Picks up source task status on every `_fire_policy` call; one extra GET per due policy (cost acceptable for local dogfood loop). +- 2026-04-16 — Initial contract (@demo-agent). Ships with tests + `_task_lifecycle` helper in `alerts.py`. Picks up source task status on every `_fire_policy` call; one extra GET per due policy (cost acceptable for local dogfood loop). diff --git a/skills/SKILL.md b/skills/SKILL.md index 59230ef..58fc2c5 100644 --- a/skills/SKILL.md +++ b/skills/SKILL.md @@ -231,10 +231,10 @@ axctl tasks create "Next step: deploy to staging" --priority high --assign ops-a ### Delegate and wait ```bash axctl handoff backend-agent "Fix the auth regression" --intent implement --timeout 600 -axctl handoff orion "Review the API contract" --intent review --follow-up -axctl handoff orion "Iterate until contract tests pass" --intent implement --loop --max-rounds 5 --completion-promise "TESTS GREEN" +axctl handoff demo-agent "Review the API contract" --intent review --follow-up +axctl handoff demo-agent "Iterate until contract tests pass" --intent implement --loop --max-rounds 5 --completion-promise "TESTS GREEN" axctl handoff cli_sentinel "Review CLI docs" -axctl handoff orion "Known-live fast path" --no-adaptive-wait +axctl handoff demo-agent "Known-live fast path" --no-adaptive-wait ``` A sent message is not completion. For owned collaboration, completion means a diff --git a/specs/AGENT-CONTACT-001/spec.md b/specs/AGENT-CONTACT-001/spec.md index 742de6a..cd1753e 100644 --- a/specs/AGENT-CONTACT-001/spec.md +++ b/specs/AGENT-CONTACT-001/spec.md @@ -99,7 +99,7 @@ orchestrator-subagent pattern depends on a reachable supervisor. The current practical probe is: ```bash -ax agents ping orion --timeout 30 +ax agents ping demo-agent --timeout 30 ``` Behavior: @@ -123,7 +123,7 @@ The no-reply result is not a rejection signal. Use mention signals for attention: ```bash -ax send --to orion "quick question" --wait +ax send --to demo-agent "quick question" --wait ax tasks create "Run smoke test" --assign @cipher ax upload file ./diagram.png --mention @frontend_sentinel ax context set spec:cli ready --mention @mcp_sentinel @@ -132,8 +132,8 @@ ax context set spec:cli ready --mention @mcp_sentinel Use `ax handoff` for owned work: ```bash -ax handoff orion "Review the CLI contact mode spec" --intent review --timeout 600 -ax handoff orion "Known-live fast path" --intent review --no-adaptive-wait +ax handoff demo-agent "Review the CLI contact mode spec" --intent review --timeout 600 +ax handoff demo-agent "Known-live fast path" --intent review --no-adaptive-wait ``` If an agent's contact mode is unknown, do not treat timeout as proof the work was diff --git a/specs/AGENT-MESH-PATTERNS-001/spec.md b/specs/AGENT-MESH-PATTERNS-001/spec.md index 290bbe2..140e389 100644 --- a/specs/AGENT-MESH-PATTERNS-001/spec.md +++ b/specs/AGENT-MESH-PATTERNS-001/spec.md @@ -52,7 +52,7 @@ On 2026-04-14, `ax agents ping` showed: | Agent | Result | |-------|--------| -| `orion` | `event_listener` | +| `demo-agent` | `event_listener` | | `backend_sentinel` | `event_listener` | | `frontend_sentinel` | `event_listener` | | `mcp_sentinel` | `event_listener` | @@ -136,7 +136,7 @@ Current command: ```bash ax agents discover ax agents discover --ping --timeout 10 -ax agents discover orion backend_sentinel --ping --json +ax agents discover demo-agent backend_sentinel --ping --json ``` `--ping` is an active probe. It sends a mention and waits for a reply. No reply @@ -146,7 +146,7 @@ For owned work, `ax handoff` uses the same idea inline by default: ```bash ax handoff supervisor_sentinel "Coordinate frontend and MCP QA" -ax handoff orion "Known-live fast path" --no-adaptive-wait +ax handoff demo-agent "Known-live fast path" --no-adaptive-wait ``` If the probe succeeds, the CLI waits. If the probe fails, the CLI still creates diff --git a/specs/AGENT-PAT-001/spec.md b/specs/AGENT-PAT-001/spec.md index 27fc2dd..f7125d9 100644 --- a/specs/AGENT-PAT-001/spec.md +++ b/specs/AGENT-PAT-001/spec.md @@ -106,7 +106,7 @@ Request: "audience": "cli", "expires_in_days": 30, "space_id": "space-uuid", - "name": "orion-cli-local", + "name": "demo-agent-cli-local", "requested_capabilities": ["messages:send", "context:read", "tasks:write"] } ``` @@ -175,7 +175,7 @@ Required behavior: Example: ```bash -axctl token mint orion --audience cli --expires 30 --profile demo-agent +axctl token mint demo-agent --audience cli --expires 30 --profile demo-agent ``` ## Approval Policy diff --git a/specs/AX-SCHEDULE-001/spec.md b/specs/AX-SCHEDULE-001/spec.md index 7af0d00..83dc1ad 100644 --- a/specs/AX-SCHEDULE-001/spec.md +++ b/specs/AX-SCHEDULE-001/spec.md @@ -1,7 +1,7 @@ # AX-SCHEDULE-001: Agent Wake-Up Scheduler **Status:** Draft -**Authors:** @orion, @anvil +**Authors:** @demo-agent, @peer-agent **Date:** 2026-04-06 ## Summary @@ -52,7 +52,7 @@ Stored in `~/.ax/schedules/.json`: { "name": "health-check", "description": "Check staging services every 15 minutes", - "command": "ax send \"@orion Run staging health checks\" --wait --timeout 120", + "command": "ax send \"@demo-agent Run staging health checks\" --wait --timeout 120", "interval_seconds": 900, "anchor_time": null, "space_id": "aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaaaa", @@ -164,7 +164,7 @@ If either exists, skip execution and log. Same pattern as `ax listen`. ```crontab # ax-schedule: health-check (every 15m) -*/15 * * * * /usr/local/bin/ax send --to orion "Run staging health checks" --no-wait 2>&1 | /usr/local/bin/ax send --stdin --channel main +*/15 * * * * /usr/local/bin/ax send --to demo-agent "Run staging health checks" --no-wait 2>&1 | /usr/local/bin/ax send --stdin --channel main # ax-schedule: morning-briefing (daily at 09:00 UTC) 0 9 * * * /usr/local/bin/ax send "@project_lead_ai Morning status update" --wait --timeout 120 diff --git a/specs/AXCTL-BOOTSTRAP-001/spec.md b/specs/AXCTL-BOOTSTRAP-001/spec.md index a95d1f3..1b114fb 100644 --- a/specs/AXCTL-BOOTSTRAP-001/spec.md +++ b/specs/AXCTL-BOOTSTRAP-001/spec.md @@ -109,7 +109,7 @@ sequenceDiagram User->>CLI: axctl login CLI->>API: Verify user setup credential API-->>CLI: User/device authorization - User->>Agent: Set up @orion, @cipher, @sentinel + User->>Agent: Set up @demo-agent, @cipher, @sentinel Agent->>CLI: axctl token mint --create --profile --save-to CLI->>API: Device/user authorized PAT request API-->>CLI: Scoped agent PAT shown once diff --git a/specs/CLI-WORKFLOW-001/spec.md b/specs/CLI-WORKFLOW-001/spec.md index dc6df79..4c15674 100644 --- a/specs/CLI-WORKFLOW-001/spec.md +++ b/specs/CLI-WORKFLOW-001/spec.md @@ -86,7 +86,7 @@ When a task can be advanced by another agent without human judgment, `--loop` keeps the feedback loop active: ```bash -ax handoff orion \ +ax handoff demo-agent \ "Fix the failing contract tests. Run pytest. Reply with TESTS GREEN only when true." \ --intent implement \ --loop \ @@ -119,7 +119,7 @@ operator remembering a flag. The CLI probes before deciding whether to wait: ```bash ax handoff cli_sentinel "Review CLI docs" -ax handoff orion "Known-live fast path" --no-adaptive-wait +ax handoff demo-agent "Known-live fast path" --no-adaptive-wait ``` Behavior: @@ -382,12 +382,12 @@ Expected flow: ### Task delegation + wait ```bash -ax task create "Run smoke tests" --assign @orion --notify --wait +ax task create "Run smoke tests" --assign @demo-agent --notify --wait ``` Expected flow: -1. Create task with owner resolved to `@orion` -2. Notify `@orion` with task id + owner metadata +1. Create task with owner resolved to `@demo-agent` +2. Notify `@demo-agent` with task id + owner metadata 3. Wait for response using the watch pipeline ## Documentation Plan diff --git a/specs/IDENTIFIER-DISPLAY-001/spec.md b/specs/IDENTIFIER-DISPLAY-001/spec.md index d1c726b..e886516 100644 --- a/specs/IDENTIFIER-DISPLAY-001/spec.md +++ b/specs/IDENTIFIER-DISPLAY-001/spec.md @@ -45,7 +45,7 @@ Examples: ```text Account: alex Space: team-hub -Agent: orion +Agent: demo-agent ``` If the UUID is useful, show it as supporting detail: diff --git a/specs/RUNTIME-CONFIG-001/spec.md b/specs/RUNTIME-CONFIG-001/spec.md index 36446dc..b0bccef 100644 --- a/specs/RUNTIME-CONFIG-001/spec.md +++ b/specs/RUNTIME-CONFIG-001/spec.md @@ -15,9 +15,9 @@ An agent runtime should have one portable config shape that every headless client can consume: ```toml -token_file = "/home/ax-agent/agents/orion/.ax/orion_token" +token_file = "/home/ax-agent/agents/demo-agent/.ax/orion_token" base_url = "https://next.paxai.app" -agent_name = "orion" +agent_name = "demo-agent" agent_id = "agent-uuid" space_id = "optional-default-space-uuid" ``` diff --git a/specs/SEND-TO-AGENT-001/spec.md b/specs/SEND-TO-AGENT-001/spec.md index c283a87..eec57d3 100644 --- a/specs/SEND-TO-AGENT-001/spec.md +++ b/specs/SEND-TO-AGENT-001/spec.md @@ -2,7 +2,7 @@ ``` Spec-ID: SEND-TO-AGENT-001 -Owner: @orion (CLI contract) + @frontend_sentinel (card surfaces) +Owner: @demo-agent (CLI contract) + @frontend_sentinel (card surfaces) Status: DRAFT — ready for team review Date: 2026-04-16 Task: b38a7475-8bf6-445e-bd6e-1845222885dd @@ -105,10 +105,10 @@ the PR #54 task snapshot pattern. "source": "axctl_tasks_send", "state": "sent", "fired_at": "2026-04-16T18:40:00Z", - "title": "orion sent you a task: Ship delivery receipts", + "title": "demo-agent sent you a task: Ship delivery receipts", "summary": "{message text or default copy}", "target_agent": "backend_sentinel", - "sender_agent_name": "orion", + "sender_agent_name": "demo-agent", "source_task_id": "task-snap", "task": { // task snapshot, per PR #54 pattern "id": "task-snap", @@ -127,7 +127,7 @@ the PR #54 task snapshot pattern. "type": "alert", // re-uses AlertCardBody "version": 1, "payload": { - "title": "orion sent you a task: Ship delivery receipts", + "title": "demo-agent sent you a task: Ship delivery receipts", "summary": "...", "severity": "info", "intent": "task_send", // distinguishes from plain alerts @@ -195,16 +195,16 @@ transcript. | Layer | Owner | Scope | |---------------|----------------------|----------------------------------------------------| -| CLI contract | @orion (this spec) | §3.1 command shape, §3.2 envelope | -| CLI impl | @orion | `ax_cli/commands/tasks.py::send`, mirror in alerts.py | +| CLI contract | @demo-agent (this spec) | §3.1 command shape, §3.2 envelope | +| CLI impl | @demo-agent | `ax_cli/commands/tasks.py::send`, mirror in alerts.py | | Backend | no change required | Accepts the envelope as-is (plain messages POST) | | MCP | @mcp_sentinel | Optional: mirror command as an MCP tool (`tasks.send`, `alerts.send`) so aX can invoke it | | Frontend card | @frontend_sentinel | Task `60113fd7` + `e55be7c8`; render `intent=task_send` cards, wire Open Task + Ack + Reassign action buttons | -| Wiki | @orion | Update ax-cli wiki "Agent-Activity-and-Final-Reply-Contract" + a new "Sending tasks and alerts" page | +| Wiki | @demo-agent | Update ax-cli wiki "Agent-Activity-and-Final-Reply-Contract" + a new "Sending tasks and alerts" page | ## 5. Implementation plan (smallest slice) -1. **CLI scaffold** (orion, this task): add `ax_cli/commands/tasks.py::send` +1. **CLI scaffold** (demo-agent, this task): add `ax_cli/commands/tasks.py::send` and the matching entry in `ax_cli/commands/alerts.py::send_to` (or reuse the existing `ax alerts send` with a new `--to` flag on an existing alert_id). Reuses `_build_alert_metadata` + `_fetch_task_snapshot` from @@ -215,7 +215,7 @@ transcript. (depends on backend emission — trail behind PR #108). 4. **Wiki update**: one short page explaining the two commands, the difference vs. `ax send`, and how receipts appear. -5. **Dogfood**: orion runs `axctl tasks send --to @backend_sentinel`. +5. **Dogfood**: demo-agent runs `axctl tasks send --to @backend_sentinel`. Expected outcome on receiver: one card with task snapshot + Open Task button; CLI stdout shows receipt chain; no fake "working" without a listener receipt. @@ -229,7 +229,7 @@ transcript. - [ ] Receiver's frontend renders one card with task/alert context + Open button - [ ] Delivery receipts stream per SEND-RECEIPTS-001 - [ ] No synthetic ACK replies from tooling; the agent's subsequent action is the reply -- [ ] Dogfood: orion → backend_sentinel with a live task, evidence captured +- [ ] Dogfood: demo-agent → backend_sentinel with a live task, evidence captured ## 7. Open questions @@ -253,7 +253,7 @@ transcript. ## 8. Change log -- 2026-04-16 — Initial draft (@orion) from task b38a7475. Cross-links to +- 2026-04-16 — Initial draft (@demo-agent) from task b38a7475. Cross-links to PR #108 (delivery receipts), PR #107 (availability escalation), PR #54 (task snapshot pattern), PR #53 (alert metadata shape), task e55be7c8 (reminder task-awareness), task 60113fd7 (frontend Send to Agent). diff --git a/tests/test_agents_commands.py b/tests/test_agents_commands.py index d5ae7c6..d892222 100644 --- a/tests/test_agents_commands.py +++ b/tests/test_agents_commands.py @@ -84,7 +84,7 @@ def list_agents(self, *, space_id=None, limit=None): "agents": [ { "id": "agent-1", - "name": "orion", + "name": "demo-agent", "origin": "mcp", "agent_type": "mcp", "status": "active", @@ -98,22 +98,22 @@ def send_message(self, space_id, content): def fake_wait(client, **kwargs): calls["wait"] = kwargs - return {"id": "reply-1", "content": f"received {kwargs['token']}", "display_name": "orion"} + return {"id": "reply-1", "content": f"received {kwargs['token']}", "display_name": "demo-agent"} monkeypatch.setattr("ax_cli.commands.agents.get_client", lambda: FakeClient()) monkeypatch.setattr("ax_cli.commands.agents.resolve_space_id", lambda client, explicit=None: "space-1") monkeypatch.setattr("ax_cli.commands.agents.resolve_agent_name", lambda client=None: "ChatGPT") monkeypatch.setattr("ax_cli.commands.agents._wait_for_handoff_reply", fake_wait) - result = runner.invoke(app, ["agents", "ping", "orion", "--timeout", "5", "--json"]) + result = runner.invoke(app, ["agents", "ping", "demo-agent", "--timeout", "5", "--json"]) assert result.exit_code == 0, result.output data = json.loads(result.output) assert data["contact_mode"] == "event_listener" assert data["listener_status"] == "replied" assert data["agent_id"] == "agent-1" - assert calls["message"]["content"].startswith("@orion Contact-mode ping") - assert calls["wait"]["agent_name"] == "orion" + assert calls["message"]["content"].startswith("@demo-agent Contact-mode ping") + assert calls["wait"]["agent_name"] == "demo-agent" assert calls["wait"]["sent_message_id"] == "msg-1" @@ -151,7 +151,7 @@ def send_message(self, space_id, content): def test_agents_ping_unknown_agent_fails(monkeypatch): class FakeClient: def list_agents(self, *, space_id=None, limit=None): - return {"agents": [{"id": "agent-1", "name": "orion"}]} + return {"agents": [{"id": "agent-1", "name": "demo-agent"}]} monkeypatch.setattr("ax_cli.commands.agents.get_client", lambda: FakeClient()) monkeypatch.setattr("ax_cli.commands.agents.resolve_space_id", lambda client, explicit=None: "space-1") diff --git a/tests/test_alerts_commands.py b/tests/test_alerts_commands.py index a5f48ff..057cfb9 100644 --- a/tests/test_alerts_commands.py +++ b/tests/test_alerts_commands.py @@ -106,7 +106,7 @@ def _install_fake_client(monkeypatch, client: _FakeClient) -> None: ) monkeypatch.setattr( "ax_cli.commands.alerts.resolve_agent_name", - lambda client=None: "orion", + lambda client=None: "demo-agent", ) @@ -121,7 +121,7 @@ def test_send_builds_alert_metadata_with_ui_card_type_alert(monkeypatch): "send", "ALB /auth/me is 5xx", "--target", - "@orion", + "@demo-agent", "--severity", "critical", ], @@ -135,7 +135,7 @@ def test_send_builds_alert_metadata_with_ui_card_type_alert(monkeypatch): alert = metadata["alert"] assert alert["kind"] == "alert" assert alert["severity"] == "critical" - assert alert["target_agent"] == "orion" + assert alert["target_agent"] == "demo-agent" assert alert["state"] == "triggered" assert alert["response_required"] is False assert "fired_at" in alert @@ -150,7 +150,7 @@ def test_send_builds_alert_metadata_with_ui_card_type_alert(monkeypatch): assert card["payload"]["alert"]["severity"] == "critical" # Content should @-mention the target so notification routing fires - assert fake.sent["content"].startswith("@orion ") + assert fake.sent["content"].startswith("@demo-agent ") # message_type = "alert" so stream filters can distinguish from text assert fake.sent["message_type"] == "alert" @@ -179,7 +179,7 @@ def test_reminder_requires_source_task_and_marks_kind_task_reminder(monkeypatch) "--source-task", "dfef4c92", "--target", - "@orion", + "@demo-agent", "--remind-at", "2026-04-16T17:00:00Z", "--due-at", @@ -221,7 +221,7 @@ def test_reminder_shortcut_command_equivalent_to_send_kind_reminder(monkeypatch) "--source-task", "dfef4c92", "--target", - "orion", + "demo-agent", ], ) assert result.exit_code == 0, _strip_ansi(result.stdout) @@ -257,7 +257,7 @@ def test_ack_posts_state_change_reply_linked_to_parent(monkeypatch): "kind": "alert", "severity": "warn", "state": "triggered", - "target_agent": "orion", + "target_agent": "demo-agent", }, }, } @@ -343,7 +343,7 @@ def test_source_task_auto_targets_assignee_when_target_omitted(monkeypatch): } } agent_payloads = { - "agent-assignee-id": {"agent": {"id": "agent-assignee-id", "name": "orion"}}, + "agent-assignee-id": {"agent": {"id": "agent-assignee-id", "name": "demo-agent"}}, "agent-creator-id": {"agent": {"id": "agent-creator-id", "name": "chatgpt"}}, } @@ -378,9 +378,9 @@ def json(self): ) assert result.exit_code == 0, _strip_ansi(result.stdout) - # Auto-resolved to assignee (orion) - assert fake.sent["metadata"]["alert"]["target_agent"] == "orion" - assert fake.sent["content"].startswith("@orion "), "auto-target must @-mention assignee" + # Auto-resolved to assignee (demo-agent) + assert fake.sent["metadata"]["alert"]["target_agent"] == "demo-agent" + assert fake.sent["content"].startswith("@demo-agent "), "auto-target must @-mention assignee" def test_source_task_falls_back_to_creator_when_no_assignee(monkeypatch): @@ -492,7 +492,7 @@ def test_rejects_pre_2020_timestamps_as_clock_skew(monkeypatch): "send", "clock-skew test", "--target", - "orion", + "demo-agent", "--remind-at", "2000-01-01T00:00:00Z", ], @@ -507,7 +507,7 @@ def test_rejects_pre_2020_timestamps_as_clock_skew(monkeypatch): "send", "clock-skew test", "--target", - "orion", + "demo-agent", "--due-at", "1999-12-31T23:59:59Z", ], @@ -517,7 +517,7 @@ def test_rejects_pre_2020_timestamps_as_clock_skew(monkeypatch): # Gibberish timestamps also get rejected with a clear message malformed = runner.invoke( app, - ["alerts", "send", "bad iso", "--target", "orion", "--remind-at", "not-a-date"], + ["alerts", "send", "bad iso", "--target", "demo-agent", "--remind-at", "not-a-date"], ) assert malformed.exit_code != 0 assert "ISO-8601" in _strip_ansi(malformed.stdout + (malformed.stderr or "")) @@ -538,7 +538,7 @@ def test_valid_future_timestamps_accepted(monkeypatch): "--source-task", "t1", "--target", - "orion", + "demo-agent", "--remind-at", "2026-04-16T17:00:00Z", "--due-at", @@ -569,7 +569,7 @@ def test_reminder_defaults_response_required_true(monkeypatch): "--source-task", "t1", "--target", - "orion", + "demo-agent", ], ) assert r1.exit_code == 0 @@ -582,7 +582,7 @@ def test_reminder_defaults_response_required_true(monkeypatch): _install_fake_client(monkeypatch, fake2) r2 = runner.invoke( app, - ["alerts", "send", "heads up", "--target", "orion"], + ["alerts", "send", "heads up", "--target", "demo-agent"], ) assert r2.exit_code == 0 assert fake2.sent["metadata"]["alert"]["response_required"] is False, ( @@ -596,7 +596,7 @@ def test_json_output_returns_send_response(monkeypatch): result = runner.invoke( app, - ["alerts", "send", "test", "--target", "@orion", "--json"], + ["alerts", "send", "test", "--target", "@demo-agent", "--json"], ) assert result.exit_code == 0 data = json.loads(result.stdout) diff --git a/tests/test_apps_commands.py b/tests/test_apps_commands.py index 09055bb..cc7978f 100644 --- a/tests/test_apps_commands.py +++ b/tests/test_apps_commands.py @@ -73,7 +73,7 @@ def send_message( "--message", "context artifact ready", "--to", - "orion", + "demo-agent", "--channel", "automation-alerts", "--alert-kind", @@ -86,7 +86,7 @@ def send_message( assert result.exit_code == 0, result.output assert calls["get_context"] == {"key": "design:architecture", "space_id": "space-1"} - assert calls["message"]["content"] == "@orion context artifact ready" + assert calls["message"]["content"] == "@demo-agent context artifact ready" assert calls["message"]["channel"] == "automation-alerts" assert calls["message"]["message_type"] == "system" @@ -99,7 +99,7 @@ def send_message( assert widget["initial_data"]["selected_key"] == "design:architecture" assert widget["initial_data"]["items"][0]["file_content"] == "# Architecture\n" assert metadata["alert"]["kind"] == "design_review" - assert metadata["alert"]["target_agent"] == "orion" + assert metadata["alert"]["target_agent"] == "demo-agent" assert metadata["alert"]["response_required"] is True assert metadata["alert"]["summary"] == "Review this diagram" assert "top_level_ingress" not in metadata @@ -269,7 +269,7 @@ def list_agents(self, *, space_id=None, limit=None): "agents": [ { "id": "agent-1", - "name": "orion", + "name": "demo-agent", "status": "active", "description": "QA reviewer", }, @@ -314,7 +314,7 @@ def send_message( assert initial_data["items"] == [ { "id": "agent-1", - "name": "orion", + "name": "demo-agent", "status": "active", "description": "QA reviewer", }, diff --git a/tests/test_auth_commands.py b/tests/test_auth_commands.py index eba4096..974deb0 100644 --- a/tests/test_auth_commands.py +++ b/tests/test_auth_commands.py @@ -37,7 +37,7 @@ def fake_login_user(token, *, base_url, agent, space_id, env_name): "--env", "next", "--agent", - "anvil", + "peer-agent", "--space-id", "space-123", ], @@ -47,7 +47,7 @@ def fake_login_user(token, *, base_url, agent, space_id, env_name): assert called == { "token": "axp_u_test.token", "base_url": "https://next.paxai.app", - "agent": "anvil", + "agent": "peer-agent", "space_id": "space-123", "env_name": "next", } @@ -125,8 +125,8 @@ def test_user_login_does_not_modify_local_agent_config(monkeypatch, write_config write_config( token="axp_a_old.secret", base_url="https://old.example.com", - agent_name="orion", - agent_id="agent-orion", + agent_name="demo-agent", + agent_id="agent-demo-agent", space_id="old-space", ) @@ -167,8 +167,8 @@ def list_agents(self): assert local_cfg == { "token": "axp_a_old.secret", "base_url": "https://old.example.com", - "agent_name": "orion", - "agent_id": "agent-orion", + "agent_name": "demo-agent", + "agent_id": "agent-demo-agent", "space_id": "old-space", } user_cfg = tomllib.loads((config_dir.parent / "_global_config" / "user.toml").read_text()) @@ -182,7 +182,7 @@ def list_agents(self): def test_user_login_env_stores_named_login_and_marks_active(monkeypatch, write_config, config_dir): """Admins can keep separate user bootstrap tokens for dev/next/prod.""" - write_config(token="axp_a_old.secret", base_url="https://old.example.com", agent_name="orion") + write_config(token="axp_a_old.secret", base_url="https://old.example.com", agent_name="demo-agent") class FakeTokenExchanger: def __init__(self, base_url, token): diff --git a/tests/test_channel.py b/tests/test_channel.py index b716832..7c8b080 100644 --- a/tests/test_channel.py +++ b/tests/test_channel.py @@ -37,7 +37,7 @@ class CaptureBridge(ChannelBridge): def __init__(self, client, *, agent_id="agent-123", processing_status=True): super().__init__( client=client, - agent_name="anvil", + agent_name="peer-agent", agent_id=agent_id, space_id="space-123", queue_size=10, @@ -103,7 +103,7 @@ def test_channel_sends_with_agent_bound_pat(): { "message_id": "incoming-123", "status": "completed", - "agent_name": "anvil", + "agent_name": "peer-agent", "space_id": "space-123", } ] @@ -122,7 +122,7 @@ def test_channel_can_publish_working_status_on_delivery(): { "message_id": "incoming-123", "status": "working", - "agent_name": "anvil", + "agent_name": "peer-agent", "space_id": "space-123", } ] @@ -142,9 +142,9 @@ def connect_sse(self, *, space_id): return FakeSseResponse( { "id": "incoming-123", - "content": "@anvil please check this", + "content": "@peer-agent please check this", "author": {"id": "user-123", "name": "alex", "type": "user"}, - "mentions": ["anvil"], + "mentions": ["peer-agent"], } ) @@ -214,7 +214,7 @@ def test_channel_get_messages_returns_pending_mentions(): conversation_id=None, author="alex", prompt="please check this", - raw_content="@anvil please check this", + raw_content="@peer-agent please check this", created_at="2026-04-15T23:00:00Z", space_id="space-123", ) @@ -240,7 +240,7 @@ async def run(): conversation_id="conversation-ignored", author="alex", prompt="please check this", - raw_content="@anvil please check this", + raw_content="@peer-agent please check this", created_at=None, space_id="space-123", ) @@ -289,11 +289,11 @@ def test_listener_treats_parent_reply_as_delivery_signal(): "id": "reply-1", "content": "I looked at this", "parent_id": "agent-message-1", - "author": {"id": "other-agent", "name": "orion", "type": "agent"}, + "author": {"id": "other-agent", "name": "demo-agent", "type": "agent"}, "mentions": [], } - assert _should_respond(data, "anvil", "agent-123", reply_anchor_ids=anchors) is True + assert _should_respond(data, "peer-agent", "agent-123", reply_anchor_ids=anchors) is True def test_listener_treats_conversation_reply_as_delivery_signal(): @@ -302,23 +302,23 @@ def test_listener_treats_conversation_reply_as_delivery_signal(): "id": "reply-1", "content": "I looked at this", "conversation_id": "agent-message-1", - "author": {"id": "other-agent", "name": "orion", "type": "agent"}, + "author": {"id": "other-agent", "name": "demo-agent", "type": "agent"}, "mentions": [], } - assert _should_respond(data, "anvil", "agent-123", reply_anchor_ids=anchors) is True + assert _should_respond(data, "peer-agent", "agent-123", reply_anchor_ids=anchors) is True def test_listener_tracks_self_authored_messages_without_responding(): anchors: set[str] = set() data = { "id": "agent-message-1", - "content": "@orion please check this", - "author": {"id": "agent-123", "name": "anvil", "type": "agent"}, - "mentions": ["orion"], + "content": "@demo-agent please check this", + "author": {"id": "agent-123", "name": "peer-agent", "type": "agent"}, + "mentions": ["demo-agent"], } - assert _is_self_authored(data, "anvil", "agent-123") is True + assert _is_self_authored(data, "peer-agent", "agent-123") is True _remember_reply_anchor(anchors, data["id"]) - assert _should_respond(data, "anvil", "agent-123", reply_anchor_ids=anchors) is False + assert _should_respond(data, "peer-agent", "agent-123", reply_anchor_ids=anchors) is False assert anchors == {"agent-message-1"} diff --git a/tests/test_config.py b/tests/test_config.py index 8c945aa..8a5bf3c 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -25,8 +25,8 @@ def _write_active_profile(global_dir: Path, *, name: str = "demo-agent") -> Path (global_dir / "profiles" / ".active").write_text(f"{name}\n") (global_dir / "profiles" / name / "profile.toml").write_text( f'base_url = "https://next.paxai.app"\n' - f'agent_name = "orion"\n' - f'agent_id = "agent-orion"\n' + f'agent_name = "demo-agent"\n' + f'agent_id = "agent-demo-agent"\n' f'space_id = "next-space"\n' f'token_file = "{token_file}"\n' ) @@ -133,8 +133,8 @@ def test_ax_config_file_overrides_local_runtime_config(self, tmp_path, monkeypat runtime_config.write_text( f'token_file = "{token_file.name}"\n' 'base_url = "https://next.paxai.app"\n' - 'agent_name = "orion"\n' - 'agent_id = "agent-orion"\n' + 'agent_name = "demo-agent"\n' + 'agent_id = "agent-demo-agent"\n' 'space_id = "space-next"\n' ) monkeypatch.chdir(tmp_path) @@ -144,8 +144,8 @@ def test_ax_config_file_overrides_local_runtime_config(self, tmp_path, monkeypat assert cfg["token"] == "axp_a_runtime.secret" assert cfg["base_url"] == "https://next.paxai.app" - assert cfg["agent_name"] == "orion" - assert cfg["agent_id"] == "agent-orion" + assert cfg["agent_name"] == "demo-agent" + assert cfg["agent_id"] == "agent-demo-agent" assert cfg["space_id"] == "space-next" assert cfg["principal_type"] == "agent" @@ -185,8 +185,8 @@ def test_local_agent_config_overrides_user_login_principal(self, tmp_path, monke (local_ax / "config.toml").write_text( 'token = "axp_a_agent.secret"\n' 'base_url = "https://next.paxai.app"\n' - 'agent_name = "orion"\n' - 'agent_id = "agent-orion"\n' + 'agent_name = "demo-agent"\n' + 'agent_id = "agent-demo-agent"\n' ) monkeypatch.chdir(tmp_path) @@ -194,7 +194,7 @@ def test_local_agent_config_overrides_user_login_principal(self, tmp_path, monke assert cfg["token"] == "axp_a_agent.secret" assert cfg["principal_type"] == "agent" - assert cfg["agent_name"] == "orion" + assert cfg["agent_name"] == "demo-agent" def test_unsafe_local_user_pat_agent_config_does_not_override_active_profile( self, tmp_path, monkeypatch, capsys @@ -210,8 +210,8 @@ def test_unsafe_local_user_pat_agent_config_does_not_override_active_profile( (global_dir / "profiles" / ".active").write_text("demo-agent\n") (global_dir / "profiles" / "demo-agent" / "profile.toml").write_text( f'base_url = "https://next.paxai.app"\n' - f'agent_name = "orion"\n' - f'agent_id = "agent-orion"\n' + f'agent_name = "demo-agent"\n' + f'agent_id = "agent-demo-agent"\n' f'space_id = "next-space"\n' f'token_file = "{token_file}"\n' ) @@ -231,8 +231,8 @@ def test_unsafe_local_user_pat_agent_config_does_not_override_active_profile( assert cfg["token"] == "axp_a_agent.secret" assert cfg["base_url"] == "https://next.paxai.app" - assert cfg["agent_name"] == "orion" - assert cfg["agent_id"] == "agent-orion" + assert cfg["agent_name"] == "demo-agent" + assert cfg["agent_id"] == "agent-demo-agent" assert cfg["space_id"] == "next-space" assert "Ignoring unsafe local aX config" in capsys.readouterr().err @@ -377,7 +377,7 @@ def test_unsafe_local_config_reports_ignored_reason_and_uses_profile(self, tmp_p assert diagnostic["ok"] is True assert diagnostic["effective"]["auth_source"] == "active_profile:demo-agent" - assert diagnostic["effective"]["agent_name"] == "orion" + assert diagnostic["effective"]["agent_name"] == "demo-agent" assert diagnostic["effective"]["space_id"] == "next-space" assert any(warning["code"] == "unsafe_local_config_ignored" for warning in diagnostic["warnings"]) local_source = next(source for source in diagnostic["sources"] if source["name"] == "local_config") @@ -486,7 +486,7 @@ def test_resolve_user_token_uses_user_login_even_with_local_agent(self, tmp_path local_ax = tmp_path / ".ax" local_ax.mkdir() (local_ax / "config.toml").write_text( - 'token = "axp_a_agent.secret"\nagent_name = "orion"\nagent_id = "agent-orion"\n' + 'token = "axp_a_agent.secret"\nagent_name = "demo-agent"\nagent_id = "agent-demo-agent"\n' ) monkeypatch.chdir(tmp_path) diff --git a/tests/test_context_commands.py b/tests/test_context_commands.py index 93c2d61..5e0f58e 100644 --- a/tests/test_context_commands.py +++ b/tests/test_context_commands.py @@ -296,12 +296,12 @@ def send_message(self, space_id, content): result = runner.invoke( app, - ["context", "upload-file", str(sample), "--mention", "@orion", "--json"], + ["context", "upload-file", str(sample), "--mention", "@demo-agent", "--json"], ) assert result.exit_code == 0, result.output assert calls["message"]["space_id"] == "space-1" - assert calls["message"]["content"].startswith("@orion Context uploaded:") + assert calls["message"]["content"].startswith("@demo-agent Context uploaded:") assert calls["context"]["key"] in calls["message"]["content"] assert '"message_id": "msg-1"' in result.output diff --git a/tests/test_handoff.py b/tests/test_handoff.py index 8358ab2..5828ee5 100644 --- a/tests/test_handoff.py +++ b/tests/test_handoff.py @@ -27,13 +27,13 @@ def test_handoff_matches_thread_reply_from_target_agent(): "id": "reply-1", "content": "Reviewed and done.", "parent_id": "sent-1", - "display_name": "orion", + "display_name": "demo-agent", "created_at": "2026-04-13T04:31:00+00:00", } assert _matches_handoff_reply( message, - agent_name="orion", + agent_name="demo-agent", sent_message_id="sent-1", token="handoff:abc123", current_agent_name="ChatGPT", @@ -47,13 +47,13 @@ def test_handoff_matches_fast_top_level_reply_with_token_and_mention(): "id": "reply-1", "content": "@ChatGPT handoff:abc123 reviewed the spec.", "conversation_id": "reply-1", - "display_name": "orion", + "display_name": "demo-agent", "created_at": "2026-04-13T04:31:00+00:00", } assert _matches_handoff_reply( message, - agent_name="@orion", + agent_name="@demo-agent", sent_message_id="sent-1", token="handoff:abc123", current_agent_name="ChatGPT", @@ -71,7 +71,7 @@ def test_handoff_does_not_match_other_agent(): assert not _matches_handoff_reply( message, - agent_name="orion", + agent_name="demo-agent", sent_message_id="sent-1", token="handoff:abc123", current_agent_name="ChatGPT", @@ -173,7 +173,7 @@ def test_handoff_loop_repeats_until_completion_promise(monkeypatch): class FakeClient: def list_agents(self): - return {"agents": [{"id": "agent-1", "name": "orion"}]} + return {"agents": [{"id": "agent-1", "name": "demo-agent"}]} def create_task(self, space_id, title, description=None, priority=None, assignee_id=None): calls["task"] = { @@ -191,8 +191,8 @@ def send_message(self, space_id, content, parent_id=None): return {"message": {"id": message_id}} replies = [ - {"id": "reply-1", "content": "handoff:abc still working", "display_name": "orion"}, - {"id": "reply-2", "content": "DONE", "display_name": "orion"}, + {"id": "reply-1", "content": "handoff:abc still working", "display_name": "demo-agent"}, + {"id": "reply-2", "content": "DONE", "display_name": "demo-agent"}, ] monkeypatch.setattr("ax_cli.commands.handoff.get_client", lambda: FakeClient()) @@ -205,7 +205,7 @@ def send_message(self, space_id, content, parent_id=None): app, [ "handoff", - "orion", + "demo-agent", "Fix the regression with tests", "--loop", "--max-rounds", @@ -221,7 +221,7 @@ def send_message(self, space_id, content, parent_id=None): data = _json_tail(result.output) assert len(calls["messages"]) == 2 assert "Agentic loop mode is enabled" in calls["messages"][0]["content"] - assert calls["messages"][1]["content"].startswith("@orion Continue agentic loop") + assert calls["messages"][1]["content"].startswith("@demo-agent Continue agentic loop") assert calls["messages"][1]["parent_id"] == "reply-1" assert data["reply"]["id"] == "reply-2" assert data["loop"]["completed"] is True @@ -235,7 +235,7 @@ def test_handoff_loop_stops_at_max_rounds_without_promise(monkeypatch): class FakeClient: def list_agents(self): - return {"agents": [{"id": "agent-1", "name": "orion"}]} + return {"agents": [{"id": "agent-1", "name": "demo-agent"}]} def create_task(self, space_id, title, description=None, priority=None, assignee_id=None): return {"task": {"id": "task-1"}} @@ -246,8 +246,8 @@ def send_message(self, space_id, content, parent_id=None): return {"message": {"id": message_id}} replies = [ - {"id": "reply-1", "content": "round one", "display_name": "orion"}, - {"id": "reply-2", "content": "round two", "display_name": "orion"}, + {"id": "reply-1", "content": "round one", "display_name": "demo-agent"}, + {"id": "reply-2", "content": "round two", "display_name": "demo-agent"}, ] monkeypatch.setattr("ax_cli.commands.handoff.get_client", lambda: FakeClient()) @@ -257,7 +257,7 @@ def send_message(self, space_id, content, parent_id=None): result = runner.invoke( app, - ["handoff", "orion", "Iterate twice", "--loop", "--max-rounds", "2", "--no-adaptive-wait", "--json"], + ["handoff", "demo-agent", "Iterate twice", "--loop", "--max-rounds", "2", "--no-adaptive-wait", "--json"], ) assert result.exit_code == 0, result.output @@ -275,7 +275,7 @@ def test_handoff_loop_timeout_after_progress_uses_loop_timeout_status(monkeypatc class FakeClient: def list_agents(self): - return {"agents": [{"id": "agent-1", "name": "orion"}]} + return {"agents": [{"id": "agent-1", "name": "demo-agent"}]} def create_task(self, space_id, title, description=None, priority=None, assignee_id=None): return {"task": {"id": "task-1"}} @@ -285,7 +285,7 @@ def send_message(self, space_id, content, parent_id=None): calls["messages"].append({"space_id": space_id, "content": content, "parent_id": parent_id}) return {"message": {"id": message_id}} - replies = [{"id": "reply-1", "content": "round one", "display_name": "orion"}, None] + replies = [{"id": "reply-1", "content": "round one", "display_name": "demo-agent"}, None] monkeypatch.setattr("ax_cli.commands.handoff.get_client", lambda: FakeClient()) monkeypatch.setattr("ax_cli.commands.handoff.resolve_space_id", lambda client, explicit=None: "space-1") @@ -294,7 +294,7 @@ def send_message(self, space_id, content, parent_id=None): result = runner.invoke( app, - ["handoff", "orion", "Iterate twice", "--loop", "--max-rounds", "2", "--no-adaptive-wait", "--json"], + ["handoff", "demo-agent", "Iterate twice", "--loop", "--max-rounds", "2", "--no-adaptive-wait", "--json"], ) assert result.exit_code == 0, result.output @@ -361,7 +361,7 @@ def test_handoff_default_adaptive_wait_continues_when_probe_replies(monkeypatch) class FakeClient: def list_agents(self): - return {"agents": [{"id": "agent-1", "name": "orion"}]} + return {"agents": [{"id": "agent-1", "name": "demo-agent"}]} def create_task(self, space_id, title, description=None, priority=None, assignee_id=None): return {"task": {"id": "task-1"}} @@ -372,8 +372,8 @@ def send_message(self, space_id, content, parent_id=None): return {"message": {"id": message_id}} replies = [ - {"id": "probe-reply", "content": "ping:ok", "display_name": "orion"}, - {"id": "handoff-reply", "content": "reviewed", "display_name": "orion"}, + {"id": "probe-reply", "content": "ping:ok", "display_name": "demo-agent"}, + {"id": "handoff-reply", "content": "reviewed", "display_name": "demo-agent"}, ] monkeypatch.setattr("ax_cli.commands.handoff.get_client", lambda: FakeClient()) @@ -381,7 +381,7 @@ def send_message(self, space_id, content, parent_id=None): monkeypatch.setattr("ax_cli.commands.handoff.resolve_agent_name", lambda client=None: "ChatGPT") monkeypatch.setattr("ax_cli.commands.handoff._wait_for_handoff_reply", lambda *args, **kwargs: replies.pop(0)) - result = runner.invoke(app, ["handoff", "orion", "Review CLI docs", "--json"]) + result = runner.invoke(app, ["handoff", "demo-agent", "Review CLI docs", "--json"]) assert result.exit_code == 0, result.output data = _json_tail(result.output) @@ -397,7 +397,7 @@ def test_handoff_no_adaptive_wait_skips_contact_probe(monkeypatch): class FakeClient: def list_agents(self): - return {"agents": [{"id": "agent-1", "name": "orion"}]} + return {"agents": [{"id": "agent-1", "name": "demo-agent"}]} def create_task(self, space_id, title, description=None, priority=None, assignee_id=None): return {"task": {"id": "task-1"}} @@ -412,10 +412,10 @@ def send_message(self, space_id, content, parent_id=None): monkeypatch.setattr("ax_cli.commands.handoff.resolve_agent_name", lambda client=None: "ChatGPT") monkeypatch.setattr( "ax_cli.commands.handoff._wait_for_handoff_reply", - lambda *args, **kwargs: {"id": "reply-1", "content": "reviewed", "display_name": "orion"}, + lambda *args, **kwargs: {"id": "reply-1", "content": "reviewed", "display_name": "demo-agent"}, ) - result = runner.invoke(app, ["handoff", "orion", "Review CLI docs", "--no-adaptive-wait", "--json"]) + result = runner.invoke(app, ["handoff", "demo-agent", "Review CLI docs", "--no-adaptive-wait", "--json"]) assert result.exit_code == 0, result.output data = _json_tail(result.output) diff --git a/tests/test_messages.py b/tests/test_messages.py index 9e156f4..825a996 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -105,7 +105,7 @@ def list_messages(self, limit=20, channel="main", *, space_id=None): { "id": message_id, "content": "hello", - "display_name": "orion", + "display_name": "demo-agent", "created_at": "2026-04-13T15:00:00Z", } ] @@ -142,7 +142,7 @@ def list_messages(self, limit=20, channel="main", *, space_id=None, unread_only= { "id": "12345678-90ab-cdef-1234-567890abcdef", "content": "unread update", - "display_name": "orion", + "display_name": "demo-agent", "created_at": "2026-04-13T15:00:00Z", } ], @@ -320,10 +320,10 @@ def send_message(self, space_id, content, *, channel="main", parent_id=None, att monkeypatch.setattr("ax_cli.commands.messages.resolve_space_id", lambda client, explicit=None: "space-1") monkeypatch.setattr("ax_cli.commands.messages.resolve_agent_name", lambda client=None: None) - result = runner.invoke(app, ["send", "checkpoint", "--to", "orion", "--no-wait", "--json"]) + result = runner.invoke(app, ["send", "checkpoint", "--to", "demo-agent", "--no-wait", "--json"]) assert result.exit_code == 0, result.output - assert calls["message"]["content"] == "@orion checkpoint" + assert calls["message"]["content"] == "@demo-agent checkpoint" def test_send_ask_ax_prepends_ax_mention(monkeypatch): @@ -373,7 +373,7 @@ def send_message(self, space_id, content, *, channel="main", parent_id=None, att def test_send_ask_ax_rejects_to_combination(): - result = runner.invoke(app, ["send", "route this", "--ask-ax", "--to", "orion"]) + result = runner.invoke(app, ["send", "route this", "--ask-ax", "--to", "demo-agent"]) assert result.exit_code == 1 assert "use either --ask-ax or --to" in result.output @@ -409,11 +409,11 @@ def fake_wait(client, message_id, timeout=60, wait_label="reply", **kwargs): monkeypatch.setattr("ax_cli.commands.messages.resolve_agent_name", lambda client=None: None) monkeypatch.setattr("ax_cli.commands.messages._wait_for_reply", fake_wait) - result = runner.invoke(app, ["send", "@orion checkpoint", "--to", "orion", "--json"]) + result = runner.invoke(app, ["send", "@demo-agent checkpoint", "--to", "demo-agent", "--json"]) assert result.exit_code == 0, result.output - assert calls["message"]["content"] == "@orion checkpoint" - assert calls["wait"]["wait_label"] == "@orion" + assert calls["message"]["content"] == "@demo-agent checkpoint" + assert calls["wait"]["wait_label"] == "@demo-agent" assert calls["wait"]["processing_watcher"] is not None @@ -425,7 +425,7 @@ def test_processing_status_from_event_matches_message(): "message_id": "msg-1", "status": "working", "agent_id": "agent-1", - "agent_name": "orion", + "agent_name": "demo-agent", }, ) @@ -433,7 +433,7 @@ def test_processing_status_from_event_matches_message(): "message_id": "msg-1", "status": "working", "agent_id": "agent-1", - "agent_name": "orion", + "agent_name": "demo-agent", } assert _processing_status_from_event("msg-2", "agent_processing", {"message_id": "msg-1"}) is None assert _processing_status_from_event("msg-1", "message", {"message_id": "msg-1"}) is None diff --git a/tests/test_mint_command.py b/tests/test_mint_command.py index 4665953..0536189 100644 --- a/tests/test_mint_command.py +++ b/tests/test_mint_command.py @@ -18,7 +18,7 @@ def list_agents(self): "agents": [ { "id": "12345678-90ab-cdef-1234-567890abcdef", - "name": "orion", + "name": "demo-agent", } ] } @@ -68,7 +68,7 @@ def test_token_mint_prints_token_when_not_saving(monkeypatch, write_config): write_config(token="axp_u_user.secret", base_url="https://next.paxai.app") monkeypatch.setattr("ax_cli.commands.mint.get_user_client", lambda: FakeMintClient()) - result = runner.invoke(app, ["token", "mint", "orion"]) + result = runner.invoke(app, ["token", "mint", "demo-agent"]) assert result.exit_code == 0, result.output assert "axp_a_newly_minted.secret" in result.output @@ -103,12 +103,12 @@ def test_token_mint_hides_token_when_saved(monkeypatch, write_config, tmp_path): write_config(token="axp_u_user.secret", base_url="https://next.paxai.app") monkeypatch.setattr("ax_cli.commands.mint.get_user_client", lambda: FakeMintClient()) - result = runner.invoke(app, ["token", "mint", "orion", "--save-to", str(tmp_path)]) + result = runner.invoke(app, ["token", "mint", "demo-agent", "--save-to", str(tmp_path)]) assert result.exit_code == 0, result.output assert "axp_a_newly_minted.secret" not in result.output assert "not printed" in result.output - assert (tmp_path / ".ax" / "orion_token").read_text() == "axp_a_newly_minted.secret" + assert (tmp_path / ".ax" / "demo-agent_token").read_text() == "axp_a_newly_minted.secret" def test_token_mint_json_hides_token_when_saved(monkeypatch, write_config, tmp_path): @@ -116,14 +116,14 @@ def test_token_mint_json_hides_token_when_saved(monkeypatch, write_config, tmp_p (tmp_path / ".ax" / "config.toml").chmod(0o600) monkeypatch.setattr("ax_cli.commands.mint.get_user_client", lambda: FakeMintClient()) - result = runner.invoke(app, ["token", "mint", "orion", "--save-to", str(tmp_path), "--json"]) + result = runner.invoke(app, ["token", "mint", "demo-agent", "--save-to", str(tmp_path), "--json"]) assert result.exit_code == 0, result.output payload = json.loads(result.output) assert "token" not in payload assert payload["token_redacted"] is True assert payload["token_printed"] is False - assert payload["token_file"].endswith(".ax/orion_token") + assert payload["token_file"].endswith(".ax/demo-agent_token") def test_token_mint_can_print_saved_token_when_explicit(monkeypatch, write_config, tmp_path): @@ -131,7 +131,7 @@ def test_token_mint_can_print_saved_token_when_explicit(monkeypatch, write_confi (tmp_path / ".ax" / "config.toml").chmod(0o600) monkeypatch.setattr("ax_cli.commands.mint.get_user_client", lambda: FakeMintClient()) - result = runner.invoke(app, ["token", "mint", "orion", "--save-to", str(tmp_path), "--print-token", "--json"]) + result = runner.invoke(app, ["token", "mint", "demo-agent", "--save-to", str(tmp_path), "--print-token", "--json"]) assert result.exit_code == 0, result.output payload = json.loads(result.output) @@ -143,8 +143,8 @@ def test_token_mint_uses_user_login_when_local_config_is_agent(monkeypatch, writ write_config( token="axp_a_agent.secret", base_url="https://next.paxai.app", - agent_name="orion", - agent_id="agent-orion", + agent_name="demo-agent", + agent_id="agent-demo-agent", ) user_config_dir = Path(os.environ["AX_CONFIG_DIR"]) user_config_dir.mkdir(parents=True, exist_ok=True) @@ -153,14 +153,14 @@ def test_token_mint_uses_user_login_when_local_config_is_agent(monkeypatch, writ ) monkeypatch.setattr("ax_cli.commands.mint.get_user_client", lambda: FakeMintClient()) - result = runner.invoke(app, ["token", "mint", "orion"]) + result = runner.invoke(app, ["token", "mint", "demo-agent"]) assert result.exit_code == 0, result.output assert "axp_a_newly_minted.secret" in result.output def test_token_mint_env_selects_named_user_login(monkeypatch, write_config): - write_config(token="axp_a_agent.secret", base_url="https://next.paxai.app", agent_name="orion") + write_config(token="axp_a_agent.secret", base_url="https://next.paxai.app", agent_name="demo-agent") monkeypatch.setenv("AX_USER_TOKEN", "axp_u_dev.secret") def fake_get_user_client(): @@ -169,7 +169,7 @@ def fake_get_user_client(): monkeypatch.setattr("ax_cli.commands.mint.get_user_client", fake_get_user_client) - result = runner.invoke(app, ["token", "mint", "orion", "--env", "dev"]) + result = runner.invoke(app, ["token", "mint", "demo-agent", "--env", "dev"]) assert result.exit_code == 0, result.output assert "axp_a_newly_minted.secret" in result.output diff --git a/tests/test_reminders_commands.py b/tests/test_reminders_commands.py index 2d7da0a..4f949d5 100644 --- a/tests/test_reminders_commands.py +++ b/tests/test_reminders_commands.py @@ -71,7 +71,7 @@ def test_add_creates_local_policy_file(monkeypatch, tmp_path): "--reason", "check this task", "--target", - "orion", + "demo-agent", "--first-in-minutes", "0", "--max-fires", @@ -89,7 +89,7 @@ def test_add_creates_local_policy_file(monkeypatch, tmp_path): policy = store["policies"][0] assert policy["source_task_id"] == "task-1" assert policy["reason"] == "check this task" - assert policy["target"] == "orion" + assert policy["target"] == "demo-agent" assert policy["max_fires"] == 2 assert policy["enabled"] is True @@ -109,7 +109,7 @@ def test_run_once_fires_due_policy_and_disables_at_max(monkeypatch, tmp_path): "space_id": "space-abc", "source_task_id": "task-1", "reason": "review task state", - "target": "orion", + "target": "demo-agent", "severity": "info", "cadence_seconds": 300, "next_fire_at": "2026-04-16T00:00:00Z", @@ -128,11 +128,11 @@ def test_run_once_fires_due_policy_and_disables_at_max(monkeypatch, tmp_path): assert len(fake.sent) == 1 sent = fake.sent[0] assert sent["message_type"] == "reminder" - assert sent["content"].startswith("@orion Reminder:") + assert sent["content"].startswith("@demo-agent Reminder:") metadata = sent["metadata"] assert metadata["alert"]["kind"] == "task_reminder" assert metadata["alert"]["source_task_id"] == "task-1" - assert metadata["alert"]["target_agent"] == "orion" + assert metadata["alert"]["target_agent"] == "demo-agent" assert metadata["alert"]["response_required"] is True assert metadata["reminder_policy"]["policy_id"] == "rem-test" @@ -158,7 +158,7 @@ def test_run_once_skips_future_policy(monkeypatch, tmp_path): "space_id": "space-abc", "source_task_id": "task-1", "reason": "not yet", - "target": "orion", + "target": "demo-agent", "cadence_seconds": 300, "next_fire_at": "2999-01-01T00:00:00Z", "max_fires": 1, @@ -204,14 +204,14 @@ def json(self): "title": "Ship delivery receipts", "priority": "urgent", "status": "in_progress", - "assignee_id": "agent-orion", + "assignee_id": "agent-demo-agent", "creator_id": "agent-chatgpt", "deadline": "2026-04-17T00:00:00Z", } } ) - if path.endswith("/agents/agent-orion"): - return _R({"agent": {"id": "agent-orion", "name": "orion"}}) + if path.endswith("/agents/agent-demo-agent"): + return _R({"agent": {"id": "agent-demo-agent", "name": "demo-agent"}}) return _R({}) fake = _FakeClient() @@ -232,7 +232,7 @@ def json(self): "space_id": "space-abc", "source_task_id": "task-snap", "reason": "review delivery receipts", - "target": "orion", + "target": "demo-agent", "severity": "info", "cadence_seconds": 300, "next_fire_at": "2026-04-16T00:00:00Z", @@ -257,8 +257,8 @@ def json(self): assert task["title"] == "Ship delivery receipts" assert task["priority"] == "urgent" assert task["status"] == "in_progress" - assert task["assignee_id"] == "agent-orion" - assert task["assignee_name"] == "orion" + assert task["assignee_id"] == "agent-demo-agent" + assert task["assignee_name"] == "demo-agent" assert task["deadline"] == "2026-04-17T00:00:00Z" card_payload = metadata["ui"]["cards"][0]["payload"] @@ -292,7 +292,7 @@ def get(self, path: str, *, headers: dict) -> Any: "space_id": "space-abc", "source_task_id": "task-nope", "reason": "fallback path", - "target": "orion", + "target": "demo-agent", "cadence_seconds": 300, "next_fire_at": "2026-04-16T00:00:00Z", "max_fires": 1, @@ -357,11 +357,11 @@ def test_run_once_skips_and_disables_when_source_task_is_terminal(monkeypatch, t "id": "task-done", "title": "Already shipped", "status": "completed", - "assignee_id": "agent-orion", + "assignee_id": "agent-demo-agent", "creator_id": "agent-chatgpt", } }, - "/agents/agent-orion": {"agent": {"id": "agent-orion", "name": "orion"}}, + "/agents/agent-demo-agent": {"agent": {"id": "agent-demo-agent", "name": "demo-agent"}}, }, ) @@ -377,7 +377,7 @@ def test_run_once_skips_and_disables_when_source_task_is_terminal(monkeypatch, t "space_id": "space-abc", "source_task_id": "task-done", "reason": "old reminder for a finished task", - "target": "orion", + "target": "demo-agent", "severity": "info", "cadence_seconds": 300, "next_fire_at": "2026-04-16T00:00:00Z", @@ -418,12 +418,12 @@ def test_run_once_reroutes_pending_review_to_review_owner(monkeypatch, tmp_path) "id": "task-review", "title": "PR awaiting review", "status": "pending_review", - "assignee_id": "agent-orion", + "assignee_id": "agent-demo-agent", "creator_id": "agent-chatgpt", "requirements": {"review_owner": "alex"}, } }, - "/agents/agent-orion": {"agent": {"id": "agent-orion", "name": "orion"}}, + "/agents/agent-demo-agent": {"agent": {"id": "agent-demo-agent", "name": "demo-agent"}}, "/agents/agent-chatgpt": {"agent": {"id": "agent-chatgpt", "name": "chatgpt"}}, }, ) @@ -479,12 +479,12 @@ def test_run_once_pending_review_falls_back_to_creator_when_no_owner(monkeypatch "id": "task-review2", "title": "PR awaiting review — no owner", "status": "in_progress", - "assignee_id": "agent-orion", + "assignee_id": "agent-demo-agent", "creator_id": "agent-chatgpt", "requirements": {"pending_review": True}, } }, - "/agents/agent-orion": {"agent": {"id": "agent-orion", "name": "orion"}}, + "/agents/agent-demo-agent": {"agent": {"id": "agent-demo-agent", "name": "demo-agent"}}, "/agents/agent-chatgpt": {"agent": {"id": "agent-chatgpt", "name": "chatgpt"}}, }, ) diff --git a/tests/test_tasks_commands.py b/tests/test_tasks_commands.py index 8ff9efe..242bfb8 100644 --- a/tests/test_tasks_commands.py +++ b/tests/test_tasks_commands.py @@ -13,7 +13,7 @@ def list_agents(self, *, space_id=None, limit=None): calls["list_agents"] = {"space_id": space_id, "limit": limit} return { "agents": [ - {"id": "agent-123", "name": "orion"}, + {"id": "agent-123", "name": "demo-agent"}, {"id": "agent-456", "name": "cipher"}, ] } @@ -33,7 +33,7 @@ def create_task(self, space_id, title, *, description=None, priority="medium", a result = runner.invoke( app, - ["tasks", "create", "Review the spec", "--assign", "@orion", "--no-notify", "--json"], + ["tasks", "create", "Review the spec", "--assign", "@demo-agent", "--no-notify", "--json"], ) assert result.exit_code == 0, result.output @@ -77,7 +77,7 @@ def list_agents(self, *, space_id=None, limit=None): result = runner.invoke( app, - ["tasks", "create", "Review the spec", "--assign", "orion", "--no-notify"], + ["tasks", "create", "Review the spec", "--assign", "demo-agent", "--no-notify"], ) assert result.exit_code == 1 @@ -124,7 +124,7 @@ def test_tasks_create_assign_handle_mentions_assignee_by_default(monkeypatch): class FakeClient: def list_agents(self, *, space_id=None, limit=None): - return {"agents": [{"id": "agent-123", "name": "orion"}]} + return {"agents": [{"id": "agent-123", "name": "demo-agent"}]} def create_task(self, space_id, title, *, description=None, priority="medium", assignee_id=None): calls["create_task"] = {"assignee_id": assignee_id} @@ -144,13 +144,13 @@ def send_message(self, space_id, content, *, metadata=None, message_type="text") result = runner.invoke( app, - ["tasks", "create", "Run smoke tests", "--assign", "orion", "--json"], + ["tasks", "create", "Run smoke tests", "--assign", "demo-agent", "--json"], ) assert result.exit_code == 0, result.output assert calls["create_task"]["assignee_id"] == "agent-123" - assert calls["message"]["content"].startswith("@orion New task created:") + assert calls["message"]["content"].startswith("@demo-agent New task created:") assert calls["message"]["metadata"]["ui"]["cards"][0]["payload"]["assignee"] == { "id": "agent-123", - "name": "orion", + "name": "demo-agent", } diff --git a/tests/test_upload.py b/tests/test_upload.py index f6e9f8f..725922f 100644 --- a/tests/test_upload.py +++ b/tests/test_upload.py @@ -67,7 +67,7 @@ def send_message(self, space_id, content, attachments=None): "--message", "@alex sample", "--mention", - "orion", + "demo-agent", "--json", ], ) @@ -76,7 +76,7 @@ def send_message(self, space_id, content, attachments=None): assert calls["upload"]["space_id"] == "space-1" assert calls["context"]["space_id"] == "space-1" assert calls["message"]["space_id"] == "space-1" - assert calls["message"]["content"].startswith("@orion @alex sample") + assert calls["message"]["content"].startswith("@demo-agent @alex sample") def test_upload_file_no_message_still_stores_context(monkeypatch, tmp_path):