agent-lifecycle 0.2.1__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.
Files changed (74) hide show
  1. agent_lifecycle-0.2.3/.devague/frames/agent-lifecycle-v0-3-ships-the-two-pluggable-seam.json +181 -0
  2. agent_lifecycle-0.2.3/.devague/plans/agent-lifecycle-v0-3-ships-the-two-pluggable-seam.json +252 -0
  3. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.gitignore +8 -0
  4. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.markdownlint-cli2.yaml +6 -0
  5. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/CHANGELOG.md +36 -0
  6. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/PKG-INFO +1 -1
  7. agent_lifecycle-0.2.3/docs/plans/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md +72 -0
  8. agent_lifecycle-0.2.3/docs/specs/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md +50 -0
  9. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/pyproject.toml +1 -1
  10. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/uv.lock +1 -1
  11. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/agent-config/SKILL.md +0 -0
  12. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  13. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/agent-config/scripts/show.sh +0 -0
  14. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/SKILL.md +0 -0
  15. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
  16. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/review.md +0 -0
  17. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/prompts/write.md +0 -0
  18. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
  19. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  20. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  21. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/cicd/SKILL.md +0 -0
  22. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  23. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  24. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  25. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  26. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  27. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/SKILL.md +0 -0
  28. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  29. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  30. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  31. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  32. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  33. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  34. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  35. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  36. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  37. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  38. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/run-tests/SKILL.md +0 -0
  39. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/run-tests/scripts/test.sh +0 -0
  40. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/sonarclaude/SKILL.md +0 -0
  41. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  42. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  43. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  44. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/think/SKILL.md +0 -0
  45. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/think/scripts/think.sh +0 -0
  46. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/version-bump/SKILL.md +0 -0
  47. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills/version-bump/scripts/bump.py +0 -0
  48. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.claude/skills.local.yaml.example +0 -0
  49. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.flake8 +0 -0
  50. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.github/workflows/publish.yml +0 -0
  51. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/.github/workflows/tests.yml +0 -0
  52. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/CLAUDE.md +0 -0
  53. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/LICENSE +0 -0
  54. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/README.md +0 -0
  55. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/__init__.py +0 -0
  56. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/__main__.py +0 -0
  57. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/__init__.py +0 -0
  58. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/__init__.py +0 -0
  59. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/cli.py +0 -0
  60. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/doctor.py +0 -0
  61. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/explain.py +0 -0
  62. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/learn.py +0 -0
  63. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/overview.py +0 -0
  64. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_commands/whoami.py +0 -0
  65. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_errors.py +0 -0
  66. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/cli/_output.py +0 -0
  67. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/explain/__init__.py +0 -0
  68. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/agent_lifecycle/explain/catalog.py +0 -0
  69. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/culture.yaml +0 -0
  70. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/docs/skill-sources.md +0 -0
  71. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/sonar-project.properties +0 -0
  72. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/tests/__init__.py +0 -0
  73. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/tests/test_cli.py +0 -0
  74. {agent_lifecycle-0.2.1 → agent_lifecycle-0.2.3}/tests/test_cli_introspection.py +0 -0
