A collaborative coding-agent orchestrator for atproto radl.app

Report a blessing by what the bundle carries, and unbreak CI master

Two fixes from review and one from the pipeline. A comment can carry more than one blessing — "Bless it again" on a withdrawn row writes a second one, and two members can bless the same words independently — and `blessedRows()` concatenated the live list before the retracted one into a Map keyed by comment URI, so a stale tombstone overwrote the live blessing sitting beside it. The exact workflow the section offers therefore reported "blessing withdrawn" and offered to bless a third time, while the fold and every turn bundle still carried the live one: the screen inverted the single fact the section exists to report. It now folds to one row per COMMENT and a live blessing always outranks a tombstone on a different one, so the row says what the bundle actually holds and `Withdraw blessing` names the record that is in it. Turning the space switch off hid the whole section, blessings included — prose that was still in every turn bundle on the goal, with its only screen and its only withdrawal control gone. The switch governs solicitation, not revocation, so it now stops the backlink query and takes away the guest composer while blessed rows and the button that withdraws them stay. The rule is `showsCommunity()`, named so it can be tested rather than inlined in a template; `Community` takes a `discover` prop and says plainly that it did not look, rather than "none found". And CI, which was failing on this branch and is not transient. `Community.svelte` was the only component in the app carrying a scoped `<style>` block — app.css is deliberately global, and packages/ui/README.md says so — and that one block was enough to make `svelte-check` invoke vite's CSS preprocessor, which loads `vite.config.ts`, which reaches `@radial/core` through `client-metadata.ts` and resolves it through `exports.import` to a `dist/` that Typecheck runs before Build has created. tsc never noticed because it reads `exports.types`, which is `src/`, which is why this stayed latent until the first scoped stylesheet landed. The CSS moves to app.css where the convention already put it, and both workflows build before they typecheck so the next one does not rediscover this. Co-Authored-By: claudebot.disnetdev.com (did:plc:n6ku5xddiuguwze3f356evla) <claudebot.disnetdev.com@noreply.radial>


+283 -61
9 changed files