agentirc-cli 9.9.0__tar.gz → 9.10.0__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 (169) hide show
  1. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/portability-lint.sh +5 -1
  2. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/recall/scripts/recall.sh +35 -13
  3. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/remember/scripts/remember.sh +39 -13
  4. agentirc_cli-9.10.0/.devague/current +1 -0
  5. agentirc_cli-9.10.0/.devague/current_plan +1 -0
  6. agentirc_cli-9.10.0/.devague/frames/agentirc-ships-an-agent-accessibility-release-ai-a.json +414 -0
  7. agentirc_cli-9.10.0/.devague/plans/agentirc-ships-an-agent-accessibility-release-ai-a.json +586 -0
  8. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.gitignore +2 -0
  9. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/CHANGELOG.md +39 -0
  10. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/CLAUDE.md +28 -0
  11. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/PKG-INFO +1 -1
  12. agentirc_cli-9.10.0/docs/plans/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md +145 -0
  13. agentirc_cli-9.10.0/docs/specs/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md +76 -0
  14. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/pyproject.toml +1 -1
  15. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/uv.lock +1 -1
  16. agentirc_cli-9.9.0/.devague/current +0 -1
  17. agentirc_cli-9.9.0/.devague/current_plan +0 -1
  18. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
  19. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  20. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  21. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  22. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  23. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  24. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  25. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/SKILL.md +0 -0
  26. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  27. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  28. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  29. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  30. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/SKILL.md +0 -0
  31. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  32. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  33. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  34. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  35. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/recall/SKILL.md +0 -0
  36. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/remember/SKILL.md +0 -0
  37. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  38. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  39. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/think/SKILL.md +0 -0
  40. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/think/scripts/think.sh +0 -0
  41. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills.local.yaml.example +0 -0
  42. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.devague/frames/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +0 -0
  43. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.devague/plans/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +0 -0
  44. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.github/workflows/publish.yml +0 -0
  45. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.github/workflows/tests.yml +0 -0
  46. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/LICENSE +0 -0
  47. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/README.md +0 -0
  48. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/__init__.py +0 -0
  49. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/__main__.py +0 -0
  50. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/__init__.py +0 -0
  51. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/aio.py +0 -0
  52. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/bots/__init__.py +0 -0
  53. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/bots/bot_manager.py +0 -0
  54. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/bots/http_listener.py +0 -0
  55. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/cli_shared/__init__.py +0 -0
  56. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/cli_shared/constants.py +0 -0
  57. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/cli_shared/mesh.py +0 -0
  58. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/constants.py +0 -0
  59. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/event_subscriptions.py +0 -0
  60. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/pidfile.py +0 -0
  61. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/protocol/__init__.py +0 -0
  62. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/protocol/message.py +0 -0
  63. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/protocol/replies.py +0 -0
  64. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/__init__.py +0 -0
  65. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/audit.py +0 -0
  66. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/context.py +0 -0
  67. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/metrics.py +0 -0
  68. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/tracing.py +0 -0
  69. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/virtual_client.py +0 -0
  70. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/__init__.py +0 -0
  71. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/bot.py +0 -0
  72. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/bot_manager.py +0 -0
  73. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/cli.py +0 -0
  74. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/config.py +0 -0
  75. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/filter_dsl.py +0 -0
  76. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/http_listener.py +0 -0
  77. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/template_engine.py +0 -0
  78. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/virtual_client.py +0 -0
  79. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/channel.py +0 -0
  80. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/cli.py +0 -0
  81. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/client.py +0 -0
  82. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/config.py +0 -0
  83. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/events.py +0 -0
  84. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/history_store.py +0 -0
  85. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/ircd.py +0 -0
  86. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/protocol.py +0 -0
  87. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/remote_client.py +0 -0
  88. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/room_store.py +0 -0
  89. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/rooms_util.py +0 -0
  90. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/server_link.py +0 -0
  91. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skill.py +0 -0
  92. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/__init__.py +0 -0
  93. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/history.py +0 -0
  94. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/icon.py +0 -0
  95. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/rooms.py +0 -0
  96. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/threads.py +0 -0
  97. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/thread_store.py +0 -0
  98. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/virtual_client.py +0 -0
  99. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/api-stability.md +0 -0
  100. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/bots.md +0 -0
  101. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/cli.md +0 -0
  102. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/deployment.md +0 -0
  103. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/extension-api.md +0 -0
  104. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/plans/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +0 -0
  105. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/specs/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +0 -0
  106. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/steward/onboarding.md +0 -0
  107. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/superpowers/specs/2026-04-30-bootstrap-design.md +0 -0
  108. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/superpowers/specs/2026-05-01-bot-extension-api-design.md +0 -0
  109. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/superpowers/specs/2026-05-01-task14-audit.md +0 -0
  110. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/__init__.py +0 -0
  111. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/_helpers.py +0 -0
  112. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/__init__.py +0 -0
  113. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_bot.py +0 -0
  114. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_bot_host.py +0 -0
  115. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_bot_manager.py +0 -0
  116. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_cli_bot.py +0 -0
  117. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_config_bots.py +0 -0
  118. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_filter_dsl.py +0 -0
  119. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_http_listener.py +0 -0
  120. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_public_surface.py +0 -0
  121. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_template_engine.py +0 -0
  122. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/conftest.py +0 -0
  123. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/__init__.py +0 -0
  124. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/_fakes.py +0 -0
  125. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/_metrics_helpers.py +0 -0
  126. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_emit.py +0 -0
  127. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_lifecycle.py +0 -0
  128. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_module.py +0 -0
  129. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_parse_error.py +0 -0
  130. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_config.py +0 -0
  131. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_dispatch_span.py +0 -0
  132. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_emit_event_span.py +0 -0
  133. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_metrics_init.py +0 -0
  134. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_metrics_s2s.py +0 -0
  135. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_outbound_inject.py +0 -0
  136. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_parse_error.py +0 -0
  137. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_s2s_relay_span.py +0 -0
  138. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_server_init.py +0 -0
  139. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_server_link_inject.py +0 -0
  140. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_tracing.py +0 -0
  141. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_api_stability_embedding.py +0 -0
  142. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_bot_capability.py +0 -0
  143. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_channel.py +0 -0
  144. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_cli.py +0 -0
  145. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_config_loader.py +0 -0
  146. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_connection.py +0 -0
  147. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_discovery.py +0 -0
  148. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_event_subscriptions.py +0 -0
  149. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_eventpub.py +0 -0
  150. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_basic.py +0 -0
  151. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_catalog.py +0 -0
  152. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_federation.py +0 -0
  153. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_history.py +0 -0
  154. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_lifecycle.py +0 -0
  155. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_reserved_nick.py +0 -0
  156. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_federation.py +0 -0
  157. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_history.py +0 -0
  158. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_link_reconnect.py +0 -0
  159. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_mentions.py +0 -0
  160. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_messaging.py +0 -0
  161. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_modes.py +0 -0
  162. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_protocol_bot_exports.py +0 -0
  163. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_room_persistence.py +0 -0
  164. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_rooms_federation.py +0 -0
  165. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_rooms_integration.py +0 -0
  166. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_server_icon_skill.py +0 -0
  167. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_skills.py +0 -0
  168. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_threads.py +0 -0
  169. {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_wire_format_envelope.py +0 -0
@@ -27,11 +27,15 @@ hits1=$(echo "$files" | xargs -r grep -nE '/home/[a-z][a-z0-9_-]+/' 2>/dev/null
27
27
  # Carve-outs (allowed, NOT flagged):
28
28
  # - ~/.claude/skills/<x>/scripts/ vendored tool calls
29
29
  # - ~/.culture/ Culture mesh data this skill is supposed to read
30
+ # - ~/.eidetic/ eidetic memory store (deliberately outside any
31
+ # git worktree; see recall/remember SKILL.md).
32
+ # Local extension over the steward upstream (#46).
30
33
  md_yaml=$(echo "$files" | grep -E '\.(md|ya?ml|toml|json|jsonc)$' || true)
31
34
  if [ -n "$md_yaml" ]; then
32
35
  hits2=$(echo "$md_yaml" | xargs -r grep -nE '~/\.[A-Za-z]' 2>/dev/null \
33
36
  | grep -vE '~/\.claude/skills/[^[:space:]"]+/scripts/' \
34
37
  | grep -vE '~/\.culture/' \
38
+ | grep -vE '~/\.eidetic/' \
35
39
  || true)
36
40
  else
37
41
  hits2=""
@@ -48,7 +52,7 @@ if [ -n "$hits2" ]; then
48
52
  [ "$fail" -eq 1 ] && echo
49
53
  echo "❌ Per-user ~/.<dotfile> config refs in committed doc/config:"
50
54
  echo "$hits2" | sed 's/^/ /'
51
- echo " Allowed carve-outs: ~/.claude/skills/.../scripts/ (tool calls), ~/.culture/ (mesh data)."
55
+ echo " Allowed carve-outs: ~/.claude/skills/.../scripts/ (tool calls), ~/.culture/ (mesh data), ~/.eidetic/ (memory store)."
52
56
  echo " Otherwise: commit a repo-local config or document a portable lookup."
53
57
  fail=1
54
58
  fi
@@ -6,10 +6,11 @@
6
6
  # forwards every flag verbatim — so `recall.sh "<query>" --mode hybrid --json`
7
7
  # is exactly `eidetic recall "<query>" --mode hybrid --json`.
8
8
  #
9
- # The store is the files backend at ~/.eidetic/memory by default — a home-dir
10
- # path OUTSIDE any git worktree, so Claude and the colleague backend (which runs
11
- # in throwaway worktrees) read the SAME memories. Set EIDETIC_DATA_DIR to opt out
12
- # of sharing; set EIDETIC_MONGO_URI / NEO4J_URI + --backend for a server store.
9
+ # The store is the files backend. Default location resolves per-operation:
10
+ # PUBLIC records inside a git repo <repo-root>/.eidetic/memory (committed,
11
+ # team-shared); PRIVATE records, or any record outside a git repo
12
+ # $HOME/.eidetic/memory (never committed). Recall reads both stores and merges.
13
+ # An explicit EIDETIC_DATA_DIR wins and short-circuits to that single dir.
13
14
 
14
15
  set -euo pipefail
15
16
 
@@ -34,12 +35,10 @@ resolve_eidetic() {
34
35
  fi
35
36
  dir=$(dirname "$dir")
36
37
  done
37
- cat >&2 <<'EOF'
38
- error: eidetic CLI not found.
39
- hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
40
- or run from inside the eidetic-cli checkout with `uv` available.
41
- The console script is `eidetic` (dist name: eidetic-cli).
42
- EOF
38
+ # In a vendored copy there is no eidetic-cli checkout to fall back to, so the
39
+ # only honest remedy is to install the CLI. One `error:` + one `hint:` line.
40
+ printf 'error: eidetic CLI not found.\n' >&2
41
+ printf 'hint: install it with: uv tool install eidetic-cli (or pipx install eidetic-cli); the console script is eidetic.\n' >&2
43
42
  return 1
44
43
  }
45
44
 
@@ -65,10 +64,17 @@ EOF
65
64
  }
66
65
 
67
66
  case "${1:-}" in
68
- -h | --help | help | "")
67
+ -h | --help)
69
68
  usage
