agentirc-cli 9.4.0__tar.gz → 9.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/CHANGELOG.md +11 -0
  2. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/CLAUDE.md +8 -8
  3. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/PKG-INFO +3 -3
  4. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/docs/superpowers/specs/2026-04-30-bootstrap-design.md +4 -3
  5. agentirc_cli-9.4.1/docs/superpowers/specs/2026-05-01-task14-audit.md +65 -0
  6. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/pyproject.toml +18 -18
  7. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/uv.lock +1 -1
  8. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/SKILL.md +0 -0
  9. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/portability-lint.sh +0 -0
  10. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/pr-batch.sh +0 -0
  11. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/pr-comments.sh +0 -0
  12. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/pr-reply.sh +0 -0
  13. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/pr-sonar.sh +0 -0
  14. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/pr-status.sh +0 -0
  15. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills/pr-review/scripts/workflow.sh +0 -0
  16. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.claude/skills.local.yaml.example +0 -0
  17. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.github/workflows/publish.yml +0 -0
  18. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.github/workflows/tests.yml +0 -0
  19. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/.gitignore +0 -0
  20. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/LICENSE +0 -0
  21. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/README.md +0 -0
  22. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/__init__.py +0 -0
  23. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/__main__.py +0 -0
  24. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/__init__.py +0 -0
  25. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/aio.py +0 -0
  26. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/bots/__init__.py +0 -0
  27. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/bots/bot_manager.py +0 -0
  28. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/bots/http_listener.py +0 -0
  29. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/cli_shared/__init__.py +0 -0
  30. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/cli_shared/constants.py +0 -0
  31. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/cli_shared/mesh.py +0 -0
  32. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/constants.py +0 -0
  33. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/pidfile.py +0 -0
  34. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/protocol/__init__.py +0 -0
  35. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/protocol/message.py +0 -0
  36. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/protocol/replies.py +0 -0
  37. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/telemetry/__init__.py +0 -0
  38. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/telemetry/audit.py +0 -0
  39. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/telemetry/context.py +0 -0
  40. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/telemetry/metrics.py +0 -0
  41. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/telemetry/tracing.py +0 -0
  42. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/_internal/virtual_client.py +0 -0
  43. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/channel.py +0 -0
  44. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/cli.py +0 -0
  45. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/client.py +0 -0
  46. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/config.py +0 -0
  47. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/events.py +0 -0
  48. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/history_store.py +0 -0
  49. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/ircd.py +0 -0
  50. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/protocol.py +0 -0
  51. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/remote_client.py +0 -0
  52. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/room_store.py +0 -0
  53. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/rooms_util.py +0 -0
  54. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/server_link.py +0 -0
  55. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/skill.py +0 -0
  56. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/skills/__init__.py +0 -0
  57. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/skills/history.py +0 -0
  58. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/skills/icon.py +0 -0
  59. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/skills/rooms.py +0 -0
  60. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/skills/threads.py +0 -0
  61. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/agentirc/thread_store.py +0 -0
  62. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/docs/api-stability.md +0 -0
  63. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/docs/cli.md +0 -0
  64. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/docs/deployment.md +0 -0
  65. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/docs/steward/onboarding.md +0 -0
  66. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/__init__.py +0 -0
  67. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/_helpers.py +0 -0
  68. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/conftest.py +0 -0
  69. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/__init__.py +0 -0
  70. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/_fakes.py +0 -0
  71. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/_metrics_helpers.py +0 -0
  72. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_audit_emit.py +0 -0
  73. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_audit_lifecycle.py +0 -0
  74. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_audit_module.py +0 -0
  75. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_audit_parse_error.py +0 -0
  76. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_config.py +0 -0
  77. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_dispatch_span.py +0 -0
  78. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_emit_event_span.py +0 -0
  79. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_metrics_init.py +0 -0
  80. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_metrics_s2s.py +0 -0
  81. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_outbound_inject.py +0 -0
  82. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_parse_error.py +0 -0
  83. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_s2s_relay_span.py +0 -0
  84. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_server_init.py +0 -0
  85. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_server_link_inject.py +0 -0
  86. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/telemetry/test_tracing.py +0 -0
  87. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_channel.py +0 -0
  88. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_cli.py +0 -0
  89. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_config_loader.py +0 -0
  90. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_connection.py +0 -0
  91. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_discovery.py +0 -0
  92. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_events_basic.py +0 -0
  93. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_events_catalog.py +0 -0
  94. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_events_federation.py +0 -0
  95. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_events_history.py +0 -0
  96. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_events_lifecycle.py +0 -0
  97. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_events_reserved_nick.py +0 -0
  98. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_federation.py +0 -0
  99. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_history.py +0 -0
  100. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_link_reconnect.py +0 -0
  101. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_mentions.py +0 -0
  102. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_messaging.py +0 -0
  103. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_modes.py +0 -0
  104. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_room_persistence.py +0 -0
  105. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_rooms_federation.py +0 -0
  106. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_rooms_integration.py +0 -0
  107. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_server_icon_skill.py +0 -0
  108. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_skills.py +0 -0
  109. {agentirc_cli-9.4.0 → agentirc_cli-9.4.1}/tests/test_threads.py +0 -0
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
+ ## [9.4.1] - 2026-05-01
8
+
9
+ ### Documentation
10
+
11
+ - Marked the bootstrap closed in `docs/superpowers/specs/2026-04-30-bootstrap-design.md` and `CLAUDE.md`. Tasks 16–18 (tag `v9.4.0`, verify PyPI publish, report-back to culture) are done; the spec status note now reads as a closed timeline ("Released ✅"), and `CLAUDE.md`'s "Current state" reads "bootstrap complete (9.4.0 released)" with a non-blocking follow-ups list linking to issues #7–#12 (Track A wire-format fixes, steward backport, callsite sweep, A2 test migration).
12
+ - Fixed 14 stale `OriNachum/*` GitHub URLs in `pyproject.toml` and the bootstrap spec to canonical `agentculture/*` paths. Investigation showed these weren't merely stylistic — `https://github.com/OriNachum/culture` returns 404 and `https://github.com/OriNachum/agentirc` 301-redirects to the wrong path. URL fixes only; sha256s are content-hashed and unaffected. `cite check` still passes.
13
+
14
+ ### Notes
15
+
16
+ - Functionally identical to `9.4.0`. Published as a fresh PyPI release because `publish.yml` triggers on push-to-`main` and PyPI rejects re-publishing the same version with different sha256.
17
+
7
18
  ## [9.4.0] - 2026-05-01
