feat: Erinnerung zum Sichern von Story-Insights vor Ablauf
Ausgangspunkt: Instagram hält Story-Insights nach eigener Aussage nur
24 Stunden vor, auch der offizielle Datenexport enthält sie nicht mehr
danach. Der Standbild-Screenshot beim Prüfen entsteht direkt beim
Veröffentlichen, bevor nennenswerte Kennzahlen existieren — er kann
das strukturell nicht auffangen. Eine OAuth-Anbindung allein löst das
auch nicht: selbst mit API-Zugriff bräuchte es einen Abruf innerhalb
desselben 24h-Fensters.
- Migration 0007: asset.purpose ('initial' | 'insights', Default
'initial' erhält die Bedeutung aller Bestandszeilen). Ein Beitrag
kann jetzt mehrere Insights-Nachweise über die Zeit bekommen.
GetLatestAssetForSubmission berücksichtigt weiterhin nur 'initial',
damit ein späterer Insights-Upload nie den beim Archivieren
referenzierten Original-Screenshot verdrängt.
- internal/web/insights_reminder.go: computeInsightsReminder — reine,
ungetestete gegen echte Instagram-Daten, aber isoliert testbare
Logik fürs Erinnerungs-Timing (Produktentscheidung, keine Rechtsnorm,
daher nicht in rules/*.yaml).
- GET /beitraege/{id} zeigt die Erinnerung bei veröffentlichten
"story"-Beiträgen ohne existierendes insights-Asset; POST
/beitraege/{id}/insights speichert einen weiteren Screenshot (gleiche
Validierung wie das initiale Standbild, wiederverwendet über
readUploadedAsset/storeAsset mit purpose-Parameter).
- Bewusst nur In-App-Banner in dieser Ausbaustufe, kein Mail-/Push-
Versand — dafür fehlt aktuell ein SMTP-Relay/Versanddienst, siehe
CLAUDE.md-Hinweis dazu.
Volle Testsuite inkl. echter Postgres-Tests grün; End-to-End gegen
einen laufenden Server verifiziert (Story archivieren → Erinnerung
sichtbar → Insights-Upload → Erinnerung verschwindet, Nachweis
gelistet, Mandantentrennung beim Upload durchgesetzt).
This commit is contained in:
31
CLAUDE.md
31
CLAUDE.md
@@ -168,10 +168,14 @@ Plus drei Tabellen für Auth/Mandantentrennung (`account`, `app_user`,
|
||||
Account wie verändert); append-only aus demselben Grund wie
|
||||
`finding`/`extraction`/`evidence_package`
|
||||
- `submission` — ein eingereichter Beitrag, Status, Zeitpunkte
|
||||
- `asset` — hochgeladenes Standbild (optional bei der Prüfung), Pfad,
|
||||
SHA-256; append-only aus demselben Grund wie `finding`/`extraction`/
|
||||
`evidence_package` — ein Beweisstück wird nicht nachträglich
|
||||
ausgetauscht
|
||||
- `asset` — hochgeladenes Standbild, Pfad, SHA-256; append-only aus
|
||||
demselben Grund wie `finding`/`extraction`/`evidence_package` — ein
|
||||
Beweisstück wird nicht nachträglich ausgetauscht. `purpose` = `initial`
|
||||
(das Beweisfoto beim Prüfen, optional) oder `insights` (siehe
|
||||
„Insights-Erinnerung" unten; ein Beitrag kann mehrere `insights`-Assets
|
||||
über die Zeit bekommen). `GetLatestAssetForSubmission` berücksichtigt
|
||||
nur `initial`, damit ein späterer Insights-Upload nie den beim
|
||||
Archivieren referenzierten Original-Screenshot verdrängt
|
||||
- `extraction` — das JSON aus Stufe 1, Modellversion, Prompt-Version
|
||||
- `finding` — Ergebnis pro Regel: Regel-ID, Regel-Version, Schwere,
|
||||
Titel, Korrektur, Fundstellen (zum Zeitpunkt des Findings fixiert,
|
||||
@@ -243,6 +247,25 @@ echte API verifiziert — vor dem ersten echten Verbindungsversuch mit
|
||||
realen Credentials die Konstanten in `internal/socialconnect/*.go` noch
|
||||
einmal gegen die dann aktuelle Meta-/TikTok-Dokumentation prüfen.
|
||||
|
||||
**Insights-Erinnerung:** Story-Insights hält Instagram nach eigener
|
||||
Aussage nur 24 Stunden vor — danach sind sie auch über den offiziellen
|
||||
Datenexport nicht mehr zu bekommen, und der ursprüngliche Standbild-
|
||||
Screenshot beim Prüfen (der direkt beim Veröffentlichen entsteht, bevor
|
||||
nennenswerte Kennzahlen existieren) kann sie naturgemäß nicht erfassen.
|
||||
`GET /beitraege/{id}` zeigt deshalb bei veröffentlichten `story`-
|
||||
Beiträgen eine Erinnerung, solange keine `insights`-Asset existiert
|
||||
(`internal/web/insights_reminder.go`, `computeInsightsReminder` —
|
||||
reine Produktentscheidung zum Erinnerungs-Timing, keine Rechtsnorm,
|
||||
daher bewusst nicht in `rules/*.yaml`). `POST /beitraege/{id}/insights`
|
||||
speichert einen zusätzlichen Screenshot als `asset` mit
|
||||
`purpose='insights'`, gehasht wie jedes andere Beweisstück — aber
|
||||
NICHT im Metadaten-Hash des ursprünglichen Dossiers enthalten (das
|
||||
wird beim Archivieren einmalig fixiert). Bewusst nur ein In-App-
|
||||
Banner in dieser ersten Ausbaustufe, kein Mail-/Push-Versand — dafür
|
||||
fehlt aktuell ein SMTP-Relay/Versanddienst; vor einer echten
|
||||
Benachrichtigung per E-Mail ist das eine offene Rückfrage (welcher
|
||||
Versanddienst, welche Absenderdomain/SPF/DKIM).
|
||||
|
||||
---
|
||||
|
||||
## Go Commands
|
||||
|
||||
Reference in New Issue
Block a user