agent-lifecycle 0.2.2__tar.gz → 0.2.3__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.
- agent_lifecycle-0.2.3/.devague/plans/agent-lifecycle-v0-3-ships-the-two-pluggable-seam.json +252 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.gitignore +4 -2
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.markdownlint-cli2.yaml +6 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/CHANGELOG.md +18 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/PKG-INFO +1 -1
- agent_lifecycle-0.2.3/docs/plans/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md +72 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/pyproject.toml +1 -1
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/uv.lock +1 -1
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/agent-config/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/run-tests/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/think/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/think/scripts/think.sh +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/version-bump/SKILL.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills.local.yaml.example +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.devague/frames/agent-lifecycle-v0-3-ships-the-two-pluggable-seam.json +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.flake8 +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.github/workflows/publish.yml +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.github/workflows/tests.yml +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/CLAUDE.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/LICENSE +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/README.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/__init__.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/__main__.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/__init__.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/__init__.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/cli.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/doctor.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/explain.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/learn.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/overview.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/whoami.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_errors.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_output.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/explain/__init__.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/agent_lifecycle/explain/catalog.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/culture.yaml +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/docs/skill-sources.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/docs/specs/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/sonar-project.properties +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/tests/__init__.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/tests/test_cli.py +0 -0
- {agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/tests/test_cli_introspection.py +0 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "agent-lifecycle-v0-3-ships-the-two-pluggable-seam",
|
|
3
|
+
"title": "agent-lifecycle v0.3 ships the two pluggable seam interfaces \u2014 Transport (message-first, presence optional) and Harness \u2014 plus a minimal in-process supervisor core and a reference echo transport+harness that prove the seam end-to-end, depending on nothing culture/agentirc/Slack-specific.",
|
|
4
|
+
"frame_slug": "agent-lifecycle-v0-3-ships-the-two-pluggable-seam",
|
|
5
|
+
"schema_version": 1,
|
|
6
|
+
"status": "exported",
|
|
7
|
+
"created": "2026-06-09T23:23:48Z",
|
|
8
|
+
"updated": "2026-06-09T23:36:22Z",
|
|
9
|
+
"targets": [
|
|
10
|
+
{
|
|
11
|
+
"id": "c1",
|
|
12
|
+
"kind": "announcement",
|
|
13
|
+
"text": "agent-lifecycle v0.3 ships the two pluggable seam interfaces \u2014 Transport (message-first, presence optional) and Harness \u2014 plus a minimal in-process supervisor core and a reference echo transport+harness that prove the seam end-to-end, depending on nothing culture/agentirc/Slack-specific."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "h1",
|
|
17
|
+
"kind": "honesty",
|
|
18
|
+
"text": "The reference harness+transport demo runs in CI with no network and no optional culture/agentirc/Slack packages installed."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "c2",
|
|
22
|
+
"kind": "audience",
|
|
23
|
+
"text": "The cultureagent and colleague maintainers (the two proving harnesses) plus the charter reviewers (guildmaster#61) who need concrete code \u2014 not prose \u2014 to ratify the Transport/Harness seam."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "h7",
|
|
27
|
+
"kind": "honesty",
|
|
28
|
+
"text": "The exported spec is directly consumable by the cultureagent + colleague maintainers as the ratification target: it names both proving harnesses and links guildmaster#61."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "c3",
|
|
32
|
+
"kind": "after_state",
|
|
33
|
+
"text": "The Transport and Harness contracts are importable from agent_lifecycle and demonstrated end-to-end: a reference harness wired to a reference transport through the supervisor round-trips a message in-process, with zero culture/agentirc/Slack imports."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "h2",
|
|
37
|
+
"kind": "honesty",
|
|
38
|
+
"text": "round-trip is observable: an inbound message handed to the Harness produces an outbound message delivered back through the Transport, asserted by a test \u2014 not just an interface that type-checks."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "c4",
|
|
42
|
+
"kind": "before_state",
|
|
43
|
+
"text": "The agent runtime is entangled inside cultureagent: the four backend daemons and the supervisor mechanics live together, and IRC is hardcoded as the transport (IRCTransport / agentirc VirtualClient lineage). No transport-free, harness-free core exists."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "h8",
|
|
47
|
+
"kind": "honesty",
|
|
48
|
+
"text": "The entanglement is citable in cultureagent today: the backend daemons and the supervisor mechanics live in the same package, and IRCTransport is the only transport."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "c5",
|
|
52
|
+
"kind": "why_it_matters",
|
|
53
|
+
"text": "A transport-free, harness-free core lets cultureagent slim to a harness pack and lets colleague/Slack build on the same runtime without inheriting IRC or the Claude-family backends \u2014 the coupling that blocks both cases today."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "h9",
|
|
57
|
+
"kind": "honesty",
|
|
58
|
+
"text": "With the core extracted, a colleague-on-Slack deployment can be composed with no agentirc/IRC/culture package anywhere in its dependency tree."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "c6",
|
|
62
|
+
"kind": "boundary",
|
|
63
|
+
"text": "First increment only: NOT extracting cultureagent's four backends, NOT shipping the IRC/Slack/agtag transport plugs, and NOT refitting cultureagent to consume the package yet. Those follow once the seam is ratified."
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "h10",
|
|
67
|
+
"kind": "honesty",
|
|
68
|
+
"text": "This increment is shippable and reviewable with NO cultureagent source present in this repo \u2014 it adds only new in-repo modules + tests."
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "c7",
|
|
72
|
+
"kind": "success_signal",
|
|
73
|
+
"text": "A pytest test composes the reference Harness + reference Transport through the supervisor and round-trips a message in-process; an import-guard test asserts agent_lifecycle has no culture/agentirc/Slack import in its dependency tree."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "h3",
|
|
77
|
+
"kind": "honesty",
|
|
78
|
+
"text": "the import-guard test fails loudly if a future commit adds a culture/agentirc/Slack import to the core (e.g. it walks the import graph, not just a grep)."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "c9",
|
|
82
|
+
"kind": "requirement",
|
|
83
|
+
"text": "agent_lifecycle's runtime dependency tree imports nothing culture-, agentirc-, or Slack-specific; the seam is defined as abstract interfaces (Protocol/ABC) so concrete transports/harnesses live in downstream packs/plugs."
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "h5",
|
|
87
|
+
"kind": "honesty",
|
|
88
|
+
"text": "a downstream pack can implement Transport/Harness against only agent_lifecycle's public exports, with no import from a sibling pack."
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"tasks": [
|
|
92
|
+
{
|
|
93
|
+
"id": "t1",
|
|
94
|
+
"summary": "Message-first core type: add agent_lifecycle/runtime/message.py (+ minimal runtime/__init__.py package marker) defining a Message value object \u2014 sender identity, target/channel, body, optional kind/metadata \u2014 with NO transport/harness coupling.",
|
|
95
|
+
"origin": "llm",
|
|
96
|
+
"status": "confirmed",
|
|
97
|
+
"acceptance_criteria": [
|
|
98
|
+
"A Message value object is importable from agent_lifecycle.runtime.message with sender-identity, target/channel and body fields; constructing one requires no Transport or Harness, and runtime/__init__.py is a bare package marker (no re-exports of not-yet-built submodules)."
|
|
99
|
+
],
|
|
100
|
+
"deps": [],
|
|
101
|
+
"covers": [
|
|
102
|
+
"c3"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "t2",
|
|
107
|
+
"summary": "Transport interface: add agent_lifecycle/runtime/transport.py defining Transport as an abstract message-first interface (Protocol/ABC) over Message \u2014 send, receive/subscribe, identity \u2014 with presence (join/part/who) as a SEPARATE optional Presence protocol a transport may omit.",
|
|
108
|
+
"origin": "llm",
|
|
109
|
+
"status": "confirmed",
|
|
110
|
+
"acceptance_criteria": [
|
|
111
|
+
"Transport is an abstract interface exposing send / receive(subscribe) / identity over Message; presence is a distinct optional Presence protocol \u2014 importing or implementing Transport imposes no presence requirement (an async/no-presence transport is expressible without changing the Transport signature).",
|
|
112
|
+
"Concurrency model is asyncio: send/receive are async, subscribe yields an async iterator of Messages; this is the single seam-wide concurrency model."
|
|
113
|
+
],
|
|
114
|
+
"deps": [
|
|
115
|
+
"t1"
|
|
116
|
+
],
|
|
117
|
+
"covers": [
|
|
118
|
+
"c3"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "t3",
|
|
123
|
+
"summary": "Harness interface: add agent_lifecycle/runtime/harness.py defining Harness as an abstract long-lived streaming brain \u2014 start / feed_message / stream-of-reply-Messages / stop \u2014 modeling a live process-backed agent like Claude Code or Codex.",
|
|
124
|
+
"origin": "llm",
|
|
125
|
+
"status": "confirmed",
|
|
126
|
+
"acceptance_criteria": [
|
|
127
|
+
"Harness is an abstract interface for a long-lived streaming brain (start -> feed_message -> async/iterable stream of reply Messages -> stop); no Harness method takes a transport or a presence argument.",
|
|
128
|
+
"Concurrency model is asyncio: start/feed_message/stop are async and the reply stream is an async iterator of Messages."
|
|
129
|
+
],
|
|
130
|
+
"deps": [
|
|
131
|
+
"t1"
|
|
132
|
+
],
|
|
133
|
+
"covers": [
|
|
134
|
+
"c3"
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "t4",
|
|
139
|
+
"summary": "Minimal in-process supervisor: add agent_lifecycle/runtime/supervisor.py wiring any Transport to any Harness \u2014 pump inbound Messages from the transport into the harness, publish the harness reply stream back out via the transport \u2014 with a start/stop/status surface (in-process only, not OS-process).",
|
|
140
|
+
"origin": "llm",
|
|
141
|
+
"status": "confirmed",
|
|
142
|
+
"acceptance_criteria": [
|
|
143
|
+
"The supervisor accepts any Transport + Harness, delivers each inbound Message to the harness and publishes its reply stream back through the transport; stop() halts the pump cleanly; it imports only agent_lifecycle.runtime public types, never a concrete transport/harness.",
|
|
144
|
+
"Supervisor drives the pump with asyncio \u2014 awaits inbound from the transport, awaits the harness reply stream, awaits transport send \u2014 no blocking calls."
|
|
145
|
+
],
|
|
146
|
+
"deps": [
|
|
147
|
+
"t2",
|
|
148
|
+
"t3"
|
|
149
|
+
],
|
|
150
|
+
"covers": [
|
|
151
|
+
"c3"
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"id": "t5",
|
|
156
|
+
"summary": "Reference doubles: add agent_lifecycle/reference/ (__init__.py, echo_transport.py, echo_harness.py) \u2014 an in-memory no-network Transport and an EchoHarness that emits one reply Message per inbound \u2014 implemented against only agent_lifecycle public exports.",
|
|
157
|
+
"origin": "llm",
|
|
158
|
+
"status": "confirmed",
|
|
159
|
+
"acceptance_criteria": [
|
|
160
|
+
"An in-memory reference Transport (no sockets/network) and an EchoHarness (one reply Message per inbound) are importable from agent_lifecycle.reference and implement Transport/Harness using only agent_lifecycle public exports \u2014 proving a downstream pack needs no sibling-pack import.",
|
|
161
|
+
"Reference doubles implement the asyncio Transport/Harness (async methods, async-iterator streams), no threads/sockets."
|
|
162
|
+
],
|
|
163
|
+
"deps": [
|
|
164
|
+
"t2",
|
|
165
|
+
"t3"
|
|
166
|
+
],
|
|
167
|
+
"covers": [
|
|
168
|
+
"h5"
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "t6",
|
|
173
|
+
"summary": "Round-trip demo test: add tests/test_runtime_roundtrip.py composing EchoHarness + the in-memory reference Transport through the supervisor, sending one inbound Message and asserting the matching outbound reply is observed at the transport.",
|
|
174
|
+
"origin": "llm",
|
|
175
|
+
"status": "confirmed",
|
|
176
|
+
"acceptance_criteria": [
|
|
177
|
+
"A pytest wires EchoHarness + in-memory Transport via the supervisor, sends one inbound Message, and asserts the corresponding outbound reply is delivered back through the transport \u2014 running with no network and with no culture/agentirc/Slack package installed."
|
|
178
|
+
],
|
|
179
|
+
"deps": [
|
|
180
|
+
"t4",
|
|
181
|
+
"t5"
|
|
182
|
+
],
|
|
183
|
+
"covers": [
|
|
184
|
+
"c1",
|
|
185
|
+
"h1",
|
|
186
|
+
"h2",
|
|
187
|
+
"c7"
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "t7",
|
|
192
|
+
"summary": "Import-guard test: add tests/test_import_guard.py that imports every agent_lifecycle submodule, resolves the loaded module set, and asserts none belong to a culture/agentirc/slack package \u2014 walking the import graph, not grepping source.",
|
|
193
|
+
"origin": "llm",
|
|
194
|
+
"status": "confirmed",
|
|
195
|
+
"acceptance_criteria": [
|
|
196
|
+
"A pytest imports every agent_lifecycle submodule and asserts the resolved sys.modules set contains no culture/agentirc/slack package; adding such an import to any core module makes the test fail loudly (verified by a temporary/monkeypatched offender or an allowlist-diff)."
|
|
197
|
+
],
|
|
198
|
+
"deps": [
|
|
199
|
+
"t4",
|
|
200
|
+
"t5"
|
|
201
|
+
],
|
|
202
|
+
"covers": [
|
|
203
|
+
"c7",
|
|
204
|
+
"h3",
|
|
205
|
+
"c9"
|
|
206
|
+
]
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"id": "t8",
|
|
210
|
+
"summary": "Seam documentation: add docs/runtime-seam.md (linked from README) for the cultureagent + colleague maintainers and charter reviewers \u2014 states the before (runtime entangled in cultureagent, IRC hardcoded) -> after (extracted transport-free/harness-free core), why it matters (cultureagent slims; colleague/Slack build without IRC/Claude backends), and this increment's explicit boundary/non-goals.",
|
|
211
|
+
"origin": "llm",
|
|
212
|
+
"status": "confirmed",
|
|
213
|
+
"acceptance_criteria": [
|
|
214
|
+
"docs/runtime-seam.md (linked from README) names the cultureagent + colleague audience and links guildmaster#61 / issue #1; states before->after and why; and explicitly lists the increment boundary (no backend extraction, no real IRC/Slack/agtag, no cultureagent refit) \u2014 and the repo builds/ships with NO cultureagent source present."
|
|
215
|
+
],
|
|
216
|
+
"deps": [
|
|
217
|
+
"t2",
|
|
218
|
+
"t3"
|
|
219
|
+
],
|
|
220
|
+
"covers": [
|
|
221
|
+
"c2",
|
|
222
|
+
"h7",
|
|
223
|
+
"c4",
|
|
224
|
+
"h8",
|
|
225
|
+
"c5",
|
|
226
|
+
"h9",
|
|
227
|
+
"c6",
|
|
228
|
+
"h10"
|
|
229
|
+
]
|
|
230
|
+
}
|
|
231
|
+
],
|
|
232
|
+
"risks": [
|
|
233
|
+
{
|
|
234
|
+
"id": "r1",
|
|
235
|
+
"text": "cultureagent backend extraction + refit, and real IRC/Slack/agtag transport plugs, are explicitly later increments \u2014 this plan only defines + proves the seam greenfield.",
|
|
236
|
+
"kind": "out_of_scope",
|
|
237
|
+
"task_id": null
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "r2",
|
|
241
|
+
"text": "Before the first REAL PyPI publish, a Trusted Publisher must be registered for agent-lifecycle on PyPI AND TestPyPI (per issue #1 packaging facts); not needed for this increment since it ships no new publishable runtime contract decision beyond the package itself.",
|
|
242
|
+
"kind": "follow_up",
|
|
243
|
+
"task_id": null
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"id": "r3",
|
|
247
|
+
"text": "Concurrency model must be consistent across Transport/Harness/Supervisor (t2/t3/t4) and the reference doubles (t5): pick ONE \u2014 recommend asyncio to match cultureagent's async daemons \u2014 so the stream/pump types compose. A split model would break the round-trip demo.",
|
|
248
|
+
"kind": "unknown_nonblocking",
|
|
249
|
+
"task_id": "t4"
|
|
250
|
+
}
|
|
251
|
+
]
|
|
252
|
+
}
|
|
@@ -231,6 +231,8 @@ skills.local.yaml
|
|
|
231
231
|
|
|
232
232
|
# devague working state (not committed by default)
|
|
233
233
|
.devague/reviews/
|
|
234
|
-
# Mutable "current frame"
|
|
235
|
-
# The durable artifacts are .devague/frames/<slug>.json
|
|
234
|
+
# Mutable "current frame" / "current plan" pointers — local working state that
|
|
235
|
+
# churns per branch. The durable artifacts are .devague/frames/<slug>.json,
|
|
236
|
+
# .devague/plans/<slug>.json, and the exported docs/specs|plans/<slug>.md.
|
|
236
237
|
.devague/current
|
|
238
|
+
.devague/current_plan
|
|
@@ -21,3 +21,9 @@ ignores:
|
|
|
21
21
|
- ".teken/**"
|
|
22
22
|
# Vendored skills are cited verbatim from guildmaster — do not reformat them.
|
|
23
23
|
- ".claude/skills/**"
|
|
24
|
+
# devague-generated specs/plans — task summaries become sentence headings
|
|
25
|
+
# (trailing period → MD026). These are tool output, not hand-authored prose.
|
|
26
|
+
- "docs/specs/**"
|
|
27
|
+
- "docs/plans/**"
|
|
28
|
+
# devague local working state (frames/plans JSON + ungitignored review md).
|
|
29
|
+
- ".devague/**"
|
|
@@ -5,6 +5,24 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/). This project
|
|
6
6
|
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.2.3] - 2026-06-10
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Converged devague build plan for the first increment** (`docs/plans/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md`),
|
|
13
|
+
the forward leg from the spec landed in 0.2.2. Eight tasks covering all 16 spec
|
|
14
|
+
targets across four file-disjoint dependency waves: `runtime/message.py` →
|
|
15
|
+
`transport.py` + `harness.py` → `supervisor.py` + reference doubles + seam docs
|
|
16
|
+
→ round-trip + import-guard tests. Decision baked into the task acceptance
|
|
17
|
+
criteria: the seam uses **asyncio** as its single concurrency model (matches
|
|
18
|
+
cultureagent's async daemons). Risks recorded: cultureagent extraction / real
|
|
19
|
+
transports are out-of-scope later increments; a PyPI Trusted Publisher must be
|
|
20
|
+
registered before the first real publish.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
8
26
|
## [0.2.2] - 2026-06-10
|
|
9
27
|
|
|
10
28
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-lifecycle
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Harness- and transport-agnostic agent runtime: supervises an agent's process lifecycle independent of its harness (brain) and transport (IRC/Slack/agtag).
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentculture/agent-lifecycle
|
|
6
6
|
Project-URL: Issues, https://github.com/agentculture/agent-lifecycle/issues
|
agent_lifecycle-0.2.3/docs/plans/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Build Plan — agent-lifecycle v0.3: the two pluggable seam interfaces (Transport + Harness)
|
|
2
|
+
|
|
3
|
+
slug: `agent-lifecycle-v0-3-ships-the-two-pluggable-seam` · status: `exported` · from frame: `agent-lifecycle-v0-3-ships-the-two-pluggable-seam`
|
|
4
|
+
|
|
5
|
+
> agent-lifecycle v0.3 ships the two pluggable seam interfaces — Transport (message-first, presence optional) and Harness — plus a minimal in-process supervisor core and a reference echo transport+harness that prove the seam end-to-end, depending on nothing culture/agentirc/Slack-specific.
|
|
6
|
+
|
|
7
|
+
## Tasks
|
|
8
|
+
|
|
9
|
+
### t1 — Message-first core type: add agent_lifecycle/runtime/message.py (+ minimal runtime/__init__.py package marker) defining a Message value object — sender identity, target/channel, body, optional kind/metadata — with NO transport/harness coupling.
|
|
10
|
+
|
|
11
|
+
- covers: c3
|
|
12
|
+
- acceptance:
|
|
13
|
+
- A Message value object is importable from agent_lifecycle.runtime.message with sender-identity, target/channel and body fields; constructing one requires no Transport or Harness, and runtime/__init__.py is a bare package marker (no re-exports of not-yet-built submodules).
|
|
14
|
+
|
|
15
|
+
### t2 — Transport interface: add agent_lifecycle/runtime/transport.py defining Transport as an abstract message-first interface (Protocol/ABC) over Message — send, receive/subscribe, identity — with presence (join/part/who) as a SEPARATE optional Presence protocol a transport may omit.
|
|
16
|
+
|
|
17
|
+
- depends on: t1
|
|
18
|
+
- covers: c3
|
|
19
|
+
- acceptance:
|
|
20
|
+
- Transport is an abstract interface exposing send / receive(subscribe) / identity over Message; presence is a distinct optional Presence protocol — importing or implementing Transport imposes no presence requirement (an async/no-presence transport is expressible without changing the Transport signature).
|
|
21
|
+
- Concurrency model is asyncio: send/receive are async, subscribe yields an async iterator of Messages; this is the single seam-wide concurrency model.
|
|
22
|
+
|
|
23
|
+
### t3 — Harness interface: add agent_lifecycle/runtime/harness.py defining Harness as an abstract long-lived streaming brain — start / feed_message / stream-of-reply-Messages / stop — modeling a live process-backed agent like Claude Code or Codex.
|
|
24
|
+
|
|
25
|
+
- depends on: t1
|
|
26
|
+
- covers: c3
|
|
27
|
+
- acceptance:
|
|
28
|
+
- Harness is an abstract interface for a long-lived streaming brain (start -> feed_message -> async/iterable stream of reply Messages -> stop); no Harness method takes a transport or a presence argument.
|
|
29
|
+
- Concurrency model is asyncio: start/feed_message/stop are async and the reply stream is an async iterator of Messages.
|
|
30
|
+
|
|
31
|
+
### t4 — Minimal in-process supervisor: add agent_lifecycle/runtime/supervisor.py wiring any Transport to any Harness — pump inbound Messages from the transport into the harness, publish the harness reply stream back out via the transport — with a start/stop/status surface (in-process only, not OS-process).
|
|
32
|
+
|
|
33
|
+
- depends on: t2, t3
|
|
34
|
+
- covers: c3
|
|
35
|
+
- acceptance:
|
|
36
|
+
- The supervisor accepts any Transport + Harness, delivers each inbound Message to the harness and publishes its reply stream back through the transport; stop() halts the pump cleanly; it imports only agent_lifecycle.runtime public types, never a concrete transport/harness.
|
|
37
|
+
- Supervisor drives the pump with asyncio — awaits inbound from the transport, awaits the harness reply stream, awaits transport send — no blocking calls.
|
|
38
|
+
|
|
39
|
+
### t5 — Reference doubles: add agent_lifecycle/reference/ (__init__.py, echo_transport.py, echo_harness.py) — an in-memory no-network Transport and an EchoHarness that emits one reply Message per inbound — implemented against only agent_lifecycle public exports
|
|
40
|
+
|
|
41
|
+
- depends on: t2, t3
|
|
42
|
+
- covers: h5
|
|
43
|
+
- acceptance:
|
|
44
|
+
- An in-memory reference Transport (no sockets/network) and an EchoHarness (one reply Message per inbound) are importable from agent_lifecycle.reference and implement Transport/Harness using only agent_lifecycle public exports — proving a downstream pack needs no sibling-pack import.
|
|
45
|
+
- Reference doubles implement the asyncio Transport/Harness (async methods, async-iterator streams), no threads/sockets.
|
|
46
|
+
|
|
47
|
+
### t6 — Round-trip demo test: add tests/test_runtime_roundtrip.py composing EchoHarness + the in-memory reference Transport through the supervisor, sending one inbound Message and asserting the matching outbound reply is observed at the transport
|
|
48
|
+
|
|
49
|
+
- depends on: t4, t5
|
|
50
|
+
- covers: c1, h1, h2, c7
|
|
51
|
+
- acceptance:
|
|
52
|
+
- A pytest wires EchoHarness + in-memory Transport via the supervisor, sends one inbound Message, and asserts the corresponding outbound reply is delivered back through the transport — running with no network and with no culture/agentirc/Slack package installed.
|
|
53
|
+
|
|
54
|
+
### t7 — Import-guard test: add tests/test_import_guard.py that imports every agent_lifecycle submodule, resolves the loaded module set, and asserts none belong to a culture/agentirc/slack package — walking the import graph, not grepping source
|
|
55
|
+
|
|
56
|
+
- depends on: t4, t5
|
|
57
|
+
- covers: c7, h3, c9
|
|
58
|
+
- acceptance:
|
|
59
|
+
- A pytest imports every agent_lifecycle submodule and asserts the resolved sys.modules set contains no culture/agentirc/slack package; adding such an import to any core module makes the test fail loudly (verified by a temporary/monkeypatched offender or an allowlist-diff).
|
|
60
|
+
|
|
61
|
+
### t8 — Seam documentation: add docs/runtime-seam.md (linked from README) for the cultureagent + colleague maintainers and charter reviewers — states the before (runtime entangled in cultureagent, IRC hardcoded) -> after (extracted transport-free/harness-free core), why it matters (cultureagent slims; colleague/Slack build without IRC/Claude backends), and this increment's explicit boundary/non-goals
|
|
62
|
+
|
|
63
|
+
- depends on: t2, t3
|
|
64
|
+
- covers: c2, h7, c4, h8, c5, h9, c6, h10
|
|
65
|
+
- acceptance:
|
|
66
|
+
- docs/runtime-seam.md (linked from README) names the cultureagent + colleague audience and links guildmaster#61 / issue #1; states before->after and why; and explicitly lists the increment boundary (no backend extraction, no real IRC/Slack/agtag, no cultureagent refit) — and the repo builds/ships with NO cultureagent source present.
|
|
67
|
+
|
|
68
|
+
## Risks
|
|
69
|
+
|
|
70
|
+
- [out_of_scope] cultureagent backend extraction + refit, and real IRC/Slack/agtag transport plugs, are explicitly later increments — this plan only defines + proves the seam greenfield.
|
|
71
|
+
- [follow_up] Before the first REAL PyPI publish, a Trusted Publisher must be registered for agent-lifecycle on PyPI AND TestPyPI (per issue #1 packaging facts); not needed for this increment since it ships no new publishable runtime contract decision beyond the package itself.
|
|
72
|
+
- [unknown_nonblocking] Concurrency model must be consistent across Transport/Harness/Supervisor (t2/t3/t4) and the reference doubles (t5): pick ONE — recommend asyncio to match cultureagent's async daemons — so the stream/pump types compose. A split model would break the round-trip demo. (task t4)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agent-lifecycle"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.3"
|
|
4
4
|
description = "Harness- and transport-agnostic agent runtime: supervises an agent's process lifecycle independent of its harness (brain) and transport (IRC/Slack/agtag)."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/explore.md
RENAMED
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/review.md
RENAMED
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/write.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/_resolve-nick.sh
RENAMED
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/portability-lint.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/fetch-issues.sh
RENAMED
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/mesh-message.sh
RENAMED
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/post-comment.sh
RENAMED
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/post-issue.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/doc-test-alignment/scripts/check.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agent_lifecycle-0.2.2 → agent_lifecycle-0.2.3}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|