8
19
 
9
20
  ### Added
@@ -2,9 +2,9 @@
2
2
 
3
3
  This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
4
 
5
- ## Current state: bootstrap functionally + docs complete (9.4.0); release ceremony remains
5
+ ## Current state: bootstrap complete (9.4.0 released)
6
6
 
7
- This repo is the agentirc server-core extraction out of the sibling project [`culture`](https://github.com/OriNachum/culture). As of 9.4.0:
7
+ This repo is the agentirc server-core extraction out of the sibling project [`culture`](https://github.com/agentculture/culture). As of 9.4.0 (tagged at `5590256` and live on PyPI):
8
8
 
9
9
  - **Server-core** (`agentirc/{ircd,server_link,channel,events,skill,remote_client,…}.py`, `agentirc/skills/{rooms,threads,history,icon}.py`) — vendored from `culture@df50942` via the `cite-don't-copy` pattern (see `[tool.citation]` in `pyproject.toml`).
10
10
  - **Client transport** (`agentirc/client.py`) — vendored from `culture/agentirc/client.py` in PR-B2.
@@ -15,13 +15,13 @@ This repo is the agentirc server-core extraction out of the sibling project [`cu
15
15
  - **Internal support** (`agentirc/_internal/`) — `aio`, `constants`, `protocol/`, `telemetry/`, `virtual_client`, `pidfile`, `cli_shared/`, `bots/` stubs.
16
16
  - **Bootstrap docs** (PR-B4, 9.4.0) — `docs/api-stability.md` (3 public modules + semver contract), `docs/cli.md` (verb table, flag reference, exit codes, YAML/CLI precedence, agentirc-vs-culture diff table), `docs/deployment.md` (on-disk footprint, systemd `Type=simple` example, container deployment, multi-host federation, log rotation, coexistence with culture, backup).
17
17
 
18
- End-to-end verified: `agentirc start --port <p>` boots a real IRCd, TCP NICK/USER handshake returns `001 RPL_WELCOME`, `agentirc stop` shuts cleanly. `agentirc serve --config server.yaml --port 9999` correctly overlays CLI flag on YAML.
18
+ End-to-end verified: `agentirc start --port <p>` boots a real IRCd, TCP NICK/USER handshake returns `001 RPL_WELCOME`, `agentirc stop` shuts cleanly. `agentirc serve --config server.yaml --port 9999` correctly overlays CLI flag on YAML. `pip install agentirc-cli==9.4.0` from real PyPI in a clean venv produces both `agentirc` and `agentirc-cli` binaries; both reach the same `agentirc.cli:main` entry point. Acceptance audit recorded at [`docs/superpowers/specs/2026-05-01-task14-audit.md`](docs/superpowers/specs/2026-05-01-task14-audit.md). Culture-side cutover unblocked via [agentculture/culture#308](https://github.com/agentculture/culture/issues/308).
19
19
 
20
- What is **not** done yet:
21
- - **Acceptance-criteria spot-check** (Task 14 in the bootstrap spec) read-only audit to confirm every bullet in §"Acceptance criteria" is before tagging.
22
- - **Release ceremony** (Tasks 16–18) tag `v9.4.0`, the existing `publish.yml` CI pushes to PyPI on push to `main`, then report version + source SHA back so culture's cutover PR can pin against it.
23
- - **Cross-repo wire-format fixes (Track A)** — `ROOMETAEND`/`ROOMETASET` typos, `ERR_NOSUCHCHANNEL` overload, `STHREAD` collapse. Each requires culture-side change first then agentirc bump.
24
- - **Steward backport** — port the 9.3.0 `pr-sonar.sh` + `workflow.sh` SonarCloud wiring back to the steward skills repo.
20
+ **Outstanding follow-ups (non-blocking; the bootstrap itself is closed):**
21
+ - **Cross-repo wire-format fixes (Track A)** [#7](https://github.com/agentculture/agentirc/issues/7) (`ROOMETAEND`/`ROOMETASET` typos), [#8](https://github.com/agentculture/agentirc/issues/8) (`ERR_NOSUCHCHANNEL` overload), [#9](https://github.com/agentculture/agentirc/issues/9) (`STHREAD` verb collapse). Each requires culture-side change first then agentirc bump.
22
+ - **Steward backport** — [#10](https://github.com/agentculture/agentirc/issues/10). Port the 9.3.0 `pr-sonar.sh` + `workflow.sh sonar` wiring upstream so other workspace projects pick it up via re-vendoring.
23
+ - **Optional callsite sweep** — [#11](https://github.com/agentculture/agentirc/issues/11). Replace inline IRC verb / numeric-reply string literals in `ircd.py`/`server_link.py`/`skills/*.py` with `agentirc.protocol.<NAME>` imports. Pure refactor.
24
+ - **A2 bot-fixtured tests (low-priority)** — [#12](https://github.com/agentculture/agentirc/issues/12). Currently in culture; could be migrated to agentirc via subprocess-fixture rewrite if culture's coverage drifts.
25
25
 
26
26
  Read the bootstrap spec at `docs/superpowers/specs/2026-04-30-bootstrap-design.md` for the full plan; it is the operative source of truth and is intentionally self-contained. The culture-side counterpart spec is at `../culture/docs/superpowers/specs/2026-04-30-agentirc-extraction-design.md` — not normally needed, but explains *why* if a decision looks arbitrary.
27
27
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 9.4.0
3
+ Version: 9.4.1
4
4
  Summary: Agent-friendly IRCd: server core for AI agent meshes
5
- Project-URL: Homepage, https://github.com/OriNachum/agentirc
6
- Project-URL: Issues, https://github.com/OriNachum/agentirc/issues
5
+ Project-URL: Homepage, https://github.com/agentculture/agentirc
6
+ Project-URL: Issues, https://github.com/agentculture/agentirc/issues
7
7
  Author: Ori Nachum
8
8
  License: MIT License
9
9
 
@@ -7,7 +7,7 @@
7
7
 
8
8
  ## Summary
9
9
 
10
- This repo (`agentirc`) is being bootstrapped from a server-core extraction out of the sibling project [`culture`](https://github.com/OriNachum/culture). When this design is implemented, this repo will:
10
+ This repo (`agentirc`) is being bootstrapped from a server-core extraction out of the sibling project [`culture`](https://github.com/agentculture/culture). When this design is implemented, this repo will:
11
11
 
12
12
  - Be a publishable Python package on PyPI under the **distribution name `agentirc-cli`** (with TestPyPI dev releases also published as `agentirc`).
13
13
  - Expose a Python **import package named `agentirc`**.
@@ -173,8 +173,9 @@ Wire-format quirks (`ROOMETAEND`, `ROOMETASET` typos; `ERR_NOSUCHCHANNEL` semant
173
173
  > - **Shape B-1 — server-core extraction** ✅ (PR #3, `9.1.0`): Tasks 2, 4, 9 (runtime deps), partial 10. See the "Cite-don't-copy" subsection below.
174
174
  > - **Shape B-2 — real CLI + `protocol.py` + `client.py`** ✅ (PR-B2, `9.2.0`): Tasks 5, 7, plus vendoring `culture.pidfile`, `culture.cli.shared` (subset), and `culture/agentirc/client.py`. The bootstrap spec previously said `client.py` "stays in culture"; that decision was reversed in PR-B2 because (a) `agentirc/ircd.py:580`'s runtime `from agentirc.client import Client` was a guaranteed `ImportError` without it, and (b) `client.py` only imports already-vendored support modules — no backend-SDK pull-through.
175
175
  > - **Shape B-3 — test suite migration** ✅ (PR-B3, `9.3.0`): Task 8 + Task 13. 36 tests vendored from `culture@df50942` (~6.5kloc), 315 tests run under `pytest -n auto` in ~29s. `tests/conftest.py` adapted (paraphrase) to drop bot-loader sandboxing and bot-fixture definitions. Three telemetry/test_bot_*.py files plus `test_welcome_bot.py` stay in culture (BotManager-coupled). Bucket-C tests stay in culture indefinitely.
176
- > - **Shape B-4 — bootstrap docs + YAML config loading** ✅ (PR-B4, `9.4.0`): Tasks 11–12. `docs/api-stability.md` (3 public modules + semver contract), `docs/cli.md` (verb table + flag reference + exit codes + YAML/CLI precedence + agentirc-vs-culture diff), `docs/deployment.md` (on-disk footprint, systemd `Type=simple`, container, standalone, federation, log rotation, coexistence, backup). Plus, beyond pure-docs scope: `ServerConfig.from_yaml(path)` classmethod and CLI handlers wired to overlay flags on YAML (precedence: CLI > YAML > built-in default), closing the acceptance-criterion gap *"`agentirc start --config <path>` behaves indistinguishably from `culture server start`"*. New runtime dep: `pyyaml>=6.0`. 13 new agentirc-native tests in `tests/test_config_loader.py`; total suite 328 tests in ~28s.
177
- > - **Remaining**: 14 (acceptance criteria spot-check), 1618 (tag, publish, report-back to culture).
176
+ > - **Shape B-4 — bootstrap docs + YAML config loading** ✅ (PR-B4, `9.4.0`): Tasks 11–12. `docs/api-stability.md` (3 public modules + semver contract), `docs/cli.md` (verb table + flag reference + exit codes + YAML/CLI precedence + agentirc-vs-culture diff), `docs/deployment.md` (on-disk footprint, systemd `Type=simple`, container, standalone, federation, log rotation, coexistence, backup). Plus, beyond pure-docs scope: `ServerConfig.from_yaml(path)` classmethod and CLI handlers wired to overlay flags on YAML (precedence: CLI > YAML > built-in default), closing the acceptance-criterion gap *"`agentirc start --config <path>` behaves indistinguishably from `culture server start`"*. New runtime dep: `pyyaml>=6.0`. 13 new agentirc-native tests in `tests/test_config_loader.py`; total suite 331 tests in ~28s.
177
+ > - **Acceptance audit** (Task 14, post-PR-B4): walked all 11 §"Acceptance criteria" bullets against `main@5590256`. 9 of 11 pass directly; criteria 12 (real-PyPI install, TestPyPI dual-name install) closed by Task 17. Audit record: [`2026-05-01-task14-audit.md`](2026-05-01-task14-audit.md).
178
+ > - **Released** ✅ (Tasks 16–18, 2026-05-01): [`v9.4.0`](https://github.com/agentculture/agentirc/releases/tag/v9.4.0) tagged at `5590256` and pushed to origin. `agentirc-cli==9.4.0` is on real PyPI, verified end-to-end by `pip install agentirc-cli==9.4.0` in a clean venv plus a TCP `NICK`/`USER` handshake against `agentirc serve` returning `001 RPL_WELCOME` from the PyPI-installed binary. Culture-side cutover unblocked via [agentculture/culture#308](https://github.com/agentculture/culture/issues/308) (version + SHA + cutover-PR shape + coexistence guarantees). **Bootstrap complete.**
178
179
  >
179
180
  > Task 3 (`Copy protocol/extensions/ wholesale`) is dropped: that path doesn't exist in culture. Re-add only if/when culture creates it.
180
181
 
@@ -0,0 +1,65 @@
1
+ # Bootstrap Task 14 — Acceptance-criteria audit (post-PR-B4)
2
+
3
+ **Date:** 2026-05-01
4
+ **Auditor:** the agent working in this repo
5
+ **Source SHA:** `5590256` (`main` after PR-B4 squash-merge)
6
+ **Outcome:** **PASS** — 9 of 11 criteria pass directly; 2 deferred to Task 17 (real-PyPI publish gate).
7
+
8
+ This is the read-only verification pass called out as Task 14 in
9
+ [`docs/superpowers/specs/2026-04-30-bootstrap-design.md`](2026-04-30-bootstrap-design.md).
10
+ It walks every bullet in §"Acceptance criteria" of the bootstrap spec
11
+ against the actual `main` branch and records evidence per criterion so
12
+ culture's Track-A cutover PR can cite a single grep-friendly artifact
13
+ rather than scrolling commit history.
14
+
15
+ ## Result table
16
+
17
+ | # | Criterion (short) | Status | Evidence |
18
+ |---|---|---|---|
19
+ | 1 | `pip install agentirc-cli==9.4.0` produces both binaries | ⏳ Deferred to Task 17 | Local editable install of `agentirc-cli==9.4.0` in a clean `uv venv` produces both `agentirc` and `agentirc-cli` binaries; both print `agentirc 9.4.0`. Real PyPI verification gates on the `publish.yml` push-to-`main` run that fired on PR-B4 merge. |
20
+ | 2 | TestPyPI dual-name (`agentirc-cli` + `agentirc`) | ⏳ Deferred to Task 17 | `.github/workflows/publish.yml` declares both `Build and publish agentirc-cli to TestPyPI` and `Build and publish agentirc (alias) to TestPyPI` steps, the alias step `sed`-rewriting `name = "agentirc-cli"` → `name = "agentirc"` in a copied `pyproject.toml` before building. The actual `pip install agentirc==9.4.0.devN -i .../testpypi/...` smoke belongs to Task 17. |
21
+ | 3 | No backend SDK deps; no `culture` console script | ✅ | `pyproject.toml` `dependencies = [opentelemetry-api>=1.22, opentelemetry-sdk>=1.22, opentelemetry-exporter-otlp-proto-grpc>=1.22, pyyaml>=6.0]`. No `claude-agent-sdk`, `anthropic`, `agex-cli`, `afi-cli`, `copilot-sdk`, `mistune`, `aiohttp`, `textual`. `[project.scripts]` lists exactly `agentirc = "agentirc.cli:main"` and `agentirc-cli = "agentirc.cli:main"`; no `culture` console script entry. |
22
+ | 4 | `agentirc start --config ~/.culture/server.yaml` indistinguishable from `culture server start` | ✅ | Booted `agentirc start --foreground --port 16667 --name audit-test --config /tmp/__nope__.yaml` in a clean venv (a non-existent `--config` path so the user's populated `~/.culture/server.yaml` couldn't influence the run; agentirc's `from_yaml` falls back to defaults silently for missing files). TCP `NICK audit-test-bot` / `USER bot 0 * :bot` handshake returned `:audit-test 001 audit-test-bot :Welcome to audit-test IRC Network audit-test-bot!bot@127.0.0.1` plus `002`/`003`/`004` numerics. Same socket layout, same log path, same on-disk PID/port files under `~/.culture/pids/server-<name>.{pid,port}` as `culture server start`. The spec criterion's literal `~/.culture/server.yaml` is interpreted as "any `--config` path"; what matters is the YAML loader path runs and the IRCd boots indistinguishably from culture's. Spec §"Defaults preserve culture continuity" upheld. |
23
+ | 5 | `agentirc serve --config ~/.culture/server.yaml` foreground, no daemonize | ✅ | Booted `agentirc serve --port 16668 --name audit-serve --config /tmp/__nope__.yaml` (same hermetic-config rationale as criterion 4). TCP handshake returned `:audit-serve 001 audit-serve-bot :Welcome to audit-serve IRC Network`. `~/.culture/pids/server-audit-serve.{pid,port}` were *not* created (`ls: cannot access ...: No such file or directory`), confirming the `_run_foreground(..., pid_name="")` skip and meeting the agentirc-only "for systemd `Type=simple` and containers" contract. |
24
+ | 6 | `agentirc.config.{LinkConfig, TelemetryConfig}`, `agentirc.cli.dispatch`, `agentirc.protocol.*` importable | ✅ | `python -c "from agentirc.config import LinkConfig, TelemetryConfig, ServerConfig; from agentirc.cli import main, dispatch; from agentirc.protocol import PRIVMSG, JOIN, ROOMCREATE, RPL_WELCOME, ERR_NEEDMOREPARAMS, TRACEPARENT_TAG; ServerConfig.from_yaml('/tmp/__nope__.yaml')"` succeeds — `OK host=0.0.0.0 port=6667 from_yaml=available`. Public-surface contract from `docs/api-stability.md` upheld. |
25
+ | 7 | `pytest -n auto` passes | ✅ | `331 passed in 28.77s` in the clean audit venv. Same suite count as the post-PR-B4 main-branch CI run. |
26
+ | 8 | `git grep -E '^(from|import) culture\b' agentirc/ tests/` returns nothing | ✅ | Zero matches; exit code 1. (The pipe in `(from|import)` is an extended-regex alternation, *not* `\|` — the actual command run had no backslash.) CI's portability lint also gates on this. |
27
+ | 9 | `agentirc --help` lists every verb | ✅ | `agentirc --help` lists exactly the 8 verbs: `serve`, `start`, `stop`, `restart`, `status`, `link`, `logs`, `version`. Verb count matches the table in `docs/cli.md`. |
28
+ | 10 | `docs/api-stability.md` exists, names the 3 public modules | ✅ | File exists. Three module headings present at h2 level: ``## `agentirc.config```, ``## `agentirc.cli```, ``## `agentirc.protocol```. (The plan's original verification regex assumed h3 — modules are h2 in the actual doc; counted via ``grep -cE '^## `agentirc\.(config\|cli\|protocol)`'`` which returned `3`.) |
29
+ | 11 | `pyproject.toml` declares `name = "agentirc-cli"` + both console scripts | ✅ | `name = "agentirc-cli"` on line 2. `[project.scripts]` block has both `agentirc = "agentirc.cli:main"` and `agentirc-cli = "agentirc.cli:main"`. |
30
+
31
+ ## Decision
32
+
33
+ **Proceed to release ceremony.** Tasks 16–18 (tag, publish-verify, report-back to culture) can begin without a follow-up PR-B4.1.
34
+
35
+ The two deferred items (1, 2) are gated on the real PyPI publish, which `publish.yml` triggers on push-to-`main`. The PR-B4 merge at `5590256` should have fired that workflow already; Task 17 is the place to verify the resulting wheel works in a clean venv and the TestPyPI dual-name flow round-trips. Nothing in the audit suggests the publish gate will surface a surprise.
36
+
37
+ ## Non-blocking follow-ups (issues opened)
38
+
39
+ Per the user request, these were opened as GitHub issues so they don't get lost. Cross-references:
40
+
41
+ | Track | GitHub issue | Title |
42
+ |---|---|---|
43
+ | Track A — wire format | [#7](https://github.com/agentculture/agentirc/issues/7) | `ROOMETAEND` / `ROOMETASET` typo cleanup |
44
+ | Track A — wire format | [#8](https://github.com/agentculture/agentirc/issues/8) | `ERR_NOSUCHCHANNEL` semantic misuse fix |
45
+ | Track A — wire format | [#9](https://github.com/agentculture/agentirc/issues/9) | `STHREAD` verb collapse split |
46
+ | Tooling | [#10](https://github.com/agentculture/agentirc/issues/10) | Backport `pr-sonar.sh` + `workflow.sh sonar` to steward |
47
+ | Refactor (low-priority) | [#11](https://github.com/agentculture/agentirc/issues/11) | Sweep callsites to use `agentirc.protocol.<NAME>` constants |
48
+ | Tests (low-priority) | [#12](https://github.com/agentculture/agentirc/issues/12) | Migrate A2 bot-fixtured tests via subprocess fixture |
49
+
50
+ ## Method note
51
+
52
+ The audit ran from a fresh `uv venv` at `/tmp/agentirc-audit` against `agentirc-cli==9.4.0` installed in editable mode from `main@5590256`. The IRC handshake smokes used GNU `nc -q 1` against ports `16667` (`start --foreground`) and `16668` (`serve`); both used `--config /tmp/__nope__.yaml` (a non-existent path) so the user's populated `~/.culture/server.yaml` couldn't influence the run. Daemons were `kill -TERM`'d after the handshake completed.
53
+
54
+ The audit author noticed two minor items that aren't acceptance gaps but worth recording:
55
+
56
+ 1. The IRCd's nick-prefix policy (nicks must start with `<server-name>-`) returned `432 ERR_ERRONEUSNICKNAME` on the first handshake attempt. Real behavior; not a bug. `docs/cli.md` could mention this in a future doc pass.
57
+ 2. The plan's regex for criterion 10 (``^### `agentirc\.``) was wrong — actual doc uses ``## `` (h2). Documented inline in the table; not a defect.
58
+
59
+ Neither warrants a follow-up PR.
60
+
61
+ ## Reference
62
+
63
+ - Originating spec: [`docs/superpowers/specs/2026-04-30-bootstrap-design.md`](2026-04-30-bootstrap-design.md) §"Acceptance criteria" (lines 232–244).
64
+ - Bootstrap status note (in the same file, lines 168–179) updated separately to mark Task 14 ✅ once this audit doc lands.
65
+ - Companion artifact for culture's cutover: this audit + the published `agentirc-cli==9.4.0` wheel + source SHA `5590256` are what the culture-side cutover PR will cite when pinning the dependency.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentirc-cli"
3
- version = "9.4.0"
3
+ version = "9.4.1"
4
4
  description = "Agent-friendly IRCd: server core for AI agent meshes"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -52,8 +52,8 @@ agentirc = "agentirc.cli:main"
52
52
  agentirc-cli = "agentirc.cli:main"
53
53
 
54
54
  [project.urls]
55
- Homepage = "https://github.com/OriNachum/agentirc"
56
- Issues = "https://github.com/OriNachum/agentirc/issues"
55
+ Homepage = "https://github.com/agentculture/agentirc"
56
+ Issues = "https://github.com/agentculture/agentirc/issues"
57
57
 
58
58
  [build-system]
59
59
  requires = [
@@ -74,7 +74,7 @@ testpaths = [
74
74
 
75
75
  [tool.citation.packages.culture-aio]
76
76
  schema = 2
77
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/aio.py"
77
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/aio.py"
78
78
  version = "df50942"
79
79
  target = "agentirc/_internal/"
80
80
  cited = "2026-04-30"
@@ -85,7 +85,7 @@ sha256 = "70ea1f2ca51d33d9e81c80926efe57a7e3d03a2b80605e09cb90ac91e7d12a92"
85
85
 
86
86
  [tool.citation.packages.culture-constants]
87
87
  schema = 2
88
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/constants.py"
88
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/constants.py"
89
89
  version = "df50942"
90
90
  target = "agentirc/_internal/"
91
91
  cited = "2026-04-30"
@@ -96,7 +96,7 @@ sha256 = "681e070655204d0412bcaadf633408d23caf72e13f6b17039ee8487e74f7d7dd"
96
96
 
97
97
  [tool.citation.packages.culture-protocol-message]
98
98
  schema = 2
99
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/protocol/message.py"
99
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/protocol/message.py"
100
100
  version = "df50942"
101
101
  target = "agentirc/_internal/protocol/"
102
102
  cited = "2026-04-30"
@@ -107,7 +107,7 @@ sha256 = "e2817ce3de414a4890b9eb2824e151461ee4de5a442fd34cfefaac5840b0bdac"
107
107
 
108
108
  [tool.citation.packages.culture-protocol-replies]
109
109
  schema = 2
110
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/protocol/replies.py"
110
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/protocol/replies.py"
111
111
  version = "df50942"
112
112
  target = "agentirc/_internal/protocol/"
113
113
  cited = "2026-04-30"
@@ -118,7 +118,7 @@ sha256 = "53b7a94f76a6853217c905d4e13cc898c181fc2e9201738bb2c18f5e719a9e8f"
118
118
 
119
119
  [tool.citation.packages.culture-telemetry]
120
120
  schema = 2
121
- source = "https://github.com/OriNachum/culture/tree/df50942/culture/telemetry"
121
+ source = "https://github.com/agentculture/culture/tree/df50942/culture/telemetry"
122
122
  version = "df50942"
123
123
  target = "agentirc/_internal/telemetry/"
124
124
  cited = "2026-04-30"
@@ -146,7 +146,7 @@ sha256 = "17262e10e4cb1d3fa1db56c7b966e33757d4581fe961789d8f1f7197f3328c02"
146
146
 
147
147
  [tool.citation.packages.culture-virtual-client]
148
148
  schema = 2
149
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/bots/virtual_client.py"
149
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/bots/virtual_client.py"
150
150
  version = "df50942"
151
151
  target = "agentirc/_internal/virtual_client.py"
152
152
  cited = "2026-04-30"
@@ -158,7 +158,7 @@ sha256 = "5e90a9e0ba5cd95651167b71f4cf3d2b5c4f18f809cb061f345ff3a81cf66969"
158
158
 
159
159
  [tool.citation.packages.culture-pidfile]
160
160
  schema = 2
161
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/pidfile.py"
161
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/pidfile.py"
162
162
  version = "df50942"
163
163
  target = "agentirc/_internal/pidfile.py"
164
164
  cited = "2026-05-01"
@@ -170,7 +170,7 @@ sha256 = "a9399cf0bfec92ceea1772dc97c3256a972b7ce4fd08f8f8266535db7a10d95a"
170
170
 
171
171
  [tool.citation.packages.culture-cli-shared]
172
172
  schema = 2
173
- source = "https://github.com/OriNachum/culture/tree/df50942/culture/cli/shared"
173
+ source = "https://github.com/agentculture/culture/tree/df50942/culture/cli/shared"
174
174
  version = "df50942"
175
175
  target = "agentirc/_internal/cli_shared/"
176
176
  cited = "2026-05-01"
@@ -190,7 +190,7 @@ sha256 = "5238e222c33d499df687a4b8002083fabd029b86b8dc885a9deaccb75e6a05c8"
190
190
 
191
191
  [tool.citation.packages.culture-client]
192
192
  schema = 2
193
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/agentirc/client.py"
193
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/agentirc/client.py"
194
194
  version = "df50942"
195
195
  target = "agentirc/client.py"
196
196
  cited = "2026-05-01"
@@ -202,7 +202,7 @@ sha256 = "08235081f0b7f28e563b1b5c0030baa372bb717d14bed4e11122e7296036ed96"
202
202
 
203
203
  [tool.citation.packages.culture-cli-server]
204
204
  schema = 2
205
- source = "https://github.com/OriNachum/culture/blob/df50942/culture/cli/server.py"
205
+ source = "https://github.com/agentculture/culture/blob/df50942/culture/cli/server.py"
206
206
  version = "df50942"
207
207
  target = "agentirc/cli.py"
208
208
  cited = "2026-05-01"
@@ -214,7 +214,7 @@ sha256 = "80c8a350fcd6178796b710ac86ded77663f2d717e5e067679b23f38def05d1c0"
214
214
 
215
215
  [tool.citation.packages.culture-bots-stubs]
216
216
  schema = 2
217
- source = "https://github.com/OriNachum/culture/tree/df50942/culture/bots"
217
+ source = "https://github.com/agentculture/culture/tree/df50942/culture/bots"
218
218
  version = "df50942"
219
219
  target = "agentirc/_internal/bots/"
220
220
  cited = "2026-04-30"
@@ -234,7 +234,7 @@ sha256 = "6c9e188b865256024999143a6330af4571b09e10220caff570c4bebbe93148fb"
234
234
 
235
235
  [tool.citation.packages.culture-agentirc-server-core]
236
236
  schema = 2
237
- source = "https://github.com/OriNachum/culture/tree/df50942/culture/agentirc"
237
+ source = "https://github.com/agentculture/culture/tree/df50942/culture/agentirc"
238
238
  version = "df50942"
239
239
  target = "agentirc/"
240
240
  cited = "2026-04-30"
@@ -306,7 +306,7 @@ sha256 = "5ef97657599a37476b96aa59968373aed8c82024027297f8300be9886dc18d4a"
306
306
 
307
307
  [tool.citation.packages.culture-tests-conftest]
308
308
  schema = 2
309
- source = "https://github.com/OriNachum/culture/blob/df50942/tests/conftest.py"
309
+ source = "https://github.com/agentculture/culture/blob/df50942/tests/conftest.py"
310
310
  version = "df50942"
311
311
  target = "tests/"
312
312
  cited = "2026-05-01"
@@ -317,7 +317,7 @@ sha256 = "3ee6fd43e2833f28a75363503519d63a16fe6f89843471707bf684e544cac360"
317
317
 
318
318
  [tool.citation.packages.culture-tests-server-core]
319
319
  schema = 2
320
- source = "https://github.com/OriNachum/culture/tree/df50942/tests"
320
+ source = "https://github.com/agentculture/culture/tree/df50942/tests"
321
321
  version = "df50942"
322
322
  target = "tests/"
323
323
  cited = "2026-05-01"
@@ -409,7 +409,7 @@ sha256 = "0e31f65beea7521536c599b51fac36122eb9b42d50918d8c0bcb1d04d7f763bc"
409
409
 
410
410
  [tool.citation.packages.culture-tests-telemetry]
411
411
  schema = 2
412
- source = "https://github.com/OriNachum/culture/tree/df50942/tests/telemetry"
412
+ source = "https://github.com/agentculture/culture/tree/df50942/tests/telemetry"
413
413
  version = "df50942"
414
414
  target = "tests/telemetry/"
415
415
  cited = "2026-05-01"
@@ -10,7 +10,7 @@ resolution-markers = [
10
10
 
11
11
  [[package]]
12
12
  name = "agentirc-cli"
13
- version = "9.4.0"
13
+ version = "9.4.1"
14
14
  source = { editable = "." }
15
15
  dependencies = [
16
16
  { name = "opentelemetry-api" },
File without changes
File without changes
File without changes
File without changes