70
69
  exit 0
71
70
  ;;
71
+ "")
72
+ # A missing query is a usage error, not success. The bareword `help` is
73
+ # a legitimate search term, so it is intentionally NOT a usage alias.
74
+ printf 'error: no query given.\n' >&2
75
+ printf 'hint: recall.sh "<query>" [--mode ...] [--json]; run recall.sh --help for usage.\n' >&2
76
+ exit 1
77
+ ;;
72
78
  esac
73
79
 
74
80
  resolve_eidetic || exit 2
@@ -100,9 +106,12 @@ resolve_scope() {
100
106
  # inline `# comment` or trailing space can't bleed into the scope),
101
107
  # then strip surrounding quotes only — matching the canonical parser
102
108
  # in .claude/skills/cicd/scripts/_resolve-nick.sh.
109
+ # `|| true`: under `set -o pipefail`, `head -n1` closing the pipe
110
+ # early can SIGPIPE `sed`, making the substitution non-zero and
111
+ # aborting the script. An empty parse must yield "" here, not exit.
103
112
  suffix=$(sed -n \
104
113
  's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
105
- "$dir/culture.yaml" | head -n1 | tr -d "\"'")
114
+ "$dir/culture.yaml" | head -n1 | tr -d "\"'" || true)
106
115
  break
