Skip to content

An organization page offers the same press section, managed by its team - #2113

Merged
wintermeyer merged 4 commits into
mainfrom
claude/press-kit-organization-page-2087
Sep 10, 2026
Merged

An organization page offers the same press section, managed by its team#2113
wintermeyer merged 4 commits into
mainfrom
claude/press-kit-organization-page-2087

Conversation

@wintermeyer

Copy link
Copy Markdown
Owner

A page had one screen-sized logo and nothing a journalist could download, while
Vutuv.PressKit has taken either owner kind since #2083.

The card, the section page, the four agent-format siblings, the sitemap entry
and the editor are now the same code with an organization as the owner. The
editor is /organizations/:slug/press/edit — the member's own
VutuvWeb.PressKitLive, embedded rather than routed — on the manage tab bar for
an owner or publisher. A page whose logo is a vector takes it onto the logo
shelf with one press, and every team member sees a picture the AI check still
holds, not only whoever uploaded it.

Underneath: PressKit.page_path/1 built a page's URL from its root handle,
which serves the bare /:slug only. It answered a 404.

On top of #2087, on your word: the credit field falls back to the account's
name — the page's, for a page's kit.

Closes #2087

An AI agent wrote this text in my name. I know that is problematic.

https://claude.ai/code/session_01WPMGFtmCZNip8EJiRrx6ch

@wintermeyer

Copy link
Copy Markdown
Owner Author

Not merging yet. Two handlers were not revisited when :owner became a second principal. I measured both with a publisher whose role is revoked while the editor stays open.

delete (press_kit_live.ex:226) never re-asks, so the picture and its original were purged, irreversibly. save reaches first_error(:forbidden) and kills the socket — unreachable on main, where owner was always the viewer. move, reorder and upload refuse correctly.

Everything else in the review held.

An AI agent wrote this text in my name. I know that is problematic.

Der Pressebereich war seit #2086 nur der von Mitgliedern, obwohl Vutuv.PressKit
seit #2083 jeden Eigentümer kennt: eine Seite hatte ein bildschirmgroßes Logo
und nichts, was eine Redaktion herunterladen könnte. Karte, Bereichsseite,
Agentenformate, Sitemap-Eintrag und Editor sind jetzt derselbe Code mit der
Seite als Eigentümer; der Editor hängt für Inhaber und Publisher im Verwaltungs-
menü, und ein Vektor-Logo der Seite wandert mit einem Druck auf das Regal.

Die Bilder gehören der Seite: organization_id besitzt sie, die Kollegin, die
sie hochgeladen hat, steht nur in uploader_user_id, und jedes Teammitglied
sieht ein Bild, das die KI-Prüfung noch hält. page_path/1 baut den Pfad
jetzt aus dem Slug statt aus dem Wurzel-Handle, der nur die nackte /:slug-Seite
ausliefert -- er hätte auf 404 gezeigt. Obendrauf: das Bildnachweis-Feld füllt
sich mit dem Namen des Kontos, wenn es kein voriges Bild gibt.

Claude-Session: https://claude.ai/code/session_01WPMGFtmCZNip8EJiRrx6ch
Zwei Fehler, die erst entstanden, als der Editor einen Eigentümer bekam, der
nicht der Betrachter ist. Speichern übergab das {:error, :forbidden} von
PressKit.update/3 an first_error/1, das nur Changesets kennt: FunctionClauseError,
Socket tot. Und Entfernen fragte gar nicht -- PressKit.delete/1 nimmt bewusst
keinen Betrachter, weil die KI-Ablehnung aus #2084 keinen hat, und solange der
Eigentümer der Betrachter war, war das Auflösen der Zeile aus dessen eigenem
Regal die Prüfung.

Jetzt geht jeder abgelehnte Schreibvorgang durch dieselbe write_error/2 wie das
Hochladen, und das Löschen fragt manageable_by?/2 pro Ereignis -- es ist der
unumkehrbare Weg: purge/1 nimmt die Zeile, jede Größe und das private Original,
und nichts leitet daraus wieder eine Druckdatei ab. Beide Regressionstests sind
kalibriert.

Claude-Session: https://claude.ai/code/session_01WPMGFtmCZNip8EJiRrx6ch
Beide holen sich ihre eigene Verbindung über member_with_role/3 und ließen das
conn aus dem Setup ungenutzt im Muster stehen, was zwei Compiler-Warnungen in
einer sonst warnungsfreien Datei ergab. Der Schlüssel fällt einfach aus dem
Muster; an den Tests selbst ändert sich nichts.

Claude-Session: https://claude.ai/code/session_01WPMGFtmCZNip8EJiRrx6ch
Der Rebase auf main kollidierte nur in den vier Katalogen, und zwar in den
Referenzzeilen. Aufgelöst über mains Seite, damit dessen Übersetzungen
vollständig bleiben, danach einmal extrahiert -- wobei gettext.extract genau die
drei seitenbezogenen Sätze wieder mit dem mitgliedsbezogenen Deutsch fuzzy
gefüllt hat ("Ihr Logo", "über Sie schreibt"), also dieselbe Falle, gegen die
diese msgids überhaupt erst angelegt wurden. Die fünf Übersetzungen stehen
wieder von Hand, de und it tragen null fuzzy, und die Zahl der msgids liegt
exakt fünf über mains.

Claude-Session: https://claude.ai/code/session_01WPMGFtmCZNip8EJiRrx6ch
@wintermeyer
wintermeyer force-pushed the claude/press-kit-organization-page-2087 branch from 21cf3da to 789d689 Compare September 10, 2026 07:52
@wintermeyer
wintermeyer merged commit f6e08f5 into main Sep 10, 2026
1 check passed
@wintermeyer
wintermeyer deleted the claude/press-kit-organization-page-2087 branch September 10, 2026 08:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

An organization page offers the same press section, managed by its team

1 participant