Public-sector use-case analysis: shared spaces in practice + derived backlog #59
Labels
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Cordy/Cairn#59
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Product-thinking task from Nikola's 2026-07-29 batch. Two parts:
1. Shared spaces already exist — put them to work. The police-records scenario (multiple officers in a unit reading/writing the same case files) is exactly
/spaces/<group>(v0.2.7): an IdP group becomes a shared tree for its members, membership managed entirely in AD/Keycloak. Nothing to build — but it must be demonstrated: enable on the dogfood (#50), document the pattern (docs page + a public-sector example in the site docs: grouprecords-unit→ space/spaces/records-unit), and validate the day-to-day flow (WebDAV mounts of a space, concurrent edits, per-user quota exemption inside spaces).2. Persona walk-through → derived backlog. Think through how public-sector workers actually interact with files, and turn every gap into a scoped issue. Personas to cover: case worker (daily reads/writes in one space), records clerk (intake: scanning/uploading into structured folders), team lead (grants access = IdP group membership), IT admin (provisioning, quotas, offboarding = disable in AD), auditor/legal (needs to know who accessed what, when), external party (receives a share link — expiry + password policies).
Expected gaps to evaluate (each becomes its own issue if confirmed):
<space>-ro).Deliverable:
docs/PUBLIC-SECTOR.md(or site docs section) with the persona analysis + the derived issues filed and cross-linked here.Analysis delivered: docs/PUBLIC-SECTOR.md on main — persona walk-through (case worker, records clerk, team lead, IT admin, auditor/legal, external party, viewer) mapped against what's shipped, with the bus-factor/records-unit scenario worked as the core
/spaces/<group>example.Derived backlog filed and cross-linked:
<space>-roIdP group)Remaining in this issue: the dogfood demonstration (enable
perUserHomesvia #50 — Nikola's config flip — then the two-userrecords-unitwalk-through and a public-sector example page in the site docs). Keeping open for that.All four derived features are now shipped and live on the dogfood: #61 audit logging (v0.3.15), #62 share-link policy (v0.3.14), #63 retention + legal hold (v0.3.17), #64 read-only spaces (v0.3.16). #50 is closed, so
perUserHomes/spaces/trash are active on.249.Remaining in this issue is the demonstration half:
records-unitandrecords-unit-rogroups in Keycloak plus a non-admin test user (nikola-testis admin and therefore unscoped — the member view can't be observed from it)./spaces/records-unitover WebDAV, a-roviewer who can read but not modify, offboarding by group removal, a hold blocking deletion, and the audit log answering "who touched this file".Step 3 can be written from the shipped behavior at any time; steps 1–2 need the Keycloak groups.
Adding a verification dependency here, since it shares this issue's prerequisite rather than needing its own tracking.
The read-only viewer badge (#64 UI, shipped in v0.3.20) is untested against a real read-only space. The wiring is verified —
internal/api/api.goresolvesreadOnlythrough an optionalReadOnly(ctx, path) boolassertion on the store, and the browser disables mkdir/upload and shows a "View only" chip when it's true. But every account currently available for testing is incairn-admins, and admins are unscoped, soreadOnlyis always false and the chip never renders in practice.Proving it needs the same setup this issue is already blocked on:
records-unit-ro(alongsiderecords-unit) in realmcordycepsrecords-unit-roand not ofcairn-adminsWith those in place the demo walk-through and the badge verification are the same session: log in as the non-admin, open the read-only space, confirm the chip appears and the create/upload controls are disabled, then confirm a direct
PUT/MKCOLagainst that path still returnsErrReadOnly— the badge is advisory, so the server-side refusal is the thing that actually matters and should be checked independently of the UI.Worth doing in the same pass: confirm a member of
records-unit(read-write) sees no chip and full controls, so we know the badge isn't showing up spuriously.Closing per Nikola's roadmap decision (2026-08-04): there will never be a "demonstration" with customers, and no walk-through. The framing this issue carried is replaced by the v0.6 closed beta — hands-on real usage between Manuel, Nikola and possibly a further selection of invited users. That beta is deliberately NOT tracked as a scripted scenario: whatever real usage surfaces gets raised by Nikola as concrete issues inside the v0.6 milestone.
What this issue's prerequisites pointed at is already covered elsewhere: the Keycloak group setup and read-only membership checks live in the #111 dogfood checklist, and the public-sector feature set itself (audit, holds, retention, read-only spaces) shipped v0.3.15–v0.3.21 with docs in
docs/PUBLIC-SECTOR.md.