Implementation roadmap

Node: foundation plan & active roadmap.

Gillish Node is feature-complete and in maintenance. The three systems, link management, Content Graph, Google + Rank Tracker, all shipped; what remains is a defined backlog (Cairnstone Synergy wiring, the competitor-migration wizard, competitive-parity closure, commercial licensing, and the A/B enhancement set). This page is the build history plus the active roadmap, and an index of the in-repo plans/ corpus. The plans are mirrored here, not moved, gillish-node/plans/ stays the source of truth in the repo.

Where Node stands#

Unlike a forward phase plan, Node’s “foundation plan” is mostly history: the plugin is feature-complete and in maintenance. Link management, click tracking, A/B testing, dynamic rules, auto-link, the Content Graph with 14 elements, SEO Stats, Link Stats, the REST API, GDPR compliance, bot detection, QR codes, GeoIP, URL shorteners, and health check are all shipped; the Google + Rank Tracker system sits on top of that foundation. The repo migrated from the legacy fishy-links name to gillish-node (the old folder deleted; only changelog history and a few “Port of fishy-links” provenance comments remain). What follows is the shipped narrative, then the defined backlog.

Build history#

Phases 1–3: foundation, port, rework#

Phase 1 (Foundation) established the PSR-4 tree, the CPT, the stats schema, and the unified Gillish admin menu. Phase 2 (Systems port, 9 chunks) brought the full link-management feature set across. Phase 3 (Rework + admin pages) closed the redirect/render pipeline, the editor integrations across all four surfaces, and the Content Graph element pipeline. All three are complete.

Google + Rank Tracker#

Service-account auth plus the daily GSC/GA4 sync (Phases 1–6 of the Google plan), then the Rank Tracker module (pin list + history snapshots + movement alerts), the Search Performance admin page, and the full 16-month historical backfill module (Phases A–E: schema + state, runner, auto-trigger + cron chaining, Force Resync with idiot-proof guards, the weekly rollup for >90-day data).

Dynamic Tags → Core#

v2.74.0–v2.74.4: 22 opt-in shortcodes for evergreen content (date/time, copyright spans, post views, read time, visitor IP) with conflict-aware registration and an allow-listed inline processor for managed-link anchor text. Off by default. The tag engine was then extracted to Gillish Core in v2.91.30, so the tags now work across the whole site, not just inside Node. Node keeps only the inline processor that expands those tags inside managed-link anchor text when Core is active, the same mirrored-extraction shape as Conditional Content below.

Post-audit + Plugin Check + Semgrep#

The post-audit cleanup window (v2.74.5 → v2.76.0) ran a full-codebase audit, an A/B-toggle gate bug, silent partial-save failures in the link editor, uninstall hardening, cache-safe dynamic tags, and six verification follow-ups, each on its own commit for clean bisects. Then the Plugin Check cleanup (v2.76.1 → v2.76.8) closed every wp.org-blocking finding, and a Semgrep security pass (v2.77.0 → v2.77.5) followed.

Dashboard redesign + dark mode#

v2.78.0 → v2.78.6 rebuilt the dashboard as a bento grid (layout, real data, a Chart.js click-trend with drill-down, a Content Graph mini-preview, an onboarding wizard). The dark-mode rollout (v2.78.7 → v2.78.29) then took the global colour-scheme switcher across every admin page, 22 follow-up fixes that are why the light + dark pairing rule is now non-negotiable for new work.

Conditional Content → Cairnstone#

The Conditional Content module shipped in v2.79.0 → v2.90.9 (phases 1–7 + a verification round), then was extracted to the standalone Gillish Cairnstone plugin in v2.91.0. Cairnstone now owns the block, shortcode, settings tab, analytics page, REST endpoint, and its events table; Node’s v2.91.0 migration dropped the legacy table and swept the related options. Cairnstone reads visitor country through Node’s existing gillish_node_resolve_country_code filter when both are active, the first better-together bridge.

The catch-up + maintenance line#

A 13-version uncommitted history (v2.78.29 → v2.91.5) was landed as one honest catch-up commit, the dev toolchain was brought into git and upgraded (PHPStan 2.1), the .plans/→plans/ rename made the planning docs Obsidian-visible, the minimum PHP was raised 8.1 → 8.2 (so the floor is exercised on the local matrix), and the in-admin Documentation page was removed in v2.91.6 in favour of this ecosystem docs site, mirroring the move Gillish Cairnstone made earlier.

Active roadmap#

Active plans live in plans/; when one ships it is summarised in plans/DONE-WORK.md and the original file deleted, so the list below is always pending-or-in-progress work.

