Update website to use simpler, more direct language for user submissions
Adjusted synthesis prompt and frontend copy to shift from a solemn, manifesto-like tone to a practical, direct communication style for user contributions and political representatives. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 923ae0e3-a363-4db8-b04a-e8baca2a1330 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 1a34f0b7-23c8-4e2d-a327-0e8096495ea3 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8af7d2ec-2cc3-4ece-8af3-9f071488d072/923ae0e3-a363-4db8-b04a-e8baca2a1330/qrVKaka Replit-Helium-Checkpoint-Created: true
This commit is contained in:
@@ -135,36 +135,24 @@ Si rejetée :
|
||||
"""
|
||||
|
||||
SYNTHESIS_PROMPT = """
|
||||
Tu es le Synthétiseur de la Voix du Peuple — un poète civique et un philosophe démocratique.
|
||||
Tu reçois des idées citoyennes validées par le droit international des droits humains.
|
||||
Tu es un assistant chargé de synthétiser des contributions citoyennes pour les transmettre à des représentants politiques.
|
||||
|
||||
Ta mission : tisser ces idées en un texte collectif, vivant et éloquent
|
||||
qui incarne "La Voix du Peuple" — non pas une opinion, mais le son commun
|
||||
de citoyens qui s'expriment librement dans le cadre des droits fondamentaux.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
PRINCIPES DIRECTEURS
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
Ce texte s'ancre dans :
|
||||
• La DUDH Art. 21 : "La volonté du peuple est le fondement de l'autorité
|
||||
des pouvoirs publics."
|
||||
• La DUDH Art. 19 : Liberté d'expression comme socle de la démocratie
|
||||
• L'idéal républicain : Liberté, Égalité, Fraternité — au sens universel
|
||||
• L'humanisme civique : chaque voix compte, aucune n'est supérieure
|
||||
Ta mission : produire un résumé clair, structuré et objectif des propositions reçues,
|
||||
destiné à être lu par des élus ou des décideurs publics.
|
||||
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
CONSIGNES DE RÉDACTION
|
||||
═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
• Commence par "Nous, le peuple, ..."
|
||||
• Écris à la première personne du pluriel (nous, notre, nos)
|
||||
• 3 à 5 paragraphes, chacun développant un thème émergent des idées
|
||||
• Fond toutes les idées dans une voix collective — ne cite pas les idées une par une
|
||||
• Sois éloquent, inspirant, mais concret et ancré dans les réalités citoyennes
|
||||
• Respecte la pluralité — ne gomme pas les tensions, mais trouve le fil commun
|
||||
• Écris en français, langue de la Déclaration des droits de l'homme et du citoyen de 1789
|
||||
• N'utilise pas d'emojis
|
||||
• Ton : direct, sobre, concret. Pas de lyrisme ni de pathos.
|
||||
• Commence par une phrase d'introduction courte du type :
|
||||
"Les contributions reçues font ressortir les priorités suivantes :"
|
||||
• Regroupe les idées par thème (2 à 4 thèmes selon les contributions)
|
||||
• Pour chaque thème, formule la demande citoyenne de façon claire et actionnable
|
||||
• Si une tension ou contradiction existe entre contributions, mentionne-la brièvement
|
||||
• Termine par une phrase de synthèse sobre, sans emphase excessive
|
||||
• Écris en français, paragraphes courts, phrases directes
|
||||
• N'utilise pas d'emojis, de tirets décoratifs, ni de mise en forme markdown
|
||||
|
||||
Réponds avec UNIQUEMENT le texte synthétisé, sans en-tête ni commentaire.
|
||||
"""
|
||||
|
||||
@@ -95,10 +95,10 @@ export default function About() {
|
||||
|
||||
<header className="mb-12 space-y-4">
|
||||
<h1 className="text-4xl md:text-5xl font-serif font-bold text-primary">
|
||||
À propos de La Voix du Peuple
|
||||
À propos
|
||||
</h1>
|
||||
<p className="text-xl font-serif text-muted-foreground leading-relaxed">
|
||||
Une place publique numérique où les voix individuelles forment un manifeste démocratique collectif, guidé par le droit international des droits humains.
|
||||
Un outil simple pour recueillir les propositions citoyennes, les synthétiser et les rendre lisibles par les élus qui nous représentent.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
@@ -109,7 +109,7 @@ export default function About() {
|
||||
<h2>Le concept</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
La démocratie exige à la fois la liberté d'expression et un socle commun de valeurs. Cette plateforme offre aux citoyens un espace pour soumettre leurs idées en faveur d'une société meilleure. Ces voix distinctes sont tissées en temps réel pour former une synthèse vivante — un pamphlet numérique moderne qui reflète nos aspirations collectives.
|
||||
Cette plateforme permet à tout citoyen de soumettre une proposition, une demande ou une préoccupation. Ces contributions sont agrégées et synthétisées automatiquement pour produire un résumé clair, directement utilisable par des représentants politiques, des associations ou des collectivités.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -119,7 +119,7 @@ export default function About() {
|
||||
<h2>Le filtre démocratique</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Toute prise de parole ne contribue pas nécessairement au bien commun. Pour préserver l'intégrité de l'agora, un agent d'intelligence artificielle agit comme gardien civique. Chaque idée soumise est évaluée à la lumière des droits fondamentaux reconnus par le droit international avant de pouvoir rejoindre la synthèse collective.
|
||||
Pour maintenir un espace de dialogue constructif, chaque contribution est évaluée automatiquement par un agent d'intelligence artificielle. Les contenus contraires aux droits fondamentaux reconnus par le droit international ne sont pas intégrés à la synthèse.
|
||||
</p>
|
||||
<div className="bg-muted/30 p-6 rounded-none border-l-4 border-primary">
|
||||
<h3 className="font-bold font-mono uppercase tracking-widest text-sm mb-3">
|
||||
@@ -134,7 +134,7 @@ export default function About() {
|
||||
</ul>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Lorsqu'une contribution ne peut être retenue, l'auteur en est informé discrètement, sans jugement de sa personne — seulement de la conformité du contenu aux valeurs fondamentales de cet espace commun.
|
||||
Lorsqu'une contribution n'est pas retenue, l'auteur en est informé sans que sa contribution ne soit rendue publique.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -144,7 +144,7 @@ export default function About() {
|
||||
<h2>La synthèse</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Une idée acceptée ne reste pas isolée. Un second agent lit en continu le flux des idées validées et les tisse en un texte cohérent, éloquent, rédigé à la première personne du pluriel — « Nous, le peuple ». Ce texte, actualisé toutes les 15 secondes, représente l'humeur collective, les préoccupations et les espoirs des citoyens qui ont pris la parole.
|
||||
Dès qu'une contribution est intégrée, un second agent relit l'ensemble des propositions reçues et produit un résumé structuré par thèmes. Ce document, mis à jour en temps réel, est conçu pour être directement transmis à des élus, des services publics ou toute instance décisionnelle.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -154,7 +154,7 @@ export default function About() {
|
||||
<h2>Fondements juridiques</h2>
|
||||
</div>
|
||||
<p className="leading-relaxed text-foreground/90 font-serif text-lg">
|
||||
Le filtre s'appuie sur les textes fondateurs du droit international des droits humains. Voici les instruments qui guident chaque décision d'intégration ou de non-intégration d'une contribution.
|
||||
La modération s'appuie sur les textes internationaux suivants. Les articles cités fondent les critères d'acceptation et de refus des contributions.
|
||||
</p>
|
||||
|
||||
<div className="space-y-8">
|
||||
|
||||
@@ -31,8 +31,8 @@ import {
|
||||
|
||||
const submitIdeaSchema = z.object({
|
||||
content: z.string()
|
||||
.min(10, "Votre idée doit comporter au moins 10 caractères pour avoir du poids.")
|
||||
.max(1000, "La concision est une vertu. Restez sous 1 000 caractères."),
|
||||
.min(10, "Votre contribution doit faire au moins 10 caractères.")
|
||||
.max(1000, "Merci de rester sous 1 000 caractères."),
|
||||
author: z.string().max(100).optional(),
|
||||
});
|
||||
|
||||
@@ -96,13 +96,13 @@ export default function Home() {
|
||||
if (result.accepted) {
|
||||
setSubmitResult({
|
||||
success: true,
|
||||
message: "Votre voix a été intégrée au manifeste collectif.",
|
||||
message: "Votre contribution a été ajoutée à la synthèse.",
|
||||
});
|
||||
form.reset();
|
||||
} else {
|
||||
setSubmitResult({
|
||||
success: false,
|
||||
message: "Cette contribution n'a pas pu être intégrée au manifeste car elle n'est pas en accord avec les valeurs fondamentales qui guident cet espace commun.",
|
||||
message: "Cette contribution n'a pas pu être intégrée : elle n'est pas compatible avec le cadre de modération de cette plateforme.",
|
||||
reason: result.reason ?? undefined,
|
||||
});
|
||||
}
|
||||
@@ -125,10 +125,10 @@ export default function Home() {
|
||||
<div className="p-6 md:p-8 flex flex-col gap-6 flex-shrink-0 border-b border-border/40">
|
||||
<div className="space-y-2">
|
||||
<h1 className="text-3xl font-serif font-bold text-primary tracking-tight">
|
||||
Parlez à la République
|
||||
Vos propositions
|
||||
</h1>
|
||||
<p className="text-muted-foreground font-mono text-sm uppercase tracking-wider">
|
||||
Votre voix compte. Partagez votre vision pour l'avenir.
|
||||
<p className="text-muted-foreground text-sm">
|
||||
Soumettez vos idées. Elles sont synthétisées et transmises à vos représentants.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -142,7 +142,7 @@ export default function Home() {
|
||||
<FormLabel className="sr-only">Votre idée</FormLabel>
|
||||
<FormControl>
|
||||
<Textarea
|
||||
placeholder="Quel changement souhaitez-vous ? Exprimez-vous librement."
|
||||
placeholder="Quelle proposition souhaitez-vous faire remonter ?"
|
||||
className="min-h-[120px] resize-none font-serif text-lg bg-background border-primary/20 focus-visible:ring-primary placeholder:text-muted-foreground/50"
|
||||
data-testid="input-idea-content"
|
||||
{...field}
|
||||
@@ -181,7 +181,7 @@ export default function Home() {
|
||||
{submitIdea.isPending ? (
|
||||
<><Loader2 className="mr-2 h-4 w-4 animate-spin" /> Envoi…</>
|
||||
) : (
|
||||
<><PenTool className="mr-2 h-4 w-4" /> Proclamer</>
|
||||
<><PenTool className="mr-2 h-4 w-4" /> Contribuer</>
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
@@ -199,7 +199,7 @@ export default function Home() {
|
||||
: <Info className="h-4 w-4 text-amber-600" />
|
||||
}
|
||||
<AlertTitle>
|
||||
{submitResult.success ? "Proclamation enregistrée" : "Contribution non retenue"}
|
||||
{submitResult.success ? "Contribution enregistrée" : "Contribution non retenue"}
|
||||
</AlertTitle>
|
||||
<AlertDescription>
|
||||
{submitResult.message}
|
||||
@@ -217,13 +217,14 @@ export default function Home() {
|
||||
<AccordionItem value="valeurs" className="border-none">
|
||||
<AccordionTrigger className="text-xs font-mono uppercase tracking-widest text-muted-foreground hover:no-underline py-3">
|
||||
<span className="flex items-center gap-2">
|
||||
<Scale className="h-3 w-3" /> Nos valeurs & fondements juridiques
|
||||
<Scale className="h-3 w-3" /> Cadre de modération
|
||||
</span>
|
||||
</AccordionTrigger>
|
||||
<AccordionContent>
|
||||
<p className="text-xs text-muted-foreground font-serif mb-4 leading-relaxed">
|
||||
Cet espace est régi par les grands textes fondateurs du droit international
|
||||
des droits humains. Toute contribution est évaluée à leur lumière.
|
||||
<p className="text-xs text-muted-foreground mb-4 leading-relaxed">
|
||||
Les contributions sont modérées selon les textes fondamentaux du droit
|
||||
international des droits humains. Les contenus contraires à ces principes
|
||||
ne sont pas intégrés.
|
||||
</p>
|
||||
<div className="space-y-3">
|
||||
{VALEURS.map((v) => (
|
||||
@@ -247,7 +248,7 @@ export default function Home() {
|
||||
<ScrollArea className="flex-1 bg-muted/30">
|
||||
<div className="p-6 md:p-8">
|
||||
<h2 className="text-xs font-mono font-bold uppercase tracking-widest text-muted-foreground mb-6 flex items-center gap-2">
|
||||
<TrendingUp className="h-3 w-3" /> Proclamations récentes
|
||||
<TrendingUp className="h-3 w-3" /> Contributions récentes
|
||||
</h2>
|
||||
|
||||
<div className="space-y-8">
|
||||
@@ -277,8 +278,8 @@ export default function Home() {
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className="text-center p-8 text-muted-foreground font-mono text-sm border border-dashed border-border/60">
|
||||
Aucune proclamation enregistrée. Soyez le premier à prendre la parole.
|
||||
<div className="text-center p-8 text-muted-foreground text-sm border border-dashed border-border/60">
|
||||
Aucune contribution enregistrée pour l'instant.
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -299,17 +300,17 @@ export default function Home() {
|
||||
<div className="flex justify-between items-start mb-12">
|
||||
<div>
|
||||
<h2 className="text-sm font-mono font-bold uppercase tracking-widest text-primary flex items-center gap-2">
|
||||
<Users className="h-4 w-4" /> La Voix du Peuple
|
||||
<Users className="h-4 w-4" /> Synthèse des contributions
|
||||
</h2>
|
||||
<p className="text-xs font-mono text-muted-foreground mt-1">
|
||||
La synthèse vivante de la pensée démocratique
|
||||
Mise à jour à chaque nouvelle contribution
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{stats && (
|
||||
<div className="text-xs font-mono text-right" data-testid="text-stats">
|
||||
<div className="flex flex-col">
|
||||
<span className="text-muted-foreground">Voix rejointes</span>
|
||||
<span className="text-muted-foreground">Contributions intégrées</span>
|
||||
<span className="font-bold text-primary">{stats.accepted}</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -321,7 +322,7 @@ export default function Home() {
|
||||
<div className="flex flex-col items-center justify-center gap-4 text-muted-foreground">
|
||||
<Loader2 className="h-8 w-8 animate-spin text-primary" />
|
||||
<span className="font-mono text-sm uppercase tracking-widest">
|
||||
À l'écoute du peuple…
|
||||
Chargement…
|
||||
</span>
|
||||
</div>
|
||||
) : synthesis ? (
|
||||
@@ -334,7 +335,7 @@ export default function Home() {
|
||||
<div>{synthesis.text}</div>
|
||||
) : (
|
||||
<p className="text-muted-foreground italic text-center text-xl">
|
||||
Les pages de notre manifeste sont encore vierges. Prenez la parole.
|
||||
Aucune contribution pour l'instant.
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
@@ -345,14 +346,14 @@ export default function Home() {
|
||||
data-testid="text-synthesis-meta"
|
||||
>
|
||||
<span>
|
||||
Synthèse de {synthesis.ideaCount} idée{synthesis.ideaCount !== 1 ? "s" : ""} citoyenne{synthesis.ideaCount !== 1 ? "s" : ""}
|
||||
Basé sur {synthesis.ideaCount} contribution{synthesis.ideaCount !== 1 ? "s" : ""}
|
||||
</span>
|
||||
<span className="flex items-center gap-2">
|
||||
<span className="relative flex h-2 w-2">
|
||||
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75" />
|
||||
<span className="relative inline-flex rounded-full h-2 w-2 bg-primary" />
|
||||
</span>
|
||||
En direct • {format(new Date(synthesis.updatedAt), "HH:mm:ss")}
|
||||
Mis à jour le {format(new Date(synthesis.updatedAt), "d MMM à HH:mm", { locale: fr })}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user