diff --git a/CHANGELOG b/CHANGELOG
index e70eebf..1a04e00 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,12 @@
We'll document all notable changes in this file, including bug fixes, enhancements, and dependency updates.
Dates should be in`YYYY-MM-DD` format and versions are in [semantic versioning](http://semver.org/) format.
+## v0.10.6 2026-11-07
+
+### Fixed
+
+- Process pages no longer show "Unknown role" to people who aren't logged in.
+
## v0.10.5 2026-11-07
### Fixed
diff --git a/package-lock.json b/package-lock.json
index d6f8e89..758162f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "adminima",
- "version": "0.10.5",
+ "version": "0.10.6",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "adminima",
- "version": "0.10.5",
+ "version": "0.10.6",
"dependencies": {
"@supabase/ssr": "^0",
"@sveltejs/adapter-vercel": "^7",
diff --git a/package.json b/package.json
index 5c49a0c..cb28860 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "adminima",
- "version": "0.10.5",
+ "version": "0.10.6",
"private": true,
"scripts": {
"dev": "vite dev",
diff --git a/src/lib/ARCI.svelte b/src/lib/ARCI.svelte
index bc5f50e..49e02a1 100644
--- a/src/lib/ARCI.svelte
+++ b/src/lib/ARCI.svelte
@@ -7,6 +7,7 @@
import { getDB } from '#routes/+layout.svelte';
import Options from './Options.svelte';
import { mutate } from '#routes/errors.svelte.ts';
+ import { getOrg } from '#routes/org/[orgid]/+layout.svelte';
interface Props {
how: HowRow;
@@ -17,6 +18,12 @@
let { roles, how, verbose, editable }: Props = $props();
+ const orgContext = getOrg();
+
+ // Mirrors the roles RLS policy: only members, or anyone if the org is public, can see its roles.
+ // Without them, every assignment would render as "Unknown role", so show nothing instead.
+ let canSeeRoles = $derived(orgContext().member || orgContext().org.visibility === 'public');
+
const dbContext = getDB();
const db = $derived(dbContext());
@@ -50,152 +57,154 @@
};
-
-
-
- {#if !verbose}
-
- {/if}
- {#if editable}
-
= 1}
- bind:selection={responsible}
- change={async (value) => {
- if (value) {
- const { error } = await mutate(
- db.addHowRCI(how, value, 'responsible'),
- "Couldn't add role."
- );
- if (error) return false;
- responsible = undefined;
- }
- return true;
- }}
- />
- {/if}
+{#if canSeeRoles}
+
+
+
+ {#if !verbose}
+
+ {/if}
+ {#if editable}
+ = 1}
+ bind:selection={responsible}
+ change={async (value) => {
+ if (value) {
+ const { error } = await mutate(
+ db.addHowRCI(how, value, 'responsible'),
+ "Couldn't add role."
+ );
+ if (error) return false;
+ responsible = undefined;
+ }
+ return true;
+ }}
+ />
+ {/if}
+
+
+ {#each how.responsible as responsible}
+ r.id === responsible)}
+ >{#if editable}
+
+ mutate(db.removeHowRCI(how, responsible, 'responsible'), "Couldn't remove role.")}
+ >{Delete}
+ {/if}
+ {/each}
+ {#if verbose}
+ is for completing this process.
+ {/if}
+
-
- {#each how.responsible as responsible}
- r.id === responsible)}
- >{#if editable}
-
- mutate(db.removeHowRCI(how, responsible, 'responsible'), "Couldn't remove role.")}
- >{Delete}
- {/if}
- {/each}
- {#if verbose}
- is for completing this process.
- {/if}
-
-
-
-
- {#if !verbose}
-
- {/if}
- {#if editable}
- = 1}
- bind:selection={consulted}
- searchable={roleSearch}
- change={async (value) => {
- if (value) {
- const { error } = await mutate(
- db.addHowRCI(how, value, 'consulted'),
- "Couldn't add role."
- );
- if (error) return false;
- consulted = undefined;
- }
- return true;
- }}
- />
- {/if}
-
-
- {#each how.consulted as consulted}
- r.id === consulted)}
- >{#if editable}
-
- mutate(db.removeHowRCI(how, consulted, 'consulted'), "Couldn't remove role.")}
- >{Delete}
- {/if}
- {/each}
- {#if verbose}
- is to complete this process.
- {/if}
-
-
-
-
- {#if !verbose}
-
- {/if}
- {#if editable}
-
= 1}
- change={async (value) => {
- if (value) {
- const { error } = await mutate(
- db.addHowRCI(how, value, 'informed'),
- "Couldn't add role."
- );
- if (error) return false;
- informed = undefined;
- }
- return true;
- }}
- />
- {/if}
+
+
+ {#if !verbose}
+
+ {/if}
+ {#if editable}
+ = 1}
+ bind:selection={consulted}
+ searchable={roleSearch}
+ change={async (value) => {
+ if (value) {
+ const { error } = await mutate(
+ db.addHowRCI(how, value, 'consulted'),
+ "Couldn't add role."
+ );
+ if (error) return false;
+ consulted = undefined;
+ }
+ return true;
+ }}
+ />
+ {/if}
+
+
+ {#each how.consulted as consulted}
+ r.id === consulted)}
+ >{#if editable}
+
+ mutate(db.removeHowRCI(how, consulted, 'consulted'), "Couldn't remove role.")}
+ >{Delete}
+ {/if}
+ {/each}
+ {#if verbose}
+ is to complete this process.
+ {/if}
+
-
- {#each how.informed as informed}
-
r.id === informed)}
- >{#if editable}
-
- mutate(db.removeHowRCI(how, informed, 'informed'), "Couldn't remove role.")}
- >{Delete}
- {/if}
- {/each}
- {#if verbose}
- is
about this process and its outcomes.
- {/if}
+
+
+ {#if !verbose}
+
+ {/if}
+ {#if editable}
+ = 1}
+ change={async (value) => {
+ if (value) {
+ const { error } = await mutate(
+ db.addHowRCI(how, value, 'informed'),
+ "Couldn't add role."
+ );
+ if (error) return false;
+ informed = undefined;
+ }
+ return true;
+ }}
+ />
+ {/if}
+
+
+ {#each how.informed as informed}
+ r.id === informed)}
+ >{#if editable}
+
+ mutate(db.removeHowRCI(how, informed, 'informed'), "Couldn't remove role.")}
+ >{Delete}
+ {/if}
+ {/each}
+ {#if verbose}
+ is about this process and its outcomes.
+ {/if}
+
-
+{/if}