Skip to content

feat: make Pod the public roster surface - #5776

Merged
Hmbown merged 3 commits into
mainfrom
integrate/0912-pod-public-20260831
Aug 31, 2026
Merged

feat: make Pod the public roster surface#5776
Hmbown merged 3 commits into
mainfrom
integrate/0912-pod-public-20260831

Conversation

@Hmbown

@Hmbown Hmbown commented Aug 31, 2026

Copy link
Copy Markdown
Owner

Summary

  • make pod the canonical public CLI/TUI/setup vocabulary while keeping fleet compatibility aliases
  • separate durable /pod status from current-session /pod workers, and localize that boundary across all 15 complete TUI packs
  • add canonical /docs/pod, permanently redirect /docs/fleet, and align public/model-visible documentation
  • preserve Fleet wire, storage, schema, config, and migration identities

Closes #5775

Testing

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets --all-features --locked (not run locally)
  • cargo test --workspace --all-features --locked (not run locally)
  • scripts/dev-cargo.sh test -p codewhale-tui --all-features --locked fleet — 512 passed
  • focused current-session Pod-worker localization/render/status tests
  • focused CLI canonical-command and Lane public-vs-durable-domain tests
  • scripts/dev-cargo.sh check -p codewhale-tui -p codewhale-cli -p codewhale-lane --all-features --locked
  • python3 scripts/check-tui-locale-parity.py — 15/15 packs, 1,904 keys each
  • scripts/check-tui-product-vocabulary.sh
  • public protocol/storage invariant scans (.codewhale/fleet, schema fleet, /v1/fleet, [fleet], and --fleet remain internal contracts)
  • pnpm test — 41 files / 352 tests
  • pnpm check:docs
  • pnpm check:locales
  • pnpm lint
  • pnpm build — 642 static pages, including /docs/pod and the /docs/fleet redirect

Checklist

  • This PR adds a new layer/module/abstraction — it names or deletes the layer it replaces
  • Updated docs or comments as needed
  • Added or updated tests where relevant
  • Verified TUI behavior manually
  • Harvested/co-authored credit uses a GitHub numeric noreply address

Evidence boundary

This PR proves source-level vocabulary/dispatch behavior and the listed local checks only. It does not prove merge, release artifacts, deployment, provider qualification, billing, or customer acceptance.


Devin Review

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@claude

claude Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 2m 42s —— View job


Review: PR #5776 — feat: make Pod the public roster surface

Todo list

  • Gather context (diff, changed files, CLAUDE.md/AGENTS.md rules)
  • Understand request (code review only, per trigger comment)
  • Review correctness (logic, panics, exhaustive matches)
  • Review provider/model/route safety invariant (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608)
  • Review reuse/simplification/dead code
  • Review test coverage
  • Review security (secrets, shell/exec, input validation)
  • Post final review summary

Summary

This is a large (140 files, ~2.2k/1.5k) but disciplined rename: FleetPod as the public-facing noun, while carefully preserving the Fleet name as the durable wire/storage/CLI-alias contract (.codewhale/fleet.jsonl, fleets/<name>.toml, [fleet]/[fleets.*] config tables, --fleet flag, fleet.status control-plane id). I traced the diff file-by-file rather than trusting the diffstat, and did not find a place where the rename touched behavior instead of text.

