source: Klonkt/src/services/guardianship/notes.js@ 7cf8144

main
Last change on this file since 7cf8144 was 3b43e4c, checked in by Robin <roboburr@…>, 5 weeks ago

De gate-familie functioneel: acht poorten die echt schakelen (shaer-ahy.1)

Barts opdracht (8-8): "maak ze allemaal maar functioneel." Alle
setting-gates uit de catalogus hebben nu een kolom, zijn voorstelbaar en
beslisbaar via de bestaande tally, en worden ECHT afgedwongen -- bij de
aflevering (wat dicht is wordt nooit geserialiseerd, de regel die de
embeds al hadden) of bij de inname (wat de ward niet mag versturen
weigert de outbox met een eerlijke 403).

externalThreads de thread-kring (shaer-9y2): dicht is de kring van de

guardians met telling, open is alles; per verzoek en
buiten de threadcache om, want een poort die net
dichtging mag niet twee minuten open nawerken

images/music bijlagen gefilterd op mediaType, ook in de thread
quoteCards shaer:quote niet geserialiseerd
customEmoji Emoji-tags en byline-emoji niet geserialiseerd; de

:shortcode: blijft als tekst staan, dat is eerlijk

messages de berichten-poot dicht voor vreemden en vrienden,

maar NOOIT voor het guardian-kanaal, en de outbox
weigert directe berichten -- behalve de reddingsboei:
een poort die het hulpkanaal afsnijdt beschermt
niemand

compose de outbox weigert eigen posts; een antwoord valt

onder het gesprek, niet onder een eigen podium

accountMove de harde weigering van shaer-tge is een gate

geworden met dezelfde standaard: guardians kunnen
hem nu openzetten

De capabilities dragen de hele familie, zodat de app VOORAF weet wat hij
mag aanbieden -- de (+) kaart leest shaer:compose al. De voorstelroute
herschreef een onbekende feature stilletjes naar externalEmbeds; dat is
nu een 400, want een voorstel dat op de verkeerde poort landt mag een
guardian nooit overkomen. Het paneel leest de standen catalogusbreed.

TWEE blijven bewust gepland. publicProfile is niet een veld dat je
wegfiltert maar het hele publieke web-oppervlak (de ontwerpvraag van
shaer-hj0); een half slot leest als een heel slot en dat is gevaarlijker
dan geen. independence draagt gezag over een kind over en zijn vorm
hoort bij shaer-90v beslist te worden, niet hier geimproviseerd.

Zestien nieuwe/aangepaste toetsen, alle 640 groen.

Co-Authored-By: Claude Opus 5 <noreply@…>

  • Property mode set to 100644
File size: 4.1 KB
RevLine 
[6b5d7da]1/**
2 * Guardianship (FEP-633c) — note properties.
3 *
4 * The shaer:helpRequest flag (spec 5.2.1): a ward's call for help, only ever
5 * on direct notes. Everyone who does not speak shaer can ignore it.
6 */
[af5b79b]7import { listGuardians } from './relations.js';
8
9/**
10 * shaer:hasGuardians (§2.2): an advisory OBJECT hint that the author is a ward,
11 * so a remote server can route interactions to the guardians WITHOUT fetching
12 * the actor. Stamped on every object a ward publishes; MUST be safely ignorable.
13 */
14export function hasGuardiansProps(slug) {
15 try { return (slug && listGuardians(slug).length) ? { 'shaer:hasGuardians': true } : {}; }
16 catch { return {}; }
17}
18
[fc40410]19/**
20 * May EXTERNAL (non-fediverse) embeds be shown to this account?
21 *
22 * A gated feature in the FEP-633c sense: a ward's world outside the fediverse
23 * is the guardians' call. `setting` is `sites.external_embeds`:
24 * null/undefined → auto: off for a ward, on for anyone else
25 * 0 → off, 1 → on (the guardians decided)
26 *
27 * Pure, so the rule is testable on its own. The gate is applied SERVER-side:
28 * a blocked embed is never serialised into the feed, because an embed that the
29 * client merely hides has still been delivered.
30 */
31export function externalEmbedsAllowed(setting, isWard) {
32 if (setting === 0 || setting === 1) return setting === 1;
33 return !isWard;
34}
35
[e27b8db]36/**
37 * May a player run INSIDE the app/page for this account? The heavier sibling
38 * of the setting above, and deliberately separate: seeing that a video exists
39 * is not the same decision as handing the screen to a third party's player,
40 * with its engine, its end-screen and its next-video machine. Same shape, same
41 * default (off for a ward), and it only ever matters once embeds are allowed:
42 * you cannot play what you may not see.
43 */
44export function externalPlaybackAllowed(setting, isWard) {
45 if (setting === 0 || setting === 1) return setting === 1;
46 return !isWard;
47}
48
[3b43e4c]49/**
50 * Dezelfde regel voor de hele gate-familie (8-8, "maak ze allemaal
51 * functioneel"): een expliciete 0/1 van de guardians wint, anders de
52 * automatiek -- dicht voor een ward, open voor de rest. EEN implementatie,
53 * zodat er geen tweede plek is die er anders over kan gaan denken; de twee
54 * benoemde varianten hierboven blijven bestaan omdat er tests en aanroepen
55 * aan hangen, en doen exact hetzelfde.
56 */
57export function wardGateAllowed(setting, isWard) {
58 if (setting === 0 || setting === 1) return setting === 1;
59 return !isWard;
60}
61
[af5b79b]62/** True when an incoming object carries the ward hint (§2.2). Register-only for
63 * now; acted on later at reddings-boei / escalation routing. */
64export function objectHasGuardians(o) {
65 return !!o && (o['shaer:hasGuardians'] === true || o.hasGuardians === true);
66}
[6b5d7da]67
68/** Extra JSON-LD properties for an outgoing note built from an ap_outbox row. */
69export function helpRequestProps(post) {
70 return (post && post.visibility === 'direct' && post.help_request)
71 ? { 'shaer:helpRequest': true }
72 : {};
73}
74
75/** True when an incoming (C2S or S2S) note object carries the flag. */
76export function isHelpRequest(object) {
77 return !!object && (object['shaer:helpRequest'] === true || object.helpRequest === true);
78}
79
[e62f65d]80/** shaer:wave: a gentle "thinking of you" from a guardian to its ward. A
81 * private nudge, never a feed post; non-shaer clients see a plain DM. */
82export function waveProps(post) {
83 return (post && post.visibility === 'direct' && post.wave)
84 ? { 'shaer:wave': true }
85 : {};
86}
87
88/** True when an incoming note is a wave. */
89export function isWave(object) {
90 return !!object && (object['shaer:wave'] === true || object.wave === true);
91}
92
[6eab7e9]93/** shaer:away (3.6.1): a guardian declaring itself away to its ward, with an
94 * end. Rides a direct note like the help request, so a ward on a plain
95 * server reads a human message; endTime is plain AS2. */
96export function awayProps(post) {
97 return (post && post.visibility === 'direct' && post.away_until)
98 ? { 'shaer:away': true, endTime: new Date(post.away_until).toISOString() }
99 : {};
100}
101
[e27b8db]102export default { helpRequestProps, isHelpRequest, waveProps, isWave, awayProps, hasGuardiansProps, objectHasGuardians, externalEmbedsAllowed, externalPlaybackAllowed };
Note: See TracBrowser for help on using the repository browser.