107
116
  fi
108
117
  dir=$(dirname "$dir")
@@ -127,7 +136,20 @@ if ! has_flag --scope "$@"; then
127
136
  EIDETIC_SCOPE=$(resolve_scope)
128
137
  if [ -n "$EIDETIC_SCOPE" ]; then
129
138
  SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
130
- has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
139
+ # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
140
+ # upstream private default): default to PUBLIC, so a plain recall queries
141
+ # the in-repo public pool (<repo>/.eidetic/memory) this repo writes to.
142
+ # Pass --visibility private to also surface this agent's private ($HOME)
143
+ # notes. The two-store read model reads both dirs regardless.
144
+ has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
145
+ elif ! has_flag --visibility "$@"; then
146
+ # No suffix AND no explicit --visibility: the query runs against
147
+ # eidetic's own default (scope=default, visibility=public), not this
148
+ # agent's private personal scope — so an empty result isn't silently
149
+ # misread. Warn on stderr (stdout stays clean for --json). Warn ONLY
150
+ # here: an explicit --scope (outer guard) or --visibility (this guard) is
151
+ # a deliberate choice, honored verbatim, so either flag silences this.
152
+ printf 'warning: no culture.yaml suffix resolved; querying the public default scope rather than a private personal scope. Pass --scope or --visibility to target deliberately.\n' >&2
131
153
  fi
132
154
  fi
133
155
 
@@ -12,10 +12,11 @@
12
12
  # Upsert is idempotent by id (and dedups by content hash): re-remembering the
13
13
  # same record updates it in place, never duplicates.
14
14
  #
