Where the topic system stands today: what readers can already use on the draft site, what is built but not yet connected, and the decisions we need from VLCT to finish it.
The migration carried over every topic tag from Drupal. On top of those tags we have built a subject tree that groups them into twelve areas, and that tree already powers the topic filter in the draft Resource Library. The remaining work is to connect the tree to the topic overview pages and give every topic a proper landing spot with a sidebar.
Topic filter in the Resource Library · topic overview pages with their resource lists · nine hub pages with section sidebars.
Each subject now points at its overview page; overview pages, their curated items and the plain tag listings all carry the subject sidebar. The library now pins each topic's overview card first (#85, 27 Sep); a visual pass (#91) is what remains.
All eight decisions have an answer or a direction as of 23 September (one provisional, one awaiting wording), each with its own handover page, plus a handful of naming questions (what does VOSHA stand for; how to label Acrisure).
Most of the confusion on this subject comes from three separate things sharing one name. They are all real, they all exist on the draft site today, and the job is to connect them.
The labels attached to each resource, news item, FAQ and page. Migrated as-is from Drupal. Each has an automatic listing at /topic/<name>/.
A hierarchy that groups the tags: Finance & Taxes › Property Taxes › Tax appeals. One tag can sit in two branches (Social Media is under both Governance and Technology). Drives the library's topic filter.
Live on draft site Approved 31 AugThe hand-written pages VLCT staff maintain, such as Town Meeting or Property Taxes. Migrated with their content and their resource lists.
Migrated all become hubs (confirmed 23 Sep)Of 70 tree nodes, about 34 have an obvious overview page, about 10 have two candidates, and 26 have none. Five of those 26 are large subjects with no page at all:
| Subject | Tagged items | Page today |
|---|---|---|
| Housing | 314 | none |
| Energy & Environment | 244 | none |
| Economic & Community Development | 160 | none |
| Disability Access (ADA) | 109 | none |
| Transportation | 107 | none |
Until a page exists, the plan gives these subjects a sidebar on their automatic tag listing, so every subject has a landing spot.
Nine hubs have one. The other ~21 overview pages get a department sidebar (Legal Support or Insurance) or nothing. The 89 automatic tag listings at /topic/… render the library shell with no sidebar and are linked from nowhere. (The prototype, by contrast, makes /topic/… the main topic page for every node, so the two sites currently disagree about what that address is for.)
The new resource page footer prints the topic name as a heading on roughly 4,700 resource pages. 17 tags start with an in-house acronym (PACIF, VERB), three start with "ADVOCACY:", eight carry a "- Legal" or "- Operational" suffix. Readers who are not the person who buys the insurance will not decode "PACIF VOSHA OSHA".
37 of 89 names read correctly as a heading today/all-topics/ is a 29-link icon grid copied from Drupal. Two links are dead on the draft site (Grants & Funding moved; Public Works Safety Briefs is a draft). The plan regenerates it from the tree so it cannot drift again.
"Executive session" and "Elections & Voting" exist in the tree but roll up no tags. "Infrastructure" appears twice (under Public Works, and as the Housing & Infrastructure area). Federal Funding has two competing landing pages. All are small data edits once VLCT confirms the direction.
The same subject on the current site, the WordPress draft and the design prototype. The draft is where the real content lives; the prototype shows the intended look and navigation.
| Subject | Current site (Drupal) | WordPress draft | Design prototype | Status |
|---|---|---|---|---|
| Town Meeting overviewthe page that started this work (#65) | /topics-all/town-meeting200 | /topics-all/town-meeting/200 | /topic/town-meeting (library filter)SPA | hub lists rebuilt, sidebar live |
| Property Taxes overviewhub with four child subjects in the tree | /topics-all/property-taxes200 | /topics-all/property-taxes/200 | /topic/property-taxes (library filter)SPA | hub |
| Grants & Funding overviewmoved under Municipal Operations Support; old link on All topics is dead | /grants-and-funding200 | /municipal-operations-support/grants-and-funding/200 | /topic/grants-funding (library filter)SPA | hub old path needs redirect |
| Resource Library, filtered by topicwhere the 12-area tree is already in use | /resource-library200 | /resource-library/200 | /resource-librarySPA | live 12 areas instead of 87 checkboxes |
| All topics index29-link icon grid; two dead links on the draft | /all-topics200 | /all-topics/200 | — | hand-maintained regenerate from tree (decision 6) |
| Housing, a large subject with no page314 tagged items; only the automatic tag listing exists | — | /topic/housing/200 | /topic/housing (library filter)SPA | orphan listing gets a sidebar in phase 3 |
| A resource page footerwhere a topic name becomes a heading ("More about …") | — | /resource/24-v-s-a-section-4302/200 | — | names not ready decision 5 |
| Prototype with the full 70-node treebranch preview built today; production prototype still has the 61-node tree | — | — | preview: /topic/housing (library filter)SPA | preview Housing now has a topic page in the prototype |
Link checks run 27 September 2026. The prototype is a single-page app, so every address answers; its topic pages use sample data, not VLCT's full content. "SPA" marks those links.
The tree as it stands on the local draft after the 23 September tidy-up (two empty nodes removed, Public Safety moved to a child, Infrastructure renamed, Technology collapsed; 68 nodes), with the tags each node gathers and the overview page attached to it. Counts are published resources / all published items. Click a node to open it; tag chips open that tag's listing on the draft site.
Each of these is a genuine editorial call, not a technical one. We have a recommendation for every one so the meeting can be a yes/no rather than a discussion from scratch.
Confirm the twelve-area tree on the draft site is the structure going forward, and retire the prototype's earlier, incomplete version.
Stay as a page (URLs unchanged, survives a re-migration) and be admitted to the Resource Library as a "Topic overview" card pinned first for its topic. Converting to a resource stays open as a later one-script step.
On the tree node (one screen shows the whole map) or on the page (editors find it where they edit content).
Keep every legacy path as it is (/topics-all/town-meeting), or move to a tidy /topics/finance-taxes/property-taxes/ scheme with redirects.
Six pure renames need no re-tagging (for example "ADVOCACY: VLCT's Municipal Policy" → "Municipal Policy", "Economic & Community Development" → "Economic and Community Development"). Merging the eight "- Legal / - Operational" suffix tags into their parents does re-tag content. Is the Legal/Operational split something staff use?
Regenerate it from the tree (12 areas with their children and icons), or keep the hand-picked 29-link grid and fix its two dead links.
Hub sidebars list hand-picked resources (7 of 133 for Town Meeting). Keep curation, and add an automatic "All 133 resources tagged Town Meeting" link at the bottom of each group?
The prototype only shows a topic as a filtered library. The draft site's hub pages (overview text, curated sidebar, resource list) have no prototype counterpart. Approve the hub page as the design, or ask for a prototype treatment of one topic page first.
Carried over from the rollup review (#32), none block anything (handover page; all seven approved 23 Sep, with one follow-up: "Municipal Operations and Services" is a catch-all subject, not the MOS department, and may deserve its own node): Social Media filed under both Governance and Technology (confirm); retire the "Municipal Assistance Center" tag since the Department filter covers it; Case Law and VLCT RFP (dormant: retire or leave); four low-confidence placements (First Amendment, Surveys and Research, Municipal Operations and Services, Solid Waste).
Full inventory of tags, tree, pages and sidebars; seven questions above. Written 11 Sep. One question settled, six for this meeting.
Resolve the two empty nodes, the double Infrastructure, the root that carries a tag directly, the placement questions and the six renames. Every edit is one node in wp-admin and reversible.
Add a "landing page" field to each tree node, fill it from the draft mapping in the explorer above, retire the stub pages with redirects, mark every linked page as a hub automatically.
Overview pages, their curated children and the automatic tag listings all get the same branch sidebar from the tree. Overview pages appear in the Resource Library as "Topic overview" cards, pinned first for their topic.
Smaller than it looks: 26 of 28 pages already carry VLCT's own resource picks. A script turns those into curated sidebar lists; staff prune rather than compose.
"All topics" regenerated from the tree; the mega menu's "Browse by topic" links go live to the 12 areas; breadcrumbs follow the tree.
Merge suffix tags and the three overlapping groups only if VLCT says the Legal/Operational split is not needed. Done last so the filter does not shift twice.
Redirect map for retired stubs; one page per area × landing, child, listing = 36 checks plus the index and menu; client walk-through by area.
Every change made while preparing this report is tracked in a GitHub issue that records what was done and the exact step to reverse it. Nothing here touches vlct.org, and nothing was deployed to the draft site today; code changes stay on review branches until Viv promotes them.
| Issue | What it covers | Phase | Status |
|---|---|---|---|
| #81 | Umbrella: this report, the decisions, and every sub-issue | — | tracking |
| #82 | Tree tidy-up: empty nodes, root carrying a tag, Infrastructure twice, Technology one level too deep | 1 | 4 of 5 deployed Risk Management on hold |
| #83 | Link each tree node to its overview page; seed from the draft mapping | 2 | deployed 23 Sep |
| #84 | One branch sidebar for landing pages, curated children and tag listings | 3 | deployed 23 Sep |
| #85 | Overview pages in the Resource Library as "Topic overview" cards, pinned first | 3 | deployed 27 Sep |
| #86 | Glossary expansions for PACIF, VERB, CHIP, ARPA and friends | 6 (early) | deployed 23 Sep |
| #87 | All-topics: two dead links now; regenerate from the tree after decision 6 | 5 | deployed 23 Sep VLCT to review on the draft |
| #88 | Mega menu "Browse by topic" becomes real links | 5 | deployed 23 Sep |
| #89 | Federal Funding has three landing pages; pick one | 2 | deployed 23 Sep |
| #90 | Curated sidebars for the ~21 non-hub pages, seeded from their own resource lists | 4 | deployed 23 Sep |
| #91 | Topic overview page: visual pass with the prototype tokens (from decision 8) | 3 | queued |
| #92 | Hover glossary: acronyms and jargon explain themselves in place, no renames (from decision 5) | 6 (early) | deployed 23 Sep |
| #94 | Hub sidebar: Overview row looks active on the hub page | 3 | deployed 23 Sep |
| #95 | Related Links on 235 resources move from the body into the sidebar card | 3 | deployed 23 Sep |
| #98 | Tagged resources lead with their subject branch, not a department panel (with a preview) | 3 | deployed 23 Sep |
| #99 | Department panels: open the group matching the page's topics; Overview for heading-less groups needs a page (decision) | 3 | built, on a branch Overview page: needs VLCT |
| #100 | Related Links card: "Hub" / "Overview" eyebrow on hub pages | 3 | wording: needs Kalman |
| #102 | All-topics page itself picks up a subject sidebar (index page, untagged) | 3 | queued |
| #103 | Sidebar "All N resources tagged …" counts what the listing shows | 3 | deployed 24 Sep |
| #104 | Mega menu "Browse by role" opens the library filtered to the area's roles | 5 | deployed 24 Sep |
| #105 | Role tagging round 2: untagged corpus + editorial long tail, applied on staging | — | applied 24 Sep review: needs VLCT |
| #107 | Library rail opens the active facet group; Topic and Show collapse otherwise | 5 | deployed 24 Sep |
| #108 | Events: topic + department on events, tagging by role/topic first, MAC events filter, sync-time auto-tagging | — | deployed 24 Sep advocacy roles: needs VLCT (#21) |
| #109 | Events need classification at the source (ClearVantage): category, department, audience roles, topic | — | needs VLCT + Euclid |
| #143 | Which topics get an overview page; automatic most-viewed sidebar list for the rest | 4 | deployed 27 Sep |
| prototype #102 | Bring the prototype's topic tree up to the 70-node WordPress tree | — | agent working |
| When | What | Where | Undo | Issue |
|---|---|---|---|---|
| 17 Sep 09:35 | Created the report hosting: private repo vivwebsolutions/vlct-reports with GitHub Pages, and Cloudflare Pages project vlct-reports. Both carry noindex. | GitHub · Cloudflare | gh repo delete vivwebsolutions/vlct-reports · wrangler pages project delete vlct-reports | #81 |
| 17 Sep 09:38 | Removed a stray Cloudflare Worker that the wrangler CLI created as a side effect while making the Pages project. | Cloudflare | Nothing to undo; it was never referenced. | #81 |
| 17 Sep 09:52 | Filed the umbrella issue and nine sub-issues covering phases 1–5 of the plan, each with its own undo step. Filed one issue on the prototype repo. | GitHub issues | Close the issues. | #81, #82–#90, prototype #102 |
| 17 Sep 09:55 | Started five implementation agents on the agent-ready tickets: node → page link (#83), branch sidebar (#84), glossary expansions (#86), All-topics dead links + mega-menu links (#87, #88), prototype tree sync (#102). They work on separate git branches and do not deploy to the draft site. | Local worktrees | Delete the branch. Any data written to the local database is by a script with a --revert switch. | #83, #84, #86, #87, #88, #102 |
| 17 Sep 10:12 | Prototype topic tree brought up to the WordPress tree: 61 → 70 nodes, 56 → 86 of 89 tags. Deployed as a branch preview; the production prototype is unchanged. Also added an export script in the migration repo so the two cannot drift again. | Prototype branch <code>chore/topics-tree-sync</code> · migration branch <code>topics-export</code> | Delete the two branches; the preview deployment can be deleted or ignored. | prototype #102 |
| 17 Sep 10:20 | Glossary expansions for topic acronyms: 11 entries seeded on the local draft (PACIF, VERB, CHIP, ARPA, VEM, OSHA, DPW, RFP, MAC and two composites) plus a display-name rule the theme uses for headings, chips and filter labels. Result: 39 tags show their tree label, 10 their glossary name, 40 stay as-is; only Acrisure, CHIP and VOSHA remain flagged for VLCT. | Branches <code>topic-glossary</code> and <code>topic-glossary-resource-single</code> · local database only | Run the seed script with revert (deletes exactly those 11 entries); do not merge the branches. | #86 |
| 17 Sep 10:22 | All-topics page: the two dead tiles fixed on the local draft (Grants & Funding now points at the moved page and has a pinned redirect; Safety Briefs points at the workplace-safety listing until VLCT decides whether to publish the draft resource). Previous page content is kept in a hidden field. | Branch <code>topic-nav-links</code> · local database only | Run the fix script with revert; it restores the stored content. | #87 |
| 17 Sep 10:22 | Mega menu "Browse by topic" now renders the 12 areas from the tree as real links with live counts that match the Resource Library filter. | Branch <code>topic-nav-links</code> · theme code only | Do not merge the branch. | #88 |
| 17 Sep 10:25 | Each tree node can now point at its overview page. A new "Landing page" field on tree nodes, helper functions for the theme, and a seed script that linked the 31 unambiguous nodes on the local draft (9 existing hubs + 22 single-candidate pages). 16 nodes are left for a human because they have two candidates or only a placeholder page; 23 nodes have no page and fall back to their tag listing. | Branch <code>topic-landing-link</code> · local database only | Run the seed script with revert; it clears exactly the links it wrote (logged by node). | #83 |
| 17 Sep 10:35 | One branch sidebar for every topic surface: overview pages, their curated children and the automatic tag listings now get the same sidebar built from the tree, titled with the subject area, with an "All N resources tagged …" link per group and breadcrumbs that follow the tree. Verified against the local data in ten scenarios; needs a visual pass on the draft site before it ships. | Branch <code>topic-branch-sidebar</code> · theme code only | A one-line switch turns it off without a deploy; or do not merge the branch. | #84 |
| 23 Sep | All-topics page rebuilt from the tree on the local draft: 12 area cards with icons, 41 subject links underneath, counts matching the library filter. The old 29-tile grid is stored in a hidden field. Finding: the migrated page had no intro text at all, only the tiles, so there is none to preserve; VLCT may want to write one. Awaiting VLCT's review on the draft site (decision 6). | Branch <code>topic-nav-links</code> · local database only | Run the rebuild script with revert; it restores the stored grid exactly. Or do not merge the branch. | #87 |
| 23 Sep | The four approved tree edits applied on the local draft: two empty nodes removed, a new "Public Safety (general)" child so the area is a pure grouping, "Infrastructure" renamed "Infrastructure & Utilities", Technology collapsed to one node. 70 to 68 nodes, still 12 areas and 86 tags. Risk Management untouched. The committed tree file was regenerated to match. | Branch <code>topic-tree-phase1</code> · local database only | Run the phase-1 script with revert; verified to restore every node byte for byte. The previous tree file is in git history. | #82 |
| 23 Sep | Curated sidebar lists seeded for 17 overview pages (86 items) from the resource picks already in each page's body, on the local draft. Five pages need a person: two have no embedded list, three share one department-wide list. The hub marker itself is deliberately not applied yet; it goes on at merge time after the sidebar branch, per the precedence rule settled today. | Branch <code>hub-children-from-embeds</code> · local database only | Run the seed script with revert; it removes exactly the 86 items it wrote (logged by page). | #90 |
| 23 Sep | Federal Funding: the Municipal Operations Support page is now the subject's landing page and a hub; the ARPA page is its first listed child; the two placeholders (Federal Funding and Civic Engagement) are set to draft and redirect to the real pages. Their child pages keep working. Flagged for a later pass: a second Federal Funding placeholder under /topics-all/federal-funding/arpa/ was left alone, and the All-topics page still links the old path (a redirect once merged). | Branch <code>federal-funding-landing</code> · local database only | Run the script with revert (restores the placeholders and the links exactly) and remove the two redirect rows. | #89 |
| 23 Sep | Hover glossary built: acronyms and jargon show a short explanation on hover, focus or tap, on tag chips, listing headings, filter labels and the first mention in body text. 16 descriptions seeded from VLCT's own wording on the local draft. VOSHA and Acrisure are entries with no text, flagged in admin as needing VLCT's wording, and show no tooltip until they have it. No term was renamed. | Branch <code>hover-glossary</code> · local database only | Run the seed script with revert; the feature has a switch and the branch can be left unmerged. | #92 |
| 23 Sep | Deployed to the draft site: on a hub page the sidebar's Overview row now shows as the current item (it previously had no visible active state). The deploy also carried a mega-menu refinement from another session that was already on main. | <code>main</code> → p1vlct.wpenginepowered.com | Revert the one commit and redeploy. | #94 |
| 23 Sep | Related Links moved from the body text into the sidebar card on 284 posts (273 resources, 10 member products, 1 page; 837 links), applied on both the local draft and the WP Engine draft. The migration source is fixed on a branch so a re-run keeps them in the sidebar. Five duplicate links within single lists were collapsed. | Branch <code>related-links-sidebar</code> (pushed) · local and WP Engine databases | Run the script with revert on either site; every body is restored exactly from a stored copy. | #95 |
| 23 Sep | Sidebar rule changed on the sidebar branch: a tagged resource now leads with its subject's branch instead of a department panel it isn't part of; the page itself is the highlighted row; the department becomes an "Also in" card. The subject is chosen from the page's own Related Links first (VLCT's editorial signal), then its narrowest tag. Verified on Highway Reclassification and four control pages; a one-line switch restores the old behaviour. Mock: preview page. | Branch <code>topic-branch-sidebar</code> (pushed) · theme code only | Filter to false, or do not merge. | #98 |
| 23 Sep | Department panel sidebars (Legal Support, Insurance, Advocacy, About) now open the group that matches the page's topics and show the page as a highlighted row inside it, where the panel is the main sidebar. On the way, the Insurance sidebar was folded onto the shared renderer (an old open item). Overview rows for heading-less groups wait on a page to point at. | Branch <code>panel-open-by-topic</code> (pushed) · theme code only | Filter to false, or do not merge. | #99 |
| 23 Sep | Deployed to the draft site. All eleven topic branches merged to main (theme 0.2.15) and deployed; the eight data scripts run on WP Engine in order. One ordering slip (hub marker before curated children) caught and fixed the same hour. Verified on staging: subject sidebars on overview pages, curated children, tag listings and resources; the tree tidy-up; glossary entries; the All-topics grid; Federal Funding landing page; mega-menu links. | <code>main</code> → p1vlct.wpenginepowered.com · WP Engine database | Each data script has a revert word on the server; each sidebar feature has a switch; code can be reverted commit by commit. | #81 |
| 24 Sep | Sidebar counts now match the listing they link to: "All 30 resources tagged Governance" leads to a page showing 30. Previously the sidebar used the raw tag count (160, including hidden link and document stubs). One rule now: reader-facing topic counts use what the listing shows by default. | <code>main</code> → p1vlct.wpenginepowered.com | Revert one commit and redeploy. | #103 |
| 24 Sep | Mega menu "Browse by role": each of the seven areas now opens the Resource Library with that area's roles pre-selected and shows a live count (91 to 316). The area pages stay one setting away. | <code>main</code> → p1vlct.wpenginepowered.com | One setting (link_from) restores the area-page links; or revert the commit. | #104 |
| 24 Sep | Role tagging round 2 started: crosswalk over the untagged corpus (including the 4,556 legal-citation stubs), LLM pass on ~460 untagged editorial posts, then the same applied on the draft site. Everything stays flagged as machine-generated; the 838 low-confidence rows and the 31-role vocabulary remain for VLCT to review. | Branch <code>role-tagging-round2</code> · local database, then WP Engine | Database dump taken before writing; each applier logs what it wrote. | #105 |
| 24 Sep | Resource Library filter rail: the group you arrived through is the open one. Coming from "Browse by role" opens Role and collapses Topic; a plain visit still opens Topic; Show starts collapsed. | <code>main</code> → p1vlct.wpenginepowered.com | Revert two commits and redeploy. | #107 |
| 24 Sep | Audience pages' "Training & events" column: it lists upcoming events tagged for the page's area, and those tags have now reached the draft site, so Public Works & Highway shows its three highway trainings. The stale "calendar not migrated" wording is replaced with an honest empty state. Events arriving from ClearVantage will be tagged at sync time (in progress). | <code>main</code> → p1vlct.wpenginepowered.com | Revert one commit and redeploy. | #108 |
| 24 Sep | Events classification at the source: the ClearVantage feed sends no category, audience, topic or department per event, so every tag on an event is currently inferred from its title. Filed the client and Euclid asks with a draft Euclid ticket: expose or add those fields, decide the values, tag events at creation, back-tag the 2026 programme. | GitHub issue | Nothing to undo; inferred tags remain the safety net until the fields arrive. | #109 |
| 24 Sep | Events now carry topic and department tags (89 and 83 of 91 locally; the published upcoming set on the draft site is tagged the same way), a department filter exists for events lists so the MAC page can show its own, and newly synced ClearVantage events are tagged automatically on arrival. All flagged as machine-generated until the source fields exist (#109). | <code>main</code> → p1vlct.wpenginepowered.com · both databases | The script's revert on either site; the auto-tagger has a switch. | #108 |
| 24 Sep | Role tagging round 2 applied on both the local and the draft databases. Coverage by type: resources 8 → 92%, pages 50 → 64%, articles 36 → 89%, news 64 → 83%, FAQs 85 → 100%, handbooks 58 → 99%, legislative reports 51 → 94%, classifieds 40 → 61%, events 22 → 88%. Role assignments on the draft site: 7,347 → 33,051. Everything is flagged as machine-generated; 1,868 low-confidence rows are listed for human review. | Branch <code>role-tagging-round2</code> (merged) · local and WP Engine databases | A revert script keyed by method and date on either site, or the database dump taken before the run. | #105 |
| 27 Sep | Topic overview pages now appear in the Resource Library as "Topic overview" cards, pinned first when their topic is filtered (e.g. Town Meeting). Built by another session with the decision on which topics get an overview page and an automatic most-viewed sidebar list for the rest. | <code>main</code> → p1vlct.wpenginepowered.com (theme 0.2.39) | See the two issues; code only. | #85, #143 |
#32 rollup approval #62 naming audit #65 topic-page lists #42 hub pilot #47 sibling-hub IA #51 sidebar coverage #67 Overview rows #12 role filter (live)