From c2f2fdb54650449129b9187b02c90a4a24800642 Mon Sep 17 00:00:00 2001 From: Bendik Aagaard Lynghaug Date: Mon, 31 Aug 2026 17:22:48 +0200 Subject: [PATCH] Report a recording: per-voice review link, desk, and lifecycle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every recording card links to /report/. Filing opens a redoal_reports record; the Reports desk decides — Remove it acts for real (the relay deletes the recording everywhere), Keep it closes with the voice in place. Pins portal v0.3.17 for markdown in cards. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Y42TyF8Zu7NGRR2893vNcZ --- .gitea/workflows/deploy.yml | 2 +- aggregates.yaml | 12 +++++++++ questions/report/[digest].yaml | 47 ++++++++++++++++++++++++++++++++++ questions/reported.yaml | 10 ++++++++ questions/review/index.yaml | 24 +++++++++++++++++ questions/shape/[key].yaml | 2 +- 6 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 questions/report/[digest].yaml create mode 100644 questions/reported.yaml diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index c14149a..75601bb 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -18,7 +18,7 @@ on: - .gitea/workflows/deploy.yml env: - PORTAL_RELEASE: v0.3.16 + PORTAL_RELEASE: v0.3.17 INSTANCE: redoal-portal jobs: diff --git a/aggregates.yaml b/aggregates.yaml index 9b820ed..25a514d 100644 --- a/aggregates.yaml +++ b/aggregates.yaml @@ -26,3 +26,15 @@ aggregates: transitions: pending: [open, unsubscribed] open: [unsubscribed] + # Reports on recordings. The relay watches this bucket: a record + # moved to "removed" deletes the recording from its store, the varde + # pin, and discovery. "kept" closes the report with the recording in + # place. Decisions are human, never automatic. + - bucket: redoal_reports + initial: open + states: + open: { event: reported } + removed: { event: removed } + kept: { event: kept } + transitions: + open: [removed, kept] diff --git a/questions/report/[digest].yaml b/questions/report/[digest].yaml new file mode 100644 index 0000000..c64ec7a --- /dev/null +++ b/questions/report/[digest].yaml @@ -0,0 +1,47 @@ +# One recording, held up for human review: /report/. Reached +# from the place page's per-recording link. Filing creates an open +# record in redoal_reports; the desk decides, and a removal decision +# deletes the recording from the relay, varde, and discovery. +name: Should this stay? +description: > + Every voice here was left by a person, and a person looks at every + report. Tell us what you heard and why it needs eyes on it — the + recording stays reachable until someone has listened and decided. +alternatives: + - name: Ask for a review + description: > + Goes straight to the review desk. If the recording breaks + something — a person's privacy, the law, basic decency — it is + removed everywhere this network keeps it. + action: /reported + consequence: [Send it to review] + record_as: redoal_reports + encouragements: + - A person will listen. + features: + - name: What you heard + description: > + A sentence or two is plenty. Leave an email if you want to + hear what was decided. + icon: lucide:flag + requirements: + - name: digest + label: Recording + type: hidden + value: "{digest}" + - name: reason + label: Why + type: textarea + placeholder: What is wrong with this recording? + - name: email + label: Email + type: email + optional: true + - name: Go back to listening + description: > + The place you came from holds the rest of its voices. + features: + - name: Nothing sent + description: > + Leaving this page files nothing — only the button does. + icon: lucide:undo-2 diff --git a/questions/reported.yaml b/questions/reported.yaml new file mode 100644 index 0000000..207d569 --- /dev/null +++ b/questions/reported.yaml @@ -0,0 +1,10 @@ +# Landing after filing a report. +name: What happens now? +description: > + Your report is on the review desk. A person listens, decides, and + the decision acts everywhere this network keeps the recording. +alternatives: + - name: Draw another + description: > + The paper keeps listening. + action: / diff --git a/questions/review/index.yaml b/questions/review/index.yaml index c517fa8..8a3362f 100644 --- a/questions/review/index.yaml +++ b/questions/review/index.yaml @@ -52,6 +52,30 @@ alternatives: bucket: redoal_voices requires_group: owners + - name: Reports + description: > + Recordings a visitor asked a person to listen to. "Remove it" + acts for real: the relay watches this bucket and deletes the + recording from its store, the varde pin, and discovery. "Keep + it" closes the report with the voice in place. + action: /review + consequence: [Decide] + features: + - name: "" + description: "" + resource: + source: + kind: kv + bucket: redoal_reports + requires_group: owners + transitions: + - from: open + to: removed + label: Remove it + - from: open + to: kept + label: Keep it + - name: Watchers description: > Who asked to hear from one exact address. Unsubscribing is diff --git a/questions/shape/[key].yaml b/questions/shape/[key].yaml index e9bca64..51e0d1d 100644 --- a/questions/shape/[key].yaml +++ b/questions/shape/[key].yaml @@ -25,7 +25,7 @@ alternatives: empty: Nothing has been left at this address yet — yours could be the first voice here. jq: > .recordings[] | {name: ((.duration_ms / 1000 | round | tostring) + " seconds of voice"), - description: ("sealed by " + .author[0:8] + "…"), + description: ("sealed by " + .author[0:8] + "… · [have it reviewed](/report/" + .digest + ")"), audio: ("https://relay.redoal.com" + .audio)} - name: Leave your voice here