15
- # The store is the files backend at ~/.eidetic/memory by default — a home-dir
16
- # path OUTSIDE any git worktree, so a record Claude remembers is recallable by
17
- # the colleague backend (which runs in throwaway worktrees), and vice versa.
18
- # Set EIDETIC_DATA_DIR to opt out of sharing; use --backend mongo|neo4j (with
15
+ # The store is the files backend. Default location resolves per-operation:
16
+ # PUBLIC records inside a git repo <repo-root>/.eidetic/memory (committed,
17
+ # team-shared); PRIVATE records, or any record outside a git repo
18
+ # $HOME/.eidetic/memory (never committed). An explicit EIDETIC_DATA_DIR still
19
+ # wins and short-circuits to that single dir. Use --backend mongo|neo4j (with
19
20
  # EIDETIC_MONGO_URI / NEO4J_URI) for a server-backed shared store.
20
21
 
21
22
  set -euo pipefail
@@ -40,12 +41,10 @@ resolve_eidetic() {
40
41
  fi
41
42
  dir=$(dirname "$dir")
42
43
  done
43
- cat >&2 <<'EOF'
44
- error: eidetic CLI not found.
45
- hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
46
- or run from inside the eidetic-cli checkout with `uv` available.
47
- The console script is `eidetic` (dist name: eidetic-cli).
48
- EOF
44
+ # In a vendored copy there is no eidetic-cli checkout to fall back to, so the
45
+ # only honest remedy is to install the CLI. One `error:` + one `hint:` line.
46
+ printf 'error: eidetic CLI not found.\n' >&2
47
+ printf 'hint: install it with: uv tool install eidetic-cli (or pipx install eidetic-cli); the console script is eidetic.\n' >&2
49
48
  return 1
50
49
  }
51
50
 
@@ -60,7 +59,9 @@ Usage:
60
59
 
61
60
  A record needs `id`, `text`, and `type`; `hash` and `metadata` are recommended
62
61
  (hash is derived from text when omitted). Upsert is idempotent by id.
63
- Public data only. Every flag is forwarded verbatim to `eidetic remember`.
62
+ Records default to this agent's PRIVATE personal scope (--scope from the
63
+ culture.yaml suffix); pass --visibility public to contribute to the shared
64
+ public pool. Every flag is forwarded verbatim to `eidetic remember`.
64
65
  See `eidetic explain remember`.
65
66
  EOF
66
67
  }
@@ -72,6 +73,16 @@ case "${1:-}" in
72
73
  ;;
73
74
  esac
74
75
 
76
+ # No record argument AND stdin is an interactive terminal → `eidetic remember`
77
+ # would block forever waiting for NDJSON. Show usage instead of hanging. A piped
78
+ # or redirected stdin (`cat records.ndjson | remember.sh`) is not a TTY and
79
+ # proceeds to the batch path normally.
80
+ if [ "$#" -eq 0 ] && [ -t 0 ]; then
81
+ usage >&2
82
+ printf 'hint: pass a JSON record as an argument, or pipe NDJSON on stdin.\n' >&2
83
+ exit 1
84
+ fi
85
+
75
86
  resolve_eidetic || exit 2
76
87
 
77
88
  # ── default to this agent's PERSONAL, PRIVATE scope (culture.yaml `suffix`) ──
@@ -100,9 +111,12 @@ resolve_scope() {
100
111
  # inline `# comment` or trailing space can't bleed into the scope),
101
112
  # then strip surrounding quotes only — matching the canonical parser
102
113
  # in .claude/skills/cicd/scripts/_resolve-nick.sh.
114
+ # `|| true`: under `set -o pipefail`, `head -n1` closing the pipe
115
+ # early can SIGPIPE `sed`, making the substitution non-zero and
116
+ # aborting the script. An empty parse must yield "" here, not exit.
103
117
  suffix=$(sed -n \
104
118
  's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
105
- "$dir/culture.yaml" | head -n1 | tr -d "\"'")
119
+ "$dir/culture.yaml" | head -n1 | tr -d "\"'" || true)
106
120
  break
107
121
  fi
108
122
  dir=$(dirname "$dir")
@@ -127,7 +141,19 @@ if ! has_flag --scope "$@"; then
127
141
  EIDETIC_SCOPE=$(resolve_scope)
128
142
  if [ -n "$EIDETIC_SCOPE" ]; then
129
143
  SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