Correctness — No bugs found. Every renamed literal I checked (error/help/system-prompt strings across crates/lane/src/control.rs, crates/tui/src/fleet/*.rs, crates/tui/src/tools/subagent/mod.rs, crates/tui/src/runtime_api.rs) has its corresponding assertion updated in the same commit, so nothing looks like it'll silently drift out of sync with its test. The new ControlDomain::public_name() (crates/lane/src/control.rs:146) is a clean addition that keeps as_str() (the serialization key) untouched — good separation. crates/cli/src/lib.rs's pod/fleet alias wiring dispatches both spellings through the identical Commands::Fleet variant and is backed by a direct dispatch-equality test.

Provider/model/route safety (EPIC #2608) — Not implicated. I specifically grepped the diff for .starts_with(/.contains( near provider-prefix patterns (deepseek, anthropic, openai, qwen) and found nothing new; the touched routing/authority code in exact.rs, worker_runtime.rs, runtime_api.rs only renames string literals, not the underlying provider/model resolution logic.

Reuse/simplification — Nothing to flag. The /pod status vs /pod workers split (durable ledger vs. current-session sub-agents) reuses the existing ControlOperation/subagents dispatch paths rather than adding a parallel mechanism, consistent with the module's stated contract in crates/tui/src/commands/groups/core/fleet.rs.

Tests — This is the strongest part of the PR. Notable additions:

  • crates/tui/src/localization.rs and crates/tui/src/tui/views/mod.rs: locale placeholder-parity tests for the new SubagentsCurrentSessionPodWorkers* message IDs across all 15 packs (I independently verified the {count} placeholder is present and consistent in every locale file for SubagentsCurrentSessionPodWorkersStatus).
  • web/lib/pod-public-surface.test.ts (new, 174 lines): a solid deterministic contract suite that reads the real sitemap/docs-map/search-index/docs files rather than asserting on mocks — checks the /docs/fleet/docs/pod 308 redirect, sitemap exclusion of the old URL, llms.txt, search resolving both "pod" and "fleet" queries to one page, and that docs/FLEET.md/docs/GUIDE.md literally document the compatibility boundary. I spot-checked several of its assertions (e.g. docs/GUIDE.md:361-364, docs/FLEET.md:21-32) against the actual doc text and they match.
  • CLI/TUI command-dispatch tests assert pod and fleet invocations produce byte-identical results, which is the right way to guard a compatibility alias against future drift.

Security — No secret handling, shell/exec policy, or input validation paths touched.

One thing worth double-checking before merge since it's outside what a source review can confirm: the PR body marks cargo clippy and cargo test --workspace as not run locally. Given the size of the locale-file edits (14 JSON files, hand-editable), I'd lean on CI's full cargo test --workspace and the locale-parity script actually running green rather than the local partial runs described in the PR body.

No inline comments filed — I didn't find any line-level issues to flag.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 potential issues.

Devin Review

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 Worker modal remains partly English

Localized worker titles now sit beside hard-coded English statuses, actions, and guidance. Non-English sessions still render a mixed-language /pod workers view.

(Refers to this code)

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread crates/tui/src/fleet/control.rs Outdated
Comment on lines 159 to 160
"pod: runs={} queued={} running={} completed={} partial={} failed={} restarted={} \
escalated={} transport_failed={} task_failed={} verifier_failed={} cancelled={} stale={}",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Compatibility receipts change labels

Running codewhale fleet status now emits pod: instead of fleet:. Existing scripts that parse the retained command's receipt output stop recognizing it.

Prompt for agents
Preserve the established machine-consumed Fleet spelling in receipt detail rendered by compatibility commands. status_lines and the resume detail currently changed fleet-prefixed labels to pod-prefixed labels, while ControlReceipt operation IDs and serialized domain identity intentionally remain fleet.*. Separate canonical user-facing presentation from compatibility receipt rendering, or retain the old labels in receipt payloads while presenting Pod elsewhere. Audit RunSummaryDto::render_detail for the same receipt-label contract.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@codewhale-agent codewhale-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codewhale review

PR #5776 renames public-facing Fleet vocabulary to Pod while preserving internal wire/storage/config identities. CLI aliases, lane control domain public_name, locale strings, and docs/skills are updated. However, the diff does not include any TUI source code that consumes the new localization keys or implements the claimed current-session /pod workers surface, suggesting the feature is incomplete.

Findings

  • [ERROR] Missing TUI implementation for /pod workers and new localization keys
    The PR adds new locale keys such as SubagentsNoCurrentSessionPodWorkers, SubagentsCurrentSessionPodWorkersTitle, SubagentsCurrentSessionPodWorkerRoles, and SubagentsCurrentSessionPodWorkersStatus, and changes existing strings to reference /pod workers. However, no changes are present in crates/tui/src or any other UI code that reads these keys or implements the /pod workers command. The strings are therefore dead, and the separation between durable /pod status and current-session /pod workers is not actually implemented. This blocks the claimed public surface.
  • [WARNING] RunSummaryDto::render_detail output label lacks test coverage (crates/lane/src/control.rs)
    The render_detail method now prints pod: instead of fleet:, but no unit test asserts this output. A future regression could easily reintroduce the old label while serialization remains fleet. Add a focused test verifying Fleet domain summaries render with pod: and that the serialized field name remains fleet.
  • [INFO] Skill file still named fleet-manager while content says Pod (crates/tui/assets/skills/fleet-manager/SKILL.md:3)
    The SKILL.md file remains under fleet-manager/ and its frontmatter name is still fleet-manager, but the description and body now use Pod. This may be intentional to preserve internal identity, but the mismatch could confuse model tool selection. Consider renaming the skill or adding a clarifying note.

Suggestions

  • crates/lane/src/control.rs — Add a unit test for RunSummaryDto::render_detail that constructs a Fleet-domain summary and asserts the output contains pod: and does not contain fleet: (except in serialized form). This will lock the public rendering change.
  • crates/tui/locales/es-419.json — The SetupOperateReviewHint was changed to a generic 'Enter registra esta instantánea de configuración.', losing the specific safety note about not probing plan limits, not writing credentials, and not changing Fleet/Pod configuration. If this was unintended, restore a Pod-specific version that retains those warnings to avoid reducing user-facing safety guidance.

Assessment

The PR delivers a thorough vocabulary rename across CLI, lane, docs, and locale files with solid CLI tests. However, it appears incomplete because the TUI code that should consume the new locale keys and implement the /pod workers current-session surface is absent. Merge should be blocked until the TUI implementation changes are included and covered by tests.


Advisory review by Codewhale (codewhale review --pr 5776 --post, head 2b7d65b76749d6e706de3a66ef93cb2235f9d621). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.

---
name: fleet-manager
description: Use when managing, triaging, restarting, escalating, or summarizing Codewhale Agent Fleet runs and workers.
description: Use when managing, triaging, restarting, escalating, or summarizing Codewhale Pod runs and workers.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[INFO] Skill file still named fleet-manager while content says Pod

The SKILL.md file remains under fleet-manager/ and its frontmatter name is still fleet-manager, but the description and body now use Pod. This may be intentional to preserve internal identity, but the mismatch could confuse model tool selection. Consider renaming the skill or adding a clarifying note.

CodeWhale Bot added 2 commits August 31, 2026 11:37
…ibility

Review-fix follow-up for the Pod public surface:

- /pod workers modal routes all previously hardcoded English through tr()
  with 38 new MessageIds across all 15 shipped locales; a zh-Hans render
  test asserts no English leakage.
- /pod workers means current-session sub-agents and /pod status the
  durable ledger, pinned per locale by a new localization test.
- Durable receipt detail prefixes restored to the established fleet:
  spelling (lane render_detail, tui status_lines, resume detail) with
  regression tests at both layers; serde wire keys unchanged.

Local proof (RUST_MIN_STACK=33554432, --locked): localization 49/49,
fleet::control 11/11, subagents 33/33, commands fleet group 13/13,
codewhale-lane 62/62; cargo fmt --check clean; locale key-set hash
identical across all 15 packs.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Resolve conflicts from merging 3d87d2f (Tideline shell integration, PR #5774):

- Locale JSONs (15 packs): union of both sides' keys — keep this branch's
  41 new/corrected Subagents* and session-vs-ledger wording values, and add
  main's Tideline keys (LaunchMenuChatCompact, LaunchMenuWorktreeCompact,
  PickerActionPin). Key sets verified identical across all packs.
- commands/groups/core/core.rs: keep this branch's 'Fetching current-session
  sub-agents...' assertion, matching the resolved en SubagentsFetching value
  read via tr(MessageId::SubagentsFetching).

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
@claude

claude Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 2m 28s —— View job


Review: PR #5776 — feat: make Pod the public roster surface

Todo list

  • Gather context (diff, changed files, CLAUDE.md/AGENTS.md rules)
  • Understand request (code review, per trigger comment)
  • Review correctness (logic, panics, exhaustive matches)
  • Review provider/model/route safety invariant (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608)
  • Review reuse/simplification/dead code
  • Review test coverage
  • Review security (secrets, shell/exec, input validation)
  • Post final review summary

Summary

This synchronize added commit 2a04291 ("fix(tui): localize pod workers modal and restore fleet receipt compatibility"), which is a direct, well-targeted follow-up to the two Devin findings and the Codewhale-agent ERROR/WARNING findings from the earlier review round. I traced this commit line-by-line against those findings rather than re-reviewing the whole diff from scratch.

Devin — "Worker modal remains partly English" → fixed. crates/tui/src/tui/views/mod.rs now routes every previously-hardcoded string in the /pod workers modal (status labels, summary line, group headings, action hints, header row, posture/role/branch detail lines) through tr() against 38 new MessageId variants. I verified:

  • All 38 new keys exist in all 15 shipped locale JSON files (checked directly, not just trusting the commit message).
  • Every placeholder-bearing key ({label}/{count}, {network}/{shell}/{write}, {branch}/{workspace}) carries the same placeholder set across all 15 locales — no locale silently drops a substitution.
  • The new subagents_modal_localizes_worker_rows_and_preserves_english_status_rendering test renders a zh-Hans buffer and asserts !zh_hans_text.contains("Running: 1"), which is exactly the right regression guard for the leak Devin flagged.
  • Where existing MessageIds already carried the right English string (AutomationRunStatusRunning = "running", SessionsActionClose = "close", CtxInspActionSelect = "select", ExtensionsActionFocus = "focus", SidebarStopControl = "stop"), the fix reuses them instead of adding duplicates — good instinct per the reuse/simplification priority.

Devin — "Compatibility receipts change labels" → fixed. crates/tui/src/fleet/control.rs reverts status_lines() and the resume detail back to the fleet:/fleet resume: prefixes, and crates/lane/src/control.rs's RunSummaryDto::render_detail reverts to self.domain.as_str() (fleet:) instead of public_name() (pod:). Both now carry doc comments explaining why the receipt layer stays on the old spelling (shared compatibility contract) while the command/slash-surface layer uses Pod — a clean separation of concerns.

Codewhale-agent — "Missing TUI implementation, dead locale keys" → resolved. This finding is now stale: the same commit is the missing TUI wiring. All new keys are consumed by mod.rs, not just declared.

Codewhale-agent — "render_detail lacks test coverage" → resolved. control.rs tests now assert detail.starts_with("fleet: run-1\n"), !detail.contains("\npod:"), and separately that the serde wire form still has fleet (not pod) as the field key — this pins both the presentation and the serialization boundary independently, which is the right level of granularity.

One pre-existing INFO item still open, non-blocking: the fleet-manager/ skill directory and its name: fleet-manager frontmatter (crates/tui/assets/skills/fleet-manager/SKILL.md) still use the Fleet spelling while the description/body now say Pod. Per AGENTS.md's compatibility-identifier rule this is arguably correct as-is (internal identifier, changes only via explicit migration), but flagging since the earlier review called it out and it wasn't addressed in this round — low priority either way.

Also checked and unaffected by this round: the SetupOperateReviewHint wording the Codewhale review flagged for es-419 turns out to be identical (short, non-safety-specific) in the English source and in all 15 locales — it's not an es-419-specific regression, just how that string already reads everywhere.

Provider/model/route safety (EPIC #2608): not implicated — this commit only touches TUI rendering/localization and receipt-label strings, no routing or provider-resolution logic.

Security: no secret handling, shell/exec, or input-validation paths touched.

No new issues found in this round. The fix commit is a solid, test-backed resolution of every actionable finding from the prior review pass.

@codewhale-agent codewhale-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codewhale review

The PR renames the public Fleet vocabulary to Pod across CLI, Lane, TUI, docs, and locales while preserving durable wire/storage/schema identities. Most changes are mechanical and backed by focused tests, but one documented TUI subcommand is not actually implemented.

Findings

  • [WARNING] /pod save-as is advertised in usage/help but has no implementation (crates/tui/src/commands/groups/core/fleet.rs:28)
    COMMAND_INFO.usage and the generated help text now list save-as, and the new info test explicitly asserts the usage string contains it. However FleetCmd::execute only matches save/update for route persistence and has no save-as (or save_as) arm. save-as falls through to ControlOperation::parse_verb and is rejected as Unknown /pod target 'save-as'. This is a user-facing command that cannot be invoked as documented. Add the matching arm and a behavioral test, or remove save-as from usage/help.
  • [INFO] Workspace clippy and full test suite not run
    The PR checklist indicates cargo clippy --workspace --all-targets --all-features --locked and cargo test --workspace --all-features --locked were not run locally. The change spans CLI, Lane, TUI, and 15 locale packs, so CI should run both before merging to catch any cross-crate issues not covered by focused tests.

Suggestions

  • crates/tui/src/commands/groups/core/fleet.rs:28 — Add a save-as match arm next to save/update that performs the saved-Pod 'save as' flow and add a behavioral test, or remove save-as from COMMAND_INFO.usage and help_text so the documented surface matches execution.

Assessment

Most of the mechanical Pod-rename work is well covered, including durability/serialization invariants and canonical command dispatch tests. The main correctness gap is the unimplemented save-as alias exposed in TUI usage and help; resolve that before merge and let CI run the full workspace checks.


Advisory review by Codewhale (codewhale review --pr 5776 --post, head 8efcd89cfd3f737c6da5a3977de01144164b2374). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.

@@ -27,23 +28,25 @@ use super::CommandResult;
pub(in crate::commands) const COMMAND_INFO: CommandInfo = CommandInfo {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[WARNING] /pod save-as is advertised in usage/help but has no implementation

COMMAND_INFO.usage and the generated help text now list save-as, and the new info test explicitly asserts the usage string contains it. However FleetCmd::execute only matches save/update for route persistence and has no save-as (or save_as) arm. save-as falls through to ControlOperation::parse_verb and is rejected as Unknown /pod target 'save-as'. This is a user-facing command that cannot be invoked as documented. Add the matching arm and a behavioral test, or remove save-as from usage/help.

@@ -27,23 +28,25 @@ use super::CommandResult;
pub(in crate::commands) const COMMAND_INFO: CommandInfo = CommandInfo {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a save-as match arm next to save/update that performs the saved-Pod 'save as' flow and add a behavioral test, or remove save-as from COMMAND_INFO.usage and help_text so the documented surface matches execution.

@Hmbown
Hmbown enabled auto-merge (squash) August 31, 2026 19:59
@Hmbown
Hmbown merged commit 84f42ae into main Aug 31, 2026
28 checks passed
@Hmbown
Hmbown deleted the integrate/0912-pod-public-20260831 branch August 31, 2026 20:10
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Unblock version-drift: #5776 landed on main without a CHANGELOG receipt,
which fails every subsequent PR. #5772 is the consent PR this branch ships.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Unblock version-drift: #5776 landed on main without a CHANGELOG receipt,
which fails every subsequent PR. #5767 is the public /signin /signup
/auth/callback fix this branch ships.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Feature commit 84f42ae (#5776) landed on main without a durable
release-note receipt, so Version drift failed after merging origin/main
into this branch. The gate requires #5776 in CHANGELOG.md.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown added a commit that referenced this pull request Aug 31, 2026
* fix(web): resolve public /signin /signup /auth/callback 404s

Bare auth URLs were locale-prefixed into /en/signin, /en/signup, and
/en/auth/callback, which had no pages. Keep sign-in and create-account
as locale-aware public routes that use the canonical mark and send the
person to the CWC app, hop OAuth callbacks to app.codewhale.net with
the query intact, and fold /login /register aliases. Local CLI use is
not presented as requiring an account.

Closes #5767

Signed-off-by: CodeWhale Bot <bot@codewhale.net>

* docs(changelog): record public auth routes and Pod receipts

Unblock version-drift: #5776 landed on main without a CHANGELOG receipt,
which fails every subsequent PR. #5767 is the public /signin /signup
/auth/callback fix this branch ships.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>

---------

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Co-authored-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Unblock version-drift: #5776 landed on main without a CHANGELOG receipt,
which fails every subsequent PR. #5772 is the consent PR this branch ships.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown pushed a commit that referenced this pull request Aug 31, 2026
Feature commit 84f42ae (#5776) landed on main without a durable
release-note receipt, so Version drift failed after merging origin/main
into this branch. The gate requires #5776 in CHANGELOG.md.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Hmbown added a commit that referenced this pull request Aug 31, 2026
* feat(tui): add provider-accepted Computer meter receipts

Bind v3 Computer admission (profile, 1x/2x/4x multiplier, account,
quote, expiry) before dispatch. Mint immutable receipts only for
provider-accepted active seconds at per-second granularity. Reject
wall-clock-if-idle, queued/stopped/teardown time, and allocations
that do not exactly match standard-8/16/32.

Tests use hermetic Daytona-shaped fixtures. No live provider call,
no charge, no deploy.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>

* docs(changelog): record Pod public surface receipt (#5776)

Signed-off-by: CodeWhale Bot <bot@codewhale.net>

---------

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Co-authored-by: CodeWhale Bot <bot@codewhale.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make Pod the canonical public roster command and vocabulary

1 participant