High priority: direct revenue or adoption impact#

  • Cairnstone Synergy, hooks + REST + Disclosure injector. Four sequenced chunks: the gillish_node_resolve_managed_link filter, the Sandbox REST endpoints (typeahead, single-link, compact health), the the_content Affiliate-Disclosure auto-injector, and the per-post + global override surface. Node v2.92.x exposes the read surface; Node v2.93.x ships the injector once Cairnstone has a disclosure block to inject.
  • Migration wizard for 9 competitor plugins · IMPORT-EXPORT-PLAN.md. One guided wizard, one adapter per source (Pretty Links, ThirstyAffiliates, Lasso, Link Whisper, ILJ, Linkilo, Rank Math, AAWP, Auto Affiliate, Easy Affiliate), one undo token per import. LinkCentral shipped as Phase 1.
  • Competitive feature-parity closure · COMPETITIVE-FEATURE-GAPS-PLAN.md. Cross-walks every competitor feature against Node’s coverage; Tier 1 unblocks migration fidelity, Tier 3 (Amazon PA-API, product showcase) opens a new category.
  • Lemon Squeezy / Pro licensing · lemon-squeezy-plan.md. License manager, activation/validation/deactivation, encrypted key storage, WP-Cron revalidation, update checker, and feature gating via the existing FeatureGate stub. Required for any commercial release.

Medium priority: meaningful feature wins#

  • A/B Testing enhancement backlog · AB-TESTING-PLAN.md. MVP shipped; significance click-lead alerts (daily cron + rate-limited email + dismissible admin notice, honest framing: "click lead", never "winner") landed in v2.91.29. Pending: REST variant_id + /ab-test routes, drag-to-reorder variants, an active-tests dashboard widget, demo-data seed, and the now-unblocked auto-pause-losing-variants follow-up. (Conversion / multivariate split-testing routed out to a standalone-plugin concept.)

Lower priority: niche or experimental#

  • External link hover preview · Plan - hover preview.MD. Screenshot-based hover previews on external links, third-party screenshot API + frontend JS hooked into LinkRenderer::render_anchor(), cached under wp_upload.

Competitor Analysis was moved out of Node’s roadmap on 2026-05-02, bundling a crawler in a link-management plugin carried reputational and ethical cost, so it is now scoped as its own standalone plugin, Gillish Mesh. AI/LLM work is deferred indefinitely per a standing decision.

The plans corpus#

The plans/ folder is excluded from the build zip , these documents never reach end users, but it is the strategic working surface. This page mirrors its shape; the folder itself is not relocated. Its structure:

  • Active plans: the roadmap files above (IMPORT-EXPORT-PLAN.md, COMPETITIVE-FEATURE-GAPS-PLAN.md, lemon-squeezy-plan.md, AB-TESTING-PLAN.md, GOOGLE-ANALYTICS-SEARCH-CONSOLE-PLAN.md, GEOIP-BUNDLED-DATABASE-PLAN.md, Plan - hover preview.MD).
  • Shipped log: DONE-WORK.md · every finished plan is summarised at the top under a dated section (concrete src/ paths, option keys, hook names) and the original plan file deleted, so finished work doesn’t pile up next to active work.
  • Three cross-plan holding tanks: deferred-plans.md (fully scoped but blocked on a decision or deferred on low ROI), polish-backlog.md (ad-hoc micro-improvements), and AI-implementation-plans.md (every AI/LLM idea; AI is deferred). Each is self-contained, a future agent can act on an entry without reading the origin plan.
  • Reference: autolink-current-system-overview.md (the go-to read before touching the auto-link engine), adjacent-initiatives-from-autolink-brainstorm.md (triage tank), on-demand.md (future possibilities).
  • Competitive intelligence: the per-competitor research that feeds the migration + parity plans lives in a separate gillish-comps sibling tree (moved out of plans/ 2026-05-16), not in the plugin repo; the active plans above consume it.

Ecosystem position#

Node is one tool in the Gillish network (Core · Node · Cairnstone · Feed · Mesh). It stands on its own and gets better together with the siblings: its gillish_node_resolve_country_code filter already feeds Cairnstone’s Conditional Content, and the planned Cairnstone Synergy surface (above) makes Node the link intelligence hub behind Cairnstone’s design layer. When Gillish Mesh ships, a small Node-side change adds cross-navigation so users running both get a soft better-together experience, without Node itself growing beyond its scope. Ecosystem-spanning infrastructure (this docs network, global memory) is owned by Gillish Core, not lodged in whichever plugin created it first.