@@ -0,0 +1,181 @@
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
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-06-09T23:02:18Z",
7
+ "updated": "2026-06-09T23:08:43Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "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.",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h1",
18
+ "text": "The reference harness+transport demo runs in CI with no network and no optional culture/agentirc/Slack packages installed.",
19
+ "status": "confirmed"
20
+ }
21
+ ],
22
+ "hard_questions": [],
23
+ "links": []
24
+ },
25
+ {
26
+ "id": "c2",
27
+ "kind": "audience",
28
+ "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.",
29
+ "origin": "llm",
30
+ "status": "confirmed",
31
+ "honesty_conditions": [
32
+ {
33
+ "id": "h7",
34
+ "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.",
35
+ "status": "confirmed"
36
+ }
37
+ ],
38
+ "hard_questions": [],
39
+ "links": []
40
+ },
41
+ {
42
+ "id": "c3",
43
+ "kind": "after_state",
44
+ "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.",
45
+ "origin": "llm",
46
+ "status": "confirmed",
47
+ "honesty_conditions": [
48
+ {
49
+ "id": "h2",
50
+ "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.",
51
+ "status": "confirmed"
52
+ }
53
+ ],
54
+ "hard_questions": [],
55
+ "links": []
56
+ },
57
+ {
58
+ "id": "c4",
59
+ "kind": "before_state",
60
+ "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.",
61
+ "origin": "llm",
62
+ "status": "confirmed",
63
+ "honesty_conditions": [
64
+ {
65
+ "id": "h8",
66
+ "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.",
67
+ "status": "confirmed"
68
+ }
69
+ ],
70
+ "hard_questions": [],
71
+ "links": []
72
+ },
73
+ {
74
+ "id": "c5",
75
+ "kind": "why_it_matters",
76
+ "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.",
77
+ "origin": "llm",
78
+ "status": "confirmed",
79
+ "honesty_conditions": [
80
+ {
81
+ "id": "h9",
82
+ "text": "With the core extracted, a colleague-on-Slack deployment can be composed with no agentirc/IRC/culture package anywhere in its dependency tree.",
83
+ "status": "confirmed"
84
+ }
85
+ ],
86
+ "hard_questions": [],
87
+ "links": []
88
+ },
89
+ {
90
+ "id": "c6",
91
+ "kind": "boundary",
92
+ "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.",
93
+ "origin": "llm",
94
+ "status": "confirmed",
95
+ "honesty_conditions": [
96
+ {
97
+ "id": "h10",
98
+ "text": "This increment is shippable and reviewable with NO cultureagent source present in this repo \u2014 it adds only new in-repo modules + tests.",
99
+ "status": "confirmed"
100
+ }
101
+ ],
102
+ "hard_questions": [],
103
+ "links": []
104
+ },
105
+ {
106
+ "id": "c7",
107
+ "kind": "success_signal",
108
+ "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.",
109
+ "origin": "llm",
110
+ "status": "confirmed",
111
+ "honesty_conditions": [
112
+ {
113
+ "id": "h3",
114
+ "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).",
115
+ "status": "confirmed"
116
+ }
117
+ ],
118
+ "hard_questions": [],
119
+ "links": []
120
+ },
121
+ {
122
+ "id": "c8",
123
+ "kind": "decision",
124
+ "text": "Transport is message-first: a small message core (send, receive/subscribe, identity) with presence (join/part/who) as an OPTIONAL capability that async transports omit. Adopted from day one regardless of the colleague question, per the charter's stated safe bet.",
125
+ "origin": "llm",
126
+ "status": "confirmed",
127
+ "honesty_conditions": [
128
+ {
129
+ "id": "h4",
130
+ "text": "the message-first core supports an async/no-presence transport without changing the Transport signature \u2014 verifiable by sketching the agtag shape against it.",
131
+ "status": "confirmed"
132
+ }
133
+ ],
134
+ "hard_questions": [],
135
+ "links": []
136
+ },
137
+ {
138
+ "id": "c9",
139
+ "kind": "requirement",
140
+ "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.",
141
+ "origin": "llm",
142
+ "status": "confirmed",
143
+ "honesty_conditions": [
144
+ {
145
+ "id": "h5",
146
+ "text": "a downstream pack can implement Transport/Harness against only agent_lifecycle's public exports, with no import from a sibling pack.",
147
+ "status": "confirmed"
148
+ }
149
+ ],
150
+ "hard_questions": [],
151
+ "links": []
152
+ },
153
+ {
154
+ "id": "c10",
155
+ "kind": "non_goal",
156
+ "text": "Presence-first transport design, and any real network transport (IRC/Slack/agtag) \u2014 the only concrete implementations in this increment are in-process reference doubles used to prove the seam.",
157
+ "origin": "llm",
158
+ "status": "confirmed",
159
+ "honesty_conditions": [],
160
+ "hard_questions": [],
161
+ "links": []
162
+ },
163
+ {
164
+ "id": "c11",
165
+ "kind": "decision",
166
+ "text": "Resolved (was the charter open question): colleague's agents are live, process-backed, streaming harnesses like Claude Code and Codex \u2014 the same family as cultureagent's backends. So every proving harness is real-time/request-reply; async-durable-no-presence is purely a TRANSPORT capability (only agtag), never a Harness one. The Harness interface must therefore support a long-lived, streaming-capable brain; presence stays a transport-only optional mixin.",
167
+ "origin": "llm",
168
+ "status": "confirmed",
169
+ "honesty_conditions": [
170
+ {
171
+ "id": "h6",
172
+ "text": "The Harness interface can express a process-backed streaming brain (start/feed-message/stream-reply/stop) without assuming any transport, and no Harness method takes presence as a parameter.",
173
+ "status": "confirmed"
174
+ }
175
+ ],
176
+ "hard_questions": [],
177
+ "links": []
178
+ }
179
+ ],
180
+ "open_vagueness": []
181
+ }
@@ -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
+ }
@@ -228,3 +228,11 @@ __marimo__/
228
228
 
229
229
  # Per-machine skills config (copy from skills.local.yaml.example)
