guild-cli 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. guild_cli-0.3.0/.claude/skills/onboard/SKILL.md +40 -0
  2. guild_cli-0.3.0/.claude/skills/onboard/scripts/onboard.sh +17 -0
  3. guild_cli-0.3.0/.claude/skills/teach/SKILL.md +32 -0
  4. guild_cli-0.3.0/.claude/skills/teach/scripts/teach.sh +17 -0
  5. guild_cli-0.3.0/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +440 -0
  6. guild_cli-0.3.0/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +344 -0
  7. {guild_cli-0.2.0 → guild_cli-0.3.0}/.gitignore +3 -0
  8. {guild_cli-0.2.0 → guild_cli-0.3.0}/.markdownlint-cli2.yaml +7 -0
  9. {guild_cli-0.2.0 → guild_cli-0.3.0}/CHANGELOG.md +33 -0
  10. {guild_cli-0.2.0 → guild_cli-0.3.0}/CLAUDE.md +21 -0
  11. {guild_cli-0.2.0 → guild_cli-0.3.0}/PKG-INFO +32 -1
  12. {guild_cli-0.2.0 → guild_cli-0.3.0}/README.md +31 -0
  13. guild_cli-0.3.0/docs/cutover.md +43 -0
  14. guild_cli-0.3.0/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +87 -0
  15. guild_cli-0.3.0/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +75 -0
  16. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/__init__.py +4 -0
  17. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_commands/__init__.py +8 -0
  18. guild_cli-0.3.0/guild/cli/_commands/_broadcast.py +92 -0
  19. guild_cli-0.3.0/guild/cli/_commands/onboard.py +178 -0
  20. guild_cli-0.3.0/guild/cli/_commands/teach.py +158 -0
  21. guild_cli-0.3.0/guild/skills/__init__.py +28 -0
  22. guild_cli-0.3.0/guild/skills/identity.py +85 -0
  23. guild_cli-0.3.0/guild/skills/ledger.py +347 -0
  24. guild_cli-0.3.0/guild/skills/render.py +127 -0
  25. guild_cli-0.3.0/guild/skills/sources.py +103 -0
  26. {guild_cli-0.2.0 → guild_cli-0.3.0}/pyproject.toml +1 -1
  27. guild_cli-0.3.0/tests/test_broadcast_post.py +47 -0
  28. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/test_cli_explain.py +11 -0
  29. guild_cli-0.3.0/tests/test_cli_onboard.py +127 -0
  30. guild_cli-0.3.0/tests/test_cli_teach.py +112 -0
  31. guild_cli-0.3.0/tests/test_skills_identity.py +108 -0
  32. guild_cli-0.3.0/tests/test_skills_ledger.py +201 -0
  33. guild_cli-0.3.0/tests/test_skills_render.py +102 -0
  34. guild_cli-0.3.0/tests/test_skills_sources.py +170 -0
  35. {guild_cli-0.2.0 → guild_cli-0.3.0}/uv.lock +1 -1
  36. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  37. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  38. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/cicd/SKILL.md +0 -0
  39. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  40. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  41. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  42. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  43. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  44. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/SKILL.md +0 -0
  45. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  46. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  47. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  48. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  49. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  50. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  51. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  52. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  53. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  54. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  55. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/run-tests/SKILL.md +0 -0
  56. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  57. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  58. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  59. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  60. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  61. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/think/SKILL.md +0 -0
  62. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/think/scripts/think.sh +0 -0
  63. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/version-bump/SKILL.md +0 -0
  64. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  65. {guild_cli-0.2.0 → guild_cli-0.3.0}/.claude/skills.local.yaml.example +0 -0
  66. {guild_cli-0.2.0 → guild_cli-0.3.0}/.flake8 +0 -0
  67. {guild_cli-0.2.0 → guild_cli-0.3.0}/.github/workflows/publish.yml +0 -0
  68. {guild_cli-0.2.0 → guild_cli-0.3.0}/.github/workflows/tests.yml +0 -0
  69. {guild_cli-0.2.0 → guild_cli-0.3.0}/LICENSE +0 -0
  70. {guild_cli-0.2.0 → guild_cli-0.3.0}/culture.yaml +0 -0
  71. {guild_cli-0.2.0 → guild_cli-0.3.0}/docs/skill-sources.md +0 -0
  72. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/__init__.py +0 -0
  73. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/__main__.py +0 -0
  74. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_commands/explain.py +0 -0
  75. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_commands/learn.py +0 -0
  76. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_commands/whoami.py +0 -0
  77. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_errors.py +0 -0
  78. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_output.py +0 -0
  79. {guild_cli-0.2.0 → guild_cli-0.3.0}/guild/cli/_repo.py +0 -0
  80. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/__init__.py +0 -0
  81. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/test_cli.py +0 -0
  82. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/test_cli_learn.py +0 -0
  83. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/test_cli_whoami.py +0 -0
  84. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/test_skills_convention.py +0 -0
  85. {guild_cli-0.2.0 → guild_cli-0.3.0}/tests/test_version_fallback.py +0 -0
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: onboard
3
+ description: Onboard a brand-new sibling agent into the AgentCulture mesh — guildmaster's new-agent ceremony for supplier operators. Files ONE consolidated issue (full canonical kit as per-skill sections + an identity-setup section), registers the agent in the ledger, and records the pins it should vendor. Dry-run by default; --apply files. Use when an operator says "onboard a new agent/sibling" or "welcome a new repo to the mesh".
4
+ type: command
5
+ ---
6
+
7
+ # onboard — welcome a brand-new sibling agent
8
+
9
+ `onboard` is guildmaster's new-agent ceremony, for **supplier operators**
10
+ bringing a brand-new **sibling repo** into the mesh. It wraps the
11
+ `guild onboard` CLI verb.
12
+
13
+ It is `teach` of the **whole canonical kit** in new framing, plus the
14
+ new-agent bookkeeping:
15
+
16
+ - one consolidated GitHub issue — every canonical skill as a per-skill section
17
+ (inbound skills, e.g. the devague trio, carry an origin-attribution block) —
18
+ followed by an **identity-setup section** (culture.yaml + backend + prompt
19
+ file, so the sibling passes `steward doctor`);
20
+ - **ledger registration** — the agent is added to `docs/skill-sources.md` as a
21
+ downstream consumer of every canonical skill (idempotent);
22
+ - a **verification record** — the pins the sibling is expected to vendor.
23
+
24
+ **Dry-run by default**: it renders the issue, the ledger diff it *would* apply,
25
+ and the verification record — writing nothing. `--apply` files the issue, writes
26
+ the ledger, and records the pins. Going live is gated on the steward→guildmaster
27
+ cutover (`docs/cutover.md`).
28
+
29
+ ## How to run
30
+
31
+ ```bash
32
+ # Render the full onboarding ceremony (dry-run):
33
+ bash .claude/skills/onboard/scripts/onboard.sh --agent agentculture/newsib
34
+
35
+ # Commit it — file the issue, write the ledger, record the pins:
36
+ bash .claude/skills/onboard/scripts/onboard.sh --agent agentculture/newsib --apply
37
+ ```
38
+
39
+ A bare `--agent` name gets the `--org` prefix (default `agentculture`).
40
+ `--json` emits a structured payload.
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ # onboard — forward to `guild onboard`, resolving the CLI portably.
4
+ #
5
+ # Prefers an installed `guild` on PATH (the normal case), falling back to
6
+ # `uv run guild` inside a source checkout. Every argument is forwarded verbatim.
7
+ # Dry-run is the CLI's default; pass --apply to file the issue + write the
8
+ # ledger + record the pins.
9
+
10
+ if command -v guild >/dev/null 2>&1; then
11
+ exec guild onboard "$@"
12
+ elif command -v uv >/dev/null 2>&1; then
13
+ exec uv run guild onboard "$@"
14
+ fi
15
+
16
+ echo "guild not found on PATH. Install it: uv tool install guild-cli" >&2
17
+ exit 2
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: teach
3
+ description: Teach a set of skills to a set of AgentCulture mesh agents — guildmaster's supplier verb for operators propagating skills to sibling agents. Files one agent-major GitHub issue per target (per-skill sections bundled), new-vs-resync auto-detected from the ledger. Dry-run by default; --apply files. Use when an operator says "teach these skills to those agents", "broadcast a skill update", or "resync vendored skills".
4
+ type: command
5
+ ---
6
+
7
+ # teach — propagate a set of skills to a set of mesh agents
8
+
9
+ `teach` is guildmaster's supplier verb. The audience is **supplier operators**
10
+ (guildmaster itself; steward during the transition) targeting **sibling repos**
11
+ in the mesh. It wraps the `guild teach` CLI verb.
12
+
13
+ It is **agent-major**: one GitHub issue per target agent, bundling a per-skill
14
+ *section* for every skill that agent receives — not one issue per skill.
15
+ New-vs-resync framing is auto-detected per `(skill, agent)` from
16
+ `docs/skill-sources.md`. **Dry-run by default**; pass `--apply` to file the
17
+ issues. Going live is gated on the steward→guildmaster cutover (`docs/cutover.md`).
18
+
19
+ ## How to run
20
+
21
+ ```bash
22
+ # Render (dry-run) — what would be filed, nothing posted:
23
+ bash .claude/skills/teach/scripts/teach.sh --skill cicd --skill communicate --to tipalti
24
+
25
+ # Teach the full canonical kit to two agents and file the issues:
26
+ bash .claude/skills/teach/scripts/teach.sh --all --to daria --to tipalti --apply
27
+ ```
28
+
29
+ Skills must be selected explicitly (`--skill`, repeatable, or `--all`) — there
30
+ is no implicit default. Targets come from `--to` (bare names get `--org`,
31
+ default `agentculture`), falling back to the ledger's current consumers per
32
+ skill when `--to` is omitted. `--json` emits a structured payload.
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ # teach — forward to `guild teach`, resolving the CLI portably.
4
+ #
5
+ # Prefers an installed `guild` on PATH (the normal case), falling back to
6
+ # `uv run guild` inside a source checkout. Every argument is forwarded verbatim,
7
+ # so this wrapper exists only for portable resolution + discoverability as a
8
+ # skill. Dry-run is the CLI's default; pass --apply to file issues.
9
+
10
+ if command -v guild >/dev/null 2>&1; then
11
+ exec guild teach "$@"
12
+ elif command -v uv >/dev/null 2>&1; then
13
+ exec uv run guild teach "$@"
14
+ fi
15
+
16
+ echo "guild not found on PATH. Install it: uv tool install guild-cli" >&2
17
+ exit 2
@@ -0,0 +1,440 @@
1
+ {
2
+ "slug": "guildmaster-ships-teach-and-onboard-two-agent-firs",
3
+ "title": "guildmaster ships /teach and /onboard: two agent-first verbs layered over its announce-skill-update broadcast. 'guild teach' pushes a chosen SET of skills to a chosen SET of mesh agents in one command; 'guild onboard' welcomes a brand-new sibling agent with the full canonical skill kit, an identity-setup brief, ledger registration, and post-onboard verification. Both default to dry-run; --apply files the issues.",
4
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-05-24T08:45:11Z",
7
+ "updated": "2026-05-24T09:21:31Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "guildmaster ships /teach and /onboard: two agent-first verbs layered over its announce-skill-update broadcast. 'guild teach' pushes a chosen SET of skills to a chosen SET of mesh agents in one command; 'guild onboard' welcomes a brand-new sibling agent with the full canonical skill kit, an identity-setup brief, ledger registration, and post-onboard verification. Both default to dry-run; --apply files the issues.",
13
+ "origin": "user",
14
+ "status": "confirmed",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h1",
18
+ "text": "teach/onboard add NO new posting or templating logic \u2014 every issue is produced by announce-skill-update. Round-trip: 'onboard X' == 'teach <all-canonical> --new --to X' + ledger registration + verification record.",
19
+ "status": "rejected"
20
+ },
21
+ {
22
+ "id": "h8",
23
+ "text": "onboard X == teach <all-canonical> to X in NEW framing + ledger registration + verification record. teach is the single rendering+posting engine; onboard adds only kit-selection + bookkeeping. No separate broadcast path (no announce-skill-update verb) exists.",
24
+ "status": "confirmed"
25
+ }
26
+ ],
27
+ "hard_questions": [
28
+ {
29
+ "id": "q1",
30
+ "text": "risk: If teach/onboard duplicate announce's posting/templating instead of composing it, the supplier ends up with two divergent broadcasters \u2014 exactly what #10's staged cutover forbids.",
31
+ "resolved": false,
32
+ "blocking": false
33
+ }
34
+ ],
35
+ "links": []
36
+ },
37
+ {
38
+ "id": "c2",
39
+ "kind": "decision",
40
+ "text": "Direction = OUTBOUND/push: teach and onboard file GitHub issues on target agents' repos via announce-skill-update; they never vendor skills into a local checkout.",
41
+ "origin": "user",
42
+ "status": "confirmed",
43
+ "honesty_conditions": [],
44
+ "hard_questions": [],
45
+ "links": []
46
+ },
47
+ {
48
+ "id": "c3",
49
+ "kind": "decision",
50
+ "text": "Build layer = CLI verbs + skill wrappers: 'guild teach' and 'guild onboard' are CLI verbs that COMPOSE announce-skill-update (#10); /teach and /onboard are thin SKILL.md wrappers over them.",
51
+ "origin": "user",
52
+ "status": "rejected",
53
+ "honesty_conditions": [],
54
+ "hard_questions": [],
55
+ "links": []
56
+ },
57
+ {
58
+ "id": "c4",
59
+ "kind": "decision",
60
+ "text": "Onboard scope = ledger + identity + verify: beyond firing the kit, onboard (a) registers the new agent in docs/skill-sources.md, (b) includes an identity-setup section in the brief (culture.yaml + backend + prompt file), (c) records post-onboard verification state.",
61
+ "origin": "user",
62
+ "status": "confirmed",
63
+ "honesty_conditions": [],
64
+ "hard_questions": [],
65
+ "links": []
66
+ },
67
+ {
68
+ "id": "c5",
69
+ "kind": "decision",
70
+ "text": "Safe-by-default: both verbs default to dry-run (render briefs + show ledger/verification diffs); --apply files issues and writes the ledger (CLAUDE.md agent-first rule).",
71
+ "origin": "user",
72
+ "status": "confirmed",
73
+ "honesty_conditions": [],
74
+ "hard_questions": [],
75
+ "links": []
76
+ },
77
+ {
78
+ "id": "c6",
79
+ "kind": "audience",
80
+ "text": "AgentCulture mesh operators and resident supplier agents (guildmaster itself; steward during transition). Each verb's TARGET is a sibling repo/agent: an existing consumer (teach=resync) or a brand-new sibling (onboard).",
81
+ "origin": "llm",
82
+ "status": "confirmed",
83
+ "honesty_conditions": [
84
+ {
85
+ "id": "h11",
86
+ "text": "Any real user of these verbs is always a supplier-agent operator running guildmaster, targeting a sibling repo that is either an existing ledger consumer (teach) or a brand-new sibling (onboard) \u2014 no other actor type needs teach/onboard.",
87
+ "status": "confirmed"
88
+ }
89
+ ],
90
+ "hard_questions": [],
91
+ "links": []
92
+ },
93
+ {
94
+ "id": "c7",
95
+ "kind": "after_state",
96
+ "text": "An operator runs ONE command to propagate N skills to M agents (teach) or to fully onboard a new sibling (onboard) \u2014 instead of hand-running announce-skill-update once per skill, hand-editing the ledger, and hand-writing a welcome brief.",
97
+ "origin": "llm",
98
+ "status": "confirmed",
99
+ "honesty_conditions": [
100
+ {
101
+ "id": "h12",
102
+ "text": "The full propagation (N skills x M agents) or onboarding ceremony completes from a SINGLE command invocation \u2014 no manual per-skill or per-agent follow-up step remains afterward.",
103
+ "status": "confirmed"
104
+ }
105
+ ],
106
+ "hard_questions": [],
107
+ "links": []
108
+ },
109
+ {
110
+ "id": "c8",
111
+ "kind": "before_state",
112
+ "text": "Only the announce-skill-update atom exists (one skill -> N consumers from the ledger). Teaching a SET of skills is a manual loop; standing up a new agent means manual ledger edits + an ad-hoc onboarding brief (e.g. issue #1, hand-written by steward) + no verification step.",
113
+ "origin": "llm",
114
+ "status": "rejected",
115
+ "honesty_conditions": [],
116
+ "hard_questions": [],
117
+ "links": []
118
+ },
119
+ {
120
+ "id": "c9",
121
+ "kind": "why_it_matters",
122
+ "text": "guildmaster's charter (issue #1 \u00a71) is skills supplier/manager. 'Supply a set of skills' and 'onboard a new consumer' are its two headline verbs; they must be one-shot, safe-by-default, and leave the ledger correct \u2014 or the supplier role isn't real.",
123
+ "origin": "llm",
124
+ "status": "confirmed",
125
+ "honesty_conditions": [
126
+ {
127
+ "id": "h13",
128
+ "text": "Without one-shot teach + onboard, guildmaster cannot credibly own the supplier role: the ledger drifts or onboarding stays manual. The two verbs are necessary, not nice-to-have, for the #1 \u00a71 charter.",
129
+ "status": "confirmed"
130
+ }
131
+ ],
132
+ "hard_questions": [],
133
+ "links": []
134
+ },
135
+ {
136
+ "id": "c10",
137
+ "kind": "non_goal",
138
+ "text": "NOT a reimplementation of broadcast/templating/posting \u2014 teach/onboard compose announce-skill-update; #10 is a hard dependency.",
139
+ "origin": "llm",
140
+ "status": "rejected",
141
+ "honesty_conditions": [],
142
+ "hard_questions": [],
143
+ "links": []
144
+ },
145
+ {
146
+ "id": "c11",
147
+ "kind": "non_goal",
148
+ "text": "NOT inbound vendoring \u2014 onboard pushes issues to the new sibling; it never edits the target repo's files or copies skills into a local checkout.",
149
+ "origin": "llm",
150
+ "status": "confirmed",
151
+ "honesty_conditions": [],
152
+ "hard_questions": [],
153
+ "links": []
154
+ },
155
+ {
156
+ "id": "c12",
157
+ "kind": "non_goal",
158
+ "text": "NOT remote identity creation \u2014 'identity scaffold' is a setup SECTION IN THE BRIEF the new sibling follows; guildmaster never writes their culture.yaml/prompt files.",
159
+ "origin": "llm",
160
+ "status": "confirmed",
161
+ "honesty_conditions": [],
162
+ "hard_questions": [],
163
+ "links": []
164
+ },
165
+ {
166
+ "id": "c13",
167
+ "kind": "boundary",
168
+ "text": "Runs only AFTER the staged steward->guildmaster broadcaster cutover (#10) \u2014 not a second live broadcaster; no two competing ledgers mid-migration.",
169
+ "origin": "llm",
170
+ "status": "confirmed",
171
+ "honesty_conditions": [
172
+ {
173
+ "id": "h14",
174
+ "text": "teach/onboard going live is GATED on the steward->guildmaster cutover; running them while steward still broadcasts would double-post, so neither the verbs nor the operator broadcast competitively before cutover.",
175
+ "status": "confirmed"
176
+ }
177
+ ],
178
+ "hard_questions": [],
179
+ "links": []
180
+ },
181
+ {
182
+ "id": "c14",
183
+ "kind": "success_signal",
184
+ "text": "'guild teach --skill cicd --skill communicate --to tipalti --dry-run' renders a correct six-section brief for BOTH skills (right script list + CHANGELOG excerpt); --apply files both issues and exits non-zero if any post fails.",
185
+ "origin": "llm",
186
+ "status": "rejected",
187
+ "honesty_conditions": [],
188
+ "hard_questions": [],
189
+ "links": []
190
+ },
191
+ {
192
+ "id": "c15",
193
+ "kind": "success_signal",
194
+ "text": "'guild onboard --agent agentculture/newsib --dry-run' renders: the full canonical kit as new-briefs (devague trio carrying --origin agentculture/devague), an identity-setup section, the ledger diff that WOULD register newsib, and the verification record that WOULD be created; --apply does all of it.",
195
+ "origin": "llm",
196
+ "status": "rejected",
197
+ "honesty_conditions": [],
198
+ "hard_questions": [],
199
+ "links": []
200
+ },
201
+ {
202
+ "id": "c16",
203
+ "kind": "requirement",
204
+ "text": "teach loops announce-skill-update over the chosen skill set; per-skill targeting resolves from the ledger unless --to overrides (matching announce's own targeting contract).",
205
+ "origin": "llm",
206
+ "status": "rejected",
207
+ "honesty_conditions": [
208
+ {
209
+ "id": "h2",
210
+ "text": "teaching skills [A,B] to agents [X,Y] files exactly the same issues as 'announce-skill-update --skill A --to X --to Y' then '--skill B --to X --to Y' \u2014 no extra or missing posts.",
211
+ "status": "rejected"
212
+ }
213
+ ],
214
+ "hard_questions": [],
215
+ "links": []
216
+ },
217
+ {
218
+ "id": "c17",
219
+ "kind": "requirement",
220
+ "text": "onboard fires the FULL canonical set in --new framing, passing --origin agentculture/devague for the inbound trio (think/spec-to-plan/assign-to-workforce).",
221
+ "origin": "llm",
222
+ "status": "rejected",
223
+ "honesty_conditions": [
224
+ {
225
+ "id": "h3",
226
+ "text": "a newly-onboarded sibling sees the devague trio attributed to agentculture/devague (origin block present) with guildmaster as re-broadcaster, preserving the inbound/outbound distinction the ledger tracks.",
227
+ "status": "rejected"
228
+ }
229
+ ],
230
+ "hard_questions": [],
231
+ "links": []
232
+ },
233
+ {
234
+ "id": "c18",
235
+ "kind": "requirement",
236
+ "text": "onboard --apply registers the new agent in the downstream column of every canonical skill row in docs/skill-sources.md, idempotently (a second run is a no-op).",
237
+ "origin": "llm",
238
+ "status": "confirmed",
239
+ "honesty_conditions": [
240
+ {
241
+ "id": "h4",
242
+ "text": "after onboard --apply, docs/skill-sources.md lists the new agent in the downstream column of every canonical skill row; a second run changes zero bytes (idempotent, no duplicate entries).",
243
+ "status": "confirmed"
244
+ }
245
+ ],
246
+ "hard_questions": [],
247
+ "links": []
248
+ },
249
+ {
250
+ "id": "c19",
251
+ "kind": "requirement",
252
+ "text": "For each (skill, agent) pair, new-vs-resync framing is auto-detected from the ledger: existing consumer -> resync brief, new -> new brief; teach/onboard never post a 'new' brief to an existing consumer.",
253
+ "origin": "llm",
254
+ "status": "confirmed",
255
+ "honesty_conditions": [
256
+ {
257
+ "id": "h5",
258
+ "text": "for each (skill, agent): if the agent already appears in that skill's ledger downstream -> resync framing, else -> new framing; never a 'new' brief to an existing consumer, never a 'resync' to a stranger.",
259
+ "status": "confirmed"
260
+ }
261
+ ],
262
+ "hard_questions": [],
263
+ "links": []
264
+ },
265
+ {
266
+ "id": "c20",
267
+ "kind": "requirement",
268
+ "text": "onboard's brief includes an identity-setup section so a new sibling can pass steward doctor's prompt-file-present + backend-consistency invariants.",
269
+ "origin": "llm",
270
+ "status": "confirmed",
271
+ "honesty_conditions": [
272
+ {
273
+ "id": "h6",
274
+ "text": "a sibling that follows the onboard brief's identity section ends up with a culture.yaml + matching prompt file that 'steward doctor --scope self' accepts (prompt-file-present + backend-consistency pass).",
275
+ "status": "confirmed"
276
+ }
277
+ ],
278
+ "hard_questions": [],
279
+ "links": []
280
+ },
281
+ {
282
+ "id": "c21",
283
+ "kind": "requirement",
284
+ "text": "With no --apply, neither verb posts an issue or mutates the ledger/verification state; both print exactly what they WOULD do and exit 0.",
285
+ "origin": "llm",
286
+ "status": "confirmed",
287
+ "honesty_conditions": [
288
+ {
289
+ "id": "h7",
290
+ "text": "with no --apply, an issue/filesystem diff shows zero changes \u2014 no issue created, no ledger byte mutated \u2014 and exit code is 0.",
291
+ "status": "confirmed"
292
+ }
293
+ ],
294
+ "hard_questions": [],
295
+ "links": []
296
+ },
297
+ {
298
+ "id": "c22",
299
+ "kind": "decision",
300
+ "text": "teach/onboard SUPERSEDE announce-skill-update: guildmaster ships NO separate verb by that name. teach (one skill -> one agent) covers the #10 broadcast case; teach/onboard own the rendering+posting+ledger machinery internally. The #10 broadcast ROLE is fulfilled \u2014 reconcile its literal acceptance criteria with steward via a reply on #10.",
301
+ "origin": "user",
302
+ "status": "confirmed",
303
+ "honesty_conditions": [],
304
+ "hard_questions": [],
305
+ "links": []
306
+ },
307
+ {
308
+ "id": "c23",
309
+ "kind": "decision",
310
+ "text": "Issue granularity = AGENT-MAJOR: one issue per target agent, bundling all relevant skills as per-skill sections (teach: every taught skill; onboard: all canonical + an identity-setup section). NOT one issue per skill. (Resolves parked v2.)",
311
+ "origin": "user",
312
+ "status": "confirmed",
313
+ "honesty_conditions": [],
314
+ "hard_questions": [],
315
+ "links": []
316
+ },
317
+ {
318
+ "id": "c24",
319
+ "kind": "decision",
320
+ "text": "teach skill-selection has NO implicit default: skills are explicit via --skill (repeatable) and --all (= canonical set, explicit). Bare invocation with no skills selected -> error. Hidden defaults create unexpected results. (Resolves parked v3.)",
321
+ "origin": "user",
322
+ "status": "confirmed",
323
+ "honesty_conditions": [],
324
+ "hard_questions": [],
325
+ "links": []
326
+ },
327
+ {
328
+ "id": "c25",
329
+ "kind": "before_state",
330
+ "text": "Guildmaster has NO broadcast capability of its own yet; steward holds the live broadcaster. Teaching a SET of skills or standing up a NEW agent is fully manual: hand-rendered briefs, hand-edited ledger, ad-hoc onboarding (e.g. issue #1), no verification step.",
331
+ "origin": "llm",
332
+ "status": "confirmed",
333
+ "honesty_conditions": [
334
+ {
335
+ "id": "h15",
336
+ "text": "Today guildmaster has no broadcast verb of its own and no command performs set-level teaching or onboarding \u2014 the work is provably manual (demonstrable by the absence of such a verb in the CLI).",
337
+ "status": "confirmed"
338
+ }
339
+ ],
340
+ "hard_questions": [],
341
+ "links": []
342
+ },
343
+ {
344
+ "id": "c26",
345
+ "kind": "requirement",
346
+ "text": "teach renders ONE agent-major issue per target agent: for each agent, compose a per-skill section (script-list + CHANGELOG excerpt + cite locations \u2014 lifting steward's announce templates as per-skill SECTIONS) for every taught skill into a single issue, posted via agtag. Targeting from --to, falling back to the ledger per skill.",
347
+ "origin": "llm",
348
+ "status": "confirmed",
349
+ "honesty_conditions": [
350
+ {
351
+ "id": "h9",
352
+ "text": "teaching skills [A,B] to agents [X,Y] files exactly TWO issues \u2014 one to X, one to Y \u2014 each bundling an A-section AND a B-section; never one issue per skill, never a separate per-skill broadcast call.",
353
+ "status": "confirmed"
354
+ }
355
+ ],
356
+ "hard_questions": [],
357
+ "links": []
358
+ },
359
+ {
360
+ "id": "c27",
361
+ "kind": "requirement",
362
+ "text": "onboard reuses teach's rendering for the FULL canonical set in NEW framing, attributing the inbound trio (think/spec-to-plan/assign-to-workforce) to agentculture/devague as origin with guildmaster as re-broadcaster.",
363
+ "origin": "llm",
364
+ "status": "confirmed",
365
+ "honesty_conditions": [
366
+ {
367
+ "id": "h10",
368
+ "text": "an onboarded sibling sees the devague trio (think/spec-to-plan/assign-to-workforce) attributed to agentculture/devague (origin block present) with guildmaster as re-broadcaster, rendered as sections within the single onboarding issue.",
369
+ "status": "confirmed"
370
+ }
371
+ ],
372
+ "hard_questions": [],
373
+ "links": []
374
+ },
375
+ {
376
+ "id": "c28",
377
+ "kind": "success_signal",
378
+ "text": "'guild teach --skill cicd --skill communicate --to tipalti' (dry-run) renders ONE issue to tipalti containing BOTH a cicd section and a communicate section (each with correct script-list + CHANGELOG excerpt); --apply files that single issue; non-zero exit on any post failure.",
379
+ "origin": "llm",
380
+ "status": "confirmed",
381
+ "honesty_conditions": [
382
+ {
383
+ "id": "h16",
384
+ "text": "The teach dry-run for two skills to one agent emits exactly ONE issue body containing two correctly-rendered per-skill sections \u2014 verifiable by inspecting the rendered markdown without posting anything.",
385
+ "status": "confirmed"
386
+ }
387
+ ],
388
+ "hard_questions": [],
389
+ "links": []
390
+ },
391
+ {
392
+ "id": "c29",
393
+ "kind": "success_signal",
394
+ "text": "'guild onboard --agent agentculture/newsib' (dry-run) renders ONE consolidated onboarding issue: every canonical skill as a section (devague trio attributed to agentculture/devague) + an identity-setup section + the ledger diff that WOULD register newsib + the verification record; --apply files the one issue, writes the ledger, records pins.",
395
+ "origin": "llm",
396
+ "status": "confirmed",
397
+ "honesty_conditions": [
398
+ {
399
+ "id": "h17",
400
+ "text": "The onboard dry-run emits exactly ONE issue body (all canonical sections + identity section) PLUS a shown-but-unapplied ledger diff and a verification record \u2014 all artifacts present in output, none posted or written.",
401
+ "status": "confirmed"
402
+ }
403
+ ],
404
+ "hard_questions": [],
405
+ "links": []
406
+ }
407
+ ],
408
+ "open_vagueness": [
409
+ {
410
+ "id": "v1",
411
+ "text": "Build-order dependency: announce-skill-update (#10) is NOT built yet. teach/onboard are specced against its documented contract but cannot RUN until it lands \u2014 build #10 first or in the same effort.",
412
+ "kind": "follow_up",
413
+ "claim_id": null
414
+ },
415
+ {
416
+ "id": "v2",
417
+ "text": "Onboard brief shape: one consolidated onboarding issue (all skills + identity in one) vs N per-skill new-briefs (announce's native atom) + one umbrella identity issue. Affects how spammy onboarding a new repo is. Decide in planning.",
418
+ "kind": "unknown_nonblocking",
419
+ "claim_id": null
420
+ },
421
+ {
422
+ "id": "v3",
423
+ "text": "teach skill-selection UX: --skill NAME (repeatable) + --all (canonical set) + default-with-no-skills behavior (error vs all). Minor surface detail.",
424
+ "kind": "unknown_nonblocking",
425
+ "claim_id": null
426
+ },
427
+ {
428
+ "id": "v4",
429
+ "text": "Skill version-tracking surface and announce-skill-update internals are owned elsewhere (#10 + a version-tracking issue), not by teach/onboard.",
430
+ "kind": "out_of_scope",
431
+ "claim_id": null
432
+ },
433
+ {
434
+ "id": "v5",
435
+ "text": "Reply on issue #10 to reconcile: guildmaster fulfills the broadcast ROLE via teach/onboard (agent-major), NOT a verb named announce-skill-update with #10's exact flag surface; coordinate the steward->guildmaster cutover on that basis. (Supersedes the now-stale v1.)",
436
+ "kind": "follow_up",
437
+ "claim_id": null
438
+ }
439
+ ]
440
+ }