{"id":363884,"date":"2026-09-06T18:55:48","date_gmt":"2026-09-06T18:55:48","guid":{"rendered":"https:\/\/fr.wordpress.org\/plugins\/ai-helm\/"},"modified":"2026-10-15T01:33:34","modified_gmt":"2026-10-15T01:33:34","slug":"tlloancy-source-stamp","status":"publish","type":"plugin","link":"https:\/\/kea.wordpress.org\/plugins\/tlloancy-source-stamp\/","author":22011295,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"7.1.3","requires":"6.7","requires_php":"8.1","requires_plugins":null,"header_name":"Tlloancy Source Stamp","header_author":"tlloancy","header_description":"Records WordPress 7.0 AI Client generations in a self-hosted journal and stamps the matching post. Technical tool, not legal advice.","assets_banners_color":"0c4952","last_updated":"2026-10-15 01:33:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/tlloancy-source-stamp\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":245,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"tlloancy","date":"2026-09-06 18:55:30","revision":3683847},"1.1.0":{"tag":"1.1.0","author":"tlloancy","date":"2026-10-12 03:27:00","revision":3740414},"1.2.0":{"tag":"1.2.0","author":"tlloancy","date":"2026-10-15 01:33:34","revision":3747418}},"upgrade_notice":{"1.2.0":"<p>Fixes a stamp being wiped by the classic box in the block editor, a CSV export that corrupted data, and wrong-post stamping. The screen moves to Tools \u2192 Source Stamp. No data migration needed.<\/p>","1.1.0":"<p>The main plugin file is renamed, so WordPress deactivates the plugin during this update. Activate it again from the Plugins screen; your journal, settings, and stamps are taken over as is.<\/p>","1.0.0":"<p>First public version. Requires WordPress 7.0 for automatic stamps.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3683847,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3683847,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3683847,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3683847,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[2353,262179,254919,8534,7108],"plugin_category":[],"plugin_contributors":[232640],"plugin_business_model":[],"class_list":["post-363884","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-ai-disclosure","plugin_tags-article-50","plugin_tags-audit-log","plugin_tags-journal","plugin_contributors-tlloancy","plugin_committers-tlloancy"],"banners":{"banner":"https:\/\/ps.w.org\/tlloancy-source-stamp\/assets\/banner-772x250.png?rev=3683847","banner_2x":"https:\/\/ps.w.org\/tlloancy-source-stamp\/assets\/banner-1544x500.png?rev=3683847","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tlloancy-source-stamp\/assets\/icon-128x128.png?rev=3683847","icon_2x":"https:\/\/ps.w.org\/tlloancy-source-stamp\/assets\/icon-256x256.png?rev=3683847","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Tlloancy Source Stamp listens to the official WordPress AI Client (<code>wp_ai_client_prompt()<\/code> \/ <code>wp_ai_client_after_generate_result<\/code>). When a generation finishes through that API, the plugin writes a row in a table on <strong>your<\/strong> database. When the post is saved, it is stamped (origin, model, time) from the generation that was made for it.<\/p>\n\n<p>The journal stores metadata only: caller plugin, model, provider, context, token counts when available, and the user account that triggered the generation. Prompt and completion text are never stored.<\/p>\n\n<p>An optional visitor-facing note can appear on posts the plugin stamped as generated or assisted. Unstamped posts stay silent.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Listens to <code>wp_ai_client_after_generate_result<\/code> (WordPress 7.0+)<\/li>\n<li>Writes a self-hosted journal (Tools \u2192 Source Stamp), filterable and paginated<\/li>\n<li>Never stores prompt or completion text<\/li>\n<li>Stamps a post from the generation made for that post (editor, REST route or <code>post_id<\/code> parameter), or from the only generation waiting for you (15 minutes)<\/li>\n<li>Block editor sidebar panel and classic editor box to set or correct the origin by hand<\/li>\n<li>Optional visitor-facing note <strong>only<\/strong> on stamped posts, also in feeds<\/li>\n<li>CSV export of the whole journal<\/li>\n<li>Personal data export and erasure for the journal, and suggested privacy policy text<\/li>\n<li>Daily prune of rows older than 365 days (filter <code>tllss_retention_days<\/code>)<\/li>\n<\/ul>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li>Site-wide chatbot banners or AI-tool scanners<\/li>\n<li>Image IPTC \/ C2PA embedding<\/li>\n<li>Compliance scores, Article 4 checklists, or legal templates<\/li>\n<li>RAG, budget caps, or model routing<\/li>\n<\/ul>\n\n<h4>Honesty about the law<\/h4>\n\n<p>Installing this plugin does not make a site compliant with Regulation (EU) 2024\/1689. Whether Article 50 applies to a given page is a legal assessment for the site operator. This is a technical record of AI Client use.<\/p>\n\n<h4>Requirements<\/h4>\n\n<p>Automatic stamps need <strong>WordPress 7.0<\/strong> (or later) so <code>wp_ai_client_prompt()<\/code> exists. On older versions the journal stays empty; you can still set origin by hand in the editor. The block editor panel is shown for post types that support custom fields and the REST API; other types keep the classic box.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The journal links each generation to the WordPress user who triggered it. It stays in your database, is deleted after the retention period, can be exported and erased with the WordPress privacy tools (erasing detaches the account and keeps the technical row), and is detached automatically when a user is deleted. Suggested policy text is added to the Privacy Policy guide.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>tlloancy-source-stamp<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate Tlloancy Source Stamp.<\/li>\n<li>Open <strong>Tools \u2192 Source Stamp<\/strong>. Confirm that the WordPress AI Client is detected.<\/li>\n<li>Generate content with any plugin that uses <code>wp_ai_client_prompt()<\/code>, then check the journal.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20make%20my%20site%20legally%20compliant%3F\"><h3>Does this make my site legally compliant?<\/h3><\/dt>\n<dd><p>No. It records AI Client use. Legal assessment stays with the site operator.<\/p><\/dd>\n<dt id=\"why%20was%20my%20post%20not%20stamped%3F\"><h3>Why was my post not stamped?<\/h3><\/dt>\n<dd><p>When you save a post, the plugin looks for a generation you made in the last 15 minutes. If the generation was made from that post's editor (or a request that names the post), it is used, even when you generated several times: the latest one counts. Otherwise a generation is used only when it is the only one waiting for you; with two, there is no automatic stamp (wrong metadata is worse than a gap). Quick edit and bulk edit never stamp. <strong>Tools \u2192 Source Stamp \u2192 Test<\/strong> calls the AI Client directly: Generate, then Create draft in a second request. The origin field in the editor remains the manual fallback.<\/p><\/dd>\n<dt id=\"a%20post%20i%20stamped%20by%20hand%20was%20changed%20by%20the%20plugin%3F\"><h3>A post I stamped by hand was changed by the plugin?<\/h3><\/dt>\n<dd><p>No. An origin set by hand is never overwritten by the automatic path.<\/p><\/dd>\n<dt id=\"where%20do%20i%20change%20the%20origin%3F\"><h3>Where do I change the origin?<\/h3><\/dt>\n<dd><p>In the block editor, in the document sidebar under <strong>Source Stamp<\/strong>. In the classic editor, in the <strong>Source Stamp<\/strong> box.<\/p><\/dd>\n<dt id=\"do%20you%20send%20data%20off%20the%20site%3F\"><h3>Do you send data off the site?<\/h3><\/dt>\n<dd><p>No. The journal lives in your database. There is no account and no phone-home.<\/p><\/dd>\n<dt id=\"do%20you%20store%20what%20the%20model%20wrote%3F\"><h3>Do you store what the model wrote?<\/h3><\/dt>\n<dd><p>No. Only metadata (time, caller, model, tokens, post ID, user ID).<\/p><\/dd>\n<dt id=\"what%20happens%20to%20the%20data%20when%20i%20uninstall%3F\"><h3>What happens to the data when I uninstall?<\/h3><\/dt>\n<dd><p>The journal table, the settings and the scheduled task are deleted, on every site of a multisite. The stamps written on posts (<code>_tllss_*<\/code> post meta) stay with the content.<\/p><\/dd>\n<dt id=\"is%20this%20legal%20advice%3F\"><h3>Is this legal advice?<\/h3><\/dt>\n<dd><p>No.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Fix: in the block editor, the classic box could wipe an automatic stamp right after saving. The block editor now has its own sidebar panel; the classic box only acts on a real change.<\/li>\n<li>Fix: with automatic stamping turned off, the origin set in the editor box was silently ignored.<\/li>\n<li>Fix: every save of a stamped post wrote a new journal row and moved the stamp time. A stamp is now written, and journaled, only when it changes.<\/li>\n<li>Fix: CSV export HTML-escaped its cells and was open to spreadsheet formula injection. It is now plain RFC 4180 CSV with formula-looking cells neutralised, streams the whole journal (no 5,000-row cap) and runs in the admin only.<\/li>\n<li>New: a generation records the post it was made for, and the stamp goes to that post. Generations made for another post, quick edit and bulk edit can no longer stamp the wrong post. A stamp set by hand is never overwritten.<\/li>\n<li>New: the origin meta only accepts generated, assisted, human or empty, and requires the right to edit that post (filter <code>tllss_user_can_set_origin<\/code>).<\/li>\n<li>New: personal data exporter and eraser, suggested privacy policy text, automatic detaching of deleted users.<\/li>\n<li>New: journal pagination and an event filter; the screen moves from a top-level menu to Tools \u2192 Source Stamp.<\/li>\n<li>New: automatic stamps are marked \"auto\" in the post list and the editor.<\/li>\n<li>New: the visitor note also appears in feeds, and is not printed twice when <code>[tllss_label]<\/code> is already in the content.<\/li>\n<li>Change: the disclosure version only moves when the visitor-facing note changes, not on every settings save. Retired chatbot notice settings are removed.<\/li>\n<li>Change: the stamp journal row keeps the plugin that made the generation, not the one saving the post.<\/li>\n<li>Change: uninstall also cleans every site of a multisite. Test drafts no longer pile up.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Main file renamed to tlloancy-source-stamp.php and every internal name moved from the ai_helm prefix to tllss: table tllss_log, option tllss_settings, post meta <em>tllss<\/em>*, filters tllss_retention_days, tllss_run_ttl, tllss_stampable_post_types, tllss_caller_plugin, shortcode [tllss_label]. The journal rows, settings, stamps, and cron written under the old names are adopted on activation.<\/li>\n<li>A generation's journal row is now also its queue entry. Attaching it to a post is one conditional UPDATE on the new claimed_gmt column, so two saves racing for the same generation cannot both stamp it. The CSV export carries claimed_gmt.<\/li>\n<li>Test screen wording clarified.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: AI Client listener, same-request post stamp, local journal, CSV export, label on stamped posts only.<\/li>\n<\/ul>","raw_excerpt":"Records WordPress 7.0 AI Client generations in a local journal and stamps the matching post. Technical tool, not legal advice.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/363884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=363884"}],"author":[{"embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tlloancy"}],"wp:attachment":[{"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=363884"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=363884"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=363884"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=363884"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=363884"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/kea.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=363884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}