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.
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/portability-lint.sh +5 -1
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/recall/scripts/recall.sh +35 -13
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/remember/scripts/remember.sh +39 -13
- agentirc_cli-9.10.0/.devague/current +1 -0
- agentirc_cli-9.10.0/.devague/current_plan +1 -0
- agentirc_cli-9.10.0/.devague/frames/agentirc-ships-an-agent-accessibility-release-ai-a.json +414 -0
- agentirc_cli-9.10.0/.devague/plans/agentirc-ships-an-agent-accessibility-release-ai-a.json +586 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.gitignore +2 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/CHANGELOG.md +39 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/CLAUDE.md +28 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/PKG-INFO +1 -1
- agentirc_cli-9.10.0/docs/plans/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md +145 -0
- agentirc_cli-9.10.0/docs/specs/2026-07-01-agentirc-ships-an-agent-accessibility-release-ai-a.md +76 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/pyproject.toml +1 -1
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/uv.lock +1 -1
- agentirc_cli-9.9.0/.devague/current +0 -1
- agentirc_cli-9.9.0/.devague/current_plan +0 -1
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/recall/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/remember/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/think/SKILL.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills/think/scripts/think.sh +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.claude/skills.local.yaml.example +0 -0
- {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
- {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
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/LICENSE +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/README.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/__main__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/aio.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/bots/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/bots/bot_manager.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/bots/http_listener.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/cli_shared/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/cli_shared/constants.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/cli_shared/mesh.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/constants.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/event_subscriptions.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/pidfile.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/protocol/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/protocol/message.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/protocol/replies.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/audit.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/context.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/metrics.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/telemetry/tracing.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/_internal/virtual_client.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/bot.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/bot_manager.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/cli.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/config.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/filter_dsl.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/http_listener.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/template_engine.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/bots/virtual_client.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/channel.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/cli.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/client.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/config.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/events.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/history_store.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/ircd.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/protocol.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/remote_client.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/room_store.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/rooms_util.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/server_link.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skill.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/history.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/icon.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/rooms.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/skills/threads.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/thread_store.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/agentirc/virtual_client.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/api-stability.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/bots.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/cli.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/deployment.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/extension-api.md +0 -0
- {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
- {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
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/steward/onboarding.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/superpowers/specs/2026-04-30-bootstrap-design.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/superpowers/specs/2026-05-01-bot-extension-api-design.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/docs/superpowers/specs/2026-05-01-task14-audit.md +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/_helpers.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_bot.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_bot_host.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_bot_manager.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_cli_bot.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_config_bots.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_filter_dsl.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_http_listener.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_public_surface.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/bots/test_template_engine.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/conftest.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/__init__.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/_fakes.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/_metrics_helpers.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_emit.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_lifecycle.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_module.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_audit_parse_error.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_config.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_dispatch_span.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_emit_event_span.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_metrics_init.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_metrics_s2s.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_outbound_inject.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_parse_error.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_s2s_relay_span.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_server_init.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_server_link_inject.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/telemetry/test_tracing.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_api_stability_embedding.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_bot_capability.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_channel.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_cli.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_config_loader.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_connection.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_discovery.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_event_subscriptions.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_eventpub.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_basic.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_catalog.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_federation.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_history.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_lifecycle.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_events_reserved_nick.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_federation.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_history.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_mentions.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_messaging.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_modes.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_protocol_bot_exports.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_skills.py +0 -0
- {agentirc_cli-9.9.0 → agentirc_cli-9.10.0}/tests/test_threads.py +0 -0
- {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
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|