230
230
  skills.local.yaml
231
+
232
+ # devague working state (not committed by default)
233
+ .devague/reviews/
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.
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,42 @@ 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
+
26
+ ## [0.2.2] - 2026-06-10
27
+
28
+ ### Added
29
+
30
+ - **Converged devague spec for the first build increment of issue #1 /
31
+ guildmaster#61** (`docs/specs/2026-06-09-agent-lifecycle-v0-3-ships-the-two-pluggable-seam.md`,
32
+ with the frame state under `.devague/frames/`). Scopes the extraction's *start*
33
+ to: define the `Transport` (message-first, presence optional) and `Harness`
34
+ interfaces, a minimal in-process supervisor, and reference echo doubles that
35
+ prove the seam end-to-end — with **no** cultureagent backend extraction and
36
+ **no** real IRC/Slack/agtag transport in this increment. Resolves the charter's
37
+ open question: colleague's agents are live, process-backed streaming harnesses
38
+ (like Claude Code / Codex), so async-no-presence is a transport-only concern.
39
+
40
+ ### Changed
41
+
42
+ ### Fixed
43
+
8
44
  ## [0.2.1] - 2026-06-10
9
45
 
10
46
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-lifecycle
3
- Version: 0.2.1
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
@@ -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)
@@ -0,0 +1,50 @@
1
+ # agent-lifecycle v0.3 — the two pluggable seam interfaces (Transport + Harness)
2
+
3
+ > 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.
4
+
5
+ ## Audience
6
+
7
+ - The cultureagent and colleague maintainers (the two proving harnesses) plus the charter reviewers (guildmaster#61) who need concrete code — not prose — to ratify the Transport/Harness seam.
8
+
9
+ ## Before → After
10
+
11
+ - Before: 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.
12
+ - After: 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.
13
+
14
+ ## Why it matters
15
+
16
+ - 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 — the coupling that blocks both cases today.
17
+
18
+ ## Requirements
19
+
20
+ - 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.
21
+ - honesty: a downstream pack can implement Transport/Harness against only agent_lifecycle's public exports, with no import from a sibling pack.
22
+
23
+ ## Honesty conditions
24
+
25
+ - The reference harness+transport demo runs in CI with no network and no optional culture/agentirc/Slack packages installed.
26
+ - The exported spec is directly consumable by the cultureagent + colleague maintainers as the ratification target: it names both proving harnesses and links guildmaster#61.
27
+ - round-trip is observable: an inbound message handed to the Harness produces an outbound message delivered back through the Transport, asserted by a test — not just an interface that type-checks.
28
+ - 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.
29
+ - With the core extracted, a colleague-on-Slack deployment can be composed with no agentirc/IRC/culture package anywhere in its dependency tree.
30
+ - This increment is shippable and reviewable with NO cultureagent source present in this repo — it adds only new in-repo modules + tests.
31
+ - 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).
32
+ - the message-first core supports an async/no-presence transport without changing the Transport signature — verifiable by sketching the agtag shape against it.
33
+ - The Harness interface can express a process-backed streaming brain (start/feed-message/stream-reply/stop) without assuming any transport, and no Harness method takes presence as a parameter.
34
+
35
+ ## Success signals
36
+
37
+ - 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.
38
+
39
+ ## Scope / boundaries
40
+
41
+ - 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.
42
+
43
+ ## Non-goals
44
+
45
+ - Presence-first transport design, and any real network transport (IRC/Slack/agtag) — the only concrete implementations in this increment are in-process reference doubles used to prove the seam.
46
+
47
+ ## Decisions
48
+
49
+ - Transport is message-first: a small message core (send, receive/subscribe, identity) with presence (join/part/who) as an OPTIONAL capability that async transports omit. Adopted from day one regardless of the colleague question, per the charter's stated safe bet.
50
+ - Resolved (was the charter open question): colleague's agents are live, process-backed, streaming harnesses like Claude Code and Codex — the same family as cultureagent's backends. So every proving harness is real-time/request-reply; async-durable-no-presence is purely a TRANSPORT capability (only agtag), never a Harness one. The Harness interface must therefore support a long-lived, streaming-capable brain; presence stays a transport-only optional mixin.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agent-lifecycle"
3
- version = "0.2.1"
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"
@@ -4,7 +4,7 @@ requires-python = ">=3.12"
4
4
 
5
5
  [[package]]
6
6
  name = "agent-lifecycle"
7
- version = "0.2.1"
7
+ version = "0.2.3"
8
8
  source = { editable = "." }
9
9
 
10
10
  [package.dev-dependencies]
File without changes
File without changes