Repository navigation
docs(ax): joinPolicy 'open' did not make an unlisted pod joinable (entry 81) - #2385
lilyshen0722 wants to merge 2 commits into
Conversation
…try 81) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4
lilyshen0722
left a comment
There was a problem hiding this comment.
Unasked review — this has sat with no review for a day, and an AX entry that makes claims about enforcing code is the class of artifact where a wrong claim propagates into someone's review focus (that is what entry 81 in #2240 is itself about).
Every code claim in the entry verifies at current main. I read the functions rather than the entry.
| the entry says | measured |
|---|---|
isDirectlyJoinable = isCommunityListed(pod) && joinPolicy !== 'invite-only' |
services/podListing.ts:93-95, verbatim ✓ |
listing requires publicRead === true and communityListed === true |
:87-91 ✓ (it also excludes NON_LISTABLE_POD_TYPES, which strengthens the entry's point rather than weakening it) |
joinPod refuses a non-member, non-admin unless joinable |
controllers/podController.ts:545-548 ✓ |
the refusal code is join_refused |
podController.ts:550 ✓ — and it is the only occurrence outside tests, so the Lesson's "search for the refusal code" actually lands |
| the agent self-install route gates the same way, "whose comment names this exact case" | routes/agentsRuntime.ts:3137-3144 ✓ — the comment says joinPolicy: 'open' below the community tier "is a dormant declaration… it means 'open once listed', not 'open now'", and :3146 gates on isDirectlyJoinable |
So the conclusion holds: on a pod with publicRead: false, communityListed: false, joinPolicy: 'open' is inert, and the Lesson's prescribed check is one that works — unlike the first draft of #2240's Lesson, which prescribed a grep that found no writers.
One defect, and it is about this PR rather than its content: the entry number collides.
main's highest AX entry is 80. This PR adds ## 81. — and so does #2240 (639afca83e), which is further along and whose entry 81 is already cited by number in TASK-316's title and in its own Repair line. git merge-tree --write-tree on the two heads reports CONFLICT (content) in docs/development/agent-experience-audit.md.
That makes this a renumber, not just a conflict resolution. Whichever lands second must become ## 82.; the obvious "keep both hunks" resolution yields two ## 81. sections in one file, and these entries are referenced by number. Worth settling the order deliberately rather than at merge time.
Separately, this head is 25 commits behind main (base cd37b32e0), so it needs a rebase regardless — which is the natural moment to renumber.
No defect in the entry itself.
Adds agent-experience audit entry 81. A sweep read
joinPolicy: 'open'on 21 unlisted, non-public pods as "joinable by any signed-in user", and a session began closing them through the owner's account.The join gate is
isDirectlyJoinable(services/podListing.ts). It also requirespublicReadandcommunityListed, so'open'is inert on an unlisted pod.Docs only, no code change.
🤖 Generated with Claude Code
https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4