130
- has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
144
+ # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
145
+ # upstream private default): default to PUBLIC so a plain remember lands
146
+ # in <repo>/.eidetic/memory — committed, team- and mesh-shared. Pass
147
+ # --visibility private to keep a record in $HOME (uncommitted).
148
+ has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
149
+ elif ! has_flag --visibility "$@"; then
150
+ # No suffix AND no explicit --visibility: the record falls back to
151
+ # eidetic's own default (scope=default, visibility=public). Don't let an
152
+ # expected-private record go public silently — warn on stderr (stdout
153
+ # stays clean for --json). Warn ONLY here: an explicit --scope (outer
154
+ # guard) or --visibility (this guard) means the caller chose deliberately
155
+ # and is honored verbatim, so either flag silences this.
156
+ printf 'warning: no culture.yaml suffix resolved; this record falls back to the public default scope. Pass --scope or --visibility to place it deliberately.\n' >&2
131
157
  fi
132
158
  fi
133
159
 
@@ -0,0 +1 @@
1
+ agentirc-ships-an-agent-accessibility-release-ai-a
@@ -0,0 +1 @@
1
+ agentirc-ships-an-agent-accessibility-release-ai-a
@@ -0,0 +1,414 @@
1
+ {
2
+ "slug": "agentirc-ships-an-agent-accessibility-release-ai-a",
3
+ "title": "agentirc ships an agent-accessibility release: AI agents get a first-class CLI to join, send, read, and watch the mesh; messages carry machine-parseable structure; and the client transport is reliable enough that an autonomous agent can treat the chat as dependable infrastructure rather than a fragile text stream.",
4
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-07-01T22:00:51Z",
7
+ "updated": "2026-07-01T22:14:28Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "agentirc ships an agent-accessibility release: AI agents get a first-class CLI to join, send, read, and watch the mesh; messages carry machine-parseable structure; and the client transport is reliable enough that an autonomous agent can treat the chat as dependable infrastructure rather than a fragile text stream.",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h12",
18
+ "text": "ships as additive semver-minor releases on the 9.x line; every headline capability in the announcement is exercised by at least one test that drives the system the way an agent would (shell or TCP)",
19
+ "status": "confirmed"
20
+ }
21
+ ],
22
+ "hard_questions": [],
23
+ "links": []
24
+ },
25
+ {
26
+ "id": "c2",
27
+ "kind": "audience",
28
+ "text": "AI agents \u2014 LLM-driven clients (and the humans operating them) \u2014 that use agentirc as their chat mesh",
29
+ "origin": "user",
30
+ "status": "confirmed",
31
+ "honesty_conditions": [
32
+ {
33
+ "id": "h13",
34
+ "text": "every shipped feature is reachable from at least one agent path (CLI, wire protocol, or public Python API) and documented from the agent point of view",
35
+ "status": "confirmed"
36
+ }
37
+ ],
38
+ "hard_questions": [],
39
+ "links": []
40
+ },
41
+ {
42
+ "id": "c3",
43
+ "kind": "after_state",
44
+ "text": "an AI agent can join, send, read, and stay caught up on the mesh through interfaces designed for machine consumption \u2014 a clear CLI, structured messages, and a transport it can rely on",
45
+ "origin": "user",
46
+ "status": "confirmed",
47
+ "honesty_conditions": [
48
+ {
49
+ "id": "h14",
50
+ "text": "docs include an end-to-end agent walkthrough \u2014 join, send, read, disconnect, catch up \u2014 runnable as written against a fresh pip install",
51
+ "status": "confirmed"
52
+ }
53
+ ],
54
+ "hard_questions": [],
55
+ "links": []
56
+ },
57
+ {
58
+ "id": "c4",
59
+ "kind": "why_it_matters",
60
+ "text": "agentirc's whole purpose is chat FOR agents; if agents need bespoke scaffolding to use it reliably, the product is failing its stated audience",
61
+ "origin": "user",
62
+ "status": "confirmed",
63
+ "honesty_conditions": [
64
+ {
65
+ "id": "h15",
66
+ "text": "acceptance is judged on the agent path: no feature counts as done if it only works via internal test fixtures or a culture checkout",
67
+ "status": "confirmed"
68
+ }
69
+ ],
70
+ "hard_questions": [],
71
+ "links": []
72
+ },
73
+ {
74
+ "id": "c5",
75
+ "kind": "requirement",
76
+ "text": "improvements target five named dimensions: CLI ergonomics, protocol/output clarity, reliability, message structure, and missing agent-facing features",
77
+ "origin": "user",
78
+ "status": "confirmed",
79
+ "honesty_conditions": [
80
+ {
81
+ "id": "h1",
82
+ "text": "every feature in the exported spec traces to at least one of the five named dimensions (CLI, clarity, reliability, message structure, missing features), and no dimension is left with zero coverage",
83
+ "status": "confirmed"
84
+ }
85
+ ],
86
+ "hard_questions": [],
87
+ "links": []
88
+ },
89
+ {
90
+ "id": "c6",
91
+ "kind": "boundary",
92
+ "text": "additive and IRC-compatible only: no new incompatible wire protocol; the known wire-format quirk fixes (#7 ROOMETAEND/ROOMETASET, #8 ERR_NOSUCHCHANNEL, #9 STHREAD) stay cross-repo Track A work and are not bundled into this effort",
93
+ "origin": "llm",
94
+ "status": "confirmed",
95
+ "honesty_conditions": [
96
+ {
97
+ "id": "h17",
98
+ "text": "the 9.5.0a2 wire-format golden tests pass unmodified; any client that worked against 9.7.0 registers and chats against this release with no changes",
99
+ "status": "confirmed"
100
+ }
101
+ ],
102
+ "hard_questions": [],
103
+ "links": []
104
+ },
105
+ {
106
+ "id": "c7",
107
+ "kind": "boundary",
108
+ "text": "agent backends and SDKs stay in culture \u2014 this effort adds no claude-agent-sdk/anthropic/etc. dependency and no 'culture' console script (existing hard invariant)",
109
+ "origin": "llm",
110
+ "status": "confirmed",
111
+ "honesty_conditions": [
112
+ {
113
+ "id": "h18",
114
+ "text": "pyproject.toml gains no agent/backend SDK dependency and git grep for culture imports in agentirc/ and tests/ stays empty (existing CI invariant)",
115
+ "status": "confirmed"
116
+ }
117
+ ],
118
+ "hard_questions": [],
119
+ "links": []
120
+ },
121
+ {
122
+ "id": "c8",
123
+ "kind": "boundary",
124
+ "text": "no renaming of on-disk artifacts: config/log/socket paths under ~/.culture/ stay as-is",
125
+ "origin": "llm",
126
+ "status": "confirmed",
127
+ "honesty_conditions": [
128
+ {
129
+ "id": "h19",
130
+ "text": "default config, log, and socket paths are byte-identical to the 9.7.0 defaults",
131
+ "status": "confirmed"
132
+ }
133
+ ],
134
+ "hard_questions": [],
135
+ "links": []
136
+ },
137
+ {
138
+ "id": "c9",
139
+ "kind": "before_state",
140
+ "text": "today all agent affordances (reconnect, buffering, catch-up) live in the culture harness, out of tree; an agent hitting agentirc directly gets a raw IRCv3 socket with silent inbound truncation (client.py:246-248), fire-and-forget delivery, last-N-only history, a documented-but-unimplemented client BACKFILL, no msgid/server-time tags, and error replies that mix bare NOTICE prose with ad-hoc numerics",
141
+ "origin": "llm",
142
+ "status": "confirmed",
143
+ "honesty_conditions": [
144
+ {
145
+ "id": "h20",
146
+ "text": "each stated gap is re-verified against source at the cited file:line at plan time before any task is cut from it",
147
+ "status": "confirmed"
148
+ }
149
+ ],
150
+ "hard_questions": [],
151
+ "links": []
152
+ },
153
+ {
154
+ "id": "c10",
155
+ "kind": "boundary",
156
+ "text": "culture-side harness changes (IRCTransport adoption, all-backends propagation) are culture Track-A work; this spec covers agentirc only and must not require lockstep culture changes to ship",
157
+ "origin": "llm",
158
+ "status": "confirmed",
159
+ "honesty_conditions": [
160
+ {
161
+ "id": "h21",
162
+ "text": "the full test suite plus the end-to-end agent walkthrough pass in a venv with no culture checkout on the machine",
163
+ "status": "confirmed"
164
+ }
165
+ ],
166
+ "hard_questions": [],
167
+ "links": []
168
+ },
169
+ {
170
+ "id": "c11",
171
+ "kind": "requirement",
172
+ "text": "CLI: agent-facing client verbs (e.g. agentirc send / read / watch / join) let an agent converse with a running daemon over TCP from a shell, with no Python imports and no culture install",
173
+ "origin": "llm",
174
+ "status": "confirmed",
175
+ "honesty_conditions": [
176
+ {
177
+ "id": "h2",
178
+ "text": "the client verbs work against a running daemon over real TCP (not just an embedded IRCd) and are covered by subprocess-fixture tests",
179
+ "status": "confirmed"
180
+ }
181
+ ],
182
+ "hard_questions": [],
183
+ "links": []
184
+ },
185
+ {
186
+ "id": "c12",
187
+ "kind": "requirement",
188
+ "text": "CLI clarity: lifecycle verbs (status, version at minimum) gain --json machine-readable output; default text output unchanged",
189
+ "origin": "llm",
190
+ "status": "confirmed",
191
+ "honesty_conditions": [
192
+ {
193
+ "id": "h3",
194
+ "text": "--json output is valid JSON on stdout with diagnostics on stderr; existing text output is byte-identical without the flag (culture shim compatibility preserved)",
195
+ "status": "confirmed"
196
+ }
197
+ ],
198
+ "hard_questions": [],
199
+ "links": []
200
+ },
201
+ {
202
+ "id": "c13",
203
+ "kind": "requirement",
204
+ "text": "reliability: a first-party public client transport with auto-reconnect, exponential backoff, nick re-registration and channel re-join \u2014 the affordances currently exclusive to the culture harness",
205
+ "origin": "llm",
206
+ "status": "confirmed",
207
+ "honesty_conditions": [
208
+ {
209
+ "id": "h4",
210
+ "text": "reconnect/backoff is agentirc-native and tested with a killed-and-restarted server fixture; the culture harness could later adopt it without behavior change but nothing in this release requires culture to change",
211
+ "status": "confirmed"
212
+ }
213
+ ],
214
+ "hard_questions": [],
215
+ "links": []
216
+ },
217
+ {
218
+ "id": "c14",
219
+ "kind": "requirement",
220
+ "text": "reliability: server-side liveness \u2014 periodic server-to-client PING with bounded timeout reaps dead connections (today _handle_pong is a no-op and half-open sockets linger)",
221
+ "origin": "llm",
222
+ "status": "confirmed",
223
+ "honesty_conditions": [
224
+ {
225
+ "id": "h5",
226
+ "text": "reap interval and timeout are configurable; a healthy but idle client that answers PING is never dropped; existing tests still pass with the ping loop on",
227
+ "status": "confirmed"
228
+ }
229
+ ],
230
+ "hard_questions": [],
231
+ "links": []
232
+ },
233
+ {
234
+ "id": "c15",
235
+ "kind": "requirement",
236
+ "text": "message structure: server stamps msgid and server-time IRCv3 tags on delivered messages for message-tags clients; thread association becomes a machine-parseable tag instead of only a [thread:name] text prefix",
237
+ "origin": "llm",
238
+ "status": "confirmed",
239
+ "honesty_conditions": [
240
+ {
241
+ "id": "h6",
242
+ "text": "tags are sent only to clients that negotiated message-tags; clients without the cap see a byte-identical wire format to 9.7.0 (backward compat verified by the wire-format golden tests)",
243
+ "status": "confirmed"
244
+ }
245
+ ],
246
+ "hard_questions": [],
247
+ "links": []
248
+ },
249
+ {
250
+ "id": "c16",
251
+ "kind": "requirement",
252
+ "text": "message structure: long-message handling \u2014 outbound splitting at the 512-byte line limit and an explicit error reply on over-long inbound lines, replacing silent truncation",
253
+ "origin": "llm",
254
+ "status": "confirmed",
255
+ "honesty_conditions": [
256
+ {
257
+ "id": "h7",
258
+ "text": "no inbound line is ever silently altered: over-limit input gets an explicit error reply naming the limit; outbound splitting never breaks mid-codepoint and preserves message order",
259
+ "status": "confirmed"
260
+ }
261
+ ],
262
+ "hard_questions": [],
263
+ "links": []
264
+ },
265
+ {
266
+ "id": "c17",
267
+ "kind": "requirement",
268
+ "text": "missing feature: HISTORY gains a since-timestamp/cursor form with deterministic pagination, backed by the existing SQLite (channel,timestamp,id) index \u2014 offline agents catch up without guessing a count",
269
+ "origin": "llm",
270
+ "status": "confirmed",
271
+ "honesty_conditions": [
272
+ {
273
+ "id": "h8",
274
+ "text": "paging is deterministic and non-overlapping across calls (stable cursor), works on both the in-memory deque and SQLite backends, and HISTORY RECENT/SEARCH behavior is unchanged",
275
+ "status": "confirmed"
276
+ }
277
+ ],
278
+ "hard_questions": [],
279
+ "links": []
280
+ },
281
+ {
282
+ "id": "c18",
283
+ "kind": "requirement",
284
+ "text": "missing feature: the documented recovery path becomes real \u2014 client-facing BACKFILL is implemented (or extension-api.md stops promising it); docs and implementation agree",
285
+ "origin": "llm",
286
+ "status": "confirmed",
287
+ "honesty_conditions": [
288
+ {
289
+ "id": "h9",
290
+ "text": "after this ships, grep of extension-api.md finds no verb the server does not handle; the EVENTSUB overflow-recovery walkthrough is executable as written",
291
+ "status": "confirmed"
292
+ }
293
+ ],
294
+ "hard_questions": [],
295
+ "links": []
296
+ },
297
+ {
298
+ "id": "c19",
299
+ "kind": "requirement",
300
+ "text": "clarity: every skills error reply (rooms/threads/history) carries a stable named reason token in the style of EVENTERR, replacing bare NOTICE prose and ad-hoc 400/404/405 free text",
301
+ "origin": "llm",
302
+ "status": "confirmed",
303
+ "honesty_conditions": [
304
+ {
305
+ "id": "h10",
306
+ "text": "existing culture-harness message parsing does not break: token replies are additive (new numeric/tag or trailing token) rather than rewrites of reply shapes culture already matches on",
307
+ "status": "confirmed"
308
+ }
309
+ ],
310
+ "hard_questions": [],
311
+ "links": []
312
+ },
313
+ {
314
+ "id": "c20",
315
+ "kind": "requirement",
316
+ "text": "clarity: runtime discoverability \u2014 a client can enumerate available skill verbs (ROOM*, THREAD*, HISTORY, TAGS, ...) via a single query verb instead of reading docs out-of-band",
317
+ "origin": "llm",
318
+ "status": "confirmed",
319
+ "honesty_conditions": [
320
+ {
321
+ "id": "h11",
322
+ "text": "the discovery verb output is versioned and machine-parseable, and lists exactly the verbs the running server accepts (skills actually loaded), not a hardcoded list",
323
+ "status": "confirmed"
324
+ }
325
+ ],
326
+ "hard_questions": [],
327
+ "links": []
328
+ },
329
+ {
330
+ "id": "c21",
331
+ "kind": "success_signal",
332
+ "text": "an LLM agent with only a shell and pip install agentirc-cli \u2014 no culture checkout \u2014 can join a channel, send a message, and read replies using documented CLI verbs",
333
+ "origin": "llm",
334
+ "status": "confirmed",
335
+ "honesty_conditions": [
336
+ {
337
+ "id": "h22",
338
+ "text": "verified in a clean venv: pip install agentirc-cli, start a daemon, then join, send, and read using only documented CLI verbs",
339
+ "status": "confirmed"
340
+ }
341
+ ],
342
+ "hard_questions": [],
343
+ "links": []
344
+ },
345
+ {
346
+ "id": "c22",
347
+ "kind": "success_signal",
348
+ "text": "an agent that disconnects and reconnects can deterministically catch up on channel messages it missed, with no duplicates and no manual count-guessing",
349
+ "origin": "llm",
350
+ "status": "confirmed",
351
+ "honesty_conditions": [
352
+ {
353
+ "id": "h23",
354
+ "text": "an integration test disconnects a client mid-stream, sends messages during the outage, reconnects, and asserts exact recovery with no duplicates and no manual count",
355
+ "status": "confirmed"
356
+ }
357
+ ],
358
+ "hard_questions": [],
359
+ "links": []
360
+ },
361
+ {
362
+ "id": "c23",
363
+ "kind": "success_signal",
364
+ "text": "every error an agent can trigger on the skill verbs is branchable by a stable token, verified by tests, and extension-api.md promises nothing the server does not implement",
365
+ "origin": "llm",
366
+ "status": "confirmed",
367
+ "honesty_conditions": [
368
+ {
369
+ "id": "h24",
370
+ "text": "a test enumerates every error path in the rooms/threads/history skills asserting a stable token, and a docs check confirms extension-api.md promises only implemented verbs",
371
+ "status": "confirmed"
372
+ }
373
+ ],
374
+ "hard_questions": [],
375
+ "links": []
376
+ },
377
+ {
378
+ "id": "c24",
379
+ "kind": "requirement",
380
+ "text": "missing feature: DMs are stored in history with the same retention rules as channels, recoverable via the HISTORY since-cursor form; no new delivery semantics (user decision on q1)",
381
+ "origin": "user",
382
+ "status": "confirmed",
383
+ "honesty_conditions": [
384
+ {
385
+ "id": "h16",
386
+ "text": "a DM sent while the recipient is connected lands in history and is retrievable via HISTORY since-cursor after the recipient reconnects; retention/prune rules match channel history; wire behavior for online DMs is unchanged",
387
+ "status": "confirmed"
388
+ }
389
+ ],
390
+ "hard_questions": [],
391
+ "links": []
392
+ }
393
+ ],
394
+ "open_vagueness": [
395
+ {
396
+ "id": "v1",
397
+ "text": "which further IRCv3 caps to adopt beyond message-tags msgid/server-time (labeled-response, echo-message, batch, draft/multiline) \u2014 each has real value for agents but expands scope",
398
+ "kind": "follow_up",
399
+ "claim_id": null
400
+ },
401
+ {
402
+ "id": "v2",
403
+ "text": "delivery acknowledgments for sends (today Client.send swallows OSError silently) \u2014 likely wants echo-message/labeled-response, so it rides the caps follow-up",
404
+ "kind": "follow_up",
405
+ "claim_id": null
406
+ },
407
+ {
408
+ "id": "v3",
409
+ "text": "exact CLI verb names and flag shapes for the agent client verbs (send/read/watch vs msg/tail) \u2014 bikeshed to settle at plan time, not spec time",
410
+ "kind": "unknown_nonblocking",
411
+ "claim_id": null
412
+ }
413
+ ]
414
+ }