<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="/rss.xsl.xml"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
    <title>Changes in DESIGN.md</title>
    <description></description>
    <language>en</language>
    <copyright>Copyright 2025</copyright>
    <generator>Java</generator><item>
        <title>72d60f2d94b24cb66fabf596a2ec440f459ba88f - Add clear-resolved to admin overview; make orphaned annotations read-only</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#72d60f2d94b24cb66fabf596a2ec440f459ba88f</link>
        <description>Add clear-resolved to admin overview; make orphaned annotations read-onlyAdmin panel now shows a Resolved column alongside Normal and Orphaned, withper-page and wiki-wide &quot;clear resolved&quot; actions mirroring the existing orphanclears. The counts deliberately overlap: a resolved annotation is counted inboth its anchoring facet (Normal or Orphaned) and the Resolved column, so eachclear button removes exactly what its label says.helper::pageCounts() gains the resolved key; clearResolvedAll() mirrorsclearOrphanedAll(). In the front-end, orphaned annotation threads are nowread-only &#8212; Resolve/Reopen and Edit are suppressed, leaving only Delete.Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Mon, 15 Jun 2026 03:37:57 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>9fd890c3d28899ac6132f5f0d76a031cc5c27f1a - Add admin overview of annotated pages with clear-orphaned actions</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#9fd890c3d28899ac6132f5f0d76a031cc5c27f1a</link>
        <description>Add admin overview of annotated pages with clear-orphaned actionsAdds admin.php (Admin -&gt; Annotations): a wiki-wide table of annotated pageswith Normal/Orphaned counts, per-column filter, sortable headers, numberedpager (entries_per_page config), and per-page and wiki-wide clear-orphanedPOST actions guarded by checkSecurityToken and auth_isadmin.Refactors the orphan rule into helper::quoteMissing() shared byfindOrphaned() and the new pageCounts(); adds getAnnotatedPages() /searchAnnotations() / clearOrphanedAll() to the helper. Extends HelperTestwith four new coverage cases. All four locales (en, de, ru, ja) carry thenew admin strings.Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Mon, 15 Jun 2026 00:40:04 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>86c7806d6d41bce7c6d00acbee1316c62845cabb - Add config, selection guards, annotation overlap detection, and glow button</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#86c7806d6d41bce7c6d00acbee1316c62845cabb</link>
        <description>Add config, selection guards, annotation overlap detection, and glow button- Config: color_open / color_resolved (hex, drives CSS vars); embed_max_bytes,  context_length, body_cap move from constants to conf/default + metadata.  action.php injects --ann-open-rgb / --ann-resolved-rgb as CSS custom props;  style.css escapes every rgba(var(&#8230;)) with LESS ~&quot;&#8230;&quot; so lesserphp doesn&apos;t  bake them to #000000 at compile time.- Selection guards: Annotate button suppressed inside .ann-* UI, #dw__toc,  .docInfo, .secedit; the old endpoint-only isInsideHighlight is replaced by  selectionHitsHighlight (range.intersectsNode over all highlight spans) so a  selection overrunning an existing annotation on either side opens it instead  of offering a new overlapping one.- Glow: static amber box-shadow on .ann-tooltip .ann-btn (no animation).- Removed email line from plugin.info.txt; updated GeneralTest accordingly.- context_length fed to JS via JSINFO.annotations.contextLen so capture and  PHP trimming stay in sync.- conf/ + lang/*/settings.php + README/DESIGN updated.Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Wed, 03 Jun 2026 09:48:21 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>108f92bd856af52ccb9e86517ad03d96f4a9273a - Eliminate load round-trip by embedding annotations in JSINFO</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#108f92bd856af52ccb9e86517ad03d96f4a9273a</link>
        <description>Eliminate load round-trip by embedding annotations in JSINFOaction.php now reads the annotation list once during page render andships it inline as JSINFO.annotations.annotations, so script.js rendersimmediately at DOMContentLoaded with no second AJAX bootstrap (~300 mssaved per view). The embedded list also removes the double file readthat existed before (getStats called getAnnotations internally, then theclient fetched the same file again).helper.php adds statsFor(array) so action.php can derive stats from thealready-loaded list instead of re-reading through getStats(). getStatsnow delegates to it.script.js uses the embedded list when present; falls back to the GETload endpoint only when the list was too large to embed (&gt;128 KB cap).Adds a window.load repositionMarkers call so gutter markers re-alignafter late-loading images shift the layout.Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Wed, 03 Jun 2026 05:41:55 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>ee9dbf1506bc8a2e17701b4e3c1bc1caf77e1561 - Add nested reply threading; sync docs</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#ee9dbf1506bc8a2e17701b4e3c1bc1caf77e1561</link>
        <description>Add nested reply threading; sync docsReplies can now be threaded under one another instead of only sittingflat under their annotation.Backend:- helper.php: addReply() takes an optional parentId, stored on each reply  after sanitising it to hex; an empty or unknown parent simply falls back  to a top-level reply. Replies remain a flat list, with the parent link  carried as data.- action.php: the reply action forwards parentId and returns the full  updated annotation (not just the new reply) so the client re-renders the  whole thread in one round-trip. Also fix a stray-indented docblock and  drop the inaccurate &quot;and exit&quot; wording on the JSON responders.Docs / manifest:- DESIGN.md: document the parentId field, the flat-storage-plus-client-tree  model, and the full-annotation reply response.- README.md: note that replies can nest.- plugin.info.txt: bump the date.Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Wed, 03 Jun 2026 05:12:45 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>da56206cc13612db0df36be97c0f01d8f3c5e9f4 - Fix highlight off-by-one, localise the UI, add tests</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#da56206cc13612db0df36be97c0f01d8f3c5e9f4</link>
        <description>Fix highlight off-by-one, localise the UI, add testsAnchoring (the core bug):- Replace buildNormToRaw with normalizeWithMap so the normalised search  string and the normalised-&gt;raw index map are built in one pass and share  the same trimming. DokuWiki indents its content markup, so the collected  text starts with a whitespace text node; the old untrimmed map shifted  every highlight by a character. Verified on the live wiki: a quote now  re-anchors exactly, including across element boundaries.- Locate all matches first, then wrap last-to-first, so wrapping (which  splits text nodes) never disturbs a not-yet-wrapped offset.- Fix a pre-existing orphan double-count: renderAll passed an orphan total  into updateCounter, which then recounted it from the _orphaned flags.Localisation:- Move front-end strings to $lang[&apos;js&apos;] (exposed as LANG.plugins.annotations)  and read them via t()/fmt() with English fallbacks.- Add de, ru and ja translations alongside en.Conventions / cleanup:- action.php: read request data via $INPUT; pass the CSRF token straight to  checkSecurityToken($token) instead of poking $_POST/$_REQUEST; unify admin  detection on auth_isadmin().- helper.php: write annotation files with JSON_UNESCAPED_UNICODE | _SLASHES.- Drop the dead ann-highlight-orphaned constant; set panel data-status so the  resolved accent in style.css applies.Tests:- Add _test/GeneralTest.php (manifest + conf invariant) and _test/HelperTest.php  (permission rules, CRUD, input cleaning, findOrphaned). 15 tests pass.Docs: sync DESIGN.md and README.md; bump plugin.info.txt date.Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Tue, 02 Jun 2026 16:47:05 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>8d8701f5afabecdb73a7226eaf85b736f630ddd2 - Make README user-facing; move technical detail into DESIGN</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#8d8701f5afabecdb73a7226eaf85b736f630ddd2</link>
        <description>Make README user-facing; move technical detail into DESIGNREADME now covers only what end users need: features, install, usage.The storage format, AJAX API, file layout, browser internals and theACL-level permission table -- all developer material that overlappedwith DESIGN.md -- now live only in DESIGN.md, which gains theplugin.info.txt manifest row and a note on the repository&apos;s doc andlicence files. README links to DESIGN for developers and AI agents.Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Tue, 02 Jun 2026 15:45:00 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
<item>
        <title>5fa3d1851dabf8560591f7c142012774077e7767 - Document the shipped plugin: rewrite DESIGN.md, sync README</title>
        <link>http://127.0.0.1:8080/history/plugin/annotations/DESIGN.md#5fa3d1851dabf8560591f7c142012774077e7767</link>
        <description>Document the shipped plugin: rewrite DESIGN.md, sync READMEReplace the build-stage narrative and the claude.ai sandbox paths inDESIGN.md with a single architecture reference for the finished plugin:the anchoring model and re-anchoring algorithm, JSON storage and limits,the JSINFO-injection mechanism, the permission model, the CSRF flow, theAJAX endpoint, the FF78/PHP constraints, and the remaining gaps (unwiredUI strings, no translations, no tests, no config).Complete the README file tree (DESIGN.md, LICENSE) and note thataction.php also performs the JSINFO injection.Co-Authored-By: Claude Opus 4.8 &lt;noreply@anthropic.com&gt;

            List of files:
            /plugin/annotations/DESIGN.md</description>
        <pubDate>Tue, 02 Jun 2026 15:30:00 +0000</pubDate>
        <dc:creator>tracker-user &lt;82045103+tracker-user@users.noreply.github.com&gt;</dc:creator>
    </item>
</channel>
</rss>
