POD Governance — Design History
Mockup iteration log, sourced from git history — most recent first
🔄 v897 iterations total ✅ 897 releases ← Back to index
v897 — Current 📚 KT Knowledge Base — new feature mockups: KB navigator and session detail (#5656) 31 Oct 2026
New feature
  • kt-knowledge-base.html — new screen. Three-level navigator (sub-project → topic → session switcher), embedded video player with timestamp seek, AI-generated article viewer with “▶ Watch at X:XX” deep-links, and table of contents sidebar.
  • kt-session-detail.html — new screen. Tabbed session management: Overview, Upload Files (transcript .vtt/.docx + video), AiDE Processing (pre-flight checklist, SSE progress bar), Knowledge Base (article viewer + mini player), Run Log.
  • Feature: Project → SubProject → KtTopic → KtSession → KtArticle hierarchy. AiDE processes the transcript and generates structured KB articles with recording timestamp deep-links. Video is uploaded directly to application storage and streamed via HTTP range requests. Implementation items: Feature #5656, PBIs #5657–#5671.
v896 🗑️ Meeting list: delete an occurrence from its row, beside Upload transcript (#5594) 27 Oct 2026
Parity
  • meeting-notes-ai.html — each series occurrence row has a 🗑️ Delete button for those who may delete it (canDelete, the API’s canDeleteMeeting). It opens the same confirmation as the meeting page, deletes only that occurrence, and the toast says “Occurrence deleted”.
  • help.html — one sentence on the new button. Owner request 2026-10-26; built in the app in the same change (#5594), so no separate implementation item.
v895 🔒 Meeting list: only System Admins see the hidden-meetings count (#5514) 26 Oct 2026
Parity
  • meeting-notes-ai.html — the “🔒 N further meetings” line now shows only when previewing as an admin, in the app’s wording. Telling anyone else that meetings they cannot open exist is itself a disclosure (owner decision 2026-10-26).
  • PAGES.md says it is admin-only. Built in the app in the same change (#5514); no separate implementation item.
v894 🤝 Mark as left and Hand over list the tasks the leaver raised for others (#5567) 26 Oct 2026
Parity
  • admin/admin.js — both dialogs show “Open tasks they raised for others” when there are any. Only the raiser may edit a standalone task, so the person chosen becomes their raiser; each task keeps its assignee (owner decision 2026-10-26, option B).
  • Built in the app in the same change (#5567); no separate implementation item.
v893 🔍 Command palette reaches Admin · Webhooks (#5554) 26 Oct 2026
Parity
  • assets/js/command-palette.js — an Admin · Webhooks entry for admins and the PMO, as the app’s palette has had since #5110. It was the one sidebar screen the mockup’s palette could not reach.
  • Mockup catching up to the app; no implementation item.
v892 🎬 Help: Read the transcript under each tutorial video (#5553) 26 Oct 2026
Parity
  • help.html — every tutorial video has a closed “Read the transcript” section, as in the app (#5128). In the app it loads the video’s own captions; the mockup shows a short sample.
  • Mockup catching up to the app; no implementation item.
v891 🤝 Admin Meetings register says when it lists only the newest meetings (#5552) 26 Oct 2026
Parity
  • admin → Meetings — “Showing the newest 5,000 meetings. Older meetings are not listed or searched here; Export CSV searches them all.” above the filters, as the app shows it when the list is capped (#5477). Behind a demo link.
  • Mockup catching up to the app; no implementation item.
v890 ❓ Help explains meetings awaiting a transcript (#5546) 26 Oct 2026
Parity
  • help.html — Meeting Notes AI: five tiles, with 📥 Awaiting your transcript; the status row adds 🗓️ Upcoming, Ready to process and Processing failed; the 📥 Upload transcript button and the 📥 N awaiting chip (#5537).
  • help.html — My Work: the Awaiting your transcript section.
  • The app’s Help changes in the same commit; no implementation item.
v889 🔑 Admin email templates list ET-081 Add Your AiDE Token (#5545) 26 Oct 2026
Parity
  • admin — ET-081, the daily reminder to add a missing or failing AiDE token (#5539), in the template list under Invitations & Access with the app’s steps and its “Add my AiDE token” button.
  • docs.html — the template codes now run to ET-081.
  • Mockup catching up to the app; no implementation item.
v888 📊 Reports: notes that match the app (#5511) 25 Oct 2026
Parity
  • reports.html — MoM success rate now says what the app counts: the share of AiDE minutes runs on meetings that did not fail (it said “without a retry” and that owners are notified, neither of which the report measures).
  • Email Deliverability — the “4 failures currently need attention” line is gone: nothing in the data tells a failure still needing attention from one already dealt with. Failed (1.8%) stays and is now in the app.
  • MCP, User Adoption, Evidence Attachments — the notes now read as the app writes them (distinct users in the last 30 days; who is emailed).
  • The app gained these in the same change (#5511); no separate implementation item.
v887 ⚙️ Admin catch up: deactivated-owner tokens, Retry failed, Send test, sign-in filter, missing templates, org CSV, small notices (#5527) 25 Oct 2026
Parity
  • MCP Tokens — “N tokens belong to deactivated accounts” with Revoke all N (#4209), the ● Owner deactivated pill, and 📁 N projects on a project-limited token (#4129).
  • Email Log — ↻ Retry failed (last 6 h), only when something failed, with the app’s confirmation (#4117). Webhooks — Send test on each live row, reporting delivered or failed (#4115).
  • People & Roles — Any Sign-In / No sign-in recorded / No sign-in in 90+ days (#4121), and the “first 1,000 users by name” notice (#4327). Access Requests — “another admin answered first” above the list (#5001).
  • Email Templates — “N emails are not being sent: … have no template in the database” (#4146). Org Hierarchy — ⬇ Export CSV (#4126). MCP Log — the list-cut-short note.
  • Mockup catching up to the app; no implementation item.
v886 📊 Reports & Health catch up: no-token notes, 2,000-cycle cut-off, Timeline all time, busy periods, leavers, load errors (#5525) 25 Oct 2026
Parity
  • reports.html — with no AiDE token, Ask is disabled with the “Connect your AiDE Fabric Token…” note (#5222; demo link or ?notoken=1); a fifth Cycle Status demo state shows the “newest 2,000 cycles” notes on Cycle Status and the U&D trend (#4333).
  • reports.html — Project Timeline Activity says All time and lists Top Active Projects; the Meetings report explains how action items with no meeting are counted (#3712/#3865); Action Item Ageing marks a leaver “has left · re-assign open items” (#5428).
  • project-health.html — a second demo row: 🔑 No AiDE token (warning, Refresh disabled, #5218/#5220), 📚 Busy period (“Only the latest 200 of 264 timeline events are read”, #5261), ⚠️ Lists fail to load (project / POD list and the delivery schedule, switches off), 📋 Clipboard blocked.
  • Mockup catching up to the app; no implementation item.
v885 🤝 Meetings catch up, second part: list cap notice, AiDE checking states, someone-else-changed-it message (#5523) 25 Oct 2026
Parity
  • meeting-notes-ai.html — ?capped=1: “Showing your newest 1,000 meetings…” above the totals; ?aide=checking / ?aide=unknown: 🔑 Checking AiDE… and ⚠️ AiDE status unavailable on the AiDE button.
  • meeting-notes-ai.html, my-actions.html — ?conflict=1: the next tick loses a race and says “Someone else just changed that action (item) — reloading to show its current state.” (#5495).
  • Mockup catching up to the app; no implementation item.
v884 🤝 Meetings catch up: people who have left, meetings you cannot open, item links, Copy minutes, thin transcripts (#5523) 25 Oct 2026
Parity
  • meeting-notes-ai.html — someone who has left stays named on their meetings and items with “has left”, and an open item they hold says “re-assign it”; no picker offers them (#5292/#5406).
  • meeting-notes-ai.html — ?item= opens the Action items tab with that item lit; 📋 Copy minutes, with the blocked-clipboard message (?clipboard=blocked); a too-short pasted transcript is flagged before the AiDE call (#4713).
  • my-actions.html — the meeting name is plain text when you are not part of the meeting (#5387); otherwise the link carries ?item=, in the row and in Details.
  • Mockup catching up to the app; no implementation item.
v883 🎯 Priorities & Achievements catch up: carried-over badge, week passed, real week comparison, recovered text, load errors (#5521) 25 Oct 2026
Parity
  • priorities/pl.html — ↩ Carried over from last week on your own rows (#4435); Submit off with “This week has passed…” (#5211); the “Due to be auto-approved within the hour” wording; a week that fails to load shows only the error and Try again (#5018); recovered text under the add box.
  • priorities/review.html — a recovered review comment with the app’s note.
  • priorities/history.html — Compare with previous week lists the previous week’s items, its status badge and “Compared with W..”, with loading and error states (#4410); a week that fails to load, and a linked week that is not listed.
  • priorities/cluster-head.html — a project list that fails to load says so instead of “No projects available” (#4450).
  • Mockup catching up to the app; no implementation item.
v882 📊 Ups & Downs catch up: PMO Export PDF, Timeline links, Risk Radar token note, recovered comments, chain load errors (#5519) 25 Oct 2026
Parity
  • workflow/pmo.html — 📄 Export PDF in the header (app #4203), and the chain’s Could not load state (#4508/#4513).
  • workflow/pl.html, pm.html — 🗓️ Project Timeline in the header, opening this project’s Timeline (#4112).
  • workflow/cluster-head.html — with no AiDE Fabric Token saved, the Risk Radar says so and links to My Profile; the last radar still opens (#5218). The Review Chain has the load-error state too.
  • Every workflow screen and Cycle Detail — a comment kept after a send that did not go through is restored with the app’s note (#4183/#4773/#4776); shown by a demo link under each comment box.
  • workflow/pm.html — the PL Submissions panel reads ⚠ Past the cycle deadline once the cycle’s date has passed.
  • cycle-history.html — when only part of the history loaded, a note says which figures come from the loaded cycles (#3178).
  • Mockup catching up to the app; no implementation item.
v881 🌐 Hub pages catch up: sign-up check-inbox, What’s New search, Timeline Show older, Status notices, email save errors (#5517) 25 Oct 2026
Parity
  • login.html — registering shows the check-your-inbox step (link and code) instead of signing straight in; a lapsed invitation gets the pending card with Resend (app #5250).
  • whats-new.html — search, Unread only (N), an N of M count and the two no-match messages (app #4131); the cards are the app’s 12 newest, generated into assets/js/whats-new-entries.js.
  • timeline.html — the Activity log says it shows the latest entries and offers Show older (#5262); the view is remembered per user (#5071); a linked project you cannot pick reads “(not available to choose)” (#3911).
  • status.html — Post a notice, Mark resolved and a two-step Remove work, for PMO / Admin only; others see the notices alone, and nothing when there are none.
  • email-preferences.html — a refused save shows the app’s error alert and changes nothing (demo: Saving fails).
  • Mockup catching up to the app; no implementation item.
v880 🔍 Meeting Notes AI: a shorter search placeholder that fits (#5533) 25 Oct 2026
Parity
  • meeting-notes-ai.html — the search box reads “🔍 Title or owner…”; the longer placeholder was cut off. Its aria-label keeps “Search meetings or owners”. The app makes the same change (#5533).
v879 📥 Meeting Notes AI: meetings awaiting a transcript are easy to find and upload for (#5536) 25 Oct 2026
New
  • meeting-notes-ai.html — a meeting that has not started yet reads 🗓️ Upcoming; “Awaiting transcript” (now amber) means it has taken place and nobody has uploaded a transcript. It had no date check, so every new occurrence showed it from 01:00 on its day.
  • meeting-notes-ai.html — a fifth tile, 📥 Awaiting your transcript, counts the past meetings and occurrences you may process with no transcript; a click filters the list to them and a second click clears it.
  • meeting-notes-ai.html — project groups and series cards show 📥 N awaiting; with the filter on, a series opens by itself and the Year / Month / Week branches holding an awaiting occurrence open too.
  • meeting-notes-ai.html — 📥 Upload transcript on an awaiting card and occurrence row, for those who may process it, opens the meeting at its upload card.
  • my-work.html — an Awaiting transcript tile and an “Awaiting your transcript” section (owner, organiser, co-owner; oldest first).
  • admin — the meeting register has the Upcoming status and an Awaiting Transcript tile that filters to them.
  • Implementation: #5537.
v878 ⚙️ Admin: AiDE Runs tab, Mark as left seat preview, Run Now confirmation, the app’s Audit Log filter lists (#5526) 25 Oct 2026
Parity
  • admin — AiDE is three tabs, ⚙️ Config | 📜 Runs | 📈 Usage, as the app. Runs is the run log: Type, Outcome (with Superseded), By, Project, From, To and Limit filters, a By type summary, and Time / Type / Outcome / By / Model / Scope / Duration with Customise and Export CSV. The usage trend follows the Window picker instead of a fixed 14 days.
  • admin — Mark as left previews each approval seat and who takes it; a required seat with nobody active above it needs “Choose who takes it” before Mark as left works (app #5277), and the temporary access grants to be withdrawn are counted (#5306).
  • admin — ▶ Run Now asks first (“Run job now”: it runs for real and skips time-of-day checks), as the app does since #4083. It fired at once.
  • admin — the Audit Log’s Entity and Event type filters offer the app’s lists: 23 entities and 208 actions in 9 groups, from assets/js/audit-catalog.js, generated from the app’s auditEntityLabels.ts and auditActions.ts.
  • Mockup catching up to the app; no implementation item.
v877 📊 Reports & Health: role gating, true captions, Past runs by period, Sources by scope, MCP guide in Help (#5524) 25 Oct 2026
Parity
  • reports.html — PMO / admin only, as the app (canViewOrgReports): the P&A export (card and Data Exports), the User Activity, Email Deliverability and MCP Plugin Usage cards, and the Email and MCP CSVs. A Delivery SPOC, POD Owner or Cluster Head no longer sees them.
  • reports.html — the app’s #5509 captions: the header names the scope with no typed-in year; Total Cycles reads “(YTD)” only with no range; Return Rate by Stage shows “{range} — {scope}”; a role-narrowed viewer sees “your projects” from the start.
  • project-health.html — Past runs lists only the selected period’s runs, with “No runs recorded for {period}.”; in POD and portfolio scope the Sources card drops Focus time and Evidence (Project scope only).
  • nav.js, profile.html — “MCP Setup Guide” and the Profile link open Help’s MCP topic, as the app does; mcp-guide.html stays as a reference page.
  • Mockup catching up to the app; no implementation item.
v876 🤝 Meetings: done needs a justification, Report Email gating, bulk due date skips others’ items, the app’s Delete confirmation (#5522) 25 Oct 2026
Parity
  • meeting-notes-ai.html — ticking an action item done opens “✓ Confirm completion” with a required Justification; the item closes only on Mark done (app #2380/#3412). Reopening needs no note.
  • meeting-notes-ai.html — the Report tab’s 📧 Email shows only to someone who may process the meeting, like the header button (app canEmailReport).
  • meeting-notes-ai.html — Delete asks “Delete this meeting?” / “Delete this occurrence?”, says when open items held by other people go with it (they are emailed) and which occurrence of a series it is, and confirms with “Delete meeting” / “Delete occurrence” (#5393). It was a bare browser confirm().
  • my-actions.html — bulk Set due date (v868) now behaves as the app: “Items you did not raise yourself will be skipped.”, a “Set date” button, only your own items change (canCurate), and “Updated X of N — Y could not be changed” with those left selected. Also fixes v868 storing the date as text, which broke every date on the page once used.
  • Mockup catching up to the app; no implementation item.
v875 🎯 P&A review states: view only, waiting on revision, accept revision, closed after acknowledgement, auto-approved card, own card (#5520) 25 Oct 2026
Parity
  • priorities/review.html — “👁 View only (PMO / Admin)” (on by itself for a PMO or admin demo user): no context alert, no action card, no per-item buttons, no edit, no note (app #5284).
  • review.html — “🔒 Acknowledged by the Cluster Head”: Return withdrawn with “🔒 The Cluster Head has acknowledged and closed this week, so it can no longer be returned.”; the informational line drops “You can still return it” (#5386).
  • review.html — “⬆ Higher-level reviewer”: a revised item you decided offers “✓ Accept revision” and “↩ Return item” (#5384).
  • review.html queue — a “↩ Waiting on revision” row that bulk approve cannot select (#5371).
  • priorities/history.html — PMO / admin see “👁 View” and “View reviews →” (#5284); no review link on your own card (#5369); the Project Lead is a reviewer here, as in the app.
  • priorities/cluster-head.html — an auto-approved member card: neutral “🤖 Auto-approved” badge and border, Acknowledge still live (#4023).
  • Mockup catching up to the app; no implementation item.
v874 ✅ Cycle Detail: Final Approve, the PL “not submitted yet” card, the seat state; PL “moved past” (#5518, part 2) 25 Oct 2026
Parity
  • cycle-detail.html — a “🏁 At the Cluster Head step” demo state: the Review Action card offers Final Approve (not Forward) with a required “Posted to leadership on” date, the app’s error without it and its “Final approval recorded” success (app #3901).
  • cycle-detail.html — “📝 Not submitted yet”: a Project Lead who still owes the cycle sees “Your Ups & Downs for this cycle are not submitted yet” with “Open the submission screen →” (app #3954). The page stays read-only for a PL.
  • cycle-detail.html — “🔒 Not this project’s seat”: no review card, no Add Note, no AiDE Account Update Generate (app canWrite, #5213).
  • workflow/pl.html — “🚪 Moved past the PL stage”: “This cycle has moved past the Project Lead stage, so it can no longer be submitted from here.” and no Submit (app #5368).
  • Completes #5518. Mockup catching up to the app; no implementation item.
v873 🔒 Reviewer pages: the “not this project’s seat” state, and Return to an empty seat greyed (#5518, part 1) 25 Oct 2026
Parity
  • workflow/spoc.html, pod.html, cluster-head.html — a “🔒 Not this project’s seat” demo switch. The cycle is at the viewer’s step, but they do not hold this project’s seat for their role, so Forward / Final Approve and every Return are disabled with “You can view this cycle, but you are not this project’s …, so you cannot act on it.” (app #5213), editing is read-only, the Cluster Head’s attachments lock, and Generate goes from the AiDE Account Update card.
  • Same pages — a “👤 … seat empty” switch: “Return to” a step nobody can act at is greyed with “Nobody can act at the … step on this project: the seat is empty or its holder is inactive.” (app #5392). Also ?vacant=pm in the URL.
  • The wording and the vacant steps live once, in assets/js/wf-preview.js; account-update-card.js gains setCanGenerate.
  • Part 2 (Cycle Detail Final Approve, the PL “not submitted yet” card, the PL “moved past” state) follows. Mockup catching up to the app; no implementation item.
v872 🏠 Dashboard, My Work and Projects: role gating and the facts they state, as the app (#5516) 25 Oct 2026
Parity
  • dashboard.html — with a project chosen, Total Cycles, Approved YTD and Active Cycles narrow to it and P&A Completion stays org-wide with “ⓘ org-wide (not project-scoped)”. This was the other way round.
  • dashboard.html — role gating: “By POD & project” only for a report role (and Customise can no longer bring it back); a Project Contributor’s cycle tiles cannot be opened and the Cycle History link is hidden (#5366); the Timeline link only for someone holding a role other than admin and Project Contributor (#4984); the reports doors no longer show to admin (the app’s report roles do not include it).
  • dashboard.html — the 🍅 Pomodoros today tile (app #4107), in its own row.
  • my-work.html — 🍅 Focus on each action row (#4101); “Awaiting your review” hidden for someone who can never review when nothing is waiting (#5411); the revised P&A row reads “Revised P&A priority … changed since you decided it”.
  • projects.html — Delivery SPOC, Sales SPOC, POD Owner and Cluster Head see “✏️ Edit project” when acting in that role (#4992).
  • Mockup catching up to the app; no implementation work item needed.
v871 ⬇️ Reports: the header export button says it downloads the cycles CSV (#5512) 25 Oct 2026
Bug fix
  • reports.html — the header button said “⬇️ Export All” and PAGES.md called it a “CSV of all data”, but the app’s button has only ever downloaded the cycles CSV. It now reads “⬇️ All cycles (CSV)”, with a title pointing to the Data Exports card for everything else. Same change in the app (ReportsScreen.tsx) and PAGES.md, in this commit.
v870 🐛 Projects: Request access works, and a cycle-type filter gets the right empty message (#5515) 25 Oct 2026
Bug fix
  • projects.html — openRequestAccess / closeRequestAccess were written inside <script src="assets/js/command-palette.js">. A browser ignores the body of a script tag that has a src, so both Request access buttons threw a ReferenceError. They now have their own script tag, loaded before the page script that builds the empty state.
  • Send request now behaves as the app does (RequestProjectAccess.tsx): it needs a project, shows “Request sent. The admin team has been told.” and “Your request for X is waiting for an answer (sent …)”, and hides the Request buttons while it waits.
  • A cycle-type filter that empties the list now says “No projects match…” instead of “No projects assigned to your account.” (the app counts that filter since #4082).
  • Mockup catching up to the app; no implementation work item needed.
v869 🔔 My Action Items: reminder and escalation counts in the History popup (#5505) 25 Oct 2026
Feature parity
  • my-actions.html — the 🕘 History popup now shows 🔔 N reminder(s) sent and ⚠️ N escalation(s) above the change trail, matching what the app's ItemHistoryButton renders since #5501.
  • Counts are passed from openItemHistory() to openHistoryPopup() as opts.reminders and opts.escalations. The pill row is omitted when both are zero (a completed item with no history of reminders).
  • Fixture: open items with reminders enabled show 2 reminders + 1 escalation; closed items show neither, matching the app's derivation from the audit trail.
  • Implementation already shipped (MyActionItemsScreen + ItemHistoryButton, #5501). No further impl work item.
v868 📅 My Action Items: bulk Set due date button and modal (#5504) 25 Oct 2026
Feature parity
  • my-actions.html — the bulk selection bar (☑ Select mode, List and Table views) now shows a 📅 Set due date… button beside ✓ Mark done…, matching the my-actions-bulk-due button shipped in #5503.
  • Clicking it opens a new BulkDueDateModal: a required date input, disabled Confirm until a date is chosen, and success collapses selection mode and shows a toast.
  • Implementation already shipped in the app (MyActionItemsScreen.tsx + BulkDueDateModal.tsx, #5503). No further impl work item.
v867 🔥 Meeting Notes AI: “Add to calendar” removed (#5419) 21 Oct 2026
Parity
  • meeting-notes-ai.html — the 📅 Add to calendar button is gone from the meeting card, the meeting page’s action row and the report view, with the code that built the .ics file in the browser. Duplicate now sits at the right of the card. Owner decision 2026-10-21: nobody used it, and it is not to come back.
  • The invitation email still carries its calendar file; the Dashboard and My Action Items calendar downloads are unchanged.
  • The app ships the same in #5419, so no implementation work item follows. Reverses v435 (#1524).
v866 💄 P&A: a Priorities heading in the last-week panel (#5405) 20 Oct 2026
Parity
  • priorities/pl.html — the “Last Week’s Priorities” panel labels its first list Priorities, in the same style as the Achievements heading below it. Owner request 2026-10-20.
  • The app ships the same in #5405, so no implementation work item follows.
v865 🤖 P&A auto-approval covers any first reviewer, not just the Project Manager (#5402) 20 Oct 2026
Parity
  • help.html — “If your first reviewer does not review within 36 hours”: a Project Contributor’s week is auto-approved when their Project Lead does not review it, as a Project Lead’s is when their Project Manager does not. The note no longer says a senior first reviewer is never stood in for. Owner decision 2026-10-20.
  • docs.html and the admin email templates (ET-066, ET-067): the trigger and recipient read “the first review step”, not “PM”.
  • The app ships the same in #5402, so no implementation work item follows.
v864 💄 ESO and Recruitment SPOC open a project on Cycle History (#5375) 19 Oct 2026
Parity
  • assets/js/command-palette.js — opening a project as ESO SPOC or Recruitment SPOC goes to cycle-history.html, not the SPOC review page, which the app does not let these roles open.
  • cycle-history.html — no “Back to Current Cycle” link for these roles (this page is their project view) or for a role with no workflow screen.
  • The app is changed in the same item (#5375); no implementation work item follows.
v863 💄 Dashboard: the Cluster Head P&A digest card no longer says read-only (#5373) 19 Oct 2026
Parity
  • dashboard.html — the Cluster Head's P&A card said “Read-only executive digest”, but on the digest they acknowledge and close each member's week. It now says so.
  • Copy only. The app is changed in the same item (#5373); no implementation work item follows.
v862 💄 Cycle History: a Cluster Head's bulk Final Approve asks once for the posted-to-leadership date (#5363) 18 Oct 2026
Parity
  • cycle-history.html — the bulk bar shows a Posted to leadership on date field to a Cluster Head, and Approve selected asks for it first, as the single Final Approve does (owner decision 2026-10-18).
  • The app is changed in the same item (#5363): it also offers bulk approve only on projects whose seat you hold, and names refused rows. No implementation work item follows.
v861 💄 Cluster Head P&A digest: “Acknowledged” means your own sign-off (#5365) 18 Oct 2026
Parity
  • priorities/cluster-head.html — a member a lower reviewer approved reads ✅ Approved, with Acknowledge & Close Week still live. “Acknowledged & Closed” appears only once you acknowledge (owner decision 2026-10-18).
  • The app is changed in the same item (#5365), so no implementation work item follows.
v860 💄 Timeline: a PMO can edit, delete and add files to the events they posted (#5358) 18 Oct 2026
Feature
  • timeline.html — canEdit: the PMO observer is still read-only on other people's events, but now manages the events they posted themselves. Delete was already author-only.
  • The app is changed in the same item (#5358), so no implementation work item follows.
v859 💄 Admin Reports: the Stalled cycles card says who can really move a stuck cycle (#5359) 18 Oct 2026
Parity
  • admin/index.html — the card said a stuck cycle could be “closed from its page”. PMO and admins, who read the card, cannot override-close; only the project’s senior seat holders can. It now says: assign someone, a senior seat holder closes it, or archive it from Cycle History.
  • The app is changed in the same item (#5359), so no implementation work item follows.
v858 💄 Delivery SPOC: a My Priorities & Achievements link to submit their own P&A (#5357) 18 Oct 2026
Feature
  • assets/js/nav.js — a Delivery SPOC gets the 📝 My Priorities & Achievements link beside the review link, as a Sales SPOC does. A POD Owner does not (owner decision 2026-10-18).
  • assets/js/command-palette.js — the same entry for a Delivery SPOC.
  • help.html — the Delivery SPOC row says they submit their own weekly P&A.
  • The app is changed in the same item (#5357), so no implementation work item follows.
v857 📝 Help: Download my data lists the records it now includes (#5352) 18 Oct 2026
Parity
  • help.html — the Download my data paragraph now names recurring tasks, meeting series you own, project memberships, report schedules and the names of files you uploaded, as the app's Help does.
  • The app change is made in the same item (#5352), so no implementation work item follows.
v856 ℹ️ My Action Items and My Work: a Details panel shows one action item in full (#5341) 18 Oct 2026
Feature
  • my-actions.html — every row gains Details, beside History, which opens a panel on the right with the full text, the meeting it came from (or that it was raised on its own), who raised it, who holds it, the due date, whether it repeats, its project or POD and, once closed, the note left when it was closed.
  • my-work.html — each open action item row gains a Details link that opens the same panel on My Action Items.
  • The app ships the same in #5341, so no implementation work item follows.
v855 💄 My Action Items and My Work: every action item has a History button that shows who created, changed, re-assigned or completed it (#5340) 18 Oct 2026
Feature
  • my-actions.html — a 🕘 History button on every row, in the list, table and board views. It opens a popup listing the item's events, newest first: who did it, their role, what changed and when.
  • my-work.html — the same button on each open action item row, so the history can be read without leaving My Work.
  • A meeting action item's popup says that changes made before 18 October 2026 are not listed: the app began recording which item a meeting event is about in that release (#5336, owner decision). A standalone item's history is complete.
  • The app is built in the same item (#5340), so no implementation work item follows.
v854 👤 Meeting Notes AI: Manage saved mappings, and mappings belong to the project or POD (#5339) 18 Oct 2026
Parity
  • meeting-notes-ai.html — the Named in the transcript card says a name mapped on an earlier meeting in this project (or POD, or the owner’s meetings with neither) is mapped again, and offers Manage saved mappings: a list of the saved mappings with Map to someone else and Remove. Past meetings are not changed. Owner decision 2026-10-18 (#5338).
  • The app ships the same in #5338 (API) and #5339 (the dialog), so no implementation work item follows.
v853 ✉️ Email Templates: six templates the app sends join the catalogue, and the category tabs match the app (#5310) 16 Oct 2026
Parity
  • admin/admin.js — adds ET-068 Unfilled Senior Seats Reminder, ET-069 Mentioned in a Cycle Return, ET-077 Action Items Needing Attention (combined), ET-078 Overdue Action Items on Your Meetings, ET-079 Ups & Downs Due-Date Reminder (combined) and ET-080 Late Ups & Downs Submissions on Your Projects, from the seed (name, subject, body, button) and the app's trigger and recipient text.
  • The category sets mirror AdminEmailTemplatesScreen again: ET-068/069/071/079/080 file under Ups & Downs, ET-073 under Invitations & Access, ET-072/077/078 under Meeting Notes AI. They had fallen into Other.
  • docs.html — the template codes now run to ET-080.
  • The app already has all six, so no implementation work item follows.
v852 💄 Admin Scheduler and docs: the P&A reminder sends only at 07:00 and 11:00 on Fridays (#5308) 16 Oct 2026
Parity
  • admin/admin.js — the R-006 trigger and the ET-008 job label (upcoming list and run log) say Mon–Thu at 07/11/15/19 and Fri at 07/11, submitter-local. Since #5254 the Friday 15:00 and 19:00 slots are skipped, because ET-040 covers Friday afternoon.
  • docs.html — the scheduler table row says the same.
  • The app's Scheduler label is corrected in the same item (#5308), so no implementation work item follows.
v851 💄 Meeting Notes AI: the Named in the transcript card says remembered mappings apply again (#5303) 16 Oct 2026
Parity
  • meeting-notes-ai.html — the card's explanation now ends: a name the owner has mapped on one of their earlier meetings is mapped again when AiDE processes a later one. This matches the app, where #5296 shipped the behaviour, so no implementation work item follows.
v850 💄 Admin Reports: scheduled-report recipients need an active account (#5293) 16 Oct 2026
Fix
  • admin/index.html — the Reports page note and the recipients hint no longer say recipients need no portal account. Since #5248 each recipient needs an active account and gets only what they may see; an address with no account, such as a distribution list, is skipped. In the app, Send now now says how many were sent and how many skipped (#5293).
v849 📝 Help: an item returned on its own holds the week, and revising it restarts the 36 hours (#5290) 16 Oct 2026
Docs
  • help.html — mirrors the app’s Help: the member step says the week waits on them until a returned item is revised; the reviewer step says Approve is hidden meanwhile; the digest names Awaiting Revision beside Awaiting Resubmission; and auto-approval never approves such a week, with a fresh 36 hours once the item is revised (#5290, from #5274 and #5285).
v848 💄 Priorities & Achievements: Mark as noted for an informational reviewer (#5288) 16 Oct 2026
Parity
  • priorities/review.html — the informational notice gains the app’s Mark as noted: the button (“Saving…” while it saves, then a “Marked as noted.” toast), the “✓ You noted this on …” line once noted, and, under a new “ℹ️ Informational, item returned” demo state, the reason shown while an item waits on the member’s revision (#5288, from #4161 and #5274). No implementation follow-up: the app already does this.
v847 💄 Priorities & Achievements: the Awaiting Revision state when one item is returned (#5287) 16 Oct 2026
Parity
  • priorities/cluster-head.html — a fifth member whose week is still Pending but has one item returned on its own. Acknowledge is the disabled “↩ Awaiting Revision”, as in the app, beside the existing “Awaiting Resubmission” for a week returned as a whole. The header counts follow the five cards (#5287, from #5274).
  • priorities/review.html — a new “↩ Item returned” demo state. Approve, its Ctrl+Enter hint and the auto-approve countdown go, and a note says the item is waiting on the member and the week can be approved once it is revised (#5287, from #5274). No implementation follow-up: the app already does this.
v846 💄 People & Organisation: no Manage contributors on a project where you are only a contributor (#5216) 12 Oct 2026
Fix
  • admin/admin.js — the PM-and-above Projects tab also lists the projects where the viewer is only a contributor, as the app does, and those rows say “You are a contributor here” instead of offering Manage contributors, which only the project’s PL or PM may use (#5216).
v845 💄 My Action Items: Escalate only on items from a meeting (#5215) 12 Oct 2026
Fix
  • my-actions.html — an “AiDE: escalate” suggestion offers the Escalate button only on an item that came from a meeting. Escalating emails the meeting owner, so a personal item has nobody to email; it keeps the suggestion and its × (#5215).
v844 💄 Help: Reports chart, exports, scheduled reports and token Edit match the app (#5209) 12 Oct 2026
Docs
  • help.html — the Ups & Downs trend is a pair of side-by-side bars (Ups blue); P&A History export is PMO and System Admin only, Attachments Register and Action Item Ageing are for everyone with Reports; scheduled reports live in Admin → Reports & Exports; token Edit only narrows the scope (#5209).
v843 💄 Meeting Notes AI: Series intelligence and the decision check only for those who can run them (#5208) 12 Oct 2026
Meetings
  • meeting-notes-ai.html — the 🧠 Series intelligence and Related prior decisions cards are drawn only for the owner, organiser, a co-owner or an admin (canEditAide), as the app now does: the API refuses anyone else (#5208).
v842 💄 Help: who can delete a Timeline attachment (#5207) 12 Oct 2026
Docs
  • help.html — the Timeline attachments paragraph no longer says any manager above you can remove your file: only the uploader or the event’s author can delete one (#1317, #5207).
v841 💄 Help: This and future tasks updates worked-on tasks too (#5206) 12 Oct 2026
Docs
  • help.html — the Recurring tasks table no longer says only untouched future tasks are updated: a this-and-future edit updates every open future task (#5206).
v840 💄 Admin PODs: deactivating asks first and says what pauses (#5198) 12 Oct 2026
Admin
  • admin.js — the POD Deactivate button no longer flips the POD at once: it asks to confirm, saying that no new recurring tasks or meetings are made for it and reminders about its action items stop until it is reactivated. Reactivating stays one click (#5175, #5185, #5186).
v839 💄 Admin Projects: the Deactivate dialogs say what pauses (#5197) 12 Oct 2026
Admin
  • admin/index.html + admin.js — the single and bulk Deactivate dialogs say that no new recurring tasks or meetings are made for an inactive project and reminders about its action items stop, and that they pick up again on reactivation. The single dialog shows it only when deactivating (#5175, #5185, #5186).
v838 💄 Help: recurring tasks and meetings pause on an inactive project or POD (#5190) 12 Oct 2026
Docs
  • help.html — the Recurring tasks block and the recurring meetings paragraph say that no new tasks or meetings are made while the project or POD is inactive, and that they pick up again once it is active (#5185, #5186).
v837 💄 Help: the Status page section names the environments and builds (#5142) 11 Oct 2026
Docs
  • help.html — the Status page notices paragraph says the page checks Production and Development and shows each service's build (#5142).
v836 💄 Status: the MCP row shows its build too (#5139) 11 Oct 2026
Docs
  • status.html — the MCP Server row now shows the build it reports, like the API and website rows (#5139).
v835 💄 Status: each service shows its build (#5137) 11 Oct 2026
Docs
  • status.html — each API and website row shows the build it reports (API /api/health, website version.json); MCP reports none. Matches the app's System Status (#5137).
v834 💄 Status: only Production and Development (#5114) 11 Oct 2026
Docs
  • status.html — the environment list drops Staging and QA. The pipeline deploys only Development and Production; Staging is gone and UAT/QA were retired in #1296 (#5114).
v833 💄 PAGES.md: My Action Items no longer lists shipped features as not shipped (#5112) 11 Oct 2026
Docs
  • PAGES.md — the My Action Items “design-forward, not in the shipped web screen yet” list (project chip and filter, series-occurrence context, due-date calendar) is rewritten as shipped, with how each shipped. The page dropped its design-forward chips in v482 (#2413); only this list was left behind. No implementation impact: all three are in the app.
v832 💄 Command palette: every sidebar screen can be found (#5109) 11 Oct 2026
Navigation
  • assets/js/command-palette.js — five screens in the sidebar had no palette entry: My Priorities & Achievements (the submit screen; a Project Lead typing “priorities” found Review and History but not their own week), Health, and Admin · Telemetry, AiDE and Settings. Each is gated exactly as its sidebar item in nav.js.
  • Dependent implementation item: #5110 (the app's CommandPalette, plus a check that every sidebar screen has an entry).
v831 💄 Help: app shortcuts on the installed icon (#5098) 11 Oct 2026
Docs
  • help.html — the install paragraph says the installed app icon offers shortcuts to the Dashboard, My Work, Meeting Notes AI and Notifications (Windows right-click, Android long press; not Safari on iPhone and iPad). Matches the app's Help and the manifests (#5098).
v830 💄 Help: how long an invitation lasts, and the reminder (#5068) 10 Oct 2026
Docs
  • help.html: the People & Roles paragraph now says an invitation link lasts the time set in Scheduler settings (Invitation Link Expiry, 72 hours by default) and that a reminder with a fresh link goes after 48 hours, keeping that time (#5065). Mirrors the app Help changed in the same commit. No implementation impact.
v829 💄 Help: the MCP reset step offers Rotate (#5028) 09 Oct 2026
Docs
  • help.html: Remove or reset the integration no longer says tokens cannot be edited or rotated (untrue since #4207 and #4198); it offers Rotate for a new secret and Edit for name, expiry or scope, and the revoke path names the AI & Integrations tab. Mirrors the app Help changed in the same commit. No implementation impact.
v828 💄 PAGES.md: Email Templates matches the mockup and the app (#5026) 09 Oct 2026
Docs
  • PAGES.md: the Email Templates section now names the status filter (All Statuses / Active / Draft / Archived), the template cards (not a table) and the preview usage strip with Last Edited (not Open Rate), as both the mockup and the app show. No page changed. No implementation impact.
v827 💄 PAGES.md: table columns match the mockup and the app (#5024) 09 Oct 2026
Docs
  • PAGES.md: the column lists for Cycle History, the Profile tokens, Admin MCP tokens (with its Service accounts table), the MCP log (with its per-tool table) and the Audit Log now name what both the mockup and the app show, and the Scheduler Reminders sub-section no longer describes an editable reminder-rule table that does not exist. No page changed. No implementation impact.
v826 💄 PAGES.md: four more KPI strips match the mockup and the app (#5023) 09 Oct 2026
Docs
  • PAGES.md: the KPI strips for Cycle History (Avg Ups per Cycle, not Returned), Reports (8 cards, with Approved, In-Progress and AiDE-assisted P&A), MCP Tokens (Service accounts, not Expired) and the MCP usage log (Success, Client errors, Server errors, Avg duration) now name the tiles both the mockup and the app show. No page changed. No implementation impact.
v825 💄 PAGES.md: the admin People sections match the mockup and the app (#5020) 09 Oct 2026
Docs
  • PAGES.md: the Users & Roles, Projects and PODs sections now list the KPIs, filters, columns and actions that admin/index.html and the app both show: Pending Invites and Distinct Roles; the Role and Status dropdowns; Account Name, Senior Roles, Delivery Roles and Chain; Select with Move to POD; Cluster Head on PODs. No page changed. No implementation impact: the app already has all of it.
v824 💄 Help: Timeline access and project editing follow the roles you hold (#5014) 09 Oct 2026
Docs
  • help.html: the roles table, the Timeline warning and the Editing your project table now match the app (#4984, #4992). A System Admin who also holds a delivery role opens the Timeline directly; someone with only System Admin or Project Contributor sees Access Denied; the senior roles have Edit project on their projects. No implementation impact: this mirrors Help text the app already ships in the same commit.
v823 💄 mockup(mcp-guide, reports): paths into the MCP and Email hubs name the tab (#4981) 09 Oct 2026
Docs
  • The MCP guide said Admin → MCP Access Tokens and the Reports page said see Admin → Email Log. They now read Admin → MCP → Tokens and Admin → Email → Delivery Log, the hubs' tab names, as Help does. Wording only; Help's caption is changed in the same commit.
v822 💄 mockup(docs, admin): admin paths name the People & Organisation hub and its tab (#4978) 09 Oct 2026
Docs
  • The docs page said Admin → Users and a sample stalled-cycles email said Admin → Projects. Both are tabs of Admin → People & Organisation, so the paths now name the hub and the tab, as Help does. Wording only; the app is changed in the same commit.
v821 💄 mockup(admin): the Sales SPOC role row says it reviews Ups & Downs (#4976) 09 Oct 2026
Docs
  • The Role Definitions table said Sales SPOC can view assigned projects and do P&A with the POD Owner. Sales SPOC is level 4 of the Ups & Downs chain, after the Delivery SPOC, so the row now says it approves or returns Ups & Downs too. Wording only; the app is changed in the same commit.
v820 💄 mockup(admin, help): PMO Associate is read-only in the workflows but runs the Admin Portal (#4973) 09 Oct 2026
Docs
  • The Role Definitions table (admin) and Help's roles table called PMO a read-only observer, leaving out its Admin Portal access. Both now say it is read-only in the workflows (no approving or returning) and also runs the Admin Portal except Settings, as the architecture glossary says and as the app now shows. Wording only; no implementation item, the app is changed in the same commit.
v819 📝 Help: editing your project from the Projects list (#4961) 09 Oct 2026
Fix
  • help.html, Ups & Downs: a new Editing your project section: what a Project Lead, a Project Manager or senior role, and PMO or an admin can change in the ✏️ Edit project dialog, and the note for the next kickoff email.
  • Parity only: the app has had this since #2451, #2456, #3023 and #4177; the app’s Help gets the same wording.
v818 📝 Help: temporary access to a project (#4957) 09 Oct 2026
Fix
  • help.html, Ups & Downs: a new Temporary access to a project section: where the panel is, Give temporary access, inviting a work address with no account (one automatic resend), Extend and Withdraw, the 90-day cap, the status chips, and the three-day countdown and email.
  • Parity only: the app has had this since #2465, #2464, #2482 and #2471; the app’s Help gets the same wording.
v817 💄 mockup(mcp-guide): the MCP token path names the AI & Integrations tab on My Profile (#4956) 09 Oct 2026
Docs
  • The MCP guide said My Profile → MCP Access Tokens, but My Profile opens on the Account tab and the token card is on AI & Integrations. Both mentions now name the tab, as Help does. Wording only; the app already has the tabs, so there is no implementation item.
v816 📝 Help: the default POD for P&A submitters on no project (#4955) 09 Oct 2026
Fix
  • help.html: the P&A approval chain says what someone on no project can tag an item to, and Scheduler describes the Default POD for unmapped submitters on the Configuration tab.
  • Parity only: the app has had this since #2681; the app’s Help gets the same wording.
v815 📝 Help: Stopped Triggers, template bodies built when sent, contributors managed by PM and above, and the Cycle History Returned filter (#4953) 09 Oct 2026
Fix
  • help.html: Scheduler gets the 🛑 Stopped Triggers panel, its Quiet list and the never-run line; Email Templates gets the “This body is built when the email is sent” note; Projects gets Manage contributors for PM, Delivery SPOC, Sales SPOC, POD Owner and Cluster Head; Cycle History gets the Returned status option.
  • Parity only: the app has had these since #3035, #3068, #3034, #3023 and #2645; the app’s Help gets the same wording.
v814 📝 Help: recording a meeting in the browser, voice-recorder uploads, the note asked when closing an action item, and series grouped by month and week (#4951) 09 Oct 2026
Fix
  • help.html, Meeting Notes AI: the recording formats (.mp4, .mkv, .webm, .mov, .m4a, up to 50 MB, including a phone’s voice recorder file); Record the conversation on the meeting page (Start recording, Pause, Resume, Stop & attach, the 50 MB stop, Attach it or Discard for an interrupted recording, and the iPhone screen-lock note); the justification asked when ticking an action item done; a series’ occurrences grouped by month and week with a progress bar each.
  • Parity only: the app has had these since #2110, #3181, #3412 and #3405-#3407; the app’s Help gets the same wording.
v813 📝 P&A review: a revised item reads “Revised, look again” and can be decided again (#4946) 09 Oct 2026
Fix
  • priorities/review.html: an item you decided that the member has since changed shows ✎ Revised, look again (your reason on hover), and ✓ Approve item / ↩ Return item come back, on a pending week and on one you already approved. The hiring priority shows it.
  • Parity only: the app has shown this since #4811 and #4816, and the mockup never did.
v812 📝 A reviewer’s My Work lists a revised P&A item to look at again (#4936) 09 Oct 2026
Feature
  • my-work.html → Awaiting your review: a row “Revised P&A item to look at again · member · Week N” with Review →, for an item the member changed after you decided it, on a week you already approved. The tile reads 4 and the list shows 3 of 4.
  • Owner decision 2026-10-09: My Work only, emails unchanged (the member’s side is v811, #4923).
  • Implementation: dependent item #4937.
v811 📝 My Work lists a P&A item returned on its own, with a Revise link (#4923) 09 Oct 2026
Feature
  • my-work.html → Returned to you: a third kind of row, “P&A item returned by X · Week N”, with the item, the reason and Revise → to the member’s P&A page (pl.html v730). The tile reads 3 and the badge 5 of 14.
  • Owner decision 2026-10-07: My Work only. The digest and briefing emails are unchanged, so a per-item decision stays in-app (2026-10-06).
  • Implementation: dependent item #4924.
v810 💄 Help: the Global Automation Settings card named as the Scheduler shows it (#4925) 09 Oct 2026
Docs
  • Help said Global Settings for the Scheduler card titled Global Automation Settings. Help only, so no dependent implementation item.
v809 💄 Help: the real export buttons on Reports and Admin Reports (#4918) 08 Oct 2026
Docs
  • As in the app’s Help: Reports has a Data Exports card of fourteen buttons (seven for PMO and System Admins only), not an Export CSV dropdown; Admin Reports has an On-Demand Exports panel of six reports. Help only, so no dependent implementation item.
v808 💄 Help: the six notification categories, and Dismiss and Clear read (#4917) 08 Oct 2026
Docs
  • The categories table is rewritten from the code (Ups & Downs, Priorities, Meeting Notes AI, Digest, Timeline, Account), the same in both Helps; the app’s Help had kept the old event names Review, Returned, Deadline and Approved. Both action tables gain Dismiss and Clear read. Help only, so no dependent implementation item.
v807 💄 Help: the eight Reports headline cards, and what P&A completion really measures (#4916) 08 Oct 2026
Docs
  • As in the app’s Help: Reports shows eight headline cards, not four, and the Priorities & Achievements Completion card is the share of submitted reviews that were approved, organisation-wide. Help only, so no dependent implementation item.
v806 💄 Help: the MCP Activity Log’s real columns and filters (#4915) 08 Oct 2026
Docs
  • As in the app’s Help: the per-tool summary table and the Identity, Tool, Status and From filters. The app’s Help had described Actor, Input and Timestamp columns the log does not have. Help only, so no dependent implementation item.
v805 💄 Help: the Audit Log’s real filters (#4914) 08 Oct 2026
Docs
  • As in the app’s Help: the Audit Log has a search box (person, action or project) and Entity, Role, Event type and From / To date filters; Help had listed Entity ID, Actor and Action, which the screen does not have. Help only, so no dependent implementation item.
v804 💄 Help: button names that had drifted from the app (#4910) 08 Oct 2026
Docs
  • As in the app’s Help: Save as Draft, Submit to Project Manager, Send Magic Link, the Recurring series switch when creating a meeting (there is no Convert to series button), and email switches that save as you change them (there is no Save preferences button). Help only, so no dependent implementation item.
v803 💄 Help: Export PDF on the review screens, last sign-in in the Users list, and the Action Items count and empty state (#4900) 08 Oct 2026
Docs
  • As in the app’s Help: the Export PDF button on the Delivery SPOC, Sales SPOC, POD Owner and PMO screens; when each person last signed in, with the Filter by last sign-in; and the meeting Action Items tab’s count and empty state. Help only, so no dependent implementation item.
v802 💄 Help: tidying notifications, older cycles from the palette, Help search, the Timeline date range and Flagged, more scheduled reports and User Activity (#4908) 08 Oct 2026
Docs
  • As in the app’s Help: dismiss and Clear read, the Email preferences link, searching older cycles from the Command Palette, Help search, the cycle-type filter, the Timeline’s From and To dates and Flagged, the reports that can now be scheduled, and the User Activity card. Help only, so no dependent implementation item.
v801 💄 Help: admin alerts, Seat Coverage Remind, invitation expiry, audit Live, token Edit and Rotate, My AiDE runs and more (#4908) 08 Oct 2026
Docs
  • As in the app’s Help: the stalled-cycles email, the MCP tool and clean-up alerts, Remind, Expires in, the audit export limit and Live, service-account Edit, token Edit and Rotate, My AiDE runs, saved corrections, attachment storage, Apply to all my projects, and a refused AiDE token. Help only, so no dependent implementation item.
v800 💄 Help: Telemetry’s headline figures, operation panel and request timeline, and AiDE’s Usage tab, By type card and connection test (#4908) 08 Oct 2026
Docs
  • As in the app’s Help: Telemetry headline figures, Collection status, the operation panel and the request timeline; AiDE’s By type card, Project filter, Usage tab and Test AiDE connection. “Both tabs are read-only” becomes “These tabs only report”. Help only, so no dependent implementation item.
v799 💄 Help: last cycle to hand, the PM countdown, the reviewer portfolio cards, cycle-time bars and the Chain column (#4908) 08 Oct 2026
Docs
  • As in the app’s Help: copying last cycle’s items and notes, last cycle’s Downs, Closes in, the Ups & Downs Awaiting You banner, Portfolio — final approvals and POD overview, the Approval Chain bars, Move to POD and the Chain column. Help only, so no dependent implementation item.
v798 💄 Help: pausing and ending a meeting series, who is involved, My items only, and senior-seat meeting access (#4908) 08 Oct 2026
Docs
  • As in the app’s Help: Pause series / Resume now, End series / Continue series, the involvement list, your own action items tagged You with My items only, and Delivery SPOCs, Sales SPOCs, POD Owners and Cluster Heads seeing the meetings on their projects and PODs. Help only, so no dependent implementation item.
v797 💄 Help: the Webhooks screen’s Edit, pause, Send test, Revoke, delivery rate and Retry (#4905) 08 Oct 2026
Docs
  • As in the app’s Help: the webhook row controls are described (Edit with Enabled to pause, the fixed URL, Send test, Revoke keeping the row, the 7-day delivery rate, Retry on a failed delivery). Help only, so no dependent implementation item.
v796 💄 Help: an in-progress cycle in Cycle History can be acted on, and Team P&A Status (#4904) 08 Oct 2026
Docs
  • As in the app’s Help: Cycle History no longer calls every cycle read-only, since an in-progress one you may review has the Review Action card; the P&A review screen’s Your Team’s P&A Status card is described. Help only, so no dependent implementation item.
v795 💄 Help: email buttons say what was really sent (#4903) 08 Oct 2026
Docs
  • As in the app’s Help: Email report, Send reminders now and Nudge owner show green only when every email went out, otherwise a warning with how many were not sent and why; the Health Email says it was emailed to you or why not. Help only, so no dependent implementation item.
v794 💄 Help: last week’s P&A while you plan, and unposted notes staying where they were written (#4902) 08 Oct 2026
Docs
  • As in the app’s Help: P&A shows last week’s priorities and achievements (or the most recent submitted week) above Achievements; unposted cycle notes, pasted transcripts, picked files and P&A review notes stay with the cycle, meeting or person they were written for. Help only, so no dependent implementation item.
v793 💄 Help: admins told when a user was not emailed, and short project codes in subjects (#4901) 08 Oct 2026
Docs
  • As in the app’s Help: Users & Roles says the message warns when a change that emails the person (deactivate or reactivate, Force logout, PL or PM on several projects) did not email them; Email Templates says subjects use the project’s short code. Help only, so no dependent implementation item.
v792 💄 Help: service-account tool limits, the Cycle History chart and missing templates (#4898) 08 Oct 2026
Docs
  • As in the app’s Help: an admin can limit a service account’s token to named MCP tools; Cycle History charts Ups and Downs across a project’s cycles; Email Templates warns when an email has no template. Help only, so no dependent implementation item.
v791 💄 Help: eight shipped features that only What’s New described (#4897) 08 Oct 2026
Docs
  • As in the app’s Help: the team corrections glossary (Meetings register), Blocked by on an Up or Down, the Spoken language before transcribing, removing someone from a series, Download my data (new Profile section), the P&A week saving itself as a draft, Retry failed on the Email Log, and which events a webhook can receive (timeline posts only when visible to everyone).
  • Help only, so no dependent implementation item.
v790 💄 Help: Meeting Notes AI’s thin-transcript warning and next-day due dates (#4896) 08 Oct 2026
Docs
  • As in the app’s Help: a note that the meeting page warns, without blocking, when a transcript has far too little text for the meeting’s length; and that an action AiDE finds with no due date is due the next day. Help only, so no dependent implementation item.
v789 💄 Help: what happens to your text when the connection drops (#4895) 08 Oct 2026
Docs
  • New Getting Started section, as in the app’s Help: text whose save gets no answer is kept in this browser, comes back with a short Recovered note, and is removed once it saves. Where it applies (Ups & Downs, Priorities & Achievements, Timeline) and what it does not keep. Help only, so no dependent implementation item.
v788 💄 Sign-in pages: pale grey text made readable (#4894) 08 Oct 2026
Fix
  • login.html and auth-activate.html used #9ca3af for twelve pieces of text (2.5:1 on white), including the real sign-in line “Use either the link or the code below to sign in”. They now use the muted text colour (6:1 in light, its own value in dark); auth-activate.html defines it, since it does not load the design system.
  • A whole-mockup contrast sweep now finds only colour emoji in icon tiles, disabled buttons, decorative separators and the version badge, which the pipeline generates separately. Mockup only, so no dependent implementation item.
v787 💄 Implementation docs count their own screen cards (#4893) 08 Oct 2026
Fix
  • The header’s screen count was typed by hand (31 until v782, then 52), so it would go stale with the next card. The page now counts its cards when it loads; 52 stays in the page only for when scripts do not run. Mockup only, so no dependent implementation item.
v786 💄 Mention pickers list plain names, A to Z, as the app does (#4892) 08 Oct 2026
Fix
  • The “@ Mention someone…” lists on workflow/pm.html, spoc.html and pod.html showed a role after each name (“Swati Nandha (PL)”), and none was in order. The app lists the names it gets from the server, which sends plain names sorted A to Z. All four lists (with Cycle Detail’s from v785) now match. Mockup only, so no dependent implementation item.
v785 💄 Cycle Detail: reason chips and @-mentions when returning from the review card (#4891) 08 Oct 2026
Parity
  • The Review Action card on an in-progress cycle (v747) now shows, under the comment when returning, the five standard return reasons and an “@ Mention someone…” picker, as the app’s card does. Each reason adds its sentence once; a mention adds “@Name” once. There is no “From the AiDE brief” chip here, because the app’s card passes no brief.
  • Forwarding shows neither. Implementation exists (DetailForwardReturnCard), so no dependent implementation item.
v784 💄 Cluster Head P&A: the weekly digest note no longer names the wrong email code (#4888) 08 Oct 2026
Fix
  • Two notes on priorities/cluster-head.html said the weekly digest is “(ET-011)”. ET-011 is the scheduler job; the email is ET-022. The app shows no code, so the mockup now matches it.
  • Found by checking every ET- code in the mockup, the app and the MCP server against the template list. Docs only, so no dependent implementation item.
v783 💄 Implementation docs: the right email template codes (#4887) 08 Oct 2026
Fix
  • The docs page named codes that belong to other emails: the invitation as ET-006 (that is Return for Revision; the invitation is ET-013, with ET-014 as its reminder), the sign-in email as ET-001 (Cycle Start; sign-in is a built-in email), the Cluster Head digest as ET-014 (it is ET-022), and the bilateral approval email as ET-013 (it is ET-011).
  • Two codes with no matching email were dropped, and the range “ET-001 → ET-022” now says there are about seventy templates. Docs only, so no dependent implementation item.
v782 💄 Implementation docs: Scheduler, Reports and Audit Log cards, and the page header (#4886) 08 Oct 2026
Fix
  • Scheduler, Reports and Audit Log showed only an admin pill; the app lets PMO in too.
  • Reports described a Scheduled Reports tab and an Export tab with two exports. The screen is one page: six date-range CSV exports and a list of scheduled reports (send now, pause, edit, delete).
  • Audit Log described CREATE/UPDATE/DELETE columns and an actor filter; it now lists the screen’s real search and filters (entity, role, event, dates).
  • The page header said v175 and 31 screens; it now links to Design History and counts 52 cards. Docs only, so no dependent implementation item.
v781 💄 Implementation docs: the sign-in and Profile cards no longer describe passwords (#4885) 08 Oct 2026
Fix
  • Login described an email and password form and a Forgot password link; Activate Account a password form with a strength meter; Profile a Security tab with change password. Sign-in is passwordless (an emailed link or 6-digit code), so all four cards now say what the app does.
  • The Verify card said the 6-digit code is typed there; it is the page the emailed link lands on, and the code is typed on Login.
  • Profile lists its real tabs: Account, Notifications, AI & Integrations. Docs only, so no dependent implementation item.
v780 💄 Implementation docs part 2: the admin screens (#4884) 08 Oct 2026
Fix
  • New admin cards with contents links: Hierarchy, Seat Coverage and Access Requests (People & Organisation), Email Delivery Log, Meetings register, Webhooks, and Settings (System Admin only).
  • The Projects, PODs, Users, Email Templates and MCP cards gave old addresses that now redirect; they show the hub routes, and PMO is added to the role pills where the app lets PMO in.
  • The Users card said “Reset password”; sign-in is passwordless, so it now describes Resend invitation. Docs only, so no dependent implementation item.
v779 💄 Implementation docs part 1: nine missing screens, and the POD Owner route (#4883) 08 Oct 2026
Fix
  • The docs page had no card for nine screens the app has. Added, with contents links: Email Preferences and Access Denied (Authentication), My Work (Actions), a new Meetings & Timeline section (Meeting Notes AI, a meeting’s page, Project Timeline), and Notifications, Help and What’s New (Account).
  • The POD Owner card gave /workflow/pod-owner; the app’s route is /workflow/pod.
  • Part 2 adds the admin screens. Docs only, so no dependent implementation item.
v778 💄 British spelling, the rest: Finalise minutes, Ageing, judgement (#4881) 08 Oct 2026
Fix
  • Meeting Notes AI now says 🔒 Finalise minutes, as the app does, and its locked notices say finalised; the same in My Work, Notifications and the index.
  • The Override-close cards on the review pages say finalises; Reports says Action Item Ageing; Project Health says judgement; the ET-036 email template text and the MCP guide’s tool descriptions match the app and server.
  • Copy only, so no dependent implementation item.
v777 💄 British spelling: finalise and ageing (#4878) 08 Oct 2026
Fix
  • “finalized”, “finalize” and “Aging” become “finalised”, “finalise” and “Ageing” in the Meeting Notes AI minutes notice, My Work, Notifications, the Help page and the admin email and webhook lists. The ET-036 template name now matches the app’s (Meeting Finalised).
  • The same change in the app (#4878). Earlier entries in this history keep their wording. Copy only, so no dependent implementation item.
v776 💄 Help, Reports, AiDE summaries and Audit Log: the last missing points (#4876) 08 Oct 2026
Fix
  • Reports: what it covers depends on your role; the P&A Completion figure and the Governance SLAs & Participation report stay org-wide under a filter; the Table / Chart switch.
  • AiDE summaries: the score delta, the tabbed detail and scheduled delivery. Audit Log: the role and From / To filters.
  • This finishes the Help parity pass: every bold term in the app’s Help now appears in the mockup’s Help, across all 13 topics (from 225 missing). Parity only, so no dependent implementation item.
v775 💄 Help, Profile, P&A and Timeline: the last missing points (#4875) 08 Oct 2026
Fix
  • Profile: Save preferences; the email links that work without signing in (Stop these emails, Stop all notification emails, pause); limiting a token to projects; the MCP Setup Guide link.
  • P&A: Add Achievement, the “locked” panel, Carried over from last week, Approve selected with its not-opened warning, Compare with previous week, Words per entry.
  • Timeline: the Chain and Everyone audience labels, the capture chips and Post to Timeline, and that System Administrators cannot use the feed.
  • These three topics now cover everything the app’s Help does. Parity only, so no dependent implementation item.
v774 💄 Help, Notifications: desktop and mobile push, the app-icon badge, browser support (#4874) 08 Oct 2026
Fix
  • The Notifications Help had nothing on push. It now explains installing the app, turning push on for a device, what the app-icon number shows, how to make it appear (and why Android shows a dot), and which browsers support push and the badge — the same table as the app.
  • The Notifications Help now covers everything the app’s does. Parity only, so no dependent implementation item.
v773 💄 Help, MCP: token options, the AiDE plugin, token expiry, removing the integration (#4873) 08 Oct 2026
Fix
  • The token section said Create token; the button is Generate Token. It now gives Option A (self-service) and Option B (admin-issued for service accounts).
  • New sections: the AiDE plugin’s Remote Servers set-up and its stdio set-up, and Remove or reset the integration. Token expiry (90 days by default) and which features use the AiDE Fabric Token are now explained.
  • The MCP Help now covers everything the app’s does. Parity only, so no dependent implementation item.
v772 💄 Help, Meeting Notes AI part 2: closing several items, calendar, voice add, focus history (#4872) 08 Oct 2026
Fix
  • A My Action Items section: closing several at once, adding due dates to your calendar, and raising an item by voice.
  • Focus timer: the daily goal notification, the Focus Activity card and your streak on My Profile, and Retry when the server cannot be reached.
  • The Meeting Notes AI Help now covers everything the app’s does. Parity only, so no dependent implementation item.
v771 💄 Help, Meeting Notes AI part 1: the list, creating a meeting, series and project link (#4871) 08 Oct 2026
Fix
  • Reading the meetings list (the four tiles and a badge table), Create a meeting and add the sources (recordings transcribed for you, several sources at once), and Recurring meetings, occurrences & project link (series, the Timeline card, All confirmed decisions).
  • The token section now also points to My Profile. Each section has the app’s id.
  • Meeting Notes bold terms missing: 28 to 13; part 2 covers the rest. Parity only, so no dependent implementation item.
v770 💄 Help, Getting Started part 2: notifications, digests, What’s New, search, dark mode (#4870) 08 Oct 2026
Fix
  • Sections, with the app’s ids, for Notifications, Your weekly digest, Your daily briefing (including how its AiDE token is used and how to decline sharing yours), What’s New and its optional notice, the command palette, and light and dark mode.
  • Getting Started now covers every section the app’s does. Parity only, so no dependent implementation item.
v769 💄 Help, Getting Started part 1: access, sessions, installing as an app, layout (#4869) 08 Oct 2026
Fix
  • Getting access — who can see what: role plus placement, a table of features and what each needs, and the Dashboard snapshot.
  • Sessions: the end-of-session banner with Sign in again now, and My Profile → Active Sessions.
  • Installing as an app (benefits and how, per platform), the Windows steps for Edge and Chrome, and Understanding the layout. Each section has the app’s id.
  • Getting Started bold terms missing: 43 to 17; part 2 covers the rest. Parity only, so no dependent implementation item.
v768 💄 Help, Admin Portal part 2: reports, logs, MCP, webhooks, telemetry, meetings, AiDE, settings (#4868) 08 Oct 2026
Fix
  • Short sections, with the app’s ids, for Reports & Exports, Audit Log, Email Log, MCP Access Tokens, MCP Interaction Log, Webhooks, Telemetry, the Meetings register, AiDE administration and Settings.
  • The Admin introduction now says people and structure live under People & Organisation; Status page notices names the Post notice button.
  • The Admin Portal Help now covers every section the app’s does (missing bold terms 35 to 0, ignoring three that differ only by a full stop). Parity only, so no dependent implementation item.
v767 💄 Help, Admin Portal part 1: people, projects, PODs, scheduler, email, hierarchy, seats, access (#4867) 08 Oct 2026
Fix
  • The Admin Portal topic was a single summary table. It now has short sections, as the app’s Help does, for Users & Roles (including Mark as left and Anonymise), Bulk inviting, Projects, PODs, Scheduler, Email Templates, Org Hierarchy, Seat Coverage and Access Requests.
  • Each uses the app’s section id, so a link like help.html?topic=admin#seat-coverage opens at the right place.
  • Admin bold terms missing from the mockup Help: 71 to 35; part 2 covers the rest. Parity only, so no dependent implementation item.
v766 💄 Help, Ups & Downs: everything the app’s Help explains (#4866) 08 Oct 2026
Fix
  • Adding items (Add Up, Add Down); the review comment box with Add a reason and Draft the return with AiDE.
  • How a cycle is labelled (weekly, monthly and the older month-first style), when the next cycle opens (14 days before its end date), and the Risk Radar’s scope, saved copy, token and weekly email digest.
  • The first topic of a Help parity pass: every bold UI term in the app’s Ups & Downs Help now appears in the mockup’s. Parity only, so no dependent implementation item.
v765 💄 Help: returning a cycle to a chosen level, and a revised P&A item (#4865) 08 Oct 2026
Fix
  • Ups & Downs: Help no longer says the Delivery SPOC’s Return goes back one level to the PM. It explains the Return to … button for each level below you, why a button is greyed out, and that a Project Lead’s resubmit goes straight back to the level that returned it.
  • Priorities & Achievements: the reviewer’s side of a revised item — the Revised, look again badge, deciding it again, and an earlier approval waiting again.
  • Both match the app’s Help. Parity only, so no dependent implementation item.
v764 💄 Search, the notification list and the theme button work on every page (#4862) 08 Oct 2026
Fix
  • Help, Notifications, Project Health, Access Denied, What’s New and Status did not load the shared top-bar scripts. On them the search button opened nothing, the bell was a plain link with no list, and idle sign-out did not run. Project Health’s theme button did nothing either.
  • They now load the same scripts as every other page, as the app shows the bell and search everywhere. Notifications no longer asks for a script file that never existed.
  • Mockup only, so no dependent implementation item.
v763 💄 Light mode: amber and green text and the dashboard footer are readable (#4861) 08 Oct 2026
Fix
  • Amber and green fill colours were used as text on light cards: the Modified change labels on review pages, the P&A History pending count and rate, and the on-time figures on Reports. They now use the theme’s text amber and green, which also suit dark mode.
  • The dashboard footer was white text written for a dark page, so it vanished on the light one; it now uses the theme’s muted text. The docs footer is a little darker.
  • Light-mode contrast check: 40 to 32, and the 32 left are deliberate (emoji icons, disabled buttons, separators and mockup demo labels). Dark mode stays at 4. Mockup only, so no dependent implementation item.
v762 💄 Dark mode: blue text, sign-in footers and a few labels are readable (#4860) 08 Oct 2026
Fix
  • Blue text in dark mode: the brand blue is a fill colour; as text on a dark card it was hard to read. The Comment labels on every review page, My Actions meeting links and repeat badges, the admin People tab, the email-preferences link and the sign-in titles and links now use the theme’s light blue.
  • Sign-in pages: the footers were faint in both themes and are now readable; the login Restricted access panel turns dark in dark mode; the DEMO badge is a deeper orange.
  • Also: the active page number on Reports, and the All occurrences and Processing failed lines on Meeting Notes AI.
  • Dark-mode contrast check: 39 low-contrast texts to 4, all deliberate (three emoji icons, one disabled button). Light mode 47 to 40, with nothing new. Mockup only, so no dependent implementation item.
v761 💄 MCP guide and docs pages are readable in dark mode (#4859) 08 Oct 2026
Fix
  • MCP guide: callouts, every second table row, code chips, status chips, table headers, tool names and links kept light colours in dark mode, so much of the text vanished. They now have dark-mode colours.
  • Implementation docs: feature lists, route badges, table header rows and shaded rows now read in dark mode. Navy fills stay navy; only the headings lighten. The contents headings are a little lighter in both themes.
  • Found by a contrast check of every page in dark mode: 624 low-contrast texts on these two pages, now none. Mockup only, so no dependent implementation item.
v760 💄 The page-width rule applies again: small phones fit, wide screens cap at 1520px (#4858) 08 Oct 2026
Fix
  • The rule that makes each page’s content fill the width and stop at 1520px pointed at the top-bar placeholder, which the shared script replaces as the page loads. So it applied on no page. It now points at the top bar that is really there.
  • Small phones (360px): My Work and the Cluster Head digest no longer run past the edge, and P&A History’s week picker wraps under its label.
  • Very wide screens: pages cap at 1520px and centre, as the app does (its own cap was copied from this rule). Mockup layout only, so no dependent implementation item.
v759 💄 Phones: review cards, My Actions, Profile, tabs and tables fit the screen (#4857) 08 Oct 2026
Fix
  • On a 375px screen, eleven pages had content cut off at the right edge: the review pages’ side cards (approval chain, activity trail, downstream changes), My Actions rows and buttons, Profile, Help, the Current/Next Week and Cycle tabs, and two tables.
  • The main cause was shared: the content column grew to its widest child, so one wide card widened the whole page. It now keeps to the screen, wide tables scroll sideways in their own box, button rows wrap, and the week and cycle tab labels wrap inside their buttons.
  • It also fixes a 28px overflow on My Actions at desktop width. Mockup layout only, so no dependent implementation item.
v758 💄 Top bar on a phone: everything fits, and search and the bell appear once (#4856) 08 Oct 2026
Fix
  • One search, one bell: every app page showed two of each — the plain ones from the shared top bar and the real ones the search palette and notification scripts add. The scripts now replace the plain ones; a page without them keeps the plain ones.
  • Phones (575px and narrower), as in the app: the top bar is icons only. The name and role badge, the ⌘K hint, the project picker’s label and Help (also in the sidebar) are hidden; the avatar and Sign Out stay. In the Admin Portal, Profile (also in the sidebar) is hidden and Sign Out keeps its icon.
  • Before, on a 375px screen the controls ran to about 593px: they covered the menu button and page title, and the avatar and Sign Out were off screen. Mockup layout only, so no dependent implementation item.
v757 💄 MCP guide, docs and status: text laid out as it was written (#4853) 08 Oct 2026
Fix
  • MCP guide: bold words inside a step (“click Generate Token”, the Name / Scope / Expiry field lists) no longer sit on lines of their own, and the field lists have their bullets back. Only each step’s title is on its own line.
  • Docs: the four “no screenshot yet” placeholders stack the icon, the name and the note, instead of squashing them side by side.
  • Status: the demo note keeps its spaces (“each environment’s /health endpoints”).
  • Found by widening the #4852 sweep to every flex row on every mockup page. Mockup layout only, so no dependent implementation item.
v756 💄 Admin: two notes no longer break into narrow columns (#4852) 07 Oct 2026
Fix
  • The Scheduler note about when cycles are created, and the Invite user note about link expiry, now read as normal paragraphs. Their text sat loose in a flex box, so each bold phrase became its own column.
  • A sweep of all 36 admin alerts found no others. Mockup layout only, so no dependent implementation item.
v755 💄 Stopped Triggers: the Quiet band and the jobs that have never run (#4851) 07 Oct 2026
Fix
  • Quiet — logs only when it has work: a separate band under Stopped Triggers for jobs that record nothing on an idle fire, with Last Recorded Work and Idle Fires Since. Being behind here is not a sign the trigger stopped.
  • A muted footnote names jobs with no recorded run yet, which is normal, never a row in a table.
  • The “none” line now says what the card really checks: every job that records each run is within its own schedule.
  • Parity only: the app shipped these as #3068 and #3029, so no dependent implementation item.
v754 💄 Admin Scheduler: every time says which zone it is in (#4850) 07 Oct 2026
Fix
  • Upcoming Runs: the cron column is now headed Schedule (UTC), with the tooltip “Cron expression, in UTC”, as in the app.
  • Each Next Run time now names its zone (“16 Jun 2026, 09:00 IST”), so a cron in UTC and a run time in local time can no longer be mistaken for each other.
  • Parity only: the app shipped this as #4184, so no dependent implementation item.
v753 💄 New page: Access Denied, with Switch to the role you hold (#4849) 07 Oct 2026
Fix
  • unauthorized.html (new): where a page you cannot open lands, in the app shell. A plain refusal says you do not have permission, with Back to Dashboard.
  • For someone who holds the page’s role but is acting as another — an email link takes a Cluster Head who also holds Administrator to a Cluster Head page — it names the role they hold and offers Switch to Cluster Head, which returns them to the page they wanted.
  • Demo buttons, or ?state=held. Linked from the mockup index. Parity only: the app shipped this as #3946, so no dependent implementation item.
v752 💄 New page: Email notifications, opened from a link in any email (#4848) 07 Oct 2026
Fix
  • email-preferences.html (new): the public page behind the stop these emails and manage your email settings links in every notification email. No sign-in and no sidebar: the link itself is the key.
  • Stop this kind of email or all of them (the one clicked in the email is highlighted, and nothing happens until you click here), pause emails for a day, a week or 30 days, switch each category on or off with the Profile’s wording, and set the digest frequency.
  • Demo buttons show it opened from either link, while paused, loading, and with an invalid or expired link. Linked from the mockup index.
  • Parity only: the app shipped this as #4549 and #4566, so no dependent implementation item.
v751 📝 Help: focus music, motivation cues and anonymising a departed user (#4845) 07 Oct 2026
Fix
  • help.html → Focus timer → Tune it in Settings: now describes Focus music (Lo-fi, White noise or Rain) and Motivation cues (every 5 or 10 minutes or at key moments, spoken or a tone), both off until turned on.
  • help.html → Admin → Users & Roles: now mentions 🕶️ Anonymise for a deactivated person.
  • The app’s Help gets the same text in the same commit (HelpScreen.tsx), so no dependent implementation item.
v750 💄 Every page: a banner says when you are offline (#4841) 07 Oct 2026
Fix
  • assets/js/nav.js (every page) and admin/index.html: while the browser is offline, a 📡 strip above the whole shell says you can keep reading what is loaded, but nothing will save or refresh until the connection is back. The sidebar, top bar and content move down beneath it. Nothing shows while online.
  • It follows the browser’s own online and offline events. Add ?offline=1 to any page address to see it. On a phone the sentence ends in an ellipsis.
  • Also in PAGES.md: the sidebar’s admin-groups line now says PM and above get People & Organisation (from v748).
  • Parity only: the app shipped this as #1261, so no dependent implementation item.
v749 💄 Meeting Notes AI: name the speakers from the corrections dialog (#4840) 07 Oct 2026
Fix
  • meeting-notes-ai.html → Corrections & context: when the recording was transcribed with speaker turns, the dialog pre-fills a row for each Speaker N, ahead of the flagged terms, with a 🎙️ hint: put a real name beside each speaker and re-run, and that person is used everywhere they spoke, including as an action-item assignee.
  • A speaker already named moves to the corrected rows rather than being offered again. Try it on M-1042.
  • Parity only: the app shipped this as #2327, so no dependent implementation item.
v748 💄 Admin Portal: PM and above manage their own project contributors (#4839) 07 Oct 2026
Fix
  • Sidebar (assets/js/nav.js and admin/index.html): a PM, Delivery SPOC, Sales SPOC, POD Owner or Cluster Head now sees a Management group with just 👥 People & Organisation. Admin and PMO keep the full group; other roles see none.
  • admin/index.html: these roles are let in for People & Organisation → Projects only. The tab shows the projects they are responsible for, with their contributors and a Manage contributors button. The dialog changes contributors only and shows the project’s other details read-only.
  • Sign in as a PM and open People & Organisation to try it. Parity only: the app shipped this as #3023, so no dependent implementation item.
v747 💄 Cycle Detail: a Review Action card to forward or return an older in-progress cycle (#4838) 07 Oct 2026
Fix
  • cycle-detail.html → In progress: a ⚡ Review Action card, as in the app, for a reviewer who opened an older in-progress cycle from Cycle History. The live review pages only load the newest cycle.
  • The sample cycle sits with the Delivery SPOC: the Delivery SPOC can Approve & Forward to Sales SPOC; anyone at or above that level can Return to Project Manager or Return to Project Lead. Other roles see no card.
  • The first click opens the comment box and the second confirms. A return needs a comment.
  • Parity only: the app shipped this as #3388, with one Return per level from #4809, so no dependent implementation item.
v746 💄 Reviewer pages: Export PDF beside Update Digest (#4837) 07 Oct 2026
Fix
  • workflow/spoc.html (Delivery and Sales SPOC) and workflow/pod.html: a 📄 Export PDF button under 📋 Update Digest in the header, so a reviewer can take the live cycle offline without going to Cycle History.
  • It reads “⏳ Exporting…” while it runs; the mockup then names the file the app downloads (cycle-W25-2026-W25.pdf). One shared helper in assets/js/wf-preview.js.
  • Parity only: the app shipped this as #3474, so no dependent implementation item.
v745 💄 Cycle History: a Returned filter and badge (#4836) 07 Oct 2026
Fix
  • cycle-history.html: the status filter has Returned, between In Progress and Draft, as in the app. A returned cycle shows a ↩️ Returned badge and is not counted under In Progress.
  • Sample: W24-2026-W24 is now a returned cycle, so the Approved tile reads 9 and In Progress stays 1.
  • Parity only: the app shipped this as #2645 and #2646, so no dependent implementation item.
v744 💄 Focus timer settings: a Focus music choice (#4835) 07 Oct 2026
Fix
  • my-actions.html → Focus timer → Settings: a Focus music section before Motivation cues, as in the app: Off (the default), Lo-fi, White noise or Rain. It plays while a focus phase runs, at the volume set by the slider. The choice is saved with Save settings.
  • The app plays a 2-second preview when you pick one; the mockup only selects it.
  • Parity only: the app shipped this as #4659, so no dependent implementation item.
v743 💄 Meeting Notes AI: each project is a section you can fold, and the fold is remembered (#4834) 07 Oct 2026
Fix
  • meeting-notes-ai.html: the small uppercase project label is now a full-width section heading, as in the app: 📁 the name, a summary (for example “1 series · 2 meetings · 4/11 actions closed”), a ⚠ overdue count, and ▾ Hide / ▸ Show. The meetings sit indented under a left rule.
  • Hide folds the section, and this browser remembers it, so the list reopens the way you left it. A missing or broken saved value just opens every section.
  • Parity only: the app shipped these as #4552 and #4559, so no dependent implementation item.
v742 💄 Admin Projects: the inactive sample project Northwind Retail (#4833) 07 Oct 2026
Fix
  • admin/index.html#projects: Northwind Retail (P016, POD Basu) is listed as inactive, with its Activation Log (“Engagement ended — handover complete.”). Filter Status → Inactive to see it.
  • It is the deactivated project whose meeting Meeting Notes AI groups under an inactive badge (v739), so the two pages now agree. Sample data only: no implementation item.
v741 💄 Meeting Notes AI: AiDE action items with no date are due the next day (#4819) 07 Oct 2026
Fix
  • meeting-notes-ai.html: the sample AiDE action items with no date from the discussion are now due the next day, not in four days, the same as an item added by hand.
  • Owner decision 2026-10-07 on #4819. The app change ships in the same commit (API default 4 → 1 day), so no dependent implementation item.
v740 💄 Bulk invite, meeting attendee invite and test digest say why the email was not sent (#4832) 07 Oct 2026
Fix
  • admin/index.html → Bulk invite: a row whose address contains nomail is created but not emailed. The summary says how many, and to use Resend once the cause is fixed. That row’s Detail says why.
  • meeting-notes-ai.html → inviting an unmatched attendee: with a nomail address the toast says the person is linked, but the invitation email was not sent, and why.
  • profile.html → Send me a test: when the Weekly digest is off, or a pause covers it, the warning says so in the app’s words. A timeline-only pause does not stop it.
  • Completes v737. Parity only: the app shipped these as #4580, #4583 and #4572, so no dependent implementation item.
v739 💄 Meeting Notes AI: an inactive project’s group shows its name with an “inactive” badge (#4831) 07 Oct 2026
Fix
  • meeting-notes-ai.html: a meeting on a deactivated project is grouped under its real name, muted, with a small inactive badge, never “Unknown project”. The name and status come from the meeting itself, as the project list holds active projects only. Sample: Northwind Retail — Handover Review.
  • Inside a project group the cards no longer repeat the 🔗 project chip, since the heading already names it. With one project picked, the flat list keeps the chip.
  • Parity only: the app shipped these as #4688 and #4552, so no dependent implementation item.
v738 💄 SPOC review: a “Not my turn” state, with the reason and ladder-aware returns (#4830) 07 Oct 2026
Fix
  • workflow/spoc.html: the same 🎛 Turn toggle as the PM and POD Owner pages, for both the Delivery SPOC and the Sales SPOC. Not my turn puts the cycle one level below you.
  • Off-turn, Forward is disabled and the ⏳ line above the buttons says why in role words, for example “This cycle is waiting for the Delivery SPOC to review and forward it.”
  • Each “Return to …” follows the ladder: the level that holds the cycle is greyed (“The cycle is already with the …”), lower levels stay live. The edit surface is read-only while it is not your turn. ESO and Recruitment SPOC observers get no toggle.
  • Parity only: the app has this through #4808 and #4809, so no dependent implementation item.
v737 💄 Admin: say when the user was not emailed, and why (#4829) 07 Oct 2026
Fix
  • admin/index.html: invite, resend invitation, user edit, 🔒 force logout and Projects → bulk add or remove a PL/PM now warn when the email to the user was not sent, instead of a plain success.
  • The warning gives the reason in plain words when a retry cannot fix it (for example “they have turned this kind of email off, or paused email”), or says the email “could not be sent” when it might. A user edit warns once for each email: role change and account status.
  • Try Shalini (email turned off), a resend to Priya Menon (a mail failure), or an invitation to an address containing nomail (template still a draft).
  • Parity only: the app shipped this as #4574, #4586 and #4823, so no dependent implementation item.
v736 💄 U&D review: why Return and Forward are disabled, on the page and in role words (#4828) 07 Oct 2026
Fix
  • workflow/pm.html, pod.html, cluster-head.html: when it is not your turn, a ⏳ line above the action bar says why, for example “This cycle is waiting for the Delivery SPOC to review and forward it. Your Return and Forward actions open when it reaches the POD Owner step.” It goes away when the buttons are live.
  • The old reason named internal statuses (“it is "pm_submitted" and your actions open at …”). The tooltip and the Cluster Head’s inline error now use the same role words. Try the “Not my turn” pill on PM or POD Owner, or the Cluster Head’s status pills.
  • One shared definition in assets/js/wf-preview.js. Parity only: the app shipped this as #4808, so no dependent implementation item.
v735 💄 Admin Users: anonymise a departed user (#4827) 07 Oct 2026
Fix
  • admin/index.html#users: a 🕶️ Anonymise button after 🗑️ on each deactivated user’s row, and none on one already anonymised. Filter Status → Inactive and try Arun Vasudevan or Meera Iyer.
  • It asks the app’s confirm, then the row becomes a stable pseudonym (Former user 01BD97, former-user-<id>@anonymised.invalid) and their AiDE token is cleared.
  • Parity only: the app shipped this as #4362, so no dependent implementation item.
v734 💄 Admin Users: the coloured AiDE token key and its token panel (#4826) 07 Oct 2026
Fix
  • admin/index.html#users: a 🔑 key after 🗑️ on each row of a user who has an AiDE token, and none for anyone without one. A ring and a dot colour it by status: green when AiDE accepts it, red when AiDE refused it, amber when the portal can no longer read it. Its label says the status and last use in words. Try Vishnu K R Goluguri, Swati Nandha and Kuntal Singha.
  • The key opens the token panel: the status explained, the masked token, saved, last used and last refused times, 30-day use, every token used, token activity and recent AiDE runs.
  • 👁️ Reveal token is in the panel footer, greyed for an unreadable token. It asks the app’s confirm, then shows the token for 30 seconds with Copy and a countdown.
  • Parity only: the app shipped this as #4684 and #4825 (web AdminAideTokenPanel), so no dependent implementation item.
v733 💄 U&D review: a “Return to …” button for each level below you (#4822) 07 Oct 2026
Fix
  • workflow/spoc.html, pod.html, cluster-head.html: the single Return button (two on the Cluster Head) is now one ↩️ Return to … per level below the reviewer, nearest first. Delivery SPOC: PM, PL. Sales SPOC: Delivery SPOC, PM, PL. POD Owner: Sales SPOC down to PL. Cluster Head: POD Owner down to PL.
  • A button is live when the cycle is with a level above that target and at or below you, so a cycle still with a lower level can be sent further down. Otherwise it is greyed with the app’s reason (“The cycle is already with the …”). Try the POD Owner’s “Not my turn” pill or the Cluster Head’s status pills.
  • Parity only: the app shipped this as #4809 (owner decision 2026-10-06, web ReturnButtons), so no dependent implementation item.
v732 📝 Help: what to do when a reviewer returns one P&A item (#4817) 06 Oct 2026
Docs
  • help.html → Priorities & Achievements → Submitting: a short paragraph on a returned item, the Revise button and the “Changed since” line (pl.html v730, v731).
  • Parity only: the app’s Help gains the same step in the same change (#4817), so no dependent implementation item.
v731 🐛 P&A: the “waiting again” line no longer says the reviewer returned it (#4813) 06 Oct 2026
Fix
  • priorities/pl.html: an item’s decision that is waiting again now reads ✎ Changed since X looked at it. Waiting for them to look again. (was “Revised after X returned it”).
  • Since #4812 a revision also sets aside an approval of the old text, and #4813 does the same when the item is edited on a returned week, so “returned” was not always true.
  • Parity only: the app changes in the same commit (#4813), so no dependent implementation item.
v730 📝 P&A: a returned item can be revised on its own while the week stays submitted (#4810) 06 Oct 2026
Feature
  • priorities/pl.html: on your own submitted (locked) week, an item a reviewer returned gets ✏️ Revise and a line saying you can change it while the rest stays submitted. Only that item opens: no delete, no reorder, no new items.
  • Saving it turns the return into ✎ Revised after X returned it. Waiting for them to look again. The reviewer is told in-app and can approve or return the item again.
  • Owner decision 2026-10-06: unlock that item only. Before this a per-item return (v720, #4781) left the whole week locked, so the member could read the reason but not act on it.
  • Demo: pick ✅ Submitted (locked); the hiring priority carries a return.
  • Implementation: dependent item #4811.
v729 📝 Help: the weekly focus digest and the email-link settings page (#4807) 06 Oct 2026
Docs
  • help.html → Notifications: names the opt-in Weekly focus digest, and says notification emails carry stop and manage links that work without signing in.
  • Parity only: the app’s Help gains the same text in the same change (#4807), so no dependent implementation item.
v728 📝 Help: the newer Reports panels and who sees them (#4805) 06 Oct 2026
Docs
  • help.html → Reports & Analytics: a “More report panels” section naming the thirteen panels the topic did not describe, split into those everyone with Reports sees and the five that are PMO / Admin only.
  • Parity only: the app’s Help gains the same section in the same change (#4805), so no dependent implementation item.
v727 📝 Help: My On-Time Record and Status page notices (#4804) 06 Oct 2026
Docs
  • help.html → Profile & Tokens: a short section on the My On-Time Record card.
  • help.html → Admin Portal: a short section on posting and closing incident and maintenance notices on the public Status page.
  • Parity only: the app’s Help gains the same two sections in the same change (#4804), so no dependent implementation item.
v726 📝 PAGES.md: the MCP tool lists are described as they are (#4803) 06 Oct 2026
Docs
  • PAGES.md → Profile and MCP Setup Guide: both said a “14 tools” table. Profile has no table (its text gives the count and links to the guide); the guide has a card for each of the 121 tools in eleven groups.
  • Text only, so no dependent implementation item.
v725 📝 Docs page: the scheduler line no longer says 9 cron jobs (#4802) 06 Oct 2026
Docs
  • docs.html → services list: “Scheduler service (9 cron jobs)” now points to Admin → Scheduler, where every job is listed. The app has 50; the number is left out because it keeps moving.
  • Text only, so no dependent implementation item.
v724 📝 Index: the architecture card says 121 MCP tools (#4792) 06 Oct 2026
Docs
  • index.html → Solution Architecture card: the MCP surface reads 121 tools (was 118). v723 missed this one page.
  • Text only: the count already matches the MCP server, so no dependent implementation item.
v723 🤖 MCP: three P&A review tools; every page says 121 tools (#4790) 06 Oct 2026
Docs
  • mcp-guide.html: tool cards for approve_pa_item, return_pa_item and override_approve_pa.
  • help.html, docs.html, mcp-guide.html, profile.html, PAGES.md: the MCP server count reads 121 tools (was 118).
  • Parity only: the MCP server gains the tools in the same change (#4790), so no dependent implementation item.
v722 📝 P&A: the submitter sees each reviewer’s decision on an item (#4788) 06 Oct 2026
Feature
  • priorities/pl.html → item rows: under the text, one line per reviewer decision on that item: ✓ Approved by <name> or ↩ Returned by <name>: <reason>. Shown in every state. The demo has a returned priority and an approved achievement.
  • Owner decision 2026-10-06: the per-item decisions from #4781 also belong on the submitter’s page, not only in the notification. Dependent implementation item: #4789 (New, impl-pending).
v721 📖 Help: reviewing P&A mentions per-item Approve/Return and Override-approve (#4786) 06 Oct 2026
Docs
  • help.html → Reviewing your team’s P&A: adds the per-item ✓ Approve item / ↩ Return item and the senior ⚡ Override-approve, matching the app’s new Help step (#4781, mockup v720).
  • Parity only: the app already does this (#4781), so no dependent implementation item.
v720 ✅ P&A review: approve or return a single item, and a senior override (#4780) 06 Oct 2026
Feature
  • priorities/review.html → item rows: while the week waits for this level’s review, each priority and achievement offers ✓ Approve item and ↩ Return item. Return opens an inline box and needs a reason. A decided item shows ✓ Item approved or ↩ Item returned (the reason on hover).
  • Action bar, SPOC level and above: ⚡ Override-approve approves every item without waiting for the review chain, after a required written justification that goes to the activity trail. A new demo toggle, Senior (SPOC+) view, shows it.
  • Owner decision 2026-10-06: these API routes (#2436 per-item approve/return, #2441 override-approve) had no screen. The mockup comes first. Dependent implementation item: #4781 (New, impl-pending).
  • Open questions for the owner before #4781 is built: per-item email (none exists; per item or batched per week), and how per-item decisions relate to the whole-week Approve.
v719 ✉️ Email subjects name the project by its short code (#4779) 06 Oct 2026
Feature
  • admin/admin.js → email template catalogue: the 19 subjects that named a project now use {{projectCode}} (the project’s short code, e.g. APSB) instead of {{projectName}}; bodies keep the full name. The preview sample gains projectCode: 'APSB'.
  • Owner request 2026-10-06. Mockup and app change together in #4779, which is also the implementation, so no separate dependent implementation item.
v718 📖 Help: Users & Roles mentions Hand over (#4758) 05 Oct 2026
Docs
  • help.html → admin topics table: the Users & Roles row now adds that work left with no owner stays in the warning panel, where 🤝 Hand over gives it to someone later, matching the app's Help step (#4742).
  • Parity only: no dependent implementation item.
v717 📝 P&A: adding, editing or reordering an item saves the week as a draft (#4756) 05 Oct 2026
Feature
  • priorities/pl.html: each added, edited or reordered item now shows “✓ Draft Saved” and “Last saved HH:MM” with no button pressed and no extra toast, as the app does since #4743. Removing the last item from a draft with no note takes the week back to “Save as Draft”; a written note keeps the draft. Only on the person's own week while it is open.
  • Parity only: the app already does this (#4743, and #4755 for Timeline captures), so no dependent implementation item.
v716 ⚠️ Admin Users: Deactivate warns about what the person still holds (#4746) 05 Oct 2026
Feature
  • admin/index.html → Users → Deactivate: when the person still holds approval seats, project memberships, meetings or open action items, the toast names each one (for example “Delivery SPOC on 2 project(s), owner of 1 meeting(s) or meeting series”) and says what to do: reassign the seats, and use Hand over for the meeting work. Someone holding nothing gets a plain “deactivated”. Parity with the app (#2053, #4745); the mockup used to say nothing.
  • Parity only: the app already does this, so no dependent implementation item.
v715 🤖 MCP guide lists the three task tools; every page says 118 tools (#4744) 05 Oct 2026
Docs
  • mcp-guide.html → Meeting Notes AI tools: adds create_my_action_item, update_my_action_item and stop_repeating_action_item, which the server gained in #4706. The page now carries 118 tool cards, the server's count.
  • mcp-guide.html, profile.html, index.html: the tool count reads 118 (was 115). v709 updated help.html, docs.html and PAGES.md and missed these.
  • Parity only: the server and the app already have the tools, so no dependent implementation item.
v714 🤝 Admin Users: the stale panel lists leftover meeting work and offers Hand over (#4740) 05 Oct 2026
Feature
  • admin/index.html → Users → stale panel: it now also lists unfinalised meetings, running meeting series and open action items still held by someone who is not active (the sample is Meera Iyer, inactive), with a sentence of its own and rows in the details table. It shows even when that person holds no approval seat. Parity with the app (#4739).
  • 🤝 Hand over: one button per person in that panel opens a dialog listing their work and a person picker with no suggestion; Hand over stays disabled until someone is chosen. Afterwards the work leaves the panel. Parity with the app (#4742).
  • Mark as left: with a successor chosen, the work now leaves the panel; with nobody chosen, it stays listed there, as the dialog's warning says.
  • Parity only: the app already has all of this, so no dependent implementation item.
v713 📖 Help: Users & Roles mentions Mark as left (#4737) 05 Oct 2026
Docs
  • help.html → admin topics table: the Users & Roles row now names 🚪 Mark as left, which hands a leaver's approval seats, meetings and open action items to a successor (v710, #4733). The app's Help gains a step for it in the same change, and its deactivate step now names the right icon (⏸, not the revoke ✕).
  • Parity only: no dependent implementation item.
v712 ✉️ Email Templates: ET-076, the successor's notice when a leaver's work is handed to them (#4733) 05 Oct 2026
Feature
  • admin → Email Templates: ET-076 Leaver Work Handed Over, filed with the other account mail (no opt-out): it tells the successor chosen in v710's Mark as left dialog how many meetings and open action items they now hold, and which of the projects they are not on. CTA Open My Action Items.
  • Owner decision 2026-10-05: the successor is told by bell AND email. Implemented in the same change as the app (#4733), so there is no separate implementation item.
v711 🕘 P&A: last submitted week's priorities shown above Achievements (#4726) 05 Oct 2026
Feature
  • priorities/pl.html: a read-only Last Week's Priorities — 2026-W24 (8 Jun – 14 Jun) card between Top 3 Priorities — This Week and Key Achievements. Numbered priorities with category, AiDE and project/POD chips; achievements below, smaller. It folds away and starts open.
  • If last week was missed (nothing but a draft), it shows the latest earlier submitted week instead, headed Last Submitted Priorities with that week's dates and a line saying last week was not submitted. The mockup-only Preview link switches between the two.
  • Owner asks 2026-10-05. Parity only: the app already ships it (#4726), so there is no dependent implementation item.
v710 🚪 Mark as left hands the leaver's meetings and open action items to one successor (#4631) 05 Oct 2026
Feature
  • admin → Users → 🚪 Mark as left: the plain confirm becomes a dialog. It lists the meetings the leaver owns and the open action items assigned to them (meeting-born and standalone, recurring series included; done items stay as history), and a Hand these to picker.
  • The picker defaults to the next approval rung, the same person who takes their approval seats (the 2026-08-14 rule). The admin can change it, or choose Nobody: that is allowed, with a warning naming how many meetings and open items will have no owner, and the leaver's page keeps listing them.
  • Ownership of their meetings and recurring meeting series moves to the successor, finalised meetings included (their history is kept).
  • Owner decisions 2026-10-05 on #4631, asked in session. Sample data: Swati Nandha (u1) owns two meetings and has three open items; Dinesh Kumar Purohit (u2) has one.
  • Dependent implementation item: #4733 (api + web), tagged impl-pending and from-mockup.
v709 ⏹ Recurring tasks: the assignee can stop one somebody else set up; Help gains a recurring-tasks section (#4722, #4723, #4707) 05 Oct 2026
Feature
  • my-actions.html: a new sample task, Send the weekly status note to the client, repeats every Tuesday and was set up by Anita Rao, not by you. It has no ✏️ (only the person who set it up changes the rule), but it shows ⏹ Stop repeating. Pressing it asks first, then stops the series, keeps every task already created, and says the person who set it up is told (#4722, owner decision 2026-10-05; the bell notice is #4723).
  • help.html → Meeting Notes AI: a Recurring tasks section mirroring the app's Help: the Repeat presets, the 7-day lead, this task only against this and future, stopping, and stopping one somebody else set up.
  • help.html, docs.html, PAGES.md: the MCP server count reads 118 tools (was 115), matching the server after #4706 added the three task tools (the mockup half of #4716; the architecture docs remain).
  • Parity only: the app already ships both (#4707, #4722, #4723), so there is no dependent implementation item.
v708 🔁 Recurring tasks: a Repeat control on a standalone action item, like Microsoft To Do (#4699, #4700) 04 Oct 2026
Feature
  • my-actions.html and my-work.html → New action item: a Repeat control under the due date: Never (default), Daily, Weekdays, Weekly, Monthly, Yearly, or Custom (every N days, weeks, months or years; weekday chips for weekly; ends never, on a date, or after N times). A live line states the rule in plain words and the next three due dates, for example Every 2 weeks on Mon and Thu, first due 12 Oct 2026. The Project or POD picker is unchanged and stays optional.
  • Dates follow the rules #4699 asks the engine to follow: the local calendar day; a monthly 31st falls on the last day of a shorter month; a yearly 29 February falls on 28 February in other years.
  • Rows: each occurrence of a recurring task shows 🔁 and its summary beside Self-raised (new sample task: Update the weekly RAID log, every week on Mon and Wed, no project).
  • Edit a recurring task: choose This task only or This and future tasks, and a Stop repeating button, which keeps every task already created.
  • The logic lives once, in the new assets/js/recurrence.js, shared by both pages, because the app uses one modal for both.
  • Fixed on the way: adding an action item on my-actions.html crashed the list render, because a new item had no focus record. It now gets an empty one.
  • Shows the proposed default for #4699's open questions (a new task on schedule, whatever the state of the last one); those are for the owner before the data model starts.
  • Dependent implementation items: #4701 data model, #4702 recurrence engine, #4703 API, #4704 scheduler job, #4705 web, #4706 MCP and My Work, #4707 tests, Help and What's New (all To Do, under #4699).
💄 mockup(my-actions): v708 — recurring tasks Repeat control, summary badge, edit this or future, stop repeating #4700
v707 — Done 🍅 Profile: Focus Activity card (#4109/#4397) + 🏷️ Cycle Detail: Timeline captures count (#4110) 03 Oct 2026
Parity
  • profile.html: Added the Focus Activity card (#4109, #4397) between On-Time Record and Meeting Corrections. Shows last-91-day focus time, pomodoros, tasks closed, top 3 most-focused items, and all-time totals + streak. Matches FocusActivityCard.tsx.
  • cycle-detail.html: Added the Timeline captures strip (#4110) between Attachments and Trend. Shows how many Project Timeline events were captured into the cycle and links to the Timeline. Matches the detail-timeline-captures card in CycleDetailScreen.tsx.
  • Both features were shipped in the web app (4109/4397 and 4110) but absent from the mockup. No new implementation items needed.
  • Dependent implementation items: #4109, #4397, #4110 (all Done).
💤 mockup(parity): v707 — Focus Activity card on Profile and Timeline captures on Cycle Detail #4605
v706 — Done ⏱️ Focus timer runs the full cycle on its own: focus, break, focus, each recorded on the server 01 Oct 2026
Feature
  • my-actions.html → Focus timer settings (#4651): Start breaks automatically and Start the next focus automatically are now ON by default (owner directive, 2026-10-01). The note under Settings now mentions the full auto-cycle.
  • The automatic focus start creates a real server session for the same task, so it appears on a second device, is credited when it ends, and counts in the stats strip. Previously, auto-started focus phases ran only in the browser and were never recorded.
  • If the task was marked done during the break, the timer stops and asks the user to pick the next task. If the daily goal is already reached, no further focus starts by itself. Offline or a 409 on the automatic start shows the existing error message.
  • Existing users who had both toggles stored as false (the old default, never explicitly chosen) are upgraded to ON once; turning them off again sticks.
  • Dependent implementation item: #4651.
💤 mockup(actions): v706 — focus timer full auto-cycle, both toggles ON by default #4651
v705 — Done 💬 Focus timer: optional motivation cues while a pomodoro runs 01 Oct 2026
Feature
  • my-actions.html → Focus timer settings (#4649): a new Motivation cues section. Choices are Off (default), Every 5 min, Every 10 min, and Key moments (halfway, 5 min left, 1 min left). A cue style option offers Voice (spoken via browser speech, en-GB preferred) or Tone only (a short soft rising pitch).
  • Cues fire only during a focus phase, not during a break or while paused, and not in the last 10 seconds where the end-of-phase sound fires. A cue missed while the tab was hidden is skipped rather than played late. With two devices open on the same session, only the initiating tab speaks.
  • The text of the current cue is shown briefly next to the dial and announced politely to screen readers (aria-live), so the cue is visible with the sound off.
  • Dependent implementation item: #4649.
💤 mockup(actions): v705 — focus timer motivation cues setting #4649
v704 — Done 📝 Moving to another cycle or person asks before a half-written note or item is lost 01 Oct 2026
Fix
  • cycle-detail.html (#4652, from #4596): with a note half-written, the Older / Newer switcher asks Leave without posting? first. Leave opens the other cycle with the note box closed and empty; Stay keeps the note. Before, the note came back open on the other cycle and Save Note posted it there.
  • priorities/review.html (from #4598): with a priority or achievement half-written in the add boxes, a My Team row asks Leave without adding? before it opens another person's submission, and Next pending item counts that draft as unsaved work. Before, the draft followed the reviewer to the next person, and Add put it on their submission. A typed feedback note is not asked about: the app keeps it as a draft on the submission it was written for.
  • Not drawn, and app-only: Meeting Detail keeps each occurrence's staged files and pasted transcript with that occurrence, so the occurrence switcher needs no question (#4597).
  • Dependent implementation item: #4653, built under #4599 in the same change.
v703 📧 Email buttons say what was sent, and warn when some or none went out 01 Oct 2026
Fix
  • project-health.html (#4645, from #4600): the Project, POD and Portfolio Health Email buttons no longer say Opening email composer (there is no composer: the summary is emailed to you). The button reads Sending… and is disabled while it runs, then says The summary has been emailed to you. In the app, a summary that was not sent shows an amber note naming why.
  • meeting-notes-ai.html: Send reminders now says the reminders were sent, not queued. Notes record that the report and reminder toasts are green only when everyone got the email, and amber, naming how many were not sent and why, when some or none did.
  • admin.js: the Meetings register Nudge toast says sent, not queued, and is never a green (0 emails) in the app.
  • Dependent implementation item: #4646, built under #4600 in the same change.
v702 🌍 The invite dialog names the expiry zones by place, not by IST / GMT / EST 30 Sep 2026
Fix
  • admin/index.html (#4620): the invite dialog hint says the expiry is shown in India, UK and US Eastern time instead of all timezones (IST / GMT / EST). Since #4557 the email names the UK and US zones by the clock in force that day, so in summer it reads BST and EDT.
  • Scheduler → Global Settings: the invitation expiry hint no longer says the email shows all timezones; it names the same three.
  • admin.js: the invite success toast uses the same words.
  • Dependent implementation item: #4621 (web invite dialog and Scheduler hint).
v701 🕒 The Friday P&A reminder arrives in each person’s own afternoon 30 Sep 2026
Feature
  • admin (#4571): the ET-040 end-of-week reminder template reads Every Friday, 16:00-18:59 in each recipient’s own timezone instead of Friday 10:30 GMT.
  • It follows the Monday kickoff (v699), which moved to each person’s own morning.
  • The app moved in the same change, so there is no dependent implementation item.
v700 📧 Admin email fields say the portal only emails ValueLabs addresses 30 Sep 2026
Feature
  • admin/index.html (#4568): the email template Test Send box now suggests name@valuelabs.com instead of recipient@example.com, and both it and the scheduled report Recipients field carry a hint line: ValueLabs addresses only (@valuelabs.com).
  • While you type, a soft warning names any address outside ValueLabs. It does not block the form; the server refuses those addresses and says why.
  • Follows the owner decision that the portal never emails anyone outside ValueLabs. The app change is tracked by the dependent implementation item #4569.
v699 🕒 The Monday P&A kickoff arrives in each person’s own morning 30 Sep 2026
Feature
  • admin (#4560): the ET-007 Priorities & Achievements Monday kickoff reads Every Monday, 08:00-10:59 in each recipient’s own timezone in the reminder list, the scheduler job list (now hourly at :33) and the email template, instead of Every Monday 08:00 IST.
  • It follows the timeline reminder, the closure digest and the pending-actions digest, which moved to each person’s own morning in v655 and v656.
  • The app moved in the same change, so there is no dependent implementation item.
v698 📅 My Action Items: add your due dates to a calendar 28 Sep 2026
Feature
  • my-actions.html (#4495): a 📅 Add due dates to calendar button beside New action item. It downloads a calendar file with one all-day entry per open action item on its due date; a later download updates the same entries.
  • Finished items are left out. It follows the cycle due-date download on the Dashboard (#4147).
  • The app moved in the same change, so there is no dependent implementation item.
v697 📜 AI assistants can read a Timeline’s activity log (115 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4486): a get_timeline_activity card — a project’s Timeline activity log, including edits and deletions the events list leaves out.
  • The stated MCP tool count moves from 114 to 115 on every page that states it.
  • The server moved in the same change, so there is no dependent implementation item.
v696 🔙 AI assistants can see the previous cycle while drafting (114 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4483): a get_previous_cycle card — the previous cycle’s Downs, or your own items and notes from it, the same reads the submission screen shows.
  • The stated MCP tool count moves from 113 to 114 on every page that states it.
  • The server moved in the same change, so there is no dependent implementation item.
v695 🛰️ AI assistants can re-read saved risk radars (113 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4478): a get_saved_risk_radars card (the last 5 saved radars, or one in full, with no AiDE call), and the get_risk_radar card now says it returns the latest saved radar unless asked to refresh.
  • The stated MCP tool count moves from 112 to 113 on every page that states it.
  • The server moved in the same change, so there is no dependent implementation item.
v694 🔑 AI assistants can list and answer access requests (112 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4475): two admin tools, list_access_requests and answer_access_request, with the same PMO/Admin gate as the Access Requests tab. Answering records the answer and tells the requester; it does not add a membership.
  • The stated MCP tool count moves from 110 to 112 on every page that states it.
  • The server moved in the same change, so there is no dependent implementation item.
v693 🔢 The MCP tool count reads 110 on the home and profile pages 28 Sep 2026
Feature
  • index.html, profile.html (#4058): the MCP server’s tool count read 103 while the server has 110 (every other page already said 110 after #4443, whose sweep matched only the old figure 109).
  • Number-only change; no dependent implementation item, because the app reads its count from the server.
v692 ⬇️ Webhook delivery log: Load more past the newest 200 28 Sep 2026
Feature
  • admin/index.html → Webhooks (#4455): a Load more button under the delivery log appends older attempts past the newest 200 (#4432 only said they existed).
  • The Failed (24h) count is recounted over everything loaded, so it stops saying “at least” once the older rows are in.
  • The app moved in the same change, so there is no dependent implementation item.
v691 ⬇️ Access requests: Load more past the first 100 28 Sep 2026
Feature
  • admin/index.html (#4454): the Access Requests tab shows the cap note from #4449 and a Load more button that appends the next 100 requests.
  • On the waiting list the newest requests were the ones past the cap; they can now be reached.
  • The app moved in the same change, so there is no dependent implementation item.
v690 🧭 Agents can read the confirmed decision record (110 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4443): a get_confirmed_decisions card — confirmed decisions for a project, or for a POD-linked meeting’s POD, with the same access as the web panel.
  • The stated MCP tool count moves from 109 to 110 on mcp-guide, docs, help, profile and PAGES.md.
  • The server moved in the same change, so there is no dependent implementation item.
v689 🧭 A POD meeting lists the POD’s confirmed decisions 28 Sep 2026
Feature
  • meeting-notes-ai.html (#4439): a POD-linked meeting (no project) gets a collapsed All confirmed decisions for <POD> panel, the POD half of #4125.
  • Only decisions from POD meetings the viewer can open are listed; decisions recorded with no meeting are left out. Nothing new is exposed.
  • The app moved in the same change, so there is no dependent implementation item.
v688 ↩️ A priority repeated from last week is marked 28 Sep 2026
Feature
  • priorities/pl.html, priorities/review.html (#4435): ↩ Carried over from last week on a priority whose text matches one of the same person’s priorities last week (a strict match: formatting, case, spacing and a final full stop aside).
  • A note, not a judgement; a reworded priority is not marked. The UAT-blockers sample priority is marked as carried over on both pages.
  • The app moved in the same change, so there is no dependent implementation item.
v687 🎯 Opt in to a notification on reaching your daily focus goal 28 Sep 2026
Feature
  • profile.html (#4429): a Daily focus goal reached row in the notification settings, off until turned on, saying plainly it is not an email.
  • The app sends one bell notification (and a push where push is on) when a completed Focus Timer session brings the day’s count, in the person’s own timezone, to their daily goal; at most once a day.
  • The app moved in the same change, so there is no dependent implementation item.
v686 🎨 Reports uses the Timeline’s event icons, and the P&A screens’ category order 29 Sep 2026
Feature
  • reports.html (#4421): the By Event Type breakdown now shows the same icons as the Timeline: 📌 Milestone, 🎉 Win, ⛔ Blocker, 🧭 Decision. It had its own set for those four.
  • The Priorities & Achievements Category Breakdown lists rows in the P&A screens’ order, so Delivery now comes before Hiring.
  • Owner decisions of 29 Sep 2026. The app moved in the same change (both maps now live in src/shared), so there is no dependent implementation item.
v685 🧹 MCP guide lists the two dismiss tools (109 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4420): dismiss_notification and dismiss_read_notifications cards beside the other bell tools, and the tool count 107 → 109 here and in help, docs, profile and PAGES.md.
  • They are the Notifications page’s per-row dismiss and Clear read: your own notifications only, and unread ones are never cleared.
  • The app moved in the same change, so there is no dependent implementation item.
v684 📡 MCP guide lists the two new telemetry tools (107 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4416): get_telemetry_status and compare_telemetry_periods cards beside the other telemetry tools, and the tool count 105 → 107 here and in help, docs, profile and PAGES.md.
  • Both are read-only and need PMO Associate or System Administrator, like the other telemetry tools.
  • The app moved in the same change, so there is no dependent implementation item.
v683 📏 P&A History shows how detailed a week’s entries are 28 Sep 2026
Feature
  • priorities/history.html (#4415): a Words per entry card in the summary bar with N of M entries brief, and the review screen’s word-count badge on every entry.
  • A pointer to where to look, never a grade: a short entry can be complete.
  • The app moved in the same change, so there is no dependent implementation item.
v682 📈 Telemetry headline figures against the previous period 28 Sep 2026
Feature
  • admin/index.html → Telemetry (#4414): a Compare with previous period checkbox beside the window; each headline card gains its change against the equal window before (+12%, −0.3 pts, +2.10 s, no change).
  • The app shows the changes only when ticked, says when the earlier window reaches past retention, and measures both windows with the same API function.
  • The app moved in the same change, so there is no dependent implementation item.
v681 🧭 The mockup catches up with four shipped features 28 Sep 2026
Feature
  • priorities/review.html (#4119): the landing page’s name search (queue and Team P&A matrix), Awaiting my review only, Clear, and the no-match states.
  • my-actions.html (#4171): +1 day / +1 week on items you raised, not on done ones; an overdue item moves from today.
  • reports.html (#4140): Export on the Action Item Aging card (the comment saying there was none is replaced) and Action Item Aging – CSV in Data Exports.
  • login.html (#4145, #4392): a live countdown, the expired alert with Send a new link, and the code boxes and button disabled after expiry (a demo link jumps to expiry).
  • Mockup only: the app shipped all four first, so there is no dependent implementation item.
v680 🔎 MCP guide lists search_timeline (105 tools) 28 Sep 2026
Feature
  • mcp-guide.html (#4412): a search_timeline card beside list_timeline_events, and the tool count 104 → 105 here and in help, docs, profile and PAGES.md.
  • The tool searches every project timeline the caller can open, event text and notes, under the feed’s own visibility checks.
  • The app moved in the same change, so there is no dependent implementation item.
v679 ↔️ P&A History compares a week with the one before 28 Sep 2026
Feature
  • priorities/history.html (#4410): a Compare with previous week checkbox beside the filters; each expanded member card gains a second column with that week’s priorities and achievements and the count change, or No submission that week.
  • The web names the week compared with (the previous one listed), hides the checkbox on the oldest week, and loads that week only when ticked.
  • The app moved in the same change, so there is no dependent implementation item.
v678 🤝 POD meetings can be a timeline post’s related meeting 28 Sep 2026
Feature
  • timeline.html (#4408): the composer’s Related meeting also lists the project’s POD’s meetings, marked POD meeting, merged newest first.
  • The API accepts a meeting linked to the project or to its POD; any other is refused.
  • help.html: the composer sentence says so.
  • The app moved in the same change, so there is no dependent implementation item.
v677 ✎️ Edit a timeline post’s related meeting 28 Sep 2026
Feature
  • timeline.html (#4407): the inline edit form gets the same Related meeting picker, starting on the current link; None removes it.
  • Changing only the related meeting keeps no revision and notifies nobody; the activity log records it.
  • help.html: the editing sentence names it.
  • The app moved in the same change, so there is no dependent implementation item.
v676 🤝 A timeline post can name the meeting it is about 28 Sep 2026
Feature
  • timeline.html (#4404): the composer has an optional Related meeting (the project's meetings you can open, newest first); the posted card shows Open the related meeting, with no meeting title.
  • meeting-notes-ai.html (#4144, #4404): the meeting header's On the project timeline line, which the app has shown since #4144 and the mockup never did, now looked for on every meeting.
  • help.html: the timeline composer sentence names the new field.
  • The app moved in the same change, so there is no dependent implementation item.
v675 📝 Saved corrections show where they were applied 28 Sep 2026
Feature
  • profile.html (#4401): each Meeting Corrections row says Applied to 5 meetings and links the latest three, or Not applied to a meeting yet.
  • A correction counts as applied when a processed meeting's transcript contains its misheard term; older meetings are not counted.
  • The app moved in the same change, so there is no dependent implementation item.
v674 ⏱️ Health compares focused and unfocused action items 28 Sep 2026
Feature
  • project-health.html (#4400): the Focus time source tile, when items were due in the period, reads done: 4 of 5 (80%) with focus, 3 of 10 (30%) without, labelled as a comparison, not a cause.
  • Screen only: the figures are never given to the AiDE prompt.
  • The app moved in the same change, so there is no dependent implementation item.
v673 🤖 get_focus_summary: the focus streak for AI assistants 28 Sep 2026
Feature
  • mcp-guide.html (#4399): the tool catalog gains get_focus_summary (all-time focus totals and the daily streak), and every page stating the tool count now says 104: mcp-guide.html, help.html, docs.html, profile.html, PAGES.md.
  • Read-only; the same figures as the Profile Focus Activity card (#4397).
  • The app moved in the same change, so there is no dependent implementation item.
v672 ⏱️ See who closes action items on time 28 Sep 2026
Feature
  • reports.html → Action item aging (#4398): an On time (YTD) tile and an On time column per assignee (done on time / done, with the rate).
  • On time = completed on or before the due date, on the assignee's own calendar day. A dash, never 0%, when someone closed nothing.
  • The app moved in the same change, so there is no dependent implementation item.
v671 🗓️ See the timeline events behind a cycle 28 Sep 2026
Feature
  • timeline.html (#4396): ?cycle= narrows the feed to the events captured into that cycle (an Up or Down capture targeting it), with a Captured into cycle … label and Show all events; Clear filters resets it too.
  • The app's cycle detail page links here this way when it counts any captures; the mockup's cycle detail has no captures card yet (parity gap from #4110).
  • The app moved in the same change, so there is no dependent implementation item.
v670 🔎 Help shows you where your search matched 28 Sep 2026
Feature
  • help.html (#4394): opening a search result highlights every occurrence of the searched phrase in that topic and scrolls to the first; clearing the search removes the marks.
  • Painted with the CSS Custom Highlight API, so no text is wrapped or moved; a browser without it shows no marks.
  • The app moved in the same change, so there is no dependent implementation item.
v669 ↩️ Return an automatically approved week 28 Sep 2026
Feature
  • priorities/review.html (#4051): an auto-approved week keeps the feedback card with Return for Revision only, and a note saying the system approved it after 36 hours without a review. The auto-approved alert says Return is still possible.
  • A week a person approved is unchanged. The API always accepted this return; only the page hid it.
  • The app moved in the same change, so there is no dependent implementation item.
v668 📌 Radar history shows what you already saved 28 Sep 2026
Feature
  • workflow/cluster-head.html → AiDE risk radar → History (#4387): an earlier radar you saved to your project timelines is marked saved to N projects.
  • Counted from the event ids recorded when it was saved; a save still in progress does not count.
  • The app moved in the same change, so there is no dependent implementation item.
v667 🔗 Webhooks for project timeline posts 28 Sep 2026
Feature
  • admin/admin.js → Webhooks (#4367): two more events to subscribe to — Timeline event posted (ET-023) and Timeline event deleted (ET-024), each labelled “visible to everyone only”.
  • An event restricted to part of the approval chain is never delivered, not even without its text; an edit or a note sends nothing.
  • The app moved in the same change, so there is no dependent implementation item.
v666 ⚠️ Projects still reviewed by a POD's previous owner are flagged 28 Sep 2026
Feature
  • admin/index.html → Projects (#4343): a banner lists every project whose POD Owner or Cluster Head is no longer its POD’s, and each such row says who the POD has now — edit and save to update. Shown here on Maxica, which still has POD Ananth’s previous owner.
  • Option (c) of the decision: nothing is reassigned automatically, because saving also hands the project’s cycles in progress to the new person.
  • The app moved in the same change, so there is no dependent implementation item.
v665 🔎 Telemetry shows what kind of request was slow 28 Sep 2026
Feature
  • admin/index.html → Telemetry → slowest calls (#4354): a Details column with each call’s safe request details — method, route template, status code, database operation and table, health keys — or a dash when there are none.
  • Allowlisted and value-checked: the full address, the SQL and anything identifying a person are never shown. The trace view is unchanged.
  • The app moved in the same change, so there is no dependent implementation item.
v664 👥 Admin Projects: add or remove a member on several projects 29 Sep 2026
Feature
  • admin (#4178): the Projects selection bar gains Add or remove a member: choose Add or Remove, Project Lead or Project Manager, and a person, and the preview says per project what happens (added, already there, becomes PL/PM, removed, skipped). The person’s other projects are never changed.
  • No dependent implementation item: the app side ships in the same change (#4178).
v663 🔒 A tool-limited token says it cannot use prompts or resources 28 Sep 2026
Feature
  • admin/index.html → MCP → Tokens (#4379): the Limit to MCP tools hint now says a limited token is refused for every MCP prompt and resource as well, and the Tools… prompt says the same.
  • Option A of the decision: the limit means named tools and nothing else. No behaviour changes.
  • The app moved in the same change, so there is no dependent implementation item.
v662 ✨ Ask to be told when something is new 28 Sep 2026
Feature
  • whats-new.html (#4134): a Show me a notice when something new is added switch, off by default. When on, a short notice with the newest title appears at the top of other pages, at most once a day and never twice for one entry, until What’s New is read or it is dismissed.
  • Deliberately not the bell, a push or an email: What’s New changes several times a day. Kept on this device, like the NEW badge.
  • The app moved in the same change, so there is no dependent implementation item.
v661 📌 Save a risk radar to the project timelines 28 Sep 2026
Feature
  • workflow/cluster-head.html → AiDE risk radar (#4350): a Save to project timelines button under a radar with risks, for a new one or one opened from History. It posts one risk entry per project the radar names, visible to that project's approval chain, and says where it went.
  • Projects outside your POD, or a name two of your projects share, are skipped and named, never guessed. Saving the same radar again posts nothing twice.
  • The app moved in the same change, so there is no dependent implementation item.
v660 📁 Keep an access token to a few projects 28 Sep 2026
Feature
  • profile.html → Generate MCP Access Token (#4129): an optional Limit to projects list of your own projects. A limited token works only on those projects' cycles, meetings, timelines and health, and is refused for anything else — project lists, P&A, admin; the hint says so.
  • Deny by default: a part of the API nobody listed is refused, not exposed.
  • The app moved in the same change, so there is no dependent implementation item.
v659 🔒 Limit an automation's token to the MCP tools it needs 28 Sep 2026
Feature
  • admin/index.html → MCP → Tokens (#4149): the service-account form gains an optional Limit to MCP tools field; a limited token shows a 🔒 N tools chip, and Tools… on a service-account token edits or clears the list.
  • The hint says plainly that this keeps an automation to its tools and does not protect a leaked token — role and scope do.
  • The app moved in the same change, so there is no dependent implementation item.
v658 🤖 AiDE drafts the PM's return note 28 Sep 2026
Feature
  • workflow/pm.html → Review Comment (#4339): under the Add a reason chips, 🤖 Draft the return with AiDE names the items that most need revising and appends a drafted note to the comment box, building on the reasons already added.
  • It is only a draft: nothing is sent until the PM edits it and presses Return. PM-only, like the reviewer brief beside it.
  • The app moved in the same change, so there is no dependent implementation item.
v657 ⏰ Action-item reminders on the assignee’s own day 29 Sep 2026
Fix
  • admin/admin.js → Scheduler (#4371): the action-item reminder row (now ET-030-032, as in the app) ticks hourly at :02. Each reminder goes out between 08:00 and 10:59 in the ASSIGNEE’s own timezone, and due-in-3-days / due-today / overdue are counted on their own date. Before, a US assignee was told an item was due today on the evening before.
  • admin/admin.js → Email Templates: the ET-030 and ET-031 triggers say so. They had drifted to a 10:00 IST sweep the app never ran (it was 08:30 IST).
  • No dependent implementation item: the app side ships in the same change (#4371).
v656 🌍 Monday timeline reminder and closure digest in your own morning 29 Sep 2026
Feature
  • admin/admin.js → Scheduler (#4368): the weekly timeline reminder (ET-025) no longer fires at 02:30 UTC on Monday for everyone. It ticks hourly at :55, and each person is reminded on Monday between 08:00 and 10:59 in their OWN timezone, about their OWN last week.
  • admin/admin.js → Email Templates and Rules: the ET-025 and R-011 triggers say so, and so does ET-033, the meeting-owner closure digest, which moves the same way (hourly at :25).
  • No dependent implementation item: the app side ships in the same change (#4368).
v655 🌍 Pending-actions digests arrive in your own morning 29 Sep 2026
Feature
  • admin/admin.js → Scheduler (#4155): the weekly (ET-026) and daily (ET-026-daily) pending-actions digests no longer fire once at 03:00 UTC (08:30 IST) for everyone. Each now ticks hourly, at :40 and :50, and a person is sent their digest between 08:00 and 10:59 in their OWN timezone, on Monday for weekly or Monday to Friday for daily.
  • admin/admin.js → Email Templates: the ET-026 trigger text says so.
  • No dependent implementation item: the app side ships in the same change (#4155).
v654 📨 Ask for project access from inside the app 28 Sep 2026
Feature
  • projects.html (#4298): someone with no projects gets a Request access to a project button in the empty state; everyone else a quiet Request access to another project link under the grid. The form asks which project (typed — a person with no access cannot be shown the list) and why.
  • admin/index.html → People & Organisation → 📨 Access Requests: the queue — who asked, the project they named, why. Mark granted & tell them records the answer after the access is granted in People & Roles; Decline needs a note.
  • Email Templates: ET-074 (to the admin team) and ET-075 (the answer, to the requester), filed with the other access mail.
  • The app moved in the same change, so there is no dependent implementation item.
v653 🔑 Told when your temporary project access changes 29 Sep 2026
Feature
  • admin/admin.js → Email Templates (#4366): new ET-073 Temporary Project Access Changed. A person is emailed when a project lead or manager gives their existing account temporary access to a project, extends it, or withdraws it. Before, all three happened without a word to them.
  • An invited newcomer gets the invitation instead, and a natural expiry sends nothing, because ET-063 already warned both sides three days before.
  • admin/admin.js → Webhooks: the event list gains Temporary project access changed (ET-073). Its accessChange field says granted, extended or withdrawn.
  • No dependent implementation item: the app side ships in the same change (#4366).
v652 📣 The Status page carries incident and maintenance notices 28 Sep 2026
Feature
  • status.html → Incidents & maintenance (#4130): a card above the environment grid lists what is happening now, what is scheduled and what was resolved in the last two weeks — each with its kind, its phase and its time window.
  • Who sees what: anyone can read the notices without signing in, and a visitor sees nothing when there is nothing to report. + Post a notice, Mark resolved and Remove appear only for someone who holds PMO or Administrator.
  • The app moved in the same change, so there is no dependent implementation item.
v651 🔗 Webhooks for project membership 29 Sep 2026
Feature
  • admin/admin.js → Webhooks (#4348): the event list gains User added to a project (ET-016) and User removed from a project (ET-017), matching the app’s AdminWebhooksScreen.
  • Offered only now that every way of changing project membership sends the notice: the project edit screen, project create, the contributor mapping, both user-edit doors and the leaver hand-over. Deleting a project or a user, or marking a leaver, sends no removal, because the project or the person is gone.
  • No dependent implementation item: the app side ships in the same change (#4348).
v650 🚀 A Getting started checklist on the Dashboard 29 Sep 2026
Feature
  • dashboard.html (#4363): a Getting started card for first-time users. It shows their own steps, by role, with a progress bar, an “N of M done” count and a link to where each step is done.
  • The steps are word for word the ones the welcome email sends (#4138), so the two cannot disagree.
  • Each step ticks itself from something the person really did: the first submission, the first review or approval, finishing the tour, opening My Work. It never ticks from a click on the card.
  • The card goes away when every step is done, or when hidden. Hiding is remembered with the person’s view preferences, so it stays hidden on every device.
  • Implementation item #4364 (New, tagged impl-pending; from-mockup).
v649 👋 The welcome email says what to do first, for your role 29 Sep 2026
Feature
  • admin/index.html → Email Templates → ET-015 Account Activated (#4138): a Your first steps list built from the roles the new user holds.
    • A Project Lead is told to submit Ups & Downs and Priorities & Achievements.
    • A reviewer is told to review what reaches their step.
    • A Cluster Head is told about the final approval.
    • Every list ends with My Work and the guided tour.
  • It replaces three generic “what happens next” lines that were wrong for most roles.
  • No dependent implementation item: the app side ships in the same change (#4138). The Dashboard “Getting started” checklist is a separate item.
v648 ⬇️ Download my data 29 Sep 2026
Feature
  • profile.html → Account → Account Details (#4143): a Download my data button. It saves the person’s own records as one JSON file: profile and preferences, their Ups & Downs and Priorities & Achievements entries, action items, focus sessions, the meetings they own or joined (as a list), and their activity logs.
  • Meeting transcripts, minutes and AiDE outcomes are left out, because they are other people’s data too. Secrets such as token hashes and the stored AiDE token are never included.
  • No dependent implementation item: the app side ships in the same change (#4143). Admin anonymisation of a departing user is a separate owner decision.
v647 🗂️ My Profile split into three tabs 28 Sep 2026
UX
  • profile.html (#4061): the 15 cards that sat in one long scroll now sit in three tabs:
    • Account (6): details, appearance, timezone, on-time record, install app, active sessions
    • Notifications (3): email, project timeline, push
    • AI & Integrations (6): meeting corrections, AiDE token, usage and runs, MCP tokens, connect your AI assistant
  • Deep links: the tab is in the URL (?tab=account|notifications|ai). An anchor naming a card, such as #notification-preferences, opens that card’s tab, so older links from emails, help text and the MCP docs still land where they point.
  • Placement: Meeting Corrections and My AiDE runs, which the item did not list, go under AI & Integrations.
  • Keyboard: the WAI-ARIA tabs pattern — arrow keys, Home and End.
  • Implementation item: #4359 (New, tagged impl-pending; from-mockup) carries the app side, ProfileScreen.tsx.
v646 🗂️ Reports split into five category tabs 28 Sep 2026
UX
  • reports.html (#4062): the 22 report cards, previously one long two-column scroll, now sit in five tabs:
    • Ups & Downs (7)
    • Priorities & Achievements (4)
    • Meetings & Actions (3)
    • Platform (7)
    • Exports (1)
    A tab shows a single column.
  • Deep links: the tab is in the URL (?tab=ud|pa|meetings|platform|exports), so a link from an email or the dashboard lands on the right one. An unknown tab falls back to Ups & Downs.
  • Unchanged above the tabs: the filters, the KPI row and AiDE insights stay above the tabs and apply to all of them. AiDE insights comments on the whole page, so it is not filed under one tab.
  • Placement: Focus Timer Adoption goes under Meetings & Actions, and Project Timeline Activity under Platform. The item did not place either.
  • Keyboard: the WAI-ARIA tabs pattern — arrow keys, Home and End.
  • Implementation item: #4358 (New, tagged impl-pending; from-mockup) carries the app side, ReportsScreen.tsx.
v645 ⏱️ A weekly Focus Timer digest you can opt into 28 Sep 2026
Feature
  • profile.html → Email notifications (#4098): a Weekly focus digest row, the one toggle that starts OFF. Muting the weekly digest silences it too.
  • admin/index.html → Email Templates and Scheduler: ET-072 Weekly Focus Digest and its Friday 11:40 UTC (17:10 IST) job. The email gives time focused against last week, the three items that took the most focus, completed pomodoros and items, the streak, and the oldest open items with no focus time yet.
  • No dependent implementation item: the app side ships in the same change (#4098).
v644 🗣️ Choose the spoken language before transcribing 28 Sep 2026
Feature
  • meeting-notes-ai.html → video intake, ready-to-transcribe box (#4158): a Spoken language picker beside Generate transcript from recording — Auto-detect, or English, Hindi, Telugu, Tamil, Kannada, Malayalam, Marathi, Bengali, Gujarati, Punjabi, Urdu, Spanish, French, German or Japanese. It is saved on the meeting, and the next occurrence of a series keeps it.
  • Auto-detect stays the default, so nothing changes for a meeting where nobody picks one.
  • No dependent implementation item: the app side ships in the same change (#4158).
v643 ➖ Remove a participant from a recurring series 28 Sep 2026
Feature
  • meeting-notes-ai.html → series owners bar (#4290): a Remove from upcoming occurrences picker beside Add participant to all occurrences. After a confirmation it takes the person off every upcoming occurrence and keeps them off the occurrences added later. Past meetings are not changed.
  • Refused while the person still has an open action item on an upcoming occurrence, and the series owner is never offered. Adding the person back to the series undoes the removal.
  • No dependent implementation item: the app side ships in the same change (#4290).
v642 📝 A team corrections glossary for meeting minutes 28 Sep 2026
Feature
  • admin/index.html → Meeting Notes AI (#4166): a Team Corrections Glossary card where administrators and PMO add, edit and delete heard→correct pairs (client names, product names, technical terms). Every meeting’s minutes are corrected with them, alongside each owner’s own corrections; where both define the same term, the owner’s wins.
  • Only administrators and PMO can change it, because one entry rewrites every team’s minutes. Every change is recorded in the audit log.
  • No dependent implementation item: the app side ships in the same change (#4166).
v641 ⏱ Project Health: focus time as a source 28 Sep 2026
Feature
  • project-health (#4104): the Sources row gains a Focus time tile: Focus Timer time on the project’s action items over the period, shown as a duration and never broken down by person. AiDE now reads it as a fourth source.
  • No dependent implementation item: the app side ships in the same change (#4104).
v640 🧹 Scheduler: an alert when run-history cleanup falls behind 28 Sep 2026
Feature
  • admin/index.html → Scheduler → Activity (#4245): a Stopped Triggers card, back-filled from the app where the mockup never had it, now carries a run-history retention line. Shown here in its behind state: how many run records the cleanup should already have removed, and the oldest.
  • Why a separate check: the cleanup job logs nothing when it has nothing to delete, so it can never show as stopped. It is judged by the table itself — rows past the 30-day retention (90 for heartbeats) plus two days’ grace, never counting the newest run of each job, which the cleanup keeps on purpose. No invented row-count threshold.
  • Other states: on schedule as a muted line; maintenance switched off explains the backlog rather than alarming; could not measure says unknown, not fine.
  • The app moved in the same change, so there is no dependent implementation item.
v639 📈 Telemetry: headline figures and in-row charts 28 Sep 2026
Feature
  • admin/index.html → Telemetry (#4068): four headline cards before the tables — operations recorded, failed %, worst p95 (and whose), services reporting — all derived from the reports already loaded.
  • In-row charts: a p95 bar in each Slowest operations row against the worst in the set; a new Failure rate by operation table, worst first with a bar (operations that never failed are left out); and Traffic volume as one stacked bar per period coloured by service, with a legend. Every table stays — they carry the exact figures and are the accessible form.
  • Not added: an SLO threshold line (nobody has set a target, so any number would be invented) and a previous-period comparison (needs new API work).
  • The app moved in the same change, so there is no dependent implementation item.
v638 📊 Telemetry: a trace reads as a waterfall 28 Sep 2026
Feature
  • admin/index.html → Telemetry → trace lookup (#4069): the span table gains a Timeline column. Each span is a bar that starts at its offset and is as wide as its duration, against the whole trace, so where the time went is visible at a glance and a child sits inside its parent’s bar. Names stay indented by depth.
  • Bars are coloured by service, with a legend when a trace crosses several; a failed span is drawn in the danger tint and outlined, and the Status column still says so in words, so colour is never the only signal. A span that outlives its parent still fits — the timeline is sized to the furthest span end.
  • The app moved in the same change, so there is no dependent implementation item.
v637 🔌 The MCP server exposes 103 tools 28 Sep 2026
Parity
  • mcp-guide.html, docs.html, help.html, profile.html, index.html, PAGES.md (#4355): every statement of the MCP server’s size said 101 tools; it registers 103 since two scheduler tools were added. The MCP guide’s Admin Portal section gains cards for list_scheduler_jobs (each cron job’s last run, next run and whether it is stale) and fire_scheduler_job (run a job now; the reply means started, not finished), so the page lists all 103.
  • No dependent implementation item: the tools already exist on the MCP server; this is the mockup catching up.
v636 🔎 Telemetry: open a slow operation to see its own slow calls 28 Sep 2026
Feature
  • admin/index.html → Telemetry (#4070): each operation in Slowest operations is now a link. It opens a panel under the table: that operation’s calls and p50/p95/p99/max, a duration histogram (under 100 ms up to 10 s and over), and its slowest calls, each with View trace that fills the trace lookup below. Shown open here for the first row.
  • Changing the window closes the panel, so figures for the old window never sit beside a table for the new one. Span attributes are deliberately not shown — they carry live query strings, SQL and user ids, and exposing a safe subset is a separate decision.
  • The app moved in the same change, so there is no dependent implementation item.
v635 📈 AiDE usage: who runs it, and how it moves day by day 28 Sep 2026
Feature
  • admin/index.html → AiDE (#4151): below Calls by type, a Runs per day bar trend and a By person (heaviest first) table — runs, succeeded and failed per person. In the app these are the hub’s new 📈 Usage tab, with the same 7/30/90-day window as Config.
  • Same population as Calls by type, meeting runs included, so the totals agree. Runs, not cost: no token or cost estimate is shown, because none exists that the app could stand behind. A person whose account was removed still shows, as Removed user; past 50 people the table says how many more there are.
  • The app moved in the same change, so there is no dependent implementation item.
v634 👥 Meeting Notes AI: involvement across a series 28 Sep 2026
Feature
  • meeting-notes-ai (#4111): series managers get a collapsed Involvement across this series panel: for each person, how many past occurrences list them as a participant or owner (N of M, least involved first). It says plainly that this is who was on the meeting, not who attended.
  • No dependent implementation item: the app side ships in the same change (#4111).
v633 📱 Bigger notification bell on touch screens 28 Sep 2026
Feature
  • assets/css/design-system.css (#4191): on a touch screen the notification bell grows from 34px to 40px, the same touch size as the other topbar controls. Mouse and trackpad layouts are unchanged.
  • The app also stacks the Project Lead and Project Manager workflow buttons full-width on a phone; the mockup’s workflow pages do not use those action bars, so there is nothing to mirror.
  • No dependent implementation item: the app side ships in the same change (#4191).
v632 ⏱ Focus Timer adoption on Reports 28 Sep 2026
Feature
  • reports.html → Focus Timer Adoption (#4100): for administrators and PMO, how many people used the Focus Timer this week and in the last 30 days, their total focused time, sessions and sessions per person, and the share of active users who used it in the last 30 days, with a CSV export.
  • Organisation-wide totals only: the card names nobody, so it cannot be read as who is or is not using the timer.
  • No dependent implementation item: the app side ships in the same change (#4100).
v631 🕰 Look back at earlier risk radars 28 Sep 2026
Feature
  • workflow/cluster-head.html → AiDE risk radar (#4116): a History button lists your last five radars with their date, how many risks they ranked (and how many red), and how many projects they scanned. View loads one back into the card, marked as cached, so this week can be compared with an earlier week.
  • Only your own radars are listed or can be opened. Save to timeline is not part of this: it is split to #4350.
  • No dependent implementation item: the app side ships in the same change (#4116).
v630 🧭 Meeting Notes AI: all confirmed decisions for the project 28 Sep 2026
Feature
  • meeting-notes-ai (#4125): a project-linked meeting gains a collapsed All confirmed decisions for <project> panel listing every decision confirmed on the project, from any of its meetings, with its topic, date and source meeting. Anyone with access to the project can read it; decisions still awaiting confirmation stay owner-only.
  • No dependent implementation item: the app side ships in the same change (#4125).
v629 ⏸️ A meeting series can be paused until a date 28 Sep 2026
Feature
  • meeting-notes-ai.html → a series meeting (#4321): beside End series, a ⏸ Pause series… control takes the day it resumes. While paused a Paused until chip shows, with ▶ Resume now. No meeting is created before that day, and the first one after it falls on the series’ usual weekday — Add occurrence during a pause lands there too, never in the past. Not offered on an ended series.
  • Series cards in the list: an Ended chip once the series’ last day has passed, and Paused until while a pause is still ahead.
  • The app moved in the same change, so there is no dependent implementation item.
v628 📊 See a project’s score against its POD 28 Sep 2026
Feature
  • project-health.html → the score strip (#4186): beside the delta chip and trend, a POD average chip for the same period: the average, whether this project is above or below it, and its place (for example “POD average 74 · ▲ above · #1 of 5”).
  • It counts only projects in the POD that the viewer can open and that have a score for that period, and it is hidden unless at least two do, so it never stands in for one other project’s score.
  • No dependent implementation item: the app side ships in the same change (#4186).
v627 🪝 Webhooks can report a user's role change 28 Sep 2026
Admin
  • admin/admin.js — Webhooks (#4328): the event list gains User primary role changed (ET-018), matching the app’s AdminWebhooksScreen. It is sent once, when an admin changes someone’s primary role; a change to the other roles a person holds sends nothing.
  • Project membership (ET-016 / ET-017) and timeline events (ET-023 / ET-024) are deliberately not offered: only some of the paths that change them send the notice, so a subscriber would miss events without knowing.
  • No dependent implementation item: the app half ships in the same change.
v626 ⚠️ A token AiDE refuses no longer reads as connected 28 Sep 2026
Feature
  • Topbar chip (assets/js/nav.js, #4320): when AiDE has refused your stored Fabric Token — it expired or was revoked — the chip turns amber and reads AiDE token refused, linking to your Profile, instead of staying green until a feature fails.
  • profile.html → AiDE Fabric Token: the card says when AiDE refused the token and points at Manage token. A demo link flips the state here; in the app it comes from AiDE’s own answer and clears on the next call AiDE accepts, or when you save a new token.
  • The app moved in the same change, so there is no dependent implementation item.
v625 🔌 AiDE: Test AiDE connection 28 Sep 2026
Feature
  • admin (#4225): the AiDE Configuration card gains a Test AiDE connection button. It sends one minimal request with the admin’s own saved Fabric Token and shows Connected, Token rejected, Could not confirm, or No token to test with, plus the round-trip time.
  • No dependent implementation item: the app side ships in the same change (#4225).
v624 📧 The admin team is told when cycles stall 28 Sep 2026
Feature
  • admin/index.html → Reports → Stalled cycles (#4336): a note under the panel says the admin team is emailed about new stalled cycles every morning, and that a cycle that stays stuck is listed again at most once a week.
  • Scheduler and Email Templates: the new daily Stalled cycles alert job (10:00 IST) and its template ET-071 appear in both registers — one email per admin, listing each stalled cycle with the step it waits on and why nobody can take it.
  • The app moved in the same change, so there is no dependent implementation item.
v623 📧 Choose who gets the meeting report 28 Sep 2026
Feature
  • meeting-notes-ai.html → Email the meeting report (#4218): the owner and participants are now a checklist, all ticked. Untick anyone who should not get the report. On a meeting visible to everyone, Everyone in the organisation stays the default, and unticking it shows the checklist.
  • Only the meeting’s own owner and participants can be chosen, so a pick can narrow the audience but never reach someone who cannot open the meeting. Adding addresses from outside the organisation is not offered: that is an open owner decision on #4218.
  • No dependent implementation item: the app side ships in the same change (#4218).
v622 🚨 MCP tool error-rate alert (ET-070) 28 Sep 2026
Feature
  • admin (#4199): a new hourly job warns admins when an MCP tool starts failing — at least 20% of at least 10 calls in the last hour — with the new ET-070 email (once per tool per 6 hours). The template appears under Email Templates and the job under the Scheduler’s upcoming runs.
  • No dependent implementation item: the app side ships in the same change (#4199).
v621 ↺ A failed webhook delivery can be re-sent 28 Sep 2026
Feature
  • admin/index.html → Webhooks → Delivery log (#4293): each FAILED delivery gains a ↺ Retry button that re-sends that event now and adds the new attempt to the log.
  • It re-sends the event exactly as it was, so the receiving system recognises it as the same event rather than a new one; the hourly automatic retry then leaves it alone. A successful delivery offers no Retry (it would arrive twice), nor does a test ping (send a new test instead).
  • The app moved in the same change, so there is no dependent implementation item.
v620 📅 Scheduled reports: Ups & Downs trend and digest delivery runs 28 Sep 2026
Feature
  • admin (#4344): the scheduled-report type list gains Ups & Downs Trend and Digest Delivery Runs, matching the app. Like the other “(period)” types they cover the schedule’s own period — the last 7 days weekly, 30 monthly.
  • No dependent implementation item: the app side ships in the same change (#4344).
v619 🔌 The MCP guide lists all 101 tools 28 Sep 2026
Parity
  • mcp-guide.html (#4345): the Available Tools section showed cards for 64 of the server’s 101 tools. The other 37 now have cards — each described in the words of the tool’s own MCP description — in their existing sections (cycle submit / final approve / override-close / reopen / bulk approve, the cycle note, P&A acknowledge / chain status / reportees overview, the three health tools and two project-health tools, meeting decisions and finalise, the four focus tools) and in four new sections: Project Access, Notifications & Profile, My Work and Telemetry.
  • No dependent implementation item: the tools already exist on the MCP server; this is the guide catching up.
v618 🤖 Service accounts can be renamed and re-roled in place 28 Sep 2026
Feature
  • admin/index.html → MCP Tokens → Service Accounts (#4294): each row gains an Edit button that opens a dialog pre-filled with the account’s name and the role it acts as.
  • Its tokens keep working — nothing is revoked or re-issued — and act with the new role from their next request. The role list never offers an Admin Portal role (System Admin or PMO); an account that already holds one keeps it selected, so opening the dialog never changes it by accident.
  • The app moved in the same change, so there is no dependent implementation item.
v617 🔌 The MCP server now exposes 101 tools 28 Sep 2026
Parity
  • docs.html, help.html, index.html, mcp-guide.html, profile.html, PAGES.md (#4323): every statement of the MCP server’s surface now reads 101 tools, up from 83 — the eighteen tools added since (project access grants, POD and portfolio health, reopen and bulk-approve cycles, meeting decisions and finalise, notification preferences and profile, the reportees overview).
  • ⚠ The MCP guide’s tool cards still list 64 of the 101 — that gap predates this change and is tracked separately.
  • No dependent implementation item: the app already reports the live count (MCP_TOOL_COUNT, pinned by a test).
v616 ⛓ Mark an Up or Down as blocked by another 28 Sep 2026
Feature
  • workflow/pl.html, pm.html (#4175): an Ups & Downs item can be marked Blocked by another item of the same cycle. The blocked item shows a Blocked by chip and the blocker a Blocking N items badge. While the item can still be edited, a picker sets or clears the link, and a link that would loop is not offered.
  • On the Project Manager’s page, a blocker that is still a Down turns the chip red (“still a Down”): blocked work that is waiting on something going badly.
  • No dependent implementation item: the app side ships in the same change (#4175).
v615 📣 A note for the next kickoff email 28 Sep 2026
Feature
  • projects.html → Edit project (#4177): a Note for the next cycle kickoff email box. What is typed there goes out once, in the next kickoff email to the project’s Project Leads and Managers (ET-001 {{kickoffNote}}), and is then cleared.
  • No dependent implementation item: the app side ships in the same change (#4177).
v614 📅 Scheduled reports: cycle time, SLA and user activity 28 Sep 2026
Feature
  • admin (#4215): the scheduled-report type list now matches the app — Cycle Summary, Priorities & Achievements Weekly, AiDE Adoption and Return Rate, plus Cycle Time, Governance SLA and User Activity, which report on the schedule’s own period. It had listed a Trend report and the Full Audit Log, which were never schedulable.
  • No dependent implementation item: the app side ships in the same change (#4215).
v613 📈 Telemetry says what is actually switched on 28 Sep 2026
Feature
  • admin/index.html → Telemetry (#4204): a new Collection status card shows whether API tracing, database spans and browser tracing are on, whether the telemetry table exists, the last recorded activity, the span count for the last 24 hours and how long data is kept.
  • The empty state no longer says tracing is switched off by default, which had stopped being true. It now gives the real reason: the table has not been created, API tracing is switched off, or tracing is on and this window was quiet (pointing at the last activity and a longer window).
  • The app moved in the same change, so there is no dependent implementation item.
v612 💬 @-mention someone when you return a cycle 28 Sep 2026
Feature
  • workflow/pm.html, spoc.html, pod.html (#4174): under the return reasons, an @ Mention someone… picker listing only the project’s PLs, PMs and senior seat holders. Picking one adds “@Name” to the comment; everyone still named when the cycle is returned is emailed and notified (ET-069). The same picker appears in Return mode on a cycle’s page.
  • No dependent implementation item: the app side ships in the same change (#4174).
v611 ↩️ One-click reasons for returning a cycle 28 Sep 2026
Feature
  • workflow/pm.html, spoc.html, pod.html (#4133): under the review comment, Add a reason chips — Too vague, Risks missing, AiDE points thin, Downs lack a plan, No evidence — each appending a full, constructive sentence once. On the PM page a From the AiDE brief chip adds what the reviewer’s own brief flagged. The same chips appear in Return mode on a cycle’s page.
  • No dependent implementation item: the app side ships in the same change (#4133).
v610 🤖 Your own AiDE runs on your Profile 27 Sep 2026
Feature
  • profile.html (#4190): a new My AiDE runs card lists the AiDE runs you started — what ran (e.g. a reviewer brief or an Ups & Downs draft), what it was about (the meeting, or the project and cycle), whether it succeeded, when, and how long it took — newest first, with Show more.
  • Every role sees it, because every row is your own; the admin run log remains the place for everyone’s runs. The AI output itself is not listed here.
  • The app moved in the same change, so there is no dependent implementation item.
v609 ⛔ Admins see which cycles nobody can move 28 Sep 2026
Feature
  • admin/index.html — Reports (#4167): a Stalled cycles card under the summary tiles — every live cycle whose next reviewer seat is empty or held only by people who can no longer act, with what it waits on, why, and since when, each linking to the cycle.
  • No dependent implementation item: the app side ships in the same change (#4167). The daily email alert is tracked separately.
v608 👤 Reports: User Activity follows the date range 28 Sep 2026
Feature
  • reports.html (#4213): the User Activity card’s logins, submissions and approvals follow the page’s date range instead of always being lifetime totals, and the card names the window it covers.
  • No dependent implementation item: the app side ships in the same change (#4213).
v607 🔀 Compare two cycles side by side 28 Sep 2026
Feature
  • cycle-history.html (#4208): a Compare two cycles card — pick two cycles (the latest and the one before by default) and see each one’s Ups and Downs side by side, with items new in the later cycle and items dropped from the earlier one marked. Items are matched on their wording.
  • No dependent implementation item: the app side ships in the same change (#4208).
v606 📈 Webhooks: 7-day delivery rate per webhook 28 Sep 2026
Feature
  • admin (#4222): the webhooks table gains a 7-day delivery column — the share of events that reached the endpoint and how many were sent, green at 95% and over, amber from 80%, red below, or “No events”.
  • No dependent implementation item: the app side ships in the same change (#4222).
v605 📈 Cycle History charts Ups & Downs across cycles 28 Sep 2026
Feature
  • cycle-history.html (#4201): an Ups & Downs by cycle card above the table — two lines, oldest cycle on the left, over the cycles loaded below, with a caption saying whether that is all of them. Hidden under two cycles.
  • No dependent implementation item: the app side ships in the same change (#4201).
v604 ⏸️ Pause one kind of email and keep the rest 28 Sep 2026
Feature
  • profile.html (#4182): the email pause gains a choice in front of the day buttons — all emails (the default, as before), or just Priorities & Achievements, Ups & Downs, meeting, timeline or digest emails. The paused note names what is paused. A pause that covers only some emails does not mute the top-bar bell.
  • No dependent implementation item: the app side ships in the same change (#4182).
v603 🪝 Webhooks: edit and pause without a new secret 28 Sep 2026
Feature
  • admin (#4219): each webhook that is not revoked gains an Edit action (name, events, enabled; the URL and secret stay the same), and a switched-off webhook now shows as Paused with its actions instead of looking revoked.
  • No dependent implementation item: the app side ships in the same change (#4219).
v602 🔀 Several projects can move to another POD at once 27 Sep 2026
Feature
  • admin/index.html — Projects (#4202): the selection bar gains Move to POD… beside Deactivate. Choose the POD; the dialog lists each selected project with its current POD and says that each moved project’s POD Owner and Cluster Head become the new POD’s — the same thing editing one project does.
  • Projects already in the chosen POD are skipped. Each project is moved on its own, so if one fails the others still move and the one that did not stays selected to try again.
  • The app moved in the same change, so there is no dependent implementation item.
v601 🪝 Webhooks can report P&A submissions, approvals and returns 28 Sep 2026
Feature
  • admin/admin.js (#4220): the webhook event list gains four P&A events — submitted for review (one per reviewer notified), approved, returned for revision, and auto-approved.
  • No dependent implementation item: the app side ships in the same change (#4220).
v600 🔁 Dashboard: Ups & Downs awaiting your review 28 Sep 2026
Feature
  • dashboard.html (#4224): beside the P&A “Pending My Action” banner, reviewers (PM, Delivery SPOC, Sales SPOC, POD Owner, Cluster Head) see “Ups & Downs Awaiting You” with the number of cycles waiting at their rung; it opens My Work.
  • No dependent implementation item: the app side ships in the same change (#4224).
v599 📈 See your AiDE achievement score week by week 28 Sep 2026
Feature
  • priorities/history.html (#4122): a card with your latest AiDE achievement score, its grade, the change since your previous scored week, and a sparkline of your recent scored weeks. Hidden until a week has been scored.
  • No dependent implementation item: the app side ships in the same change (#4122).
v598 ✉ Seat Coverage can remind whoever can fill the gap 27 Sep 2026
Feature
  • admin/index.html — People & Organisation → Seat Coverage (#4206): every project with an empty senior seat gains a Remind button. One click emails the project’s POD Owner — or its Cluster Head when the POD Owner seat is itself one of the gaps — listing the empty seats, and the row then says who was reminded.
  • At most one reminder per project per day. If the person has switched Ups & Downs email off, the reminder still reaches them in the app, and the PMO is told so.
  • New email template ET-068 “Unfilled Senior Seats Reminder”, filed under Ups & Downs.
  • The app moved in the same change, so there is no dependent implementation item.
v597 📏 Reviewers see which P&A entries are brief 28 Sep 2026
Feature
  • priorities/review.html (#4180): every priority and achievement shows its word count; under 5 words it reads Brief in amber, with a tooltip suggesting asking for more detail. A length signal for where to look first, never a grade.
  • No dependent implementation item: the app side ships in the same change (#4180).
v596 📅 Dashboard: add cycle due dates to your calendar 28 Sep 2026
Feature
  • dashboard.html (#4147): the Recent Cycles card gains “Add due dates to calendar”, which downloads the upcoming cycle due dates in your projects as all-day calendar events.
  • No dependent implementation item: the app side ships in the same change (#4147).
v595 ↕️ Put your priorities and achievements in the order you mean 28 Sep 2026
Feature
  • priorities/pl.html (#4156): each of your items has ↑/↓ buttons (none on the first/last item, and none while a category filter is on). The order is saved and is the order every reviewer, the digest, P&A History and the PDF export show.
  • No dependent implementation item: the app side ships in the same change (#4156).
v594 🔎 Reports rows open the people and cycles behind them 28 Sep 2026
Feature
  • reports.html (#4123): each week in the P&A weekly table links to P&A History opened on that week, which lists every member with their status (approved, awaiting review, not submitted). Each Cycle ID in the cycle status table opens that cycle.
  • No dependent implementation item: the app side ships in the same change (#4123).
v593 📅 Project Health: apply delivery to all my projects 28 Sep 2026
Feature
  • project-health.html (#4168): in the project scope, the Auto-generate & deliver card gains “Apply to all my projects”, which sets the weekly and monthly switches as shown on every project in the picker after a confirm, and says how many it set.
  • No dependent implementation item: the app side ships in the same change (#4168).
v592 ✏️ An access token can be edited without replacing its secret 27 Sep 2026
Feature
  • profile.html — MCP access tokens (#4207): every active token gains an Edit action beside Rotate and Revoke: rename it, change its expiry, or narrow it from read & write to read only. The secret stays the same, so the assistants using it keep working.
  • A read-only token cannot be given write access by editing: its secret is already installed wherever it is used, so the dialog locks the scope and explains that a write token is a new token.
  • The app moved in the same change, so there is no dependent implementation item.
v591 🎯 Reports shows whether P&A achievement quality is improving 28 Sep 2026
Feature
  • reports.html (#4135): an Achievement Quality card — week, average AiDE Achievement Score with its grade, and how many people were scored. It covers the people the viewer may open (everyone for PMO and admins), and is per person rather than per project, because one week’s items can span projects.
  • No dependent implementation item: the app side ships in the same change (#4135).
v590 📎 Settings: attachment storage and unreferenced files 28 Sep 2026
Feature
  • admin/index.html (#4154): an Attachment storage card on Settings shows the disk used by cycle, P&A and timeline attachments per kind and in total, and how many files no attachment refers to. A confirmed button removes them; files under a day old are left alone as possible uploads in progress.
  • No dependent implementation item: the app side ships in the same change (#4154).
v589 ⏱️ The team P&A matrix shows each person’s on-time record 28 Sep 2026
Feature
  • priorities/review.html (#4217): an On time column on the Team P&A matrix — each person’s lifetime on-time percentage (the same figure their reminder emails and Profile show), with the on-time / late / missed breakdown on hover, and a dash for someone not asked to submit or with no weeks yet. It is a person’s record, so it repeats on each scope row they appear under.
  • No dependent implementation item: the app side ships in the same change (#4217).
v588 ● The audit log can follow new entries live 27 Sep 2026
Feature
  • admin/index.html — System Audit Log (#4205): a Live checkbox beside the entry count. While it is on, the newest entries refresh every 30 seconds, so an admin watching an approval chain happen no longer has to reload the page.
  • It refreshes quietly (no loading flash over the rows being read), skips refreshes while the tab is in the background, and says why it is paused when it cannot follow new entries: when you are not on the first page, or a “to” date is set.
  • The app moved in the same change, so there is no dependent implementation item.
v587 🔗 Webhooks: payload version in the delivery log 28 Sep 2026
Feature
  • admin/index.html + admin.js (#4173): the webhook delivery log gains a Payload column showing the schema version each attempt was sent with, and the webhooks help text names the new X-PodGov-Payload-Version header beside X-PodGov-Signature.
  • No dependent implementation item: the app side ships in the same change (#4173).
v586 📈 Project Health: score trend across earlier periods 28 Sep 2026
Feature
  • project-health.html (#4128): under the score, a strip of bars shows the health score for the last 8 weeks (or 6 months). A period that was summarised is a button that selects it in the period picker, so Generate serves its full summary from the earlier run; a period never summarised is a gap, not a zero. Nothing here calls AiDE again.
  • No dependent implementation item: the app side ships in the same change (#4128).
v585 ✕ Notifications can be dismissed, and read ones cleared 27 Sep 2026
Feature
  • notifications.html (#4200): every notification row gains a ✕ dismiss control after “Mark read / Mark unread” — the row leaves the list and the unread count for good.
  • The header gains Clear read beside “Mark all read”: it removes every notification you have already read and leaves the unread ones.
  • Dismissing is a soft delete: the notification is kept for the admin delivery statistics and simply no longer shown to you.
  • The app moved in the same change, so there is no dependent implementation item.
v584 📋 POD Owner: POD overview, and time in stage 27 Sep 2026
Feature
  • workflow/pod.html (#4148): a POD overview card lists every project in the POD with its current cycle and stage, those awaiting the POD Owner first. Both this and the Cluster Head card (#4148) now say how long each cycle has sat in its stage — “for 3 days”, “since today” — counted from its last submit, approval or return.
  • No dependent implementation item: the app side ships in the same change (#4148).
v583 📋 Cluster Head: portfolio of final approvals 27 Sep 2026
Feature
  • workflow/cluster-head.html (#4164): a Portfolio card above the chain lists every project the Cluster Head can final-approve, with its current cycle and stage; the ones awaiting final approval are listed first and badged “Awaiting you”, so they no longer have to switch projects one at a time to find them.
  • No dependent implementation item: the app side ships in the same change (#4164).
v582 ⏱️ Reports: median and p90 time at each approval stage 27 Sep 2026
Feature
  • reports.html (#4141): the Cycle Time by Stage table gains Median and P90 columns beside Avg Dwell. The average is dragged by one cycle that sat for weeks; the median shows what is typical at a level and P90 the slow tail — the numbers an escalation threshold is actually set from.
  • No dependent implementation item: the app side ships in the same change (#4141).
v581 ⏹ A meeting series can be ended without deleting it 27 Sep 2026
Feature
  • meeting-notes-ai.html (#4136): the meeting detail header gains ⏹ End series… beside “+ Add occurrence” — pick the last meeting date and the series stops taking new occurrences from the day after, while every past occurrence and its AiDE outcome is kept.
  • An ended series shows an ⏹ Ends <date> chip to everyone who can see it, and a ▶ Continue series button to whoever can manage it, which clears the end date.
  • Same permission as managing series co-owners (series owner, 👑 co-owner or admin); adding an occurrence after the end date is refused with the reason, and the hourly series job skips an ended series instead of counting it as a failure.
  • The app moved in the same change, so there is no dependent implementation item. Pausing a series until a date and an Ended chip on the meeting list are tracked separately.
v580 ⏸️ Deactivate several projects at once 27 Sep 2026
Feature
  • admin/index.html + admin.js (#4162): a ☑ Select button on the Projects toolbar. Checkboxes on active rows only, a bar with the count, Select all N active and ⏸️ Deactivate N….
  • The confirmation names each project and flags any with live cycles — deactivating does not stop a running cycle — and records one optional reason in each project’s activation log. Black Sun PLC carries two live cycles in the demo data.
  • No dependent implementation item: the app side ships in the same change (#4162), including the same live-cycle warning on the single Deactivate dialog.
v579 🚦 Admin Projects: will each project’s cycles get through? 27 Sep 2026
Feature
  • admin/index.html + admin.js (#4160): a Chain column and a “Chain needs attention” filter. Red “Cycles will stop” for a step with nobody assigned, no PL/PM who can act, or no active Cluster Head; amber “Review skipped” for a step held only by a deactivated or not-yet-signed-in user, which the chain auto-approves past. Each flag lists its reasons. The banner no longer says every missing role stalls a cycle.
  • No dependent implementation item: the app side ships in the same change (#4160).
v578 ↩️ PL: reuse last cycle’s AiDE & Other Topics notes 27 Sep 2026
Feature
  • workflow/pl.html (#4152): while the AiDE-related points or Any other topics box is empty, a “↩ Use last cycle’s note (SEP-2026-W37)” link offers the PL’s own note from the previous cycle. One click fills the box; nothing is filled automatically, and the link disappears once the box has text.
  • No dependent implementation item: the app side ships in the same change (#4152).
v577 🎉 The focus timer marks the moment you reach your daily goal 27 Sep 2026
Feature
  • my-actions.html (#4099): when a finished pomodoro takes today’s count to the daily goal, the goal card announces “🎉 Daily focus goal reached — nice work.”, and its label reads ✓ Daily goal reached from then on.
  • It celebrates the crossing, not the level: opening the page after the goal was already met shows the reached label but no celebration, and changing the goal in Settings never triggers it.
  • No dependent implementation item: the app side ships in the same change (#4099). A push notification is not part of it.
v576 📋 PL: copy items from last cycle 27 Sep 2026
Feature
  • workflow/pl.html (#4157): an editable cycle the PL has not started offers “Copy items from last cycle” — a checklist of their OWN Ups and Downs from the previous cycle, all ticked, with Copy N items / Cancel. Nothing is copied until they choose; a teammate’s items are never offered.
  • No dependent implementation item: the app side ships in the same change (#4157).
v575 ⏳ The PM sees how long pending Project Leads have left 27 Sep 2026
Feature
  • workflow/pm.html (#4132): the Project Lead Submissions panel’s “N of M submitted” line now says how long is left — Closes in 2d 4h — or that the cycle is past its deadline, so the PM can tell two hours from two days when deciding whether to chase.
  • One countdown for the panel, not one per row: every Project Lead in a cycle shares the same deadline, the end of its last day in IST.
  • The app moved in the same change, so there is no dependent implementation item.
v574 📉 PL: last cycle’s Downs beside this cycle’s 27 Sep 2026
Feature
  • workflow/pl.html (#4181): the My Downs card shows the Downs raised in the project’s previous cycle, with that cycle’s id and state, and asks the PL to add any that still apply. Worded “raised last cycle”, never “still open” — nothing records a Down as resolved. Hidden when there are none, and on a locked cycle.
  • No dependent implementation item: the app side ships in the same change (#4181).
v573 📚 Screen reference catches up: Health, My Action Items, Telemetry, AiDE 27 Sep 2026
Fix
  • docs.html (#4091): new screen entries for Health (/health, with its Project / POD / My portfolio scopes — POD Health and Portfolio Health are those scopes, and their old routes redirect here), My Action Items (/my-actions, with the Focus timer and closing several at once), Admin — Telemetry and Admin — AiDE; the table of contents gains all four.
  • The P&A submission and review entries now describe auto-approval: the 36-hour rule, what it never does, and where each side sees the time.
  • The new cards carry a labelled “no screenshot yet” placeholder rather than a borrowed image of another screen.
  • No dependent implementation item: this documents what the app already ships.
v572 ❓ Help catches up with the app 27 Sep 2026
Fix
  • help.html (#4090), web → mockup: the ⬆ update arrow after the version number (Getting Started); If the Project Manager does not review within 36 hours — auto-approval, what it never does, and where its time is shown (P&A); the Focus timer steps, presets and keys (Meeting Notes AI, where My Action Items lives); One screen, three scopes — Project, POD and My portfolio (Project Health); and a Meetings register row whose title and calendar chip open the occurrence (Admin Portal).
  • POD Health and Portfolio Health are covered as scopes of the one Health screen — the app has no separate screen or Help topic for either, so the mockup does not invent one.
  • Corrected the Admin Portal warning that said a deactivated user’s MCP tokens are revoked. They are refused, not revoked, and would work again on reactivation (#4209).
  • No dependent implementation item: this brings the mockup up to the app, which already ships all of it.
v571 ✅ Approve several P&A submissions at once 27 Sep 2026
Feature
  • priorities/review.html (#4066): a ☑ Select button on the Pending Reviews card. Checkboxes appear on pending rows only — never a draft preview or a decided row — with a bar showing the count, Select all N pending and ✅ Approve selected (N)….
  • The confirm dialog names everyone selected, takes an optional comment applied to each, and says each approval is recorded as your bilateral commitment, exactly as from the submission page. It warns “You have not opened N of these” — whether that should block instead is an owner decision recorded on the implementation item.
  • Dependent implementation item: #4319 (New, impl-pending) — one approve call per submitter, so each keeps its own authorisation and audit row.
v570 ☑️ Mark several action items done at once 27 Sep 2026
Feature
  • my-actions.html (#4108): a ☑ Select button beside the view switcher (List and Table views). Selecting shows a checkbox on every open row and a bar with the count, Select all N open, and ✓ Mark N done….
  • The justification is still required and still written by a person: the prompt reads “Before marking these 3 action items done … The same note is recorded as confirmation on each of them.” One item selected keeps the single-item prompt. If some fail, the app says “Marked 2 of 3 done — 1 not closed because …” and leaves only those selected.
  • No dependent implementation item: the app side ships in the same change (#4108).
v569 ✅ Reports: action-item completion per project 27 Sep 2026
Feature
  • reports.html (#4179): the Meeting Notes AI table gains a Done column — closed action items over the project’s total, with the share (green from 75%). A project with no action items shows a dash rather than 0%.
  • No dependent implementation item: the app side ships in the same change (#4179).
v568 ⬆️ Sidebar foot shows the build version and a “new version ready” arrow 27 Sep 2026
Parity
  • assets/js/nav.js (#4056): the sidebar now ends with the build version in small monospace, as the app’s AppShell footer does, with an amber ⬆ beside it when a new version is waiting — tooltip “A new version is available — click to reload”. Hidden on the collapsed icon rail, as in the app.
  • The app shows the arrow when its service worker has a new build ready. The mockup has none, so it is a demo state: add ?update=1 to any page, or call PGNav.setUpdateAvailable(true).
  • No dependent implementation item: the app already ships this.
v567 📊 Team P&A matrix grouped by project and POD, banner counts project rows only 27 Sep 2026
Parity
  • priorities/review.html (#4057): the “Your Team’s P&A Status” matrix now mirrors PMPAReviewScreen — a header per project (📁) then per POD (🧩), each with its own “N of M not yet submitted” count, and every row naming its scope. The old “reports to” indenting is gone; the app has none.
  • A POD row for Kuntal Singha shows why the banner counts project rows only (#3987): it reads 2 of 4, where counting every row would say 3 of 5 and count one person twice. The “Matrix: all in” switcher now flips the group headers with the banner.
  • No dependent implementation item: this catches the mockup up with what the app already ships.
v566 ⏱️ Cycle detail: where the approval time went 27 Sep 2026
Feature
  • cycle-detail.html (#4172): the Approval Chain’s Cycle Time cells gain a small bar comparing each level’s time with the slowest level’s — the table already said when each level acted and how long it took; the bars show where the time went at a glance. A bottleneck (over 2 days) bar is amber.
  • No dependent implementation item: the app side ships in the same change (#4172).
v565 🤖 The reviewer sees when a waiting P&A will be auto-approved 27 Sep 2026
Feature
  • priorities/review.html (#4077): the reviewer’s side of v563 — while a submission is pending at the reviewer’s rung, a note under the feedback box reads “🤖 Auto-approved 29 Sep 2026, 08:00 unless you approve or return it first.” It is hidden once they act, on a higher (informational) rung, and when the submission would never be auto-approved.
  • No dependent implementation item: the app side ships in the same change (#4077).
v564 🔄 Profile: rotate a personal access token 27 Sep 2026
Feature
  • profile.html (#4198): each active token has a Rotate button beside Revoke. It asks first (the current secret stops working at once), then shows the new secret once in the same reveal, retitled “Token Rotated” with a note that the previous secret no longer works. The token keeps its name, scope, client and expiry; revoked and expired tokens cannot be rotated.
  • No dependent implementation item: the app side ships in the same change (#4198).
v563 🤖 A submitted P&A week says when it will be auto-approved 27 Sep 2026
Feature
  • priorities/pl.html (#4076): once a submission is pending at a PM rung, a note beside the locked Submit button reads “🤖 Auto-approved Tue 29 Sep, 08:00 if not reviewed” — a safety net, not a warning. The time is the auto-approver’s own rule (last submit + 36 h), so a resubmission restarts it, and a week whose first reviewer is a senior rung shows no note because it is never auto-approved.
  • No dependent implementation item: the app side ships in the same change (#4076).
v562 📅 Project Timeline can be narrowed to a date range 27 Sep 2026
Feature
  • timeline.html (#4081): From and To dates beside the search and type filter, so reviewing a quarter before an annual review no longer means pressing Load more until you reach it.
  • The range is inclusive and uses the day each event is shown under — for a backdated event, the day it happened rather than the day it was posted. Each date limits the other, and Clear filters resets them.
  • The app moved in the same change, so there is no dependent implementation item.
v561 📥 Audit export says when it was cut 27 Sep 2026
Feature
  • admin/index.html + admin.js (#4176): the Audit Log and Reports exports now warn when the file was cut — “This export holds the newest 5,000 of 12,400 matching entries. Narrow the date range and export again to get the rest.” The file still downloads; before, the 5,000-row cap dropped the rest silently.
  • No dependent implementation item: the app side ships in the same change (#4176).
v560 🔍 Help can be searched across every topic 27 Sep 2026
Feature
  • help.html (#4079): a search box at the top of the topic list searches the content of every topic, not just their names. While you type, the topic list gives way to the topics that match — most matches first, each with the passage highlighted — and a click opens the topic.
  • A word used only inside a topic, such as “bilateral” or a tool name, can now be found without opening topics one by one.
  • The app moved in the same change, so there is no dependent implementation item.
v559 📈 Admin Telemetry has a page behind its sidebar link 27 Sep 2026
Sync
  • admin/index.html (#4055): the sidebar has linked to #telemetry since the app shipped its Telemetry screen (#3561), but there was no section, so the link was a dead hash. A Telemetry section now mirrors AdminTelemetryScreen panel for panel — a time-window selector, Slowest operations ordered by p95, Errors with recent failures linking to their trace, Traffic volume by period and service, and Look up a trace — plus a demo toggle for the app’s “no telemetry has been recorded yet” state, which is what most deployments show while tracing is off.
  • admin.js: telemetry is added to ADMIN_SECTIONS — the deep-link allowlist whose own comment warns a section missing from it silently lands on People.
  • The app already has this screen, so there is no dependent implementation item.
v558 🧹 The index stops flagging four finished pages as gaps 27 Sep 2026
Sync
  • index.html (#4060): Meeting Notes AI, Health, System Status and the admin AiDE card still wore the dashed-amber gap treatment and a 🚧 tag for #2401, #2403, #2396 and #2411 — all four are Done. The ribbon, the class and the tag are removed; the explanatory comments now say the gap is closed.
  • dashboard.html (#4059): the “#1071 gap … impl-pending” note for the topbar theme button is corrected — the button ships (TopbarThemeButton).
  • Housekeeping only; nothing for the app to implement.
v557 ⚙️ Notifications links straight to your email preferences 27 Sep 2026
Feature
  • notifications.html (#4063): an Email preferences link beside the unread-only filter. The screen where you see your notifications is where you look for how to turn some off, and until now you had to know they lived on your profile.
  • profile.html: the Email Notifications card has an anchor, so the link lands on it rather than at the top of a long page.
  • The app moved in the same change, so there is no dependent implementation item.
v556 ⌛ Admin Users: invitation expiry countdown 27 Sep 2026
Feature
  • admin/admin.js (#4185): an invited user’s status shows how long their invitation has left — “Expires in 2 days”, bold amber under a day, and “⌛ Expired 3 days ago” in red once lapsed. It is worked out from the expiry time rather than the status, because a lapsed invite still reads pending until the lapse job runs. Resend resets it to the full window.
  • No dependent implementation item: the app side ships in the same change (#4185).
v555 🤖 P&A screens show the auto-approved state 27 Sep 2026
Sync
  • priorities/review.html (#4053): a 🤖 Auto-approved demo state, matching the app since #3994 — a grey alert saying no review was recorded within 36 hours of submission so the system approved it, the 🤖 Auto-approved header badge, and the same read-only treatment as Approved (no edit or add rows, no action bar).
  • priorities/pl.html: the Team Submission Status list shows the seventh chip state, 🤖 Auto Approved, in the neutral grey the app uses so it is never mistaken for a human approval.
  • The app already shows all of this (#3994, #4033, paStatusChip), so there is no dependent implementation item.
v554 🔁 Projects can be filtered by cycle type 27 Sep 2026
Feature
  • projects.html (#4082): a cycle type filter beside the POD filter — weekly, biweekly or monthly — so someone with a mix of cadences can look at just one.
  • It offers only the cadences among the projects you can see, and is hidden when they all share one, since a filter with a single choice filters nothing.
  • The app moved in the same change (ProjectsScreen.tsx), so there is no dependent implementation item.
v553 🚩 Timeline: flagged entries and a Flagged filter 27 Sep 2026
Feature
  • timeline.html (#4188): risk, blocker and escalation entries carry a 🚩 Flagged badge beside their type, and the type filter gains “Flagged (risk, blocker, escalation)”. Those are exactly the types Risk Radar reads as signals, so a PL can see what the Radar will pick up without running it.
  • No dependent implementation item: the app side ships in the same change (#4188).
v552 👤 Meeting action items: My items only 27 Sep 2026
Feature
  • meeting-notes-ai.html (#4165): on a meeting’s Actions tab your own items are tinted and tagged “You”, and a “My items only (n of m)” checkbox narrows the table to them. It appears only when it would hide something — with none of the items yours, or all of them, there is no toggle.
  • No dependent implementation item: the app side ships in the same change (#4165).
v551 ✏️ Email Templates lists the P&A auto-approval notices 27 Sep 2026
Sync
  • admin.js (#4036): ET-066 (to the submitter) and ET-067 (to each PM at the first review step who did not review it) were missing from the template list the mockup carries, and from its Priorities & Achievements category. Both are added from the seed and the app’s register, as #3935 generates the list.
  • The app moved in the same change (the register’s trigger/recipient lines and its P&A category), so there is no dependent implementation item.
v550 📝 Profile lists your saved meeting corrections 27 Sep 2026
Feature
  • profile.html (#4163): a Meeting Corrections card under My On-Time Record — every heard → correct pair saved with “remember these names”, each with Edit (inline, Save / Cancel) and Delete (asks first). Deleting stops future corrections only; minutes already written are unchanged.
  • No dependent implementation item: the app side ships in the same change (#4163).
v549 🍅 Focus timer settings follow your account 27 Sep 2026
Fix
  • my-actions.html (#4103): the focus-timer settings note said settings “live in this browser”. They are now saved to the account, so the note says they follow you to any device you sign in from.
  • Wording only — no control or layout changes.
  • No dependent implementation item: the app side ships in the same change (#4103).
v548 🔎 Command Palette hands older cycles to Cycle History 27 Sep 2026
Feature
  • assets/js/command-palette.js (#4065): the palette only knows your recent cycles, so an older one never matched. Once you type, a last row — Search older cycles for “…” in Cycle History — takes the query there. It is offered only to people whose palette already lists Cycle History.
  • cycle-history.html: a ?q= in the address pre-fills the cycle search, applied after any saved default view so the typed query wins.
  • “Older”, not “all”: Cycle History searches one project at a time. Searching across every project would need a new search on the server, which is not part of this change.
  • Dependent implementation item: #4315 (New, unassigned) — CommandPalette.tsx and CycleHistoryScreen.tsx, which today drops extra address parameters when it picks a project.
v547 🔌 The MCP server now exposes 83 tools 27 Sep 2026
Fix
  • docs.html, help.html, index.html, mcp-guide.html, profile.html, PAGES.md (#4314): every statement of the MCP server’s tool count now reads 83, following the new get_my_work tool (#4105) — everything waiting on the caller in one call.
  • Counts only: no screen, control or behaviour changes. The app itself never hard-codes the number (it reads MCP_TOOL_COUNT, pinned to the server by a test), so these pages were the only surface left saying 82.
  • No dependent implementation item: the app side already shipped with #4105.
v546 ⬇️ P&A History exports the selected week as CSV 27 Sep 2026
Feature
  • priorities/history.html (#4067): an Export CSV button beside Export PDF. It downloads the selected week as a spreadsheet with one row per priority or achievement — week, member, status, submitted, type, category, project, AiDE and the item itself.
  • A member with nothing entered still gets a row, so a pending person is never silently missing from the file. The file is built from the week already on screen, so it needs no new API; the button waits for that week to load.
  • Deliberately left out: a reviewer column (the week’s data does not carry one) and an all-weeks export, which the org-wide Priorities & Achievements Weekly report already covers.
  • Dependent implementation item: #4313 (New, unassigned) — HistoricalPAScreen.tsx.
v545 🔗 Dashboard Quick Links lead with My Work and Notifications 27 Sep 2026
Feature
  • dashboard.html (#4064): the Quick Links card offered Cycle History, Project Timeline, My Profile and Reports, but not the two screens people open most days. My Work and Notifications now lead the card, with the sidebar’s own icons and labels.
  • My Work is shown to the same people who see it in the sidebar (the Meeting Notes AI audience), so the dashboard never offers a shortcut the sidebar withholds. Notifications has no role gate.
  • Dependent implementation item: #4312 (New, unassigned) — DashboardScreen.tsx.
v544 📝 Mockup docs stop describing reporting lines 25 Sep 2026
Sync
  • docs.html, PAGES.md (#3983): the residual #3980 recorded. The P&A review page, the Team Status sidebar, the History Team tab, the workflow-screen intro and the Sales SPOC screen were described in terms of “direct reports” and “managers”. Since #2437 the people you review come from Project Mapping — the project or POD each item is tagged to — so they now say so. The Scheduler table’s pa_kickoff_all row is renamed to the app’s label, the end-of-week ET-040 reminder.
  • dashboard.html: the review-queue tooltip body says “the people whose P&A you review”.
  • admin.js: the dormant ET-009 entry matches the app’s register (a not-currently-sent 48h escalation, to the reviewer) instead of “direct manager”.
  • Documentation and mockup text only — the app already said these things (#3980, #3981, #3971), so there is no dependent implementation item.
v543 ✏️ P&A screens stop talking about direct reports 25 Sep 2026
Sync
  • priorities/pl.html, priorities/review.html (#3980): the Team Submission Status subtitle said “Your direct reports” and the review banner “submitted by your direct report”. Since #2437 there are no reporting lines — the people you review come from Project Mapping — so they now read “People whose P&A you review” and “submitted by your team member”.
  • admin.js: ET-039 was triggered by a “direct report” and sent to the “direct manager”; it now names the first review step of the submitter’s project or POD chain, or whoever returned it.
  • The app moved in the same change, so there is no dependent implementation item. docs.html and PAGES.md still describe the old reviewer model in prose; left for a separate pass.
v542 ✏️ The unmapped P&A panel lists only people who are asked to submit 25 Sep 2026
Sync
  • admin.js (#3979): the Admin → Users panel of active P&A submitters on no project or POD promises that mapping them brings them back into every kickoff and reminder. That is false for a POD Owner or Cluster Head, who are never reminded whether mapped or not (#3947, #3959), so the panel now counts only people with a submitting role and neither of those. The fixture’s visible panel is unchanged.
  • The app moved in the same change (the API report behind the panel), so there is no dependent implementation item.
v541 ✏️ The AiDE lending switch says who can actually borrow your access 25 Sep 2026
Sync
  • profile.html (#3977): “Let my AiDE access cover my direct reports” is now “Let people I share a project with borrow my AiDE access”, and the note names both directions: the members of projects you head, and the senior people on projects you belong to (#2437, #3092).
  • The app moved in the same change (My Profile and Help), so there is no dependent implementation item.
v540 ✏️ Email Templates stops promising an on-time record on the U&D escalation 25 Sep 2026
Sync
  • admin.js (#3976): ET-003 said it went to the current stage owner and carried each lead’s on-time record when the cycle was waiting on its leads. Since #3969 it never chases the leads (that is ET-065’s job), so it now names the reviewer the cycle is waiting on and the “Also added by the system” line is gone.
  • PAGES.md: the preview-panel note no longer lists ET-003 among the emails that carry an on-time record.
  • The app moved in the same change (the Email Templates register), so there is no dependent implementation item.
v539 ✏️ Email Templates says who the P&A kickoff and reminders really go to 25 Sep 2026
Sync
  • admin.js (#3971): the ET-007, ET-008 and ET-040 recipient lines said “all active users” or “direct reports”. They now say everyone on a project or POD who is asked to submit P&A, leaving out POD Owners and Cluster Heads (#2437, #3947, #3959).
  • The app moved in the same change (Email Templates register and the Scheduler job label), so there is no dependent implementation item.
v538 ✏️ PMO and System Admin can edit every project from the Projects screen 25 Sep 2026
Sync
  • projects.html (#3961): owner decision 2026-09-25 — System Admin and PMO Associate see the Edit button on every project they can see, matching what the API already allowed. The mockup had depicted them with no button, pending that decision. A Cluster Head still gets none; a PL or PM still needs to be the project’s own.
  • The app moved in the same change, so there is no dependent implementation item.
v537 🔕 The P&A kickoff and Friday reminder go only to people asked to submit 25 Sep 2026
Sync
  • docs.html (#3959): owner decision 2026-09-25 — the Monday ET-007 kickoff and the Friday ET-040 reminder go only to people asked to submit P&A. POD Owners, Cluster Heads and admin/PMO users with no submitting role are no longer emailed.
  • The stale pa_kickoff_all row (manual-only ET-007 to the reporting-relationship table) now describes the real Friday ET-040 job.
  • The app moved in the same change, so there is no dependent implementation item.
v536 🔕 The inactivity chase no longer emails Project Leads 25 Sep 2026
Sync
  • docs.html (#3969): owner decision 2026-09-25 — ET-003 chases only the review steps (PM and above). A cycle waiting on its leads is left to the daily ET-065 due reminder, which continues past the due date and copies the PM once overdue.
  • The app moved in the same change, so there is no dependent implementation item.
v535 🎯 My Work’s own-P&A row is real, with its due pill 24 Sep 2026
Sync
  • my-work.html (#3944): the Priorities & Achievements row under Your submissions due was drawn here long before the app had it; the app now shows it (your own current-week P&A while owed — a draft counts, a returned week sits under Returned to you). Its flat “Due” pill becomes the canonical due pill, as the U&D rows did in v530.
  • The app moved in the same change, so there is no dependent implementation item.
v534 📧 Email Templates lists every template the app sends 24 Sep 2026
Sync
  • admin/admin.js: the register stopped at ET-032 while the app seeds 57 templates. The 30 missing ones (ET-033 to ET-065, including the daily U&D reminder) are added — generated from the seed’s templates and the web’s template register, not hand-typed.
  • ET-019/020/021 stay listed but are now archived, as a migration left them in the app (#1239 — nothing ever sent them).
  • Categories mirror the app exactly, and an unlisted code is Other. The mockup used to default every unknown code to Invitations & Access, so its Other tab could never show anything.
  • PAGES.md: the section no longer describes 18 editable templates, an Edit modal #2047 removed, or a hand-typed code table that still called ET-008 a Monday 11:00 nudge.
  • No dependent implementation item: the app already has all of this (#3935).
v533 ➕ Email Templates says what the system adds after a template 24 Sep 2026
Sync
  • admin/index.html + admin.js: the template detail header gains an “Also added by the system” line, shown only when the sent email carries content the template does not: the recipient’s on-time record on ET-007, ET-008 and ET-003 (when waiting on leads). The preview cannot show that block, so without the line an administrator reads less than recipients get.
  • Not included: ET-065 (the daily U&D reminder) is absent from this mockup’s template list altogether — a parity gap from #3888, not added here.
  • No dependent implementation item: the app moved in the same commit (#3933).
v532 📝 Solution Overview’s scheduler table matches the real jobs 24 Sep 2026
Sync
  • docs.html: the “All 9 Registered Scheduler Jobs” table named functions that exist nowhere and described behaviour the product no longer has — ET-008 as a Monday 11:00 UTC nudge to leads, the Cluster Head digest as ET-014 on Friday, ET-012 as a Friday escalation per reporting relationship, invitation reminders as ET-006 daily. Rows are rebuilt from the scheduler registry (job keys, times, templates, audiences), the missing Friday ET-040 reminder is added, and the heading is narrowed to the core jobs with a pointer to Admin → Scheduler for the full list.
  • No dependent implementation item: documentation of existing behaviour (#3918).
v531 📝 The P&A deadline and approval chain are described as they now work 24 Sep 2026
Sync
  • dashboard.html: the P&A card said it “refreshes every Monday at 12:00” — the old noon deadline. It now says the week is due by the end of Monday in your timezone.
  • help.html: the Approval chain section described the removed reporting graph (“your direct manager is always the first reviewer”). It now says the chain follows the project or POD each item is tagged to, and states the Monday end-of-day deadline and the Monday-to-Friday reminders.
  • No dependent implementation item: the app moved in the same commit (#3914).
v530 📅 My Work shows when each Ups & Downs submission is due 24 Sep 2026
Sync
  • my-work.html (#3899): each Ups & Downs row in Your submissions due carries the canonical due pill (Due in N days / Due today / Overdue by N days) from the cycle’s end date, replacing the flat “Due”. A second row shows next week’s cycle, which is open too since cycles are created two weeks ahead (#3887); rows are soonest-due first.
  • The stale “submission closes Friday 18:00” sub-text now matches the app’s copy.
  • The app moved in the same commit, so there is no dependent implementation item.
v529 🔓 Ups & Downs can be submitted as soon as the cycle is created 24 Sep 2026
Sync
  • Owner decision 2026-09-24 (#3895): cycles are created 14 days before their end date (#3887), so a weekly cycle is announced a week before its period — submission now opens at that point, instead of one day before the period.
  • workflow/pl.html: the Next-cycle banner and the locked Submit title say so; docs.html describes the new window. A cycle that was only pre-planned (not yet announced) keeps the old one-day-before window.
  • The app moved in the same commit, so there is no dependent implementation item.
v528 🗓️ Scheduler: review-cycle schedules run daily; the rule decides creation 24 Sep 2026
Sync
  • Owner directive 2026-09-24 (PBI #3884, slice #3890): a U&D cycle is created 14 days before its end date and is due on it; a schedule keeps its on/off switch and time of day, and now runs every day at that time.
  • Admin → Scheduler → Review Cycles gains a note saying so; each row reads Daily @ time; the form’s preview states the rule instead of “Deadline: every Monday”. The day settings stay in the form and are stored as before — they simply no longer decide anything.
  • The app moved in the same commit, so there is no dependent implementation item.
v527 📆 Cycle history shows each cycle’s start and end dates 24 Sep 2026
Sync
  • Owner directive 2026-09-24 (PBI #3884, slice #3889): the single Period column becomes Start date and End date, “for easy reference”. A monthly cycle used to read only “Mar 2026”; it now shows 1 Mar 2026 and 31 Mar 2026. The end date is also the due date (#3885).
  • Both are Customise-view columns and both reach the CSV export; the row drawer reads start – end · frequency.
  • The app moved in the same commit, so there is no dependent implementation item.
v526 🔔 A daily Ups & Downs reminder from a week before the end date, until submitted 24 Sep 2026
Sync
  • Owner directive 2026-09-24 (PBI #3884, slice #3888): each PL yet to submit gets one email a day from 7 days before the cycle’s end date, continuing after it until they submit; the project PMs are CC’d once the end date has passed.
  • Admin → Reminders gains R-016 U&D Due-Date Reminder (ET-065); R-001 PL Submission Reminder (24h before) is marked inactive — the new rule supersedes it. Upcoming runs lists the daily ET-065 job at 09:10 IST.
  • The app moved in the same commit, so there is no dependent implementation item.
v525 📅 An Ups & Downs cycle is due on its end date 24 Sep 2026
Sync
  • Owner directive 2026-09-24 (PBI #3884, slice #3885): a cycle is due on the end date of its period, at the end of that day (IST), instead of the Friday after the kickoff at 17:00 IST.
  • Copy only here: the email-template preview's sample {{deadline}} now reads the sample cycle's end date (8–14 Jun → Sun 14 Jun 2026, 11:59 PM IST). The app moved in the same commit, so there is no dependent implementation item.
  • Renumbered from v524 during a rebase — #3878 took that number concurrently.
v524 ⏱️ Profile shows My On-Time Record 24 Sep 2026
Sync
  • profile.html: a My On-Time Record card under Timezone — the signed-in person’s lifetime share of P&A weeks and Ups & Downs cycles submitted on time, its movement since the last period (and what caused it), and on-time / late / missed counts. Colour bands match the reminder email: 90%+ green, 70%+ amber, below that red.
  • No dependent implementation item: the app shipped it first (#3876); this is parity (#3878).
v523 ⏰ P&A is due Monday end of day; reminders now run Monday to Friday 24 Sep 2026
Sync
  • Owner decision: the P&A deadline is the end of Monday in each submitter’s own timezone, and the submission reminder keeps going Tuesday to Friday for anyone still outstanding.
  • Copy updated to match: the ET-008 register entry (trigger and body), the R-006 reminder row, the scheduler job label and run-log sample in admin/admin.js; the timezone hint in the Admin user form and on the Profile page. All said Mon–Wed.
  • No dependent implementation item: the app moved first, in the same commit (#3879).
v522 🔥 The last Reporting Relationships links and copy are gone 24 Sep 2026
Sync
  • The dashboard’s admin Quick Link to Reporting Relationships is removed, with the script that hid it from non-admins. It pointed at a screen the product deleted along with the reporting graph.
  • Also removed: the command-palette entry and keyword, the Help table row, the docs page’s Admin — Reporting Relationships card and its nav link, and the PAGES.md section. The Admin Portal card and the Org Hierarchy empty state no longer mention reporting relationships.
  • No dependent implementation item: the app moved first, in the same commit (#3874).
v521 📭 A seat on an INACTIVE project no longer counts as being mapped for P&A 24 Sep 2026
Sync
  • Copy only, following the app. The amber Admin Users panel now reads “N active P&A submitter(s) is/are on no active project or POD”, and its remedy says to add them to an active project or POD. The detail table’s label matches.
  • Why the word changed: the P&A audience (Monday kickoff, submission reminder, digest roster) used to count a seat on an inactive project, so somebody whose only project had closed was still chased for submissions. It now counts active projects and PODs only, which means that person appears in this panel — and “on no project” would have been untrue of them.
  • No dependent implementation item: the app moved first, in the same commit.
v520 📁 A self-raised task can say which project or POD it is for 23 Sep 2026
Sync Feature
  • The modal offered no scope at all. ➕ New action item took a task, an assignee, a due date and a reminders switch — and nothing to say which account the work was for. It now carries an optional Project or POD picker, in BOTH copies of that modal (my-actions and my-work), because the app shares one component between the two screens and a control added to one copy only is drift by construction.
  • The payoff is two controls that already existed starting to tell the truth. Group-by and the project filter both read the tag off the MEETING an item came from, and a self-raised item has no meeting — so every one of them sat under “No project” however plainly it belonged to an account. Both now read the item’s own tag, through one shared scopeLabel: they each had their own copy of “which account is this”, and would have disagreed the moment a task could carry one.
  • ONE select for two mutually exclusive things. A project and a POD cannot both be set — the API refuses it — and a single select value cannot represent the both-set state, so the illegal combination is unrepresentable here rather than merely validated.
  • ⚠ The blank is a VALID choice, not a disabled placeholder, and that is the deliberate difference from the P&A scope picker, whose scope is MANDATORY (v417/#2687). A P&A item asserts where somebody’s week went, so an untagged one is a gap in a record; a personal task is frequently about nothing but itself — “book the team offsite” belongs to no account — so requiring a scope would force a wrong answer rather than collect a missing one. A third seeded item is left untagged to show exactly that.
  • A POD-tagged task gets its OWN group rather than being filed with the untagged: it HAS a scope, and reporting it as unscoped is a worse answer than none. The filter’s options carry the 📁/🧩 icon for the same reason a project and a POD may share a name.
  • Fixed in passing: a newly raised task was hard-coded to project:'common', which filed every one of them under a group literally named “common”. It now carries whatever was picked.
  • ⚠ No dependent implementation item, and the reason is recorded rather than assumed. Same call as v516–v519: the web moved FIRST (#3848, already merged), so this mockup is catching UP and there is nothing for a future agent to build.
💄 mockup(my-actions,my-work): v520 — optional project-or-POD tag on a self-raised task #3850
v519 ↻ Regenerate is offered on the Action Items tab too, from ONE shared definition 22 Sep 2026
Sync Feature
  • The control existed; it was in the wrong place to be found. ↻ Regenerate lived only in the Summary tab, beside Corrections. Someone looking at an empty action-items table had nothing in view and reasonably reported there was no way to reprocess — which is the report that produced v517, v518 and the API change behind them. It now sits on BOTH tabs.
  • ⚠ ONE definition, mounted twice — not a second hand-typed copy. The control is a triplet: the enabled/disabled rule, the lock reason, and a long hint naming exactly what is rebuilt and what is preserved. Copying that into a second tab is the drift this repo keeps paying for — the admin sidebar was found existing as THREE hand-typed copies, one email body as SIX. regenerateBtnHtml(m, testid) here mirrors RegenerateControl in the app; the testid is a parameter so each mount is addressable and the Summary one keeps the id it already had.
  • The hint is new, and it is the only line that says action items are rewritten. Regenerate now rebuilds the minutes, decisions, mindmap AND the action items nobody has curated — edited, re-assigned, completed or focus-tracked items are kept. A control that silently began rewriting action items would be worse than one that never did, so it says so on hover in both places.
  • Gating is reused, never re-derived. The new mount asks canEditAide(m), the same predicate the Summary block already used, so the two mounts cannot disagree about whether regenerating is allowed.
  • ⚠ No dependent implementation item, and the reason is recorded rather than assumed. Same call as v516, v517 and v518: the web moved FIRST, in the same commit, so there is nothing for a future agent to build.
💄 mockup(meetings): v519 — Regenerate on the Action Items tab, one shared definition #3842
v518 Meeting Notes AI: the Action Items tab carries a closed/total pill, so you can see the state without opening it 22 Sep 2026
Sync Feature
  • The outcome tab bar now answers “how many, and how many are closed” at a glance. The Logs tab has carried a run-count pill since #1043; the Action Items tab carried nothing, so the only way to learn there were three of seven left was to open the tab and count rows. It now reads ✅ Action Items 3/7 in the same phase-pill style, rather than a second badge style invented beside it.
  • ⚠ It renders at 0/0 on purpose, where the Logs pill HIDES at zero. The two are not inconsistent — they answer different questions. Zero completed runs is an uninteresting default, but this bar exists only in the READY view, so 0/0 can only mean “AiDE ran and found none”, never “nothing has happened yet”. A hidden pill would be silent on exactly the case that prompted this.
  • That case was a real support question, and it cost a database probe to answer. A user asked why a standup was generating no action items. The transcript was a perfectly normal 2,407 words, the run succeeded in 15.7s and drafted 5 summary sections and a 24-node mindmap — AiDE had simply found no task with an owner, which is what a status-update standup contains. Nothing was broken, and nothing on the screen said so.
  • It pairs with v517 directly below, which is the other half of the same answer. That entry hides the empty TABLE and says AiDE found none; this one puts the count on the TAB, so you never have to open it. They were built by two sessions at once against #3838 and #3839 — hence the v517/v518 split rather than one entry.
  • ⚠ No dependent implementation item, and the reason is recorded rather than assumed. Same as v516 and v517: that mandate exists so a mockup change gets built in the web. Here the web moved FIRST, in the same commit, so there is nothing for a future agent to pick up.
💄 mockup(meetings): v518 — closed/total pill on the Action Items tab #3839
v517 Meeting Action Items: an empty list now says AiDE found none, instead of a bare header row 22 Sep 2026
Sync Fix
  • A correct extraction that found nothing looked identical to one that failed, and that reached a real user. Someone asked why action items “were not being generated” for a meeting whose pipeline had worked perfectly — 2407 transcript words, one AiDE run with outcome success, and an activity line already reading “0 action items found”. The tab rendered the column header row — Done, Action item, Assignee, Due date, Status, Next reminder — with nothing beneath it, directly under the 🤖 Extracted by AiDE badge. It took a database probe to establish that nothing was broken.
  • The table is now HIDDEN when the list is empty, not given a placeholder row. A header for zero rows is itself the misleading part. #1158 settled this same shape on the MCP tokens screen, so this follows it rather than inventing a treatment. The add-item form below is untouched, so an owner can still add one by hand.
  • ⚠ ONE message, deliberately — and a comment in the source says not to add the obvious variants. The tempting shape is three arms: found none, processing failed, not processed yet. Two of those are UNREACHABLE. In the app this tab renders only inside ReadyView, gated on status === 'ready' && aideSummary, and a non-ready meeting gets a different tab strip with no actions tab at all. All three arms were written while fixing the web side and two had to be deleted — they would have been #3822's defect, a UI rendering a state its own data can never return.
  • The shared .empty-state family was missing its HINT rule. design-system.css had .empty-state, -icon and -title but not -hint, while the app's custom.css has had one all along and admin.css carries its own copy — which is why admin pages looked right and nothing had noticed. Added with values mirroring the app exactly.
  • ⚠ No dependent implementation item, and the reason is recorded rather than assumed. That mandate exists so a mockup change gets built in the web. Here the web moved FIRST (#3838, shipped as 48eef0573) — this is the mockup catching up to shipped behaviour, so there is nothing for a future agent to implement.
💄 mockup(meetings): v517 — empty action-items state, web→mockup parity #3840
v516 Login: the privileged-tile padlock and dev passphrase prompt are removed, because the gate they mirrored is gone 21 Sep 2026
Sync Chore
  • The design reference was showing a security control the app no longer has. #1825 added this parity for #1783 — an admin-holding tile carried a 🔒 badge and opened a passphrase prompt instead of signing in. #3656 then removed DEV_TOKEN_SECRET, the privileged gate and the components that rendered them. PAGES.md makes the APP the authority, so the mockup is the side that moves.
  • Every tile now signs straight in, including Administrator. The privileged flag, the lock badge, the amber prompt block and the three helpers (showPrivilegedPrompt, cancelPrivilegedPrompt, submitPrivilegedPassphrase) are gone, along with the sessionStorage stash that mirrored devTokenSecret.ts — a module that no longer exists.
  • ⚠ This was the FOURTH surviving trace of one removal, and each was invisible to the last sweep. #3656 reported “zero remaining references”, which was true of the removed SYMBOL. #3691 found five architecture chapters still calling the gate enforcing, #3692 the tutorials and local-stack docs, #3694 forty lines of orphaned CSS, and this page the whole interaction. A symbol grep cannot see a CSS class, a narration script or a mockup that only ever described the thing.
  • The #1825 azref badge went with it. It read “mockup-pending — privileged tile padlock + passphrase prompt”; with the gate removed the marker is neither pending nor implemented, so it is no longer a link anyone should follow.
  • ⚠ No dependent implementation item, and the reason is recorded rather than assumed. That mandate exists so a mockup change gets built in the web. Here the web moved FIRST — this is the mockup catching up to shipped behaviour, so there is nothing for a future agent to implement.
  • Past history entries and whats-new.skip.json were left alone, deliberately. Both are records of what WAS, like the decision log; #3656 says explicitly that the skip file is the historical record of why #1783 was never announced.
💄 mockup(login): v516 — remove the padlock and dev passphrase prompt #3698
v515 People & Organisation hub: the fifth tab, Seat Coverage, catches up with the app 21 Sep 2026
Sync Feature
  • The app grew a fifth People-hub tab and the mockup still showed four. #3464 added 🪑 Seat Coverage to AdminPeopleHubScreen after Hierarchy; this file rendered exactly four tab buttons and four panels. PAGES.md makes the APP the authority, so the mockup is the side that moves.
  • Which senior seats are unfilled, per active project, worst-staffed first. Five seats — Delivery SPOC, Sales SPOC, Sales SPOC (Co), POD Owner, Cluster Head — with a summary line counting the projects that have at least one gap, mirroring the screen's own wording. PMO uses it to find staffing gaps without database access.
  • The only people panel that owns its markup. The other four are empty here and are filled at load by initPeopleHub(), which RELOCATES a pre-existing #section-* into them. Seat Coverage has no legacy section to move, so it carries its own table and renderSeatCoverage() fills the tbody — the shape every other mockup table already uses.
  • Cluster Head is read from the project's POD, not the project. In the app it is a column ON Project; this mockup's seed puts it on the POD row and the project carries only a POD name. Resolving it through the POD keeps the RENDERED table faithful, which is what a mockup is for, rather than inventing a project field the seed does not have.
  • ⚠ No guard could have caught this drift, which is why it needed its own item. check-mockup-nav-parity (#3434) compares the admin SIDEBAR — ADMIN_GROUPS against the two mockup nav copies — and #3464 deliberately added a hub TAB rather than a sidebar entry to stay out of its way. The hub's tab list is a different surface, covered only by manual parity (#3427).
  • The header comment's spelled-out count rotted a second time, in the opposite direction. #3431 corrected it from FIVE to FOUR after #2437 deleted Reporting Lines, writing that “a number in prose rots, and this one had”. It then advertised four for eleven iterations after the app reached five. Counting the buttons is the check; the sentence is not.
  • ⚠ PAGES.md was stale in BOTH directions, and that was found rather than reported. It still listed a 🔗 Reporting Lines tab and a #reporting legacy hash — #3431 removed those from admin/index.html and from PEOPLE_TAB_FOR and never propagated the fix to the document that describes them — while also missing Seat Coverage. So the mockup's own documentation advertised a deleted surface and omitted a shipped one at the same time. Corrected here, with the count no longer spelled out at all.
💄 mockup(admin): v515 — People hub gains the Seat Coverage tab #3625
v514 Help, Docs, MCP Guide, Profile and Solution Overview: tool count updated from 78 to 82 20 Sep 2026
MCP
  • The MCP server gained four telemetry report tools (#3562), taking the total to 82. Breakdown: cycles 18 + P&A 11 + reports 8 + admin 13 + meetings 20 + timeline 5 + notifications 2 + governance-digest 1 + telemetry-reports 4. They are the only tools gated on a ROLE — PMO Associate or System Administrator, on held roles — because telemetry carries URLs, user ids and SQL from real requests.
  • Two sites in mcp-guide.html were found still reading “Available Tools (66)”, missed by v512. That iteration grepped for the shape NN tools and these use Tools (NN), so they sat two bumps behind. The repo's own prescribed command covers both shapes; v512 used a narrower one of its own. A reminder that the population must be DERIVED with the documented grep, not with whichever pattern happens to be to hand.
  • Renumbered from v513 during a rebase — #3561 took that number concurrently. Both entries are kept: this one and the admin-sidebar entry below are independent changes that happened to land minutes apart on the repo's highest-contention file.
💄 mockup(mcp): v514 — tool count 78 → 82, and two sites v512 missed #3562
v513 Admin sidebar gains Telemetry, under Reporting 20 Sep 2026
Admin
  • Parity catch-up, app → mockup. The app gained an admin Telemetry screen (#3561) showing the four reports #3556 landed — slowest operations, error rate, traffic volume and a single-trace timeline. PAGES.md makes the app the authority, so both mockup copies of the sidebar follow it rather than the other way round.
  • Filed under Reporting, not System, and that was forced rather than chosen. nav.js renders the System group ONLY for admin, because its sole item (Settings) is admin-only. Telemetry is visible to PMO as well, so an entry there would have been visible in the app and invisible in the mockup — which the #3434 nav-parity guard refuses, correctly. Reporting carries no such gate, and a telemetry report sits naturally beside Reports & Exports and the Audit Log.
💄 mockup(admin): v513 — Telemetry in the admin sidebar, mirroring the app #3561
v512 Help, Docs, MCP Guide, Profile and Solution Overview: tool count updated from 66 to 78 20 Sep 2026
MCP
  • The five pages that quoted “66 tools” now say 78, and PAGES.md moves from 64. The breakdown is cycles 18 + P&A 11 + reports 8 + admin 13 + meetings 20 + timeline 5 + notifications 2 + governance-digest 1. Two whole domains are new since v511 — notifications (get_notifications, mark_notification_read) and the focus tools that joined meetings.
  • The mockup was the LAST surface still stale. The server pins 78 in validate/spec.ts; the web reads it from one place (utils/mcpCatalog.ts, bound to the server by a test since #2415); the docs are bound by docsToolCatalogContract, and #3550 has just corrected the 08-mcp-server architecture chapter. Only mockup/** is deliberately outside that guard, because a mockup edit carries this version entry and an index bump — so it is reconciled by hand, which is what this iteration is.
💄 mockup(mcp): v512 — tool count 66 → 78 on help, docs, mcp-guide, profile, index #3552
v511 Help, Docs, MCP Guide, Profile and Solution Overview: tool count updated from 64 to 66 19 Sep 2026
MCP
  • Five pages that quoted “64 tools” have been updated to 66. The MCP server gained get_focus_stats and list_task_focus_sessions in #3424, bringing the total to 66 (cycles 14 + P&A 9 + reports 6 + admin 13 + meetings 18 + timeline 5 + governance-digest 1).
💄 mockup(mcp): v511 — tool count 64 → 66 on help, docs, mcp-guide, profile, index #3462
v510 — Done Workflow pages: cycle ids updated to complete the format sweep 19 Sep 2026
Cycles
  • The six workflow sub-pages (pl, pm, pmo, pod, spoc, cluster-head) complete the cycle-id format sweep. All carried JUN-2026-W25 or JUN-2026-W26; replaced with W25-2026-W25 and W26-2026-W26. No old-format cycle ids remain in any mockup page (history.html entries are left as written, recording the id that was correct at the time).
💄 mockup(cycles): v510 — cycle ids in current format on workflow pages #3461
v509 — Done My Work, Notifications, Profile, Projects and Timeline pages: cycle ids updated 19 Sep 2026
Cycles
  • The remaining five pages that still carried the old cycle-id format are now fixed. All occurrences of JUN-2026-W25, JUN-2026-W26, JUN-2026-W24 and JUN-2026-M1 are replaced with their canonical equivalents. This closes the set the v504 history entry (#3432) identified as outstanding.
💄 mockup(cycles): v509 — cycle ids in current format on my-work, notifications, profile, projects, timeline #3460
v508 — Done Dashboard, Reports and Priorities pages: cycle ids updated to the current format 19 Sep 2026
Cycles
  • Six pages were still using the old month-abbreviation cycle id format (e.g. MAY-2026-W2). The v504 entry (#3432) fixed cycle-detail.html and cycle-history.html and noted these as the remaining eight. This entry closes the dashboard, reports, and priorities sub-pages. The correct format — W20-2026-W20 for weekly and M01-2026-W2 for monthly — is the one the database actually stores.
💄 mockup(cycles): v508 — cycle ids in current format on dashboard, reports, priorities #3460
v507 — Done Health mockup week picker and period badge now lead with the ISO week code 19 Sep 2026
Health
  • The week options in the week picker and the period badge on the summary card now say W30 2026 · 21–27 Jul instead of JUL-2026 · W30 (21–27 Jul). The app's picker has led with the ISO week code since #3426 so that a reader can match an option to the period column of the Past Runs table without mentally converting a date range.
💄 mockup(health): v507 — week picker and period badge in ISO-week-code format #3459
v506 — Done Mindmap download filename now leads with the project name and the meeting date 19 Sep 2026
Meetings
  • The PNG and SVG download buttons on the mindmap card now name the file the way the app does. The filename was just -mindmap</code>; it is now <code><project>-YYYYMMDD-HHMM-mindmap-<title></code> — project name first, then date and time, then the meeting title. For a common meeting with no project link the prefix is <em>meeting</em>. Mirrors <code>MeetingDetailScreen.tsx</code> (#3437).</li> </ul></div> <div class="tl-commit">📝 mockup(mna): v506 — mindmap download filename with project + date #3458</div> </div> </div> <!-- v505 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v505 — Done</span> <span class="tl-title">Admin Users table shows when each account last signed in</span> <span class="tl-date">19 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">Admin</span> </div> <div class="tl-desc"><ul> <li><strong>A new column in the Users & Roles table shows the last sign-in date and how long ago that was.</strong> Each row now carries a date (e.g. 18 Sep 26) and a relative age string (e.g. 1 day ago). Accounts that have never signed in — typically invited users who have not yet activated — show <em>Never</em>. Mirrors <code>AdminUsersScreen.tsx</code> (#3446).</li> </ul></div> <div class="tl-commit">📝 mockup(admin): v505 — Users table: last sign-in column #3457</div> </div> </div> <!-- v504 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v504 — Done</span> <span class="tl-title">Cycle ids on the detail and history pages use the format the app actually writes</span> <span class="tl-date">17 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-cycle">Cycles</span> </div> <div class="tl-desc"><ul> <li><strong>Both pages printed a cycle id the app abandoned twice.</strong> Every id read <code>MAY-2026-W2</code> — a month abbreviation with a week-of-month counter. #2154 replaced the month abbreviation with a zero-padded sequence token, and the trailing part has always been the ISO week. A reader designing against these pages was reading a format no row in the database has carried for weeks.</li> <li><strong>35 ids were rewritten across the two pages, not the six the report counted.</strong> The visible ones are only part of it: the id also sits in the page title, the breadcrumb, both archived-view notices, the account-update card, the demo data block, the default-cycle constant and the prev/next sequence array that drives the pager.</li> <li><strong>Each id keeps its own cadence and period.</strong> A weekly cycle for 12–18 May 2026 becomes <code>W20-2026-W20</code>, the ISO week that actually covers it; the three monthly rows become <code>M03-2026-W10</code>, <code>M02-2026-W6</code> and <code>M01-2026-W2</code>. They were not renumbered to a single example, because the history table’s periods and frequencies are shown beside them and would then disagree.</li> <li><strong>The month NAME that #3342 adds is a screen-level transform, and is deliberately not baked in here.</strong> The detail screen renders <code>M05-2026-W19</code> as “May (M05)-2026-W19”; a static page has no such step, so these show the stored id. Writing the expanded label into the data would misrepresent what is stored.</li> <li><strong>The same stale format is still on eight other pages</strong> — dashboard, my-work, notifications, profile, projects, reports and timeline. That is the parity sweep’s job, not this one. <em>history.html is deliberately excluded: its older entries quote the ids that were correct when they were written, and rewriting them would falsify the log.</em></li> </ul></div> <div class="tl-commit">💄 mockup(cycles): v504 — cycle ids in the format the app writes #3432</div> </div> </div> <!-- v503 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v503</span> <span class="tl-title">The admin portal stops advertising Reporting Lines, a screen the product no longer has</span> <span class="tl-date">17 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">Admin</span> </div> <div class="tl-desc"><ul> <li><strong>The capability was removed from the product and left standing here.</strong> People & Organisation offered a fifth tab, 🔗 Reporting Lines, with a pairs table, an add/edit dialog, a delete confirmation and a chart — for a screen whose UI, API routes and tests were all deleted. Showing a reader a control that no longer exists is the worse direction of drift: they design against something that is gone.</li> <li><strong>The 🌳 Hierarchy tab stays, and that was the whole risk.</strong> One reporting-lines view was deliberately kept, and it reads the same relationship records the deleted screen used to edit. So the records stay and only the editing goes — the tree still draws, from the same 26 active relationships as before.</li> <li><strong>The dialog’s person-picker went with it.</strong> Nothing else on the page used it, so leaving it would have left a widget behind that no screen can reach.</li> <li><strong>An old link to the removed tab now lands on the default page</strong> rather than opening an empty one — the honest answer once the destination has gone.</li> <li><strong>What is left is prose, not controls.</strong> The page still describes reporting lines where that is accurate: the hierarchy is genuinely built from them, and a Cluster Head genuinely sits at the top of the chain. The sidebar’s “Reporting” group is Reports & Exports and the Audit Log — a different thing that shares a word.</li> </ul></div> <div class="tl-commit">🔥 mockup(admin): v503 — remove the Reporting Lines surface #3431</div> </div> </div> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v502</span> <span class="tl-title">Parity sweep: four places where the mockup had fallen behind the shipped app</span> <span class="tl-date">16 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>A reviewer can send a cycle straight back to its author.</strong> The Cluster Head screen had only “Return to POD Owner”, one level back, while the app has carried a second button to the Project Lead who actually has to rewrite the item. Both are gated together — a live button beside a dead one would be a worse lie than the missing one was.</li> <li><strong>A Project Lead or PM can edit their own project from the Projects list.</strong> There was no edit affordance at all. It appears only where you hold the project as PL or PM: a Cluster Head, PMO or admin gets none, because their view of the list has no membership on it — the app hides a control the API would allow, and whether it should is still an open question rather than something the mockup should pre-empt.</li> <li><strong>Help explains the AiDE Risk Radar.</strong> The section the app added — what the radar reads, what each row means, and that it is advisory and changes nothing — was missing here, including the anchor other screens link to.</li> <li><strong>The pages reference stops quoting its own version.</strong> PAGES.md claimed v482 and 36 pages long after both were wrong — in the very file that defines how parity is kept. It now names where to look instead of restating numbers that can only be right by coincidence.</li> <li><strong>Two known gaps are deliberately still open.</strong> The admin portal still shows a Reporting Lines screen the app deleted, and the cycle pages still print an old cycle-id format — both are larger than they look (one shares its data with a screen that stays, the other is 37 cross-referenced ids whose week numbers would be wrong if simply reformatted), so each is tracked on its own rather than rushed in here.</li> </ul></div> <div class="tl-commit">💄 mockup(parity): v502 — four drifts closed from the #3427 sweep #3427</div> </div> </div> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v501</span> <span class="tl-title">The corrections worklist lists mis-heard terms alphabetically instead of in the order AiDE emitted them</span> <span class="tl-date">16 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Meeting Notes</span> </div> <div class="tl-desc"><ul> <li><strong>Finding one term meant reading every row.</strong> The Spelling and name corrections list seeded itself in the order the terms came back, which reads as no order at all — and a long transcript produces dozens of them. They are now sorted alphabetically, so a name you are looking for is where you expect it.</li> <li><strong>Case is ignored, and numbers read as numbers.</strong> A case-sensitive sort files every capitalised term ahead of every lowercase one, so “apis” would land after “Zephyr” rather than beside “Accelerators”. Digits compare numerically too, so “item 2” comes before “item 10”.</li> <li><strong>Speaker rows are deliberately left where they are.</strong> They lead the list because mapping one resolves that person everywhere they spoke, and they are numbered rather than named — sorting them alphabetically would put “Speaker 10” above “Speaker 2”, which is the one ordering a reader would call broken. The term you clicked to open the panel still leads, for the same reason it always did.</li> <li><strong>Sorted on a copy.</strong> The list belongs to the meeting, not to the panel showing it, so ordering it in place would quietly reorder it for everything else reading the same data.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v501 — alphabetical ordering for the corrections worklist #3425</div> </div> </div> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v500</span> <span class="tl-title">A Pomodoro focus timer on My Action Items, and a start and end time recorded against every task</span> <span class="tl-date">16 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feature">Action Items</span> </div> <div class="tl-desc"><ul> <li><strong>A task recorded when it was closed and nothing about when work began.</strong> An action item carried a due date and a completion stamp, so the one question a delivery conversation actually asks — how long did this take — had no answer anywhere. The timer binds a focus session to one item, so the minutes it records are minutes against a task rather than a free-floating stopwatch, and closing an item now reads out its start time, its total focus and the pomodoros that went into it.</li> <li><strong>The countdown is anchored to an instant, not accumulated from ticks.</strong> It stores when the phase ends and derives the rest; the repaint loop never decrements anything. So a background tab throttled to one callback a minute comes back showing exactly the right time, where a subtract-as-you-go timer would have silently lost every tick the browser skipped.</li> <li><strong>A session can never credit more time than it was set for.</strong> Close the lid mid-pomodoro and the wall clock runs for hours; the credit stops at the length you chose. Pausing banks the minutes actually sat through and does not count as a completed pomodoro, so the count means what it says.</li> <li><strong>Reopening keeps the history.</strong> Marking an item done stops the running session first, so the end time can never fall before it. Reopening clears the completion, as it always has, and deliberately leaves the start time and the accumulated total alone — the work really happened, and a rework earns a new end time rather than erasing the first one.</li> <li><strong>The keyboard stays out of the way.</strong> Space, R, S and Z drive the timer, but only outside a text field, a rich-text editor and any open dialog — and R, S and Z only while a timer is actually live, so a stray keystroke on the page background cannot skip a break. Zen mode sits below the modal layer on purpose, so a completion prompt opened from it still lands on top.</li> <li><strong>Four presets, or your own numbers.</strong> Classic 25/5, Extended 50/10, the 52/17 rule and Deep work 90/20, with any duration from 1 to 120 minutes, a long break on a cycle you choose, synthesised chimes with no asset files, and desktop notifications that fire only when the tab is hidden.</li> </ul></div> <div class="tl-commit">💄 mockup(actions): v500 — Pomodoro focus timer + task time tracking #3414</div> </div> </div> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v499</span> <span class="tl-title">A series’ occurrences fold into Year, Month and Week sections instead of one list that only grows</span> <span class="tl-date">16 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Meetings</span> </div> <div class="tl-desc"><ul> <li><strong>A daily standup adds about twenty rows a month, and nothing folded.</strong> Expanding a series printed every occurrence in one column — 24 of them on the reported screen — with no way to collapse July to reach September, and nothing between “one meeting” and “the whole series” to tell you how a month went.</li> <li><strong>Each section states its own rollup.</strong> A month heading reads “September 2026 · 7 occurrences · 46/101 closed”. The path to the newest occurrence is already open when the card expands, so the row you used to see first is still the row you see first.</li> <li><strong>A level with only one child is dropped.</strong> A series that lives entirely in 2026 shows Month and Week, not a “2026” heading that separates nothing. Sections carry counts and no bars, deliberately — with bars at four nesting depths a reader can no longer tell which scope any one of them is measuring, so a bar keeps meaning exactly two things: the whole series, or one occurrence.</li> <li><strong>The grouping follows the reader’s clock, not the meeting’s.</strong> A row already prints its date in the viewer’s own timezone, so the sections are built from that same moment. Group a meeting by the date it was stored under instead and a row reading “27 Jul” lands inside a week labelled “20 Jul – 26 Jul” — checked from Auckland and New York, not only from here.</li> <li><strong>Sections sort by their newest meeting, never by their number.</strong> January holds weeks 53, 01 and 02, and week 53 is the <em>earliest</em> of them — so ordering by week number would put the oldest first in exactly the month where it is hardest to notice.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v499 — Year/Month/Week accordion for series occurrences #3406</div> </div> </div> <!-- v498 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v498</span> <span class="tl-title">Every occurrence of a series gets its own completion bar, not just the series total</span> <span class="tl-date">16 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Meetings</span> </div> <div class="tl-desc"><ul> <li><strong>The aggregate had a picture; the parts had arithmetic.</strong> A series card's header already drew a green bar for the whole series — 253 of 346 closed. Each occurrence beneath it stated its own closure as bare text, <em>9/20 actions closed</em>. Finding the standups that went badly meant reading two dozen fractions and comparing them in your head.</li> <li><strong>The same bar, scaled to one occurrence.</strong> Each row now carries it, sized to that meeting alone. The collapsed card is the useful side effect: it shows the series bar and the latest occurrence's bar together, which is exactly the “how are we doing overall, and how did the last one go” comparison.</li> <li><strong>The track had to change colour to be visible at all.</strong> The shared bar class fills its track with the same subtle grey the occurrence row uses as its own background, so reusing it unchanged draws a bar you cannot see. The meeting card that already uses this class sits on white and never had the problem — which is precisely why copying that call verbatim would have been wrong.</li> <li><strong>The bar and its number are one unit.</strong> The row wraps at narrow widths, so they are bound into a single flex child; otherwise a bar can wrap away from the count it measures. A meeting with no action items gets no bar at all rather than an empty one — an empty track reads as “none of them done” when the truth is that there is nothing to measure.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v498 — per-occurrence completion slider on series rows #3405</div> </div> </div> <!-- v497 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v497</span> <span class="tl-title">The index stops keeping its own copy of the backlog, because a copy of a live system is only ever briefly true</span> <span class="tl-date">13 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>A snapshot that was correct for a moment.</strong> The index carried a hand-captured list of every open work item. It was rebuilt by hand once after roughly seven weeks of drift, and had gone stale again in <strong>eight days</strong> — eight of its nine items closed, and 25 of the 26 then-open items missing.</li> <li><strong>The page never lied; the source comment did.</strong> The visible caption always named its capture date, so a reader could see what they were looking at. The comment above it claimed the index <em>was</em> the complete status dashboard, which is the sentence the next reader trusts instead of checking.</li> <li><strong>Rebuilding it a third time was the option not taken.</strong> The backlog turns over far faster than the mockup does, so the same act would have had the same outcome. The automatic check that would have caught the drift is deliberately unavailable: it would have to ask Azure DevOps over the network, and this repo keeps such checks offline so they cannot fail when you are.</li> <li><strong>So the duplication is gone rather than re-dated.</strong> Azure DevOps is the one place open work is tracked. The per-screen cards keep their 🚧 ribbon where a screen has a known gap — that part does not go stale, because it describes the design rather than the schedule.</li> </ul></div> <div class="tl-commit">💄 mockup(index): v497 — drop the Open Backlog block; AzDO is the source of truth #2736</div> </div> </div> <!-- v496 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v496</span> <span class="tl-title">The mockup’s role ranking disagreed with the API, and the React screen was faithful to the mockup (#2950)</span> <span class="tl-date">13 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">admin</span> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Two copies agreed with each other and both disagreed with the API.</strong> <code>admin.js</code>’s <code>ROLE_PRIORITY</code> ranked <code>deliverySpoc</code> <em>fifth</em>; <code>api/src/models/permissions.ts</code> ranks it <em>eighth</em>, below <code>esoSpoc</code> and <code>recruitmentSpoc</code>, because visibility-only SPOC roles deliberately sit between the chain reviewers. <code>AdminUsersScreen</code> said it mirrored <em>this file</em> and did so faithfully — which is exactly how the divergence survived being looked at.</li> <li><strong>What a user saw.</strong> Someone holding both <code>salesSpoc</code> and <code>deliverySpoc</code> was badged <em>Delivery SPOC</em> by the mockup and the React screen, and <em>Sales SPOC</em> by the API. Owner decision, 13 Sep 2026: <strong>the API is authoritative</strong>, so both copies moved to match it.</li> <li><strong><code>projectContributor</code> was missing from the list entirely</strong>, so a contributor fell through to <code>roles[0]</code> rather than ranking last. The API places it last on purpose — a multi-role user should never be badged primarily a contributor unless it is their only role. Now present, in last place.</li> <li><strong>A guard replaces the prose promise.</strong> <code>roleParity.test.ts</code> now reads this file and the API source and asserts both orders match, so a reorder here fails a build instead of being found by eye months later. It fails closed: a mockup role it has not been taught about throws rather than quietly shrinking the comparison.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v496 — rank roles by the API’s order, and guard all three copies</div> </div> </div> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v495</span> <span class="tl-title">The whole Temporary Access feature was missing from the mockup — 531 lines of shipped screen with no counterpart (#2743)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">admin</span> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Not a missing control — a missing feature.</strong> <code>ProjectGrantsPanel.tsx</code> has shipped since #2465 and the mockup had <em>no panel, no list and no picker</em>. A grep across <code>mockup/</code> for “temporary access” or “grant” returned only unrelated prose. It surfaced during the #2741 picker sweep: the component was one of eleven app files that adopted <code>personLabel</code>, and looking for its picker found that the entire surface was absent.</li> <li><strong>A missing SECTION in an existing screen, not a missing screen.</strong> The panel is mounted from the project edit modal (<code>ProjectEditModal.tsx:322</code>), which the mockup already has — so it lands inside <code>openProjectModal()</code>’s dialog, after the assignment pickers and before the Activation Log. That is the app’s own placement: the rarer act, reading as an exception to the pickers rather than an alternative to them.</li> <li>⚠ <strong>Transcribed, not designed.</strong> A 531-line component written up at speed would mean inventing layout, column order and state copy the app never chose — and a mockup that <em>misdocuments</em> is worse than one that is silent, because a reader cannot tell a design decision from a guess. Every label, placeholder, chip and sentence here is the component’s own wording, and each alternate state keeps the component’s <code>data-testid</code> as its element id so the two can be diffed directly.</li> <li><strong>The three states that must not look alike.</strong> A failed load (<code>grants-load-failed</code>) is a warning panel, <em>not</em> an empty list: “nobody has access” and “somebody might, and we cannot tell you who” mean different things and only one is safe to act on. The empty state (<code>grants-empty</code>) is its own line. Both are <code>display:none</code> with a note saying when they show — the same convention as <code>#org-tree-error</code>.</li> <li><strong>Four rows, covering every status and the inline editor.</strong> Live access nearly over carries a separate <strong>“Ends in 2 days”</strong> countdown line — the date is already above it, so what the line adds is urgency; its threshold mirrors the ET-063 warning email so panel and inbox cannot disagree. One row shows the <strong>extend</strong> editor open, which the app allows one at a time. Expired and revoked rows offer <em>neither</em> Extend nor Withdraw: a button with nothing to do is a promise the row cannot keep.</li> <li><strong>The give-access form, with its three easily-lost details.</strong> The search is <em>company-wide</em>, because the whole point is somebody not on the team; a truncation notice exists so “no match” is not read as “that person does not exist”; and the invite path is offered from the <em>same</em> box, alongside results rather than only when there are none, since two colleagues can share a first name.</li> <li><strong>The 90-day cap is quoted, not invented</strong> — read from <code>MAX_GRANT_DAYS</code> in <code>projectAccessGrantService.ts</code>. In the app it comes from the server precisely so the rule does not live in two places, and the date picker is bounded by it so it can never offer a date the API would refuse.</li> <li><strong>No impl-pending item</strong>: this is catch-up documentation for code that already shipped (#2465, #2464, #2468, #2471, #2593), so there is nothing for a future agent to build.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v495 — document the Temporary Access panel the mockup never had</div> </div> </div> <!-- v494 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v494</span> <span class="tl-title">The admin mockup declared <code>escHtml</code> twice and the BROKEN one won — all 155 escaping calls in <code>admin.js</code> were no-ops (#2747)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">admin</span> <span class="tag tag-chore">Consistency</span> </div> <div class="tl-desc"><ul> <li><strong>An escaper that escaped nothing.</strong> <code>admin/index.html</code> declared <code>function escHtml(t)</code> whose every replacement mapped a character to <em>itself</em> — <code>&</code>→<code>&</code>, <code><</code>→<code><</code>, <code>></code>→<code>></code>, <code>"</code>→<code>"</code>. It was named like an escaper, called like one, and returned its input unchanged.</li> <li>⚠ <strong>The damage was not the three local calls — it was the SHADOWING.</strong> <code>admin.js</code> declares a correct <code>escHtml</code> and is loaded at line 3375; the broken duplicate sat in an inline block evaluated at 3690+. Both are global function declarations, so <strong>the later one wins — and it wins for <code>admin.js</code> too</strong>. All <strong>155</strong> escaping calls in that file — user names, project names, POD names, emails, saved-view names, every table cell built into <code>innerHTML</code> — were silently no-ops.</li> <li><strong>Proven by running it, not by reading it.</strong> Hoisting rules are enough to <em>suspect</em> which declaration wins; only executing them settles it. A probe that evaluates <code>admin.js</code> and the inline blocks in the real document order returned the input <code><img src=x onerror=alert(1)> & "quoted"</code> completely unchanged.</li> <li><strong>Fixed by DELETING the duplicate, not by repairing it.</strong> Two implementations of one rule is the defect; <code>admin.js</code>’s version is correct and is defined before the inline block runs, so removing the broken one leaves exactly one definition and the three inline call sites pick it up automatically. The probe now escapes correctly — <strong>and was re-run against the pre-fix file to confirm it still reports the failure</strong>, so the green is evidence rather than an assumption.</li> <li><strong>Swept the whole repo for siblings: none.</strong> Zero other self-mapping replacements across 1,072 tracked files. The four <code>mockup/assets/js</code> helpers that each declare <code>esc</code> are all inside IIFEs, so they are function-scoped and cannot shadow each other; the two other <code>escHtml</code> declarations are on pages that never load <code>admin.js</code>.</li> <li><strong>A tempting origin story, refuted.</strong> The broken function is the same shape as <code>cycle-history.html</code>’s correct one with the entities missing, which suggests an HTML-entity-decoding pass over the file — but <strong>68 <code>&amp;</code> literals survive intact in that same file</strong>, so no global decode ever happened. It was a one-off.</li> <li><strong>Scope, stated honestly:</strong> this is the mockup — a static demo with fixture data — so nothing here was a live XSS. What it was is a function whose <em>name asserted a property it did not have</em>, sitting in front of 155 call sites, in the artefact people read to understand what the app does.</li> <li><strong>No impl-pending item</strong>: a defect in mockup-only scaffolding with no web/API counterpart — React escapes by construction.</li> </ul></div> <div class="tl-commit">🐛 mockup(admin): v494 — delete the no-op escHtml that shadowed the real one</div> </div> </div> <!-- v493 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v493</span> <span class="tl-title">Four truncating names become recoverable — two only from a 22px avatar, two not at all (#2746)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup: catch-up on #2666, already on <code>main</code>, so there is no implementation to pend.</strong></li> <li><strong>#2666 put the <code>title</code> on the TRUNCATING span itself</strong>, and its memento is explicit about why the near-miss was not enough: one case already had a title on the span immediately before it, so the value <em>was</em> recoverable — but only from a much smaller hover target — and it still got its own.</li> <li><strong>The mockup was in the pre-#2666 state at four sites, in two grades.</strong> The participant and meeting-owner rows truncate a name and role, recoverable only by hovering the <strong>22px avatar</strong> beside them. The two attendee-label rows — including the name of whoever <em>claimed</em> a label — had <strong>no title anywhere</strong> on the row or its container.</li> <li><strong>Already correct and deliberately left alone:</strong> the participant <em>chip</em> truncates at <code>max-width:130px</code> — the same shape as the modal chip #2666 fixed — but its outer span already carries the name and role, which is the recoverable case.</li> <li><strong>Also excluded:</strong> an attachment filename and an email-subject preview truncate non-person values, and <strong>four of the fourteen</strong> ellipsis hits in the mockup are CSS class <em>definitions</em> rather than elements, which cannot carry a title — a detector that counts them over-reports by a third.</li> <li>⚠ <strong>The first verification proved nothing and said so.</strong> Scanning the loaded page found “0 truncating elements, 0 without a title” — because these rows live in a view that is not rendered on load. <strong>0 of 0 is not a pass.</strong> The probe now calls <code>sharingCardHtml</code> and <code>attendeeLabelsHtml</code> directly, asserts seven truncating elements across them, and <strong>fails loudly if either renders none</strong>.</li> <li><strong>No impl-pending item</strong>: already on <code>main</code> (#2666).</li> </ul></div> <div class="tl-commit">💬 mockup(meetings): v493 — titles on the four truncating name labels</div> </div> </div> <!-- v492 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v492</span> <span class="tl-title">My Contributors gains the THIRD status — a failed request no longer reads as “Not submitted” (#2745)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup: catch-up on code already on <code>main</code> (#2444), so there is no implementation to pend.</strong></li> <li><strong>The mockup modelled a two-state world, and said so in a comment.</strong> It enumerated the statuses as “clickable to view; <code>none</code> is a non-clickable Not submitted”. #2444 added a <strong>third</strong>, and the comment is exactly the kind that rots when the set grows.</li> <li>⚠ <strong>Why the third state exists, in #2444’s own words:</strong> a failed status fetch used to degrade to <code>none</code>, which renders as <em>Not submitted</em> — so one failed request <strong>accused a contributor who HAD submitted of not having</strong>, and a PL could act on that. It now reads “⚠️ Couldn’t load”.</li> <li><strong>The distinction is careful and preserved here:</strong> a <em>missing</em> bilateral record genuinely IS not-submitted and stays <code>none</code>. Only a request that <em>throws</em> becomes <code>unknown</code>.</li> <li>⚠ <strong>And it is CLICKABLE</strong>, which is the non-obvious half — not-submitted is the only non-clickable status. The PL can still follow the link and find out for themselves rather than being left with an unexplained warning.</li> <li><strong>The colours are copied, not chosen:</strong> <code>--tint-warning-bg-strong</code> / <code>-fg</code> / <code>-border</code>, taken from <code>utils/paStatusChip.ts</code>.</li> <li><strong>Verified by rendering</strong> — and on the property that matters rather than on appearance: the unknown chip is an <code><a></code>, both not-submitted chips are still <code><span></code>, the two states coexist, and the class really does use all three warning tokens.</li> <li><strong>No impl-pending item</strong>: already on <code>main</code> (#2444).</li> </ul></div> <div class="tl-commit">💬 mockup(priorities): v492 — the “Couldn’t load” contributor status</div> </div> </div> <!-- v491 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v491</span> <span class="tl-title">Admin Users: the amber panel naming the people who are on no project or POD (#2744)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup: catch-up on code already on <code>main</code> (#2494), so there is no implementation to pend.</strong></li> <li>⚠ <strong>This is not an arbitrary missing panel — it is the diagnostic for the population v484’s Default POD setting exists to serve.</strong> #2681 found roughly 20 of 23 people holding <em>zero</em> project memberships, which is why the P&A scope picker correctly stood down for them. The mockup already showed the <em>setting</em> and the picker’s three states, and did not show the screen that tells an admin <em>who</em> is in that state.</li> <li><strong>Rendered ONLY when there is something to act on</strong>, the same rule the stale-assignment panel above it follows — a fully-mapped org sees nothing at all. Amber, where that one is red.</li> <li><strong>The copy is the app’s, not a paraphrase:</strong> “<em>N active P&A submitter(s) is/are on no project or POD</em>”, then the part that matters — they can still submit, but receive no Monday kickoff or reminder and appear in nobody’s review roster. <strong>Show details</strong> opens Name / Role / Email.</li> <li>⚠ <strong>The mockup has no API, so it DERIVES the set</strong> rather than inventing one: active users with an empty <code>projects</code> list. POD reachability runs <em>through</em> project membership (#2681), so no projects means no POD either — which is why one condition is enough and the panel is not guessing.</li> <li><strong>Mirrored, not invented</strong> — #2494’s own comment names the stale panel as its template, and that panel was already modelled here, so the shape, the toggle and the table came from something that already existed.</li> <li><strong>Verified by rendering:</strong> the panel appears for the one unmapped fixture user, the summary uses the <em>singular</em> “submitter is”, the detail is collapsed until the toggle and then shows Name / Role / Email — and, the falsifier, mapping everyone to a project makes it render <strong>nothing</strong>.</li> <li><strong>No impl-pending item</strong>: already on <code>main</code> (#2494).</li> </ul></div> <div class="tl-commit">💬 mockup(admin): v491 — the unmapped-P&A-submitters panel</div> </div> </div> <!-- v490 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v490</span> <span class="tl-title">Nine more pickers — the v488 scan never opened a <code>.js</code> file, so this one enumerates from the APP instead (#2741)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li>⚠ <strong>v488 said “the whole mockup enumerated at last”. It globbed <code>mockup/**/*.html</code>, so it never opened a <code>.js</code> file</strong> — and the admin mockup builds its option lists in <code>admin/admin.js</code>. That is a <strong>file-selection</strong> miss, not a pattern one, and it is the worst kind: a perfect detector handed nothing reports zero and exits clean. Fourth pass on this task.</li> <li><strong>So the method changed.</strong> Instead of classifying mockup markup by eye, the list now comes from the <strong>app</strong>: the eleven files that import <code>personLabel</code>, each mapped to its mockup counterpart. That is an authoritative set rather than a hopeful one.</li> <li><strong><code>buildUserSelect</code> — one function, SEVEN pickers.</strong> Five on the admin project form (Delivery SPOC, Sales SPOC, Sales co-SPOC, ESO SPOC, Recruitment SPOC) and two on the POD form (POD Owner, Cluster Head). Both counterparts — <code>AdminProjectsScreen</code> and <code>AdminPodsScreen</code> — adopted <code>personLabel</code>.</li> <li><strong>The token-owner picker</strong> in the MCP token modal, counterpart <code>AdminMcpTokensScreen</code>.</li> <li><strong>The command palette’s People results</strong> read <code>Name · Role</code> — a <em>fourth</em> spelling of the same fact. <code>CommandPalette.tsx</code> records that it was <code>Name · email</code> before #2591 unified it. The palette is where you type a name to find a person, so the email is exactly what it needs.</li> <li>⚠ <strong>And one deliberately NOT converted, which only the authoritative-set method caught:</strong> <code>timeline.html</code>’s member picker also reads <code>Name — Role</code>, but <code>TimelineScreen.tsx</code> is <strong>not</strong> in the adopted set. Converting it would run <em>ahead</em> of the app rather than mirror it — the mockup documents the screen, it does not propose changes to it.</li> <li><strong>Also excluded:</strong> the service-account options beside the token owners (not people, and the “(service account)” suffix already does the disambiguating the email exists for), and every project / POD / saved-view select.</li> <li><strong>Verified by rendering</strong> — not just the label rule over five shapes, but the <em>real</em> picker: <code>buildUserSelect</code> called against the live fixture, every option asserted to be <code>Name (email)</code> and no <code>Name — Role</code> left. The probe fails loudly if the fixture has no eligible user, so it cannot pass by matching nothing.</li> <li><strong>No impl-pending item</strong>: already on <code>main</code> (#2457, #2591).</li> </ul></div> <div class="tl-commit">💬 mockup(admin,palette): v489 — nine more pickers, enumerated from the app's adopted set</div> </div> </div> <!-- v489 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v489</span> <span class="tl-title">The index’s Open Backlog comment stops claiming to be the complete AzDO dashboard (#2740)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Chore</span> </div> <div class="tl-desc"><ul> <li><strong>An HTML comment only — nothing renders differently, and there is no implementation to pend.</strong> The visible caption already reads “Every AzDO work item still open on <strong>3 Sep 2026</strong>”, which is honest: it names its date, so a reader knows to check. The <em>comment</em> above it said, in the present tense, that the index “is the complete AzDO work item status dashboard”.</li> <li><strong>It is not, and was not for long.</strong> Measured 2026-09-11: <strong>eight of the nine</strong> listed items are closed, and <strong>25 of the 26</strong> then-open items are absent.</li> <li>⚠ <strong>A false claim in a comment is worse than an admitted gap</strong>, which is why this half was separable from the design question. The documented state is what the next reader trusts <em>instead of</em> checking AzDO — the dated caption invites exactly the check the comment discouraged.</li> <li>⚠ <strong>The list was deliberately NOT rebuilt by hand.</strong> That would be the third time: it was already rebuilt once (#2416 / v483) after ~7 weeks of rot, and it rotted again in <strong>eight days</strong>, because the backlog turns over far faster than the mockup does. What to do instead — drop the block, generate it at release time, or keep it as a dated marker — is an open decision on <strong>#2736</strong>.</li> <li><strong>The cheap guard is ruled out, and the reason is worth carrying:</strong> a freshness check would have to ask AzDO over the network, and this repo’s guards are deliberately offline so they cannot fail on a plane. So no check can hold this block honest; only the comment can stop over-claiming.</li> <li><strong>Correcting it cannot pre-empt the owner’s choice</strong>, which is what made it safe to do alone: the completeness claim is false under two of #2736’s three options, and the third would rewrite the comment anyway.</li> </ul></div> </div> </div> <!-- v488 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v488</span> <span class="tl-title">Five MORE people-pickers — the whole mockup enumerated at last, after three passes that each missed some (#2739)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>v487 converted five pickers and its note said “enumerate from what the app converted, not from what you happen to see”. It then under-enumerated again.</strong> A broad scan found <strong>five more</strong> — four in the very file v487 had just finished. This is the third pass on the same task, and the entry exists to say so rather than to look tidy.</li> <li><strong>The five:</strong> the reassign-action select’s <em>two</em> option lists (its “no access” entry for an assignee who lost access, and its eligible list — one <code><select></code>, two lists, which is part of why it was missed); the attendee-label mapping select; the map-a-contributor select; and the self-service reassign modal on <strong>My Action Items</strong>. <code>MyActionItemsScreen.tsx</code> imports <code>personLabel</code> for that last one.</li> <li><strong>The scan that finally worked was a DENYLIST</strong>, and that is the point. Every <code><option></code> line mentioning <code>.name</code> or <code>person(</code> — 18 hits — then classified by hand. It fails <em>loudly</em>, with too many to read; the three narrower detectors before it failed <em>silently</em>, each returning a plausible short list.</li> <li><strong>Eight of the 18 are correctly excluded</strong>, recorded so the next reader does not “finish the job”: two saved-view selects (<code>v.name</code> is a <em>view</em>), five project/POD selects, and the <em>Preview as</em> demo bar.</li> <li>⚠ <strong>My Action Items shows no visible change, and that is not a reason to skip it.</strong> Its attendee fixtures carry <code>id</code> and <code>name</code> but no <code>email</code>, so the shared rule degrades to the bare name — exactly what <code>personLabel</code>’s docblock describes. The mockup now follows the shared rule rather than a local one, and renders correctly the moment the fixture gains emails instead of hard-coding a label that would then be wrong.</li> <li><strong>Verified by rendering both files</strong> and driving the label over five shapes — both halves, name-only, email-only, whitespace-only (degrades to the email, not a blank row) and the empty object. Both files agree on every one.</li> <li><strong>No impl-pending item</strong>: already on <code>main</code> (#2457).</li> </ul></div> <div class="tl-commit">💬 mockup(meetings,my-actions): v488 — the last five people-pickers, found by a denylist scan</div> </div> </div> <!-- v487 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v487</span> <span class="tl-title">Meeting Notes AI: five people-pickers read <em>Name (email)</em>, the search finds an email, and one datetime stops using a format the app removed (#2738)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup: catch-up on code already on <code>main</code>, so there is no implementation to pend.</strong> Found by continuing v486’s method into the next-highest-churn screen — <code>MeetingDetailScreen</code> has nine commits since the v482 sweep.</li> <li><strong>One datetime was still in the format #2621 removed.</strong> That fix took a numeric date with seconds off this screen because no other screen used it, and it was announced to users. The mockup still carried <code>06/07/2026, 17:37:44</code> — and it <em>renders</em>, as “Processing since …”. Its own sibling field two lines below already read <code>06 Jul 2026, 18:07 IST</code>, so one object held both formats, which is what made it unambiguous rather than a judgement call.</li> <li><strong>Five people-pickers now read <code>Name (email)</code></strong>, mirroring <code>utils/personLabel.ts</code> and the user decision of 2026-09-06: two colleagues can share a name, and a name-only row leaves you choosing between identical options. The helper <strong>degrades</strong> to whichever half exists rather than printing “Name (undefined)” — an invited account with no name yet has exactly that shape.</li> <li>⚠ <strong>I found two of those five by reading and three by grepping, which is the point.</strong> The two series pickers were the ones visible while reading that block; the Assignee select, the add-participant select and the add-meeting-owner select came only from searching for the label expression. <strong>Enumerate from what the app converted, not from what you happen to see</strong> — the same lesson v486 recorded one iteration earlier.</li> <li><strong>And a sixth thing: the autocomplete now SEARCHES the email too.</strong> The app exports <code>personMatches</code> beside <code>personLabel</code> and matches on the label, so typing an email finds the person — which is the entire reason the email is shown. The mockup displayed it without making it searchable: the feature half-built.</li> <li>⚠ <strong>Role is kept as an extra search term</strong> even though the app has no equivalent. Removing it would take a working affordance away in order to match an absence — that is copying, not parity.</li> <li><strong>Deliberately unchanged</strong>, so the next reader does not “finish the job”: the <em>Preview as</em> bar is a mockup-only demo control and keeps <code>Name — Role</code>; participant chips, list rows and avatar tooltips are not pickers and keep theirs. Only option lists a user picks from were converted.</li> <li><strong>Verified by rendering</strong> — the page loaded in a real DOM and the label helper driven over four shapes: both halves, name-only, email-only, and whitespace-only (which must degrade to the email, not to a blank row).</li> <li><strong>No impl-pending item</strong>: both halves are already on <code>main</code> (#2621, #2457).</li> </ul></div> <div class="tl-commit">💬 mockup(meetings): v487 — Name (email) across five pickers, email-searchable, and the #2621 datetime</div> </div> </div> <!-- v486 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v486</span> <span class="tl-title">Reports: five org-only blocks stop being shown to roles the API refuses, and the return-rate export arrives (#2737)</span> <span class="tl-date">11 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup: catch-up on code already on <code>main</code>, so there is no implementation to pend.</strong> Found by checking this page against the seven <code>ReportsScreen</code> commits since the v482 whole-app sweep.</li> <li><strong>The mockup showed four—really five—blocks to roles the app now hides them from.</strong> Its only role logic was <code>reportsRoles</code>, which gates <em>access to the page</em> for five roles and nothing on it. The app computes <code>canViewOrgReports</code> from <code>ORG_REPORT_ROLES</code>, which is <strong>exactly two</strong> — PMO and admin — and hides the <strong>Notifications & Digest Delivery</strong> card, the <strong>User Adoption & Access</strong> card and <strong>three</strong> CSV exports (Audit Log, Digest Delivery Log, User Adoption) behind it. A Delivery SPOC, POD Owner or Cluster Head was being offered controls the API refuses — the UI/API role-gating parity defect the app itself fixed in #2628/#2630.</li> <li>⚠ <strong>The Digest Delivery Log export was nearly missed.</strong> It sits in the same <code>canViewOrgReports</code> block as the Audit Log export in the app, but a row apart in the mockup, so reading the two cards and the two obvious exports found four of five. The fifth came from reading the app's gate rather than matching on appearance.</li> <li><strong>The Return Rate by Stage — CSV export is new here</strong> (#2636 shipped it as the one panel on this page you could only read on screen).</li> <li>⚠ <strong>And the obvious way to add it would have been wrong.</strong> Only two charts carry ⬇ PNG / ⬇ SVG buttons, and Return Rate is not one of them — so the tempting fix was to give its card those buttons. <strong>v482 removed them from that very header on purpose</strong>, with a note saying <code>ChartDownloadButtons</code> is mounted on exactly two charts in the app and Return Rate has none, which is still true. #2636 added a <em>CSV export</em>, in the Export panel. The chart header is untouched.</li> <li>⚠ <strong>It also carries NO “org-wide” caption</strong>, unlike the Audit and User exports beside it: this one applies the caller’s scope and <em>honours</em> the POD/project filter (#1742 made it do so), so that caption would be false. Copying the neighbouring markup wholesale would have attached it.</li> <li><strong>Verified by rendering</strong> — the page driven in a real DOM as all five roles: five org blocks hidden for Delivery SPOC, POD Owner and Cluster Head, <strong>zero</strong> hidden for PMO and admin, and the return-rate export present, never gated, and without an org-wide caption in every case.</li> <li><strong>No impl-pending item</strong>: both halves are already on <code>main</code> (#2628, #2630, #2636).</li> </ul></div> <div class="tl-commit">💬 mockup(reports): v486 — org-only blocks gated to PMO/admin, return-rate CSV added</div> </div> </div> <!-- v485 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v485</span> <span class="tl-title">Two AiDE switches the admin mockup never showed, and three settings that were never really settings (#2712)</span> <span class="tl-date">10 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li><strong>#2707 landed two toggles in Global Automation Settings hours after v484 shipped, and the mockup did not have them.</strong> <em>Attendee suggestions for ambiguous names</em> and <em>Flag decisions that may relate to an earlier one</em> — both features whose service, endpoint and swagger entry had shipped while the switch never did, so they could only be turned on by an admin PAT or a manual database update. A reader of the mockup would have concluded they still had no control, which is precisely the defect #2707 fixed.</li> <li><strong>The hint text says what each one does NOT do, deliberately, because that is the load-bearing half.</strong> Attendee suggestions <em>never assign anyone</em> — AiDE only ranks a list the server already built and the owner still picks. The overlap check <em>judges no contradiction and changes nothing</em> — it points at a prior decision from a short pre-fetched list and any answer outside that list is discarded. Both are off by default and both spend a call billed to the owner’s own token.</li> <li><strong>Both carry <code>ga-toggle</code></strong>, so the master kill switch greys them out the way the app disables them. Verified by driving it, not by reading the class: with automation disabled both go inert, and <strong>Invitation Link Expiry stays live</strong> — the one control that is exempt on purpose. Without that second half, “they were disabled” would only prove that everything was.</li> <li><strong>#2710 landed a web guard the same evening — every scheduler setting must have a control AND reach a save payload — so the mockup’s own state was audited against the same rule.</strong> Ten settings, and <strong>three</strong> failed it. <code>defaultTimezone</code> was a leftover of a select this mockup deliberately deleted (“no such setting”); <code>timelineDigestDay</code> was orphaned when v482 removed the Timeline Digest card and relocated only its stale-threshold field; and <code>disableAllAutomation</code> had a control that drove the banner and the disabled attributes <em>directly</em>, so the field it is named after was permanently <code>false</code>. The two dead fields are gone and the kill switch now records itself.</li> <li>⚠ <strong>A fourth “finding” was a false positive, and it is worth recording which.</strong> The first pass matched state keys to control ids by kebab-casing, and flagged <code>disableAllAutomation</code> as having no control at all — its id is <code>disable-automation-toggle</code>, which no mechanical transform produces. The audit now uses a hand-verified map, and it was proved to fire by adding a control-less setting to a scratch copy.</li> <li><strong>Checked and left alone:</strong> v484’s Default POD select is <em>not</em> <code>ga-toggle</code>, and should not be — the app puts no <code>disabled</code> prop on it either.</li> <li><strong>No impl-pending item</strong>: every switch here is already on <code>main</code> (#2707). This makes the mockup show them.</li> </ul></div> <div class="tl-commit">💬 mockup(admin): v485 — the two AiDE switches, and three settings that were never settings</div> </div> </div> <!-- v484 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v484</span> <span class="tl-title">The default POD reaches the mockup: an admin setting, and the P&A picker’s third state (#2705)</span> <span class="tl-date">10 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup: this is catch-up on code that already shipped, so there is no implementation to pend.</strong> #2681 added a configurable default POD and #2686 the backfill script that gives existing rows the same answer. A grep for <code>defaultPod</code> across <code>docs/</code> and <code>mockup/</code> on 10 Sep returned <strong>zero hits</strong> — neither surface that documents this product knew the feature existed.</li> <li><strong>Admin → Scheduler gains a 🏷️ Priorities & Achievements card</strong> with <em>Default POD for unmapped submitters</em>, mirroring <code>AdminSchedulerScreen.tsx:1968-2009</code>: a select that reads <em>— None configured —</em> until an admin picks one, the hint explaining why the field exists, and the <strong>Not configured</strong> badge that shows only while it is unset. It is its own card rather than a row inside Access & Security, because a default POD is neither an access control nor a role limit — the same reason the app files it separately.</li> <li><strong>The option list shows POD names and carries POD ids</strong>, and only <em>active</em> PODs are offered. That is not cosmetic: a POD id is environment-specific, and matching the default by <em>name</em> would let a rename repoint every unscoped item in the product. The FK guarantees the row exists; it cannot guarantee anyone still works there.</li> <li><strong>The P&A demo toggle now cycles THREE states, not two.</strong> It was “required” / “none to pick”. The middle state was missing and it is the whole point of #2681: a submitter with no project, POD or grant of their own, in an environment where an admin configured a default, is offered <em>exactly that POD</em> and the tag is required like everyone else. “None to pick” survives as what happens when no default is configured — the pickers and the hint vanish and nobody is blocked.</li> <li><strong>The two lists are mutually exclusive in that state, deliberately.</strong> Someone who already has a project is still refused the default POD: a catch-all sitting beside their own projects is an invitation to file real project work under it, which is the misattribution the scope tag exists to prevent. The mockup now shows that rather than implying a merged list.</li> <li><strong>Documentation caught up in the same change</strong> — a new <strong>ADR-28</strong> in the decision log (why the default is a configured id and never a name, why <code>SET NULL</code>, why the backfill is a reviewed script and not a migration, and why it is forward-only), an amendment on <strong>ADR-25</strong> recording that the rule never changed — only who has something to choose — and <code>02-domain-data-model.md</code> now carries <code>SchedulerSettings.defaultPodId</code> and the warning that untagged rows survive in past weeks.</li> <li><strong>Verified by rendering, and falsified in both directions.</strong> Both pages were loaded in a real DOM and driven: the admin select lists the two active PODs, holds the <em>id</em> when POD Basu is chosen, hides the <strong>Not configured</strong> badge only once set and restores it when cleared, and refuses an <em>inactive</em> POD — with an <em>active</em> POD added the same way proving that refusal is the filter and not an empty list. The P&A toggle was walked through all three states: <code>own</code> lists Projects and PODs, <code>default</code> lists <strong>one</strong> POD and no projects and <em>still</em> requires a scope, <code>none</code> requires none, and the cycle wraps. Plus <code>node --check</code> on <code>admin.js</code> and the five inline blocks of <code>pl.html</code>, and <code>check-mockup-history.mjs</code> green.</li> <li><strong>No impl-pending item</strong>: the web and API halves are already on <code>main</code> (#2681, #2686). This change makes the mockup and the docs describe them.</li> </ul></div> <div class="tl-commit">💬 mockup(admin,priorities): v484 — the default POD, in the admin settings and the P&A picker</div> </div> </div> <!-- v483 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v483</span> <span class="tl-title">Landing page: Open Backlog refreshed from the live query, admin area cards caught up with the hubs (#2416)</span> <span class="tl-date">3 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong><code>index.html</code> is meant to be the mockup’s complete AzDO status dashboard, and its Open Backlog was dated 11 July.</strong> Every one of the eleven items it listed (#1012, #897, #967, #973, #951, #955, #962, #889 …) is long Done, and none of the nine items actually open today appeared. The block is rebuilt from <code>node scripts/ado.js query</code> on 3 Sep and says so in its comment: four pipeline / CI bugs, one P&A diagnostic bug, and four feature gaps — grouped by area, each row linking to its work item with the state pill it carries.</li> <li><strong>The 🚧 ribbon is back on the cards that have a feature gap.</strong> The legend has promised “dashed border + 🚧 corner + ticket link” since v412, but no card carried it. Now four do, each naming its item: <strong>System Status</strong> (#2396 — per-service uptime % and 7-day incident history, designed in #1164 and never built), <strong>Meeting Notes AI</strong> (#2401 — diarization label quality never evaluated against a real recording), <strong>Health</strong> (#2403 — scheduled unattended AiDE runs, design complete) and the new <strong>AiDE</strong> admin card (#2411 — six non-meeting run types listed in no UI; the API landed, the screen has not). Bugs stay in the backlog list only — a bug is not a feature gap.</li> <li><strong>The admin area had drifted two consolidations behind.</strong> Its cards still linked <code>#templates</code>, <code>#mcp-tokens</code> and <code>#mcp-log</code> as if the Email and MCP hubs (#1538) had not landed, described Email Templates with the “HTML editor” #2047 removed, and had no card at all for the Meeting Notes AI register, AiDE Configuration (#2259), Webhooks (#1522) or Settings (#1335). Now: Management gains the register; Automation’s Email card is the hub (read-only Templates | Delivery Log); AI Integration is MCP (hub) → AiDE → Webhooks; and a new <strong>Admin Portal · System</strong> section holds Settings, with the note that it is the one group gated on the admin role alone. That is <code>AppShell.tsx</code>’s <code>ADMIN_GROUPS</code>, card for card.</li> <li><strong>Smaller drift closed on the same pass:</strong> the Health card was still titled “Project Health” (#2238 made it one entry, three scopes); <code>docs.html</code> had no card and now sits in Reference as <em>Solution Overview</em>; the page footer read “Iteration v62 · 12 Jun 2026”.</li> <li><strong>Verified by rendering</strong> — the page loads with zero errors, exactly four <code>page-card--todo</code> cards, every new admin hash present as a card, and nine backlog rows each carrying a work-item link. <code>check-mockup-history.mjs</code> green.</li> <li><strong>No impl-pending item</strong>: nothing here is a design awaiting build — the four ribbons point at the existing open items, which is the whole point of them.</li> </ul></div> <div class="tl-commit">💬 mockup(index): v483 — Open Backlog refreshed from the live query, admin cards caught up with the hubs</div> </div> </div> <!-- v482 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v482</span> <span class="tl-title">Parity sweep: every screen compared against the shipped app — 30 mockup files, one shared Account Update widget (#2413)</span> <span class="tl-date">3 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup, and this time the whole app, not the last four days.</strong> v481 walked the 43 commits since v480; this sweep put every one of the 51 screens under <code>src/web/src/screens</code> beside the mockup page that hosts it, plus the shared chrome. Six read-only comparisons produced roughly three hundred concrete gaps — features, states, labels and gating the app has and the mockup did not show. The hosting-screen rule from v481 held: a feature counts as present only when the page that should host it renders it, never because <code>history.html</code> mentions it.</li> <li><strong>Shared chrome (<code>nav.js</code>)</strong> — the Workflow group now runs in the app’s order (Health <em>before</em> Meeting Notes AI, My Work right <em>after</em> it, not at the top), Health follows its own gate rather than Timeline’s (a Project Contributor who is a project member sees it; only pure-admin does not), and two admin entries the sidebar had never carried are in: <strong>🪝 Webhooks</strong> under AI Integration and a <strong>System → ⚙️ Settings</strong> group that only the admin role sees — a PMO Associate gets every other admin group and not that one, exactly as <code>AppShell.tsx</code> gates it.</li> <li><strong>Ups & Downs — one widget for the biggest gap.</strong> The app mounts <strong>🤖 AiDE Account Update — for leadership</strong> (#2040) on six rungs plus Cycle Detail; no mockup showed it. It is now <code>assets/js/account-update-card.js</code>, mounted once per page with the same active-role gate as <code>accountUpdateRoles.ts</code>: present for PM through PMO and admin, absent for a Project Lead, and the PL page has no placeholder at all. Every static AiDE panel became on-demand the way the app’s are — Generate / Regenerate, cached-at chip, error slot, empty copy — on PL suggestions, the PM brief and the Cluster Head risk radar. PMO gained the six-pill stepper it never had; Cluster Head’s page order now matches the app (sign-off and override <em>before</em> topic notes and attachments, action bar last) and its sign-off is the plain textarea #1383 made it. Cycle History gained the project picker, 🗑 Delete for archive-capable roles, the 🗄️ Archived badge and an explicit 👁 Preview; Cycle Detail gained the in-progress variant, the admin-only Reopen card and the override-close card.</li> <li><strong>Priorities & Achievements</strong> — the project/POD <strong>scope picker</strong> on every add row (Add disabled until a scope is chosen) and the 🏷️ chip on every item, across submit, review, digest and history; achievements are <em>1–3</em>, not exactly 3, and the checklist, submit gate and banner copy all say so; the review screen’s category list no longer offers AiDE as a category (it is the 🤖 checkbox), the hard-coded four-rung ladder is replaced by the reporting-graph <code>PAChainStatus</code> layout, and the last AiDE priority cannot be deleted. Cluster Head’s digest gained its project-picker landing and a <em>returned</em> member whose Acknowledge is “↩ Awaiting Resubmission”. History’s malformed <code><h3>…</h5></code> is fixed and 📤 Submitted moved to the success colour family the app uses.</li> <li><strong>Meeting Notes AI</strong> carried the most debt: the <strong>👤 Named in the transcript</strong> attendee-label panel (map / dismiss / invite / parked counter), the <strong>🤖 Automatic processing</strong> side card with its two-direction gate (owners may turn it on, admins may only turn it off), the queued-run and server-transcription banners with their retry and gave-up states, the 📎 Staged sources panel with in-place preview, the in-browser recorder, decisions awaiting confirmation, related prior decisions, and the “Ready to process” status the list could not even filter on. Add-occurrence is gated on the <em>series</em>, not occurrence ownership — the #1225 bug the mockup still had. My Actions gained AiDE chase advice (keep chasing / hold off / escalate, with Escalate emailing the meeting owner) and the ⏸ parked badge; My Work gained the “Showing N of M” truncation notes and the all-clear state.</li> <li><strong>Health and Reports</strong> — the Health mockup was a Project-scope page with a scope selector bolted on; it now has the POD/portfolio output card (📁 Projects tab with per-project rows, “Not scored” chip, Open Project Health →), the POD picker, the <em>Why this score</em> panel, the LIVE ACTIVITY panel while AiDE writes, the 🧪 sample-transcript exclusion in all three places, the cached/generated chip, and Past runs hidden in Project scope because the app only renders it for POD and portfolio. Reports gained the Approved / In-Progress tiles, the org-wide chips, the SLA per-week table and Overdue tile, the Table/Chart toggle on cycle time, four pagers, two missing CSV exports and the segmented range control; the saved-view selects and stale PNG/SVG buttons the app never had are gone, and User Activity is the per-user report it actually is.</li> <li><strong>Hub screens</strong> — the Dashboard gained Ask AiDE, the in-card project picker, the six-step stepper and the “My” in My Recent Activity (it is the caller’s own feed); Help’s eight placeholder topics are written, with one screenshot and one video figure each to document that the app carries about thirty of the former and twenty-five of the latter, and topic selection is <code>?topic=</code> so the app’s own deep links land; What’s New carries the three 2 Sep entries; Status has the fifth “Checking…” state; Login has the only production route into self-registration and the three session-ended variants.</li> <li><strong>Admin</strong> — the page’s own inline sidebar matches <code>AppShell.tsx</code> group by group (Reporting before AI Integration, Webhooks, the admin-only System group, a role-gated Workflow group); Users gained the stale-assignment backlog alert, “Mark as left the organisation”, the two missing roles in the filter and the Status select; Projects gained the status-change dialog, the 🕘 Activation Log, Code / Start / End and a POD <em>dropdown</em> from which Cluster Head and POD Owner are derived read-only (the mockup had them as required editable selects — the opposite of the app); the 11.5 KB hard-coded org chart is rendered from the relationships data; Scheduler gained the five automation toggles it never listed (autonomous processing, daily briefing, chase advice, leadership and PMO digests), a kill switch that actually disables them, and a cycle modal whose frequency, time and day-of-month controls match the app; Email Templates lost the editing workflow #2047 removed (New, Edit, Open Rate) and gained the read-only banner; every register now uses the app’s <code>EmptyState</code> shape and the Settings SMTP test can fail with its diagnostic block. Six pre-existing admin bugs fixed on the way, including a cycle modal that threw on every open and an MCP-log Identity filter that was never applied.</li> <li><strong>Where the web is wrong, the mockup keeps the truth and the web gets a bug.</strong> <code>ProfileScreen.tsx</code> still says the MCP server exposes 61 tools; the server pins 64 and the Help screen says 64 in seven places. The mockup says 64, with Bug #2415 filed against the web. Three latent mockup crashes were found by the render pass, not the text diff: <code>projects.html</code>’s filter threw on every gated load, <code>timeline.html</code> had no event whose author matched the signed-in user so 🗑 could never render, and <code>workflow/pl.html</code> carried literal <code>✅</code> escape sequences no editor could match.</li> <li><strong>Every touched page was rendered, not just edited</strong> — Playwright over <code>file://</code> with a seeded demo session, per role, driving each new state in both directions: the widget present for a permitted role <em>and</em> absent for a Project Lead, Add disabled until a scope is chosen <em>and</em> enabled after, Past runs shown in POD scope <em>and</em> hidden in Project scope. Zero page errors across the final pass.</li> <li><strong>No impl-pending item</strong>: every feature here already ships. This is the mockup documenting shipped behaviour, the same call v480 and v481 made.</li> <li><strong>Follow-up in the same iteration — <code>PAGES.md</code> brought to v482.</strong> The reference doc still described the v312 mockup: it listed 33 pages, omitted <code>help</code>, <code>whats-new</code>, <code>notifications</code>, <code>project-health</code> and <code>docs</code> entirely, gave the sidebar its pre-hub admin groups, and knew nothing of the shared Account Update widget. Its file structure, sidebar description, workflow rung notes, Health section, the five missing page sections and the admin portal notes now describe what v482 renders. Bookkeeping on the doc, not a design change — no new version number.</li> </ul></div> <div class="tl-commit">💬 mockup(parity): v482 — every screen compared against the shipped app</div> </div> </div> <!-- v481 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v481</span> <span class="tl-title">Parity sweep: six screens caught up with four days of shipped work (#2238 #2258 #2259 #2263 #2276 #2308 #2314 #2360 #2380 #2393)</span> <span class="tl-date">3 Sep 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup.</strong> v480 was 30 Aug; 43 UI commits landed after it. This sweep walks every shipped feature since and asks, per screen, whether the mockup shows it — not whether the changelog mentions it. That distinction mattered: a first pass looked clean because most feature names appear in <code>history.html</code> itself, which merely <em>describes</em> them. Re-scanned against the screen that should <em>host</em> each one, eight gaps were real.</li> <li><strong>profile.html</strong> — <strong>My AiDE Usage</strong> card (#2393), between the Fabric Token and MCP Tokens cards, exactly where <code>ProfileScreen.tsx:522</code> renders it.</li> <li><strong>my-actions.html</strong> — <strong>🔀 Reassign</strong> (#2360) on meeting-born items only, gated as the app gates it (<code>canReassign</code> + at least one other active attendee), and the <strong>required-justification modal</strong> (#2380) that now stands between “Mark done” and done. Confirm stays disabled until the note is non-empty; a successful reassign removes the row, because the item is no longer <em>yours</em>.</li> <li><strong>project-health.html + nav.js</strong> — the screen is <strong>Health</strong> now, not Project Health (#2221/#2238): one entry, three scopes, defaulting to <strong>My portfolio</strong>. The sidebar label, the topbar title and the page title all followed. Plus the <strong>Past runs</strong> panel (#2308/#2314), seeded with a failed run and a trace-less run — the two rows the feature actually exists for.</li> <li><strong>admin/index.html + admin.js</strong> — new <strong>🤖 AiDE Configuration</strong> section (#2259), read-only, with the “Updated” stamp beside Refresh (#2276). Its usage table shows an em dash, not 0%, for a run type whose calls are all still in flight.</li> <li><strong>reports.html</strong> — the NL query resolution is no longer a dead end (#2258): AiDE’s reading is shown and <strong>Apply to reports</strong> sets the live filter. Withheld when there is nothing to apply, which is the rule the control exists for.</li> <li><strong>dashboard.html</strong> — <strong>What changed since you were last here</strong> (#2263), on demand behind a button because it spends the reader’s own AiDE token. “Nothing changed” renders as a headline, not an empty state that reads like a failure.</li> <li><strong>Two pre-existing bugs found and fixed on the way.</strong> <code>ADMIN_SECTIONS</code> in <code>admin.js</code> is an allowlist that had never been given <code>webhooks</code> (#1522) or <code>settings</code> — both exist as sections <em>and</em> nav buttons, so <code>#webhooks</code> and <code>#settings</code> had never resolved. And <code>dashboard.html:1028</code> read <code>(user && user.email)</code> where <code>user</code> was declared inside an IIFE 500 lines above; a bare undeclared identifier <em>throws</em> rather than evaluating to undefined, so that line killed its whole script block and dashboard show/hide personalisation had never run.</li> <li><strong>Every screen was rendered in a real browser, not just edited.</strong> Playwright over <code>file://</code>, asserting behaviour in both directions — Apply offered <em>and</em> withheld, confirm disabled <em>and</em> enabled, every deep-link resolving <em>and</em> a bogus hash falling back. Three defects were caught that a text diff cannot see: the topbar still saying “Project Health”, the sources strip claiming AiDE would read one project while the portfolio was selected, and an <code>esc()</code> helper that does not exist on that page.</li> <li><strong>No impl-pending item</strong>: every feature here already ships. This is the mockup documenting shipped behaviour, not a design awaiting build — the same call v480 made.</li> </ul></div> <div class="tl-commit">💬 mockup(parity): v481 — six screens caught up with four days of shipped work</div> </div> </div> <!-- v480 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v480</span> <span class="tl-title">MCP tool catalog: server-side governance digest added, count 63 → 64 (#2265)</span> <span class="tl-date">30 Aug 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Same direction as v479 and v447</strong> — documentation keeping pace with the real server. #2265 adds <code>synthesize_governance_digest</code>, so the guide’s catalog and headline count were about to understate the server by one.</li> <li><strong>What the tool is for</strong>: the server’s three governance <em>prompts</em> hand the connecting client a templated instruction for its <em>own</em> LLM to finish. That works in a chat IDE and fails in a script or thin integration with no strong model behind it. The new tool asks AiDE to write the finished summary server-side instead, from the same governance data, billed to the caller’s own Fabric Token like every other AiDE tool.</li> <li><strong>mcp-guide.html</strong> — added the tool card in the Reports & Admin group with the amber “AiDE” chip, since it spends the caller’s own token. Both headline count mentions bumped.</li> <li><strong>profile.html</strong> — both MCP tool-count mentions bumped.</li> <li><strong>Verified mechanically</strong>: zero “63 tools” references remain anywhere in the repo outside memento history, and the count is green in all four places that pin it inside <code>src/mcp</code> (<code>server.test.ts</code>, <code>validate.test.ts</code> ×2, <code>validate/spec.ts</code>). The v447 lesson holds — the catalog entry landed with the number, not after it.</li> <li><strong>No impl-pending item</strong>: the tool already exists and is tested in the real server (#2265 ships it in this same change). This is the mockup documenting shipped behaviour, not a design awaiting build.</li> </ul></div> <div class="tl-commit">📝 mockup(mcp-guide,profile): v480 — MCP tool catalog 63 → 64 for the governance digest tool (#2265)</div> </div> </div> <!-- v479 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v479</span> <span class="tl-title">MCP tool catalog: 2 Account Update tools added, count 61 → 63 (#2041)</span> <span class="tl-date">13 Aug 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Documentation catching up to the real server</strong>, the same direction as v447’s 54→61 correction: #2041 added two MCP tools for #2040’s leadership Account Update, so the guide’s catalog and headline count were about to understate the server by two.</li> <li><strong>mcp-guide.html</strong> — added <code>generate_cycle_account_update</code> (tagged with the amber “AiDE” chip, like every tool that spends the caller’s own Fabric Token) and <code>get_cycle_account_update</code> (deliberately <em>untagged</em>: it re-reads a cached summary, so it costs nothing and needs no token — the only read tool in the AiDE group). Count bumped in all 4 places: nav link, 2 comparison-table mentions, catalog heading.</li> <li><strong>profile.html</strong> — the 2 MCP tool-count mentions bumped, and the capability list now names the Account Update summary alongside AiDE-suggestion drafting.</li> <li><strong>Verified mechanically</strong>: <code>tool-card</code> element count is now exactly 63 and zero “61” references remain in either file — the v447 lesson, where bumping the headline number without the matching catalog entries would have made the page worse (count says 63, list shows 61).</li> <li><strong>No impl-pending item</strong>: both tools already exist and are tested in the real server (#2041 ships them in this same change). This is the mockup’s own documentation reaching parity with the implementation, not a design change awaiting build.</li> </ul></div> <div class="tl-commit">📝 mockup(mcp-guide,profile): v479 — MCP tool catalog 61 → 63 for the Account Update tools (#2041)</div> </div> </div> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v478</span> <span class="tl-title">Two phone-width overflow bugs, ported from a live web sweep (#2019)</span> <span class="tl-date">6 Aug 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Mobile</span> </div> <div class="tl-desc"><ul> <li><strong>Where it came from</strong>: a phone-width (iPhone/Android) screenshot showed the Dashboard’s “Welcome back” heading overlapping the Customise/Resume-tour buttons. Fixing it in the real app led to a full 22-screen × 2-viewport Playwright sweep of the built web app, which found two more overflow bugs shared with this mockup — the dashboard header and the My Action Items row were <em>already</em> correct here (the web had drifted from them), but these two were not.</li> <li><strong><code>.card-header</code></strong> (title + a per-card action row of selects/toggles/buttons — see reports.html) never wrapped, so the action row alone (a project filter plus 2–3 buttons) routinely overflowed a phone-width card, and with it the whole page. Added <code>.card-header .card-title + div { flex-wrap: wrap; ... }</code> at ≤575px — targets the action row without a class at every call site, since it is always the element immediately after <code>.card-title</code> in this markup.</li> <li><strong><code>.alert</code></strong> is <code>display:flex</code> with no <code>flex-wrap</code> — a flex container’s raw text content is an anonymous flex item that does not wrap at the container’s width under the default <code>nowrap</code>, so a long alert message grows to its full unwrapped width instead. The overflow is invisible to a bounding-rect check (the <code>.alert</code> box itself stays inside its parent) — it only shows up as extra page <code>scrollWidth</code>, which is why it survived past a rect-based sweep and needed a scrollWidth-vs-clientWidth check to surface at all. Added <code>flex-wrap: wrap</code> to the shared rule.</li> <li><strong>Not changed here</strong>: the app-shell topbar overflow (icon-only controls still ~20–26px too wide at 360px) and a Timeline capture-tag badge with an unbreakable long label — both fixed in the web app, but this mockup’s topbar and timeline markup already differ enough (icon-only Help from the start, no capture-tag badge feature at all) that neither bug reproduces here.</li> </ul></div> <div class="tl-commit">💄 mockup: v478 — two phone-width overflow fixes ported from the web sweep (#2019)</div> </div> </div> <!-- v477 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v477</span> <span class="tl-title">My Work can raise an action item without leaving the hub (#2007)</span> <span class="tl-date">3 Aug 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Drift</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">My Work</span> </div> <div class="tl-desc"><ul> <li><strong>The drift</strong>: <strong>#2006</strong> shipped a “➕ New action item” button in the web app’s My Work hero, but this mockup’s hero still offered only 🔄 Refresh. The hub listed action items and counted overdue ones while being the one screen that could not <em>create</em> one — you had to leave for My Action Items and come back.</li> <li><strong>Why the hero, not the card header</strong>: “Your open action items” hides itself when the queue is empty, which is exactly the state a user is most likely to be adding from. Putting the button beside Refresh keeps it reachable when every section is hidden.</li> <li><strong>What changed</strong>: the button plus a create-only port of my-actions.html’s <code>#1140</code> modal — same rich-text toolbar, same 🙋 Myself-defaulted assignee list, same due date, and the same <code>#1143</code> per-item reminder switch spelling out the ET-030 / ET-031 / ET-032 cadence and the consequence of muting. Editing and deleting stay on my-actions.html, where the item’s own row lives.</li> <li><strong>A delegated item does not join your own list</strong>: the live hub refetches after a save, so an item you kept lands in your queue and one you assigned to a colleague does not — it is on <em>their</em> My Work now. Reproduced here rather than always prepending a row, because a delegated item silently appearing in your own list is precisely the wrong impression to leave.</li> <li><strong>Verified by driving the page headlessly</strong> (Playwright against a throwaway static server): 18 checks — modal opens in create mode, reminders default on, the muted note appears only when unticked, an empty task is refused, a self-assigned save prepends the row and bumps the KPI tile, a delegated save does neither, cancel changes nothing, and no console/page errors throughout. Falsified rather than trusted: forcing the delegated branch to prepend turned exactly the delegation checks red.</li> <li><strong>Direction of travel</strong>: mockup catch-up to already-shipped web behaviour — no <code>impl-pending</code> item to raise, the implementation is #2006.</li> </ul></div> <div class="tl-commit">💄 mockup: v477 — My Work can raise an action item without leaving the hub (#2007)</div> </div> </div> <!-- v476 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v476</span> <span class="tl-title">Transcript intake is multi-file, matching the web (#1959)</span> <span class="tl-date">29 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Drift</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>The drift</strong>: the mockup’s transcript intake (create modal + draft intake) accepted exactly one file via a single global <code>pendingTx</code> / <code>m.transcriptFile</code>, while the real web’s <code>TranscriptDropzone</code> has accepted multiple files since <strong>#1949/#1950</strong>. Recording upload stays single-file in both — the real app’s <code>recordingFile: File | null</code> state is genuinely one-at-a-time, so it was deliberately left out of scope.</li> <li><strong>What changed</strong>: <code>pendingTx</code> → <code>pendingTxList</code> (array); <code>txZoneHtml</code> now shows every already-staged chip <em>alongside</em> the dropzone instead of replacing the dropzone with a single chip, so more files can be added without starting over. Bad or duplicate files inside a multi-select batch are rejected individually (one toast per file) without discarding the valid files in the same batch — mirroring the real web’s per-file validation. <code>m.transcriptFile</code> → <code>m.transcriptFiles[]</code> everywhere: demo data, the meeting-card stored-file chips, the draft-intake “already uploaded” preview, <code>stageTranscript</code>, <code>transcribeRecording</code> and the create-modal submission. Each stored file now gets its own delete button (<code>deleteStoredFile(mid,'transcript',idx)</code>).</li> <li><strong>#1956 parity</strong>: added the same “N files combined” indicator the web gained in #1956, shown on the draft-intake preview and demoed live on <strong>M-1042</strong> (re-seeded with two transcript-part files instead of one).</li> <li><strong>Found & fixed a real bug while wiring this up</strong>: <code>pickTx</code> captured <code>input.files</code> by reference and then cleared <code>input.value</code> before the caller read it — a live <code>FileList</code> can empty out when the input is cleared, so a multi-file selection could silently evaporate before staging. Fixed by copying to a plain array first; verified by reproducing the empty-chips failure against the old code before confirming the fix stages every file (Playwright against a throwaway static server).</li> <li><strong>Direction of travel</strong>: mockup catch-up to already-shipped web behaviour — no <code>impl-pending</code> item to raise, this change <em>is</em> the pending item (#1959).</li> </ul></div> <div class="tl-commit">💄 mockup: v476 — transcript intake is multi-file, matching the web (#1959)</div> </div> </div> <!-- v475 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v475</span> <span class="tl-title">Help stopped telling users video upload doesn’t exist (#1958)</span> <span class="tl-date">28 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Drift</span> <span class="tag tag-chore">Docs</span> <span class="tag tag-chore">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>The drift</strong>: the app’s Help page said <em>“Recording upload is a Phase-2 feature — for now, provide the transcript.”</em> Video upload shipped in <strong>#1413/#1414</strong> and real transcription in <strong>#1808</strong>. Documentation that <em>denies</em> a working feature is worse than saying nothing: a user reads it and never tries. This was the unpropagated remainder of <strong>#1948</strong>, which removed the “Phase 1” pill from the intake tabs that morning but left the docs asserting the same dead phasing in stronger terms.</li> <li><strong>Found by</strong> a Help-promises-vs-implementation audit — the same lens that caught #1944’s never-rendered AiDE rationale. A sweep of the Help page for stale capability claims (Phase 1/2, coming soon, not yet available, “for now”, planned, placeholder) found this to be the <strong>only</strong> one; every other hit is fictional sample content inside the worked examples.</li> <li><strong>Fixed in three places</strong>: the app’s Help (now describes transcript / paste / recording as equal intakes, names the Project Lead+ gate on recordings, and explains that several sources make ONE outcome — #1949/#1950, previously undocumented and therefore undiscoverable), <code>help.html</code> here, and <code>PAGES.md</code>, whose “Transcript intake (Phase 1)” label contradicted the video-intake line directly beneath it.</li> <li><strong>Guarded both ways</strong>: a test asserts the new wording is present AND that the words “Phase-2” / “for now, provide the transcript” are absent — asserting only the former would still pass with the stale sentence sitting beside it, which is precisely how this survived #1948.</li> </ul></div> <div class="tl-commit">💄 mockup: v475 — Help no longer denies video intake (#1958)</div> </div> </div> <!-- v474 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v474</span> <span class="tl-title">Scheduled Reports gain Day/Time cadence fields, Token adoption gets a summary bar, Test Send asks who to send to, and Reports gains 3 web-only cards (#1874)</span> <span class="tl-date">28 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">Admin</span> <span class="tag tag-feat">Reports</span> </div> <div class="tl-desc"><ul> <li><strong>Scheduled Reports (AdminReportsScreen parity)</strong>: the Add/Edit Schedule modal only had Name / Report Type / Frequency / Recipients — no way to actually pick <em>when</em> weekly/monthly reports fire. Added the frequency-dependent Day of week / Day of month select plus a Time (IST) field, exactly mirroring the web form, and a compact “Mon · 09:00” / “Day 1 · 09:00” cadence sub-line under each row’s Frequency badge (<code>scheduleSummary()</code> on the web side).</li> <li><strong>AiDE Fabric Token adoption</strong>: the per-user connected/not-connected table had no aggregate context. Added the “<strong>4</strong> of <strong>5</strong> connected · 80%” summary header + progress bar above it, matching AdminMeetingsScreen’s token-adoption panel.</li> <li><strong>Email Templates “Test Send”</strong>: the button fired a toast straight off, with no recipient ever asked for — a demo could not show WHO the test goes to. Now opens a small modal (recipient email input, disabled Send until a valid address is entered) mirroring the web’s <code>TestSendModal</code>, from both the template-preview panel and the rendered-preview modal.</li> <li><strong>Reports — 3 new cards</strong>: <em>Cycle Time by Stage (SLA)</em> (overall avg/median/p90 + per-stage dwell time, bottleneck called out), <em>By POD & Project</em> (cycles/completion/returns/on-time per project), and <em>User Activity</em> (active-user KPIs + per-role adoption table) — all three already exist on the web ReportsScreen but had no mockup equivalent.</li> <li><strong>Direction of travel</strong>: mockup catch-up on all four — every web feature already exists, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v474 — scheduled-report cadence fields, token-adoption summary bar, Test Send recipient modal, 3 new report cards (#1874)</div> </div> </div> <!-- v473 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v473</span> <span class="tl-title">The intake tabs drop their “Phase 1” / “Live” pills — both intakes are real now (#1948)</span> <span class="tl-date">28 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Drift</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>The drift</strong>: the transcript tab still wore a green <code>Phase 1</code> pill. That label only ever meant “the video tab is not built yet” — it dates from when video intake was a disabled placeholder. Video upload went live in <strong>#1413/#1414</strong> and real whisper transcription in <strong>#1808</strong>, so the pill was advertising a phasing that no longer exists and quietly implying the sibling tab was still coming.</li> <li><strong>What landed</strong>: the pill is gone from the transcript tab, and the matching <code>Live</code> pill from the video tab. When both intakes are real, neither needs a status badge — a badge on one implies something about the other. The Project Lead+ lock pill on video <em>stays</em>: that is a live permission state, not a phasing label.</li> <li><strong>Direction of travel</strong>: shipped together with the web change (same commit), so the prototype and the app drop the label in step.</li> </ul></div> <div class="tl-commit">💄 mockup: v473 — drop the Phase 1 / Live intake pills (#1948)</div> </div> </div> <!-- v472 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v472</span> <span class="tl-title">“AiDE Summaries” is now <strong>Project Health</strong> 🩺 (#1939)</span> <span class="tl-date">28 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Rename</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Nav</span> </div> <div class="tl-desc"><ul> <li><strong>Why</strong>: the old name described <em>who wrote it</em> (AiDE) rather than <em>what it tells you</em>. “Project Health” names the answer, and the 🩺 stethoscope replaces the 🤖 robot — which also frees the robot to mean one thing across the prototype: <em>AiDE did this</em>.</li> <li><strong>Renamed</strong>: the page title + hero, the sidebar entry (<code>nav.js</code>), the index card, the Help topic + its nav row, the Admin → Scheduler toggle (“Scheduled Project Health summaries”), and the “summary generated” toast.</li> <li><strong>The page file moved too</strong>: <code>aide-summaries.html</code> → <code>project-health.html</code>, with its <code>act()</code> nav key and help-topic mapping following it, so the mockup’s URL matches the web’s new <code>/project-health</code> route. Older entries below still cite the old file name — those are records of what shipped at the time and are left alone.</li> <li><strong>Deliberately NOT renamed</strong>: the <code>data-testid</code> handles and the stored summary <code>type</code> values. Those are internal identifiers read back by exact string — renaming them would strand cached summaries and break specs, and no user ever sees either.</li> <li><strong>The 🤖 badges INSIDE the page stay</strong>: they attribute the narrative to AiDE, which is still true and still the point. Only the module name changed, not the author.</li> <li><strong>Direction of travel</strong>: shipped together with the web change (same commit) — the mockup is not catching up here, it is moving in step. The web keeps <code>/aide-summary</code> alive as a query-preserving redirect so existing deep links and ET-057 emails still land.</li> </ul></div> <div class="tl-commit">💄 mockup: v472 — rename AiDE Summaries to Project Health (#1939)</div> </div> </div> <!-- v471 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v471</span> <span class="tl-title">App-icon badge shows what’s URGENT, not what’s unread — and the demo tile panel is labelled dev-only (#1938 / #1937)</span> <span class="tl-date">28 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Drift</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">PWA</span> </div> <div class="tl-desc"><ul> <li><strong>The drift (#1938)</strong>: <code>profile.html</code> described the installed-app icon badge as “your unread notification count … clears as you read.” The web changed that in #1776/#1777 and the prototype never caught up. The OS draws a <strong>single</strong> number with no colour or split, so <code>AppShell.tsx</code> has to choose: <code>useAppBadge(myWorkCounts.immediate > 0 ? myWorkCounts.immediate : unreadCount)</code>. Anything urgent outranks passive notifications.</li> <li><strong>What landed</strong>: the badge illustration now reads “when something needs you now — overdue action items or a returned submission — that count shows … with nothing urgent outstanding it falls back to your unread notifications.” Note <code>immediate</code> is <em>overdue action items <strong>+ RETURNED submissions</strong></em> (the same numerator as the “My Work” nav badge), not overdue alone — the work item said “overdue My Work count”, which the code does not do.</li> <li><strong>#1937 was already satisfied</strong>: the audit asked for a note that the demo tiles come from the live DB, but <strong>v455 (#1795) had already rebuilt them</strong> as the three-state roster (loading / empty-with-reason / populated) and already named the real endpoint. Two corrections only: the endpoint is <code>GET /auth/dev-users</code> (<em>not</em> <code>/auth/demo-users</code> as the item claimed), and the panel is now explicitly marked <strong>dev-only</strong> — the route is registered solely when <code>ENABLE_DEV_TOKEN=true</code> and the app is not production, so it 404s in prod and no tiles can render.</li> <li><strong>Direction of travel</strong>: mockup catch-up to shipped web behaviour — no <code>impl-pending</code> item (#1776/#1777 and #1781 are both live).</li> </ul></div> <div class="tl-commit">💄 mockup: v471 — app-icon badge priority + dev-only demo tiles note (#1938, #1937)</div> </div> </div> <!-- v470 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v470</span> <span class="tl-title">Scheduler: the fake Automated Reminders table is gone — a read-only Meeting Notes AI catalog takes its place (#1239 / #1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Drift</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Scheduler</span> </div> <div class="tl-desc"><ul> <li><strong>The drift</strong>: the mockup Scheduler still showed an editable “🔔 Automated Reminders” table (per-role toggle + edit controls) and two “Active / Disabled Reminders” KPI tiles — but the web <strong>removed</strong> all of that in #1239 because every control was a no-op: the trigger types were never implemented, or the template was actually sent by an unrelated hardcoded cron that never read the table. So the prototype was advertising switches that do nothing.</li> <li><strong>What landed</strong> (matching AdminSchedulerScreen): the fake table + its two KPI tiles + the <code>toggleReminder</code>/<code>editReminder</code> handlers were removed. In their place is a <strong>read-only Meeting Notes AI Reminders catalog</strong> (R-013 Due Soon / R-014 Due Today / R-015 Overdue Escalation — ET-030–ET-032), because those action-item reminders are genuinely data-driven (per action item’s own due date & assignee) with nothing per-row to toggle. The Timeline Digest schedule controls (real) were relocated into their own card. The U&D / P&A / timeline reminder crons still fire and remain visible in the Scheduler Activity log.</li> <li><strong>Direction of travel</strong>: mockup catch-up to a web <em>removal</em> — no <code>impl-pending</code> item (the web already shipped #1239 / MNA-44).</li> </ul></div> <div class="tl-commit">💄 mockup: v470 — remove fake reminders table, add read-only MNA reminders catalog (#1874)</div> </div> </div> <!-- v469 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v469</span> <span class="tl-title">Scheduled Reports gain a per-report “Run now” action (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">Reports</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: the web Admin Reports screen (AdminReportsScreen) lets an admin send a scheduled report immediately with a per-row <em>Run now</em> button (POST <code>/admin/scheduled-reports/:id/run</code>, “sent to all recipients”) without touching the schedule. The mockup’s Scheduled Reports table offered only Edit / Pause / Delete — no way to fire a one-off send.</li> <li><strong>What landed</strong>: a <em>Run now</em> action at the front of each scheduled-report row, with a confirming toast, mirroring the web control and its “does not change the schedule” semantics.</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web action already exists, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v469 — Scheduled Reports “Run now” action (#1874)</div> </div> </div> <!-- v468 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v468</span> <span class="tl-title">P&A review shows the submitter’s “Note to Manager” (read-only) — #1209 (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">P&A</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: on the web bilateral-review screen (PMPAReviewScreen, Bug #1209) the reviewer sees the submitter’s <em>Note to Manager</em> — the optional message the submitter wrote for exactly this reviewer — in its own read-only card above the feedback box. The submit-side note already existed in the mockup (<code>pl.html</code>), but the review screen never surfaced it, so in the prototype the note was write-only: captured on submit, shown to nobody.</li> <li><strong>What landed</strong>: a <em>📝 Note to Manager from <submitter></em> card above the feedback card in <code>review.html</code>, populated per-submitter by <code>selectQueueCard()</code> from a <code>data-queue-note</code> on each queue row and hidden when that submitter left no note (Swati Nandha carries one; Gopal Krishna Tripathi does not, so switching between them shows the card appear/disappear).</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web card already exists (#1209), so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v468 — P&A review shows the submitter’s Note to Manager (#1874)</div> </div> </div> <!-- v467 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v467</span> <span class="tl-title">Dashboard gains a “Recent Cycles” table alongside the activity feed (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">Dashboard</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: the web dashboard (DashboardScreen) shows two distinct cards — the personal <em>Recent Activity</em> feed AND a <em>🔁 Recent Cycles</em> table (Status / Project / Cycle / Date, each row opening the cycle, with a “View all cycles” link). The mockup dashboard had only the activity feed, so the recent-cycles-at-a-glance surface was missing.</li> <li><strong>What landed</strong>: a <em>🔁 Recent Cycles</em> card between the activity feed and Quick Links, matching the web columns and status-pill language, with clickable rows and a “View all cycles” link to Cycle History.</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web card already exists, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v467 — Dashboard Recent Cycles table (#1874)</div> </div> </div> <!-- v466 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v466</span> <span class="tl-title">MCP Interactions log gains a “Per-tool health” rollup — error rate + latency percentiles (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">MCP</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: the web MCP Interactions log (AdminMcpLogScreen, #960 AC3) carries a “🩺 Per-tool health” card — a per-tool rollup of call count, error rate (with 4xx / 5xx split) and latency percentiles (avg / p50 / p95 / p99) so an admin can spot a failing or slow tool without eyeballing raw rows. The mockup log only had the raw interaction table + filters.</li> <li><strong>What landed</strong>: a “🩺 Per-tool health” card above the interactions table, computed client-side from the interaction set grouped by tool (<code>renderMcpRollups()</code>), with an error-rate badge (red ≥10%, amber if any error) and a slow-p95 flag (≥1000 ms), mirroring the web card’s columns and thresholds.</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web card already exists, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v466 — MCP log Per-tool health rollup (#1874)</div> </div> </div> <!-- v465 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v465</span> <span class="tl-title">Admin Email Log gains From / To date filters (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">Email Log</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: the web Admin Email Log (AdminEmailLogScreen) filters by a <em>From</em> / <em>To</em> date range (its <code>f-from</code> / <code>f-to</code> pickers), but the mockup register only offered search / status / type / template — no way to narrow the log to a date window, even though the mockup already uses date-range filters on the Scheduler Activity and Audit Log tabs.</li> <li><strong>What landed</strong>: <em>From</em> and <em>To</em> <code><input type="date"></code> controls (<code>email-log-from</code> / <code>email-log-to</code>) that narrow the table on the send date, wired into <code>renderEmailLog()</code> and reset by <code>clearEmailLogFilters()</code>.</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web filters already exist, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v465 — Email Log From/To date filters (#1874)</div> </div> </div> <!-- v464 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v464</span> <span class="tl-title">Audit Log gains an Entity column — every row shows its entity discriminator (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">Audit</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: the web Audit Log (AdminAuditLogScreen) tags every row with its <em>entity</em> discriminator as its own column — Cycle, Priorities & Achievements, Meeting Notes, Sign-in, Access Token, Reporting, and so on — so a reviewer can see at a glance <em>what kind of record</em> each event touched. The mockup already had the entity <em>filter</em> and the entity in its data, but the table itself never showed the column, so filtering by entity gave no visible confirmation in the rows.</li> <li><strong>What landed</strong>: an <em>Entity</em> column between Event and Project / Module, rendering the same friendly labels as the web (<code>AUDIT_ENTITY_LABELS</code>), plus the two <code>colspan</code> values (empty-state + change-detail rows) bumped 7→8 to match.</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web column already exists, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v464 — Audit Log Entity column (#1874)</div> </div> </div> <!-- v463 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v463</span> <span class="tl-title">Meetings register gains the AiDE “Processing failed” state — KPI, filter and pill (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> <span class="tag tag-feat">Meetings</span> </div> <div class="tl-desc"><ul> <li><strong>The 4th AiDE state</strong>: the API derives a <code>failed</code> meeting state (a run that is <em>processing</em> but recorded an <code>aideError</code>), and the web register surfaces it as its own KPI tile, a Status-filter option and a red “⚠️ Processing failed” pill. The mockup register only knew <em>draft / processing / ready</em> plus the #993 <em>Stuck</em> flag — so a reviewer comparing the two saw a state the product has but the prototype didn’t.</li> <li><strong>What landed</strong>: a <em>Processing Failed</em> stat card (<code>mtg-stat-failed</code>), a <code>Processing failed</code> option in the Status filter, a <code>.status-pill.failed</code> / <code>.mtg-cal-chip.st-failed</code> style, and a sample failed meeting whose <code>aideError</code> reason renders under the pill (and in the calendar chip). Distinct from #993 <em>Stuck</em>, which is a crashed run that never recorded an error.</li> <li><strong>Direction of travel</strong>: mockup catch-up — the web surface already exists (AdminMeetingsScreen), so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v463 — meetings register “Processing failed” KPI + filter + pill (#1874)</div> </div> </div> <!-- v462 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v462</span> <span class="tl-title">My Work gains the “Returned to you” tile and the dashboard gains a Reporting Relationships quick link (#1874)</span> <span class="tl-date">27 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Re-sync</span> </div> <div class="tl-desc"><ul> <li><strong>Two small mockup↔web catch-ups</strong> from a full parity audit. The web My Work screen shows <strong>five</strong> summary tiles including a <em>Returned to you</em> count (#1755); the mockup had only four, so a reviewer comparing them saw a gap that does not exist in the product. Added the fifth tile.</li> <li><strong>Dashboard Quick Links</strong>: the web dashboard offers a <em>Reporting Relationships</em> shortcut alongside Cycle History, Timeline, Profile and Reports; the mockup was missing it. Added so the two Quick-Links cards match.</li> <li><strong>Direction of travel</strong>: this row follows the implementation — both surfaces already exist in the web app, so this is mockup catch-up with no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">💄 mockup: v462 — My Work “Returned to you” tile + dashboard Reporting Relationships link (#1874)</div> </div> </div> <!-- v461 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v461</span> <span class="tl-title">ONE page-level Help button in the topbar, plus My Work & AiDE Summaries help topics (#1870/#1869)</span> <span class="tl-date">26 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">UX</span> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Help</span> </div> <div class="tl-desc"><ul> <li><strong>The problem</strong>: the Help control was drawn per page, so it landed somewhere different on each one — the hero on My Work, the page header on the Admin tabs, a toolbar on Reports, the card header on Timeline and Meeting Notes AI — and most pages had none at all. A help affordance you have to hunt for is not doing its job.</li> <li><strong>One button, one place</strong>: <code>assets/js/nav.js</code> now renders <code>#topbar-help-btn</code> in <code>.topbar-right</code>, beside the theme / search / bell cluster, on every page that uses the shared shell. All <strong>35</strong> per-page Help controls removed (15 of them were the repeated per-tab link in <code>admin/index.html</code> alone).</li> <li><strong>It is context-aware, not generic</strong>: a page → topic map in <code>nav.js</code> (mirroring <code>src/web/src/utils/helpRoute.ts</code>) opens <code>help.html#<topic></code> for the page you are on, ordered most-specific-first so <code>admin/audit-log</code> does not get swallowed by <code>admin/</code>.</li> <li><strong>Two new help topics</strong>: <em>My Work</em> and <em>AiDE Summaries</em> — both modules shipped without one, so their Help button had nowhere correct to point. Added to the left nav and as full sections in <code>help.html</code>.</li> <li><strong>Direction of travel</strong>: this row follows the implementation rather than leading it — the web change landed in the same commit, so there is no <code>impl-pending</code> item to raise.</li> </ul></div> <div class="tl-commit">✨ feat(web): 45 help videos, 2 new help topics, and ONE page-level Help button (#1867–#1870)</div> </div> </div> <!-- v460 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v460</span> <span class="tl-title">Admin Scheduler Settings: Scheduled AiDE Summaries toggle (from-impl parity, #1838)</span> <span class="tl-date">26 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-chore">Admin</span> </div> <div class="tl-desc"><ul> <li><strong>Toggle added</strong>: <code>admin/index.html</code> Global Automation Settings now carries a <em>Scheduled AiDE Summaries</em> switch beside Auto-Create Cycles and Send Notifications, with the shipped helper text (“the weekly/monthly summary emails for users who opted in. Off by default.”).</li> <li><strong>Why it was missing</strong>: two sessions implemented #1831 independently. Origin kept the other session’s commit; the local duplicate was dropped in the rebase and took this mockup row with it, leaving the web with a control the mockup did not show.</li> <li>The web also disables the control while <em>Disable All Automation</em> is on. The mockup’s kill switch only raises the banner, so that state is deliberately not simulated — noted inline.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v460 — Scheduled AiDE Summaries toggle in Scheduler Settings (#1838)</div> </div> </div> <!-- v459 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v459 — Done</span> <span class="tl-title">Parity audit 2026-07-26 #1827: remove orphan card-todo-ribbon span from AiDE Summaries index card</span> <span class="tl-date">26 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity audit</span> <span class="tag tag-chore">Maintenance</span> </div> <div class="tl-desc"><ul> <li><strong>Orphan span removed</strong>: <code>index.html</code> AiDE Summaries card (line 191) had a stale <code><span class="card-todo-ribbon"></span></code> from when #1821 was closed. The parent <code><a></code> had no <code>page-card--todo</code> class so the ribbon was invisible — but it was unnecessary dead HTML. Removed.</li> <li>Full 3-day parity audit 2026-07-26 (#1827): all 15 mockup/web page pairs checked — no new impl-pending or mockup-pending gaps found.</li> <li>Last-audit date updated in <code>.aiderules</code>.</li> </ul></div> <div class="tl-commit">📝 mockup(parity): v459 — orphan card-todo-ribbon removed from AiDE Summaries index card (#1827)</div> </div> </div> <!-- v458 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v458 — Done</span> <span class="tl-title">Parity audit 2026-07-26: login.html privileged-tile padlock badge + dev passphrase prompt (#1783 parity, #1825)</span> <span class="tl-date">26 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity audit</span> <span class="tag tag-sec">Security UX</span> </div> <div class="tl-desc"><ul> <li><strong>Privileged tile padlock badge</strong>: the Administrator demo tile (<code>vishnu.goluguri@valuelabs.com</code>) now displays a 🔒 badge in its name cell, matching the <code>demo-hint-lock</code> span added in <code>LoginScreen.tsx</code> (#1783). All other tiles are unchanged.</li> <li><strong>Dev passphrase prompt</strong>: clicking an admin-holding tile opens an inline prompt (styled amber box, password input, Sign in / Cancel buttons) instead of logging in directly. On submit the passphrase is stored in <code>sessionStorage</code> (mirrors <code>devTokenSecret.ts</code>) and the sign-in proceeds. A wrong passphrase would show an error in the real app; the mockup always accepts so the UX flow is demonstrable without a live API.</li> <li><code>DEMO_TILES[0]</code> updated with <code>privileged: true</code> — matches the <code>DevRosterUser.privileged</code> shape in <code>demoRoster.ts</code>.</li> <li>Three new JS helpers added: <code>showPrivilegedPrompt(email, name)</code>, <code>cancelPrivilegedPrompt()</code>, <code>submitPrivilegedPassphrase()</code> — wired to the prompt's buttons.</li> <li>AzDO #1825 azref chip added to the demo hint panel; filed as <em>from-impl; mockup-pending</em> PBI, immediately resolved in this commit.</li> <li>Full 3-day parity audit (2026-07-26): no other gaps found — Co-Sales SPOC review-chain already reflected in workflow mockups (#1790), AiDE Summaries schedule toggles and Achievements enrichment already in <code>aide-summaries.html</code>, all admin sections present.</li> </ul></div> <div class="tl-commit">📝 mockup(parity): v458 — login.html privileged-tile padlock + passphrase prompt (#1783 parity, #1825)</div> </div> </div> <!-- v457 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v457 — Done</span> <span class="tl-title">Parity audit 2026-07-25: resolve merge conflicts, remove stale azref chips (#1809/#1673/#1811), update MNA and AiDE Summaries cards (#1818)</span> <span class="tl-date">25 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity audit</span> <span class="tag tag-chore">Maintenance</span> </div> <div class="tl-desc"><ul> <li><strong>Resolved git merge conflicts</strong> in both <code>index.html</code> and <code>history.html</code> left by the cherry-pick of commit 39cfb6fa (v454) — HEAD wins in all three conflict blocks.</li> <li><strong>Removed stale azref chip #1809</strong> from the Meeting Notes AI card — AzDO #1809 (MNA mockup transcribe-ready state) is <strong>Done</strong>; the feature was shipped in v454.</li> <li><strong>Removed stale azref chip #1673</strong> from the Meeting Notes AI card — AzDO #1673 is <strong>Removed</strong> (superseded by #1808, which fully implemented the video→transcript pipeline).</li> <li><strong>Removed stale azref chip #1811</strong> from the AiDE Summaries card — AzDO #1811 is <strong>Done</strong>; the full AiDE Summaries screen and API were shipped in the same session.</li> <li><strong>Removed <code>page-card--todo</code> treatment</strong> from both the Meeting Notes AI and AiDE Summaries cards (dashed border, 🚧 ribbon, tag-todo pill) — both features are now fully implemented in the React app.</li> <li><strong>Updated MNA card description</strong> to reflect the completed pipeline: <em>"Video upload and transcription are implemented (upload recording → Generate transcript → AiDE MoM pipeline)."</em></li> <li>Full 3-day parity audit (due 2026-07-25, last audit 2026-07-21): no new impl-pending or mockup-pending gaps found beyond the stale chips cleaned up above.</li> </ul></div> <div class="tl-commit">📝 mockup(parity): v457 — merge-conflict fix + stale azref cleanup + MNA & AiDE Summaries cards updated (#1818)</div> </div> </div> <!-- v456 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v456 — Done</span> <span class="tl-title">AiDE Summaries tweaks: Delivery Health rename, allocation %, evidence source, approval status, trend, tabs (#1810)</span> <span class="tl-date">25 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">AiDE</span> <span class="tag tag-feat">Refinement</span> </div> <div class="tl-desc"><ul> <li><strong>Renamed the momentum score to "Delivery Health"</strong> across the monthly & weekly views.</li> <li><strong>Period-over-period trend</strong> added next to the score — a ▲/▼ delta vs the previous week/month plus a 3-period sparkline, so the summary reads as a trajectory, not a point-in-time. (July 82, ▲ +6 vs June; W30 76, ▼ −2 vs W29.)</li> <li><strong>Compact score header strip</strong> — the score donut, grade, delta, trend and executive summary now sit in one slim band instead of a tall block, freeing space for the narrative.</li> <li><strong>Sections collapsed into tabs</strong> — Achievements / Meetings / Risks / Highlights are now tabs (with counts) rather than one long scroll.</li> <li><strong>Each mapped associate now shows their project allocation %</strong> (mini-bar) and their <strong>P&A approval status</strong> (✅ approved / 🕓 pending / ↩ returned). A note explains AiDE weights approved, well-staffed work more heavily — reinforcing that the score is AiDE's judgment, not arithmetic.</li> <li><strong>Added a 4th source: 📎 Evidence & attachments</strong> — files on timeline events and meetings that AiDE cites; surfaced in the sources panel, on achievement lines (EVIDENCE tag) and in the attribution footer.</li> <li><strong>The "AiDE token connected" chip now also shows on the SPOC / POD / PMO reviewer pages and the P&A PL / Cluster-Head pages</strong> (user asked for it for consistency across the workflow, even though those pages surface AiDE as a priority category rather than a token-calling feature).</li> <li>Extends the AiDE Summaries feature (#1810). No new impl item — folded into #1811.</li> </ul></div> <div class="tl-commit">✨ mockup(aide-summaries): v456 — Delivery Health rename, allocation %, evidence, approval status, trend & tabs (#1810)</div> </div> </div> <!-- v455 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v455 — Done</span> <span class="tl-title">"AiDE token connected" status chip on every AiDE-integrated page (#1810)</span> <span class="tl-date">25 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">AiDE</span> <span class="tag tag-feat">Consistency</span> </div> <div class="tl-desc"><ul> <li><strong>Only some AiDE screens told you whether your token was connected.</strong> Meeting Notes AI had a Connect/connected button in its own toolbar, and the new AiDE Summaries screen showed a green chip — but the U&D AiDE draft (PL), reviewer brief (PM), risk radar (Cluster Head), the P&A said-vs-done review, and Reports insights all called AiDE with no visible token status at all. If your token was missing or expired you only found out when the feature failed.</li> <li><strong>One shared status chip, in the topbar, on every AiDE page.</strong> Added an opt-in <code>PGNav.render({ aide:true })</code> flag to the shared <code>assets/js/nav.js</code>; it injects a single <strong>🟢 "AiDE token connected"</strong> chip (or an amber <strong>🔑 "Connect AiDE token"</strong> link to Profile when it isn't) into the top navigation bar — same element, same place, every time.</li> <li><strong>It reads the SAME token as Meeting Notes AI</strong> (<code>localStorage.pg_aide_token</code>), so the topbar chip and that page's own Connect button can never disagree: connect once and every AiDE screen flips to green together; the chip goes back to amber the moment the token is removed.</li> <li>Enabled on the six AiDE-integrated pages — <code>meeting-notes-ai.html</code>, <code>reports.html</code>, <code>priorities/review.html</code>, <code>workflow/pl.html</code>, <code>workflow/pm.html</code>, <code>workflow/cluster-head.html</code> — plus <code>aide-summaries.html</code>, whose page-local chip was removed in favour of the shared one. Non-AiDE pages are unaffected. Hidden below 600px to keep the mobile topbar uncluttered.</li> <li>Extends the AiDE Summaries work (#1810). No new impl item — the real app already tracks token status via <code>useAideTokenStatus</code> / <code>AideTokenErrorHint</code>; #1811 covers surfacing it consistently across the AiDE screens.</li> </ul></div> <div class="tl-commit">✨ mockup(nav): v455 — AiDE token status chip on every AiDE page (#1810)</div> </div> </div> <!-- v454 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v454 — Done</span> <span class="tl-title">New screen: AiDE Summaries — AiDE-authored weekly & monthly project summaries (#1810)</span> <span class="tl-date">25 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">AiDE</span> <span class="tag tag-feat">New screen</span> </div> <div class="tl-desc"><ul> <li><strong>The three governance signals for a project were never brought together.</strong> The Project Timeline, the Meeting Notes AI outcomes of meetings linked to a project, and the Priorities & Achievements of the people mapped to it all lived in separate screens — so writing a weekly or monthly status meant opening three places and stitching them by hand.</li> <li><strong>New <code>aide-summaries.html</code> screen</strong> asks AiDE to write that summary. Pick a project and a <strong>Week</strong> or <strong>Month</strong>; AiDE reads all three sources for that period and returns one shareable narrative — an executive summary, <strong>key achievements grouped by associate</strong> (each tagged with its source: 🎯 P&A or 🗓️ Timeline), <strong>meeting outcomes</strong> that deep-link back into Meeting Notes AI, risks & lowlights, and highlights.</li> <li><strong>Achievements come from the mapped associates, not just the poster.</strong> The demo groups Kuntal Singha (PL), Gopal Krishna Tripathi (PM) and two Project Contributors reached through the P&A reporting chain — mirroring the real join <code>ProjectMember.projectId → userId → PriorityItem(type=achievement)</code> plus reporting-graph contributors.</li> <li><strong>A momentum score gauge</strong> (SVG donut, mirrors <code>ReportsScreen</code>'s <code>AideDonut</code>) sits atop the narrative — captioned explicitly as <strong>AiDE's own holistic 0–100 verdict, not a ratio computed from the source counts</strong>, per the said-vs-done precedent. A "Sources AiDE will read" panel shows the per-period counts up front so the aggregation is visible.</li> <li><strong>Copy / PDF / email export</strong> on the output, plus an <strong>Auto-generate & deliver</strong> card (weekly Monday, monthly on the 1st) that stands in for scheduled unattended runs delivered through the notification pipeline — each run using the viewer's own AiDE token.</li> <li>Wired into the shared sidebar (<code>assets/js/nav.js</code>, Workflow group, same audience as the Project Timeline) and the index gallery. Created feature PBI <strong>#1810</strong> and dependent implementation PBI <strong>#1811</strong> (New, unassigned, <code>impl-pending; from-mockup</code>) to extend <code>aideClient.ts</code>'s schema and build the web + API surface.</li> </ul></div> <div class="tl-commit">✨ mockup(aide-summaries): v454 — AiDE weekly & monthly project summaries (#1810)</div> </div> </div> <!-- v453 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v453 — Done</span> <span class="tl-title">Admin mockup: ⚙️ Customise view added to all five register tables — meetings, audit log, email log, MCP log, scheduler run history (#1077/#1801)</span> <span class="tl-date">24 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin</span> <span class="tag tag-feat">Customise View</span> </div> <div class="tl-desc"><ul> <li><strong>Meetings register</strong>: ⚙️ Customise button added to the card-header toolbar, alongside the List/Calendar view toggle.</li> <li><strong>Audit Log register</strong>: ⚙️ Customise button added to the card-header alongside “Most recent first”.</li> <li><strong>Email Log register</strong>: ⚙️ Customise button added to the card-header alongside “Most recent first”.</li> <li><strong>MCP Interaction Log</strong>: ⚙️ Customise button added to the quick-search toolbar row.</li> <li><strong>Scheduler Run History</strong>: ⚙️ Customise button added alongside “⬇ Export CSV” in the Run History card-header.</li> <li><strong>Shared modal</strong>: <code>openCustomiseView(section)</code> opens a full-featured dialog mirroring <code>CustomiseViewModal.tsx</code> — column checkboxes (pinned columns locked with 🔒), density radio (comfortable / compact), rows-per-page select (5, 10, 25, 50, 100, All), saved-views list (apply / ★ default / delete / save by name), ↻ Reset to defaults.</li> <li>Column visibility drives live <code>cell.style.display</code> toggling on the table; density applies <code>.density-compact</code>. All five sections have their own isolated <code>CV_STATE</code> object.</li> <li>Mockup-only, no impl-pending item needed — all five real screens already ship this under <strong>#1077</strong>; this closes the #1801 gap.</li> </ul></div> <div class="tl-commit">💤 mockup(admin): v453 — ⚙️ Customise view added to all five admin register tables (#1801)</div> </div> </div> <!-- v452 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v452</span> <span class="tl-title">Meeting Notes AI mockup: full POD-link concept added — MNA_PODS roster, POD chip, project-or-POD select, Change link control, series/calendar POD support (#1799)</span> <span class="tl-date">24 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> <span class="tag tag-feat">POD</span> </div> <div class="tl-desc"><ul> <li><strong>Added <code>MNA_PODS</code> data array</strong> (two demo PODs with <code>members[]</code> rosters) + <code>podOf()</code> lookup + <code>podChipHtml()</code> (purple 🪷 chip, mirroring <code>MeetingDetailScreen.tsx</code>'s <code>meeting-detail-pod-chip</code> testid).</li> <li><strong>Demo data: one POD-linked meeting <code>M-1044</code> and a POD-linked series <code>SR-02</code></strong> — exercises every new path (detail header chip, list card chip, series row chip, calendar chip, filter).</li> <li><strong>List filter select</strong> widened from project-only to project-or-POD: two <code><optgroup></code>s (<em>Projects</em> / <em>PODs</em>), <code>proj:</code>/<code>pod:</code> namespace prefixes, matching <code>AdminMeetingsScreen.tsx</code>’s pattern. Filter logic updated: “linked” matches either, “none” excludes both, <code>pod:<id></code> isolates a POD.</li> <li><strong>Detail header</strong>: POD 🪷 chip alongside existing project chip; <em>Change link</em> control (one select, two optgroups) offered to <code>canEditAide</code> users, wired to new <code>saveProjectLink()</code> that patches <code>m.projectId</code> or <code>m.podId</code> XOR-style.</li> <li><strong>Create-modal step 3</strong> label changed to “Link to project or POD”; select gains a PODs optgroup; selecting a POD calls <code>cmPodChanged()</code> which previews the POD roster and offers “Add all team” — exactly mirroring <code>CreateMeetingModal.tsx</code>’s <code>handleLinkChange</code>/<code>handlePodChange</code>. New <code>cmLinkChanged()</code> dispatcher replaces <code>cmProjectChanged</code> as the <code>onchange</code> handler.</li> <li><strong>Series row</strong>, <strong>calendar chip</strong>, <strong><code>addOccurrence()</code></strong>, <strong><code>createMeeting()</code></strong>, and <strong><code>cmPrefillFrom()</code></strong> all updated to propagate <code>podId</code>, matching <code>MeetingDetailScreen.tsx</code> / <code>CreateMeetingModal.tsx</code> behaviour exactly.</li> <li>Mockup-only, no impl-pending item needed — all features already ship under <strong>#1757</strong>; this closes the #1799 gap.</li> </ul></div> <div class="tl-commit">📝 mockup(meetings): v452 — full POD-link concept (MNA_PODS, chip, select, Change link, series, calendar) (#1799)</div> </div> </div> <!-- v451 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v451 — Done</span> <span class="tl-title">My Work mockup: trim stale Timeline escalation row from “Awaiting your review” (#1803)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-feat">My Work</span> </div> <div class="tl-desc"><ul> <li><strong>Removed the “Timeline escalation — UAT sign-off risk” row</strong> from the <em>Awaiting your review</em> section in <code>mockup/my-work.html</code>. This row has existed since the v304-era mockup (~8 months ago) as aspirational design but was never backed by the real <code>GET /api/v1/my-work</code> endpoint — which only ever aggregates <code>kind: 'upsdowns'</code> and <code>kind: 'pa'</code> items. There is no timeline-escalation acknowledgement concept anywhere in the codebase (no DB column, no API route, no frontend type in <code>MyWorkScreen.tsx</code>), confirmed by a grep sweep. <code>aideRiskRadarService.ts</code> itself notes the <code>TimelineEvent 'escalation'</code> type has no queryable backing model.</li> <li><strong>Corrected the derived counts</strong>: the <em>Awaiting your review</em> summary tile (3→2), the hero badge <code>⚠ 3/11</code>→<code>⚠ 2/10</code> (immediate and total both drop by 1), and the tooltip text.</li> <li>Mockup-only, no impl-pending item — the trimmed row was already a gap pointing in the <em>wrong</em> direction (mockup richer than reality); removing it closes the gap rather than creating one. AzDO #1803.</li> </ul></div> <div class="tl-commit">🗑️ mockup(my-work): v451 — trim stale timeline-escalation awaiting-review row (#1803)</div> </div> </div> <!-- v450 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v450 — Done</span> <span class="tl-title">U&D workflow mockups: lock the FULL edit surface after an action, not just the action bar (#1796)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-feat">U&D</span> </div> <div class="tl-desc"><ul> <li><strong>The real screens (<code>DeliverySpocScreen.tsx</code>/<code>SalesSpocScreen.tsx</code>/<code>PMScreen.tsx</code>/<code>PODOwnerScreen.tsx</code>/<code>ClusterHeadScreen.tsx</code>) all compute <code>canEdit</code> from the same “is it my turn” guard as the action bar (#1766)</strong> — item Edit/Delete, add-Up/add-Down rows, the file-upload widget, and the AiDE & Other Topics notes all lock together once a reviewer has acted. All 4 workflow mockups' shared <code>wfLockActionBar()</code> demo logic only ever disabled the <code>.action-bar</code> buttons after Forward/Return/Override-Close — the rest of the edit surface stayed fully live.</li> <li><strong>Added a matching <code>wfLockEditSurface()</code></strong> to <code>spoc.html</code>, <code>pod.html</code>, and <code>pm.html</code>, called alongside every existing <code>wfLockActionBar()</code> call site (Approve, Return, Override-Close where present): re-renders the Ups/Downs lists read-only, hides the add-item rows, switches the topic notes to <code>WFPreview.renderTopicNotes({ editable: false })</code>, and disables the file-upload zone.</li> <li><strong><code>cluster-head.html</code> turned out to have NO edit-surface lock <em>or</em> action-bar lock at all</strong> on Final Approve/Override-Close (the ticket's claim that it shared <code>spoc.html</code>'s <code>wfLockActionBar()</code> logic didn't hold on inspection — worth flagging since audit descriptions aren't always accurate) — added <code>wfLockEditSurface()</code> there too, wired into <code>wfFinalApprove()</code> and <code>wfSubmitOverrideClose()</code>, matching <code>ClusterHeadScreen.tsx</code>'s own <code>canEdit = cycleInfo.status === 'pod_approved' && !approved</code> gate. Its Return-to-POD-Owner path has never shown any lock/success state in this file at all (a separate, pre-existing gap) and was deliberately left untouched rather than folded into this fix.</li> <li><strong><code>pm.html</code> needed a different mechanism</strong>: unlike the other 3 files, its per-item Edit/Remove buttons are baked into the markup at insert time and edits mutate the DOM directly rather than re-rendering from a <code>readOnly</code>-aware data array — so its <code>wfLockEditSurface()</code> hides the existing Edit/Remove buttons in place (🕘 History stays, matching every sibling file) instead of re-rendering the list.</li> <li>Verified with a jsdom-backed Node harness (borrowed from <code>src/web</code>'s own dependency) across all 4 files: Edit/Remove affordances present before locking and gone after, add-item rows hidden, upload zone disabled, and <code>WFPreview.renderTopicNotes</code> called with <code>editable:false</code> — plus, for pm.html specifically, that the 🕘 History button stays visible while Edit/Remove don't.</li> <li>Mockup-only, no impl-pending item needed — #1766's <code>canEdit</code> gate already shipped across all 5 real screens; this only brings the workflow mockups' demo lock into parity with it.</li> </ul></div> <div class="tl-commit">🐛 mockup(workflow): v450 — lock the full edit surface after an action (#1796)</div> </div> </div> <!-- v449 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v449 — Done</span> <span class="tl-title">U&D workflow mockups: Co-Sales SPOC added to the reviewer chain (#1797)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">Parity</span> <span class="tag tag-feat">U&D</span> </div> <div class="tl-desc"><ul> <li><strong>The real API (<code>assertCanOverrideClose</code> / <code>reviewScopeFor</code> in <code>cycles.ts</code>/<code>myWorkService.ts</code>) treats a project's optional Co-Sales SPOC (<code>salesSpocCoId</code>, #1790/GAP-915) as fully equal to the primary Sales SPOC</strong> — either may review, forward, return, or override-close a cycle — and it's already shown once in <code>admin/admin.js</code>'s project detail (“Sales SPOC: Name / Name”). None of the 4 U&D workflow mockups mentioned the possibility of a second Sales SPOC anywhere.</li> <li><strong><code>workflow/cluster-head.html</code> and <code>workflow/pmo.html</code></strong> have an actual Review Chain table with a reviewer-name cell — added the same muted “/ Neelanjana Jaswal” span next to “Sekhar Posina” that <code>admin.js</code> uses, with a title tooltip explaining the equal-rights relationship.</li> <li><strong><code>workflow/spoc.html</code> and <code>workflow/pod.html</code> have no such table</strong> (the Sales SPOC step is a stepper pill/chain-label with no name, and the only reviewer name lives in the JS-driven audit trail) — added a <code>comment</code> to the existing Sales SPOC audit-trail entry in both files stating the Co-Sales SPOC's equal review rights, using the audit renderer's existing (unchanged) comment-block support rather than adding new rendering code.</li> <li>Verified: <code>node --check</code> clean on all 5 inline scripts per file across all 4 files; a standalone Node harness confirmed <code>renderAuditTrail()</code> in both spoc.html and pod.html actually renders the new comment text from their real <code>PG_DEMO.audit</code> data.</li> <li>Mockup-only, no impl-pending item needed — #1790's Co-Sales SPOC parity already shipped in the real API; this only brings the U&D workflow mockups' reviewer-chain display into parity with it.</li> </ul></div> <div class="tl-commit">✨ mockup(workflow): v449 — Co-Sales SPOC added to the reviewer chain (#1797)</div> </div> </div> <!-- v448 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v448 — Done</span> <span class="tl-title">Admin: meetings register gains a POD filter group + badge (#1800)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin</span> <span class="tag tag-fix">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>The real <code>AdminMeetingsScreen.tsx</code> (#1757) added a POD half to its Project/POD filter and badge</strong> — a meeting links to a project OR a POD, never both — but <code>admin/index.html</code>'s meetings register filter stayed Project-only (hardcoded P001/P009 options) with no POD group or badge anywhere.</li> <li><strong>Read the real screen's exact contract</strong> (<code>projectFilter</code> values namespaced <code>proj:<id></code>/<code>pod:<id></code>, “Common” meaning no project AND no POD, the row badge showing 🔗 for a project or 🫧 for a POD) and mirrored it: added a <code><optgroup label="PODs"></code> with <code>pod:POD-001</code>/<code>pod:POD-002</code> options, updated <code>renderAdminMeetings()</code>'s filter so <code>none</code> now excludes POD-linked rows too and a <code>pod:</code>-prefixed value isolates that POD, and updated the project/POD cell to render a distinct purple 🫧 badge when a meeting has <code>pod</code> set instead of <code>project</code>.</li> <li><strong>Gave two existing “common” demo meetings a POD link</strong> to exercise the new group end-to-end: <code>M-1043</code> (Cluster Delivery Review) → POD Basu, <code>M-1041</code> (ESO Enablement Weekly) → POD Ananth.</li> <li>Verified with a standalone Node harness (eval <code>admin.js</code> directly, stub <code>document</code>/<code>window.location</code>): each <code>pod:</code> filter isolates exactly its own meeting and shows the right badge, <code>none</code> now correctly excludes both project- and POD-linked rows, and the pre-existing project-only filters (<code>P001</code>, <code>linked</code>) are unaffected by the change.</li> <li>Mockup-only, no impl-pending item needed — the real filter/badge behavior already shipped under #1757; this only brings the mockup's admin register into parity with it.</li> </ul></div> <div class="tl-commit">✨ mockup(admin): v448 — meetings register POD filter + badge (#1800)</div> </div> </div> <!-- v447 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v447 — Done</span> <span class="tl-title">MCP Guide: tool count/catalog stale at 54, real server exposes 61 (#1802)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">MCP Guide</span> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li><strong>mockup/mcp-guide.html said “54 tools” in 4 places</strong> and its catalog listed only 54 — deliberately NOT bulk-fixed alongside profile.html's #1793 count correction, since bumping the headline number to 61 without the matching ~7 new catalog entries would have made the page WORSE (count says 61, list shows 54).</li> <li><strong>Read the real MCP server's tool registrations</strong> (<code>src/mcp/src/tools/*.ts</code>, six <code>register*Tools()</code> modules totalling 61 <code>server.registerTool()</code> calls) to find exactly which 7 are missing from the mockup catalog: all seven are the AiDE-powered advisory tools added under #1424/#1466 — <code>draft_cycle_updown</code> & <code>get_cycle_reviewer_brief</code> (Cycle Workflow), <code>get_pa_said_vs_done</code> (Priorities & Achievements), <code>get_risk_radar</code>, <code>get_reports_aide_commentary</code> & <code>ask_aide_reports_query</code> (Reports & Admin), and <code>get_meeting_series_intelligence</code> (Meeting Notes AI).</li> <li>Added all 7 as <code>.tool-card</code> entries in their existing category (no new section needed), each tagged with a small “AiDE” chip since every one requires the caller's own AiDE Fabric Token and is advisory-only (nothing written). Bumped the count in all 4 places (nav link, 2 comparison-table mentions, catalog heading) from 54 to 61.</li> <li>Verified: <code>tool-card</code> element count now matches 61 exactly; no remaining “54” references anywhere in the file; inline <code><script></code> re-checked with <code>node --check</code>.</li> <li>Mockup-only, no impl-pending item needed — all 7 tools already exist and work in the real MCP server; this only brings the mockup's own documentation catalog into parity with it.</li> </ul></div> <div class="tl-commit">🐛 mockup(mcp-guide): v447 — tool count/catalog corrected to 61 (#1802)</div> </div> </div> <!-- v446 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v446 — Done</span> <span class="tl-title">Login: demo roster mirrors the real three-state fetch instead of a static button grid (#1795)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-docs">Login</span> </div> <div class="tl-desc"><ul> <li><strong>The mockup's 27 demo-login tiles were hardcoded static <code><button></code> elements</strong>, unrelated to the separate <code>DEMO_USERS</code> object used only for <code>simulateLogin()</code> validation — so the mockup could never show what the real <code>LoginScreen.tsx</code> does under <code>GET /auth/dev-users</code> (#1781): the roster is a live DB read that can legitimately come back loading, populated, or empty (e.g. a masked environment whose nightly re-seed hasn't run).</li> <li><strong>Replaced the static grid with a <code>DEMO_TILES</code> array + <code>renderDemoTiles()</code></strong> driven by a <code>demoTilesState</code> variable (<code>null</code> = loading, <code>[]</code> = a real "nothing to offer" answer, populated array = the roster) — the same three states <code>LoginScreen.tsx</code> models with <code>demoTiles</code>. On load the panel shows the loading text, then a simulated fetch (<code>setTimeout</code>, no backend to call from a static page) resolves to the populated grid, with testids (<code>demo-roster-loading</code>/<code>demo-roster-empty</code>/<code>demo-hint-grid</code>/<code>demo-btn-<email></code>) and copy matching the real screen exactly.</li> <li><strong>Added a “preview: empty roster” toggle</strong> next to the panel header (mirroring the existing “🧪 Demo — login scenarios” chip-row pattern elsewhere on this page) so a reviewer can see the empty-with-reason state on demand instead of only ever seeing the populated grid.</li> <li>Verified with a standalone Node harness (extract the inline <code><script></code>, stub <code>document</code>): loading state renders first, the populated grid renders all 27 tiles with the correct testids/badge labels (incl. the PM tile's differing badge text), the empty-preview toggle swaps in the real empty-state copy, and toggling back off restores the populated grid.</li> <li>Mockup-only, no impl-pending item needed — the real three-state behavior already shipped in <code>LoginScreen.tsx</code> under #1781; this only brings the mockup's demo affordance into parity with it.</li> </ul></div> <div class="tl-commit">🐛 mockup(login): v446 — demo roster mirrors the real three-state fetch (#1795)</div> </div> </div> <!-- v445 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v445 — Done</span> <span class="tl-title">Meeting Notes AI: build the series “add participant to all occurrences” picker (#1798)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>Picked up #1798</strong> from the v444 parity audit's own backlog: the real <code>SeriesOwnersPanel</code> (built earlier today under #1785/#1792) has TWO series-level pickers — nominate a series co-owner, AND add a participant to every occurrence — but the mockup only ever had the first one. <code>seriesOwnersHtml()</code> now renders a second <code><select></code>, and a new <code>addSeriesParticipant(sid, email)</code> fans the add out to every occurrence in the series in one call: idempotent (skips an occurrence the target already owns or is already on), logs ONE series-level activity entry plus one per occurrence whose access actually changed, and toasts “added to N of M occurrences” — mirroring the real API's <code>addSeriesParticipant</code> exactly.</li> <li><strong>#1792 parity too</strong>: the new picker also offers an invited (not-yet-activated) demo person (<code>Nithya Rao</code>, the mockup's first PEOPLE entry with a <code>status</code> field) and renders her option in italics — while the CO-OWNER nomination picker now explicitly excludes invited people, matching the real app's active-only co-owner gate (a bug this build caught before it shipped: adding the invited demo person had made her incorrectly nominable as a co-owner too, until <code>addable</code> gained its own <code>status !== 'invited'</code> filter).</li> <li>Verified end-to-end with a standalone Node harness (extract the inline <code><script></code>, stub <code>document</code>/<code>localStorage</code>): fan-out to both occurrences, idempotent re-add, series + per-occurrence activity log entries, and the invited option present in exactly one of the two <code><select></code>s with <code>font-style:italic</code>.</li> </ul></div> <div class="tl-commit">✨ mockup(meetings): v445 — build the series participant-add picker (#1798)</div> </div> </div> <!-- v444 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v444 — Done</span> <span class="tl-title">Mockup/impl parity sync: stale azref cleanup + Profile/Reports/Projects/P&A/U&D/Admin refresh (#1793)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-docs">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Whole-mockup-suite parity audit</strong> (user request 2026-07-23; mockup was last fully audited 2026-07-03 at v304 — ~1800 commits/~294 feature commits landed since). Six parallel research passes (auth/profile/notifications/dashboard, Ups & Downs workflow, Priorities & Achievements, projects/timeline/reports/my-work, admin console, Meeting Notes AI) found drift in both directions; this release ships the quick/low-risk and moderate fixes, and the larger feature-build items are tracked as separate work items (see history.html's own AzDO refs going forward).</li> <li><strong>Removed 6 stale 🔗 azref chips</strong> whose underlying AzDO items are Done: dashboard.html #983, admin/index.html #1073/#1674/#993/#982/#1086.</li> <li><strong>Admin — Meeting Notes AI register</strong> now shows a “Stuck (AiDE processing)” stat + a per-row ⚠ badge (elapsed hours + last AiDE stage) for a crashed run that never sets <code>aideError</code> and would otherwise look like a normal in-progress run (#993). AiDE Fabric Token adoption table reordered to connected-first-then-not, each group alphabetical (#982). Audit Log entity filter gained the “Report” option already present in the real screen.</li> <li><strong>Profile</strong>: MCP tool count corrected 54→61 (matching the real copy, incl. AiDE-suggestion drafting); added the <strong>🔑 AiDE Fabric Token</strong> card (#1706) — the one common connect point for every AiDE-powered feature, not just Meeting Notes AI where it originally lived. Shares the same <code>pg_aide_token</code> localStorage key as meeting-notes-ai.html, so "connected" is consistent across mockup pages.</li> <li><strong>Account activation error state</strong> gained the self-service “request a fresh activation link” form (#1233) that the real screen has had for a while.</li> <li><strong>Priorities & Achievements</strong> attachments card copy/accept-attribute widened to match the real upload widget (PDF, DOC/X, XLS/X, PPT/X, TXT, CSV, ZIP, images · max 10 MB) and the unenforced “max 5 files” claim removed.</li> <li><strong>Reports</strong> Data Exports list now carries the same “ⓘ org-wide — ignores the POD/project filter” disclosure the real screen shows on the 8 exports that genuinely aren't scoped (#1748/#1772).</li> <li><strong>Projects</strong> cards gained the ★/☆ pin-to-sidebar toggle (#1412) — <code>nav.js</code> grew the write side (<code>togglePinnedProject</code>/<code>isProjectPinned</code>) to go with the sidebar's pre-existing read-only <code>pinnedProjects()</code>.</li> <li><strong>Ups & Downs</strong> workflow/spoc.html + workflow/pod.html: corrected a stale Override & Close comment that said the shortcut only works “once the PL has submitted” — the real rule (and cluster-head.html's own comment) allows it from <code>draft</code> too.</li> </ul></div> <div class="tl-commit">🐛 mockup(parity): v444 — stale azref cleanup + Profile/Reports/Projects/P&A/U&D/Admin refresh (#1793)</div> </div> </div> <!-- v443 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v443 — Done</span> <span class="tl-title">Meeting Notes AI: broaden occurrence edit permission, fix next-occurrence date, add activity log (#1787)</span> <span class="tl-date">23 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>Editing an occurrence's own date/time was owner-only</strong>, even though the "✏️ Edit meeting" button also covers title/platform/duration/follow-up — broadened its gating from <code>isOwner(m)</code> to <code>canEditAide(m)</code>, the same ⭐ organiser / 👑 co-owner / admin set that can already manage co-owners and re-run/restart AiDE, so fixing a wrong date/time no longer requires the literal owner.</li> <li><strong>"+ Add occurrence" set the new occurrence's date to today's real-world date</strong> instead of the series' own cadence — a weekly-Monday series could land its next occurrence on any weekday. Added <code>nextSeriesOccurrenceDate()</code>, which computes the correct next date from the series' <code>frequency</code>/<code>dayOfWeek</code> (weekly/bi-weekly) or Nth-weekday/day-of-month (monthly) fields — the same fields <code>seriesRrule()</code> already uses for the .ics export, so the occurrence date and the calendar invite now agree.</li> <li><strong>New unified activity log</strong> in the Logs tab: metadata changes (date/time/title/platform/duration edits, participant add/remove, ⭐ organiser and 👑 co-owner changes, visibility toggle, reminders on/off, finalize/reopen) and attachment events (transcript attached, transcript/recording deleted) are now recorded and shown interleaved with AiDE processing runs, newest first — "who changed what, when" lives next to "who ran AiDE" and "what was attached" instead of being invisible. Series-level events (occurrence added, series co-owner nominated/removed) are logged on the series and pulled into every occurrence's Logs tab that belongs to it, tagged 🔁 series.</li> </ul></div> <div class="tl-commit">🐛 mockup(meetings): v443 — broaden occurrence edit permission, fix next-occurrence date, add activity log (#1787)</div> </div> </div> <!-- v442 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v442 — Done</span> <span class="tl-title">Parity audit 2026-07-21: stale chips cleaned, new gaps #1673 + #1674 filed (#1672)</span> <span class="tl-date">21 Jul 2026</span> </div> <div class="tl-desc"><ul> <li><strong>Stale azref chips removed</strong> — #1414 (video intake), #1075 (What’s New drift), #1082 (preview bar) all marked Done in AzDO; their chips removed from <code>index.html</code> and <code>meeting-notes-ai.html</code>. Admin meetings stale chips #1068, #1080, #1081 (deleted), #921 also cleaned from <code>admin/index.html</code>.</li> <li><strong>New impl-pending PBI #1673</strong> filed: <code>MeetingNotesScreen.tsx</code> has no video recording intake code — #1414 was closed but the feature was never shipped. 50 MB cap, Project Lead+ role gate, upload progress + retry, AiDE transcription pipeline still missing.</li> <li><strong>New impl-pending PBI #1674</strong> filed: <code>AdminMeetingsScreen</code> missing the List / 🗓️ Calendar toggle present in the admin meetings mockup since v369 (#1069). Monday-first month grid with series/project/status chips.</li> <li>#1673 chip added to the Meeting Notes AI card in <code>index.html</code> and to the list-header gap-chip div in <code>meeting-notes-ai.html</code>. #1674 chip added to the admin meetings section in <code>admin/index.html</code>.</li> </ul></div> <div class="tl-commit">📝 docs(mockup): v442 — parity audit 2026-07-21 (#1672)</div> </div> </div> <!-- v441 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v441 — Done</span> <span class="tl-title">Fold "My Action Items" nav into "My Work" — one cross-module entry instead of two (#1665)</span> <span class="tl-date">21 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Navigation</span> </div> <div class="tl-desc"><ul> <li><strong>"My Action Items" and "My Work" both surfaced overlapping details</strong> — two separate sidebar entries pointing at content that already overlapped.</li> <li><strong>My Work is the superset, so it survives</strong>: it already renders a "✅ Your open action items" section (up to 5, oldest-due-first) and links to the full My Action Items list twice (a "view all" link and a CTA). Its own X/Y attention-counter total already includes action items, so no count is lost from the badge.</li> <li><strong>The My Action Items page itself is untouched</strong> — only the separate top-level menu entry (and its own duplicate attention counter) is gone. My Work still links to it, so bookmarks and deep links keep working.</li> <li>The mobile bottom tab bar already used only the My Work entry, so the desktop sidebar's second entry was the redundant one.</li> </ul></div> <div class="tl-commit">💄 mockup(nav): v441 — fold My Action Items into My Work (#1665)</div> </div> </div> <!-- v440 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v440</span> <span class="tl-title">Meeting Notes AI: 👑 co-owner equal-permission parity at the series and occurrence level (#1645)</span> <span class="tl-date">20 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>A meeting series had no co-owner concept at all</strong> — only a single <code>owner</code>. Only the person who created the series could ever add a new occurrence to it, with no way to delegate that.</li> <li><strong>An occurrence's existing 👑 co-owner crown was under-powered</strong> — a co-owner could already re-run AiDE and delete the meeting, but could NOT upload/replace the transcript, and could NOT nominate or remove other co-owners; both stayed strictly owner-only.</li> <li><strong>New "SERIES OWNER(S)" panel</strong> on the occurrence detail page (next to "+ Add occurrence") — the series owner OR an existing series co-owner can nominate/remove further series co-owners with equal rights, including adding someone in one step who wasn't previously involved with the series at all.</li> <li><strong>The "Access & sharing" card grew a third state</strong>: an ⭐ organiser / 👑 co-owner / admin who is NOT the literal owner now sees a crown-only management view — the participant list with a working 👑 toggle to nominate/remove co-owners (including a not-yet-a-participant in one step), while the rest of the owner-only panel (visibility toggle, plain add/remove participant, ⭐ organiser control) stays owner-only, unchanged.</li> <li>Series co-owner status and an individual occurrence's co-owner flag are deliberately INDEPENDENT — nominating someone at one level does not touch the other.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v440 — 👑 co-owner equal-permission parity at the series and occurrence level (#1645)</div> </div> </div> <!-- v439 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v439</span> <span class="tl-title">Team P&A Status: reverse the week columns to current -> current-1 -> current-2 (#1630)</span> <span class="tl-date">20 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Priorities & Achievements</span> </div> <div class="tl-desc"><ul> <li><strong>The 3-week window ran oldest-to-newest and looked one week into the future</strong> (last / current / next), so the column a reviewer cares about most — the current week — sat awkwardly in the middle, and a column was spent on a week that usually isn't even open for submission yet.</li> <li><strong>Reversed the order to current -> current-1 -> current-2</strong> (newest first, reverse chronological) and dropped the forward-looking "next week" column in favour of one more week of history — a reviewer scanning the grid cares far more about the trend behind a report than a not-yet-open future week.</li> <li><strong>The AiDE score rule is unchanged</strong> and needed no rewording: it was already stated in terms of "the following week" / "the previous week", not left/right position, so it still reads correctly under the reversed layout. Concretely: Kuntal Singha's <code>🤖 73%</code> moves from the (old) W23 column to the (new) middle column, since it's still keyed to the same pair of weeks — W24's achievements scored against W23's priorities — just relabelled "Current" and its immediate predecessor.</li> <li>Added a second demo week (W22, one week further back) to show a THIRD case: a week that qualifies for a score (Kuntal's W23 is Approved, so W22 is eligible) but has none rendered, because no said-vs-done run has actually been cached for that pair yet — the absence of a chip means "not generated", not "feature broken".</li> <li>Corrected the summary banner's week reference from W25 to W24 along the way — a pre-existing mismatch between the banner text and the "current" column it was supposed to describe, made newly obvious by this reorder.</li> </ul></div> <div class="tl-commit">✨ mockup(priorities): v439 — reverse Team P&A Status columns to current/current-1/current-2 (#1630)</div> </div> </div> <!-- v438 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v438</span> <span class="tl-title">Fix: AiDE score belongs on the week it scores AGAINST, not the week it scores (#1630)</span> <span class="tl-date">20 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-feat">Priorities & Achievements</span> </div> <div class="tl-desc"><ul> <li><strong>v437 anchored the score to the wrong cell.</strong> It stacked the <code>🤖 73%</code> chip under W24's <strong>Pending</strong> pill (the week whose achievements were judged), on its own second line. User feedback: the score belongs on <strong>the previous week</strong> — the one whose stated priorities are actually being scored against — and inline on the same line as that week's own status, not stacked below a different week's.</li> <li>Moved Kuntal Singha's <code>🤖 73%</code> chip from the W24 Pending cell to the <strong>W23 Approved</strong> cell, rendered inline right after the status pill on one line. W24 reverts to a bare <strong>Pending</strong> pill with no score of its own — the score is a property of W23 (the plan), not of W24 (the delivery), even though it can only be computed once W24's achievements exist.</li> <li>Rewrote the legend line to match: "AiDE score shows on a week's cell once the FOLLOWING week has been reviewed … it reflects how well that next week's achievements matched this week's priorities."</li> <li>Left a comment on impl PBI <strong>#1631</strong> flagging the corrected layout so implementation doesn't build against the superseded v437 screenshot.</li> </ul></div> <div class="tl-commit">🐛 mockup(priorities): v438 — anchor AiDE score to the previous (scored-against) week, inline (#1630)</div> </div> </div> <!-- v437 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v437</span> <span class="tl-title">AiDE score propagates into the P&A review landing page listings (#1630)</span> <span class="tl-date">20 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Priorities & Achievements</span> </div> <div class="tl-desc"><ul> <li><strong>v436 only showed the AiDE Achievement Score on the individual review page</strong> — the review LANDING page's two listing sections (the Pending Reviews queue card and the 2-level Your Team's P&A Status table) still showed bare status pills with no score at all.</li> <li>Added the same <code>🤖</code> score chip to both listings, gated by a rule stated explicitly this time: <strong>shown only once a week has left Draft/Not-submitted</strong> (i.e. Pending, Returned or Approved) <strong>AND a previous week exists with priorities recorded to compare against</strong>. Concretely in the demo data: Kuntal Singha's W24 (Pending, prior W23 Approved) gets <code>🤖 73%</code>; Gopal Krishna Tripathi's W24 (Returned) does NOT, because his W23 was Not submitted — there is no "said" baseline to score against, even though his own week qualifies. Swati Nandha's W24 (Draft) is excluded outright by the Draft rule regardless of history.</li> <li><strong>Same score, same person, same value in both places</strong> — the queue card's Swati Nandha row shows <code>73% Good</code>, matching the individual said-vs-done gauge added in v436 for that same submission, so a reviewer sees one consistent number everywhere rather than two independently-computed ones.</li> <li>Added an explicit legend line above the status table spelling out the gating rule, so the absence of a score reads as "nothing to compare yet", not as a missing feature.</li> <li>Created dependent implementation PBI <strong>#1631</strong> (New, unassigned, <code>impl-pending; from-mockup</code>), which also flags that a real implementation should compute/cache this once per submission rather than re-querying AiDE per grid cell on every landing-page render.</li> </ul></div> <div class="tl-commit">✨ mockup(priorities): v437 — AiDE score in the review landing page listings (#1630)</div> </div> </div> <!-- v436 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v436</span> <span class="tl-title">AiDE said-vs-done gets a scored Achievement gauge (#1628)</span> <span class="tl-date">20 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Priorities & Achievements</span> </div> <div class="tl-desc"><ul> <li><strong>The 🤖 AiDE said-vs-done card only ever gave three free-text bullets</strong> (done-as-said / said-not-done / done-not-said) — a reviewer had to read and weigh the prose themselves with no at-a-glance signal of how the week actually landed.</li> <li>Added a circular <strong>Achievement Score</strong> gauge (SVG donut, mirrors <code>ReportsScreen</code>'s <code>AideDonut</code> pattern) plus a colour-coded grade chip — <span style="color:#16a34a">🌟 Excellent</span> (≥80), <span style="color:#1d4ed8">✅ Good</span> (60–79), <span style="color:#d97706">⚠️ Fair</span> (40–59), <span style="color:#dc2626">🔴 Needs Attention</span> (<40) — next to the existing bullets, with a one-line rationale underneath.</li> <li><strong>Deliberately NOT a locally-computed formula.</strong> The three bullets are already AiDE's own free-text judgment (<code>aideSaidVsDoneService.ts</code>'s <code>fetchAideSaidVsDone</code>), so a client-side "matched ÷ total" count can't be derived from prose without re-parsing it. The mockup's score/grade/rationale stand in for a future AiDE response field, not arithmetic done in our code — the dependent impl item extends AiDE's own JSON schema to return <code>score</code> + <code>rationale</code> directly.</li> <li>Created dependent implementation PBI <strong>#1629</strong> (New, unassigned, <code>impl-pending; from-mockup</code>) to extend <code>aideClient.ts</code>'s said-vs-done prompt/schema and wire the gauge into <code>PMPAReviewScreen.tsx</code>.</li> </ul></div> <div class="tl-commit">✨ mockup(priorities): v436 — AiDE-scored Achievement gauge on said-vs-done card (#1628)</div> </div> </div> <!-- v435 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v435</span> <span class="tl-title">"Add to calendar" (.ics export) for Meeting Notes AI meetings and series (#1524)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feature">Feature</span> </div> <div class="tl-desc"><ul> <li><strong>No calendar integration existed at all</strong> — meetings carry date, start time, duration, timezone (#1063) and an advanced recurrence model (#1202), but grepping for <code>.ics</code> / <code>text/calendar</code> / <code>BEGIN:VCALENDAR</code> across the app returned zero hits. Users had to retype meetings into Outlook/Teams by hand.</li> <li><strong>📅 Add to calendar</strong> button added in three places: the meeting list card (next to Duplicate), the meeting detail page's action row (now always visible, not gated on status — a scheduled meeting needs an invite too), and the shared report view. Clicking downloads a real, valid <code>.ics</code> file client-side (no backend needed for the mockup) via the same Blob+<code>createObjectURL</code> pattern already used by every CSV export in <code>admin.js</code>.</li> <li><strong>Series occurrences get a real <code>RRULE</code></strong>, mapped from the same <code>frequency</code>/<code>dayOfWeek</code>/<code>monthlyMode</code>/<code>dayOfMonth</code>/<code>weekday</code>/<code>ordinals</code> fields the #1202 recurrence picker already writes onto <code>SERIES</code> — weekly/bi-weekly → <code>FREQ=WEEKLY;INTERVAL=1|2;BYDAY=...</code>, monthly day-of-month → <code>BYMONTHDAY</code>, monthly Nth-weekday → <code>BYDAY=1FR</code> etc. (repeated per ordinal, so "1st & 3rd Friday" becomes two <code>BYDAY</code> values). A one-off meeting gets a single <code>VEVENT</code>, no <code>RRULE</code>.</li> <li><strong>Reused the #1063 timezone conversion</strong> (<code>zonedToUtc</code>) rather than adding a second wall-time→UTC path — <code>DTSTART</code>/<code>DTEND</code> are computed the same way the on-screen "shown in your timezone" display already is, so the invite lands at the meeting's real instant no matter which zone opens the <code>.ics</code>.</li> <li>Created dependent impl PBIs for the API-side <code>.ics</code> generation utility + email-attachment wiring and the web-side buttons, referencing this mockup version.</li> </ul></div> <div class="tl-commit">✨ mockup(meeting-notes-ai): v435 — "Add to calendar" .ics export for meetings and series (#1524)</div> </div> </div> <!-- v434 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v434</span> <span class="tl-title">This page's own stats were wrong — and nothing was checking them (#1539)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-chore">Tooling</span> </div> <div class="tl-desc"><ul> <li><strong>The design history had drifted from itself.</strong> The header claimed <code>v299 iterations total</code> and <code>196 releases</code>, while the page actually carried <strong>433 distinct versions across 434 entries</strong> — the first stale by 134, the second off by more than 2×.</li> <li><strong>Why it drifted so far:</strong> both counters were maintained by hand and nothing ever compared them to the document. The releases badge was being faithfully incremented <code>+1</code> per release — I did so myself earlier today, following the convention — but from a base that was already wrong, so every bump preserved the error rather than correcting it. Correcting the numbers alone would just reset the clock on the same bug.</li> <li><strong>Added <code>scripts/check-mockup-history.mjs</code></strong>, which recomputes the counts from the document and also verifies what the numbers cannot: exactly one <code>current</code> marker (a stale second one is a known past failure), that the current marker is the highest version, that <code>index.html</code> agrees with it, and that the sequence has no duplicates or gaps. <code>--fix</code> rewrites only the two counters.</li> <li><strong>One genuine duplicate surfaced: v193 is used twice</strong>, for "Monthly Nth-weekday deadlines" and "week/cycle tabs show full date ranges". Deliberately <em>not</em> renumbered — mockup versions are cited in commit messages, work items and memento entries, so rewriting one would turn every citation into a dangling reference. It is recorded as a known exception with its reason, so any <em>new</em> duplicate still fails.</li> <li>Otherwise the log is in good shape: v1..v433 with <strong>no gaps at all</strong>.</li> </ul></div> <div class="tl-commit">🐛 mockup(history): v434 — correct the header stats and add an integrity checker (#1539)</div> </div> </div> <!-- v433 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v433</span> <span class="tl-title">Admin: combine Email Templates+Log and MCP Tokens+Log into two hubs (#1532)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin Portal</span> <span class="tag tag-chore">Screen-combining</span> </div> <div class="tl-desc"><ul> <li><strong>Same pattern as the v323 People & Organisation hub</strong>, applied twice more: <strong>Email</strong> (Templates + Delivery Log tabs) and <strong>MCP</strong> (Tokens + Activity Log tabs) each collapse two nav entries into one, with the sub-sections relocated into tab panels at load by <code>initEmailHub()</code>/<code>initMcpHub()</code> — every existing render fn, modal and action keeps working unchanged.</li> <li>Admin nav shrinks by 2 entries (14→12): Email Templates + Email Log → one Email link; MCP Access Tokens + MCP Interaction Log → one MCP link. Related context now sits together — edit a template, then check its deliveries, without a nav round-trip.</li> <li><strong>Deep links preserved</strong>: <code>#templates</code>, <code>#email-log</code>, <code>#mcp-tokens</code>, <code>#mcp-log</code> all still resolve — into the right hub AND the right tab — via the same legacy-key mapping the People hub established (<code>EMAIL_TAB_FOR</code>/<code>MCP_TAB_FOR</code>).</li> <li><strong>Found a real duplicate-of-a-duplicate along the way:</strong> <code>admin/index.html</code> doesn’t even use the shared <code>assets/js/nav.js</code> sidebar renderer — it has its own separate inline copy at the bottom of the file. Both had to be updated (and the command-palette’s own third registry of admin quick-links), or the sidebar would have kept showing all 4 old entries no matter what the router said.</li> <li>Verified offline: 26 Playwright checks (sidebar entry counts, tab open-state + switching + content rendering, all 4 legacy deep-link hashes, and a fresh page load straight into a deep-link) — 0 page/console errors. <code>node --check</code> clean on all 3 touched JS files.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v433 — combine Email + MCP into hubs (#1532)</div> </div> </div> <!-- v432 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v432</span> <span class="tl-title">Duplicate a meeting — one click prefills the create wizard (#1525)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>Why:</strong> governance meetings repeat with the same shape week after week — same mode, duration, timezone, project, and the same eight participants — yet every create started from a blank form. There was no duplicate/copy/template path anywhere in the module.</li> <li><strong>⧉ Duplicate</strong> now sits on each list card and on the meeting report, and opens the <em>create wizard</em> (v425) prefilled from that meeting, landing on <strong>Basics</strong> so the only thing left to set is the date.</li> <li><strong>It copies the SHAPE, not the CONTENT.</strong> Title, mode, duration, timezone, project link, participants (with their organiser/owner chips) and visibility carry over, because those describe how the meeting is <em>run</em>. The date resets to today, and the transcript, recording and AiDE outcome are deliberately <strong>not</strong> copied — those belong to the occurrence that already happened, and carrying them would silently attach one meeting's minutes to another.</li> <li><strong>Recurrence is not copied either.</strong> A series already owns an "add occurrence" flow, so duplicating one into a second series would create two competing schedules for the same meeting.</li> <li>The list card is entirely a click target, so the button calls <code>event.stopPropagation()</code> — without it, duplicating would also navigate into the source meeting. Verified in a real browser along with the rest: 18 checks, including that the source meeting is not mutated and that no transcript leaks into the copy.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): v432 — duplicate a meeting prefills the create wizard (#1525)</div> </div> </div> <!-- v431 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v431</span> <span class="tl-title">Fix: the reveal-once secret warning was rendering unstyled (my v428 bug)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> </div> <div class="tl-desc"><ul> <li>v428’s webhook reveal modal used <code>class="admin-alert warn"</code>. <code>admin.css</code> defines <code>.admin-alert.info</code> and <code>.admin-alert.warning</code> — there is no <code>.warn</code> rule — so that alert fell back to the plain base style and carried no warning colour at all. It is the “this secret is shown only once and cannot be recovered” notice, i.e. precisely the alert that most needs to read as a warning.</li> <li><strong>Correcting the record.</strong> v430’s commit message reported this as a <em>pre-existing</em> bug affecting <em>6 places</em>. Both halves were wrong. The count came from grepping <code>admin-alert warn</code>, which matches <code>admin-alert warning</code> as a substring, so it counted the 6 <em>correct</em> usages; the real total was 1. And that one was introduced by v428 — by me — not inherited. Every variant now in use (<code>info</code> ×13, <code>warning</code> ×7) has a matching CSS rule.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v431 — fix the unstyled reveal-once warning</div> </div> </div> <!-- v430 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v430</span> <span class="tl-title">Admin portal: back-fill the Settings section the app already ships (#1521)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-feat">Admin</span> </div> <div class="tl-desc"><ul> <li>Third <strong>web → mockup</strong> back-fill in a row, after v428’s Webhooks and v429’s Reports view controls. The app has shipped <code>/admin/settings</code> since #1335 — a read-only view of the API’s <em>runtime</em> configuration plus a live SMTP connection test — while the admin mockup had 14 nav sections and no Settings. <strong>No impl item</strong>: there is nothing for the web to build.</li> <li>Six panels mirroring the shipped screen exactly: Environment, Email/SMTP, Sessions & Tokens, URLs & CORS, Storage, Features. The value formatting is ported rather than reinvented — booleans read Yes/No, arrays join with commas, the attachment cap renders as MB, and an unset value shows an em dash so “unset” is visibly different from “still loading”.</li> <li><strong>Secrets are presence-only.</strong> The table shows a Set / Not set badge and never a value, because the API deliberately does not return them. Saying so on the screen matters: it tells an admin why they cannot copy a secret from here, rather than leaving them hunting for a reveal control that does not exist.</li> <li>The sample config carries two <strong>real warnings</strong> rather than a clean slate — SMTP pooling off, analytics ID unset. A settings viewer whose whole purpose is surfacing misconfiguration should show what that looks like.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v430 — back-fill the Settings section (#1521)</div> </div> </div> <!-- v429 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v429</span> <span class="tl-title">Admin portal: back-fill the Settings section the app already ships (#1521)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-feat">Admin</span> </div> <div class="tl-desc"><ul> <li>Second of the two <strong>web → mockup</strong> back-fills, after v428’s Webhooks. The app has shipped <code>/admin/settings</code> since #1335 — a read-only view of the API’s <em>runtime</em> configuration plus a live SMTP connection test — while the admin mockup had 14 nav sections and no Settings. <strong>No impl item</strong>: there is nothing for the web to build.</li> <li>Six panels mirroring the shipped screen exactly: Environment, Email/SMTP, Sessions & Tokens, URLs & CORS, Storage, Features. The value formatting is ported rather than reinvented — booleans read Yes/No, arrays join with commas, the attachment cap renders as MB, and an unset value shows an em dash so “unset” is visibly different from “still loading”.</li> <li><strong>Secrets are presence-only.</strong> The table shows a Set / Not set badge and never a value, because the API deliberately does not return them. Saying so on the screen matters: it tells an admin why they cannot copy a secret from here, rather than leaving them hunting for a reveal control that does not exist.</li> <li>The sample config carries two <strong>real warnings</strong> rather than a clean slate — SMTP pooling off, analytics ID unset. A settings viewer whose whole purpose is surfacing misconfiguration should show what that looks like.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v429 — back-fill the Settings section (#1521)</div> </div> </div> <!-- v428 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v428</span> <span class="tl-title">Admin portal: back-fill the Webhooks section the app already ships (#1522)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-chore">Parity</span> <span class="tag tag-feat">Admin</span> </div> <div class="tl-desc"><ul> <li><strong>Direction is web → mockup</strong>, which is the unusual one. The app has shipped <code>/admin/webhooks</code> since #1495 — outbound subscriptions with a reveal-once HMAC signing secret, an eligible-event multiselect, revoke, and a delivery-attempt log — while the admin mockup had no Webhooks section at all. Webhooks existed here only as prose in this very file. The design source of truth was behind the product, so this back-fills it rather than proposing anything new. <strong>No impl item</strong>: there is nothing for the web to build.</li> <li>Modelled deliberately on the two nearest existing sections rather than inventing a shape: <strong>MCP Tokens</strong> for the create-then-reveal-once-secret pattern (the secret is shown once and stored as a hash, so the modal says so in those words), and <strong>MCP Log</strong> for the status-badge attempt table.</li> <li>The event catalog is the app's <code>WEBHOOK_ELIGIBLE_EVENTS</code> <em>verbatim</em> — ET-004/005/006 (cycle forwarded / approved / returned), ET-035/036 (meeting outcome ready / finalized), ET-041/032 (action item assigned / overdue). It reuses the existing notification template codes rather than inventing a parallel taxonomy, which is what the shipped implementation does and why only 7 of ~50 codes are eligible.</li> <li>The sample delivery log carries both failure modes on purpose: an ordinary <code>503</code> that succeeds on its retry, and a <code>301</code> refused outright — because the SSRF guard added in #1506 deliberately does <em>not</em> follow redirects. A mockup that only ever showed happy-path deliveries would misrepresent how this screen actually behaves.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v428 — back-fill the Webhooks section (#1522)</div> </div> </div> <!-- v427 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v427</span> <span class="tl-title">Streamlining round 2: scheduler projects disclosure + Single/Bulk invite combined (#1527)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin Portal</span> <span class="tag tag-chore">Entry-flow streamlining</span> </div> <div class="tl-desc"><ul> <li><strong>Review-cycle modal</strong> (the last OVERLOADED form from the audit): the Assigned Projects checkbox grid moved into a disclosure section with a <strong>live "N selected" count</strong> on its summary — open for a new cycle (assigning projects is the point of creating one), collapsed on edit so the recurrence engine stays the focus.</li> <li><strong>Screens combined:</strong> the separate "Invite New User" and "Bulk Invite Users" modals — same job, two dialogs — are now ONE <strong>✉️ Invite Users</strong> modal with <strong>👤 Single / 📋 Bulk CSV</strong> tabs (ARIA tabs pattern). One toolbar entry point; <code>openBulkInviteModal()</code> stays as a deep-link alias onto the Bulk tab. The bulk send/results/Done flow swaps only its own tab's panel.</li> <li><strong>Hardening:</strong> tab buttons carry <code>role=tab</code>/<code>aria-selected</code>, panels <code>role=tabpanel</code>; footers swap with the active tab so the primary action always matches the visible form. Also fixed a silent default bug: <code>openInviteModal()</code> set role to <code>'pl'</code>, a value no option has — now <code>'projectLead'</code> explicitly.</li> <li>Round 2 of #1516 (v425 wizard, v426 admin tabs/collapse). Verified offline with Playwright: 18 checks green incl. v426 regressions.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v427 — scheduler projects disclosure + combined Single/Bulk invite modal (#1527)</div> </div> </div> <!-- v426 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v426</span> <span class="tl-title">Admin entry flows: email-template tabs + collapsible project approval chain (#1516)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin Portal</span> <span class="tag tag-chore">Entry-flow streamlining</span> </div> <div class="tl-desc"><ul> <li><strong>Email-template editor</strong> (the densest admin form: ~9 fields + a 13-chip variable palette in one flat scroll) is now <strong>3 tabs</strong>: <strong>✏️ Content</strong> (Name, Subject, HTML body + palette — both required fields live here, and a save validation failure switches back to it), <strong>📮 Delivery & CTA</strong> (Trigger, Recipient, CTA label/link), <strong>⚙️ Settings</strong> (Enabled toggle, Category). Reuses the design-system <code>.mode-tab-btn</code> pills; every field ID unchanged, so <code>editTemplate()</code>/<code>saveTemplate()</code>/<code>insertVar()</code> work as before.</li> <li><strong>Project modal</strong>: the ~6 dynamically-rendered approval-chain selects moved into a native <code><details></code> section — <strong>open</strong> for a new project (the senior chain is required), <strong>collapsed</strong> when editing (assignments already set, so identity edits no longer scroll past six selects). A chain-role validation failure pops the section open before the toast fires.</li> <li>Second chunk of the #1516 entry-flow streamlining audit (first: v425 create-meeting wizard). Verified offline with Playwright: 14 checks green across both modals.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v426 — email-template tabs + collapsible project approval chain (#1516)</div> </div> </div> <!-- v425 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v425</span> <span class="tl-title">Create-meeting popup becomes a 4-step wizard (#1516)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> <span class="tag tag-chore">Entry-flow streamlining</span> </div> <div class="tl-desc"><ul> <li><strong>Why:</strong> the create-meeting modal had grown to <strong>~14 field groups / 20+ controls in one scroll</strong> — 6 required fields (title, mode, date, time, duration, timezone) buried among 8 optional blocks (recurrence engine, video upload, dual transcript inputs, participant chips, project link, follow-up, visibility). The 2026-07-19 entry-flow audit ranked it the most overloaded form in the product.</li> <li><strong>Now a stepped wizard</strong> using the existing <code>.podgov-stepper-bar</code> circles + connectors: <strong>1 Basics</strong> (the six required fields) → <strong>2 Schedule</strong> (recurring series + follow-up, which moved up from the old form's tail — it is schedule semantics) → <strong>3 People & sharing</strong> (project link, participants, org-visibility — visibility moved next to participants because both decide <em>who sees it</em>) → <strong>4 Content</strong> (recording, transcript file / pasted text).</li> <li><strong>Only Basics is required.</strong> "Create meeting" stays visible on every step, steps are freely clickable in any order, and a validation failure jumps back to Basics with the inline error. Field IDs and <code>createMeeting()</code> behaviour are unchanged — this is a pure regrouping.</li> <li>Verified offline with Playwright against the static file: 22 checks (step switching, series/follow-up interlock, validation jump-back, create + modal close) all green.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): v425 — create-meeting popup becomes a 4-step wizard (#1516)</div> </div> </div> <!-- v424 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v424</span> <span class="tl-title">Accent colours: the light palette failed AA wherever it carried text (#1503)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Accessibility</span> <span class="tag tag-chore">Design system</span> </div> <div class="tl-desc"><ul> <li><strong>11 of the 14</strong> <code>--accent-green</code>/<code>--accent-red</code> usages failed WCAG AA. Two different failure modes, which is why a single re-tone could not fix it: <strong>text on a light surface</strong> (<code>.change-label</code>, <code>.old-text</code>/<code>.new-text</code>, <code>.btn-delete:hover</code> — worst <strong>2.28:1</strong> on 12px body text) and <strong>white text on a fill</strong> (<code>.toast.success</code>/<code>.danger</code>, <code>.pri-chain-step.done</code>, <code>.notif-bell-badge</code>, and login's <code>.btn-success</code>/<code>.btn-danger</code> — also 2.28:1). Only 3 usages were safe: a border-left and two audit dots, none of which carry text.</li> <li><strong>Why it survived v294.</strong> That pass fixed the buttons by <em>hardcoding</em> darker hexes (<code>.btn-danger #dc2626</code>, <code>.btn-success #15803d</code>) rather than fixing the tokens, so the light tokens lived on and every other consumer stayed broken. <code>login.html</code> then overrode <code>.btn-success</code>/<code>.btn-danger</code> back to the raw tokens, undoing that fix on the login page entirely.</li> <li><strong>Two fixes, matched to the two failure modes.</strong> Text usages moved to the existing <code>--tint-*-fg</code> scale (5.02:1 / 6.47:1). Fills moved to new <code>--accent-green-solid</code> / <code>--accent-red-solid</code> tokens — deliberately <strong>theme-invariant</strong>, because the base accents lighten in dark mode and that drops white-on-fill to <strong>1.74:1</strong>. Their values are not invented: they are the ones v294 already hardcoded into the buttons, now tokenised so every fill inherits the fix.</li> <li>Also caught: <code>.btn-success:hover</code> was <em>lighter</em> than its own base (<code>#16a34a</code>, white-on 3.30:1) — a hover that reduces contrast. Now <code>#166534</code>, 7.13:1.</li> <li><strong>No impl-pending item:</strong> the shipped web app already uses the darker 600-level accents and the tint scale for these surfaces (#1493 / #1454). This change brings the mockup up to the app, not the other way round.</li> </ul></div> <div class="tl-commit">💄 mockup(design-system): v424 — accent colours that carry text now clear AA (#1503)</div> </div> </div> <!-- v423 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v423</span> <span class="tl-title">Design system: the muted tint token the v294 accessibility pass missed (#1501)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Accessibility</span> <span class="tag tag-chore">Design system</span> </div> <div class="tl-desc"><ul> <li><code>--tint-neutral-fg</code> was still <code>#64748b</code>, giving <strong>4.34:1</strong> against its own paired <code>--tint-neutral-bg-strong</code> (<code>#f1f5f9</code>) — under the 4.5 AA floor for normal text. On the weaker <code>--tint-neutral-bg</code> it scrapes 4.55, which is likely why it survived: the token only fails against <em>one</em> of the two surfaces it is authored to sit on.</li> <li>A residual miss from <strong>v294</strong>’s axe-core WCAG pass, which darkened <code>--text-muted</code>/<code>--text-secondary</code> from <code>#64748b</code> to <code>#576475</code> for this exact reason (“table headers were 4.36:1”) but left this sibling on the old value. Now <code>#576475</code> too — 5.50:1 on <code>-bg-strong</code>, 5.76:1 on <code>-bg</code>. Two stale <code>var(--text-muted, #64748b)</code> fallbacks in the account-switcher rules were updated to match.</li> <li><strong>Found by the web, not by eye.</strong> #1493 added a derived assertion to the app’s test suite — every <code>--tint-*-fg</code> must clear 4.5:1 against its paired <code>--tint-*-bg</code> in both themes, generated from the token names so new families are covered automatically. It caught the identical defect in the app’s stylesheet on its first run. Running the same check over this file found exactly one failure: this token. A visual/axe sweep missed it for weeks; twelve lines of derived assertion found it instantly.</li> <li><strong>No impl-pending item:</strong> the web side is already shipped. #1454 reconciled the app’s whole muted family (<code>--text-muted</code>, <code>--text-faint</code>, <code>--tint-neutral-fg</code>) onto <code>#576475</code> to match this file, so this change restores parity rather than creating new work.</li> </ul></div> <div class="tl-commit">💄 mockup(design-system): v423 — darken --tint-neutral-fg to clear AA (#1501)</div> </div> </div> <!-- v422 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v422</span> <span class="tl-title">Design system: one canonical segmented control, retiring three imitators (#1482)</span> <span class="tl-date">19 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Design system</span> <span class="tag tag-chore">Consistency</span> </div> <div class="tl-desc"><ul> <li>Four different “pick one of N views” patterns had accumulated: this page's own <code>.view-toggle</code> (bordered group, flat blue active tab, no track) disagreed with <code>timeline.html</code>'s <code>.view-switch</code> (filled track, raised active pill) — and the shipped web app added a third near-copy (Reports) and a fourth, plain Bootstrap buttons (My Action Items, Timeline, Theme picker).</li> <li><strong>Canonical shape = the raised-pill track</strong> (this page's <code>.view-toggle</code> retoned to match <code>timeline.html</code>'s <code>.view-switch</code>) — it was already the one variant proven dark-mode-safe end to end in the shipped app (v421's sibling ticket #1485 fixed Reports' copy), so making it canonical meant retoning one mockup file instead of two, and no web screen had to give up work already done for dark mode.</li> <li>Implemented alongside this mockup update, not deferred: impl item <strong>#1482</strong> itself ships a new shared <code>SegmentedControl</code> component and repoints Reports, My Action Items, and the Timeline view switcher at it in the same commit — no separate impl-pending item needed.</li> </ul></div> <div class="tl-commit">💄 mockup(design-system): v422 — unify the segmented control (#1482)</div> </div> </div> <!-- v421 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v421 — done</span> <span class="tl-title">Data alignment pass: tabular figures + vertical rhythm in every data table (#1428)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Polish</span> <span class="tag tag-feat">Design system</span> </div> <div class="tl-desc"><ul> <li>Shared <code>design-system.css</code> rules, so the fix lands on <strong>every data table site-wide</strong>: <code>font-variant-numeric: tabular-nums</code> on table cells makes numeric columns (Ups/Downs counts, percentages, dates, X/Y counters) align digit-for-digit down a column instead of wobbling with proportional figures; headers get <code>vertical-align: middle</code> so sort icons sit on the text line.</li> <li>Complements the chart-token work (v416) and the web-side alignment pass already specced in impl item <strong>#1426</strong> — noted there so the implementation mirrors both.</li> </ul></div> <div class="tl-commit">💄 mockup(design-system): v421 — tabular figures + table rhythm (#1428)</div> </div> </div> <!-- v420 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v420 — done</span> <span class="tl-title">Reports: export ALL charts as images in one click (#1427)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Reports</span> </div> <div class="tl-desc"><ul> <li>v416 gave every chart card its own ⬇ PNG / SVG buttons; the Data Exports card still offered CSVs only. A new <strong>🖼 All charts — PNG</strong> button downloads the four report charts (Ups&Downs trend, return rate, P&A completion, AiDE adoption) as themed PNG images in one action, staggered so every browser download lands.</li> <li>Web build-out rides with the v416 chart work in impl item <strong>#1420</strong> (bundle action noted there) — no separate item needed.</li> </ul></div> <div class="tl-commit">💄 mockup(reports): v420 — export all charts as images (#1427)</div> </div> </div> <!-- v419 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v419 — done</span> <span class="tl-title">Web↔mockup sync: MNA attachment delete (#1360 mirror) + series completion slider (#1425)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>Impl→mockup catch-up:</strong> the web app shipped <em>delete the stored transcript/recording</em> (#1360) without a mockup — the stored-file chips now carry a 🗑 delete (owner-gated, locked after finalize) so a replacement document can be uploaded for processing; the real app explains the gap via a run-history event. No impl item needed — web led here.</li> <li><strong>Series completion slider</strong> (user screenshot): series rows showed “Series actions: n/m closed” as text while single-meeting cards have a progress bar — the same aggregate slider now renders on every series row (aria-labelled). Web build-out + a broader alignment/representation pass tracked in impl item <strong>#1426</strong>. Mockup-planned features were preserved throughout — sync merges both directions, never deletes design-side work.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v419 — attachment delete mirror + series slider (#1425)</div> </div> </div> <!-- v418 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v418 — done</span> <span class="tl-title">AiDE everywhere: drafted U&D, reviewer briefs, said-vs-done, series intelligence, risk radar, report insights (#1423)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">AiDE</span> </div> <div class="tl-desc"><ul> <li>Six AiDE expansions, each built on data the platform already holds and all following the <strong>review-before-commit</strong> guardrail: <strong>🤖 AiDE suggestions</strong> on the Project Lead page (Ups/Downs drafted from the week’s MoMs, timeline events and closed action items, with per-item Accept into the editable draft); <strong>reviewer brief</strong> on the PM rung (delta vs last cycle, recurring items, attention points); <strong>said-vs-done</strong> on the P&A bilateral review (last week’s priorities vs this week’s achievements).</li> <li><strong>🧠 Series intelligence</strong> on Meeting Notes AI (series meetings only): changed-since-last-occurrence, recurring unresolved topics, and a drafted agenda for next time. <strong>🛰 Risk radar</strong> for the Cluster Head: weekly ranked cross-project risks from downs, blockers, escalations and overdue actions. <strong>🤖 AiDE insights</strong> on Reports: generated commentary on the page’s own numbers plus a natural-language “Ask AiDE” query box.</li> <li>MCP catalog growth (meetings/timeline/reports tools, outbound webhooks) is spec-only here — carried by impl item <strong>#1424</strong> together with the full web/api build-out (caller-scoped access, run attribution, failure notifications, server-side gates).</li> </ul></div> <div class="tl-commit">💄 mockup(aide): v418 — AiDE expansion set across six surfaces (#1423)</div> </div> </div> <!-- v417 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v417 — done</span> <span class="tl-title">Meeting Notes AI: edit / delete individual summary points + refresh the mindmap & action items (#1421)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Until now the AiDE outcome supported spelling corrections and a full re-run — but a <strong>contradictory or not-required point</strong> in the minutes could not be removed or reworded on its own. Every summary and decision bullet now shows hover/focus <strong>✏️ edit</strong> (inline textarea) and <strong>🗑 remove</strong> controls for the owner / organiser / designated owner / admin, in the review stage only (locked once shared or finalized — same gates as corrections).</li> <li>Edits accumulate into a visible <strong>“n edited · m removed”</strong> bar with <strong>↻ Refresh mindmap & action items</strong>: AiDE re-derives the downstream artefacts from the curated minutes, and the run lands in the processing-run history as a 🧽 <em>Refresh after summary curation</em> entry.</li> <li>Implementation item <strong>#1422</strong> (New, impl-pending) carries the web/api build-out incl. the server-side gate parity and the derived-action-item reconciliation rule.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v417 — per-point summary curation + derived refresh (#1421)</div> </div> </div> <!-- v416 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v416 — done</span> <span class="tl-title">Chart quality pass (theme-aware, CVD-safe) + image downloads for every chart & the MNA mindmap (#1419)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Reports</span> <span class="tag tag-feat">Accessibility</span> </div> <div class="tl-desc"><ul> <li><strong>Chart tokens</strong>: the four Reports SVG charts (Ups&Downs trend, return-rate bars, P&A completion line, AiDE donut) hard-coded light-theme hexes (grid <code>#e2e8f0</code>, ink <code>#64748b</code>) that broke in dark mode. They now draw from <code>--ch-*</code> CSS variables with per-theme steps <strong>validated with the data-viz palette checker against the real surfaces</strong> (#ffffff / #1e293b).</li> <li><strong>Colorblind-safe Ups/Downs</strong>: the old green/red pair fails deutan simulation (ΔE 4.1). Ups vs Downs is polarity, so it now uses the <strong>diverging blue↔red pair</strong> — worst-case CVD ΔE 23.8 (light) / 19.2 (dark), all checks PASS. The 📈/📉 icons and legend stay as secondary encoding. P&A line markers upped to the 8px spec.</li> <li><strong>Downloads</strong>: new shared <code>assets/js/chart-tools.js</code> — <code>PGChart.download()</code> exports any inline SVG chart as <strong>.svg or .png</strong> (2× canvas, painted on the current theme surface, CSS vars resolved so the file is self-contained). ⬇ PNG / ⬇ SVG buttons on all four chart cards.</li> <li><strong>Meeting Notes AI</strong>: the discussion <strong>mindmap downloads separately as an image</strong> (user request) — PNG/SVG buttons on the mindmap card, filename derived from the meeting title.</li> <li>Implementation item <strong>#1420</strong> (New, impl-pending): mirror in web ReportsScreen/MeetingDetail — chart tokens, CVD-safe pair, downloads, plus the full hover/tooltip layer per the dataviz spec.</li> </ul></div> <div class="tl-commit">💄 mockup(reports,meetings): v416 — chart quality pass + image downloads (#1419)</div> </div> </div> <!-- v415 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v415 — done</span> <span class="tl-title">X/Y attention counters — immediate-action vs total-open, on My Work & My Action Items (#1417)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Navigation</span> </div> <div class="tl-desc"><ul> <li>User request: a compact <strong>X/Y</strong> counter where <strong>X = tasks needing immediate action</strong> (overdue action items; for My Work also returned submissions) and <strong>Y = total tasks not completed yet</strong>.</li> <li><strong>Sidebar badges</strong> (shared nav.js): My Work shows <code>3/11</code>, My Action Items shows <code>2/5</code> — red-tinted pill while X > 0, neutral at 0, tooltip spelling out the split (“2 need immediate action · 5 not completed yet”). Hidden in the collapsed icon rail where there is no room.</li> <li><strong>Page headers</strong>: matching ⚠ X/Y chips beside the My Action Items title and in the My Work hero. Demo values mirror each page’s own data; the implementation must derive both numbers from the same access-scoped queries that feed the screens (impl item <strong>#1418</strong>).</li> </ul></div> <div class="tl-commit">💄 mockup(nav): v415 — X/Y attention counters (#1417)</div> </div> </div> <!-- v414 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v414 — done</span> <span class="tl-title">Cycle History: Project + POD columns for row-level visibility (#1415)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Cycle History</span> </div> <div class="tl-desc"><ul> <li>User request (from a live screenshot): the All Cycles table rows carried no project context — the Project and POD names appeared only in the page header. Every row now shows a <strong>Project</strong> column (bold name) and a <strong>POD</strong> column (purple chip).</li> <li>Both are wired into the <strong>Customise View</strong> system as optional columns visible by default — the column chooser, saved views and the view-scoped CSV export all pick them up automatically. The slide-over row preview drawer (v412) also gains Project / POD lines.</li> <li>Implementation item filed for the web CycleHistoryScreen (columns + view-prefs + CSV + API payload fields): <strong>#1416</strong> (New, impl-pending; from-mockup).</li> </ul></div> <div class="tl-commit">💄 mockup(cycle-history): v414 — Project + POD columns (#1415)</div> </div> </div> <!-- v413 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v413 — done</span> <span class="tl-title">Meeting Notes AI: video intake ENABLED — 50 MB upload cap, Project Lead and above only (#1413)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>The 🎥 <strong>Video recording</strong> intake is no longer a “Phase 2 — coming soon” placeholder: the intake tab and the create-meeting recording zone are <strong>live</strong>. Accepts <code>.mp4 / .mkv / .webm / .mov</code> with a hard <strong>50 MB</strong> cap (was the placeholder’s 4 GB copy) — an over-limit pick gets a clear toast with the file’s actual size. The existing upload progress bar + automatic-retry attempt counter UX is retained; the create modal stages the recording (name + size shown) for upload after creation.</li> <li><strong>Role gate:</strong> video upload is available to <strong>Project Lead and above</strong> only — project contributors see the tab and the create-modal zone locked (🔒 tooltip explaining who may upload), and the pick handlers refuse as defence-in-depth. The web implementation must enforce the same rule server-side (UI/API role-gating parity).</li> <li>Index card, PAGES.md and the page’s gap chip updated: the old placeholder item #1084 is Done (it delivered only the disabled placeholder), so the enablement is tracked by new impl item <strong>#1414</strong> (upload API with server-side 50 MB limit + 403 for contributors, AiDE transcribe pipeline, ET-035/ET-043 notifications).</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v413 — enable video intake, 50 MB cap, Project Lead+ (#1413)</div> </div> </div> <!-- v412 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v412 — done</span> <span class="tl-title">Navigation & layout batch: My Work hub, palette data search, breadcrumbs, sidebar rail, slide-over previews, dashboard customise, mobile tab bar, tour + web-parity chip sweep (#1409)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Navigation</span> <span class="tag tag-chore">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>📥 My Work hub</strong> (new page + sidebar/palette/index entries): one page merging everything waiting on the signed-in user — cycles at your rung, bilateral reviews, submissions due, returned items, open action items and meetings to finalize, each with a jump-in link.</li> <li><strong>⌘K palette v2</strong>: typing now also finds <em>data</em> — cycles by id, meetings, action items and (admin/PMO-gated) people — not just pages. <strong>Breadcrumbs + Older/Newer switcher</strong> on Cycle Detail walk the archive without bouncing to the list; <strong>slide-over previews</strong> on Cycle History open a row’s summary in a right-hand drawer keeping filters/selection intact.</li> <li><strong>Shell</strong>: sidebar collapses to a 64px icon rail (persisted, tooltips carry labels), a <strong>Pinned projects</strong> section deep-links into the role’s workflow page, and a <strong>mobile bottom tab bar</strong> (≤768px) carries Home / My Work / Ups & Downs / Meetings / More. <strong>Dashboard</strong> gains show/hide section personalisation (persisted) and a 4-step first-run tour (re-run via 🧭 Tour).</li> <li><strong>Notifications</strong>: dedicated 🎤 Meeting Notes AI section listing the module’s distinct activities (action-item assigned, AiDE finished/failed, added to meeting, finalized, deleted) with its own mark-section-read, a 🎤 category chip, and per-day “Mark day read” buttons.</li> <li><strong>Web-parity sweep</strong> (impl→mockup sync): removed 10 STALE impl-pending azref chips for work that shipped in the web app (#1060, #1062, #1064, #1066, #1074, #1077, #1079, #1081, #1083, #1085), retagged the Meeting Notes AI index card to its one genuinely-open gap (#1084 video Phase 2), and cleared the outdated 🚧 treatment from the Project Lead (#931) and Audit Log (#909) cards — both shipped.</li> </ul></div> <div class="tl-commit">💄 mockup(nav): v412 — navigation & layout batch + stale-chip parity sweep (#1409)</div> </div> </div> <!-- v411 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v411 — done</span> <span class="tl-title">Reports & Analytics: per-feature report coverage — Meetings, action items, users, email, MCP, attachments (#1407)</span> <span class="tl-date">18 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Feature</span> <span class="tag tag-feat">Reports</span> </div> <div class="tl-desc"><ul> <li>The Reports page covered Ups & Downs, Priorities & Achievements, Timeline and digests — but <strong>six feature areas had no report at all</strong>. Added one card per gap: <strong>🎤 Meeting Notes AI</strong> (meetings held, AiDE runs, MoM success rate, failed runs, action items per project), <strong>✅ Action Item Aging</strong> (open/overdue/completed KPIs, age buckets, per-assignee table), <strong>👥 User Adoption & Access</strong> (active users by role, sign-ins, pending invites), <strong>📧 Email Deliverability</strong> (delivered/failed/recovered, by category), <strong>🔌 MCP Plugin Usage</strong> (tokens, calls, success rate, top tools), and <strong>📎 Evidence Attachments</strong> (files by module, storage, uploaders).</li> <li>KPI strip gains an <strong>Open action items</strong> tile (with overdue delta); the Data Exports card gains five matching CSV buttons. New tables reuse the comparison-table + sortable-header pattern and carry <code>scope="col"</code> headers.</li> <li>Implementation item filed for the web/API build-out of these report cards (New, impl-pending; from-mockup), dependent on #1407.</li> </ul></div> <div class="tl-commit">💄 mockup(reports): v411 — per-feature report coverage (#1407)</div> </div> </div> <!-- v410 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v410 — done</span> <span class="tl-title">Admin Access & Security: Auth Rate Limit min aligned to the API floor (5), fixing a guaranteed 400 (#1228)</span> <span class="tl-date">17 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Fix</span> <span class="tag tag-fix">Admin</span> </div> <div class="tl-desc"><ul> <li>The <strong>Auth Rate Limit (per 15 min)</strong> input allowed <code>min=1</code>, but the API validates the value as an integer between <strong>5 and 1000</strong> and returns a 400 otherwise. So a security-conscious admin <em>tightening</em> the limit to 1–4 — exactly the direction they’d move it — got a guaranteed “must be an integer between 5 and 1000” error on Save.</li> <li>Raised the input’s <code>min</code> to <strong>5</strong> to match the API floor (a previous change had relaxed it to 1 citing this mockup as the design source of truth), and noted the 5–1000 range in the field hint. UI and API validation now agree, so an un-submittable value can no longer be entered.</li> <li>Implemented in the same batch, not filed as a separate impl-pending item: <code>src/web/src/screens/AdminSchedulerScreen.tsx</code> (the live field’s <code>min={5}</code> + hint) and its test.</li> </ul></div> <div class="tl-commit">🐛 fix(mockup,web): v410 — Auth Rate Limit min aligned to the API floor of 5 (#1228)</div> </div> </div> <!-- v409 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v409 — done</span> <span class="tl-title">MCP guide + profile: tool count and catalog updated for Meeting Notes AI + Project Timeline (#1357)</span> <span class="tl-date">15 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Docs</span> <span class="tag tag-fix">MCP</span> </div> <div class="tl-desc"><ul> <li>The MCP server (<code>src/mcp</code>) previously had zero tool coverage for two modules that shipped after it was built: Meeting Notes AI and Project Timeline. Added a curated 20-tool set for both (15 meetings + 5 timeline), bringing the server from 34 to <strong>54 tools</strong>.</li> <li><code>mcp-guide.html</code>: bumped every “34 tools” reference to “54” and added two new tool-grid sections (<strong>Meeting Notes AI</strong>, <strong>Project Timeline</strong>) after the existing Admin Portal grid, matching the live catalog exactly.</li> <li><code>profile.html</code>: the MCP connect card's tool-count blurb and the AiDE Remote Servers step now read 54 tools and name the two new modules.</li> <li>Implemented in the same batch, not filed as a separate impl-pending item: <code>src/mcp/src/tools/meetings.ts</code> + <code>timeline.ts</code>, server registration, the drift-guarded <code>server.test.ts</code>/<code>validate/spec.ts</code> harness, new Jest suites, and <code>docs/claude-desktop-config.md</code> + <code>docs/mcp-setup.html</code> + <code>README.md</code> updated to match.</li> </ul></div> <div class="tl-commit">✨ feat(mockup,mcp): v409 — MCP tool catalog synced to 54 tools incl. Meeting Notes AI + Timeline (#1357)</div> </div> </div> <!-- v408 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v408 — done</span> <span class="tl-title">Ups & Downs: SPOC-level-and-above override-close + posted-to-leadership date (#1337)</span> <span class="tl-date">14 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Feature</span> <span class="tag tag-fix">Workflow</span> </div> <div class="tl-desc"><ul> <li>New <strong>⚡ Override — Close Cycle Now</strong> action on <code>spoc.html</code> (both Delivery + Sales SPOC), <code>pod.html</code>, and <code>cluster-head.html</code>: lets the project’s assigned Delivery SPOC, Sales SPOC, POD Owner, or Cluster Head close the cycle immediately, any time once the PL has submitted — not only once it has reached their own normal turn. Requires a dedicated justification comment (distinct from the routine forward/return comment) and a posted-to-leadership date; marks every other still-outstanding level Auto-Approved instead of leaving it Pending forever.</li> <li><code>cluster-head.html</code>: the existing Sign-Off card gains a required <strong>“Date posted to leadership”</strong> picker — Final Approve stays disabled until it is filled. The Review Chain Summary table’s badge vocabulary grows two entries: “⏭ Auto-Approved” for a bypassed level and “⚡ Approved (Override)” for the acting reviewer’s own row.</li> <li>Described precisely in <code>PAGES.md</code> as “closes the cycle immediately, auto-approving all other outstanding levels” — distinct wording from the existing (looser) “Return for Revision” copy nearby, so the two aren’t conflated.</li> <li>Implemented in the same batch, not filed as a separate impl-pending item: <code>src/api</code> (schema + migration, <code>cycleWorkflow.ts</code>, new <code>POST /cycles/:id/override-close</code>, <code>review-chain</code> + audit vocabulary) and <code>src/web</code> (shared <code>OverrideCloseCard</code>, all 4 workflow screens, <code>ClusterHeadScreen</code>/<code>CycleDetailScreen</code> chain badges).</li> </ul></div> <div class="tl-commit">💄 mockup: v408 — SPOC-level-and-above override-close + posted-to-leadership date (#1337)</div> </div> </div> <!-- v407 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v407 — done</span> <span class="tl-title">Mockup corrections from the non-workflow parity sweep — three annotations that misdescribed the shipped app (#1327–#1330)</span> <span class="tl-date">14 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Parity</span> </div> <div class="tl-desc"><ul> <li>A parity sweep of the ten non-workflow screens found several places where the <strong>mockup</strong> — not the web — was the stale side. Three of them actively <em>misdescribed what has already shipped</em>, which would mislead the next implementer into “fixing” working code. Corrected here.</li> <li><code>projects.html</code>: the search box’s own placeholder promises “Search by account name, ID, <strong>or POD</strong>”, but the filter never matched POD. It does now — the shipped React screen already did.</li> <li><code>my-actions.html</code>: the <code>design-forward</code> badge claimed the project <strong>filter</strong> was not shipped. It <em>is</em> (#1160). Re-pointed at what genuinely is design-forward: the row-level project chip and the 🔁 series-context line (#1062).</li> <li><code>profile.html</code>: removed the <code>#1076</code> “impl-pending” azref claiming per-project timeline mute toggles were missing. They are implemented (<code>NotificationPreferences.tsx</code> → <code>PATCH /notifications/timeline-mute</code>).</li> <li>The genuine <strong>web-side</strong> gaps the sweep found are filed, not fixed here: the Projects “Ups & Downs is locked” gate that locks nothing (#1327), the Dashboard’s hard-coded P&A heading (#1328), the missing Cycle-History archived filter (#1329), and the read-only Attachments card advertising upload limits (#1330).</li> <li>Profile came back at <strong>full parity</strong> — recorded so it is not re-swept.</li> </ul></div> <div class="tl-commit">💄 mockup: v407 — correct three annotations that misdescribed the shipped app (#1327)</div> </div> </div> <!-- v406 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v406 — done</span> <span class="tl-title">PM — Quick Link 1 standardised to the shipped copy (#1207)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Parity</span> </div> <div class="tl-desc"><ul> <li>The PM gap-audit sweep flagged Quick Link 1 as a React/mockup divergence — but on checking, <code>pod.html</code> and <code>spoc.html</code> had <strong>already</strong> been standardised to “🎯 Review Priorities & Achievements Submissions” by the POD Owner sweep (#1182), and all four React screens use that wording. <code>pm.html</code> was simply the last stale mockup, still on “🤝 Priorities & Achievements Review”.</li> <li>So the <strong>mockup</strong> was wrong here, not the app — a good reminder that “mockup is source of truth” is a default, not a reflex. Standardised <code>pm.html</code> to match its three siblings and the implementation.</li> <li>No implementation work item needed: the React screens already render the standard copy.</li> </ul></div> <div class="tl-commit">💄 mockup(pm): v406 — standardise Quick Link 1 to the shipped copy (#1207)</div> </div> </div> <!-- v405 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v405 — done</span> <span class="tl-title">PMO — Ups/Downs read-only caption synced to the shipped screen (#1205)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Parity</span> </div> <div class="tl-desc"><ul> <li>Gap-audit sweep of <code>pmo.html</code> vs <code>PMOScreen.tsx</code> (following the POD Owner #1182, Sales SPOC #1183 and Cluster Head #1204 sweeps) found exactly one divergence: the Ups and Downs card headers read <code>Read-only</code> in the mockup but <code>Read-only — current reviewed version</code> in the shipped screen.</li> <li>Synced the <strong>mockup up to the implementation</strong> here, not the other way round — the shipped copy is the more informative of the two (it tells the PMO observer they are looking at the <em>current</em> reviewed state, not a historical snapshot), so downgrading the app to match a terser mockup would have been a regression.</li> <li>No implementation work item needed: the web side already renders this copy. Everything else on the screen — the 6-level chain table, preview-journey row (correct long-label standalone form), observer alert/footer, Help + Update Digest — is already at full parity.</li> </ul></div> <div class="tl-commit">💄 mockup(pmo): v405 — sync Ups/Downs read-only caption to the shipped screen (#1205)</div> </div> </div> <!-- v404 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v404 — done</span> <span class="tl-title">Meeting Notes AI — advanced recurrence picker for Recurring series (PBI #1202)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Feature</span> <span class="tag tag-fix">Workflow</span> </div> <div class="tl-desc"><ul> <li>Follow-up to v403/#1200: asked to “use the advanced setting for the recurring selection”, pointing at <code>AdminSchedulerScreen</code>'s Add/Edit Cycle recurrence editor (Frequency, Days of Week pills, monthly Nth-weekday, live Schedule preview, Timezone) as the reference pattern.</li> <li>Replaced the New Meeting modal's flat <code>CADENCE</code> dropdown (Weekly/Bi-weekly/Monthly/Ad hoc) with the same picker already built for the mockup's own <code>admin/index.html</code> “Add Review Cycle” modal: a Frequency select, Outlook-style day-of-week pills for Weekly/Bi-weekly, a Day-of-month/Nth-weekday toggle for Monthly, and a live “↻ Next occurrence” preview that recomputes as the picker changes.</li> <li>Deliberately does <strong>not</strong> duplicate Deadline time/Timezone the way the Cycle modal does — a meeting series already has its own Start time (<code>#cm-time</code>) and Timezone (<code>#cm-tz</code>) fields earlier in the same form, so the schedule preview reads those live instead of asking twice.</li> <li><code>SERIES</code> entries now carry structured recurrence (<code>frequency</code>, <code>dayOfWeek[]</code>, <code>monthlyMode</code>, <code>dayOfMonth</code>, <code>weekday</code>, <code>ordinals[]</code>) in place of a single <code>cadence</code> string; a new <code>seriesScheduleLabel()</code> renders the series-card and series-bar pills (e.g. “Weekly · Mon, Wed”, “Monthly · 2nd Friday”) and falls back to the legacy seed shape.</li> <li>Verified headlessly via Playwright against the mockup file directly: weekly/bi-weekly day-pill selection, monthly day-of-month, monthly Nth-weekday, and ad hoc all compute the right preview text and hide/show the right rows; creating a series meeting stores the expected <code>SERIES</code> record; the pre-seeded SR-01 series still renders its pill correctly under the new label function. Zero console/page errors.</li> <li>Dependent implementation work item <a href="https://dev.azure.com/ValueLabs-PODGovernance/PODGovernance/_workitems/edit/1203" target="_blank" rel="noopener">#1203</a> (<code>impl-pending; from-mockup</code>, To Do/unassigned) tracks the matching <code>CreateMeetingModal.tsx</code> + <code>MeetingSeries</code> model/API change.</li> </ul></div> <div class="tl-commit">✨ feat(mockup): v404 — advanced recurrence picker for Recurring series (#1202)</div> </div> </div> <!-- v403 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v403 — done</span> <span class="tl-title">Meeting Notes AI — hide the one-off Follow-up meeting toggle for recurring series (Bug #1200)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Bug</span> <span class="tag tag-fix">Workflow</span> </div> <div class="tl-desc"><ul> <li>Reported via screenshot: the New Meeting modal showed both the “🔁 Recurring series” toggle and the unrelated “🔁 Follow-up meeting created” toggle at the same time. A series already has its own next-occurrence flow (add the next occurrence's transcript from the meeting page, and AiDE generates a separate MoM/mindmap/action items per occurrence) — a second, one-off follow-up toggle on the same meeting is confusing and can imply a conflicting “what happens next”.</li> <li>Create modal: checking “Recurring series” now hides the Follow-up meeting block (<code>cmSeriesToggled()</code>) and clears its state, replaced by a hint explaining the series' own next-occurrence flow.</li> <li>Edit modal: when the meeting being edited belongs to a series (<code>meeting.seriesId</code> set), the Follow-up meeting toggle is not rendered at all — the same hint is shown instead, and <code>saveMeetingEdit()</code> forces <code>followUp.created=false</code> for series occurrences regardless of any stale DOM state.</li> <li>Dependent implementation work item <a href="https://dev.azure.com/ValueLabs-PODGovernance/PODGovernance/_workitems/edit/1201" target="_blank" rel="noopener">#1201</a> (<code>impl-pending; from-mockup</code>, New/unassigned) tracks the matching fix in <code>CreateMeetingModal.tsx</code> / <code>EditMeetingModal.tsx</code>.</li> </ul></div> <div class="tl-commit">🐛 fix(mockup): v403 — hide Follow-up meeting toggle for recurring series (#1200)</div> </div> </div> <!-- v402 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v402 — done</span> <span class="tl-title">My Action Items — WYSIWYG rich-text editor + wider modal (#1187)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Feature</span> <span class="tag tag-fix">Layout</span> </div> <div class="tl-desc"><ul> <li>The “What needs doing?” field's plain textarea gained a rich-text toolbar (Bold/Italic/Underline/bullet/numbered list) — mockup-cosmetic, mirroring <code>priorities/pl.html</code>'s existing <code>.rt-toolbar</code>/<code>.rt-btn</code> pattern. The shipped React screen's <code>RichTextEditor</code> is fully functional (contentEditable, sanitized on save).</li> <li>The modal widened from 520px to <code>min(900px,95vw)</code> to give the toolbar and multi-line editing real room, rather than a cramped single-line field.</li> <li>Investigated before implementing: switching the field to rich HTML meant the API had to sanitize on write (<code>cleanRichText</code>, mirroring <code>priorities.ts</code>) and the ET-030/031/032 reminder emails had to project the HTML to plain text first (<code>richTextToPlain</code>) — otherwise a bold/list item would show as literal escaped HTML tags in the email rather than rendering as formatting. Both were fixed in the same batch as the web change.</li> <li>Implemented in the same batch as this mockup change — <code>ActionItemModal.tsx</code>, <code>MyActionItemsScreen.tsx</code> (List/Table/Board render real formatting via <code><RichText></code>; the compact Calendar chip shows a plain-text preview instead), <code>meetingService.ts</code>, and <code>schedulerService.ts</code> in <code>src/web</code>/<code>src/api</code>, so no separate impl-pending placeholder item was created.</li> </ul></div> <div class="tl-commit">✨ feat(web+api): v402 — My Action Items WYSIWYG rich-text editor + wider modal (#1187)</div> </div> </div> <!-- v401 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v401 — done</span> <span class="tl-title">Restricted-access copy + admin invite domain enforcement (Bug #1194)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Bug</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li>Login screen's restricted-access notice implied a non-@valuelabs.com email could get in via an Administrator invitation. Investigation found this was accurate to the CODE, not just misleading copy: <code>admin.ts</code>'s invitation creation only validated email shape, no domain restriction (unlike <code>/auth/magic-link</code> and <code>/auth/register</code>, which already enforce @valuelabs.com-only). Confirmed there is no non-@valuelabs.com access path anywhere in the system, by design.</li> <li>Fixed on both mockup and web: <code>login.html</code>'s notice now reads “@valuelabs.com users only — sign in, self-register, or ask an Administrator to send you an invitation.” The Invite User modal (<code>admin/index.html</code>) copy and placeholder were corrected to match, and <code>admin.js</code>'s <code>sendInvitation()</code> now rejects a non-@valuelabs.com email client-side.</li> <li>Implemented in the same batch — <code>admin.ts</code>'s <code>createSingleInvitation</code> (shared by the single and bulk invite endpoints) and <code>AdminUsersScreen.tsx</code>'s Invite User modal both gained the matching @valuelabs.com-only guard, so no separate impl-pending placeholder item was created.</li> </ul></div> <div class="tl-commit">🐛 fix(web+api): v401 — restrict invitations + fix restricted-access copy (#1194)</div> </div> </div> <!-- v400 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v400 — done</span> <span class="tl-title">My Action Items — 🎤 voice-command capture via browser Web Speech API (#1187)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Feature</span> <span class="tag tag-fix">Accessibility</span> </div> <div class="tl-desc"><ul> <li>New “🎤 Voice add” button next to “➕ New action item” on My Action Items. Uses the browser-native <code>SpeechRecognition</code>/<code>webkitSpeechRecognition</code> API to transcribe speech client-side — no new backend secret or STT service for v1.</li> <li>The final transcript pre-fills the existing new-item modal's text field; the user still reviews/confirms the due date, assignee, and reminders switch before saving via the existing <code>POST /meetings/my-actions</code> (#1140) — no backend changes needed.</li> <li>Feature-detected: the button is <code>hidden</code> (not just disabled) on a browser with no <code>SpeechRecognition</code>, e.g. iOS Safari, matching the shipped React screen's behaviour.</li> <li>Implemented in the same batch as this mockup change — <code>useVoiceCapture</code> hook + <code>MyActionItemsScreen</code>/<code>ActionItemModal</code> wiring in <code>src/web</code>, so no separate impl-pending placeholder item was created.</li> </ul></div> <div class="tl-commit">✨ feat(web): v400 — My Action Items voice-command capture (Web Speech API) (#1187)</div> </div> </div> <!-- v399 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v399 — done</span> <span class="tl-title">POD Owner screen sweep — Chain-summary self-inclusion, stale Quick-Links copy, Preview-journey placement (#1182)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Workflow</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li>Mockup↔web gap-audit sweep of <code>pod.html</code> (Ups & Downs, Step 5, POD Owner) vs the shipped <code>PODOwnerScreen.tsx</code>.</li> <li>Quick Links: first link's icon/copy (🤝 “Priorities & Achievements Review →”) was stale — the web already standardized on 🎯 “Review Priorities & Achievements Submissions” (matching <code>spoc.html</code>'s already-updated copy, and identical across DeliverySpocScreen/SalesSpocScreen/PMScreen). Updated pod.html to match; no impl impact, web was already correct.</li> <li>Preview-journey button moved from its own row below the topic notes into the action bar (“👁 Preview journey”, margin-right:auto) to match its own web implementation and the <code>pl.html</code>/<code>pm.html</code> precedent; no impl impact.</li> <li>Also fixed in the same pass (web-only, no mockup change needed): the Summary card's “Chain:” text in <code>PODOwnerScreen.tsx</code> incorrectly included POD Owner itself even though the POD Owner hasn't forwarded yet — now stops at Sales SPOC, matching this mockup's “Reviewed chain: PL → PM → Delivery SPOC → Sales SPOC” and DeliverySpocScreen's own correct (self-excluding) convention. SalesSpocScreen has the identical bug — left for a follow-up sweep of that screen.</li> </ul></div> <div class="tl-commit">🐛 fix(web): v399 — POD Owner Chain-summary + mockup copy/placement parity (#1182)</div> </div> </div> <!-- v398 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v398 — done</span> <span class="tl-title">Meeting Notes AI “gap chips” audit badges were stacked on top of each other</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Layout</span> <span class="tag tag-fix">Polish</span> </div> <div class="tl-desc"><ul> <li>Follow-up to v397/#1184 (which un-blanked the page): the six AzDO ticket badges in the Meeting Notes AI header sat in a flex row wrapper but used <code>.azref</code>, which is <code>position:absolute</code> by design (a single corner badge per element) — so all six stacked at one point and only the top one was clickable.</li> <li>Matched index.html’s multi-badge pattern: flow them inline with <code>position:static</code> (dropping the <code>corner</code> variant). All six (#1062/#1064/#1066/#1081/#1082/#1084) now render as a row and are individually clickable. This only became visible once v397 fixed the parse error that had left the whole page blank.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v398 — Meeting Notes AI gap-chip badges flow in a row instead of stacking</div> </div> </div> <!-- v397 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v397 — done</span> <span class="tl-title">Two more mockup pages were broken: Meeting Notes AI rendered fully blank; History scrolled sideways</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Layout</span> <span class="tag tag-fix">Bug</span> </div> <div class="tl-desc"><ul> <li><strong>How they were found</strong>: after the index-page nested-<code><a></code> fix (v396/#1181), a mockup-wide render smoke (load every page, capture console/page errors, check body height + horizontal overflow) surfaced two more broken pages.</li> <li><strong>Meeting Notes AI was completely BLANK</strong> (Bug #1184): a “Gap chips” block of AzDO ticket links had been pasted as <em>raw HTML into the middle of a</em> <code>var html = '…' + '…'</code> <em>string-concatenation</em>, leaving an unterminated string literal — <code>Invalid or unexpected token</code> — so the entire page script failed to parse and nothing rendered. Fixed by properly quoting those lines as JS string operands; the page now renders in full (KPI tiles, meeting list, series occurrences).</li> <li><strong>History scrolled sideways</strong> (Bug #1184): a timeline description contained a literal, unescaped <code><select multiple></code> tag which the browser rendered as a real ~8000px-wide form control, blowing out the page width. Escaped it to display as text.</li> <li>No dependent impl work items — both are mockup-only rendering bugs on the mockup’s own pages, with no product/web surface to change.</li> </ul></div> <div class="tl-commit">🐛 fix(mockup): v397 — Meeting Notes AI blank-page (JS parse error) + History overflow (unescaped <select>)</div> </div> </div> <!-- v396 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v396 — done</span> <span class="tl-title">Index landing page: 15 cards silently broken by illegal nested <a> (AzDO ticket links)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Layout</span> <span class="tag tag-fix">Bug</span> </div> <div class="tl-desc"><ul> <li><strong>The bug</strong> (found when the Login/Magic Link card and ~a dozen others rendered with their icon/title/description spilled out of the card and floating in the wrong grid column): every <code>.page-card</code> is an <code><a></code>, and the cards that carry an AzDO ticket badge nested a second <code><a></code> (the <code>.azref</code> corner link, and the inline <code>#NNN</code> link inside a <code>.tag-todo</code> tag) <em>inside</em> that card anchor. Nested <code><a></code> is illegal HTML, so the browser auto-closed the card anchor at the inner link and re-parented the rest of the card’s content as direct grid children — breaking the layout of all 15 ticket-bearing cards (Login/Magic Link, Project Timeline, Meeting Notes AI, Cluster Head, Cycle Detail, My Profile, What’s New, Reports & Analytics, …). Cards without a ticket link were unaffected.</li> <li><strong>The fix</strong>: converted the 12 <code>.azref</code> corner anchors and the 3 inline <code>.tag-todo</code> ticket anchors to <code><span data-href></code> (a <code><span></code> inside <code><a></code> is valid; only nested anchors are not), with a small delegated click/keyboard handler that opens the work item in a new tab and stops propagation so the card link underneath does not also fire. The backlog table’s <code>#NNN</code> links were left as real anchors — they live in <code><div></code> rows, not inside a card <code><a></code>, so they were never nested. Verified every grid now has zero spilled children and all cards render uniformly.</li> <li>No dependent impl work item — this is the mockup’s own links-landing page (<code>index.html</code>), not a product screen, so there is no web/API surface to change.</li> </ul></div> <div class="tl-commit">🐛 fix(mockup): v396 — index cards no longer broken by illegal nested <a> ticket links</div> </div> </div> <!-- v395 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v395 — done</span> <span class="tl-title">FUTURE-01 scoped out — multi-account dashboard / account switcher (#889)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Dashboard</span> <span class="tag tag-fix">New Feature</span> </div> <div class="tl-desc"><ul> <li><strong>The ask</strong> (PBI #889, priority 3, roadmap): "multi-account dashboard with an account selector" — a one-line backlog-migration note with no mockup, no spec, and no definition of "account". Scoped it out with the user rather than implementing blind: researched the domain (no <code>Account</code> entity exists — <code>Project.name</code>, e.g. “APS Bank”, IS the client account; confirmed via schema doc-comments and existing <code>.account-header</code> usage across the mockup), the existing dashboard (already has an org-wide “By POD & project” aggregate table), and existing selector patterns (<code>ProjectsScreen</code>'s card-grid, <code>ClusterHeadPAScreen</code>'s inline project-picker-when-missing).</li> <li><strong>Direction chosen</strong> (of three proposed): a persistent header account-switcher (GitHub/Stripe-style org switching), over enhancing the existing aggregate table in place or a new side-by-side multi-account landing page.</li> <li><strong>Built:</strong> <code>assets/js/nav.js</code> gained a <code>PGAccountSwitcher</code> (new <code>PG_ACCOUNTS</code> demo list mirroring command-palette.js's 9 projects) rendered into every page's shared topbar — zero per-page script-tag changes needed since nav.js already centrally builds the topbar. New <code>.account-switcher*</code> classes in <code>design-system.css</code>. <code>dashboard.html</code> now reads the selection (<code>sessionStorage.pg_selected_account</code>): shows a <code>#dash-scope-banner</code>, narrows the Total Cycles / P&A Completion stat tiles and the “By POD & project” card to the single selected project (with a graceful “No cycle data yet” fallback for demo projects outside the breakdown's 5-project sample), and filters Recent Activity to that project. PAGES.md documents the new spec under Dashboard.</li> <li>Known rough edge: the switcher's demo project list and the dashboard's pre-existing breakdown/activity demo data were never fully cross-referenced (e.g. one project name abbreviation differs) — not fixed, since it's pre-existing demo-data drift unrelated to this feature and the fallback state handles it gracefully.</li> <li>This mockup pass is the design proposal for #889, not the full implementation — #889 stays open (description updated with the finalized spec) for a future iteration to build the real API scoping + web app wiring, and to extend the switcher's effect beyond the Dashboard to other scoped screens if desired.</li> </ul></div> <div class="tl-commit">💄 mockup(dashboard): v395 — FUTURE-01 account switcher scoped out (#889)</div> </div> </div> <!-- v394 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v394 — done</span> <span class="tl-title">Delivery/Sales SPOC context-alert copy was stale vs. the shipped screens</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Workflow</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (Task #1176, found during a <code>spoc.html</code> vs <code>DeliverySpocScreen.tsx</code> deep-compare): both role branches of <code>spoc.html</code>'s context alert (<code>spoc-alert-text</code>) still read the older short copy — “Verify delivery accuracy and add any programme-level items.” (Delivery SPOC) / “Verify commercial accuracy and add any strategic account items.” (Sales SPOC). <code>pod.html</code> (POD Owner) had already been updated to a longer form explaining the colour legend, and <code>DeliverySpocScreen.tsx</code> / <code>SalesSpocScreen.tsx</code> already ship that exact longer copy for both roles — the mockup was the one out of sync, not the web.</li> <li>Replaced both branches' alert text with “You may add new items, modify existing ones, or remove incorrect ones. Modified items highlighted in <span style="color:var(--tint-warning-fg);font-weight:700">orange</span>; newly added in <span style="color:var(--tint-info-fg);font-weight:700">blue</span>.”, matching the shipped web copy verbatim for both the Delivery SPOC and Sales SPOC role views this shared page serves.</li> <li>No dependent impl work item — the web screens already have this copy; this only brings the mockup's own alert text into parity (#1176). Same sweep also fixed two real web-side gaps on <code>DeliverySpocScreen.tsx</code> (item-meta “Added by (Role)” + Preview-journey button copy/placement) under Bug #1175, committed separately.</li> </ul></div> <div class="tl-commit">💄 mockup(workflow): v394 — SPOC context-alert copy synced with shipped screens (#1176)</div> </div> </div> <!-- v393 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v393 — done</span> <span class="tl-title">MCP Setup Guide gains the 4 sections the shipped web Help MCP tab had grown</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">MCP Guide</span> <span class="tag tag-fix">Parity</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (PBI #1166, follow-up to Bug #1165's tools-table fix from the same sweep): the web Help screen's MCP Integration tab (<code>HelpScreen.tsx</code>) had grown 4 sections the standalone <code>mcp-guide.html</code> reference never had — a per-client config table for Cursor/VS Code/Windsurf/Cline/Zed, a generic-client recipe, a remove/reset-integration guide, and an “MCP token vs AiDE Fabric Token” distinction table. Left as a decision item since it was unclear whether the standalone guide is meant to track the in-app tab section-for-section or stay a lighter curated subset.</li> <li>Product decision: port all 4 sections. Added <strong>MCP Token vs AiDE Fabric Token</strong> (<code>#pat-vs-fabric-token</code>) right after the Option A/B comparison table; added <strong>Other MCP Clients</strong> (<code>#other-clients</code>, per-client config table + stdio/HTTP/Zed code samples) and its <strong>Any MCP Client — The Generic Recipe</strong> subsection (<code>#generic-client</code>), plus <strong>Remove or Reset the Integration</strong> (<code>#mcp-remove</code>, removal-step table + 3 numbered steps) between the AiDE Remote Servers troubleshooting table and the Available Tools section — matching the web tab's exact ordering. New sidebar TOC entries for all 4 anchors; content and code samples ported verbatim (adapted to the mockup's existing <code>pod-governance</code> server-key / <code>http://localhost:3001/api/v1</code> example conventions), styled with the mockup's existing <code>callout</code>/<code>.steps</code>/table classes — no new CSS needed.</li> <li>No dependent impl work item — the web Help tab already has this content; this only brings the standalone reference into parity (#1166).</li> </ul></div> <div class="tl-commit">💄 mockup(mcp-guide): v393 — port 4 missing sections from web Help MCP tab (#1166)</div> </div> </div> <!-- v392 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v392 — done</span> <span class="tl-title">Login/footer/admin-invite copy no longer claims “invitation-only”, contradicting shipped self-registration</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Login</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>login.html:693,1006</code>, <code>auth-verify.html:93</code>, <code>auth-activate.html:110</code>, <code>admin/index.html:1964</code>): the platform's own copy still said it was “invitation-only” / that “only users invited by an Administrator can sign in”, but self-service registration for <code>@valuelabs.com</code> addresses had since shipped (#1122/#1148/#1149) — visible as a direct on-screen contradiction, since the login banner's invitation-only claim sat above a register step whose own copy said “no invitation needed”. Found via a live screenshot the user shared. Traced the real access model in the API: <code>@valuelabs.com</code> addresses can sign in or self-register (no invite); only non-<code>@valuelabs.com</code> addresses require an Administrator invitation (<code>auth.ts</code>'s <code>/magic-link</code> and <code>/register</code> both enforce the domain; <code>/admin/users/invite</code> has no such restriction).</li> <li>Replaced the login banner and all four footer lines' “Invitation-only access” with “Restricted access” / “<code>@valuelabs.com</code> users can sign in or self-register; other users need an Administrator invitation.” Reworded the Admin Invite User modal's explainer (both the single-invite and its web equivalent) from “POD Governance is invitation-only” to “Use this to invite a user directly — most <code>@valuelabs.com</code> users can self-register instead.”</li> <li>Web mirrors: <code>LoginScreen.tsx</code> (banner + footer), <code>AuthVerifyScreen.tsx</code> + <code>AuthActivateScreen.tsx</code> (footers), <code>AdminUsersScreen.tsx</code> (invite modal explainer), <code>custom.css</code> (comment only). Updated <code>LoginScreen.test.tsx</code> and <code>AdminUsersScreen.test.tsx</code> assertions to match. No dependent impl work item — web and mockup updated together in this same pass (#1170).</li> </ul></div> <div class="tl-commit">💄 fix(web): v392 — restricted-access copy replaces stale invitation-only claim (#1170)</div> </div> </div> <!-- v391 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v391 — done</span> <span class="tl-title">System Status — dropped uptime %/incident-history from spec and mockup (would require fabricated data)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">System Status</span> <span class="tag tag-fix">PAGES.md</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>PAGES.md:661,666</code>, System Status spec): the spec called for per-cell uptime % and a 7-day per-service incident history, but the shipped <code>StatusScreen.tsx</code> does REAL live health-check fetches with no server-side history persistence — it never renders an uptime % or incident timeline anywhere (zero occurrences of either term). The mockup itself only half-matched the spec: <code>status.html</code>'s <code>uptimeFor()</code> displayed a fabricated/random uptime % but never implemented incident-history either. Filed as Bug #1164 (flag-and-defer, like #1154/#1155): a genuine uptime %/incident timeline needs a new backend health-check-history feature, not a quick UI fix.</li> <li>Product decision: drop the requirement from <code>PAGES.md</code> rather than build the backend feature or add simulated incident-history — a System Status page's whole purpose is live, truthful health data, so fabricating an uptime % (as the mockup was already doing) or an incident timeline undermines that purpose. Removed the uptime %/incident-history bullets from <code>PAGES.md</code>'s System Status section and added a note explaining why they're deliberately absent. Also removed <code>status.html</code>'s <code>uptimeFor()</code> function and its use in the per-service metrics line (now latency-only, matching what <code>StatusScreen.tsx</code> has always shown) — closing the gap by bringing the mockup in line with both the revised spec and the real web behavior, not just editing the spec document.</li> <li>No dependent impl work item — web already matches (never had this feature); this only removes the mockup's simulated data and the spec requirement that motivated it (#1164).</li> </ul></div> <div class="tl-commit">💄 mockup(status): v391 — drop uptime %/incident-history from spec + mockup (#1164)</div> </div> </div> <!-- v390 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v390 — done</span> <span class="tl-title">Admin Reporting Relationships — removed the manual Level field (regression risk vs. web's derived-only approach)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Admin</span> <span class="tag tag-fix">Reporting Relationships</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>admin/index.html:2153-2166</code>, Add/Edit Reporting Relationship modal): the mockup had a required, independently-selected <code>Level</code> dropdown (Project Lead / Project Manager / Delivery SPOC / … / Cluster Head) that an admin picked separately from the Direct Report and Manager pickers. The shipped web app (<code>AdminReportingRelationshipsScreen.tsx</code>) has no such field — Level is derived purely for display from the direct report's role (<code>pairLabel()</code>), and the API schema (<code>ReportingRelationship</code>) has no backing column for it either. Filed as Bug #1155 for a product decision (flag-and-defer pattern, like #1154): letting an admin manually pick a Level independent of the actual role risked bad/contradictory data — this looked like a deliberate simplification already baked into the API schema, not a web gap. Decision: delete the manual field from the mockup.</li> <li>Removed the <code>Level</code> form-group/select from the Add/Edit Reporting Relationship modal (replaced with a hint that Level is derived automatically); <code>admin.js</code>'s <code>saveRelationship()</code> now derives <code>level</code> from the selected Direct Report's primary role (new <code>deriveLevel()</code> helper, mirrors web's <code>pairLabel()</code>) instead of reading a manual select, and no longer requires a Level value to save. Table rendering, CSV export, and the role-pairs KPI are unchanged (they already just read <code>r.level</code>, now auto-derived on save instead of manually chosen).</li> <li>No dependent impl work item needed — web already has the correct derived-only behavior; this only removes the mockup's extraneous manual field so it matches (#1155).</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v390 — Reporting Relationships Level field now derived, not manually picked (#1155)</div> </div> </div> <!-- v389 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v389 — done</span> <span class="tl-title">MCP Setup Guide — tools table missing get_cycle_digest, undercounting its own header</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">MCP Guide</span> <span class="tag tag-fix">Tools Table</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>mcp-guide.html</code>, Available Tools section, <code>#tools</code>): the tools table listed only 33 rows across its five categories (Cycle Workflow 5, Ups & Downs Items CRUD 4, Priorities & Achievements 8, Reports & Admin 3, Admin Portal 13) while its own section header claimed “Available Tools (34)”. The missing row was <code>get_cycle_digest</code> — a real, shipped MCP tool (<code>src/mcp/src/tools/cycles.ts:160</code>, tested in <code>src/mcp/src/tests/cycles.test.ts</code> and enumerated in <code>server.test.ts</code>'s full tool list) that the web Help screen's MCP Integration tab already lists correctly under “Cycle workflow (10)” (<code>HelpScreen.tsx:1818-1833</code>), totaling 34. A stale/incomplete tool table is a real usability gap for anyone wiring up an MCP client from this reference.</li> <li>Added a <code>get_cycle_digest</code> tool-card to the Cycle Workflow grid (between <code>get_review_chain</code> and <code>forward_cycle</code>, matching the web's ordering), bringing the listed count to 34 and back in sync with the header.</li> <li>No dependent impl work item needed — the MCP server and web Help screen already ship and document this tool; this only fixes the standalone reference mockup's own tool table (#1165). Also found during this sweep: the web Help screen's MCP tab has several sections the mockup lacks entirely (multi-client config for Cursor/VS Code/Windsurf/Cline/Zed, a generic-client recipe, a remove/reset-integration guide, and an “MCP token vs AiDE Fabric Token” distinction table) — filed separately since it's unclear whether the standalone reference is meant to track the in-app Help content section-for-section.</li> </ul></div> <div class="tl-commit">💄 mockup(mcp-guide): v389 — tools table gains missing get_cycle_digest row (#1165)</div> </div> </div> <!-- v388 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v388 — done</span> <span class="tl-title">System Status — About/Roles copy was stale vs. the shipped StatusScreen</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">System Status</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>status.html:164-193</code>, About/Roles section): the mockup's About paragraph and per-role Responsibility text were an older, terser draft, while the shipped <code>StatusScreen.tsx</code> (lines 460-509) had since grown a richer About paragraph (ValueLabs governance/oversight portal framing plus the two workflow-chain bullets) and more detailed per-role responsibilities, including <code>(PL)</code>/<code>(PM)</code> abbreviations on the first two roles.</li> <li>Synced <code>status.html</code>'s About paragraph, added the two workflow-chain bullets, and updated all ten Roles-table responsibility strings and the two role labels to match the shipped web copy verbatim.</li> <li>No dependent impl work item needed — the web app already has this copy; this only brings the mockup's own reference page into parity (#1163). Also found during this sweep: <code>StatusScreen.tsx</code> never renders a per-service uptime % (mockup's <code>uptimeFor()</code> does) and neither side implements the PAGES.md-spec'd 7-day incident history — filed as Bug #1164 (New/unassigned) since a genuine live uptime %/incident timeline needs new backend health-check-history persistence, not a quick UI fix.</li> </ul></div> <div class="tl-commit">💄 mockup(status): v388 — About/Roles copy synced with shipped StatusScreen.tsx (#1163)</div> </div> </div> <!-- v387 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v387 — done</span> <span class="tl-title">Profile — My MCP Access Tokens table had no empty state</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Profile</span> <span class="tag tag-fix">MCP Tokens</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>profile.html:634-663</code>, <code>renderMyTokens()</code>): when <code>window.profileState.myTokens</code> is an empty array, the function maps over it and joins the result, which for zero rows is just <code>''</code> — the table renders with a header row and nothing below it, no message at all. The shipped web app's <code>ProfileScreen.tsx</code> (lines 512-515, <code>data-testid="tokens-empty"</code>) already handles this case with a centered “No tokens yet. Click “Generate Token” to create one.” message — the mockup was the one out of sync.</li> <li>Fixed <code>renderMyTokens()</code> to short-circuit on an empty list: renders a single full-width (<code>colspan="8"</code>) row with matching copy and also hides the token-expiry banner in that case (previously left in whatever state the last render left it).</li> <li>No dependent impl work item needed — the web app already has this empty state; this only fixes the mockup's own missing affordance (#1158).</li> </ul></div> <div class="tl-commit">💄 mockup(profile): v387 — My MCP Access Tokens table gains an empty state (#1158)</div> </div> </div> <!-- v386 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v386 — done</span> <span class="tl-title">Cycle-detail post-approval note: char counter said “/ 2000”, API/web enforce 500</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Cycle Detail</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>cycle-detail.html:56,58,470</code>): the post-approval note textarea (<code>#post-note-text</code>) used the app's generic 2000-char comment-field convention (<code>n+' / 2000'</code>, warn past 1800, no <code>maxlength</code> attribute) — but this field is special-cased server-side: <code>routes/cycles.ts:2775</code> throws “Note text must be 500 characters or fewer.” The shipped <code>CycleDetailScreen.tsx</code> (lines 512, 520-521) already correctly uses <code>maxLength={500}</code> with a warn threshold past 450 — the mockup was the one out of sync with both the API contract and the shipped web implementation.</li> <li>Fixed the mockup: added <code>maxlength="500"</code> to the textarea, changed the <code>oninput</code> counter/warn-threshold to <code>/ 500</code> and <code>>450</code>, and fixed the same stale <code>'0 / 2000'</code> reset string in <code>toggleAddNoteForm()</code>.</li> <li>No dependent impl work item needed — the web app and API already enforce 500 correctly; this is a mockup-only fix bringing it into parity (#1157).</li> </ul></div> <div class="tl-commit">💄 mockup(cycles): v386 — post-approval note char counter now matches the API's 500-char limit (#1157)</div> </div> </div> <!-- v385 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v385 — done</span> <span class="tl-title">Edit-meeting modal: mockup drifted from the web component it claims to mirror (title, required-field markers, follow-up toggle)</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Meeting Notes AI</span> <span class="tag tag-fix">Edit modal</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: <code>openEditMeetingModal()</code>'s own comment (line 2710-2711) states it was built to mirror <code>EditMeetingModal.tsx</code> — but three things had drifted: (1) the modal title said “✏️ Edit meeting” vs web's “✏️ Edit meeting details”; (2) no required-field <code>*</code> markers on Title/Platform/Date/Start time/Duration, which web has; (3) most substantively, the follow-up date was an always-visible input with no toggle, while web (and the mockup's OWN <strong>create</strong>-meeting modal, <code>#cm-followup</code>) gate it behind a “🔁 Follow-up meeting created” checkbox — the edit modal was internally inconsistent with the create modal AND diverged from the component it claims to mirror.</li> <li>Fixed all three: aligned the title text, added the <code>*</code> markers, and added an <code>#em-followup-toggle</code> checkbox that show/hides <code>#em-followup</code> exactly like the create modal's <code>#cm-followup</code>; <code>saveMeetingEdit()</code> now reads the toggle state instead of inferring “created” from whether the date field has a value.</li> <li><strong>Reverse-direction fix</strong>: the mockup's owner-only helper note (“Only the meeting owner can change these…”, line 2724) was missing from <code>EditMeetingModal.tsx</code> entirely — ported it into the web modal verbatim.</li> <li>No dependent impl work item needed beyond the web-side port already made in this same commit.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings),fix(web): v385 — Edit-meeting modal parity (title, required markers, follow-up toggle, owner note) (#1156)</div> </div> </div> <!-- v384 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v384 — done</span> <span class="tl-title">Projects: search placeholder gains “ID” (already matched by <code>filterProjects()</code>) + web's Open button now says “Open Cycle →”</span> <span class="tl-date">13 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Ups & Downs</span> <span class="tag tag-fix">Copy</span> </div> <div class="tl-desc"><ul> <li><strong>Search placeholder</strong> (<code>projects.html:34</code>): said “account name or POD”, but <code>filterProjects()</code> (line 445) already matches by <strong>project ID</strong> too — the placeholder was stale relative to its own logic. Web's placeholder (<code>ProjectsScreen.tsx:353</code>) already correctly says “account name, ID, or POD”. Updated the mockup to match.</li> <li><strong>Open button label</strong>: mockup's project card (<code>projects.html:436</code>) reads “Open Cycle →”; the shipped <code>ProjectsScreen.tsx</code> (line 616) said the terser “→ Open” — its own header comment documented that shorter text as intentional, but nothing explained the drift from the mockup's more descriptive wording, and no test asserts the literal string (only the testid). Updated web to match the mockup's copy.</li> <li>Found via a deep U&D-workflow-internals audit (project cards, role screens, return-reason banners, approve/return/forward wording) — everything else compared byte-for-byte identical; these two copy strings were the only drift.</li> </ul></div> <div class="tl-commit">💄 mockup(projects),fix(web): v384 — Projects search placeholder + Open Cycle button copy parity (#1153)</div> </div> </div> <!-- v383 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v383 — done</span> <span class="tl-title">New Meeting modal: allow pasting the transcript text at creation, not just uploading a file</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> <span class="tag tag-feat">Create modal</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: the shipped web app's create-meeting modal (<code>CreateMeetingModal.tsx</code>) reuses the shared <code>TranscriptDropzone</code> component, which offers <strong>both</strong> a file upload and a paste-text option at creation time — the mockup's create modal (<code>openCreateModal()</code>) only ever offered the file upload (<code>txZoneHtml()</code>); pasting was possible only afterwards, from the meeting's own detail page (<code>renderDraftIntake</code>'s <code>#tx-text</code> textarea).</li> <li>Confirmed genuine, not stale: this is an intentional code-level split in the mockup with no comment suggesting it should be unified, and no AzDO item currently tracks it (checked #1073, out of scope — People-hub IA only).</li> <li>Added an <strong>“or paste the text”</strong> divider + textarea (<code>#cm-tx-text</code>) to the create modal, mirroring the detail page's own draft-intake layout. On submit, pasted text (when no file was uploaded) stages a synthetic transcript chip via the same <code>pendingTx</code> mechanism a dropped file already uses — mirroring the shipped API, which attaches either a file or <code>transcriptText</code> to the meeting at creation.</li> <li>No dependent impl work item needed — the web app already ships this capability; this only brings the mockup's create modal up to parity with it.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v383 — New Meeting modal accepts a pasted transcript, not just a file (#1152)</div> </div> </div> <!-- v382 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v382 — done</span> <span class="tl-title">Meeting Notes AI: add the missing ❓ Help link (list & detail views)</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Meeting Notes AI</span> <span class="tag tag-fix">Help</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>meeting-notes-ai.html</code>): every other primary mockup screen (Dashboard, Notifications, Profile, Reports, Timeline, P&A History, Admin) has a ❓ Help link in its header, but this page had none — despite <code>help.html#help-meetings</code> already having a full, ready-to-link “🤝 Meeting Notes AI” section.</li> <li>The shipped web app implements this exact affordance on <strong>both</strong> screens: <code>MeetingNotesScreen.tsx</code> and <code>MeetingDetailScreen.tsx</code> each render a ❓ Help button opening <code><HelpModal topic="meetings"></code> — the mockup was the one out of sync.</li> <li>Added a <code>❓ Help</code> link to the <strong>list view</strong> header (next to “+ New Meeting”) and the <strong>detail view</strong>'s top action bar (next to “← All meetings”), both pointing at <code>help.html#meetings</code>, mirroring the existing <code>timeline.html</code> Help-link markup/style exactly.</li> <li>No dependent impl work item needed — the web app already has this on both screens; this only fixes the mockup's own missing affordance.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v382 — add the missing Help link to Meeting Notes AI (#1151)</div> </div> </div> <!-- v381 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v381 — done</span> <span class="tl-title">Command palette (⌘K): add the five missing People & Organisation tab deep-links</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Navigation</span> <span class="tag tag-fix">Command Palette</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>assets/js/command-palette.js</code>): the shared palette's <code>Admin</code> group had a single <strong>People & Organisation</strong> entry linking to the hub landing page, while the shipped web <code>CommandPalette.tsx</code> (lines 61-68) also lists five entries that deep-link straight into a specific hub tab — Projects, PODs, Users & Roles, Reporting Relationships, Org Hierarchy — so typing “users” or “org hierarchy” finds the exact tab, not just the hub.</li> <li>The mockup's own admin router already supports this: <code>admin/admin.js</code>'s <code>PEOPLE_TAB_FOR</code> map resolves legacy hash keys <code>#projects</code>/<code>#pods</code>/<code>#users</code>/<code>#reporting</code>/<code>#org-hierarchy</code> straight to the matching hub tab — the capability existed, it just wasn't exposed as palette commands.</li> <li>Added the five entries to <code>COMMANDS</code>, mirroring the web app's icons/labels/keywords exactly (<code>admin-projects</code>, <code>admin-pods</code>, <code>admin-users</code>, <code>admin-reporting</code>, <code>admin-org</code>).</li> <li>No dependent impl work item needed — the web app already has all five commands; this only brings the mockup's shared palette back in sync with what's shipped.</li> </ul></div> <div class="tl-commit">💄 mockup(nav): v381 — command palette gains the five People & Organisation tab deep-links (#1150)</div> </div> </div> <!-- v380 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v380 — done</span> <span class="tl-title">Admin sidebar: add the missing Meeting Notes AI link (Management group)</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">Navigation</span> <span class="tag tag-fix">Admin</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong>: <code>admin/index.html</code>’s <code>#section-meetings</code> register (Meeting Notes AI stats, filters, and table — already tracking #1068/#1080/#1081) has always had real content, but <code>assets/js/nav.js</code>’s Management group only ever linked <strong>People & Organisation</strong> — the meetings register was reachable only by typing the URL hash directly, never from the sidebar.</li> <li>Found via a mockup↔web parity audit: the shipped web app’s <code>AppShell</code> Management group already lists <strong>People & Organisation</strong> then <strong>🤝 Meeting Notes AI</strong> side by side — the mockup was the one out of sync, not the implementation.</li> <li>Added <code>🤝 Meeting Notes AI</code> to the Management section, immediately after People & Organisation, mirroring the web app’s own order exactly.</li> <li>No dependent impl work item needed — the web screen (<code>AdminMeetingsScreen.tsx</code>, routed at <code>/admin/meetings</code>) already exists and is already reachable from its own sidebar; this only fixes the mockup’s discoverability.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v380 — add the missing Meeting Notes AI sidebar link (#1146)</div> </div> </div> <!-- v379 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v379 — done</span> <span class="tl-title">Per-item reminder mute for self-raised action items (🔔 switch in the modal, 🔕 badge on the row)</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">My Action Items</span> <span class="tag tag-feat">Reminders</span> </div> <div class="tl-desc"><ul> <li><strong>The gap</strong> (<code>my-actions.html</code>): a meeting-born action item inherits its meeting’s <em>reminders enabled</em> switch (the owner’s per-meeting toggle), but a <strong>self-raised</strong> item (v378 / #1140) has no meeting to inherit from — so it always sent ET-030/031/032 with no way to quiet it.</li> <li><strong>🔔 Remind me about this</strong>: the modal’s static “reminders follow the due date” note becomes a real checkbox, <strong>on by default</strong> (a due date that never chases you is a trap), that spells out the consequence when unticked — <em>“🔕 Muted — still tracked, but sends no reminders”</em>.</li> <li><strong>🔕 No reminders</strong> badge on any OPEN item whose reminders won’t fire — a muted self-raised one, <em>and</em> one from a meeting whose owner switched reminders off, which was previously invisible on this screen. A done item gets no badge (nothing left to remind about).</li> <li>Muting is <strong>curation</strong>: only the person who raised the item may mute it — the assignee closes the item, they don’t get to silence the raiser’s chase-up mail.</li> <li>Mirrors the SHIPPED behaviour (#1143, implemented in the same batch) — no new impl work item needed.</li> </ul></div> <div class="tl-commit">💄 mockup(my-actions): v379 — per-item reminder mute for self-raised action items (#1143)</div> </div> </div> <!-- v378 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v378 — done</span> <span class="tl-title">My Action Items: four views (List / Table / Calendar / Board), group-by, and self-raised action items on the same reminder pipeline</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">My Action Items</span> <span class="tag tag-feat">Views</span> <span class="tag tag-feat">Grouping</span> <span class="tag tag-feat">Self-raised items</span> </div> <div class="tl-desc"><ul> <li><strong>Four views</strong> (<code>my-actions.html</code>): the existing <strong>📋 List</strong> and <strong>🗓️ Calendar</strong> are joined by a dense <strong>▦ Table</strong> and a <strong>🗂️ Board</strong> — a kanban by due bucket (Overdue / Due today / Due this week / Later / Closed) where an <em>empty</em> bucket draws no column at all, so the default pending-only filter never shows a dead “Closed” lane. The Calendar is no longer design-forward — it ships.</li> <li><strong>Group by</strong>: Due date (default), Meeting, Project, Status, Source — applies to List + Table; <em>disabled</em> on Calendar and Board, which group by due date already (the control says so in its tooltip).</li> <li><strong>➕ New action item</strong> (#1140): raise a <strong>standalone</strong> item with no meeting behind it. Assignee defaults to 🙋 Myself but may be any active colleague; the modal states plainly that reminders follow the due date using the <em>same</em> ET-030 / ET-031 / ET-032 emails as a meeting action item. ✏️/🗑️ appear only on items you raised — a meeting-born item stays curated on its meeting, behind the finalize lock — and a self-raised item is badged “🙋 Self-raised” instead of linking to a meeting.</li> <li>Mirrors the SHIPPED web screen: this page now documents #1140 (API + standalone items) and #1141 (views + grouping), both implemented in the same batch — no new impl work item is needed.</li> </ul></div> <div class="tl-commit">💄 mockup(my-actions): v378 — four views + group-by + self-raised action items (#1141)</div> </div> </div> <!-- v377 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v377 — done</span> <span class="tl-title">Reports & Dashboard detail upgrade (trend deltas, per-POD/project breakdown, this-week cycle, global report filters, KPI strip, Governance-SLA report + drill-down) + index card-layout fix</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Dashboard</span> <span class="tag tag-feat">Reports</span> <span class="tag tag-feat">Layout fix</span> </div> <div class="tl-desc"><ul> <li><strong>Dashboard</strong> (<code>dashboard.html</code>): KPI tiles gain <strong>trend deltas</strong> (▲/▼ vs last week/cycle); a new <strong>“This week’s cycle”</strong> panel (stage pipeline, submitted/pending/returned counts, deadline countdown); a <strong>per-POD / per-project</strong> completion breakdown with bars; and a <strong>richer Recent Activity</strong> feed — type icons, actor + role, relative time, and <em>All / P&A / U&D / Meetings</em> filter chips.</li> <li><strong>Reports</strong> (<code>reports.html</code>): a <strong>global filter toolbar</strong> (date-range presets + custom, POD, project) that re-scopes every card with a live scope label; a <strong>KPI summary strip</strong> (cycles, P&A completion, return rate, avg cycle time, AiDE runs) with trend deltas; and a new <strong>Governance SLAs & Participation</strong> report (on-time submission, avg approval latency, active participants) with an expandable <strong>per-project drill-down</strong>.</li> <li><strong>Index layout fix</strong> (<code>index.html</code>): hardened <code>.page-card</code> — <code>align-items:flex-start</code> so no child stretches, the tag pinned to a uniform bottom line (<code>margin-top:auto</code> + <code>align-self:flex-start</code> + <code>flex:0 0 auto</code>, fixing the stretched-pill symptom), a min-height on the icon, and extra bottom padding for the azref chips — addressing the misaligned-card screenshot.</li> <li>Dependent impl PBIs filed: #1127 (dashboard detail) and #1128 (reports detail).</li> </ul></div> <div class="tl-commit">💄 mockup(reports,dashboard): v377 — reports + dashboard detail upgrade + index card-layout fix (#1126)</div> </div> </div> <!-- v376 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v376 — done</span> <span class="tl-title">Major access change — self-registration with a ValueLabs email (no invitation) + P&A gated on an active reporting-manager mapping + Ups & Downs gated on a project mapping (Project Lead or above)</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Login / Registration</span> <span class="tag tag-feat">Priorities & Achievements</span> <span class="tag tag-feat">Ups & Downs</span> <span class="tag tag-feat">Access control</span> </div> <div class="tl-desc"><ul> <li><strong>Self-registration</strong> (<code>login.html</code>): a <strong>@valuelabs.com</strong> email with no account is now offered <em>direct registration</em> — the old “not invited / contact admin” dead-end became a <strong>Create your account</strong> step (name → <code>registerAndContinue()</code>). Since the backend always appends <code>@valuelabs.com</code>, every not-found address is a valid work email, so no invitation is required. The new account starts <strong>unmapped</strong> (no reporting manager, no project), so it lands on the Dashboard + Meeting Notes AI with P&A and U&D gated. New demo chip: <em>🆕 New user — self-register</em>.</li> <li><strong>P&A access gate</strong> (<code>nav.js</code> + <code>priorities/pl.html</code>): Priorities & Achievements is accessible <strong>only when the reporting manager is mapped AND the mapping is active</strong>. Gated via a <code>paNoManager</code> flag — the sidebar shows a 🔒 locked item (tooltip + toast explaining the requirement) and the P&A page body is replaced with an access-required state pointing to <em>People & Organisation → Reporting Relationships</em>.</li> <li><strong>Ups & Downs access gate</strong> (<code>nav.js</code> + <code>projects.html</code>): U&D is accessible <strong>only when the user is mapped to a project with a Project Lead (or above)</strong>. Gated via a <code>udNoProject</code> flag — 🔒 locked nav item + an access-required page state pointing to <em>People & Organisation → Projects</em>.</li> <li>Flags default to <strong>granted</strong> when absent, so every existing demo user is unaffected; only the self-registered (unmapped) user demonstrates the gates. Dependent implementation PBIs filed (<code>impl-pending; from-mockup</code>).</li> </ul></div> <div class="tl-commit">💄 mockup(auth,priorities,workflow): v376 — self-registration + P&A/U&D mapping-based access gates</div> </div> </div> <!-- v375 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v375 — done</span> <span class="tl-title">Project team roster — add-all project team members (name preview) in the meeting create modal + map project contributors to a project (admin + inline)</span> <span class="tl-date">12 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> <span class="tag tag-feat">Admin · Projects</span> <span class="tag tag-feat">Project team</span> <span class="tag" style="background:var(--tint-warning-bg,#fef3c7);color:var(--tint-warning-fg,#92400e)">mockup-only</span> </div> <div class="tl-desc"><ul> <li><strong>Add all project team members</strong> (user request): in the Meeting Notes <em>create</em> modal, once a project is linked, a dashed panel previews that project’s team (each member’s name + role chip; ✓ marks those already added) with a <strong>+ Add all N to participants</strong> button. Members already added are excluded from the count; the preview stays in sync as participants change. Data: <code>MNA_PROJECTS[].members</code>; logic: <code>cmProjectChanged()</code> / <code>cmAddAllProjectMembers()</code>.</li> <li><strong>Map project contributors to a project</strong> (user request, <em>both</em> surfaces): (a) <strong>admin Projects</strong> — the project edit modal gains a <em>Project Contributor(s)</em> multi-select, the projects table row shows the mapped contributors, and <code>saveProject()</code> keeps each contributor’s own <code>projects[]</code> in sync (two-way); (b) <strong>inline</strong> — the create-modal team panel has a “🔗 Map a contributor to this project” picker (<code>cmMapContributor()</code>) that edits the project roster on the spot.</li> <li><strong>Mockup-only</strong> per the stakeholder request — the option is enabled in the mockups only. A dependent New/To-Do impl PBI is filed (<code>impl-pending; from-mockup</code>) so a future agent can decide whether to port it to the web app + API.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings,admin): v375 — add-all project team members + map project contributors to a project (#1117)</div> </div> </div> <!-- v374 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v374 — done</span> <span class="tl-title">My Action Items — consolidated page synced from the shipped web screen (impl→mockup, #1072)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">New page</span> <span class="tag tag-feat">Meeting Notes AI</span> <span class="tag tag-feat">Dashboard</span> </div> <div class="tl-desc"><ul> <li>Direction <strong>W→M</strong> (stakeholder request, live-screen screenshot): the consolidated <em>My Action Items</em> experience shipped in the web app (#983 screen, #986 done-toggle, #987 nav + dashboard widget) but had no mockup counterpart.</li> <li><strong>New <code>my-actions.html</code></strong> on the standard app shell, mirroring <code>MyActionItemsScreen.tsx</code> / <code>GET /meetings/my-actions</code>: KPI strip (📌 open, ⚠️ overdue, 📈 closure rate), 🔍 search by task or meeting, <em>Pending only / All</em> select, 4-column rows (task · “From <em>meeting</em>” link · 👤 owner + role · due pill + date) and an optimistic <strong>✓ Mark done / ↩️ Reopen</strong> toggle that reconciles the KPIs and toasts. Empty states match the web copy.</li> <li><strong>Forward-design</strong> (marked with a <code>design-forward</code> chip, per the #1072 note): 🔗 project chip + project/common filter (ships with #1062), 🔁 series-occurrence context on the From-line (v365 model), and a 📋 List ↔ 🗓️ Calendar due-date toggle reusing the v367 month-grid pattern.</li> <li><strong><code>assets/js/nav.js</code></strong>: ✅ <em>My Action Items</em> sidebar entry right after Meeting Notes AI (same everyone audience; mirrors the web <code>nav-my-actions-link</code>). <strong><code>dashboard.html</code></strong>: the v373 CTA banner now links to <code>my-actions.html</code>; the satisfied #987/#1072 azref chips removed. <strong><code>index.html</code></strong>: new page card (36 pages); stale #1081 (Removed, duplicate) and #1082 (Done, mockup-only) chips dropped from the MNA card.</li> <li>No dependent impl item — impl→mockup sync of already-shipped web features; the design-forward extras are already covered by open PBIs #1062/#1066.</li> </ul></div> <div class="tl-commit">💄 mockup(my-actions): v374 — My Action Items page synced from web (impl→mockup, #1072)</div> </div> </div> <!-- v373 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v373 — done</span> <span class="tl-title">Dashboard — My Action Items CTA banner rendered as real HTML (impl→mockup sync, #1078)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Dashboard</span> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Direction <strong>W→M</strong>: the shipped <code>DashboardScreen.tsx</code> (#987) renders a <em>My Action Items</em> CTA banner when the signed-in user has open meeting action items; the mockup only carried an azref annotation chip on the pending-action banner.</li> <li><strong><code>dashboard.html</code></strong>: new <code>#my-actions-banner</code> rendered after <em>Returned to You</em> (same order as the web) in the established banner idiom — info tint, ✅ icon, “You have <strong>3</strong> open action items (<strong>1</strong> overdue) assigned to you across your meetings.” and a <em>View →</em> CTA. Mirrors <code>data-testid="dashboard-my-actions"</code>.</li> <li>CTA links to <code>meeting-notes-ai.html</code> (where action items live) until the consolidated My Action Items mockup page ships with <strong>#1072</strong> — the #987/#1072 chips stay on the pending banner for that remaining sync; the satisfied #1078 chip was removed.</li> <li>No dependent impl item — this is an impl→mockup sync of an already-shipped web feature (#987); there is nothing to implement.</li> </ul></div> <div class="tl-commit">💄 mockup(dashboard): v373 — My Action Items CTA banner rendered (impl→mockup, #1078)</div> </div> </div> <!-- v372 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v372 — done</span> <span class="tl-title">What’s New — sync the 🔔 Desktop & mobile push notifications release note from the shipped web (#1075)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">What’s New</span> </div> <div class="tl-desc"><ul> <li>Content-drift fix (from-impl): <code>whats-new.html</code> stopped at the <em>Email Log</em> note (30 Jun) but the shipped web (<code>src/web/src/data/whatsNew.ts</code>) already ships a newer release note.</li> <li>Added the <strong>Desktop & mobile push notifications</strong> card at the top (8 Jul 2026), mirroring the web copy: install-as-app + unread app-badge (Teams-style), per-device enable under Profile → 🔔 Push Notifications with category picks + test push, and permission-on-click-only with the in-app 🔔 bell fallback + Help support matrix.</li> <li>No implementation impact — the feature already shipped in <code>src/web</code>; this only aligns the mockup release-note page, so no dependent impl PBI.</li> </ul></div> <div class="tl-commit">💄 mockup(whats-new): v372 — sync push-notifications release note (#1075)</div> </div> </div> <!-- v371 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v371 — done</span> <span class="tl-title">Docs — PAGES.md Admin Portal section synced to the v323 People & Organisation hub (impl parity) (#1073)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">Docs</span> <span class="tag tag-feat">Admin Portal</span> </div> <div class="tl-desc"><ul> <li>Impl→mockup <strong>documentation</strong> sync (#1073): the mockup admin portal already implements the <strong>People & Organisation hub</strong> (v323 — single sidebar entry, 5-tab strip, <code>initPeopleHub()</code>/<code>switchPeopleTab()</code>, legacy-hash deep-links via <code>PEOPLE_TAB_FOR</code>), mirroring the shipped <code>AdminPeopleHubScreen</code> (#878). But <strong><code>PAGES.md</code></strong> still described the <em>old</em> five-separate-sections IA.</li> <li>Rewrote the <strong>Admin Portal</strong> section: added a <em>People & Organisation hub</em> paragraph (tab labels 👥 People & Roles | 🧩 PODs | 🏢 Projects | 🔗 Reporting Lines | 🌳 Hierarchy, matching the impl exactly; legacy <code>#users/#pods/#projects/#reporting/#org-hierarchy</code> hashes deep-link onto the matching tab) and collapsed the sidebar list to the single hub entry.</li> <li>Verified tab-label parity against <code>AdminPeopleHubScreen.tsx</code> (org tab = 🌳 Hierarchy on both sides). <strong>No HTML/JS change</strong> — the mockup was already at parity; this is a docs-only catch-up, so no dependent impl item (impl already shipped in #878).</li> </ul></div> <div class="tl-commit">📝 mockup(docs): v371 — PAGES.md People & Organisation hub sync (#1073)</div> </div> </div> <!-- v370 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v370 — done</span> <span class="tl-title">Shell — one-click 🌙/☀️ light-dark swap on the top header (shell + admin topbars) (#1070)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">App shell</span> <span class="tag tag-feat">Admin Portal</span> </div> <div class="tl-desc"><ul> <li>Stakeholder feedback: the theme swap should be <strong>clickable on the top header</strong>, not only via Profile → 🎨 Appearance or the ⌘K palette.</li> <li><strong><code>assets/js/nav.js</code></strong>: a 🌙/☀️ button in the shared shell topbar (before the 🔍/🔔 cluster) — click calls <code>PGTheme.toggle()</code>, writing an explicit <code>light</code>/<code>dark</code> preference (overrides <em>System</em>, same semantics as the existing controls). <strong><code>admin/index.html</code></strong>: the same button on the Admin Portal topbar.</li> <li><strong><code>assets/js/theme.js</code></strong>: <code>apply()</code> now also syncs the topbar icon + tooltip (☀️ shown in dark mode, 🌙 in light), so the button stays correct whichever surface changed the theme — topbar, palette, Profile card, or an OS change under System.</li> <li>Login/auth pages keep their fixed dark branding (no toggle) by design. jsdom-verified on both topbars (toggle → <code>data-theme</code> + <code>pg_theme</code> + icon/tooltip; <code>PGTheme.set()</code> re-syncs the icon).</li> <li>Dependent impl PBI filed (<em>impl-pending; from-mockup</em>): AppShell topbar button in <code>src/web</code> calling <code>utils/theme.ts</code> — the same toggle the CommandPalette uses.</li> </ul></div> <div class="tl-commit">💄 mockup(shell): v370 — topbar light/dark swap (#1070)</div> </div> </div> <!-- v369 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v369 — done</span> <span class="tl-title">Admin — Meeting Notes AI register gains the 🗓️ calendar view with a 📋 List ↔ 🗓️ Calendar switch (#1069)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin Portal</span> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Stakeholder follow-up: make the calendar view available for the administrator as well, switchable between list and calendar — reverses v368’s “no calendar in the register” scope call.</li> <li><strong>📋 List ↔ 🗓️ Calendar toggle</strong> on the register card header. List view unchanged; calendar = Monday-first month grid with ‹ Prev / Next › + Today, chips on the <strong>admin’s viewer-local day</strong> (status-coloured edge, local time, 🔁 series-occurrence + 🔗 project markers, ⚠ overdue count), each chip linking to the meeting page.</li> <li>All register filters (search / status / mode / project) apply <em>inside</em> the calendar; content stays owner-controlled — chips carry metadata only, exactly like the table rows.</li> <li>jsdom-verified (11 assertions: toggle round-trip + aria state, month placement incl. both SR-01 occurrences on their own June dates, filters inside the calendar, today highlight, chip link-out).</li> <li>Impl folded into <strong>#1068</strong> (AdminMeetingsScreen parity, shared impl item — references v368 + v369) rather than a new PBI.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v369 — register calendar view + list/calendar switch (#1069)</div> </div> </div> <!-- v368 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v368 — done</span> <span class="tl-title">Admin — Meeting Notes AI register refreshed with the v365–v367 additions: 🔁 series chips, 🔗 project column + filter, viewer-zone times (#1067)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Admin Portal</span> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Stakeholder follow-up: bring the <strong>administrator oversight register</strong> (<code>admin/index.html#meetings</code>) in line with the user-facing additions from v365–v367.</li> <li><strong>🔁 Series</strong>: occurrence rows carry a series chip (series id · cadence · occurrence N of M). The register stays <em>flat</em> — one row per occurrence is the right shape for oversight; only the user-facing list stacks. Demo: both SR-01 occurrences (M-1038 + M-1042).</li> <li><strong>🔗 Project</strong>: new column (project chip, or 🌐 Common for unlinked meetings) + a <strong>Project filter</strong> (All / Project-linked (any) / a specific project / No project) composing with search + status + mode; Clear resets it.</li> <li><strong>🌍 Viewer-zone When</strong>: <code>date/time/timezone</code> fields replace the display string; the column renders in the <em>admin’s</em> browser zone (created-in zone in the tooltip + a “created in <zone>” note on non-IST rows). Demo: Cluster Delivery Review created in <code>Europe/London</code>.</li> <li>Deliberately <strong>no calendar view here</strong> — the register is closure-metrics-first; the 🗓️ calendar ships on the user-facing list (v367). jsdom-verified (12 assertions). Dependent impl PBI filed (<em>impl-pending; from-mockup</em>, AdminMeetingsScreen parity, sequenced on #1062/#1064/#1066).</li> </ul></div> <div class="tl-commit">💄 mockup(admin): v368 — Meeting Notes AI register parity with v365–v367 (#1067)</div> </div> </div> <!-- v367 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v367 — done</span> <span class="tl-title">Meeting Notes AI — 🔎 project / common filter + 🗓️ calendar month view (series occurrences on their own dates) (#1065)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Stakeholder feedback on the v366 list: filter by project-specific vs non-project-specific, and a calendar view with events on their dates — series occurrences split out accordingly.</li> <li><strong>Project filter</strong> in the toolbar: All meetings / 🔗 Project-linked (any) / a specific project / 🌐 No project (common). Composes with search + mode + status and applies in <em>both</em> views (builds on the v365 project link).</li> <li><strong>🗓️ Calendar view</strong> (📋 List ↔ 🗓️ Calendar toggle): Monday-first month grid with ‹ Prev / Next › + Today, day cells hold meeting chips (status-coloured edge, viewer-local time, 🔁 series-occurrence + 🔗 project markers, click opens the meeting). <strong>Series occurrences are deliberately un-stacked here</strong> — each occurrence sits on its own date.</li> <li>Days & times place by the <strong>viewer-local</strong> day (consistent with v366 — a late-evening meeting created in another zone can land on a different local day). Visibility (participants-only) and the restricted-count hint carry over unchanged.</li> <li>jsdom-verified (17 assertions: filter isolation per option, occurrence splitting, today highlight, month nav, chip navigation, filters inside calendar). Dependent impl PBI filed (<em>impl-pending; from-mockup</em>).</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v367 — project/common filter + calendar month view (#1065)</div> </div> </div> <!-- v366 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v366 — done</span> <span class="tl-title">Meeting Notes AI — 🌍 selectable timezone at creation; every time shown in the viewer’s browser timezone (#1063)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Stakeholder feedback: the create flow hardcoded <strong>IST</strong> (“Start time (IST)”). Meetings can now be created for <strong>any timezone</strong> and everyone sees them in <strong>their own</strong>.</li> <li><strong>Create + Edit modals</strong>: a <strong>Timezone</strong> selector (curated IANA zones with live GMT offsets, “— your zone” marker) defaulting to the creator’s browser zone (<code>Intl.DateTimeFormat().resolvedOptions().timeZone</code>). Stored per meeting (<code>Meeting.timezone</code>); legacy meetings default to <code>Asia/Kolkata</code>; series occurrences inherit the zone.</li> <li><strong>Viewer-zone display everywhere</strong>: list cards, series occurrence rows, the detail header and the printable report convert the stored wall time from the meeting’s zone into the viewer’s browser zone with its short name (e.g. 09:00 created in Europe/Berlin renders as <em>8:00 BST</em> for a London viewer). Tooltips + a “created in <zone>” note preserve the original wall time.</li> <li>Conversion helper mirrors <code>date-fns-tz zonedTimeToUtc</code> using <code>Intl.DateTimeFormat.formatToParts</code> — no library. Verified under a forced viewer zone (IST 10:00 → 5:30 local; Berlin 09:00 → 8:00 local; exact UTC instants asserted).</li> <li>Demo: <code>M-1046</code> (Exyte client meeting) now created in <code>Europe/Berlin</code>. Dependent impl PBI filed (<em>impl-pending; from-mockup</em>) — the web app already lists times viewer-local (#1043); the impl gap is the creation-side zone (startAt as true UTC from wall time + zone, optional <code>Meeting.timezone</code> column).</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v366 — selectable meeting timezone + viewer-zone display (#1063)</div> </div> </div> <!-- v365 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v365 — done</span> <span class="tl-title">Meeting Notes AI — 🔁 meeting series (a transcript per occurrence) + 🔗 optional project link with a 🤝 Timeline event (#1061)</span> <span class="tl-date">11 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Meeting Notes AI</span> <span class="tag tag-feat">Timeline</span> </div> <div class="tl-desc"><ul> <li>Stakeholder feedback: <em>“a meeting series option so that under the same meeting I can add multiple transcripts based on the occurrence”</em> + <em>“link an MNA event to a project and surface it in the Timeline; common events stay unlinked”</em>.</li> <li><strong>Series = lightweight parent, every occurrence = a full meeting</strong> (its own transcript, AiDE run, action items, sharing, finalize — the hardened lifecycle is untouched). Create modal gains a <strong>🔁 Recurring series</strong> toggle + cadence; the meeting list stacks occurrences into <strong>one series card</strong> (aggregate action closure, expandable occurrence rows); the detail page gains an <strong>occurrence switcher</strong> (prev / jump-to-date / next · “Occurrence N of M”) and the owner’s <strong>+ Add occurrence</strong> (clones metadata + participants into a fresh draft; upload that occurrence’s transcript as normal). Models <code>MeetingSeries</code> + <code>Meeting.seriesId</code>.</li> <li><strong>Optional project link</strong> (<code>Meeting.projectId</code>, nullable): “Link to project” selector in the create modal; 🔗 project chips on cards and the detail header. Meetings without a link are <strong>common meetings</strong> — behaviour unchanged.</li> <li><strong>Timeline integration (post-on-share)</strong>: the first time a linked meeting’s report is shared, a <strong>metadata-only 🤝 meeting event</strong> (title, date, outcome counts + deep link) is posted to the project Timeline. <code>timeline.html</code> gains the 🤝 event type (system-authored: read-only, no edit/delete), a type-filter entry, and an “Open in Meeting Notes AI” link — <strong>click-through re-checks the meeting’s own participant-based access</strong>, so content never rides on timeline visibility.</li> <li>Demo data: series <code>SR-01</code> (POD Alpha Weekly, 2 occurrences, linked to APS Bank) + a 🤝 event in the P001 feed. jsdom-verified (20 assertions across both pages). Dependent impl PBI filed (<em>impl-pending; from-mockup</em>).</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v365 — meeting series + project link with Timeline event (#1061)</div> </div> </div> <!-- v364 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v364 — done</span> <span class="tl-title">Cycle History — ⚙️ Customise view + Saved Views: column chooser, density, pagination, per-user persisted views (#1059)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">Data management</span> <span class="tag tag-flow">Cycle History</span> </div> <div class="tl-desc"><ul> <li>Reviewed the mockups end-to-end: every data table (Cycle History, Reports cards, admin registers) ships fixed columns, fixed density, no pagination, and filters that reset on each visit. <code>cycle-history.html</code> now carries the canonical <strong>⚙️ Customise view</strong> pattern for data-heavy tables.</li> <li><strong>Column chooser</strong> (Cycle ID + Actions always shown), <strong>density</strong> (Comfortable / Compact) and <strong>rows per page</strong> (5 / 10 / 25 / All) with a Prev/Next pager — long histories render one page at a time instead of the full set.</li> <li><strong>Saved Views</strong>: name + save the current combo (search, status filter, sort, columns, density, page size); apply from the toolbar selector or the modal; <strong>★ default</strong> auto-applies on page load; re-saving an existing name updates it; delete supported. Persisted <em>per user</em> in <code>localStorage</code> (<code>pg_view_prefs::cycle-history::<email></code>) — models per-user server-side view preferences (<code>GET/PUT /me/view-preferences/:screen</code>).</li> <li><strong>Export CSV = what you see</strong>: the toolbar export now downloads a real CSV honouring visible columns, active filters and the current sort, with formula-leading cells defanged (mirrors <code>utils/csv</code> csvCell).</li> <li>↺ <strong>Reset to standard</strong> restores the stock table. Dependent impl PBI filed (<em>impl-pending; from-mockup</em>) for the React/API implementation.</li> </ul></div> <div class="tl-commit">💄 mockup(cycle-history): v364 — Customise view + Saved Views (column chooser, density, pagination, per-user persistence) (#1059)</div> </div> </div> <!-- v363 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v363 — done</span> <span class="tl-title">Dashboard — Sales SPOC gets the secondary “Submit My Own P&A” link (impl→mockup parity, #916)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Dashboard</span> </div> <div class="tl-desc"><ul> <li>impl→mockup refresh for gap-audit PBI <strong>#916</strong> (Screens sweep). <code>DashboardScreen.tsx</code> gives reviewer roles that <em>also</em> submit their own weekly P&A (the <code>PA_REVIEWER_ALSO_SUBMITS</code> set — currently <strong>Sales SPOC</strong>) a <strong>secondary</strong> “📝 Submit My Own Priorities & Achievements” link under the primary <em>Review</em> button. The mockup’s D-04 card showed only the Review button for Sales SPOC.</li> <li>Added a hidden <code>#module-pa-btn-secondary</code> anchor to the P&A card, revealed by the per-role script only when <code>roleKey === 'salesSpoc'</code> (in the same <code>PA_REVIEW</code> branch that sets the Review copy) — mirroring the impl’s <code>PA_REVIEWER_ALSO_SUBMITS.includes(user.role)</code> gate.</li> <li>No dependent impl item — impl→mockup direction: the behaviour already ships in <code>DashboardScreen.tsx</code>; this only brings the design reference into line.</li> </ul></div> <div class="tl-commit">💄 mockup(dashboard): v363 — Sales SPOC secondary Submit-My-Own-P&A link (#916)</div> </div> </div> <!-- v362 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver">v362 — done</span> <span class="tl-title">Meeting Notes AI — Action Items: inline-editable rows + finalized curation lock (mockup catches up to shipped impl)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>impl→mockup sync — the final bidirectional reconciliation of the Action Items tab against the shipped <code>MeetingDetailScreen</code> <code>ActionsTab</code>/<code>ActionRow</code>.</li> <li><strong>Inline editing</strong> replaces the pencil/re-assign buttons that opened <code>prompt()</code> dialogs: the action <strong>text</strong> is an input (commit on blur/Enter), the <strong>assignee</strong> a select (owner + participants only), the <strong>due</strong> a date picker — all live in the row. New handlers <code>editActionText</code> / <code>editActionDue</code> / <code>reassignActionTo</code> replace <code>editAction</code> / <code>reassignAction</code>. The <strong>Manage</strong> column is delete-only now.</li> <li><strong>Finalized lock</strong> (#1037): curation (add / edit / delete / re-assign) is hidden once the meeting is finalized (<code>canCurate = isOwner && !finalized</code>), matching the API’s <code>assertActionItemsUnlocked</code> — only the done-toggle stays. The intro copy switches to “🔒 Finalized — action items are locked…”. The mockup previously never modelled this lock.</li> <li>Add-action form now requires an assignee (“Pick an assignee.”) with a “Select a person…” placeholder, matching <code>AddActionForm</code>.</li> <li>No dependent impl item — impl→mockup direction: the app already ships all of this. PBI #1048. With this, the Meeting Notes AI module is at parity in <strong>both</strong> directions.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v362 — Action Items inline editing + finalized lock (sync to impl) #1048</div> </div> </div> <!-- v361 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver">v361 — done</span> <span class="tl-title">Meeting Notes AI — mockup catches up to shipped impl (edit-modal modes, email owner recipient, sharing-card ⭐/👑 reassignment)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>impl→mockup sync from a local run-vs-mockup comparison — three places where the mockup had drifted behind already-shipped web behaviour:</li> <li><strong>Edit-meeting modal</strong> offered a <code>meet</code> (Google Meet) platform that isn’t in the canonical <code>MODES</code> map (teams/zoom/inperson/hybrid), with mismatched icons. Now built from <code>MODES</code>, matching <code>EditMeetingModal.tsx</code>.</li> <li><strong>Email report</strong> seeded its recipient set from participants only, dropping the meeting <strong>owner</strong> (always a recipient). Now uses <code>audienceEmails</code> (owner + participants, or everyone when org-visible), mirroring <code>meetingService.emailMeetingReport</code>.</li> <li><strong>Access & sharing card</strong> gained inline ⭐ organiser / 👑 owner reassignment per participant (new <code>setMeetingOrganiser</code> / <code>toggleMeetingOwner</code>), matching <code>MeetingDetailScreen.tsx</code>’s <code>SharingCard</code> (PATCH <code>/meetings/:id/organiser</code> + the owner-flag mutation). Previously these could be set only at CREATE time.</li> <li>No dependent impl item — impl→mockup direction: the app already ships all three; the mockup is catching up. PBI #1047.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v361 — sync to shipped impl (edit modes, email owner, sharing ⭐/👑) #1047</div> </div> </div> <!-- v360 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver">v360 — done</span> <span class="tl-title">Meeting Notes AI — retire the last gap chip: “My Action Items” shipped (Feature #983 closed)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Feature <strong>#983</strong> — the consolidated cross-meeting “My Action Items” dashboard — sat at <em>New</em> while <strong>all four</strong> of its child PBIs (#984–#987) were Done. It had shipped; nobody closed the parent.</li> <li>Verified in code, not from the child states: <code>GET /meetings/my-actions</code> (registered before <code>/:id</code>) → <code>listActionItemsForAssignee</code>; <code>MyActionItemsScreen.tsx</code> with the inline done/reopen toggle; the <code>/my-actions</code> route and sidebar entry; and the post-login landing widget on <code>DashboardScreen</code>. Covered by tests in <code>meetings.routes</code>, <code>meetingService</code>, <code>dashboard</code> and <code>MyActionItemsScreen.test.tsx</code>.</li> <li>One scare worth recording: the landing widget calls <code>/dashboard/my-actions</code>, a path #983 explicitly warned <em>against</em>. It is not a bug — that is the pre-existing P&A “returned to me” endpoint, and the meeting counts come from a separate <code>/meetings/my-actions?status=open</code> call, deliberately fetched in its own <code>try</code> so a P&A failure cannot hide the widget.</li> <li>With this chip gone, <strong>no gap chips remain</strong>: every gap this mockup once flagged has shipped. The <code>azref()</code> helper and its <code>.azref</code> styles stay — the overlay is the standing device for annotating an element with the AzDO item tracking its gap.</li> <li>No dependent impl item — impl→mockup direction: the annotation is removed because the feature exists.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v360 — retire the last gap chip; Feature #983 shipped & closed</div> </div> </div> <!-- v359 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v359</span> <span class="tl-title">Meeting Notes AI — retire six stale AzDO gap chips whose gaps have shipped; only #983 remains open (#1022)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>The <code>azref()</code> chips overlay this mockup’s elements with the AzDO work item describing that element’s known gap. Seven remained after <strong>#912</strong> retired the <code>#989</code> chip — and <strong>six of the seven pointed at work that is now Done</strong>, so the mockup was advertising fixed gaps as open to anyone reading it as a design reference.</li> <li>Each removal was verified against the <em>code</em>, not merely the work item’s state: <strong>#992</strong> (<code>getDecryptedAideToken</code> catches a decrypt failure and prompts reconnect instead of an opaque 500), <strong>#993</strong> (<code>getAideRunStats</code> + the admin route), <strong>#994</strong> (<code>aideRunLimiter</code> on four routes), <strong>#995</strong> (413/400 classification in <code>errorHandler.ts</code>), <strong>#996</strong> (<code>tabsA11y.ts</code> + <code>useModalA11y.ts</code>), <strong>#997</strong> (<code>calendarDate.ts</code>).</li> <li><strong>#983</strong> — the consolidated cross-meeting “My Action Items” dashboard — is still <em>New</em>, so its chip on the <em>Open action items</em> KPI stays. The <code>azref()</code> helper and its styles stay with it.</li> <li>The <code>#997</code> chip was the fifth argument of a <code>kpi()</code> call; <code>kpi</code> renders <code>(ref||'')</code>, so the argument is simply dropped rather than passed empty.</li> <li>Closes <strong>#1022</strong>, which was filed while closing #912 rather than swept in silently — the two changes justify themselves separately.</li> <li>No dependent impl item — the chips are annotations on the mockup; removing them has no implementation impact.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v359 — retire six stale AzDO gap chips, keep #983 (#1022)</div> </div> </div> <!-- v358 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v358</span> <span class="tl-title">Meeting Notes AI — Restart-processing control with stuck detection, done-toggle restricted to owner/assignee (closes #912)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li><strong>Restart processing</strong> — a plain processing card had no way out of an interrupted run, the “stuck in processing forever” dead end. Mirrors <code>MeetingDetailScreen.tsx</code>: the control is offered to the <code>canProcess</code> set (owner, ★ organiser, 👑 co-owner, admin), and <strong>emphasised once the run looks stuck</strong> — started over 3 minutes ago and not yet past the analysing stage, the same <code>isLikelyStuck() && rank < 2</code> test the app uses. A non-owner is told the override will spend <strong>their own</strong> AiDE Fabric Token, because <code>POST /:id/process?force=true</code> runs on the caller’s token.</li> <li><strong>Done-toggle restricted to the owner or the item’s assignee.</strong> The API 403s anyone else (<code>toggleActionItemDone</code>, <code>meetingService.ts</code>); the mockup let <em>any</em> viewer tick the box. The checkbox is now disabled with an explanatory tooltip, and the handler re-checks — UI visibility and API authorization on the same basis, per the parity rule in <code>.aiderules</code> (Bug <strong>#921</strong>).</li> <li>The ticket described this control as <em>owner-only</em>. It is not: the app gates it on <code>canProcess</code>. The mockup follows the <strong>code</strong>, not the ticket — the third wording error found on this PBI.</li> <li>Removed the stale <code>#989</code> gap chip from the processing card. It warned of “no reaper/retry”, plus <strong>#990</strong> and <strong>#991</strong>; all three are now <strong>Done</strong>, and this very card now carries the restart control. Leaving it would advertise a fixed gap as open.</li> <li><strong>Closes gap-audit PBI #912.</strong> Its remaining two low items are done; the medium items landed in v357 and the mockup→impl half in v356.</li> <li>No dependent impl item — impl→mockup direction: the mockup is corrected to match shipped, tested behaviour.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v358 — restart-processing + stuck detection, done-toggle owner/assignee gating (#912)</div> </div> </div> <!-- v357 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v357</span> <span class="tl-title">Meeting Notes AI — owner Edit-meeting modal, full action-item management, and the participant-removal 409 guard (impl→mockup parity, #912)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Clears the three <em>medium</em> impl→mockup items on gap-audit PBI <strong>#912</strong>. Each already ships in the app; the mockup was the stale side.</li> <li><strong>Owner Edit-meeting modal</strong> — mirrors <code>EditMeetingModal.tsx</code> / <code>PATCH /meetings/:id</code> (title, platform, start time, duration, follow-up date). The mockup previously had no way to fix a typo’d title or a wrong start time after creation.</li> <li><strong>Full action-item management</strong> — per-row ✏️ edit text/due, 🔄 re-assign and 🗑️ delete, mirroring <code>PATCH …/actions/:id</code>, <code>PATCH …/assignee</code> and <code>DELETE …/actions/:id</code>. The mockup had only the done-toggle and Add.</li> <li>All three are <strong>owner-only in the API</strong>, so the new <em>Manage</em> column — header <em>and</em> cells — and the ✏️ Edit-meeting button are gated on <code>isOwner(m)</code>, with a second guard inside each handler. UI visibility and API authorization gate on the <strong>same</strong> basis, per the role-gating parity rule in <code>.aiderules</code> (Bug <strong>#921</strong>). Re-assign offers only the owner + participants, the set the API validates against.</li> <li><strong>Participant removal is now blocked</strong> when that person still holds open action items, surfacing the API’s real 409 message from <code>meetingService.ts</code> instead of silently orphaning work that is still being chased. The optimistic checkbox reverts.</li> <li>No dependent impl item — impl→mockup direction: the mockup is corrected to match shipped, tested behaviour, so there is nothing for a future agent to implement.</li> <li>#912 is <strong>not</strong> closed: its remaining <em>low</em> items are the owner “Restart processing” control with stuck detection, and restricting the done-toggle to the owner or the assignee.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v357 — owner edit-meeting modal + action-item management + participant-removal 409 (#912)</div> </div> </div> <!-- v356 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v356</span> <span class="tl-title">Meeting Notes AI — email-report modal drops the editable Subject and the fake per-recipient checkboxes (impl→mockup parity, #912)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>PBI #912 listed the mockup’s <em>“editable Subject + per-recipient checklist”</em> as a mockup→impl gap. It is the other way round. <code>POST /meetings/:id/email-report</code> accepts <strong>only</strong> <code>{ message }</code> (<code>routes/meetings.ts</code>); the subject is composed server-side and the recipient set is derived from the meeting’s own access model.</li> <li>Worse, the mockup’s checkboxes were <strong>decorative</strong> — its own <code>sendMeetingReport(mid, count)</code> ignored them. Building them for real would give either a control that silently does nothing, or a way to email the report to people who <strong>cannot open the meeting</strong> — an information-disclosure vector, and precisely the blast radius PBI <strong>#994</strong> narrowed when it restricted this endpoint to the owner / ★ organiser / 👑 co-owner / admin set.</li> <li>The mockup now mirrors <code>MeetingDetailScreen.tsx</code>: the Subject field is gone, and recipients are listed <strong>read-only</strong> with the note “Derived from who can access this meeting — the sender cannot choose.” The Access & sharing participant checkboxes are untouched: those are real, API-backed toggles.</li> <li>Does <strong>not</strong> close PBI <strong>#912</strong>: its impl→mockup list still wants the owner ✏️ Edit-meeting modal, full action-item management (edit text/due, re-assign, delete), the participant-removal 409 when they hold open action items, and ‘Restart processing’ + stuck detection. This change was not on that list — it came out of auditing the email modal under #912 and finding the mockup was the stale, and unsafe, side.</li> <li>No dependent impl item — impl→mockup direction: the mockup is corrected to match shipped, tested behaviour, so there is nothing for a future agent to implement.</li> </ul></div> <div class="tl-commit">💄 mockup(meetings): v356 — email modal drops the Subject + fake recipient checkboxes (#912)</div> </div> </div> <!-- v355 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v355</span> <span class="tl-title">Cycle History — bulk cycle management: row-select + bulk-approve / bulk-archive toolbar (#895)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Ups & Downs</span> <span class="tag tag-report">Cycle History</span> </div> <div class="tl-desc"><ul> <li><strong>Multi-select on the cycle table.</strong> Added a header select-all checkbox (with an indeterminate state) plus a per-row checkbox to <code>cycle-history.html</code>. Selecting ≥1 cycle reveals a <strong>bulk-action bar</strong> above the table showing <em>“N selected · A approvable · B archivable”</em> and two actions: <strong>✅ Approve selected</strong> and <strong>🗄️ Archive selected</strong>, plus <em>Clear selection</em>.</li> <li><strong>Per-row outcomes, not all-or-nothing.</strong> Bulk-approve acts only on cycles <em>awaiting your approval</em> (<code>in-progress</code>); bulk-archive only on already <code>approved</code> cycles. Ineligible rows in a mixed selection are <strong>skipped</strong> and surfaced in the toast (“Approved 2 · 1 skipped (not awaiting your approval)”) — mirroring the <code>{ results:[…], summary }</code> per-row response the API will return (house convention, cf. <code>POST /invitations/bulk</code>).</li> <li><strong>New <code>archived</code> end-state</strong> shown as a muted badge + a status-filter option, to illustrate the archive result. <strong>⚠️ Archive is a net-new cycle state</strong> — it is NOT modeled today (no <code>archived</code> value on <code>CycleStatus</code>, no <code>archivedAt</code>), so the implementation needs a schema migration + new workflow transition + a permission gate. Bulk-approve needs none of that (reuses <code>CAN_APPROVE</code> + the <code>CycleWorkflow</code> state machine).</li> <li>Design for roadmap PBI <strong>#895</strong> (FUTURE-07). Dependent impl work item filed (New / To-Do, <code>impl-pending; from-mockup</code>) so a future agent can build it; it calls out the schema decision the archive half needs.</li> </ul></div> <div class="tl-commit">💄 mockup(cycle-history): v355 — bulk cycle management (row-select + approve/archive bar) (#895)</div> </div> </div> <!-- v354 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v354</span> <span class="tl-title">History timeline — only the newest iteration is marked “Current” (#1007)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-report">History</span> </div> <div class="tl-desc"><ul> <li>This page is meant to mark exactly <strong>one</strong> entry as current — the newest. Earlier commits demoted the previous entry inconsistently, so across 354 entries it carried <strong>13</strong> <code>ver-current</code> spans, <strong>7</strong> <code>tl-card current</code> cards and <strong>3</strong> <code>tl-dot-current</code> dots.</li> <li>Ten historical iterations (v259, v258, v248, v247, v246, v245, v239, v238, v54, v44) were highlighted as “Current”, which made the timeline useless for answering <em>“which version are we on?”</em>. Two more (v241, v240) carried the <code>ver-current</code> class while their text read “Done” — styling and label disagreeing.</li> <li>Every entry normalised to the plain markers, then the newest re-promoted, so exactly <strong>1</strong> of each marker now exists. All 354 entries and the CSS rules are untouched — only the per-entry classes changed.</li> <li>Found while shipping the #914 impl→mockup refresh (v353); filed as Task <strong>#1007</strong> rather than buried inside that parity commit.</li> <li>No dependent impl item — a mockup-only presentation fix with no implementation impact.</li> </ul></div> <div class="tl-commit">💄 mockup(history): v354 — only the newest entry is Current (#1007)</div> </div> </div> <!-- v353 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v353</span> <span class="tl-title">Workflow & cycle-detail — correct the stale 0/500 comment counter to the real 2000 cap, add the Delivery-SPOC Reports quick-link, log post-approval notes as “commented” (impl→mockup parity, #914)</span> <span class="tl-date">10 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Ups & Downs</span> <span class="tag tag-report">Cycle Detail</span> </div> <div class="tl-desc"><ul> <li><strong>Comment counter corrected 0/500 → 0/2000.</strong> PBI #914 recorded this as a mockup→impl gap (“the app omits the live 0/500 counter”). It is the other way round: the app <em>does</em> render a live counter (<code>RichTextEditor</code>), capped at 2000 — which is exactly what the API enforces (<code>routes/cycles.ts</code>: “comment is required and must be ≤ 2000 characters”, and the same 2000 cap on post-approval notes and P&A comments). Forcing the app to 500 would have made it reject a 1500-character comment the server accepts. The <em>mockup</em> was stale. Updated in <code>workflow/spoc.html</code>, <code>workflow/pl.html</code>, <code>workflow/pm.html</code>, <code>workflow/cluster-head.html</code>, <code>priorities/pl.html</code>, <code>priorities/review.html</code> and <code>cycle-detail.html</code> (<code>workflow/pod.html</code> was already 2000).</li> <li><strong>Delivery-SPOC quick-link.</strong> <code>DeliverySpocScreen.tsx</code> ships a “📈 Reports & Analytics” quick-link that <code>workflow/spoc.html</code> was missing; added in the same position.</li> <li><strong>Post-approval note logging.</strong> The API records such a note as audit action <code>commented</code> (<code>routes/cycles.ts:2450</code>), not a distinct Note type. <code>cycle-detail.html</code> now pushes <code>type: 'commented'</code> (with a dot colour) to match.</li> <li>Closes the impl→mockup half of gap-audit PBI <strong>#914</strong>; the mockup→impl half shipped separately (PL info alert, cycle-detail trend narrative, audit-trail titled card).</li> <li>No new dependent impl item — this is the impl→mockup direction: the mockup is being corrected to match shipped, tested behaviour, so there is nothing for a future agent to implement.</li> </ul></div> <div class="tl-commit">💄 mockup(workflow): v353 — 0/2000 counter, Reports quick-link, note logs as commented (#914)</div> </div> </div> <!-- v352 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v352</span> <span class="tl-title">Help — add “Meeting Notes AI” section + nav item (impl→mockup parity, #917)</span> <span class="tl-date">9 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-report">Help</span> <span class="tag tag-flow">Meeting Notes AI</span> </div> <div class="tl-desc"><ul> <li>Added <strong>Meeting Notes AI</strong> nav item to the left-hand help navigation in <code>mockup/help.html</code> (between Project Timeline and Reports & Analytics), with the 🤝 icon.</li> <li>Added the corresponding <code>#help-meetings</code> section: what the module does, who can use it, connecting the AiDE Fabric Token (with note distinguishing it from the <code>pgmcp_</code> MCP token), meeting lifecycle table (Draft / Processing / Ready / Shared & Finalised), action-item reminder schedule (T-3 / due day / overdue escalation), and an opt-out tip.</li> <li>Closes the impl→mockup half of gap-audit PBI <strong>#917</strong> (Help/MCP content — add Meeting Notes AI help topic to <code>mockup/help.html</code>). The React <code>HelpScreen.tsx</code> already has the full Meeting Notes AI section (shipped 2026-07-04 MNA-55) — this commit brings the mockup reference page to parity.</li> <li>No new dependent impl item (the implementation already exists; this is impl→mockup direction).</li> </ul></div> <div class="tl-commit">📝 mockup(help): v352 — add Meeting Notes AI help section + nav item (#917)</div> </div> </div> <!-- v351 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v351 — Done</span> <span class="tl-title">Mockup Index — AzDO ticket numbers on gap cards; corrected gap-card assignments; new .aiderules rule for auto-refresh on close</span> <span class="tl-date">9 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Index</span> <span class="tag tag-pa">DX</span> <span class="tag tag-admin">AzDO</span> </div> <div class="tl-desc"><ul> <li><strong>Corrected gap-card assignments:</strong> Meeting Notes AI is fully implemented (MeetingNotesScreen + MeetingDetailScreen exist); the incorrect “not implemented” label from v350 has been fixed to “Feature gap” with the correct open AzDO item.</li> <li><strong>AzDO ticket links on gap cards:</strong> three cards now carry a clickable amber “🚧 Gap · #NNN” pill linking directly to the open AzDO work item — <strong>Meeting Notes AI (#930)</strong> (Logs tab in non-ready view), <strong>Project Lead (#931)</strong> (mandatory “AiDE & Other Topics” section), <strong>Audit Log (#909)</strong> (humanize MNA event labels + resolve user UUIDs). All other cards have no open impl items and are unmarked.</li> <li><strong>Legend bar updated:</strong> now reads “Feature gap with open AzDO work item” (was “Mockup only — not yet implemented”) to correctly reflect that all screens exist but some have outstanding feature parity gaps.</li> <li><strong>New .aiderules rule (step 5 of Mockup Version Tracking):</strong> when an AzDO impl-pending item is closed (feature implemented), remove the <code>page-card--todo</code> treatment + ticket pill from the corresponding card in the same commit. Conversely, when a new impl-pending item is created, add the treatment. The mockup index is the live implementation-status dashboard.</li> </ul></div> <div class="tl-commit">📝 docs(mockup): v351 — AzDO gap-card tickets + corrected assignments + .aiderules auto-refresh rule</div> </div> </div> <!-- v350 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v350 — Done</span> <span class="tl-title">Mockup Index — implementation-status legend + “Not Implemented” card treatment for mockup-only screens</span> <span class="tl-date">9 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Index</span> <span class="tag tag-pa">DX</span> </div> <div class="tl-desc"><ul> <li>Added an <strong>implementation-status legend bar</strong> at the top of <code>index.html</code> (below the version badges) that explains the two card states: solid border = implemented in the React web app; dashed amber border + 🚧 corner ribbon = mockup-only, not yet implemented.</li> <li><strong>Not-yet-implemented card treatment</strong>: new <code>.page-card--todo</code> CSS class — dashed amber border, reduced opacity (0.82), amber gradient shimmer in the <code>::before</code> pseudo-element, amber hover state, and a CSS triangle corner-ribbon with a 🚧 emoji. A <code>.tag-todo</code> amber pill tag “🚧 Not Implemented” is appended inside the card.</li> <li><strong>Meeting Notes AI</strong> card marked <code>page-card--todo</code> — the only screen with zero React web implementation (confirmed by the mockup–web parity tracker: no <code>MeetingNotesScreen</code>, no route, no sidebar entry, no API client).</li> <li>All other existing cards remain visually unchanged (solid border, default styling).</li> <li>New CSS classes: <code>.tag-impl</code>, <code>.tag-todo</code>, <code>.page-card--todo</code>, <code>.page-card--todo::before</code>, <code>.page-card--todo:hover</code>, <code>.card-todo-ribbon</code> corner triangle, <code>.impl-legend</code>, <code>.impl-legend-item</code>, <code>.impl-legend-dot</code> variants.</li> <li>No implementation impact — purely a design-tool DX change on the mockup index page only. No dependent impl work item needed.</li> </ul></div> <div class="tl-commit">📝 docs(mockup): v350 — index implementation-status legend + todo card treatment</div> </div> </div> <!-- v349 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v349 — Done</span> <span class="tl-title">Version bump (8 Jul 2026 iteration)</span> <span class="tl-date">8 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-flow">Version</span> </div> </div> </div> <!-- v348 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v348 — Done</span> <span class="tl-title">Profile — add “Push Notifications (this device)” card: MS-Teams-style app-icon unread badge + Web Push opt-in, per-category push toggles & test-push</span> <span class="tl-date">8 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-report">Profile</span> <span class="tag tag-flow">PWA</span> <span class="tag tag-auth">web-push</span> <span class="tag tag-pa">badge-notifications-jul2026</span> </div> <div class="tl-desc"><ul> <li>New capability design: surface the unread notification count on the <strong>installed PWA app icon</strong> (taskbar / dock / home screen) like Microsoft Teams’ “9+”, and deliver alerts <strong>while the app is closed</strong> via <strong>Web Push</strong>. Added a <strong>Push Notifications (this device)</strong> card to <code>profile.html</code>: an Enable/permission-state row (permission requested only on click, never on load), an app-icon badge illustration, per-category push toggles (Ups & Downs, Priorities, Meeting Notes AI, Timeline) mirroring the Email categories, and a “Send me a test push” action.</li> <li>Backlog created in AzDO: <strong>Feature #967</strong> (<code>badge-notifications-jul2026</code>) with 7 PBIs — Phase 1 foreground app badge via the Badging API (<strong>#968</strong>), Phase 2 Web Push (subscription backend + VAPID <strong>#969</strong>, service-worker push/notificationclick <strong>#970</strong>, notificationService dispatch <strong>#971</strong>, opt-in UX + Profile prefs <strong>#972</strong>, support-matrix/QA <strong>#973</strong>, Help/observability <strong>#974</strong>).</li> <li>Dependent impl item for this mockup change: <strong>#972</strong> (<code>impl-pending; from-mockup</code>) — implements the push opt-in + Profile per-device/per-category preferences.</li> </ul></div> <div class="tl-commit">💄 mockup(profile): add Push Notifications (this device) card — app-icon badge + Web Push (v348)</div> </div> </div> <!-- v347 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v347 — Done</span> <span class="tl-title">Profile — add the “Meeting Notes AI” email-notification preference row (4th toggle), matching the app</span> <span class="tl-date">8 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-report">Profile</span> <span class="tag tag-pa">parity</span> <span class="tag tag-report">gap-audit-jul2026</span> </div> <div class="tl-desc"><ul> <li>impl→mockup refresh for gap-audit PBI <strong>#916</strong> (Screens sweep). The Profile page’s <strong>Email Notifications</strong> list had three toggles (Ups & Downs, Priorities & Achievements, Weekly digest) but was missing the app’s <strong>Meeting Notes AI</strong> row. Added it as the 4th toggle (<code>emailMeetings</code>, on by default) — “Action-item reminders from meetings you own or are assigned an item in (due-soon, due-today and overdue)” — mirroring <code>NotificationPreferences.tsx</code>.</li> <li>Doc-parity only (<code>mockup/profile.html</code>) — <strong>no dependent impl item</strong>: the app already ships this preference, so no implementation impact.</li> </ul></div> <div class="tl-commit">💄 mockup(profile): add Meeting Notes AI email-preference row (v347)</div> </div> </div> <!-- v346 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v346 — Done</span> <span class="tl-title">Dashboard D-04 — reconcile the P&A card role map to the app (PMO → History, PM/ESO/Rec SPOC → Submit, reviewers = Delivery/Sales SPOC + POD Owner)</span> <span class="tl-date">8 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-report">Dashboard</span> <span class="tag tag-pa">parity</span> <span class="tag tag-report">gap-audit-jul2026</span> </div> <div class="tl-desc"><ul> <li>impl→mockup fix for gap-audit PBI <strong>#916</strong> (Screens sweep). The Dashboard’s <strong>D-04 Priorities & Achievements</strong> card copy map was internally inconsistent: it labelled <strong>PM, ESO/Recruitment SPOC and PMO</strong> as “Reviewer” even though the button routed PM/ESO/Rec SPOC to the <em>Submit</em> page and PMO to nothing. Reconciled both role maps in <code>dashboard.html</code> to <code>DashboardScreen.tsx</code>’s canonical four-way split: <strong>Submit</strong> = PL/PM/PC/ESO SPOC/Rec SPOC, <strong>Digest</strong> = Cluster Head, <strong>Review</strong> = Delivery SPOC/Sales SPOC/POD Owner, <strong>History</strong> = PMO.</li> <li>Added the missing <strong>PMO History</strong> card (title/desc/tag/button → <code>priorities/history.html</code>, “Read-Only · PMO View”) and aligned the <em>“awaiting your bilateral review”</em> banner to the reviewer roles only (dropped PM & Cluster Head, matching <code>PA_REVIEW_ROLES</code>).</li> <li>Doc-parity only (<code>mockup/dashboard.html</code>) — <strong>no dependent impl item</strong>: the app was already correct, so no implementation impact.</li> </ul></div> <div class="tl-commit">💄 mockup(dashboard): reconcile D-04 P&A card role map to the app (v346)</div> </div> </div> <!-- v345 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v345 — Done</span> <span class="tl-title">Status page — correct the API health-probe URL to <code>/api/health</code> (was a 404-ing <code>/api/v1/health</code>)</span> <span class="tl-date">8 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-report">Status</span> <span class="tag tag-pa">parity</span> <span class="tag tag-report">gap-audit-jul2026</span> </div> <div class="tl-desc"><ul> <li>impl→mockup correctness fix for gap-audit PBI <strong>#916</strong> (Screens sweep). The Status page advertised the API health probe at <code>/api/v1/health</code>, which does <strong>not</strong> exist — the real endpoints are <code>/health</code> (dev) and <code>/api/health</code> (staging, after the IIS base path is stripped). Corrected all three references (the Quick-Links tile URL + its toast, and the <code>SERVICES</code> probe path) to <code>/api/health</code>, matching the shipped app (<code>StatusScreen.tsx</code> already probes <code>/api/health</code>).</li> <li>Doc-parity only (<code>mockup/status.html</code>) — <strong>no dependent impl item</strong>: the app is already correct, so this change has no implementation impact.</li> </ul></div> <div class="tl-commit">💄 mockup(status): correct API health URL to /api/health (v345)</div> </div> </div> <!-- v344 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v344 — Done</span> <span class="tl-title">Admin parity — Meeting Notes AI reminders shown read-only (data-driven), matching the app; Co-Sales SPOC now impl-backed</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-pa">Admin</span> <span class="tag tag-pa">parity</span> <span class="tag tag-report">gap-audit-jul2026</span> </div> <div class="tl-desc"><ul> <li>impl→mockup refresh for gap-audit PBI <strong>#915</strong> (Admin). The scheduler’s <strong>Meeting Notes AI reminders</strong> (R-013/14/15) are now shown <strong>read-only</strong> (“🔒 Auto · data-driven”) instead of toggleable/editable rows — matching the shipped app, where these fire per action-item due date & assignee so there is nothing per-row to toggle (<code>AdminSchedulerScreen</code> read-only catalog, MNA-44).</li> <li>The mockup’s <strong>Co-Sales SPOC</strong> (P009) is now backed by a real implementation field end-to-end (schema/API/web/CSV) — the two sides are aligned.</li> <li>Doc-parity only (<code>mockup/admin/admin.js</code>). Remaining minor mockup catch-ups (Users role-filter, Email-Log date-range, Reports “Run now”, audit Entity column, adoption panel, POD-Owner/Cluster-Head shown editable) are cosmetic lag noted on the PBI — the app’s designs are intentional. No dependent impl item.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): show Meeting Notes AI reminders read-only to match the app (v344)</div> </div> </div> <!-- v343 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v343 — Done</span> <span class="tl-title">P&A parity — PL submission checklist shows the exactly-3 rule (4 rows) & reviewer can inline-edit items</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-pa">priorities</span> <span class="tag tag-pa">parity</span> <span class="tag tag-report">gap-audit-jul2026</span> </div> <div class="tl-desc"><ul> <li>Refreshed the mockup to match the shipped app (gap-audit PBI <strong>#913</strong>, <em>impl→mockup</em>): the PL <strong>Submission Checklist</strong> now states the <strong>exactly-3</strong> rule the API + web enforce — <em>N/3 priorities</em>, <em>1 AiDE priority</em>, <em>N/3 achievements</em>, <em>Submitted for review</em> (was three “at least 1” rows). The completion ring is now out of <strong>4</strong> items and the <strong>Submit</strong> button is <strong>gated</strong> on the rule (disabled with a tooltip until 3 priorities incl. 1 AiDE + 3 achievements).</li> <li>On the reviewer screen each submitted item now has an <strong>✏️ Edit</strong> affordance (inline-editable text), not just <strong>✕</strong> remove — mirroring <code>PMPAReviewScreen</code>’s ✏️ Edit + PATCH /items/:itemId.</li> <li>Pairs with the already-shipped app-side fixes in the same PBI (reviewer “Mark as AiDE” toggle + unsaved-changes guard). Doc-parity only (<code>mockup/priorities/pl.html</code>, <code>review.html</code>) — no dependent impl item (the app already enforces this).</li> </ul></div> <div class="tl-commit">💄 mockup(priorities): show exactly-3 P&A submit rule + reviewer edit affordance (v343)</div> </div> </div> <!-- v342 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v342 — Done</span> <span class="tl-title">Meeting Notes AI — restrict AiDE re-run by output lifecycle stage (review → shared → finalized)</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">aide</span> <span class="tag tag-pa">governance</span> </div> <div class="tl-desc"><ul> <li>Identified the AiDE output’s lifecycle and gated re-run on it. A meeting now carries a stage badge: <strong>🔎 In review</strong> (default), <strong>📤 Shared</strong> (report emailed), <strong>🔒 Finalized</strong> (owner locked).</li> <li><strong>🔎 In review</strong> — re-run AiDE and corrections both allowed. <strong>📤 Shared</strong> — re-run / ↻ Regenerate is <strong>locked</strong> (so the minutes recipients already have stay stable), but the deterministic <strong>✏️ Apply now</strong> spelling fix still works (it updates wording in place). <strong>🔒 Finalized</strong> — fully read-only: no re-run, no corrections.</li> <li>Sharing the report (Email → Send) advances a meeting to <strong>Shared</strong>; a new owner-side <strong>🔒 Finalize minutes</strong> / <strong>🔓 Reopen</strong> control toggles the lock. The Corrections modal shows why re-run is locked and steers you to Apply-now; the Summary buttons disable with a tooltip reason; handlers guard server-side-style even if a button is bypassed.</li> <li>Seeded demo stages so all three are visible: <em>POD Alpha</em> (in review), <em>Cluster Delivery Review</em> (shared), <em>APS Bank personal notes</em> (finalized). Mockup-only (<code>mockup/meeting-notes-ai.html</code>); the gating requirement was appended to impl PBI <strong>#929</strong>.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): restrict AiDE re-run by output lifecycle stage (v342)</div> </div> </div> <!-- v341 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v341 — Done</span> <span class="tl-title">Meeting Notes AI — per-meeting AiDE processing Logs tab (run history, token attribution, live activity)</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">aide</span> <span class="tag tag-report">logs</span> </div> <div class="tl-desc"><ul> <li>New <strong>🧾 Logs</strong> tab on every meeting records <strong>one entry per AiDE run</strong> — run type (initial / retry / re-run with corrections / regenerate), <strong>who triggered it</strong>, <strong>whose AiDE Fabric Token was used</strong> (masked), the model + endpoint, started/finished timestamps + duration, outcome (✅ success / ⚠️ failed / 🤖 in-progress), any corrections/context applied, and the captured <strong>live-activity</strong> stream (collapsible).</li> <li><strong>Re-processing appends</strong> a new dated record rather than overwriting — so the full run history is preserved, newest first. The streamed live activity is now <strong>persisted into the log</strong> on completion instead of being discarded.</li> <li>Visible to everyone <strong>eligible for the meeting</strong> (the tab lives inside the access-gated detail view). Seeded demo runs on <em>POD Alpha</em> (success) and the failed <em>Exyte</em> meeting (HTTP 502) so the tab is populated. Tokens are always shown masked, never raw.</li> <li>Mockup-only (<code>mockup/meeting-notes-ai.html</code>). Dependent implementation PBI <strong>#930</strong> created for the web/API build.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): per-meeting AiDE processing Logs tab (v341)</div> </div> </div> <!-- v340 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v340 — Done</span> <span class="tl-title">Meeting Notes AI — “Re-run AiDE” always streams the progress steps</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">aide</span> <span class="tag tag-ux">fix</span> </div> <div class="tl-desc"><ul> <li>Clicking <strong>🤖 Re-run AiDE with corrections</strong> now <strong>always streams the live progress steps</strong> (transcript → understanding → MoM → actions → mindmap), the same as first-time processing. Previously a re-run with no glossary/context edits aborted with a warning, and if no AiDE token was connected the token prompt replaced the corrections modal and the retry then read an empty form and gave up.</li> <li>Fix: the modal is now read <strong>before</strong> any token prompt (so edits are never lost), and a re-run with no edits is treated as a plain regenerate — it still runs the full visible pipeline.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): Re-run AiDE always streams the progress steps (v340)</div> </div> </div> <!-- v339 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v339 — Done</span> <span class="tl-title">Meeting Notes AI — corrections reflect on every tab (Summary, Mindmap, Actions, Report)</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">aide</span> <span class="tag tag-ux">consistency</span> </div> <div class="tl-desc"><ul> <li>The corrected wording already propagated to every tab (all tabs read the same AiDE data), but the <strong>“✏️ Corrected” chip</strong> and the <strong>✍️ off-recording context</strong> only appeared on the Summary tab. Now the Corrected chip shows on <strong>Mindmap</strong>, <strong>Action Items</strong> and the <strong>Report</strong> too, and the Report gains an <strong>“Added context — discussed off-recording”</strong> section — so a correction or re-run is visibly reflected in all places, not just the minutes.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): corrections + context reflect on every tab (v339)</div> </div> </div> <!-- v338 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v338 — Done</span> <span class="tl-title">Meeting Notes AI — corrections modal: off-recording context box fills the popup width</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">polish</span> </div> <div class="tl-desc"><ul> <li>Follow-up polish on v337: the <strong>“Add context discussed off-recording”</strong> textarea in the Corrections & context modal was rendering at its default narrow width. It now expands to the full available width of the popup (padding-boxed, vertically resizable, taller default) so longer notes are comfortable to type.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): full-width off-recording context textarea (v338)</div> </div> </div> <!-- v337 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v337 — Done</span> <span class="tl-title">Meeting Notes AI — correct AiDE transcription/spelling mistakes & add off-recording context</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">aide</span> <span class="tag tag-ux">corrections</span> </div> <div class="tl-desc"><ul> <li>AiDE works from the transcript, so it can mis-hear names of people, clients and projects — and it can’t capture anything discussed after the recording stopped. On a <strong>processed</strong> meeting, AiDE now <strong>flags low-confidence terms</strong> in the MoM with a dotted underline (✎); the owner / ⭐ organiser / 👑 owner can click any flagged term — or the new <strong>✏️ Correct & add context</strong> button on the Summary tab — to open a <strong>Corrections & context</strong> modal.</li> <li><strong>Two things in one place:</strong> (1) a <em>heard-as → correct-spelling</em> glossary (with an optional “remember these names for my future meetings”), and (2) an <em>off-recording context</em> box for points discussed but not recorded — folded into the minutes tagged ✍️ added by you.</li> <li><strong>Two apply paths:</strong> <strong>🤖 Re-run AiDE with corrections</strong> (the preferred flow — sends the glossary + context to AiDE and streams the live regeneration) or <strong>✏️ Apply now</strong> (a direct find/replace across the MoM, mindmap and action items, no round-trip). Both swap every occurrence across all tabs, clear the corrected flags, and stamp a “✏️ Corrected” chip on the summary.</li> <li>Mockup-only (<code>mockup/meeting-notes-ai.html</code>). A dependent implementation PBI was created in AzDO for the web/API build.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): correct AiDE transcription mistakes + add off-recording context (v337)</div> </div> </div> <!-- v336 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v336 — Done</span> <span class="tl-title">Help — installed app (PWA) stays signed in for 24h; browser sign-out unchanged</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">help</span> <span class="tag tag-ux">pwa</span> <span class="tag tag-ux">session</span> </div> <div class="tl-desc"><ul> <li>The Getting Started session note now explains that in a <strong>normal browser tab</strong> you are signed out after 30 minutes of inactivity (with the 5-minute <strong>Stay signed in</strong> warning), but when POD Governance is <strong>installed as an app</strong> (its own window) the idle window is extended to <strong>24 hours</strong> and the sign-out is silent — a home-screen app is meant to feel persistent. The 7-day maximum still applies either way.</li> <li>Documentation-only mockup change — the behaviour itself already shipped in the web/API implementation (AzDO <strong>#924</strong>: 24h PWA idle sessions + login-log session-mechanism tracking + an Install-as-an-app help section with a narrated video). No dependent impl work item needed.</li> </ul></div> <div class="tl-commit">💄 mockup(help): document installed-app 24h sessions vs browser sign-out (v336)</div> </div> </div> <!-- v335 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v335 — Done</span> <span class="tl-title">Audit Log — meeting events show friendly action names & resolved names, not raw keys / UUIDs</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">audit-log</span> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">admin</span> </div> <div class="tl-desc"><ul> <li>The live Admin → Audit Log rendered Meeting Notes AI events with their <strong>raw internal event keys</strong> (e.g. <code>meeting.action.reassigned</code>) in the Event column, and the expanded change detail printed <strong>raw user UUIDs</strong> (<code>eaccbb79… → 9d5e22d9…</code>) instead of people's names — unreadable to an admin.</li> <li>The mockup audit trail now carries Meeting Notes AI sample events using the same <strong>human-readable pattern as every other entity</strong>: friendly action pills (<strong>Re-assigned</strong>, <strong>Action Added</strong>, <strong>Action Completed</strong>, <strong>Notes Generated</strong>), a <strong>Meeting Notes</strong> entity label/filter, plain-language detail lines, and an expandable change diff that shows <strong>resolved assignee names</strong> (<em>Assignee: Indurthi Hari Babu → Anitha Kumari</em>) rather than IDs. Both the Entity and Event Type filter dropdowns gained the new options.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): humanize Meeting Notes audit events — friendly action names & resolved names (v335)</div> </div> </div> <!-- v334 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v334 — Done</span> <span class="tl-title">Meeting Notes AI — action items default to a 4-day close window</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">action-items</span> </div> <div class="tl-desc"><ul> <li>AiDE-extracted action items with no explicit date now default to a <strong>4-day close window</strong> (was 2–3 days for the generated demo items), matching the requested default. The manual <strong>Add action item</strong> Due field now pre-fills to <strong>today + 4 days</strong> (was +7) and carries a small <em>· defaults to 4 days</em> hint; the <code>addAction()</code> fallback when the date is cleared also lands on +4.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): default action items to a 4-day close window (v334)</div> </div> </div> <!-- v333 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v333 — Done</span> <span class="tl-title">Meeting Notes AI — mindmap node boxes flex to fully cover their text</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">mindmap</span> <span class="tag tag-ux">layout</span> </div> <div class="tl-desc"><ul> <li>The AiDE discussion mindmap drew every node as a <strong>fixed-width SVG rect</strong> (branch 184px, leaf 212px), so any longer point — e.g. <em>"3 initiatives: Data as Service, Intelligence, Innovation"</em> or <em>"Cross-domain products via Common Data Model"</em> — spilled past the rounded border and read as broken.</li> <li>Boxes now <strong>flex to their content and share a consistent width per column</strong>: <code>mindmapHtml()</code> estimates each label's rendered width (over-estimated so text never clips) and sizes <em>every</em> branch box to the widest branch label and <em>every</em> leaf box to the widest point, so the whole column lines up while fully covering the text. The connector paths, root spacing and the (horizontally-scrollable) SVG viewport all recompute from the measured widths.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): flex mindmap node boxes to cover text (v333)</div> </div> </div> <!-- v332 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v332 — Done</span> <span class="tl-title">Meeting Notes AI — live progress feed when retrying a failed AiDE run</span> <span class="tl-date">7 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">meeting-notes-ai</span> <span class="tag tag-ux">aide</span> <span class="tag tag-ux">live-updates</span> </div> <div class="tl-desc"><ul> <li>Added the missing <strong>⚠️ Processing failed</strong> meeting state to <code>meeting-notes-ai.html</code>: the detail view now shows an <strong>"AiDE couldn't process this meeting"</strong> card — error reason, last-attempt timestamp, the owner-couldn't-complete note, and a <strong>🔁 Retry processing</strong> action that uses the current participant's own AiDE Fabric Token (or prompts to connect one). A new demo meeting (ValueLabs & Exyte — One Data Initiative) seeds this state, plus a red <code>st-failed</code> status badge and a list-card "open to retry" hint.</li> <li>The core ask — <strong>live updates on what's happening while retrying</strong>. The processing view gains a streamed <strong>Live activity</strong> feed: a pulsing live dot, an elapsed <strong>⏱️ clock</strong>, and a scrolling, timestamped log of granular AiDE events (opening the connection, uploading the transcript, parsing word counts, streaming MoM tokens, extracting action items, building the mindmap) that accumulate in real time above the five milestone steps. Retrying resets the feed and streams the run again; a seeded in-progress meeting reconnects mid-stream.</li> </ul></div> <div class="tl-commit">💄 mockup(meeting-notes-ai): live retry-progress feed + failed state (v332)</div> </div> </div> <!-- v331 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v331 — Done</span> <span class="tl-title">Scheduler — Timeline notifications folded into the Automated Reminders table</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">scheduler</span> <span class="tag tag-ux">timeline</span> <span class="tag tag-ux">consolidation</span> </div> <div class="tl-desc"><ul> <li>The standalone <strong>Timeline Notification Schedule</strong> card is gone. Its two jobs — <strong>Weekly Timeline Digest (R-011)</strong> and <strong>Stale Project Timeline Nudge (R-012)</strong> — now render inside the <strong>Automated Reminders</strong> table as a fourth group section, <strong>🗓️ Timeline Notifications</strong>, alongside Ups & Downs, Priorities & Achievements and Meeting Notes AI. Every reminder now lives in one table with a consistent column set (Code / Name / Trigger / Roles / Channel / Template / Status / Enabled / Actions), so the timeline rows gain an inline Edit action they previously lacked.</li> <li>The two timeline-specific controls (<strong>Stale Project Threshold</strong> and <strong>Digest Delivery Day</strong>) move into a compact <strong>🗓️ Timeline Digest Settings</strong> footer at the bottom of the same Automated Reminders card, keeping all timeline configuration in one place.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): fold Timeline notifications into Automated Reminders (v331)</div> </div> </div> <!-- v330 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v330 — Done</span> <span class="tl-title">Scheduler config — all tiles stacked in a single column</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">scheduler</span> <span class="tag tag-ux">layout</span> </div> <div class="tl-desc"><ul> <li>The Scheduler → Configuration panel previously placed <strong>Review Cycles</strong> and <strong>Automated Reminders</strong> side-by-side in a two-column grid, forcing both wide tables to scroll horizontally within their narrow halves. The <code>.scheduler-grid</code> is now a <strong>single column</strong> so every tile — Review Cycles, Automated Reminders, Timeline Notification Schedule and Meeting Notes AI Reminders — renders full-width, one after the other.</li> <li>Each table now has the full panel width, so the reminder columns (Roles Notified, Channel, Email Template, Status, Enabled) are legible without the inner horizontal scrollbar.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): scheduler config tiles single-column stack (v330)</div> </div> </div> <!-- v329 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v329 — Done</span> <span class="tl-title">Ups & Downs — AiDE & Other Topics now EDITABLE by every role above the Project Lead</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ups-downs</span> <span class="tag tag-feat">aide</span> <span class="tag tag-ux">editable</span> </div> <div class="tl-desc"><ul> <li>v328 surfaced the consolidated “AiDE & Other Topics” read-only at every level. Now, like the Ups/Downs items, it is <strong>editable by every role ABOVE the Project Lead</strong> — PM, Delivery SPOC, Sales SPOC, POD Owner and Cluster Head can <strong>refine each Project Lead’s notes before forwarding</strong>. Each PL block becomes two text areas (AiDE-related points + optional Other topics); editing shows an <strong>“✎ edited at this level”</strong> chip and flows into the “👁 Preview journey” modal.</li> <li>Read-only is retained where it should be: the <strong>PMO observer</strong> and the archived <strong>cycle-detail</strong> still render the consolidated notes as read-only bullets. The <code>renderTopicNotes(id, { editable })</code> flag in the shared <code>assets/js/wf-preview.js</code> drives both modes; the preview always shows the current (possibly-edited) values.</li> <li>Mockup-only, for review first. React screens + the API modification-tracking (who edited which note at which level) are the remaining step.</li> </ul></div> <div class="tl-commit">💄 mockup(workflow): U&D AiDE & Other Topics editable above PL (v329)</div> </div> </div> <!-- v328 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v328 — Done</span> <span class="tl-title">Ups & Downs — AiDE & Other Topics reflected to every level + “Preview journey” at each level</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ups-downs</span> <span class="tag tag-feat">aide</span> <span class="tag tag-ux">preview</span> </div> <div class="tl-desc"><ul> <li>The v327 “AiDE & Other Topics” PL section now <strong>reflects to every eligible role</strong>. A new shared <code>assets/js/wf-preview.js</code> renders a <strong>read-only</strong> consolidated card (the free-text each Project Lead submitted, per PL) on <code>pm.html</code>, <code>spoc.html</code>, <code>pod.html</code>, <code>cluster-head.html</code>, <code>pmo.html</code> and the archived <code>cycle-detail.html</code> — mirroring the API’s new <code>topicNotes</code> consolidation.</li> <li>New <strong>👁 Preview journey</strong> button at <strong>every level</strong> (PL → PM → Delivery/Sales SPOC → POD Owner → Cluster Head, plus PMO observer). It opens a modal showing how the cycle looks <em>all together</em> at that point: the chain/stepper, every Up and Down currently on the page (scraped live), and the consolidated AiDE & Other Topics — i.e. the report as it will flow up to the next level.</li> <li>Backend already in place: <code>aide_notes</code> / <code>other_topics</code> on <code>CyclePlSubmission</code>, persisted by save-draft/submit-pl and returned as a consolidated <code>topicNotes</code> array from the cycle GETs. React screens are the remaining step.</li> </ul></div> <div class="tl-commit">💄 mockup(workflow): U&D AiDE topics for all roles + Preview-journey at each level (v328)</div> </div> </div> <!-- v327 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v327 — Done</span> <span class="tl-title">Ups & Downs — new mandatory “AiDE & Other Topics” section (single free-text per category)</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ups-downs</span> <span class="tag tag-feat">aide</span> <span class="tag tag-ux">form</span> </div> <div class="tl-desc"><ul> <li>Added a <strong>🤖 AiDE & Other Topics</strong> card to the Project Lead submission screen (<code>workflow/pl.html</code>), sitting alongside the existing <em>My Ups</em> / <em>My Downs</em> cards. It captures two categories: <strong>AiDE-related points</strong> (adoption, time saved, wins, blockers) and <strong>any other topics</strong> worth raising this cycle.</li> <li><strong>Deliberately different input model:</strong> unlike Ups/Downs — where each point is a separate submitted item with its own card, edit and history — each category here is a <strong>single free-text area</strong> that holds all of that category’s points at once (one textarea per category, no “add another item”). Character-counted (1000 each), pre-filled with a realistic sample for review.</li> <li><strong>All three sections are mandatory:</strong> Ups, Downs and AiDE & Other Topics now carry a required <span style="color:#dc2626">*</span> marker, and <code>submitPL()</code> blocks submission (with a warning toast) until there is at least one Up, one Down and an AiDE-related-points note. “Any other topics” stays optional within the required section.</li> <li>Mockup-only, for review first. Once the shape is confirmed, the read-only rendering will be propagated up the review chain (<code>pm.html</code> → <code>spoc.html</code> → <code>pod.html</code> → <code>cluster-head.html</code>) and into <code>cycle-detail.html</code>, then implemented in the React screens + API.</li> </ul></div> <div class="tl-commit">💄 mockup(workflow): U&D AiDE & Other Topics section on the PL screen (v327)</div> </div> </div> <!-- v326 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v326 — Done</span> <span class="tl-title">Ups & Downs — per-item change history (🕐) at every level & Cluster Head can edit/add before final approval</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ups-downs</span> <span class="tag tag-ux">audit-trail</span> <span class="tag tag-ux">cluster-head</span> </div> <div class="tl-desc"><ul> <li>The Ups & Downs report starts at the <strong>Project Lead</strong> and moves up the reporting chain (PL → PM → Delivery SPOC → Sales SPOC → POD Owner → Cluster Head). Every item card now carries a <strong>🕐 History</strong> control that opens a modal showing that single point’s <em>full trail</em> — who added it and every edit at each level (old → new). Added to <code>pl.html</code>, <code>pm.html</code>, <code>spoc.html</code>, <code>pod.html</code> and <code>cluster-head.html</code>.</li> <li>The <strong>Cluster Head</strong> screen is no longer read-only: during its own review turn (after the POD Owner forwards, before final sign-off) it can <strong>add new points, edit, or remove</strong> items just like every level below it — each change traced on the item’s history. The Final Ups/Downs cards flip from “Read-only” to “Editable — add or refine before final approval,” with inline edit + Add rows; they lock again once the cycle is approved.</li> <li>Mirrors the app change: the API now stamps <code>subjectId=itemId</code> on every add/edit/delete audit row (queryable via <code>GET /audit/cycle/:id?subjectId=</code>), and <code>cluster_head</code> joined <code>CAN_EDIT</code>.</li> </ul></div> <div class="tl-commit">✨ feat: U&D per-item history + Cluster Head editable cards (v326)</div> </div> </div> <!-- v325 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v325 — Done</span> <span class="tl-title">Meeting Notes AI — delete a meeting (creator/owner, ⭐ organiser, 👑 owner, or Administrator)</span> <span class="tl-date">6 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meeting-notes-ai</span> <span class="tag tag-ux">delete</span> <span class="tag tag-ux">permissions</span> </div> <div class="tl-desc"><ul> <li>Added a <strong>🗑️ Delete meeting</strong> action to the meeting detail header. The button appears for exactly the people allowed to remove a meeting: its <strong>creator/owner</strong> (<code>m.owner</code>), its <strong>⭐ organiser</strong> (<code>m.organiser</code>), any <strong>👑 designated owner</strong> (<code>m.meetingOwners</code>), or a <strong>System Administrator</strong> — encapsulated in a new <code>canDelete(m)</code> gate that mirrors the API’s <code>canDeleteMeeting</code>.</li> <li>The header action row now renders when the meeting is <em>ready</em> <strong>or</strong> the viewer can delete it, so Delete is reachable in <em>every</em> status (draft / processing / ready), while Email / Print stay gated on a processed meeting.</li> <li>Deleting asks for confirmation, removes the meeting (and, in the real app, its cascaded transcript / action items / report), toasts “🗑️ Meeting deleted.” and returns to the list. A new <strong>System Admin</strong> demo persona was added to the preview-as switcher so the admin-can-delete-any-meeting path is demonstrable.</li> </ul></div> <div class="tl-commit">✨ feat(meetings): delete a meeting — owner/organiser/creator/admin (v325)</div> </div> </div> <!-- v324 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v324 — Done</span> <span class="tl-title">People & Organisation hub — menu made consistent across every page & role (shared nav + command palette + PMO gating)</span> <span class="tl-date">5 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">admin</span> <span class="tag tag-ux">navigation</span> <span class="tag tag-feat">consolidation</span> </div> <div class="tl-desc"><ul> <li>v323 restructured the admin portal’s own sidebar, but the <strong>shared sidebar</strong> (<code>assets/js/nav.js</code>, rendered on every non-admin page) still listed the old five items — so admins/PMOs saw a different, un-consolidated menu everywhere except the admin page. Folded <code>nav.js</code>’ Management (Projects/PODs/Users) + Settings (Reporting/Org Hierarchy) groups into the single <strong>👥 People & Organisation</strong> entry, matching the admin portal.</li> <li><strong>Role consistency:</strong> the admin portal’s own sidebar gated the admin groups to <code>admin</code> only, while <code>nav.js</code> (and the app) grant admin access to <code>admin</code> + <code>pmoAssociate</code>. Aligned the admin-portal gate to <code>[admin, pmoAssociate]</code> so a PMO Associate now sees the same admin menu on the admin page too. All other roles (PL, PM, SPOCs, POD Owner, Cluster Head, ESO/Rec SPOC, Project Contributor) never see admin links — unchanged.</li> <li><strong>Command palette (⌘K):</strong> collapsed the five separate <em>Admin · Projects / Users / PODs / Reporting / Org Hierarchy</em> commands into one <em>Admin · People & Organisation</em> (keywords <code>users roles invite pods projects reporting org hierarchy</code> keep every term searchable); admin default landing now the hub.</li> <li>All legacy deep-links (<code>#users</code>, <code>#pods</code>, …) still resolve to the hub + correct tab; both <code>nav.js</code> + <code>command-palette.js</code> pass <code>node --check</code>. Zero old menu links remain anywhere.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): make People & Organisation menu consistent across all pages & roles (v324)</div> </div> </div> <!-- v323 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v323 — Done</span> <span class="tl-title">Admin Portal restructured — People & Organisation hub goes live (consolidates Users, PODs, Projects, Org Hierarchy & Reporting into one tabbed section)</span> <span class="tl-date">5 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">admin</span> <span class="tag tag-feat">consolidation</span> <span class="tag tag-ux">IA</span> </div> <div class="tl-desc"><ul> <li>The v322 standalone proposal is now <strong>implemented in the real admin mockup</strong> (<code>admin/index.html</code> + <code>admin.js</code>). The five formerly-separate sidebar entries — Projects, PODs, Users & Roles, Org Hierarchy (Management) and Reporting Relationships (Settings) — collapse into a single <strong>👥 People & Organisation</strong> nav item.</li> <li>New <code>#section-people</code> hosts a five-tab workspace: <strong>People & Roles · PODs · Projects · Reporting Lines · Hierarchy</strong> (<code>.people-tabs</code> / <code>.people-tab</code>).</li> <li><strong>Zero functionality lost:</strong> <code>initPeopleHub()</code> relocates the five existing section nodes into the tab panels at load, so every render fn, modal and action keeps working against its original fixed ids (<code>#users-tbody</code>, <code>#projects-tbody</code>, …). Only each area’s duplicate <code><h1></code> is dropped (demoted to the tab label); the action toolbars stay.</li> <li><code>navigateTo()</code> maps legacy deep-links (<code>#users</code>, <code>#pods</code>, <code>#projects</code>, <code>#reporting</code>, <code>#org-hierarchy</code>) onto the hub + the matching tab, so old links still resolve; default landing is now the hub.</li> <li><strong>Redundancy removed:</strong> deleted the standalone <code>people-org.html</code> proposal + its index card; folded the Projects/PODs/Users/Reporting index cards into one; dropped the now-empty Settings sidebar group and the 5 stale quick-jump nav buttons.</li> <li><strong>Theming:</strong> the new tab bar uses <code>--admin-*</code> tokens only (which map to the shared design-system light/dark palette) — no hardcoded hex, focus-visible ring, tracks the theme like the rest of admin.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): implement People & Organisation hub — consolidate 5 admin sections (v323)</div> </div> </div> <!-- v322 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v322 — Done</span> <span class="tl-title">People & Organisation — proposed single admin hub consolidating Users, Invitations, PODs, Projects, Org Hierarchy & Reporting Relationships</span> <span class="tl-date">5 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">admin</span> <span class="tag tag-feat">consolidation</span> <span class="tag tag-ux">IA</span> </div> <div class="tl-desc"><ul> <li>New standalone proposal page <code>people-org.html</code> showcasing a single <strong>People & Organisation</strong> hub that replaces five scattered admin screens (Users & Roles, PODs, Projects, Org Hierarchy, Reporting Relationships) plus the nav-less Invitation flow — behind one nav entry with a tabbed workspace.</li> <li><strong>Five tabs</strong>: People & Roles (the full user directory + every row action), PODs, Projects, Reporting Lines, and a read-only Hierarchy tree.</li> <li><strong>Invitations promoted</strong> from a hidden button inside Users to a first-class <em>Pending invitations</em> segment of the People tab (create / bulk / resend / revoke preserved).</li> <li>New slide-in <strong>Person Drawer</strong>: clicking any person — a directory row, a POD owner, a project role-holder, a reporting-line name, or a tree node — opens their cross-area profile (roles, POD, projects, manager, direct reports) with in-context actions. This is the payoff of putting people in one place.</li> <li>Includes a "what moved where — nothing lost" map documenting that all existing routes, modals, APIs and ~327 tests keep working; only the navigation + shared drawer are new.</li> <li>Self-contained: theme-aware via <code>design-system.css</code> tokens, vanilla-JS tab/segment/drawer interactions, no build step.</li> </ul></div> <div class="tl-commit">💄 mockup(admin): People & Organisation consolidation proposal (v322)</div> </div> </div> <!-- v321 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v321 — Done</span> <span class="tl-title">Meeting Notes AI — ParticipantPicker chip widget in CreateMeetingModal (GAP-17)</span> <span class="tl-date">5 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">participants</span> <span class="tag tag-feat">react</span> </div> <div class="tl-desc"><ul> <li><strong>ParticipantPicker</strong> chip widget implemented in <code>CreateMeetingModal.tsx</code>, replacing the previous scrollable checkbox list (GAP-17). Type-to-filter input inside a chip container; selected participants rendered as chips with ⭐ Organiser toggle (single — only one allowed, click again to clear) and 👑 Owner toggle (multiple); ✕ remove button on each chip.</li> <li>First participant added auto-becomes organiser (mirrors mockup <code>cmAddParticipant</code>); Backspace on empty input removes the last chip.</li> <li>Fixed-position dropdown with ↑/↓/Enter/Esc keyboard nav; blur timer (160 ms) cancelled on mouseDown so clicking an option doesn’t close the dropdown first.</li> <li>The <code>handleCreate</code> POST body now includes <code>organiserUserId</code> and <code>ownerUserIds</code> alongside the existing <code>participantIds</code>.</li> <li><code>onIntakeTabChange</code> in <code>MeetingDetailScreen.tsx</code> switches away from the video tab when the user selects transcript.</li> <li>27 new Vitest tests covering all picker interactions; all pass. <code>tsc --noEmit</code> 0 errors, ESLint 0 warnings.</li> </ul></div> <div class="tl-commit">✨ feat(web): ParticipantPicker chip widget in CreateMeetingModal — GAP-17 (v321)</div> </div> </div> <!-- v320 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v320 — Done</span> <span class="tl-title">Meeting Notes AI — Phase 2 video upload: progress bar + attempt/retry counter</span> <span class="tl-date">4 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">video</span> <span class="tag tag-feat">upload</span> </div> <div class="tl-desc"><ul> <li><strong>meeting-notes-ai.html</strong>: The Phase 2 “Video recording” tab is now interactive — drop or browse an <code>.mp4</code>, <code>.mkv</code>, <code>.webm</code> or <code>.mov</code> file and a live upload progress bar appears (0–100 %) with an <strong>Attempt N of 3</strong> badge.</li> <li>Attempt 1 intentionally stalls at 67 % and triggers an automated retry (attempt 2) after 1.4 s, demonstrating the failure-and-retry UX.</li> <li>Attempt 2 completes to 100 % and hands off to the existing AiDE step-list pipeline (transcript received → mindmap → ready).</li> <li>A × Cancel button aborts the upload and restores the dropzone at any point.</li> <li>Switching intake tabs or opening a different meeting cancels any in-progress upload automatically.</li> <li>New CSS classes: <code>.vid-progress-wrap</code>, <code>.vid-track</code>, <code>.vid-fill</code>, <code>.vid-try-badge</code> (ok / fail / retry variants).</li> </ul></div> <div class="tl-commit">💾 feat(mockup): Phase-2 video upload progress bar + attempt counter (v320)</div> </div> </div> <!-- v319 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v319 — Done</span> <span class="tl-title">Reporting-relationship Direct Report & Manager fields become type-to-filter user autocompletes</span> <span class="tl-date">4 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">autocomplete</span> <span class="tag tag-feat">admin</span> <span class="tag tag-ux">reporting</span> </div> <div class="tl-desc"> <ul> <li><strong>Autocomplete pickers:</strong> the <em>Add / Edit Reporting Relationship</em> modal's <strong>Direct Report</strong> and <strong>Manager</strong> plain <code><select></code> dropdowns are replaced with type-to-filter user autocompletes, matching the Meeting Notes AI participants widget — type a name or role to filter, avatar + name + role in the list, ↑/↓ + Enter keyboard nav, Esc/blur to close, and a selected-chip with ✕ to clear.</li> <li><strong>Reusable widget:</strong> new generic <code>initUserAutocomplete()</code> helper in <code>admin.js</code> (registry-backed, single-select) driving a hidden input the save logic reads unchanged; each field keeps its candidate filter (report excludes admin/PMO; manager also excludes Project Lead). Dropdown uses fixed positioning to escape the modal's <code>overflow</code> clip. Styles added to <code>admin.css</code> (<code>.user-ac*</code>).</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): reporting-relationship Direct Report/Manager user autocompletes (v319)</div> </div> </div> <!-- v318 — done --> <div class="tl-entry"> <div class="tl-card done"> <div class="tl-top"> <span class="tl-ver ver-done">v318 — Done</span> <span class="tl-title">Meeting Notes AI opened to everyone — access driven entirely by the participants list</span> <span class="tl-date">4 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">access</span> <span class="tag tag-fix">sharing</span> </div> <div class="tl-desc"> <ul> <li><strong>No more role tiers:</strong> removed the old two-tier access model (SPOC-level & above = full sharing; PM & below = personal workspace). The module is now available to <strong>every role</strong> — the access gate, <code>FULL_ROLES</code>/<code>MODULE_ROLES</code> and <code>personalMode()</code> are gone.</li> <li><strong>Sharing = the participants list:</strong> a meeting is visible to its <strong>participants</strong> (plus the owner). The old role-grouped share list and the separate <code>sharedWith</code> array are removed; the Access & sharing card now manages participants directly, and each participant receives the report and action-item reminders. The optional <strong>🌐 Visible to everyone</strong> toggle now reads "everyone in the organisation" (no SPOC qualifier).</li> <li><strong>Surfaces updated:</strong> <code>nav.js</code> and the Dashboard card now show for everyone; the ⌘K entry is no longer role-gated; visibility badges show "🔒 N people" (audience count) / "🌐 Everyone"; the Admin oversight register drops the "Personal (PM & below)" label. <code>index.html</code>, <code>dashboard.html</code> and <code>PAGES.md</code> copy refreshed.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): open Meeting Notes AI to everyone with participant-driven sharing (v318)</div> </div> </div> <!-- v317 — done --> <div class="tl-entry"> <div class="tl-card done"> <div class="tl-top"> <span class="tl-ver ver-done">v317 — Done</span> <span class="tl-title">Meeting Notes AI moved into the Workflow sidebar group on the Admin shell</span> <span class="tl-date">4 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">nav</span> <span class="tag tag-ux">sidebar</span> <span class="tag tag-feat">meetings</span> </div> <div class="tl-desc"> <ul> <li><strong>Consistency fix:</strong> the Admin portal's hardcoded sidebar still listed <strong>Meeting Notes AI</strong> under the <em>Management</em> group, while every other role screen (shared <code>nav.js</code>) already grouped it under <em>Workflow</em>. Moved it into the Workflow section (after Project Timeline, before Reports) and removed it from Management so the grouping is identical across all screens.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): move Meeting Notes AI into the Workflow sidebar group on the Admin shell (v317)</div> </div> </div> <!-- v316 — done --> <div class="tl-entry"> <div class="tl-card done"> <div class="tl-top"> <span class="tl-ver ver-done">v316 — Done</span> <span class="tl-title">Meeting Notes AI — participants autocomplete multi-select with organiser & owner designation</span> <span class="tl-date">4 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">autocomplete</span> <span class="tag tag-ux">participants</span> <span class="tag tag-feat">organiser</span> </div> <div class="tl-desc"> <ul> <li><strong>Participants autocomplete widget:</strong> the plain <code><select multiple></code> in the create-meeting modal is replaced with a chip-based autocomplete — type to filter by name or role, click or Enter to add. Already-added people are excluded. Backspace removes last chip; arrow keys navigate the list.</li> <li><strong>Organiser (1 only, ⭐):</strong> first participant added is auto-assigned as organiser (amber border). Clicking ⭐ on any chip reassigns; clicking the active organiser's ⭐ clears it. Organiser receives all action-item updates.</li> <li><strong>Owner (multiple, 👑):</strong> each chip also carries a crown button. Multiple owners can be designated; they receive all updates and digests. Organiser and owner can be the same person.</li> <li>Stored as meeting.organiser + meeting.meetingOwners[]. Surfaced in the detail participants strip (amber/purple borders + role badges) and in the report metadata table (Organiser and Owner(s) rows).</li> <li>Dropdown uses position:fixed anchored to getBoundingClientRect() to escape modal overflow:auto clipping. Demo M-1042 seeded with organiser + two owners to show all states.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Meeting Notes AI — participants autocomplete + organiser/owner designation (v316)</div> </div> </div> <!-- v315 — done --> <div class="tl-entry"> <div class="tl-card done"> <div class="tl-top"> <span class="tl-ver ver-done">v315 — Done</span> <span class="tl-title">Meeting Notes AI — recording & transcript become local-file uploads + dark-mode refresh</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">upload</span> <span class="tag tag-ux">dark-mode</span> </div> <div class="tl-desc"> <ul> <li><strong>Uploads replace links:</strong> recording and transcript URL inputs replaced by local-file upload dropzones; transcript gets a real dropzone with type/size validation. Recording upload is a Phase-2 placeholder.</li> <li><strong>Dark-mode refresh:</strong> all hardcoded light-only colors moved to shared tint tokens across the module.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Meeting Notes AI — local-file uploads + dark-mode token refresh (v315)</div> </div> </div> <!-- v314 — done --> <div class="tl-entry"> <div class="tl-card done"> <div class="tl-top"> <span class="tl-ver ver-done">v314 — Done</span> <span class="tl-title">Rename "Weekly Meeting Tracker" → "Meeting Notes AI" — filename, nav, all content</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">rename</span> <span class="tag tag-ux">nav</span> </div> <div class="tl-desc"> <ul> <li>Module renamed from <strong>Weekly Meeting Tracker / Weekly Meetings</strong> to <strong>Meeting Notes AI</strong> across all 10 files — <code>meeting-notes-ai.html</code> (was <code>meetings.html</code>), sidebar nav, topbar, dashboard card, admin portal tabs, Scheduler reminder groups, email-template category, command-palette entries, index page card, and PAGES.md.</li> <li>Also added <strong><code>?view=</code> quick-launch handler</strong> to <code>login.html</code> — index page cards now auto-log in as the correct demo user and redirect directly to the target screen instead of showing the login form.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): rename Weekly Meeting Tracker → Meeting Notes AI + ?view= quick-launch (v314)</div> </div> </div> <!-- v313 — done --> <div class="tl-entry"> <div class="tl-card done"> <div class="tl-top"> <span class="tl-ver ver-done">v313 — Done</span> <span class="tl-title">Meeting Notes AI — PMO Associate access granted (personal workspace tier)</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">access</span> </div> <div class="tl-desc"> <ul> <li><strong>PMO Associate</strong> role added to <code>MODULE_ROLES</code> — they now access the Meeting Notes AI as a <strong>personal workspace</strong> (own transcriptions only, no sharing), matching the PM-and-below tier introduced in v312.</li> <li>Demo user <em>Ramesh Kumar (PMO Associate)</em> added to the PEOPLE roster so the "Preview as" bar reflects the change immediately.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Meeting Notes AI — grant PMO Associate personal-workspace access (v313)</div> </div> </div> <!-- v312 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v312 — Done</span> <span class="tl-title">Meeting Notes AI — admin oversight section, menu entries, PM-and-below personal tier, Phase-2 video placeholders</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">meetings</span> <span class="tag tag-ux">access</span> </div> <div class="tl-desc"> <ul> <li><strong>Admin → Meeting Notes AI (<code>#meetings</code>)</strong>: new oversight section — KPI strip (meetings, AiDE-processed, open/overdue action items), filterable meetings register (owner, when, mode, status, access, closure progress, 🔔 nudge-owner action on overdue rows) and an <strong>AiDE Fabric Token adoption</strong> table. Meeting content stays owner-controlled — admins see the register, not the transcripts.</li> <li><strong>Reminder rules R-013–R-015 (ET-030/031/032)</strong> added to Scheduler → Reminders under a new 🤝 Meeting Notes AI group, with the three matching email templates (due-soon / due-today / overdue-escalation) under a new Email Templates category tab, plus the daily ET-030 sweep in Upcoming Runs.</li> <li><strong>Menu options everywhere</strong>: admin sidebar (Management group) on all shell pages via nav.js + the admin portal's own sidebar/tab strip, and ⌘K command-palette entries — "Meeting Notes AI" (role-gated) and "Admin · Meeting Notes AI".</li> <li><strong>PM-and-below personal tier</strong>: Project Manager, Project Lead and Project Contributor now get the module as a <strong>personal workspace</strong> — they see <strong>only their own processed transcriptions</strong>; no sharing options anywhere (no share list, no 🌐 visible-to-everyone, no 📧 email-report; Print/PDF kept). Even 🌐 meetings owned by others stay hidden. SPOC level & above keep full owner-controlled sharing.</li> <li><strong>Phase-2 video placeholders</strong>: the transcript intake card gains a 📄 Transcript (Phase 1) / 🎥 Video recording (Phase 2 — coming soon) switch. The video pane previews the pipeline — AiDE transcribes the recording (speaker-diarised) then runs the same MoM/mindmap/action-items generation — with a disabled drop-zone, "notify me" action, and a Phase-2 hint in the create-meeting modal.</li> <li>Dashboard module card + landing card copy updated for the two access tiers and Phase 2; headless jsdom smoke suites: 40 page assertions + 11 admin assertions green.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Meeting Notes AI admin section + menus + personal tier + video placeholders (v312)</div> </div> </div> <!-- v311 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v311 — Done</span> <span class="tl-title">Meeting Notes AI — new AiDE-powered module (transcript → MoM, mindmap, action items)</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">new module</span> <span class="tag tag-feat">aide</span> </div> <div class="tl-desc"> <ul> <li><strong>New page <code>meeting-notes-ai.html</code></strong>: Meeting Notes AI for the recurring POD Owner / SPOC weekly meetings. Access is restricted to <strong>SPOC level and above</strong> (Delivery / Sales / ESO / Recruitment SPOC, POD Owner, Cluster Head) — other roles see an access-denied state.</li> <li><strong>Meeting creation</strong> with the required fields: title, mode (Teams / Zoom / In-person / Hybrid), date + start time + duration, participants (mappable later, after the outcome is generated), follow-up-meeting flag + date, recording & transcript links, and a Timeline-style <strong>“🌐 Visible to everyone”</strong> option.</li> <li><strong>AiDE processing pipeline</strong>: the transcript is provided as text (doc upload or paste) and sent to the <strong>AiDE Brownfield Chat Completions API</strong> (<code>POST /api/v1/brownfield/chat/completions</code>, model <code>giga-brain</code>, OpenAI-compatible). A staged progress card simulates parse → understand → MoM → action items → mindmap.</li> <li><strong>AiDE Fabric Token collection</strong>: processing requires the user’s personal Fabric Token (from aide.imagine.tech → App → Plugins), collected once via a token modal, stored per user and sent as <code>Authorization: Bearer …</code>; connect/manage/remove states + masked display throughout.</li> <li><strong>Generated outcome tabs</strong>: 📝 Summary (MoM with decisions), 🧠 Mindmap (SVG topic map), ✅ Action Items (assignee, due date, due-in-days pill, completed toggle, next-reminder column, owner can add items), 📊 Report (meeting overview + action-closure table with due-in-days + progress bar).</li> <li><strong>Owner-controlled access</strong>: the creator is the meeting owner and decides who can access the processed report — per-person share list grouped by role, or visible-to-everyone; restricted meetings are hidden from the list for non-recipients (preview-as bar demos this).</li> <li><strong>Reminder process</strong>: T-3 days / due-date / overdue-every-2-days emails to assignees (ET-030/031/032) + weekly closure digest to the owner; per-meeting enable toggle and “send now” demo.</li> <li><strong>Share the outcome</strong>: 📧 Email-report modal (recipients from the share list, PDF attached) and 🖨️ Print / PDF (print-mode CSS renders the report only).</li> <li><strong>Navigation</strong>: 🤝 “Meeting Notes AI” sidebar link (nav.js, SPOC+ roles only), role-gated dashboard module card, and a landing-page card on the mockup index.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Meeting Notes AI module — AiDE transcript processing + action tracking (v311)</div> </div> </div> <!-- v310 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v310 — Done</span> <span class="tl-title">Admin portal — consistent dropdown chevrons, themed secondary buttons, dark-mode arrow fix</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">ux</span> <span class="tag tag-fix">theme</span> </div> <div class="tl-desc"> <ul> <li><strong>Custom dropdown chevron</strong>: <code>.filter-select</code> and <code>select.form-control</code> now render a consistent inline SVG down-chevron (native arrow suppressed via <code>appearance:none</code>) with right padding so the caret never overlaps the value.</li> <li><strong>Dark-mode arrow</strong>: added a <code>[data-theme="dark"]</code> override swapping the light-grey chevron for a near-white one so it stays visible on dark select backgrounds.</li> <li><strong>Themed secondary buttons</strong>: replaced hard-coded <code>#f1f5f9</code>/<code>#e2e8f0</code> inline styling on the Run History quick-date presets and “Load more” with the shared <code>.btn-secondary</code> class (now token-driven: <code>--bg-card</code> / <code>--border-strong</code>, brand-tinted hover) so they adapt to light/dark.</li> <li><strong>Token cleanup</strong>: admin inputs/selects switched from legacy <code>--admin-text</code>/<code>--surface</code> to canonical <code>--text-primary</code>/<code>--bg-card</code>; added <code>.btn-secondary</code>/<code>.btn-link</code> to admin.css; removed the duplicate/incorrect second design-system.css link in admin/index.html.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): admin dropdown chevrons + themed secondary buttons + dark-mode arrow (v310)</div> </div> </div> <!-- v309 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v309 — Done</span> <span class="tl-title">Run History — hide zero-email runs by default, job-type filter added</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-ux">ux</span> <span class="tag tag-feat">scheduler</span> </div> <div class="tl-desc"> <ul> <li><strong>Hide 0-email runs by default</strong>: the Run History table in Admin → Scheduler → Activity & Run Log now hides scheduler runs where no emails were sent (<code>items = 0</code>) on initial page load, removing noise from high-frequency cron jobs that fire successfully but find no recipients.</li> <li><strong>“Hide 0-email runs” checkbox</strong>: a clearly labelled checkbox in the filter bar (checked by default) lets admins toggle zero-email runs back into the list on demand. Error runs are always shown regardless of item count so failures are never silently hidden.</li> <li><strong>Hidden-count hint</strong>: when runs are hidden a small muted label shows how many were suppressed (e.g. “14 zero-email runs hidden”).</li> <li><strong>Job-type filter</strong>: new “All job types” dropdown lets admins narrow history to a specific job (ET-003, ET-014, cycle_creation, etc.).</li> <li><strong>Realistic sample data</strong>: scheduler run fixtures updated with entries spanning 3 Jul – 16 Jun 2026, including multiple consecutive zero-item inactivity-reminder runs that mirror the production pattern that motivated this feature.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Run History hide-zero-email toggle + job-type filter (v309)</div> </div> </div> <!-- v308 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v308 — Current</span> <span class="tl-title">Left-nav cleanup — duplicate admin tab strip hidden (web parity), sidebar completed with Email Log</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">nav</span> </div> <div class="tl-desc"> <ul> <li><strong>Admin duplicate navigation removed</strong>: the admin portal showed the same 12 sections twice — in the shared left sidebar AND a horizontal tab strip. The strip is now hidden (kept in the DOM for the active-state JS), matching the real app where AdminTopNav is dead code and navigation is sidebar-only. Hash routing (<code>#scheduler</code>, <code>#email-log</code>, …) verified intact.</li> <li><strong>Sidebar completed</strong>: “Email Log” was the one admin section reachable only from the now-hidden strip — added to the sidebar Reporting group on all 18 shell pages (matching the web AppShell’s Insights group).</li> <li>Audited both left navs for duplicate targets: web AppShell has none; the mockup sidebar’s salesSpoc dual P&A entries point to different pages by design (review queue vs own submission). Zero duplicate hrefs confirmed headlessly.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): left-nav cleanup — admin tab strip hidden, sidebar Email Log added (v308)</div> </div> </div> <!-- v307 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v307 — Done</span> <span class="tl-title">Roster unification — last ghost people made real or replaced, contributor reporting edges resolved</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">data</span> </div> <div class="tl-desc"> <ul> <li><strong>Kavya Reddaiah and Srinivas M are now real roster people</strong> (admin users u32/u33, Project Contributors reporting to Swati Nandha via RR-027/028) instead of names that existed only on P&A pages.</li> <li><strong>Gopal contradiction resolved</strong>: Gopal Krishna Tripathi stays Kuntal Singha’s contributor (RR-025, as priorities/review.html states); Swati’s “My Contributors” list and activity trail on priorities/pl.html now show <strong>Shivsagar Mishra</strong>, whose reporting edge (RR-026) moves to Swati.</li> <li>Remaining ghosts swapped for roster people: cluster-head digest’s non-submitter is Srinivas M; workflow/pm.html’s PL selector shows Anitha Deva. Zero ghost-name references remain outside the design-history archive; all four touched pages verified error-free.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): roster unification — ghost people resolved, contributor RR edges split (v307)</div> </div> </div> <!-- v306 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v306 — Done</span> <span class="tl-title">Deep-link params, breadcrumbs, docs back-link, timeline priority cap (audit Phase F, P2 tail — audit complete)</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ux</span> <span class="tag tag-fix">flows</span> </div> <div class="tl-desc"> <ul> <li><strong>Cycle deep-links</strong>: cycle-detail.html now reads <code>?cycle=</code> (validated against <code>/^[A-Z]{3}-\d{4}-[WM]\d+$/</code>, text-node-only swap — no XSS surface) and the sources pass it: dashboard Recent Activity rows, all 11 cycle-history View links, notifications’ “View Cycle”, and the bell item. Clicking “JUN-2026-W24 approved” finally lands on a page that says JUN-2026-W24.</li> <li><strong>Breadcrumbs</strong> on depth-2 pages: <code>Cycle History › <cycle id></code> on cycle-detail; <code>Projects › <role title></code> on all six workflow pages (replacing the old stray “← Projects” link). <strong>docs.html</strong> gets a “← Back to App” TOC link plus a fixed back button when the TOC hides ≤900px — no longer a dead end.</li> <li><strong>Timeline 3-priority cap fixed</strong>: <code>DRAFT_META.pri</code> was missing <code>priority:true</code>, so regular priorities never counted toward the documented cap; a 4th priority now routes to Suggestions (“weekly priority slots full (3/3)”) exactly as the copy promises.</li> <li>51 headless checks pass, zero page errors on all 16 page loads. <strong>This closes the industry-standard audit (v299–v306)</strong>; the only open item is the return-semantics product decision (mockup one-step-back vs .aiderules returned-to-PL).</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): cycle deep-links + breadcrumbs + docs back-link + timeline cap — audit P2 tail (v306)</div> </div> </div> <!-- v305 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v305 — Done</span> <span class="tl-title">Act → confirm → advance on review screens + mutually exclusive demo states + queue auto-advance (audit Phase F, P2)</span> <span class="tl-date">3 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ux</span> <span class="tag tag-fix">flows</span> </div> <div class="tl-desc"> <ul> <li><strong>Demo state switcher</strong> (auth-verify pattern) on workflow/pl.html, pm.html, spoc.html, pod.html and priorities/pl.html, review.html — the previously always-visible-all-at-once status banners (not-started / returned / submitted / success) are now mutually exclusive, driven by pill buttons, with a sensible initial state per page (review pages start with NO success banner — it appears only after acting).</li> <li><strong>Approve/Return now completes the loop</strong> on pm/spoc/pod/review: acting shows the matching confirmation banner with explicit next-step guidance (“Forwarded to <role>. Nothing else needs you here. Back to Dashboard · Next pending item”), locks the action bar (disabled + aria-disabled), and advances the stepper to the next level. Toasts remain as secondary feedback.</li> <li><strong>Review queue auto-advance</strong> (priorities/review.html): “Review →” buttons now load that submitter into the panel; after Approve the next pending card is auto-selected and scrolled into view (“Next: <name>” toast) — fewer clicks to clear a queue.</li> <li>All six pages verified headlessly per role: single visible banner initially, pill switching, locked bars, stepper advance, auto-advance — zero page errors. Remaining P2 backlog: ?cycle=/?week= deep-link params, breadcrumbs on depth-2 pages, docs back-link, timeline 3-priority cap, and the open return-semantics product decision.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): act→confirm→advance review loops + demo state switchers — audit Phase F P2 (v305)</div> </div> </div> <!-- v304 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v304 — Done</span> <span class="tl-title">One world of data — canonical JUN-2026-W25 everywhere, P&A reporting-graph chain on review, role-gated Reports, ghost people purged (audit Phase F, P1)</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">data</span> <span class="tag tag-fix">flows</span> <span class="tag tag-fix">rbac</span> </div> <div class="tl-desc"> <ul> <li><strong>Single canonical “now”</strong>: current cycle <code>JUN-2026-W25</code> (15–21 Jun), previous <code>JUN-2026-W24</code>, next <code>JUN-2026-W26</code>, P&A week 2026-W25 — aligned across dashboard, reports, cycle-history, projects, timeline, notifications, profile, digest modal, the notification bell, all six workflow pages, and all four priorities pages (May dates on genuinely historical rows and the archived <code>cycle-detail.html</code> view kept by design). cycle-history sheds its stray “Accenture / POD Alpha / ACC-001” identity for APS Bank / POD Basu / P001 and its stat tiles now count its own table; APS Bank is Weekly everywhere; per-cadence cycle IDs (Monthly → <code>JUN-2026-M1</code>).</li> <li><strong>Notification bell rejoined the same universe</strong>: its stale MAY-era demo set is now a subset of notifications.html’s JUN items and every item deep-links via the existing <code>PG_ROOT</code> convention (workflow, review queue, cycle detail, timeline, reports).</li> <li><strong>P&A chain converged on the reporting-graph model</strong>: priorities/review.html’s legacy fixed 6-rung ladder (with <code>pgm</code>/<code>ceo</code> keys and PM as its own rung) replaced by levels-as-sets — L1 direct manager(s), L2 <em>nearest Delivery SPOC</em> (any one of), then up the graph to Cluster Head; priorities/pl.html’s “Level 4” placeholder resolved to Vish Lakshmanan and its L2 labeled as the Delivery-SPOC jump with real roster people.</li> <li><strong>Ghosts & stale titles purged</strong>: Rohan Verma/Priya Sharma/Ranjana Singh/Kavya Reddaiah/Ravi Kumar replaced with roster people; “CEO Digest/View” → Cluster Head; “the AM” strings in pod/spoc corrected; admin ET-013 chain text + pair labels fixed; the second Vishnu persona gets his own email in the admin roster (matches v303 login fix).</li> <li><strong>Reports properly role-gated</strong>: reports.html redirects roles outside PMO/Delivery SPOC/POD Owner/Cluster Head/Admin; dashboard hides its two ungated Reports doors (stat tile, quick link) and the “Pending My Action” review banner for non-reviewers; Reports card’s “Available to” copy corrected. All verified headlessly per role.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): one world of data + reporting-graph chain + reports gating — audit Phase F P1 (v304)</div> </div> </div> <!-- v303 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v303 — Done</span> <span class="tl-title">Data-flow audit P0 fixes — Admin demo login, admin role guard, broken add-item controls, admin deep-links (audit Phase F)</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">flows</span> <span class="tag tag-fix">bugs</span> </div> <div class="tl-desc"> <ul> <li><strong>Admin demo login fixed</strong> — <code>DEMO_USERS</code> had <code>vishnu.goluguri@valuelabs.com</code> twice (admin, then deliverySpoc); the later key silently won, so the “Administrator” tile signed you in as Delivery SPOC. The PM + Delivery SPOC persona now has its own email (<code>vishnu.goluguri.pm@</code>) and full display name.</li> <li><strong>Admin Portal role guard</strong> — admin/index.html was reachable by any role and even signed-out visitors; it now redirects non-Admin/PMO to the dashboard and signed-out users to login (mirrors <code>CAN_ACCESS_ADMIN</code>).</li> <li><strong>All three broken “Add item” controls repaired</strong> — <code>workflow/pod.html</code> called an undefined <code>addPodItem</code> (ReferenceError); <code>workflow/pl.html</code> and <code>spoc.html</code> read a nonexistent <code>add-*-text</code> input instead of the <code>add-*-rte</code> contenteditable. All three verified headlessly: item appended, editor cleared, zero page errors.</li> <li><strong>Admin deep-links resolve</strong> — <code>org-hierarchy</code> and <code>email-log</code> were missing from <code>ADMIN_SECTIONS</code>, so every sidebar “Org Hierarchy” click silently landed on Projects. Both registered; <code>#org-hierarchy</code> verified.</li> <li><strong>Source</strong>: deep data-flow audit (Phase F) — full report also flags a fragmented demo “now” (MAY-W3 vs JUN-W24 vs JUN-W25 across pages), the legacy role-ladder still rendered on priorities/review.html vs the reporting-graph model on priorities/pl.html, ghost people, stale AM/CEO strings, and inert deep-links; those land as the next rounds (P1 data unification, P2 journey quality).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): data-flow audit P0 — admin login/guard, add-item controls, admin deep-links (v303)</div> </div> </div> <!-- v302 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v302 — Done</span> <span class="tl-title">One design system — legacy style.css retired, admin rebranded to shared navy, login adopts post-WCAG palette (audit Phase E)</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">de-dupe</span> <span class="tag tag-feat">brand</span> <span class="tag tag-fix">wcag</span> </div> <div class="tl-desc"> <ul> <li><strong>assets/css/style.css deleted</strong> (332 lines) — it was the legacy AiDELoop base with the old purple brand, 96 of 107 rules shell-identical to design-system.css. Its only real consumer, <strong>admin/index.html</strong>, now links design-system.css; 15 inline shell rules that existed to override the legacy file were removed (now byte-identical in the design system) — all three admin states (light/dark/mobile) verified pixel-identical.</li> <li><strong>Admin portal rebranded purple → POD navy</strong>: <code>--admin-primary</code> now follows <code>var(--brand-primary)</code> and the two template-code chips in admin.js use <code>var(--brand-light)</code>. Matches the real implementation, where purple only survives as a var() fallback in ProfileScreen.tsx.</li> <li><strong>login.html fully on shared tokens</strong>: the two <code>:root:not([data-theme="dark"])</code> light-pin blocks (68 lines, every token verified present in the design system) are gone, and the 16 drifted pre-v159-WCAG rules (rb-pm badge, alerts, wysiwyg, stat-cards, notif panel…) were removed so the tokenized design-system versions apply. Verified: the only light-mode pixel change is the intended WCAG text-contrast correction on the PM badge; dark mode now uses proper dark tints there too.</li> </ul> </div> <div class="tl-commit">💾 refactor(mockup): retire style.css, admin navy rebrand, login WCAG palette adoption — audit Phase E (v302)</div> </div> </div> <!-- v301 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v301 — Done</span> <span class="tl-title">Dark theme everywhere + PWA-shell polish (audit Phases C+D) — login/auth/docs/mcp-guide dark, safe-area, touch targets</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">dark-mode</span> <span class="tag tag-feat">pwa</span> <span class="tag tag-fix">mobile</span> </div> <div class="tl-desc"> <ul> <li><strong>Dark theme now covers every page.</strong> login.html gets full dark support (parity with <code>LoginScreen.tsx</code>, which themes via shared tokens): its inline light-token pins are scoped to <code>:root:not([data-theme="dark"])</code> so the design-system dark tokens win in dark mode, plus theme boot + theme.js + targeted overrides for the inline-styled card/OTP digits/demo tiles. auth-verify/auth-activate get scoped dark card/form overrides; docs.html and mcp-guide.html flip their own token sets under <code>html[data-theme="dark"]</code>; index/history declare their always-dark design via <code>color-scheme: dark</code>. Light renders verified byte-identical on login desktop/tablet.</li> <li><strong>PWA-shell polish (design-system.css)</strong>: safe-area insets on topbar/sidebar/toasts with <code>viewport-fit=cover</code> added to all 29 pages; <code>overscroll-behavior: contain</code> on modal overlays and the drawer sidebar; 16px input font floor ≤900px (stops iOS focus zoom); <code>pointer: coarse</code> touch-target sizing (40px minimum on small buttons, icon buttons, nav links).</li> <li><strong>Zero horizontal overflow on all 29 pages at 375px</strong> — closed the last three: mcp-guide (flex <code>.step-body</code> min-width:0 + mobile table scroll + header-bleed containment), history (long <code>code</code>/commit strings now <code>overflow-wrap: anywhere</code>), docs (v300 follow-through). Desktop 1440px renders verified pixel-identical to v300 on all 8 spot-checked pages.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): dark theme everywhere + PWA-shell polish — audit Phases C+D (v301)</div> </div> </div> <!-- v300 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v300 — Done</span> <span class="tl-title">Responsive fluid-layout pass — mobile table scroll, desktop width cap, adaptive grids, docs mobile fix (audit Phases A+B)</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">responsive</span> <span class="tag tag-fix">mobile</span> <span class="tag tag-feat">layout</span> </div> <div class="tl-desc"> <ul> <li><strong>Wide tables now scroll instead of clipping/crushing</strong> — shared rules <code>.card-body:has(> table){overflow-x:auto}</code> + <code>.card{min-width:0}</code> in design-system.css and <code>.admin-card-body:has(> .admin-table)</code> in admin.css fix ~30 tables across 12 pages; the admin Projects table (previously one-word-per-line at 375px) and the 9-column Cycle History table are now fully reachable on phones. Headless probe confirms zero horizontal document overflow at 375px on all previously-affected pages.</li> <li><strong>Desktop readability cap</strong> — <code>.main-content > #topbar-placeholder + div</code> stretches to fill but caps at 1520px centered (AzDO/GitHub pattern) on all 21 shell pages; pages with tighter inline caps keep them. Verified pixel-identical at 1440px on 7 of 8 spot-checked pages.</li> <li><strong>Fixed grids now adapt</strong> — 20 inline <code>repeat(N,1fr)</code>/<code>2fr 1fr…</code>/<code>1fr 1fr</code> grids converted to <code>repeat(auto-fit,minmax(…,1fr))</code> across dashboard (module picker + stats), reports (KPIs ×2, compare grids ×2), cycle-history, status, priorities/history, profile (×2), login demo tiles, and admin (KPIs, 2 filter rows, audit filter row, 4 settings grids); reports' <code>3fr 2fr</code> master split gets a <code>.rpt-split</code> collapse ≤1100px. Dashboard's module picker also stops reserving an empty 4th track when a role-gated card is hidden.</li> <li><strong>docs.html usable on mobile + overflow-free at 4K</strong> — fixed 260px TOC now hides ≤900px (mcp-guide pattern), <code>img{max-width:100%}</code>, reference tables scroll in place (also fixes a pre-existing 1528px overflow at 1440px). <strong>Small-viewport units</strong>: <code>@supports</code> blocks add <code>100dvh</code> fallbacks in design-system.css/style.css/admin.css/docs.html (mobile URL-bar bug). <strong>Topbar titles</strong> truncate with ellipsis instead of wrapping into the icon cluster on phones. P&A rich-text toolbar wraps at narrow widths.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): responsive fluid-layout pass — audit Phases A+B (v300)</div> </div> </div> <!-- v299 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v299 — Done</span> <span class="tl-title">Redundant-style removal — login.html de-duplicated against the shared design system, pixel-verified</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">css</span> <span class="tag tag-fix">de-dupe</span> </div> <div class="tl-desc"> <ul> <li><strong>login.html now links <code>assets/css/design-system.css</code></strong> instead of carrying a full inline fork of it — 298 duplicate rules removed (281 byte-identical + 17 identical once <code>var(--token, fallback)</code> is resolved to the light-theme token value), shrinking the file from 2,038 to 1,357 lines (−35 KB). The 48 genuinely divergent login-specific rules stay inline, after the link, so the cascade is unchanged.</li> <li><strong>Pixel-verified</strong>: headless Chromium screenshots at 375/768/1440px plus forced-dark are <em>byte-identical</em> before vs after; removal was restricted to rules that compute to identical values, so hidden states (error cards, scenario chips) are covered by construction.</li> <li><strong>Drift documented, not silently changed</strong>: ~16 of the kept inline rules differ from the design system only because login still carries pre-v159-WCAG literal colors (e.g. <code>.rb-pm</code> text <code>#b45309</code> vs token <code>#78350f</code>). Left as-is for pixel parity; adopting the corrected palette is a recommended follow-up in the responsive/theming audit.</li> <li><strong>Audit context</strong>: this is the first, safest slice of a full industry-standard audit (fluid layouts, dark theme coverage, PWA-shell readiness, data-flow). Legacy <code>assets/css/style.css</code> turned out to be the admin portal's separate purple brand theme — retiring it is a Phase-1 refactor, not a redundancy removal.</li> </ul> </div> <div class="tl-commit">💾 refactor(mockup): de-dupe login.html against design-system.css, pixel-verified (v299)</div> </div> </div> <!-- v298 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v298 — Done</span> <span class="tl-title">Parity re-sync round 3 — systemic consistency sweep: confirm dialogs, toolbar completeness, audit-diff coverage, taxonomy fixes</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">safety</span> <span class="tag tag-fix">consistency</span> <span class="tag tag-feat">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>Destructive-action confirmation, closing the remaining gaps</strong> — round 1 built a confirm-before-delete dialog but wired it into only 4 workflow files; this pass found it missing from <code>timeline.html</code>'s note delete (real <code>TimelineScreen.tsx</code> confirms this, unlike its already-safe undo-snackbar event delete, left alone), <code>profile.html</code>'s three revoke actions (token/session/all-other-sessions), and the admin portal's <code>toggleUserStatus</code> (previously had ZERO protection, not even undo) and <code>forceLogoutUser</code> (was a jarring raw browser <code>confirm()</code>). The other 9 admin delete/revoke actions keep their existing undo-snackbar pattern — an intentionally different but already-safe UX, left untouched.</li> <li><strong>Rich-text toolbar completeness — corrected a stale claim from this same memory's own v296 entry</strong>: <code>workflow/pl.html</code>, <code>pod.html</code>, and <code>spoc.html</code> were recorded as having gained Underline/Numbered-list buttons in round 1, but a fresh grep showed all three still had only 3 buttons (Bold/Italic/Bullet) — round 1 never actually touched their toolbars, only <code>priorities/pl.html</code> and <code>priorities/review.html</code> did. Fixed all three now (9 insertion points across static composers + the JS edit-template). Also gave <code>workflow/cluster-head.html</code>'s Sign-Off Comment its first-ever rich-text toolbar — it was a plain <code><textarea></code> though the real <code>ClusterHeadScreen.tsx</code> uses a full <code>RichTextEditor</code> there.</li> <li><strong>Audit-diff coverage extended to Priorities & Achievements</strong> — round 1's diff-view wiring only reached 7 U&D-side files; the 4 P&A files (<code>priorities/pl.html/review.html/cluster-head.html/history.html</code>) each have their own separate <code>renderAuditTrail()</code> that never got it. <code>priorities/pl.html</code> now gets the full old/new diff (it uses the same shared <code>AuditTrailSidebar</code> component as U&D in real); the other three get the simpler italic comment-quote <code>PMPAReviewScreen.tsx</code> actually uses there.</li> <li><strong>Login demo coverage</strong>: added the 2 of 8 real <code>LoginScreen.tsx</code> states the mockup was missing — Wrong Email Domain and Invalid Email Format. <strong>Status auto-refresh</strong>: <code>status.html</code> only ever refreshed on manual click though <code>PAGES.md</code> itself documents a 60s auto-refresh — added the missing <code>setInterval</code>. <strong>Admin Projects</strong>: table + CSV export were missing the Cluster Head column (CSV also missing ESO/Recruitment SPOC), matching a same-day real fix. <strong>Admin Audit Log</strong>: entity-label map was missing <code>timeline</code>/<code>notification</code> keys present in real. <strong>Reports & Analytics</strong>: the "Project Timeline Activity" card showed a fictional Updates/Notes/Captures breakdown with no real counterpart — replaced with the actual 7 event types (Milestone/Win/Risk/Blocker/Decision/Update/Escalation) and their real icons/colors, and dropped an extra stat tile real doesn't have.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): parity re-sync round 3 — confirm dialogs, toolbar + audit-diff completeness, login/status/admin/reports fixes (v298)</div> </div> </div> <!-- v297 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v297 — Done</span> <span class="tl-title">Parity re-sync round 2 — in-page Help everywhere, Dashboard role-gated cards, content drift fixes</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">help</span> <span class="tag tag-fix">dashboard</span> <span class="tag tag-chore">content</span> </div> <div class="tl-desc"> <ul> <li><strong>In-page Help button, everywhere it was missing</strong> — a second completeness audit found every real <code>Admin*Screen.tsx</code> (all 12) plus <code>DashboardScreen</code>, <code>NotificationsScreen</code>, <code>ReportsScreen</code>, <code>ProfileScreen</code>, and <code>HistoricalPAScreen</code> render an in-page <strong>❓ Help</strong> button — none of the mockup equivalents had one (only the generic sidebar nav link). Added a topic-anchored <code>help.html#<topic></code> link to all of them, styled to match each page's own existing header-button convention (dark-glass <code>rgba(255,255,255,.15)</code> pattern on <code>dashboard/reports/profile/priorities-history.html</code>, light <code>btn-secondary btn-sm</code> on <code>notifications.html</code> and all 12 <code>admin/index.html</code> sections — reusing <code>org-hierarchy</code>'s existing <code>page-header-actions</code> pattern for the sections that didn't already have one).</li> <li><strong>Dashboard cards weren't hidden per role, only dimmed</strong> — <code>DashboardScreen.tsx</code> hides the Ups & Downs card entirely for Admin/Project Contributor and the Reports card for everyone except PMO/Delivery SPOC/POD Owner/Cluster Head; the mockup only ever dimmed the Admin card and hid P&A. Added the same <code>element.style.display='none'</code> treatment to the other two cards, reusing the exact role-key arrays already computed for this page's sidebar nav so both stay in sync.</li> <li><strong>Content drift</strong>: <code>whats-new.html</code> was missing the newest release note ("Admins: a complete Email Log", 30 Jun) present in the real <code>whatsNew.ts</code>; added it verbatim. <code>projects.html</code>'s search placeholder still said "…or ID…" though the field only ever searches by name/POD; corrected to match <code>ProjectsScreen.tsx</code>'s real placeholder text.</li> <li><strong>Also confirmed, not re-fixed</strong>: a full file-level inventory found every real screen already has a mockup counterpart (no missing pages) and no orphaned/redundant mockup files (<code>docs.html</code>/<code>PAGES.md</code>/<code>screenshots/</code> are an actively-maintained secondary reference layer, not dead weight); a backlog sweep (TODO/FIXME grep, PWA scaffolding check, memento/scrum staleness check) found no discoverable "required but not yet implemented" feature with a UI surface — the backlog is genuinely caught up.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): parity re-sync round 2 — in-page Help buttons (17 pages/sections), Dashboard role-gated cards, What's New + Projects content drift (v297)</div> </div> </div> <!-- v296 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v296 — Done</span> <span class="tl-title">Implementation parity re-sync — reporting-graph P&A chain, workflow safety UX, functional Admin Audit Log</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">parity</span> <span class="tag tag-fix">workflow</span> <span class="tag tag-feat">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>P&A reporting-graph approval chain</strong> — the real bilateral chain now resolves from the org reporting graph (a level can be a <em>set</em> of parallel approvers, any one of whom clears it) rather than a fixed 5-role ladder. <code>priorities/pl.html</code>'s Approval Chain Status card was still hard-coded to the old ladder; rebuilt it to match <code>PAChainStatus.tsx</code> exactly — no role-label heading, decided approvers shown plainly, pending multi-approver levels read "Any one of: A, B".</li> <li><strong>Workflow item safety & audit fidelity</strong> — every Ups & Downs screen (PL/PM/Delivery/Sales SPOC/POD Owner) could only delete-and-recreate an item with zero confirmation; added in-place <strong>✏️ Edit</strong> (reusing each page's own rich-text toolbar) and a <strong>confirm-before-remove</strong> dialog to all five. Wired up the Audit Trail's <code>.audit-change-item</code>/<code>.old-text</code>/<code>.new-text</code>/<code>.comment-text</code> diff styling (already shipped in <code>design-system.css</code> but never used) across pl/pm/spoc/pod/pmo/cluster-head/cycle-detail. Added the ESO/Recruitment SPOC read-only observer mode to <code>spoc.html</code>, the missing ⏱ Cycle Time/bottleneck column to <code>pmo.html</code>, a read-only Attachments card to <code>cycle-detail.html</code>, PM's plain-<code><input></code> add-rows upgraded to the shared rich-text toolbar, and Underline/Numbered-list buttons added where toolbars were missing them (<code>workflow/*.html</code>, <code>priorities/review.html</code>, <code>priorities/pl.html</code>). Timeline gained its Help button, per-event read-only attachments, and per-note delete. Two latent bugs found and fixed along the way: POD Owner's Ups/Downs render call still passed <code>readOnly=true</code> despite the page's own comments saying otherwise (no Edit/Remove ever rendered), and <code>status.html</code>'s role badges referenced non-existent CSS classes (all 10 roles rendered identically green).</li> <li><strong>Admin Portal — six real gaps closed</strong>, the largest being the <strong>Audit Log</strong>: it was static, hand-written HTML with fake data and toast-stub filters, the only log-style admin section not driven by <code>adminState</code> — now fully filterable (search/entity/role/action/date) with a real per-row expand-to-diff. Also added: 🔒 Force Logout on active users, a System-Admin usage-cap badge, a new "🔐 Access & Security" settings card (max admins, auth rate limit), an MCP Tokens "Service Accounts" tab with a working role picker (previously silently defaulted every new service account to <code>pmoAssociate</code>), and a real Add/Edit modal for Scheduled Reports. Command palette gained its 8 missing commands (Admin PODs/Reporting/Org/Reports/MCP Log, Notifications/What's New/Help); Help gained its missing Notifications topic; Status gained the full 10-entry Important Links list, all 10 roles, and a Key Requirements list; <code>mcp-guide.html</code>'s two stale "33 tools" references corrected to 34.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): implementation parity re-sync — P&A reporting-graph chain, workflow edit/confirm/audit-diff, functional Admin Audit Log + 5 more admin gaps (v296)</div> </div> </div> <!-- v295 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v295 — Done</span> <span class="tl-title">Standards hardening — color-scheme (native UI theming), page meta, link security, touch targets, print</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">standards</span> <span class="tag tag-fix">theme</span> <span class="tag tag-fix">seo</span> </div> <div class="tl-desc"> <ul> <li><strong>color-scheme</strong> — the theme work styled our own components but native UI (form-control defaults, scrollbars, spinners, autofill, date pickers) stayed light in dark mode. Added <code><meta name="color-scheme" content="light dark"></code> to every page plus <code>html { color-scheme: light } html[data-theme=dark] { color-scheme: dark }</code> so the browser's own widgets follow the active theme.</li> <li><strong>Page meta</strong> — every page now has a per-page <code><meta name="description"></code> (derived from its title) and a <code><meta name="theme-color"></code> for the mobile browser chrome. <strong>Link security</strong>: added <code>rel="noopener noreferrer"</code> to the remaining <code>target="_blank"</code> link (reverse-tabnabbing). Fonts already ship <code>font-display: swap</code>.</li> <li><strong>Touch targets (WCAG 2.5.8)</strong> — audited target sizes headlessly; standalone text links are covered by the spacing exception, but the clustered icon controls (rich-text toolbar, category/event chips) were <24px → given a 24px minimum. Added a <strong>print stylesheet</strong> that drops the app chrome (sidebar/topbar/overlays) and keeps cards readable. Re-verified all 22 pages still pass light/dark/system.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): standards hardening — color-scheme native theming, page meta, link security, 24px touch targets, print styles (v295)</div> </div> </div> <!-- v294 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v294 — Done</span> <span class="tl-title">Accessibility pass — WCAG 2.1 AA across all pages, audited with axe-core (light + dark)</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">a11y</span> <span class="tag tag-fix">wcag</span> <span class="tag tag-fix">audit</span> </div> <div class="tl-desc"> <ul> <li>Ran <strong>axe-core</strong> (WCAG 2.1 A/AA + best-practice) headlessly over every page in Edge, in <em>both</em> themes. Started at 9 rule types / 700+ contrast failures (dark) and 212 (light); fixed down to a single rule (colour-contrast) with a handful of nodes, all WCAG-exempt disabled/opacity-dimmed controls (revoked API tokens, a locked admin module) or borderline brand chips.</li> <li><strong>Contrast</strong>: tokenized hundreds of hardcoded muted / semantic / accent text colours (<code>#64748b</code>, <code>#16a34a</code>, <code>#7c3aed</code>, <code>#2563a8</code>…) so they meet AA in both themes; gave the always-dark sidebar chrome fixed light colours (brand-blue logo/active-nav + muted labels were failing in <em>both</em> themes); darkened the light-mode <code>--text-muted</code>/<code>--text-secondary</code> tokens (table headers were 4.36:1); removed 3 pages' <code>:root</code> overrides that pinned the dark muted value in light mode; darkened <code>.btn-success</code>/<code>.btn-danger</code>/admin-primary so white button text passes.</li> <li><strong>Structure & input</strong>: added a <code><main></code> landmark + skip-to-content link on every page, accessible names to the injected sidebar navs (landmark-unique), <code>aria-label</code>s on unlabelled selects and toggle checkboxes, underlines on colour-only notification links, keyboard access (<code>tabindex</code>) to scrollable activity trails, a defined <code>.btn-link</code>, and fixed heading-order jumps. Proactively added a <code>prefers-reduced-motion</code> block, extended the <code>:focus-visible</code> ring to inputs, and a skip-link style. Re-verified all 22 pages still pass light/dark/system surface adaptation.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): WCAG 2.1 AA accessibility pass (axe-core verified, light + dark) — contrast, landmarks, labels, focus, reduced-motion (v294)</div> </div> </div> <!-- v293 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v293 — Done</span> <span class="tl-title">Dark mode validated headlessly across all pages — form controls, redundant inline tints & overlays now fully theme-adaptive</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">dark mode</span> <span class="tag tag-fix">validation</span> <span class="tag tag-fix">refactor</span> </div> <div class="tl-desc"> <ul> <li><strong>Rendered validation</strong> — drove every page headlessly in Edge (Playwright), forcing dark <em>before</em> load to exercise the FOUC guard, then asserted <code><html data-theme></code> + a dark body and auto-scanned for any sizeable near-white (unadapted) surface. Fixed everything it flagged; all 22 app-shell pages now pass in light, dark <em>and</em> system mode with zero unadapted surfaces.</li> <li><strong>Removed redundant inline references</strong> — <code><div class="alert" style="background:#f0fdf4;color:#14532d;…"></code> etc. just re-implemented the semantic <code>.alert-*</code> classes inline; replaced them with <code>class="alert alert-success/info/warning/danger"</code>. Tokenized ~580 remaining hardcoded inline tint panels (stat cards, banners, card-headers) + inline <code>background:#fff</code> on selects/rows to the design-system tint/surface tokens so they follow the theme instead of duplicating light colours.</li> <li><strong>Form controls & overlays</strong> — added a single shared <code>[data-theme="dark"]</code> block in <code>design-system.css</code> for inputs / selects / textareas / the rich-text composer / outline buttons (DRY, replaces per-page styling), themed the timeline composer + event cards, and gave the admin search input a themed surface. The notification panel, command palette, cycle-digest and idle overlays were tokenized so they no longer pop up bright white over a dark UI.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): dark mode headlessly validated on all pages; shared form-control theming + redundant inline tints removed (v293)</div> </div> </div> <!-- v292 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v292 — Done</span> <span class="tl-title">Theme system hardening — no-FOUC guard on every page, dark mode on the last 3 pages, full light/dark/system parity</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">dark mode</span> <span class="tag tag-fix">theme</span> <span class="tag tag-fix">a11y</span> </div> <div class="tl-desc"> <ul> <li><strong>No-FOUC guard</strong> — <code>theme.js</code> was loaded at the end of <code><body></code> on every page, so a dark-mode user saw a flash of the light theme on each navigation before the script flipped it. Added a tiny blocking inline script in <code><head></code> (reads <code>localStorage.pg_theme</code> + <code>prefers-color-scheme</code>, sets <code><html data-theme></code> before first paint) to all 22 app-shell pages — the industry-standard pattern. <code>theme.js</code> still loads later for the <code>PGTheme</code> API + OS-change listener (idempotent).</li> <li><strong>Missing pages</strong> — <code>help.html</code>, <code>whats-new.html</code> and <code>status.html</code> linked <code>design-system.css</code> but never included <code>theme.js</code>, so they ignored the saved theme and always rendered light. Added the include, and tokenized their page-specific <code><style></code>/inline hex (note/tip/warn boxes, status pills, service rows, quick-links) which had never been dark-tested.</li> <li><strong>Content sweep</strong> — swept every themed page for hardcoded near-black body text (<code>#0f172a/#1e293b/#1f2937/#374151</code>) and neutral card surfaces/borders (<code>#fafafa/#f9fafb/#e5e7eb</code>) that don't adapt (biggest offenders: <code>priorities/cluster-head.html</code>, <code>timeline.html</code>, <code>profile.html</code>) → design tokens. Tokenized the shared overlays too (<code>notif-bell.js</code>, <code>command-palette.js</code>, <code>digest-modal.js</code>, <code>idle-logout.js</code>) so the notification panel / command palette / cycle-digest / idle prompt follow the theme instead of staying bright white. The Profile Appearance control already offers a three-way Light / Dark / System toggle.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): no-FOUC theme guard on every page, dark mode on help/whats-new/status, full light/dark/system parity (v292)</div> </div> </div> <!-- v291 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v291 — Done</span> <span class="tl-title">Dark mode — item cards, priority/achievement rows & inline panels rendered bright light in dark theme</span> <span class="tl-date">2 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">bugfix</span> <span class="tag tag-fix">dark mode</span> </div> <div class="tl-desc"> <ul> <li>The JS render helpers (<code>renderUdItems</code>, <code>renderPriorities</code>, the achievements/add-reviewer inline renders) and several inline-styled panels hardcoded light hex (<code>#f0fdf4</code>/<code>#fef2f2</code> Up/Down tints, <code>#fff</code>/<code>#fffbeb</code> priority cards, <code>#0f172a</code> body text, <code>#f8fafc</code> attachment & quick-link rows) instead of the design-system tokens. In dark mode those bypassed the <code>[data-theme="dark"]</code> re-tone, so item cards rendered as bright light boxes with theme-light text trapped on a light fill.</li> <li>Swapped the hardcoded hex for the existing tokens (<code>var(--up-bg)</code>/<code>var(--down-bg)</code>, <code>var(--tint-warning-*)</code>, <code>var(--tint-success-*)</code>, <code>var(--tint-info-*)</code>, <code>var(--surface)</code>/<code>var(--surface-subtle)</code>, <code>var(--border)</code>, <code>var(--text)</code>) so every rendered card and panel follows the theme. Backgrounds and their text were tokenized together to avoid trapping light text on a self-contained light badge; pre-auth <code>login.html</code> was left untouched. Mirrors the parallel fix in the web app's <code>custom.css</code>.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): dark-mode item cards & inline panels use design tokens, not hardcoded light hex (v291)</div> </div> </div> <!-- v290 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v290 — Done</span> <span class="tl-title">Bugfix — notifications/help/what's-new read the wrong sessionStorage field, always showed "Project Lead"</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">bugfix</span> <span class="tag tag-fix">nav</span> </div> <div class="tl-desc"> <ul> <li>Found via a live-app-vs-mockup visual diff (screenshotting both side by side). <strong>notifications.html</strong>, <strong>help.html</strong>, and <strong>whats-new.html</strong> each read <code>user.roleKey</code> from <code>sessionStorage.pg_demo_user</code> to drive the topbar role badge, badge colour, and every role-conditional sidebar/link decision (P&A routing incl. the Cluster Head/Sales SPOC special cases, Ups & Downs/Timeline/Cycle-History visibility, Reports/Admin link visibility) — but the real session object (set by <code>login.html</code>'s <code>simulateLogin()</code>, matching the app's <code>podgov_user</code> shape) only ever has a <code>role</code> field, never <code>roleKey</code>. Every one of these three pages silently treated <strong>every</strong> logged-in demo user as a Project Lead, regardless of their actual role — the badge always read "Project Lead" and every role-gated link/section used the Project-Lead branch.</li> <li>Fixed by reading <code>user.role</code> (matching the working pattern already used on <code>dashboard.html</code>/<code>profile.html</code>/<code>timeline.html</code> and every other synced page) and correcting each page's no-session fallback object to the camelCase <code>role: 'projectLead'</code> instead of the display-label <code>'Project Lead'</code> + a redundant unused <code>roleKey</code> field. Verified with Playwright: a Delivery SPOC now shows "Delivery SPOC" (not "Project Lead") on all three pages, and a Cluster Head's P&A sidebar link now correctly points at <code>priorities/cluster-head.html</code> instead of the Project-Lead default <code>priorities/pl.html</code>.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): notifications/help/whats-new read user.role, not the nonexistent user.roleKey (v290)</div> </div> </div> <!-- v289 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v289 — Done</span> <span class="tl-title">P&A review landing — "this week" at-a-glance submission summary (parity gap)</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">priorities</span> </div> <div class="tl-desc"> <ul> <li><strong>priorities/review.html</strong> — the "Your Team's P&A Status" 2-level matrix went straight from the card header into the table, with no summary of how many reports are behind for the current week. Added the same one-line banner the app shows above its matrix: an amber "⏳ N of M not yet submitted this week (…)" (or a green "all submitted" variant when nobody is behind), computed the same way — a 'draft' still counts as not-yet-submitted.</li> <li>Mirrors the app change (<code>feat(web)</code> commit 2f477591): <code>PMPAReviewScreen.tsx</code>'s <code>team-pa-week-summary</code> banner above the <code>team-pa-overview-table</code>.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): P&A review "this week" submission summary parity (v289)</div> </div> </div> <!-- v288 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v288 — Done</span> <span class="tl-title">App-wide — removed the redundant topbar Help icon (parity gap, 21 pages)</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">nav</span> </div> <div class="tl-desc"> <ul> <li>Every authenticated page's shared topbar had a generic <strong>❓ Help</strong> icon button (linking to <code>help.html</code>) sitting alongside the sidebar's own <strong>❓ Help</strong> nav link — and several pages (e.g. <code>priorities/review.html</code>) also have their own page-contextual Help button, so some screens showed <strong>three</strong> separate Help entry points. Removed the topbar icon across all 21 pages that share the MPA nav-injection script, keeping the sidebar link (general docs) and each page's contextual Help button (jumps to that page's help section) — matching the two-tier pattern the app now uses everywhere.</li> <li>Mirrors the app change (<code>fix(web)</code> commit 27669389): <code>AppShell.tsx</code> dropped its topbar <code>nav-help-topbar</code> pill in favor of the sidebar's <code>nav-help-link</code>, which <code>HelpModal</code>'s own footer already points users to.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): remove redundant topbar Help icon app-wide (v288)</div> </div> </div> <!-- v287 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v287 — Done</span> <span class="tl-title">Login — self-service "Resend Activation Link" on the pending-activation card (parity gap)</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">login</span> </div> <div class="tl-desc"> <ul> <li><strong>login.html</strong> — Step 4 (Account Not Yet Activated) still had the dead "Go to activation page →" link the app removed, and never got the self-service resend feature the app added just before that removal. Replaced it with a "📧 Resend Activation Link to My Email" button that swaps the card into a confirmation panel ("New activation link sent!" + a 3-step next-steps list), reset back to the initial button each time the pending card is (re-)entered.</li> <li>Mirrors the app change (<code>feat(auth)</code> commit 94402862 + <code>fix(web)</code> commit e4b912ed): <code>LoginScreen.tsx</code>'s <code>handleResendInvitation</code>/<code>POST /api/v1/auth/resend-invitation</code>, and the later removal of the now-redundant "Go to activation page" link (bare <code>/auth/activate</code> needs a real token to do anything).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): Login self-service resend-activation-link parity (v287)</div> </div> </div> <!-- v286 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v286 — Done</span> <span class="tl-title">Profile — inline name editing (parity gap: app shipped it, mockup hadn't caught up)</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">profile</span> </div> <div class="tl-desc"> <ul> <li><strong>profile.html</strong> — the Account Details "Name" field was a static, read-only value with no edit affordance, even though <code>ProfileScreen.tsx</code> gained self-service inline name editing three commits ago (pencil icon → input + Save/Cancel). Admin's Edit User modal already had a "Full Name" field, so only the self-service Profile screen mockup was stale. Added a matching pencil button that toggles an inline input with Save/Cancel, updating <code>pf-name</code>, the page heading, and <code>sessionStorage.pg_demo_user</code> on save.</li> <li>Mirrors the app change (<code>feat(profile/admin)</code>, commit d2667677): <code>PATCH /api/v1/users/me</code> accepts <code>name</code>; <code>ProfileScreen.tsx</code>'s inline edit widget (<code>profile-name-edit-btn</code> / <code>profile-name-input</code> / <code>profile-name-save-btn</code> / <code>profile-name-cancel-btn</code>).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): Profile inline name editing parity (v286)</div> </div> </div> <!-- v285 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v285 — Done</span> <span class="tl-title">Bilateral Review — one level's approval accepts the P&A; higher levels are informational-only</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-fix">priorities</span> </div> <div class="tl-desc"> <ul> <li>Business rule change: the P&A bilateral chain no longer requires every level to approve in sequence. Only the <strong>first active review level</strong> (the submitter's direct manager, or the first active ladder rung in legacy mode) needs to approve to accept the submission. Every level above that is informational-only — no Approve action — but any level, including those above the first, can still <strong>Return</strong> the submission for revision at any time.</li> <li><strong>priorities/review.html</strong> — the sequential "awaiting previous level" notice is replaced with an informational notice explaining that only the first level's approval is required and that the reviewer can still return the submission.</li> <li>Mirrors the app change: <code>bilateralChainService.ts</code>'s <code>contextIsFirstActive</code> now gates the approve route directly (409 for non-first levels); <code>bilateral-return</code> dropped its previous-levels-approved gate so any chain member can return regardless of sequence; the by-pl and chain-status endpoints report a new <code>'informational'</code> status (replacing <code>'awaiting'</code>) for levels above the first; <code>PMPAReviewScreen.tsx</code> and <code>PAChainStatus.tsx</code> render the new status and hide the Approve button (keeping Return) for informational levels.</li> </ul> </div> <div class="tl-commit">💾 feat(pa): one-level bilateral approval, higher levels informational-only (v285)</div> </div> </div> <!-- v284 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v284 — Done</span> <span class="tl-title">Timeline Share — copy fallback for non-secure (HTTP) contexts</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">bugfix</span> <span class="tag tag-fix">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>timeline.html</strong> — <code>shareEvent()</code> only copied the type/gist/posted-by summary via <code>navigator.clipboard</code>, which is undefined outside a secure context (HTTPS/localhost). Since prod isn't on TLS yet, the Share button silently skipped straight to the bare "copy the link from your address bar" toast with nothing on the clipboard.</li> <li>Added a <code>copyTextFallback()</code> helper (offscreen textarea + <code>document.execCommand('copy')</code>) used whenever <code>navigator.clipboard</code> is missing or its write rejects, so the full summary still gets copied over plain HTTP.</li> <li>Mirrors the app change (<code>fix(timeline)</code>): same fallback added to <code>TimelineScreen.tsx</code>'s <code>handleShareLink</code>.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): Timeline Share clipboard fallback for HTTP (v284)</div> </div> </div> <!-- v283 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v283 — Done</span> <span class="tl-title">Project Timeline — new 🚨 Escalation event type</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-fix">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>timeline.html</strong> — added a 7th event type, <strong>🚨 Escalation</strong> (dark-red badge, distinct from the existing ⚠️ Risk), to the composer's TYPE dropdown, the feed's type filter, and <code>TYPE_STYLE</code>. For something that needs to be raised up the reporting chain now, not just flagged as a concern.</li> <li>Mirrors the app change (<code>feat(timeline)</code>): new <code>TimelineEventType.escalation</code> enum value (migration <code>20260701000000_add_timeline_escalation_type</code>), API validation, and the web composer/badge/help-docs updates.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Project Timeline Escalation event type (v283)</div> </div> </div> <!-- v282 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v282 — Done</span> <span class="tl-title">P&A Team Submission Status — labelled status pills instead of a bare icon</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">priorities</span> </div> <div class="tl-desc"> <ul> <li><strong>priorities/pl.html</strong> — the "Team Submission Status" sidebar (a manager's direct reports) showed each report's status as a bare <strong>⏳ / 📝 / ✅</strong> icon; it now renders the full labelled pill (<strong>⏳ Pending</strong> / <strong>📝 Draft</strong> / <strong>✅ Approved</strong>), matching the "My Contributors" pills right below and the React app.</li> <li>Mirrors the app change (<code>refactor(pa)</code>): the shared <code>paStatusChip</code> now drives every per-person P&A status surface as one detailed pill. review.html ("My Team" list + 2-level matrix) and history.html (member badges) already showed the labelled form, so this closes the last icon-only surface.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): P&A Team Submission Status labelled status pills (v282)</div> </div> </div> <!-- v281 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v281 — Done</span> <span class="tl-title">Project Timeline — per-event Share link + gist & the unified update-history trail</span> <span class="tl-date">1 Jul 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">timeline</span> </div> <div class="tl-desc"> <ul> <li>Each event card gains a <strong>🔗 Share</strong> button that copies a paste-ready two-line gist (type · summary · project / author · when) plus a <code>?event=</code> deep link — so a pasted share reads meaningfully in Teams/email, not just an opaque URL.</li> <li>The revisions-only "✎ Updated by" line is replaced by a chronological <strong>🕑 update history</strong> trail: the original post → each edit (with the superseded text) → each note, oldest-first, behind a "view update history" toggle. Summary reads "N updates · last by …".</li> <li>Mirrors the shipped React <code>TimelineScreen</code> (Share button + <code>eventTrail</code>); the app also exposes a public Open-Graph unfurl endpoint so messaging apps render a preview card (gist only for "everyone"-visibility events).</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): timeline per-event Share link + update-history trail (v281)</div> </div> </div> <!-- v280 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v280 — Done</span> <span class="tl-title">P&A — surface the "Draft" stage in Team Submission Status + the 2-level review matrix</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">priorities</span> </div> <div class="tl-desc"> <ul> <li>A PL who saved a draft showed as a <strong>📝 Draft · Preview</strong> row in the review queue but read as <strong>⬜ Not submitted</strong> in the Team Submission Status sidebar and the 2-level matrix — the stage was out of sync. Now a saved draft surfaces as its own <strong>📝 Draft</strong> chip (info-blue, distinct from amber Pending) across all three surfaces.</li> <li><strong>review.html</strong>: added a read-only draft preview row to the Pending Reviews queue (count now "2 awaiting your review · 1 draft in progress"); "My Team" sidebar + the "Your Team's P&A Status" matrix show a Draft chip where a report is mid-draft. <strong>priorities/pl.html</strong>: Team Submission Status shows the 📝 draft icon.</li> <li>Mirrors the app change: <code>GET /reportees-status</code> & <code>GET /reportees-overview</code> now report the draft row's own <code>draft</code> status (a draft row only ever exists draft-only, so it never masks a real submission); a draft still counts as not-yet-submitted in the matrix "this week" summary.</li> </ul> </div> <div class="tl-commit">💾 fix(pa): surface "Draft" stage in Team Submission Status + 2-level matrix (v280)</div> </div> </div> <!-- v279 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v279 — Done</span> <span class="tl-title">Scheduler cycles — final data-sync sweep (monthly cycle time + Paymentsense cycle conflict)</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">scheduler</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/admin.js scheduler cycles</strong>: the Monthly Cycle (SC-003, 2nd Friday) fired at <code>08:00</code> but the seed's Monthly Governance Cycle is <code>09:00</code> — corrected (and its nextRun). Removed P009 (Paymentsense) from the Weekly Cycle (SC-001): the seed assigns P009 only to the 1st & 3rd Friday Paymentsense cycle (SC-004), so it can't also be weekly.</li> <li>Final data cross-check vs <code>prisma/seed.ts</code> — all confirmed MATCHED (no change): 2 PODs (POD Basu/Ananth under the Cluster Head), the 14-project roster + SPOC/PL assignments (POD-Ananth projects correctly carry no PLs), the 24 reporting relationships, and the R-001…R-010 reminder→template links (ET-019/020/003/004/007/008/021/010/011/012).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): final scheduler-cycle data sync (monthly time + Paymentsense conflict) (v279)</div> </div> </div> <!-- v278 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v278 — Done</span> <span class="tl-title">Demo data — fix 5 member emails to match the seed + remove the retired P005 project references</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">demo data</span> </div> <div class="tl-desc"> <ul> <li>Five member email handles diverged from <code>prisma/seed.ts</code> (the canonical list the implementation login uses). Corrected across <strong>admin/admin.js</strong>, <strong>login.html</strong> (demo tiles + <code>DEMO_USERS</code> map) and <strong>projects.html</strong> (<code>E</code> map): Indurthi Hari Babu → <code>haribabu.indurthi@</code>, Sanjay Kumar → <code>kumar.sanjay@</code>, Karthikeyan → <code>karthikeyan@</code>, Dilip (PMO) → <code>dilip.chenchireddy@</code>, Gopal Krishna Tripathi → <code>gopalkrishna.t@</code>.</li> <li>Removed all dangling references to the retired <strong>P005</strong> project (Black Sun PLC was merged into P002 — see v-history) from the admin user project lists and the SC-002 scheduler cycle; the seed has projects P001–P004 + P006–P015 (no P005).</li> <li>Audited + confirmed already-synced (no change): admin reporting relationships (24, matching the seed chain) and the 14-project roster; the dashboard mockup is a static/illustrative single-state view.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): sync demo member emails with seed + drop retired P005 references (v278)</div> </div> </div> <!-- v277 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v277 — Done</span> <span class="tl-title">Admin Scheduler settings — correct the Stale Project Nudge recipient + timeline schedule wording</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-fix">accuracy</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/index.html — Timeline Notification Schedule</strong>: the "Stale Project Threshold" hint said it alerts the <em>Delivery SPOC</em>, but the implementation (R-012, <code>roles_json ["pl"]</code>) nudges the project's <strong>Project Lead(s)</strong> — corrected. Section description reworded to name the real reminders (Weekly Timeline Digest R-011 + Stale Project Timeline Nudge R-012) instead of the old "timeline activity digest and stale-project alert".</li> <li>Audit confirmed already-synced areas (no change needed): notification preferences (profile.html — all of emailUpsDowns/Priorities/Digest/Timeline + digest cadence/sections + snooze + per-project mute) and the Project Timeline screen (all 6 event types milestone/win/risk/blocker/decision/update + chain/everyone visibility).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): correct Stale Project Nudge recipient + timeline schedule wording in admin scheduler (v277)</div> </div> </div> <!-- v276 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v276 — Done</span> <span class="tl-title">Email Templates — add the "Project Timeline" category (tab + group + filter) to match implementation</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-feat">email templates</span> </div> <div class="tl-desc"> <ul> <li>The Admin → Email Templates mockup categorised templates as Ups & Downs / P&A / Invitations & Access only, while the implementation (AdminEmailTemplatesScreen) also has a <strong>Timeline</strong> category. Added a "📅 Project Timeline" category tab (admin/index.html), section group (admin.js <code>renderTemplates</code>), and edit-modal dropdown option, and recategorised the Project Timeline + timeline-reminder templates (ET-023/ET-024/ET-025/ET-027) from <code>workflow</code> to <code>timeline</code>. Now matches the impl taxonomy (ups-downs / pa / timeline / invitations / other).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): add Project Timeline email-template category to match implementation (v276)</div> </div> </div> <!-- v275 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v275 — Done</span> <span class="tl-title">Admin Scheduler + Email Templates — sync timeline reminders & templates with implementation</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">mockup sync</span> <span class="tag tag-feat">scheduler</span> <span class="tag tag-feat">email templates</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/admin.js — Scheduler reminders</strong>: replaced the fabricated timeline reminders (TL-001 "Timeline Weekly Activity Digest" / TL-002 "Stale Project Alert" ET-028 / TL-003 "Muted-Project Cleanup") with the actually-seeded ones (migration 20260629000002): <strong>R-011 "Weekly Timeline Digest"</strong> (ET-025, roles PL/PM/Delivery SPOC/POD Owner/Cluster Head) and <strong>R-012 "Stale Project Timeline Nudge"</strong> (ET-027, PL, 14-day threshold). Upcoming-runs + run-log timeline entries repointed to the real jobs <code>ET-025</code> (<code>30 2 * * 1</code>) and <code>ET-027</code> (<code>30 3 * * *</code>) with implementation-shaped <code>detail</code>.</li> <li><strong>admin/admin.js — Email Templates</strong>: added the five templates that exist in the implementation but were missing from the mockup list — <strong>ET-022</strong> (Cluster Head P&A digest), <strong>ET-023</strong>/<strong>ET-024</strong> (Project Timeline new/deleted event), <strong>ET-025</strong> (Weekly Timeline Submission Reminder), <strong>ET-027</strong> (Stale Project Timeline Nudge) — with subjects/bodies matching <code>seed.ts</code>, usage stats, and category mapping (ET-022 → pa; timeline templates → workflow).</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): sync admin scheduler timeline reminders + email templates with implementation (v275)</div> </div> </div> <!-- v274 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v274 — Done</span> <span class="tl-title">P&A team status — reporting hierarchy everywhere + click-to-open navigator</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">priorities</span> <span class="tag tag-feat">team status</span> <span class="tag tag-feat">navigator</span> <span class="tag tag-fix">mockup sync</span> </div> <div class="tl-desc"> <ul> <li><strong>priorities/pl.html</strong> — "Team Submission Status" now lists the submitter's <strong>direct reports</strong> (reporting hierarchy), not the old project cohort/self row (dropped the "→ … (you)" line). Each row is a link ("Your direct reports · click to review") with a role label + status icon; hidden when you have no reports.</li> <li><strong>priorities/review.html</strong> — the in-review sidebar "Team Submissions" is now <strong>"My Team"</strong>: the reviewer's own direct reports + their status for the week, each row linking to that report's review, with the report under review marked "→" and highlighted (replaces the submitter's project cohort).</li> <li><strong>priorities/review.html</strong> — added the review-landing <strong>"Your Team's P&A Status"</strong> tracker: a 2-level matrix (direct reports + their reports, level-2 indented "↳ … · reports to <manager>") across previous/current/next week; every status chip is a click-to-open navigator. Shown alongside the "you're all caught up" / review queue.</li> <li>Matches the implementation: new <code>GET /priorities/reportees-status</code> (1-level) + <code>GET /priorities/reportees-overview</code> (2-level), with <code>/team-status</code> now backing only the PAScreen "Submitting As" selector.</li> </ul> </div> <div class="tl-commit">💾 feat(web): P&A team status uses reporting hierarchy across PL + review screens; review-landing 2-level navigator (v274)</div> </div> </div> <!-- v273 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v273 — Done</span> <span class="tl-title">Notifications — theme-aware unread tint + HTML entity decoding in title/body</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">notifications</span> <span class="tag tag-feat">dark mode</span> <span class="tag tag-fix">rendering</span> </div> <div class="tl-desc"> <ul> <li><strong>notifications.html</strong>: unread item tint now uses <code>rgba(59,130,246,0.10)</code> in dark mode (<code>[data-theme="dark"] .notif-item.unread</code>) instead of the hard-coded light-blue <code>#f0f7ff</code> which was nearly invisible against dark backgrounds. Title, desc and time text switch to CSS variables (<code>var(--text)</code>, <code>var(--text-muted)</code>, <code>var(--text-faint)</code>) so they render correctly in both themes.</li> <li><strong>src/web NotificationsScreen + NotificationBell</strong>: added <code>plainText()</code> helper (exported from NotificationBell) — strips HTML tags and decodes HTML entities (<code>&mdash;</code>, <code>&#39;</code>, etc.) before rendering notification title and body preview. Unread tint migrated from hardcoded inline style to theme-aware <code>.notif-page-unread</code> CSS class.</li> </ul> </div> <div class="tl-commit">💾 fix(web): theme-aware notification unread tint + plainText entity decode in title/body (v273)</div> </div> </div> <!-- v272 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v272 — Done</span> <span class="tl-title">Login split-input, Profile timezone card, R-006 all-submitter reminders, Timeline header alignment, Admin Edit User timezone picker</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">login</span> <span class="tag tag-feat">profile</span> <span class="tag tag-feat">scheduler</span> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>login.html</strong>: email input split into username field + static <code>@valuelabs.com</code> suffix label; backend always appends the domain so other domains can't be entered. Demo scenario chips updated (wrong-domain removed, empty-submit added). Inactivity pre-fill strips domain before populating the username field.</li> <li><strong>profile.html</strong>: new <em>Timezone</em> card between Appearance and Email Notifications — IANA select (populated from <code>Intl.supportedValuesOf</code>), Detect browser timezone button, Save button (disabled until changed); mirrors <code>TimezoneSetting</code> component + <code>PATCH /users/me</code>.</li> <li><strong>admin/admin.js</strong> (R-006): trigger updated to <em>Mon–Wed 07/11/15/19 submitter-local (4×/day) until submitted</em>; audience broadened from PL-only to all P&A submitters (PL, PM, all SPOCs, POD Owner). ET-008 template body, trigger, and recipient updated accordingly. Scheduler upcoming/run log and stats aligned.</li> <li><strong>admin/index.html</strong>: Edit User modal now includes a Timezone IANA select (populated lazily on open, saved back to user record).</li> <li><strong>timeline.html</strong>: Project dropdown and Email toggle button grouped in a single <code>align-items:flex-end</code> flex row so the button sits beside the select rather than floating below the description.</li> </ul> </div> <div class="tl-commit">💾 mockup(v272): sync login split-input, profile timezone, R-006 all-submitter, timeline header, admin timezone picker</div> </div> </div> <!-- v271 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v271 — Done</span> <span class="tl-title">Email Log — redact single-use credentials (sign-in codes & invite tokens) from stored bodies</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">security</span> <span class="tag tag-feat">email</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/admin.js</strong> (Email Log): the sign-in (magic-link) sample now shows a redaction notice instead of the 6-digit code — reflecting that the system never stores single-use credentials in the log.</li> <li>Mirrors a security fix: <code>emailLogService</code> redacts magic-link bodies wholesale and blanks <code>token/otp/code</code> URL params (e.g. invitation activation links) before persisting, so the Email Log can't leak live credentials; the Resend action is hidden/blocked for those (they must be re-issued via the sign-in / invitation flow).</li> </ul> </div> <div class="tl-commit">💾 fix(security): redact single-use credentials from stored email bodies (v271)</div> </div> </div> <!-- v270 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v270 — Done</span> <span class="tl-title">Admin portal dark mode — dark theme for the AiDELoop base + tokenised admin components</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">dark-mode</span> <span class="tag tag-feat">theme</span> </div> <div class="tl-desc"> <ul> <li><strong>assets/css/style.css</strong>: the AiDELoop base (loaded by the admin portal) gained a <code>[data-theme="dark"]</code> block flipping the shared tokens (<code>--bg-body</code>, <code>--bg-card</code>, <code>--surface</code>, text, borders, shadows) plus the full <code>--tint-*</code> scale and <code>--surface-subtle</code>/<code>--warn-bg</code>/<code>--danger-bg</code> — so dark mode now reaches the admin pages, not just the 19 design-system pages.</li> <li><strong>admin/admin.css</strong>: tokenised the hardcoded-light component colours (cards, toolbars, tables, status pills, role badges, cycle badges, alerts) to <code>var(--token, #originalHex)</code> so they re-tone in dark; the white toggle knob was kept. Distinct-hue role badges keep their hues.</li> <li>No new toggle needed: admin/index.html already loads <code>assets/js/theme.js</code>, and the global Appearance toggle in <strong>profile.html</strong> persists the preference that theme.js applies on every page. Verified dark + light render headlessly.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): admin portal dark mode — AiDELoop base dark theme + tokenised admin.css (v270)</div> </div> </div> <!-- v269 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v269 — Done</span> <span class="tl-title">Dark-mode colour parity — port the web's semantic tint tokens into the design system</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">theme</span> <span class="tag tag-feat">dark-mode</span> <span class="tag tag-feat">tokens</span> </div> <div class="tl-desc"> <ul> <li><strong>assets/css/design-system.css</strong>: Added a semantic tint scale (<code>--tint-{info,success,warning,danger,neutral,purple}-{bg,bg-strong,border,fg,fg-strong}</code>) plus <code>--surface-subtle</code>, <code>--warn-bg</code>, <code>--danger-bg</code> and the muted text scale — defined for light in <code>:root</code> and re-toned for dark in <code>[data-theme="dark"]</code>, mirroring the React app's <code>src/web/src/styles/custom.css</code>.</li> <li>Tokenised the hardcoded-light component colours (alerts, status badges, Ups & Downs item highlights, stat cards, panels, inset rows) to <code>var(--token, #originalHex)</code> — the fallback keeps light mode pixel-identical while dark mode no longer traps theme-coloured text on a light fill. Distinct-hue role tags and toggle knobs deliberately left as-is.</li> <li>Mirrors the web change shipped earlier: theme-aware colour tokens for dark-mode contrast across the app.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): dark-mode colour parity — port web semantic tint tokens (v269)</div> </div> </div> <!-- v268 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v268 — Done</span> <span class="tl-title">Email Log — Resend a failed delivery (re-dispatch the stored email)</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">email</span> <span class="tag tag-feat">resend</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/admin.js</strong> (Email Log): failed-delivery rows now show a <strong>↻ Resend</strong> button in their expanded detail (next to the "Delivery failed" reason) that re-dispatches the stored email to the original recipient.</li> <li>Mirrors the implementation: <code>POST /admin/email-log/:id/resend</code> re-sends the EXACT stored subject + body via the sendEmail choke point (logged as a fresh attempt + audited as <code>email.resent</code>); <code>AdminEmailLogScreen</code> shows the Resend button on failed details and reloads.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Email Log resend-failed button (v268)</div> </div> </div> <!-- v267 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v267 — Done</span> <span class="tl-title">Email Log per-recipient drill-down — click a recipient to see all their emails</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">email</span> <span class="tag tag-feat">drill-down</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/index.html + admin.js</strong> (Email Log): the recipient in each row is now clickable — selecting one shows <strong>every email to that address</strong> with an "📧 Showing emails to <address> · Clear" banner above the table. <code>drillEmailRecipient()</code> / <code>clearEmailDrill()</code> filter the log client-side; Clear restores the full list.</li> <li>Mirrors the implementation: a <code>recipient</code> filter on <code>GET /admin/email-log</code> (contains-match so it still catches comma-separated to-lines) + the clickable recipient + drill banner in <code>AdminEmailLogScreen</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Email Log per-recipient drill-down (v267)</div> </div> </div> <!-- v266 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v266 — Done</span> <span class="tl-title">Email Log stat cards + retention setting (daily cleanup of old email records)</span> <span class="tl-date">30 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">email</span> <span class="tag tag-feat">retention</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/index.html</strong> (Scheduler → Global Settings): new <strong>Email Log Retention (days)</strong> field (default 90; 0 = keep forever) controlling how long sent-email records are kept before a daily cleanup job purges older rows. Bounds the growth of the email-log table (each row stores the full rendered body).</li> <li><strong>admin/admin.js</strong>: <code>schedulerSettings.emailLogRetentionDays</code> added to state. (The Email Log section's stat cards — Total / Delivered / Failed / Sent Today — were already in v265.)</li> <li>Mirrors the implementation shipped this session: <code>GET /admin/email-log/summary</code> + stat cards, the <code>email_log_cleanup</code> scheduler job, and the <code>emailLogRetentionDays</code> SchedulerSettings column.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Email Log retention setting + stat-cards parity (v266)</div> </div> </div> <!-- v265 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v265 — Done</span> <span class="tl-title">Admin Email Log — report of every email the system sent, with filters & body preview</span> <span class="tl-date">29 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">email</span> <span class="tag tag-feat">report</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/index.html</strong>: New <strong>✉️ Email Log</strong> section (top section-nav + sidebar under Reporting) — a dedicated report of every email POD Governance dispatched: recipient name + address, subject, type, template, delivery status and timestamp. Stat cards (total / delivered / failed / sent today), filters (search, status, type, template, date), and per-row <code>▼ View</code> expanding the FINAL rendered message body. Failed rows surface the SMTP error.</li> <li><strong>admin/admin.js</strong>: <code>adminState.emailLog</code> sample data across all kinds (notification, invitation, sign-in link, weekly digest, scheduled report, test send, plus a failed delivery); <code>renderEmailLog()</code> with client-side filtering, <code>toggleEmailBody()</code> body preview, <code>clearEmailLogFilters()</code>; wired into <code>navigateTo('email-log')</code>.</li> <li>Mirrors the implementation shipped this session: <code>EmailLog</code> model captured at the <code>sendEmail</code> SMTP choke point + <code>GET /admin/email-log</code> report and <code>AdminEmailLogScreen</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): admin Email Log report — recipient, body preview, filters (v265)</div> </div> </div> <!-- v264 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v264 — Done</span> <span class="tl-title">Role full-forms: expand abbreviated PL / PM in approval chains, status tables & charts</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">consistency</span> <span class="tag tag-feat">roles</span> </div> <div class="tl-desc"> <ul> <li><strong>dashboard.html</strong> & <strong>admin/index.html</strong>: Ups & Downs / Priorities approval-chain renderings now spell out <code>Project Lead</code> and <code>Project Manager</code> instead of <code>PL</code> / <code>PM</code>, matching the full-form labels (Delivery SPOC, Sales SPOC, POD Owner, Cluster Head) already used in the same chains.</li> <li><strong>workflow/pmo.html</strong>, <strong>workflow/cluster-head.html</strong>, <strong>cycle-detail.html</strong>: "Full Approval Chain Status" / approval-history tables now show <code>Project Lead Team</code> and <code>Project Manager</code> level badges.</li> <li><strong>reports.html</strong>: Return-rate-by-stage table and SVG bar chart axis use <code>Project Manager</code>; <strong>workflow/pm.html</strong> note byline reads "Added by Project Manager".</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): role full-forms — expand PL/PM across chains, tables & charts (v264)</div> </div> </div> <!-- v263 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v263</span> <span class="tl-title">Industry UX gaps XI: PMO skeleton loaders, disabled-button tooltip, mark-all-read undo-bar</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">skeleton</span> <span class="tag tag-feat">a11y</span> <span class="tag tag-feat">undo</span> </div> <div class="tl-desc"> <ul> <li><strong>workflow/pmo.html</strong>: Skeleton loaders pre-populated in <code>#ups-list</code> and <code>#downs-list</code>; <code>DOMContentLoaded</code> handler delayed 800 ms so skeletons are visible before real items render, signalling async data fetch to the user.</li> <li><strong>priorities/cluster-head.html</strong>: "Awaiting submission" plain text replaced with a <code>disabled</code> button with <code>title</code> tooltip — "Cannot acknowledge — waiting for team member to submit their Priorities & Achievements" — surfacing the blocked reason on hover without expanding the card.</li> <li><strong>notifications.html</strong>: "Mark all read" now calls <code>markAllRead()</code> — counts unread items, marks them visually (removes dot, updates per-item buttons), shows 5-second undo-bar with count ("3 notifications marked as read · Undo"); undo fully restores all previous read/unread states.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps XI — PMO skeletons, disabled tooltip, mark-all-read undo (v263)</div> </div> </div> <!-- v262 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v262 — Done</span> <span class="tl-title">Industry UX gaps X: Ctrl+Enter hints on 4 review screens, Print button on Reports</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">keyboard</span> <span class="tag tag-feat">workflow</span> <span class="tag tag-feat">reports</span> </div> <div class="tl-desc"> <ul> <li><strong>workflow/spoc.html, pod.html, cluster-head.html, priorities/review.html</strong>: Ctrl+Enter keyboard shortcut wired to each page's primary approve action; "(Ctrl+Enter to submit)" hint displayed right-aligned below the char counter, matching the pattern from workflow/pl.html.</li> <li><strong>reports.html</strong>: "🖨 Print" button added next to Export All in the header; calls <code>window.print()</code> after a brief toast so the browser print/save-as-PDF dialog opens — common enterprise pattern for distributing KPI dashboards.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps X — ctrl+enter review hints + reports print button (v262)</div> </div> </div> <!-- v261 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v261 — Done</span> <span class="tl-title">Industry UX gaps IX: post-approval Add Note, Ctrl+Enter hint, Copy Link, admin section quick-jump nav</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">cycle-detail</span> <span class="tag tag-feat">workflow</span> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">ux</span> </div> <div class="tl-desc"> <ul> <li><strong>cycle-detail.html</strong>: "📝 Add Note" button in approved banner toggles an inline post-approval note form; <code>submitPostNote()</code> appends the note to the live audit trail with timestamp and author.</li> <li><strong>workflow/pl.html</strong>: Ctrl+Enter keyboard shortcut wired to <code>submitPL()</code> on the Note to PM textarea; visible "(Ctrl+Enter to submit)" hint displayed right-aligned below the char counter.</li> <li><strong>workflow/pm.html</strong>: "🔗 Copy link" button added to the cycle header; copies <code>window.location.href</code> to clipboard via <code>navigator.clipboard</code> with toast confirmation.</li> <li><strong>admin/index.html</strong>: Sticky horizontal section quick-jump nav bar at the top of main-content; 11 pill buttons cover all admin sections (Projects→Audit Log); active tab highlighted in brand blue via <code>navigateTo()</code>'s existing <code>.nav-item.active</code> toggle.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps IX — add-note, ctrl+enter, copy-link, admin section nav (v261)</div> </div> </div> <!-- v260 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v260 — Done</span> <span class="tl-title">Industry UX gaps VIII: admin automation-disabled warning banner wired to global toggle</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">admin</span> <span class="tag tag-feat">system-state</span> <span class="tag tag-feat">banner</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/index.html</strong>: Persistent red <code>#automation-disabled-banner</code> added above Scheduler tabs; shown when "Disable All Automation" toggle is checked, hidden when unchecked. Warns that all cycle creation and email triggers are paused.</li> <li><strong>admin/admin.js</strong>: <code>toggleAutomationDisabled(disabled)</code> shows/hides the banner and fires a warning/success toast for immediate feedback.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps VIII — automation-disabled system-state banner (v260)</div> </div> </div> <!-- v259 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v259</span> <span class="tl-title">Industry UX gaps VII: approval chain turnaround times, P&A unsaved-changes guard + submit loading state</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">cycle-time</span> <span class="tag tag-feat">dirty-guard</span> <span class="tag tag-feat">loading-state</span> </div> <div class="tl-desc"> <ul> <li><strong>cycle-detail.html</strong>: Approval chain table gains a "⏱ Cycle Time" column showing turnaround time between each review stage (24h 41m, 3h 46m, 19h 25m, 2h 22m); Cluster Head row flagged amber "8d 0h ⚠" as a bottleneck indicator.</li> <li><strong>priorities/pl.html</strong>: <code>_isDirty</code> flag + document-level input listener + <code>window.onbeforeunload</code> guard warns before navigating away with unsaved edits; <code>saveDraft()</code> and <code>wfApprove()</code> both reset the flag on success.</li> <li><strong>priorities/pl.html</strong>: Submit button passes <code>this</code> to <code>wfApprove()</code>; button disables + shows "⏳ Submitting…" during the async mock, re-enables after 2.5 s to prevent double-submit. Added <code>title="Ctrl+Enter to submit"</code> tooltip.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps VII — approval turnaround times, dirty guard, submit loading state (v259)</div> </div> </div> <!-- v258 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v258</span> <span class="tl-title">Industry UX gaps VI: 6 remaining admin confirm() → undo-bar, date-range From/To labels in admin scheduler + exports</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">undo-bar</span> <span class="tag tag-feat">a11y</span> <span class="tag tag-feat">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/admin.js</strong>: 6 remaining <code>confirm()</code> calls replaced with <code>showUndoBar()</code> — <code>revokeInvitation</code> (restores status), <code>deleteScheduledReport</code>, <code>deleteCycle</code> (snapshot restore), <code>archiveCycle</code> (status restore), <code>deleteRelationship</code> (snapshot restore), <code>revokeToken</code> (status restore). All destructive actions in the entire mockup now use undo-bar.</li> <li><strong>admin/index.html</strong>: Scheduler Run History filter and On-Demand Exports date-range inputs wrapped with visible "From" / "to" / "To" text labels; <code>aria-label</code> retained for screen-reader parity.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps VI — admin confirm()→undo-bar, date-range labels (v258)</div> </div> </div> <!-- v257 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v257</span> <span class="tl-title">Industry UX gaps V: review-comment required/optional hint on 4 workflow pages, cycle phase indicator on project cards</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ux-hint</span> <span class="tag tag-feat">phase-indicator</span> <span class="tag tag-feat">workflow</span> </div> <div class="tl-desc"> <ul> <li><strong>workflow/pm.html, spoc.html, pod.html, cluster-head.html</strong>: Review Comment card header now shows "Optional when approving — required when returning" hint text (right-aligned in card-header), clarifying when the comment field must be filled.</li> <li><strong>projects.html</strong>: <code>renderCard()</code> now shows a colour-coded cycle-phase hint next to the cycle ID — "Submission open" (green), "Opens soon" (muted), "Cycle complete" (blue) — so users know the action state without clicking through. Returns badge moved below cycle row to avoid layout clash.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps V — review-comment hint, project card cycle-phase indicator (v257)</div> </div> </div> <!-- v256 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v256</span> <span class="tl-title">Industry UX gaps IV: confirm() → undo-bar on all 17 pages, draft auto-save timestamp on P&A PL, cycle-history proper empty-state card, timeline delete undo</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">undo-bar</span> <span class="tag tag-feat">auto-save</span> <span class="tag tag-feat">empty-state</span> <span class="tag tag-feat">no-confirm</span> </div> <div class="tl-desc"> <ul> <li><strong>17 HTML files</strong>: <code>revokeMyToken()</code> <code>confirm()</code> replaced with inline undo-bar snackbar (5 s grace + Undo link restores token to active); <code>_revokeUndoFn</code> global pattern mirrors admin undo-bar.</li> <li><strong>timeline.html</strong>: <code>deleteEvent()</code> <code>confirm()</code> replaced with same undo-bar pattern; note text clarifies linked drafts not removed.</li> <li><strong>priorities/pl.html</strong>: "Save as Draft" now calls <code>saveDraft()</code> which shows a "Last saved HH:MM" timestamp label (left-aligned in action-bar) alongside the success toast.</li> <li><strong>cycle-history.html</strong>: Filter empty-state upgraded from inline <code><tr><td></code> to a proper <code>.no-results</code> card with icon, message, and "Clear filters" button; table hidden when empty.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps IV — undo-bar confirm replacement, draft auto-save, empty-state parity (v256)</div> </div> </div> <!-- v255 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v255</span> <span class="tl-title">Industry UX gaps III: clickable dashboard stat cards, file-upload type hints + dragover, PAT expiry banner, filter-empty vs no-data empty states, timeline clear-filters CTA</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">drill-down</span> <span class="tag tag-feat">file-upload</span> <span class="tag tag-feat">expiry-banner</span> <span class="tag tag-feat">empty-state</span> </div> <div class="tl-desc"> <ul> <li><strong>dashboard.html</strong>: 4 quick-stat cards are now clickable links — Total Cycles & Active Cycles → cycle-history.html, Approved YTD → reports.html, P&A Completion → priorities/history.html; hover shadow feedback.</li> <li><strong>workflow/pl.html</strong>: File-upload zone shows accepted-types hint ("PNG, PDF, DOCX, XLSX — max 5 files · 10 MB each") and wires <code>dragover</code>/<code>dragleave</code>/<code>drop</code> events to the <code>.dragover</code> CSS class already in design-system.css.</li> <li><strong>profile.html</strong>: Page-level amber warning banner appears above the tokens table when any active token expires within 14 days; names each expiring token with days remaining; links to Generate Token modal.</li> <li><strong>priorities/cluster-head.html</strong>: Member-filter empty state with clear-filters button when no members match.</li> <li><strong>timeline.html</strong>: Differentiates filter-empty (🔍 no-match + Clear filters CTA) from genuine no-events state; <code>clearTlFilters()</code> resets all three filter axes.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps III — stat drill-downs, file-upload hints, PAT expiry banner, empty-state parity (v255)</div> </div> </div> <!-- v254 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v254</span> <span class="tl-title">Industry UX gaps II: admin pagination (10/page), undo-bar for deletes, char counters on all comment fields, aria-sort on reports table headers</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">pagination</span> <span class="tag tag-feat">undo-bar</span> <span class="tag tag-feat">char-count</span> <span class="tag tag-feat">a11y</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/admin.js + index.html</strong>: Client-side pagination (10 per page) on Projects, PODs, and Users tables; page resets to 1 on filter change; pager controls show current range.</li> <li><strong>admin/admin.js</strong>: <code>showUndoBar()</code> replaces <code>confirm()</code>+immediate delete for projects, PODs, and users — 5-second grace period with one-click restore.</li> <li><strong>admin/admin.css</strong>: <code>.pager</code> / <code>.pager-btn</code> / <code>.pager-info</code> styles added.</li> <li><strong>workflow/pl.html, pm.html, spoc.html, pod.html, cluster-head.html</strong>: <code>updateCharCount()</code> + <code>.char-count</code> div on every comment textarea (0 / 500 live counter, warns at 80%, red at limit).</li> <li><strong>priorities/pl.html, review.html</strong>: Same char-counter treatment on P&A comment and reviewer-feedback textareas.</li> <li><strong>reports.html</strong>: <code>sortTable()</code> now sets <code>aria-sort="none"</code> on non-sorted headers (was removing the attribute); remaining sortable headers given initial <code>aria-sort="none"</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps II — admin pagination, undo-bar, char-counters, aria-sort (v254)</div> </div> </div> <!-- v253 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v253</span> <span class="tl-title">Industry UX gaps: skeleton CSS, sort indicators, no-results state, empty states, inline validation, undo bar — 5 pages + design-system.css</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">ux</span> <span class="tag tag-feat">empty-state</span> <span class="tag tag-feat">validation</span> <span class="tag tag-feat">sort</span> </div> <div class="tl-desc"> <ul> <li><strong>design-system.css</strong>: Added skeleton shimmer loader (<code>.skeleton</code>, <code>@keyframes skeleton-shimmer</code>), sortable column headers (<code>.th-sortable</code>, <code>.sort-icon</code>), enhanced empty/no-results states, inline field validation (<code>.field-error</code>, <code>.char-count</code>, <code>.form-control.invalid</code>), and undo snackbar (<code>.undo-bar</code>).</li> <li><strong>notifications.html</strong>: <code>applyFilters()</code> now shows a "No notifications match your filters" empty state with a Clear filters CTA when all items are hidden.</li> <li><strong>reports.html</strong>: All 5 comparison tables have sortable column headers with ascending/descending <code>aria-sort</code> indicators; <code>sortTable()</code> function handles numeric and string comparisons.</li> <li><strong>workflow/pl.html</strong>: <code>renderUdItems()</code> renders a contextual no-results state when the ups or downs list is empty instead of a blank card body.</li> <li><strong>priorities/pl.html</strong>: AiDE, general priority, and achievement inputs show inline <code>.field-error</code> feedback on empty submit; live character count (<code>updateCharCount</code>) appears as user types; max-3 achievement guard added.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): industry UX gaps — skeleton, sort, empty-states, inline validation (v253)</div> </div> </div> <!-- v252 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v252 — Done</span> <span class="tl-title">Nav/topbar parity pass: apostrophe JS fix, logo subtitle, icon labels, admin order, topbar icon buttons — all 23 pages</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">nav</span> <span class="tag tag-fix">topbar</span> <span class="tag tag-fix">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>Critical JS fix</strong>: raw apostrophe in <code>What's New</code> inside a single-quoted JS string caused a SyntaxError that silently broke the entire nav injection block on all 21 Variant A pages. Fixed to <code>What's New</code>.</li> <li><strong>Logo subtitle</strong>: "Ups & Downs Workflow" → "ValueLabs Internal Platform" (matches AppShell.tsx).</li> <li><strong>Ups & Downs icon</strong>: 📈📉 → 📈 (single icon, matches implementation).</li> <li><strong>My P&A label/icon</strong>: <code>🎯 My P&A</code> → <code>📝 My Priorities & Achievements</code>.</li> <li><strong>P&A History label/icon</strong>: <code>📜 P&A History</code> → <code>🗂️ Priorities & Achievements History</code>.</li> <li><strong>Admin sidebar order</strong>: Org Hierarchy moved from Management → Settings; Reporting section now appears before AI Integration.</li> <li><strong>Topbar icon buttons</strong>: Help ❓ / Search 🔍 / Notifications 🔔 icon buttons added; 🔑 Profile text replaced by avatar circle; 🚪 Sign Out text replaced by SVG logout icon.</li> <li><strong>timeline.html + status.html</strong>: Admin block expanded to full 5-section standard; status.html loggedIn conditional topbar replaced with standard topbar.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): nav/topbar parity — apostrophe JS fix + icon/label/admin/topbar alignment (v252)</div> </div> </div> <!-- v251 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v251</span> <span class="tl-title">Admin portal sidebar sections added to help / notifications / whats-new pages</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">nav</span> <span class="tag tag-fix">rbac</span> </div> <div class="tl-desc"> <ul> <li><strong>help.html, notifications.html, whats-new.html</strong>: these three pages had <code>showAdminLinks</code> defined but never used — admin portal sidebar sections (Management, Automation, Settings, AI Integration, Reporting) were missing. Added conditional <code>(showAdminLinks ? ... : '')</code> block, matching the pattern in all other pages. Admin and PMO Associate now see the full admin nav on every authenticated page.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): admin portal sidebar on help/notifications/whats-new (v251)</div> </div> </div> <!-- v250 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v250</span> <span class="tl-title">Role-aware sidebar nav — fix visibility, P&A routing, Reports, admin access</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">ux</span> <span class="tag tag-fix">nav</span> <span class="tag tag-fix">rbac</span> </div> <div class="tl-desc"> <ul> <li><strong>All 21 pages</strong>: sidebar nav now matches <code>AppShell.tsx</code> role constants exactly — Ups & Downs hidden for admin/projectContributor; Project Timeline hidden for admin/projectContributor; Cycle History hidden for projectContributor; Reports shown only for pmoAssociate/deliverySpoc/podOwner/clusterHead; P&A History link added for all workflow roles + PMO; admin portal links shown for pmoAssociate too (was admin-only).</li> <li><strong>P&A routing fixed</strong>: pm/esoSpoc/recruitmentSpoc/projectContributor now go to <code>priorities/pl.html</code> (submit) instead of review; salesSpoc gets a "My P&A" secondary link; admin/pmoAssociate have no current P&A link.</li> <li><strong>Dashboard module picker</strong>: P&A card and button route correctly per role; hidden for admin/pmoAssociate.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): role-aware sidebar nav across all pages (v250)</div> </div> </div> <!-- v249 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v249</span> <span class="tl-title">MCP tool count 33 → 34 (get_cycle_digest tool added to server)</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">w→m</span> <span class="tag tag-new">mcp</span> </div> <div class="tl-desc"> <ul> <li><strong>profile.html + mcp-guide.html</strong>: updated tool count references 33 → 34 to reflect new <code>get_cycle_digest</code> MCP tool added in <code>feat(mcp): get_cycle_digest tool</code> (Jun 27 2026). All four "33 tools" occurrences replaced.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): bump MCP tool count 33→34 (v249)</div> </div> </div> <!-- v248 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v248</span> <span class="tl-title">Notification bell: snooze-aware — 🔕 icon + paused note when email notifications are snoozed</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">notifications</span> <span class="tag tag-fix">w→m</span> </div> <div class="tl-desc"> <ul> <li><strong>assets/js/notif-bell.js</strong>: snooze-aware bell — reads <code>window.pgNotifSnooze</code> (ISO date); when active, bell shows 🔕 (no unread badge), <code>title</code> shows snooze label, and the dropdown panel gains a "🔕 Email notifications paused until … — manage in Profile" note below the header. Mirrors <code>NotificationBell.tsx</code> snoozedUntil / isSnoozeActive / snoozeLabel logic.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): snooze-aware notification bell — muted icon + paused note (v248)</div> </div> </div> <!-- v247 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v247</span> <span class="tl-title">Update Digest modal: Changes-only toggle + Copy to clipboard; Update Digest on cycle-detail page</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">workflow</span> <span class="tag tag-new">cycle-detail</span> <span class="tag tag-fix">w→m</span> </div> <div class="tl-desc"> <ul> <li><strong>assets/js/digest-modal.js</strong> (new shared file): full <code>CycleDigestModal</code> implementation — overlay modal with formatted digest text, <em>Changes only</em> checkbox toggle (swaps full vs. changes-only content), <em>Copy to clipboard</em> button with ✓ feedback. <code>showDigestModal()</code> / <code>hideDigestModal()</code> globals.</li> <li><strong>workflow/pmo.html, spoc.html, pod.html, cluster-head.html</strong>: Update Digest button <code>onclick</code> changed from <code>showToast(…)</code> to <code>showDigestModal()</code>; <code>digest-modal.js</code> script tag added.</li> <li><strong>cycle-detail.html</strong>: <em>📋 Update Digest</em> button added to header action bar (mirrors historical cycle digest in <code>CycleDetailScreen.tsx</code>); <code>digest-modal.js</code> script tag added.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): Update Digest modal with changes-only toggle + clipboard; cycle-detail digest button (v247)</div> </div> </div> <!-- v246 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v246</span> <span class="tl-title">Dashboard: clickable Recent Activity rows; Timeline: results count; Projects: results count footer</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">dashboard</span> <span class="tag tag-new">timeline</span> <span class="tag tag-new">projects</span> <span class="tag tag-fix">w→m</span> </div> <div class="tl-desc"> <ul> <li><strong>dashboard.html</strong>: Recent Activity table rows are now clickable (<code>onclick</code> + <code>cursor:pointer</code> + hover highlight) — navigates to cycle-detail.html; mirrors <code>DashboardScreen.tsx</code> row-click behaviour.</li> <li><strong>timeline.html</strong>: results count line (<em>N events</em>, or <em>N events (filtered from M)</em> when a filter is active) appears above the feed; powered by <code>renderFeed()</code> setting <code>tl-results-count</code>.</li> <li><strong>projects.html</strong>: <em>N of M projects</em> count line between filter bar and cards grid; <code>filterProjects()</code> sets <code>proj-results-count</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): dashboard clickable rows, timeline + projects results counts (v246)</div> </div> </div> <!-- v245 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v245</span> <span class="tl-title">Admin portal: results-count footer on Projects, PODs, Users, Reporting Relationships tables; Cluster Head: cumulative review-impact badges</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">admin</span> <span class="tag tag-new">workflow</span> <span class="tag tag-fix">w→m</span> </div> <div class="tl-desc"> <ul> <li><strong>admin/index.html + admin.js</strong>: <em>Showing N of M</em> results-count footer beneath each of the four admin tables (Projects, PODs, Users, Reporting Relationships); <code>renderProjects()</code>, <code>renderPods()</code>, <code>renderUsers()</code>, <code>renderReportingRelationships()</code> each set the new footer div.</li> <li><strong>workflow/cluster-head.html</strong>: cumulative review-impact badges (<em>➕ X added ✏️ Y modified across all reviewers</em>) between the info banner and the page layout — mirrors <code>ClusterHeadScreen.tsx</code> pod-changes-summary.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): admin results-count footers + cluster-head cumulative impact badges (v245)</div> </div> </div> <!-- v244 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v244</span> <span class="tl-title">Notifications page: per-row mark-read/unread + Clear filters + count; Cycle History: CSV export + results count; Profile: PAT expiring-soon badge + per-project timeline mute</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">notifications</span> <span class="tag tag-new">cycle-history</span> <span class="tag tag-new">profile</span> <span class="tag tag-fix">w→m</span> </div> <div class="tl-desc"> <ul> <li><strong>notifications.html</strong>: per-row <em>Mark read / Mark unread</em> button; <em>Clear filters</em> link (appears when category ≠ All or Unread-only is on); results count <em>N of M · K unread</em> updates live. JS: <code>applyFilters()</code>, <code>clearFilters()</code>, <code>toggleRead()</code>.</li> <li><strong>cycle-history.html</strong>: <em>⬇ Export CSV</em> button in card header toolbar; <em>Showing N of M cycles</em> count footer below table.</li> <li><strong>profile.html</strong>: PAT token table — <em>⚠ Expiring soon</em> amber badge on active tokens expiring within 14 days (mirrors admin MCP tokens v243). Project Timeline card — per-project mute table (toggle per project while keeping global emails on); <code>renderTlMuteTable()</code> + <code>toggleProjectMute()</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): notifications mark-read/clear-filters, cycle-history CSV export, profile PAT expiry badge + per-project timeline mute (v244)</div> </div> </div> <!-- v243 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v243</span> <span class="tl-title">Admin portal gaps: scheduler trigger/date filter + pagination, MCP token search/filter + expiring-soon badge, MCP log slow-call badge + status filter fix</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">scheduler</span> <span class="tag tag-new">mcp-tokens</span> <span class="tag tag-new">mcp-log</span> <span class="tag tag-fix">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>Scheduler Run History</strong>: added trigger (cron/manual) and date-range filters; load-more pagination (20/page); Export CSV button moved to card header.</li> <li><strong>MCP Issued Tokens</strong>: search by name/owner, filter by status (active/revoked/expired) and scope (read/write); <em>Expiring soon</em> amber badge for tokens expiring within 14 days; Export CSV; Clear filters.</li> <li><strong>MCP Interactions log</strong>: quick-search bar (identity, tool, endpoint); visible-count label; status filter fixed to <code>2xx/4xx/5xx</code> (was ok/denied/error); slow-call ⚠ badge on duration ≥ 1000 ms.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): admin portal gaps — scheduler filters/pagination, MCP token filter + expiry badge, MCP log search + slow-call badge (v243)</div> </div> </div> <!-- v242 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v242</span> <span class="tl-title">Fix sidebar Account section order + add Notifications and MCP Setup Guide on all 21 pages</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">sidebar</span> <span class="tag tag-new">notifications</span> <span class="tag tag-new">mcp-guide</span> </div> <div class="tl-desc"> <ul> <li><strong>All 21 sidebar pages updated<\strong>: Account section now has 5 items in correct order matching <code>AppShell.tsx</code>: 🔔 Notifications → ✨ What’s New → 👤 My Profile → ❓ Help → 🔌 MCP Setup Guide. Previously had 3 items in wrong order (What’s New, Help, My Profile).</li> <li><strong>18 standard pages<\strong> (dashboard, projects, reports, timeline, cycle-detail/history, profile, status, 6 workflow, 4 priorities): batch-updated via Python to add Notifications + MCP Setup Guide links.</li> <li><strong>3 HTML-entity pages individually updated<\strong>: <code>whats-new.html</code>, <code>help.html</code>, <code>notifications.html</code> — each uses HTML hex entities for emoji; order fixed and MCP Setup Guide added.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): fix sidebar Account order + add Notifications & MCP Setup Guide on all pages (v242)</div> </div> </div> <!-- v241 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v241</span> <span class="tl-title">Add What’s New + Help pages; sidebar links on all 19 pages; fix notifications.html shell.js gap</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">whats-new</span> <span class="tag tag-new">help</span> <span class="tag tag-fix">sidebar</span> <span class="tag tag-fix">notifications</span> </div> <div class="tl-desc"> <ul> <li><strong>whats-new.html (new)</strong>: mirrors <code>WhatsNewScreen.tsx</code> — 8 release-note cards newest-first, matching all entries from <code>whatsNew.ts</code>.</li> <li><strong>help.html (new)</strong>: mirrors <code>HelpScreen.tsx</code> — 2-column sticky-nav layout, 9 topics (Getting Started, Ups & Downs, P&A, Timeline, Reports, Audit Log, MCP Integration, Profile & Tokens, Admin Portal), URL-hash deep-linking.</li> <li><strong>All 19 sidebar pages updated</strong>: Account section now includes ✨ What’s New and ❓ Help links before 👤 My Profile. Batch-applied via Python to preserve UTF-8 emoji.</li> <li><strong>notifications.html fixed</strong>: migrated from missing <code>assets/js/shell.js</code> reference to full inline sidebar JS, matching the pattern of all other pages. Also adds Notifications self-link to the Account section.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): add What’s New + Help pages, sidebar links on all pages (v241)</div> </div> </div> <!-- v240 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v240</span> <span class="tl-title">Gap checklist complete — R-04 AiDE donut view, R-05/W-06 confirmed; 50/50 items resolved</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">reports</span> <span class="tag tag-fix">audit</span> <span class="tag tag-new">donut-chart</span> </div> <div class="tl-desc"> <ul> <li><strong>reports.html — AiDE donut chart (R-04)</strong>: added 🍩 Donut toggle button to AiDE Adoption card; table view wrapped in <code>rv-t-aide</code>, new donut chart SVG in <code>rv-c-aide</code> — mirrors web <code>AideDonut</code> component (proportion ring, 100% centre text, legend). Uses existing <code>toggleReportView()</code> function.</li> <li><strong>R-05 confirmed already present</strong>: return-rate horizontal bar chart in <code>rv-c-return</code> was already there, toggled by 📊 Chart button.</li> <li><strong>W-06 closed by design</strong>: <code>spoc.html</code> handles both Delivery SPOC and Sales SPOC via JS <code>roleKey</code> check — no separate page needed.</li> <li><strong>Gap checklist: 50/50 items resolved</strong> — all gaps either implemented (across v235–v240) or confirmed already present. Mockup is fully in sync with web implementation.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): R-04 AiDE donut chart, gap checklist 50/50 complete (v240)</div> </div> </div> <!-- v239 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v239</span> <span class="tl-title">Gap batch — PA-01 rich-text toolbar on pl.html, D-04 role-personalised P&A card, checklist audit (P-01–05, AO-01/02 confirmed present)</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">pa-editor</span> <span class="tag tag-new">dashboard</span> <span class="tag tag-fix">audit</span> </div> <div class="tl-desc"> <ul> <li><strong>priorities/pl.html — Rich-text toolbar (PA-01)</strong>: added <code>.rt-toolbar</code> (B/I/U/bullet) above each of the three entry inputs (AiDE priority, regular priority, achievement); CSS added in page <code><style></code> block matching <code>timeline.html</code> rt-toolbar pattern.</li> <li><strong>dashboard.html — Role-personalised P&A card (D-04)</strong>: JS now updates <code>#module-pa-title</code>, <code>#module-pa-desc</code>, <code>#module-pa-tag</code>, <code>#module-pa-info</code>, and button text based on role — Cluster Head sees Executive Digest copy, reviewers see Review copy, PL/contributor keep Submit copy — matches web <code>DashboardScreen.tsx</code> <code>paCardTitle/paCardDesc</code>.</li> <li><strong>P-01 to P-05 confirmed already present</strong>: <code>NotificationPreferences.tsx</code> fully implements digest frequency (P-01), include/exclude checkboxes (P-02), snooze controls (P-03), preview button (P-04), test send (P-05).</li> <li><strong>AO-01/AO-02 confirmed already present</strong>: <code>AdminOrgHierarchyScreen.tsx</code> has per-node expand/collapse (▶/▼) and search match count; mockup also has <code>org-tree-match-count</code> span.</li> <li><strong>Checklist</strong>: 44/50 items complete; remaining open: R-04, R-05, W-06 (all 🟢 low priority).</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): PA-01 rt-toolbar on pl.html, D-04 role copy on dashboard, checklist audit (v239)</div> </div> </div> <!-- v238 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v238</span> <span class="tl-title">Gap checklist batch — P-08 Appearance reorder, TL-01 rich-text toolbar, TL-02 upload area, TL-03/AE-01/AE-02 confirmed present</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">profile</span> <span class="tag tag-new">timeline</span> <span class="tag tag-fix">rich-text</span> <span class="tag tag-fix">upload</span> </div> <div class="tl-desc"> <ul> <li><strong>profile.html — Appearance section reorder (P-08)</strong>: moved 🎨 Appearance card to appear immediately after Account Details and before Email Notifications, matching the web ProfileScreen section order.</li> <li><strong>timeline.html — Rich-text formatting toolbar (TL-01)</strong>: added <code>.rt-toolbar</code> row (B / I / U / bullet list / numbered list / clear) above the event textarea in the composer, mirroring web <code>RichTextEditor</code> toolbar.</li> <li><strong>timeline.html — File upload area (TL-02)</strong>: added <code>.upload-area</code> drag-and-drop panel below the capture chips, before the Post button — matches web attachment support.</li> <li><strong>TL-03 / AE-01 / AE-02 confirmed already present</strong>: audience tooltip (<code>seenTag title</code>), email template category tabs (<code>tmpl-tabbar</code>), and usage stats strip (<code>tmpl-usage-strip</code>) were all already implemented.</li> <li><strong>Checklist</strong>: marked P-06, R-02, R-03, PH-01, PH-02, TL-03, AE-01, AE-02 as already-present; P-08, TL-01, TL-02 as v238 done (37/50 complete).</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): P-08 Appearance reorder, TL-01/02 rich-text + upload, checklist audit (v238)</div> </div> </div> <!-- v237 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v237</span> <span class="tl-title">Gap checklist batch — Help buttons (6 pages), cluster-head CE-01/02/03, PA-04 progress ring, W-03 downstream changes cards</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">help-buttons</span> <span class="tag tag-new">cluster-head</span> <span class="tag tag-new">progress-ring</span> <span class="tag tag-new">review-impact</span> </div> <div class="tl-desc"> <ul> <li><strong>Help buttons — 6 pages (PA-05, PAR-05, CD-02, CH-01, CE-04, PR-01)</strong>: added contextual Help button to <code>priorities/pl.html</code>, <code>priorities/review.html</code>, <code>cycle-detail.html</code>, <code>cycle-history.html</code>, <code>priorities/cluster-head.html</code>, and <code>projects.html</code> account-meta / title rows.</li> <li><strong>priorities/cluster-head.html — Week picker landing (CE-01)</strong>: added <em>Select Reporting Week</em> card at top mirroring web <code>ClusterHeadPAScreen</code> param-less state — shows W23–W26 buttons that simulate loading a digest.</li> <li><strong>priorities/cluster-head.html — Acknowledge loading state (CE-02)</strong>: <code>acknowledgeDemo()</code> now shows ⏳ Acknowledging… for 1.2 s before confirming, matching web <code>acknowledging</code> loading state.</li> <li><strong>priorities/cluster-head.html — ET-011 digest footer (CE-03)</strong>: added footer note below members container explaining Monday 18:00 IST digest cadence.</li> <li><strong>priorities/pl.html — Checklist progress ring (PA-04)</strong>: added percentage display + animated progress bar above checklist items; <code>updateChecklist()</code> now computes done/3 and updates colour (amber → green at 100%).</li> <li><strong>workflow/pl.html + pm.html — Downstream Review Changes (W-03)</strong>: added blue-bordered <em>🔁 Downstream Review Changes</em> card to sidebar of both screens, showing ➕ added / ✏️ modified badges and contributing roles — mirrors web <code>ReviewImpactCard</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): gap batch — Help buttons, CE-01/02/03, PA-04 progress ring, W-03 review-impact cards (v237)</div> </div> </div> <!-- v236 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v236</span> <span class="tl-title">P&A mockup sync — approval chain status, My Contributors (all roles), review queue, changes badge, PL search</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">pa-chain</span> <span class="tag tag-new">contributors</span> <span class="tag tag-new">review-queue</span> <span class="tag tag-fix">workflow</span> </div> <div class="tl-desc"> <ul> <li><strong>priorities/pl.html — Approval Chain Status (PA-02)</strong>: upgraded static chain to per-level status rows matching web <code>PAChainStatus</code> component — each level shows reviewer name + status badge (✅ Approved / ⏳ Pending / ○ Awaiting).</li> <li><strong>My Contributors card (PA-03, all roles)</strong>: added to <code>priorities/pl.html</code> sidebar showing direct reports' bilateral review status. Added matching <em>Team Submissions</em> sidebar card to <code>priorities/review.html</code> so PM/SPOC/POD/Cluster Head also see their team's submission status.</li> <li><strong>priorities/review.html — Review queue landing (PAR-01)</strong>: new <em>Pending Reviews</em> card above the account-header listing submissions awaiting the reviewer, with per-row Review → button — mirrors web <code>PMPAReviewScreen</code> param-less landing state.</li> <li><strong>workflow/pod.html + spoc.html — Changes summary badge (W-04)</strong>: added <em>➕ N added / ✏️ N modified</em> pill row beside the colour legend, matching web <code>changesSummary</code>.</li> <li><strong>workflow/pm.html — PL search field (W-05)</strong>: added search input above the Project Lead Submissions list, matching web <code>PLSubmissionsPanel</code> search.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): P&A sync — chain status, My Contributors (all roles), review queue, changes badge, PL search (v236)</div> </div> </div> <!-- v235 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v235</span> <span class="tl-title">Mockup ↔ web sync (W→M) — workflow Help/Digest buttons, dashboard banners, status docs, reports timeline, notifications page</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">sync</span> <span class="tag tag-new">notifications</span> <span class="tag tag-new">dashboard</span> <span class="tag tag-new">workflow</span> <span class="tag tag-fix">status</span> <span class="tag tag-fix">reports</span> </div> <div class="tl-desc"> <ul> <li><strong>Workflow Help + Digest buttons</strong> — added <em>❓ Help</em> to PL and PM account-headers; added <em>❓ Help</em> + <em>📋 Update Digest</em> to PMO, POD, Delivery SPOC, and Cluster Head account-headers — mirrors the quick-action bar present in the web implementation.</li> <li><strong>Dashboard CTA banners</strong> — added <em>Pending My Action</em> (blue, <code>data-testid="pending-action-banner"</code>) and <em>Returned to Me</em> (orange, <code>data-testid="returned-to-me-banner"</code>) banners above the stats grid, plus a <strong>Quick Links</strong> card (Cycle History / Project Timeline / My Profile / Reports) after Recent Activity.</li> <li><strong>Status page informational sections</strong> — appended three cards: <em>Important Links</em> (6 link buttons), <em>About POD Governance</em> (workflow description + roles table), and <em>User Manual</em> (6 task-group cards in a 3-col grid).</li> <li><strong>Reports — Project Timeline Activity card</strong> — added stat boxes (Total Events, Capture Rate, Contributors, Projects Active) + event-type bar chart before the Notifications & Digest Delivery section.</li> <li><strong>New page: <code>notifications.html</code></strong> — in-app notification centre: category filter chips (All / U&D / Priorities / Digest / Timeline / Account) + Unread Only toggle, 8 notifications in day buckets (Today / Yesterday / Earlier), Mark All Read, Load More. Registered in index.html.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): sync W→M gaps — Help/Digest buttons, dashboard banners, status docs, reports timeline, notifications page (v235)</div> </div> </div> <!-- v234 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v234</span> <span class="tl-title">Toggle button consistency — proper switch with white thumb across all pages</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">toggle</span> <span class="tag tag-fix">design-system</span> <span class="tag tag-fix">profile</span> </div> <div class="tl-desc"> <ul> <li>Added <strong><code>.toggle-switch</code> / <code>.toggle-slider</code></strong> component to <code>assets/css/design-system.css</code> — 40×22 px pill with a 16 px white circular thumb that slides via CSS <code>::before</code> + <code>translateX(18px)</code>; checked state uses <code>var(--success)</code>. Matches the existing admin-portal toggle exactly.</li> <li>Updated <strong>16 mockup pages</strong> (<em>dashboard, reports, profile, cycle-detail, cycle-history, projects, all workflow screens, all priorities screens</em>) to use the shared CSS classes instead of the previous inline-style <code>np-slider</code> / <code>tl-notif-slider</code> pattern, which rendered as a plain coloured pill with no visible thumb.</li> <li>Removed per-page JavaScript that manually set <code>slider.style.background</code> on every checkbox change — the CSS <code>input:checked + .toggle-slider</code> rule handles colouring automatically.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): consistent toggle-switch across all pages — shared CSS thumb in design-system (v234)</div> </div> </div> <!-- v233 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v233</span> <span class="tl-title">Admin Scheduler: Timeline Notification Schedule + emoji fix</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">scheduler</span> <span class="tag tag-new">timeline</span> <span class="tag tag-fix">emoji</span> </div> <div class="tl-desc"> <ul> <li><strong>Timeline Notification Schedule</strong> — new card in <em>Admin → Scheduler → Configuration</em> listing three timeline jobs: <em>TL-001</em> Weekly Activity Digest (Monday 07:00 IST, project members not muted), <em>TL-002</em> Stale Project Alert (daily, Delivery SPOCs when no events for ≥14 days), and <em>TL-003</em> Muted-Project Cleanup (Sunday 03:00, system job, no email). Each row has a live enable/disable toggle wired to <code>toggleReminder()</code>.</li> <li>Two new <strong>configurable settings</strong> added below the table: <em>Stale Project Threshold</em> (days, default 14) and <em>Digest Delivery Day</em> (day-of-week select), both persisted in <code>adminState.schedulerSettings</code>.</li> <li>Run-history seeded with SR-009/010/011 (digest sent 23 emails, stale alert for 2 projects, cleanup no-op).</li> <li><strong>Emoji/symbol corruption fixed</strong> in <code>admin/admin.js</code>: PowerShell 5.1 mojibake had converted <code>▶ ▼ ○ ◑ ⚠ ➕</code> to garbled cp1252 sequences; all six restored to correct Unicode.</li> </ul> </div> <div class="tl-commit">💾 feat(admin): Timeline scheduler section + fix mojibake symbols in admin.js (v233)</div> </div> </div> <!-- v232 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v232 — Done</span> <span class="tl-title">OTP paste auto-submits when all 6 digits are pasted</span> <span class="tl-date">28 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">login</span> <span class="tag tag-improved">otp</span> </div> <div class="tl-desc"> <ul> <li>Pasting a full 6-digit code into any OTP box now auto-submits immediately, matching the behaviour for digit-by-digit entry (which already auto-submitted on the 6th keystroke since v206).</li> <li>Mirrors the React implementation: <code>handleOtpPaste</code> calls <code>verifyOtpCode()</code> when <code>pasted.length === 6</code>.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): OTP paste auto-submits when all 6 digits are pasted (v232)</div> </div> </div> <!-- v231 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v231 — Done</span> <span class="tl-title">Reset notification preferences to defaults</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">profile</span> <span class="tag tag-new">notifications</span> </div> <div class="tl-desc"> <ul> <li>A <strong>Reset to defaults</strong> action on Profile → Email Notifications turns every setting (toggles, digest cadence/content, snooze, muted projects) back to its default in one click. Backed by <code>POST /notifications/preferences/reset</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(notifications): reset preferences to defaults (v231)</div> </div> </div> <!-- v230 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v230 — Done</span> <span class="tl-title">Per-project timeline email mute + mark notifications unread</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">timeline</span> <span class="tag tag-new">notifications</span> </div> <div class="tl-desc"> <ul> <li>On the Project Timeline you can now <strong>mute email</strong> for a specific project's timeline (the in-app bell still records events). Backed by <code>PATCH /notifications/timeline-mute</code> + project-aware send gating.</li> <li>The notifications page lets you <strong>mark items read or unread</strong> via a per-row action.</li> </ul> </div> <div class="tl-commit">💾 feat: per-project timeline email mute + mark-unread (v230)</div> </div> </div> <!-- v229 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v229 — Done</span> <span class="tl-title">Digest content customization + scheduler activity filters</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">digest</span> <span class="tag tag-improved">scheduler</span> </div> <div class="tl-desc"> <ul> <li>Profile → Email Notifications can now choose which sections the digest includes — <strong>Pending reviews</strong> and/or <strong>Returned submissions</strong>.</li> <li>Admin scheduler Run History gains <strong>Load more</strong> pagination, <strong>quick date-range presets</strong>, and a <strong>trigger (cron/manual) filter</strong>.</li> </ul> </div> <div class="tl-commit">💾 feat: digest content customization + scheduler activity filters (v229)</div> </div> </div> <!-- v228 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v228 — Done</span> <span class="tl-title">Reporting Relationships CSV export & admin results counts</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">admin</span> <span class="tag tag-improved">export</span> </div> <div class="tl-desc"> <ul> <li>Admin → Reporting Relationships gains an <strong>Export CSV</strong> button, and "Showing N" results-count footers were added to the Projects, Users, PODs and Reporting Relationships tables.</li> </ul> </div> <div class="tl-commit">💾 feat(admin): reporting-relationships CSV export + results counts (v228)</div> </div> </div> <!-- v227 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v227 — Done</span> <span class="tl-title">Digest delivery log CSV export</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">reports</span> <span class="tag tag-new">export</span> </div> <div class="tl-desc"> <ul> <li>Reports → Data Exports gains a <strong>Digest Delivery Log — CSV</strong> (ET-026 weekly + daily runs: emails sent, candidates, skipped), via <code>GET /admin/reports/export?type=notifications</code>.</li> </ul> </div> <div class="tl-commit">💾 feat(reports): digest delivery log CSV export (v227)</div> </div> </div> <!-- v226 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v226 — Done</span> <span class="tl-title">Pause email notifications (quiet period)</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">notifications</span> <span class="tag tag-improved">profile</span> </div> <div class="tl-desc"> <ul> <li>Profile → Email Notifications can <strong>pause all category emails</strong> for 1 day / 1 week / 30 days (with "Resume now"). The in-app bell and sign-in/account mail keep working. Backed by <code>emailSnoozedUntil</code> on the preference.</li> </ul> </div> <div class="tl-commit">💾 feat(notifications): pause email notifications / quiet period (v226)</div> </div> </div> <!-- v225 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v225 — Done</span> <span class="tl-title">Reports: notifications & digest delivery + notifications pagination</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">reports</span> <span class="tag tag-improved">notifications</span> </div> <div class="tl-desc"> <ul> <li>Reports & Analytics gains a <strong>Notifications & Digest Delivery</strong> section: in-app volume by category and weekly/daily digest run stats (<code>GET /admin/reports/notifications</code>).</li> <li>The full notifications page now supports <strong>Load more</strong> pagination (server offset).</li> </ul> </div> <div class="tl-commit">💾 feat(reports): notification & digest delivery analytics (v225)</div> </div> </div> <!-- v224 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v224 — Done</span> <span class="tl-title">Export CSV on Project Accounts</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">admin</span> <span class="tag tag-improved">export</span> </div> <div class="tl-desc"> <ul> <li>Admin → Project Accounts gets an <strong>Export CSV</strong> button (respecting the active search / POD / status filters), matching the Users & Roles export.</li> </ul> </div> <div class="tl-commit">💾 feat(admin): Export CSV on Project Accounts (v224)</div> </div> </div> <!-- v223 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v223 — Done</span> <span class="tl-title">Notifications & accessibility polish</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">notifications</span> <span class="tag tag-new">accessibility</span> <span class="tag tag-improved">profile</span> </div> <div class="tl-desc"> <ul> <li>Notifications page: day grouping, URL-driven filters with "Clear filters", total/unread count, relative times, and retry-on-error; sidebar shows the unread count.</li> <li>Profile digest gets a cadence hint under the Weekly/Daily/Off selector.</li> <li>Accessibility: persistent toast live region, command-palette combobox semantics, route-change focus, reduced-motion support, and dialog aria-describedby.</li> </ul> </div> <div class="tl-commit">💾 feat: notifications + a11y polish (v223)</div> </div> </div> <!-- v222 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v222 — Done</span> <span class="tl-title">Daily digest runs on weekdays only</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">scheduler</span> <span class="tag tag-improved">digest</span> </div> <div class="tl-desc"> <ul> <li>The daily pending-actions digest (ET-026-daily) now fires Monday–Friday only (<code>0 3 * * 1-5</code>) — no weekend noise when there's typically no new activity.</li> </ul> </div> <div class="tl-commit">💾 feat(scheduler): daily digest weekdays only (v222)</div> </div> </div> <!-- v221 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v221 — Done</span> <span class="tl-title">Daily digest job in the scheduler activity</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">scheduler</span> <span class="tag tag-improved">digest</span> </div> <div class="tl-desc"> <ul> <li>The Admin scheduler activity now shows a sample <strong>ET-026-daily</strong> run (and its Job Health card), with a "Skipped — other cadence" detail chip illustrating how weekly/daily users are split.</li> </ul> </div> <div class="tl-commit">💾 chore(mockup): daily digest run sample in scheduler activity (v221)</div> </div> </div> <!-- v220 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v220 — Done</span> <span class="tl-title">Dedicated Project Timeline notifications section</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">profile</span> <span class="tag tag-improved">notifications</span> </div> <div class="tl-desc"> <ul> <li>Profile settings now has a separate <strong>Project Timeline Notifications</strong> card, splitting timeline event emails out of the general Email Notifications list for clearer control.</li> </ul> </div> <div class="tl-commit">💾 feat(profile): separate Project Timeline notifications section (v220)</div> </div> </div> <!-- v219 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v219 — Done</span> <span class="tl-title">Digest cadence (weekly / daily / off) & What's New</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">digest</span> <span class="tag tag-new">whats-new</span> <span class="tag tag-improved">scheduler</span> </div> <div class="tl-desc"> <ul> <li>Users choose their personal pending-actions digest cadence — <strong>Weekly</strong> (default), <strong>Daily</strong>, or <strong>Off</strong> — in Profile → Email Notifications. A new daily ET-026 scheduler job serves daily-cadence users; the weekly job serves the rest.</li> <li>New in-app <strong>What's New</strong> release-notes page (sidebar + ⌘K) with a "NEW" badge until viewed.</li> </ul> </div> <div class="tl-commit">💾 feat: digest cadence + What's New (v219)</div> </div> </div> <!-- v218 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v218 — Done</span> <span class="tl-title">Notification bell: category tags & unread filter</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">notifications</span> <span class="tag tag-new">filter</span> </div> <div class="tl-desc"> <ul> <li>Each bell item now carries a colour-coded <strong>category tag</strong> (Ups & Downs · Priorities · Digest · Timeline · Account), mirroring the server's template categories.</li> <li>New <strong>Unread only / Show all</strong> toggle in the panel header to focus on what still needs attention.</li> </ul> </div> <div class="tl-commit">💾 feat(notifications): bell category tags + unread-only filter (v218)</div> </div> </div> <!-- v217 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v217 — Done</span> <span class="tl-title">Dashboard returned-actions CTA & Job Health</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">dashboard</span> <span class="tag tag-new">scheduler</span> <span class="tag tag-improved">digest</span> </div> <div class="tl-desc"> <ul> <li>Dashboard surfaces the "returned to you" half of the weekly digest live (<code>GET /dashboard/my-actions</code>) as a "needs an update" CTA, alongside the existing "awaiting your review" banner.</li> <li>Admin → Scheduler → Activity gains a <strong>Job Health</strong> card showing the most recent run of each job (status, when, items, duration) via <code>GET /admin/scheduler/runs/latest</code>.</li> </ul> </div> <div class="tl-commit">💾 feat: dashboard returned-actions CTA + scheduler Job Health (v217)</div> </div> </div> <!-- v216 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v216 — Done</span> <span class="tl-title">Admin digest run insights</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-improved">scheduler</span> <span class="tag tag-new">insights</span> <span class="tag tag-improved">admin</span> </div> <div class="tl-desc"> <ul> <li>Admin → Scheduler → Activity & Run Log now renders run <strong>detail as friendly stat chips</strong> (Emails sent, Skipped — nothing pending, …) above the raw JSON, and the ET-026 weekly digest run is shown in the log.</li> <li>The ET-026 job records richer stats (candidates, with-pending, sent, skipped-empty, skipped-recent); <strong>Run Now</strong> already fires it from Upcoming Runs.</li> </ul> </div> <div class="tl-commit">💾 feat(scheduler): admin digest run insights (v216)</div> </div> </div> <!-- v215 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v215 — Done</span> <span class="tl-title">Weekly digest preview & test-send</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">notifications</span> <span class="tag tag-new">digest</span> <span class="tag tag-improved">profile</span> </div> <div class="tl-desc"> <ul> <li>Profile → Email Notifications now has a <strong>Preview my digest</strong> button (renders your live ET-026 digest in an inline frame) and a <strong>Send me a test</strong> button — no need to wait for Monday.</li> <li>Backed by <code>GET /notifications/digest/preview</code> and <code>POST /notifications/digest/test</code>; the test honours your Weekly digest opt-out and tells you when it's muted.</li> </ul> </div> <div class="tl-commit">💾 feat(notifications): weekly digest preview & test-send (v215)</div> </div> </div> <!-- v214 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v214 — Done</span> <span class="tl-title">Weekly pending-actions digest (ET-026)</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">notifications</span> <span class="tag tag-new">scheduler</span> <span class="tag tag-new">digest</span> </div> <div class="tl-desc"> <ul> <li>New <strong>ET-026</strong> weekly per-user digest: a Monday email + in-app summary of the Priorities & Achievements submissions awaiting your review and your own returned submissions. Users with nothing pending are skipped.</li> <li>Opt out via the Profile <strong>Weekly digest</strong> email preference. Shown in Admin → Email Templates and the scheduler's upcoming jobs.</li> </ul> </div> <div class="tl-commit">💾 feat(notifications): weekly pending-actions digest (ET-026) (v214)</div> </div> </div> <!-- v213 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v213 — Done</span> <span class="tl-title">Dark mode in the mockup (light / dark / system)</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">theme</span> <span class="tag tag-new">dark-mode</span> <span class="tag tag-new">ux</span> </div> <div class="tl-desc"> <ul> <li>Opt-in dark theme mirroring the React app: new shared <code>assets/js/theme.js</code> applies <code><html data-theme></code> from a saved preference; <code>design-system.css</code> flips the design tokens under <code>[data-theme="dark"]</code> (the sidebar/topbar were already dark, so this re-tones the content surfaces).</li> <li>Toggle from the ⌘K command palette (<strong>Toggle dark mode</strong>) or the new <strong>🎨 Appearance</strong> card on Profile (Light / Dark / System; System follows the OS).</li> <li>Wired into all signed-in shell pages.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): opt-in dark mode (light/dark/system) (v213)</div> </div> </div> <!-- v212 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v212 — Done</span> <span class="tl-title">⌘K palette — live project search</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">navigation</span> <span class="tag tag-new">search</span> <span class="tag tag-new">projects</span> </div> <div class="tl-desc"> <ul> <li>The ⌘K command palette now also surfaces matching <strong>projects</strong> (name / POD) under a “Projects” group; selecting one opens it at the role's workflow page.</li> <li>Mirrors the implementation, where project results come from the already-access-scoped <code>GET /projects</code> (no new search surface).</li> </ul> </div> <div class="tl-commit">💾 feat(web): live project search in the command palette (v212)</div> </div> </div> <!-- v211 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v211 — Done</span> <span class="tl-title">Admin · Bulk Invite users (CSV)</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">admin</span> <span class="tag tag-new">invitations</span> <span class="tag tag-new">bulk</span> </div> <div class="tl-desc"> <ul> <li>New <strong>✉️ Bulk Invite</strong> action on Admin → Users: paste CSV (<code>email[, role]</code> per line) with a default role, see a live valid-row count, then a per-row results table (invited / skipped / error) + summary.</li> <li>Mirrors the implementation's <code>POST /admin/invitations/bulk</code> (each row processed independently; a bad/duplicate row never aborts the batch; capped at 200).</li> </ul> </div> <div class="tl-commit">💾 feat(admin): bulk user invitations (CSV) (v211)</div> </div> </div> <!-- v210 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v210 — Done</span> <span class="tl-title">⌘K command palette — keyboard-first navigation</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">navigation</span> <span class="tag tag-new">keyboard</span> <span class="tag tag-new">ux</span> </div> <div class="tl-desc"> <ul> <li>New global <strong>⌘K / Ctrl-K</strong> command palette (also a topbar 🔍 button) to jump to any screen by typing — <strong>↑/↓</strong> to move, <strong>Enter</strong> to open, <strong>Esc</strong> to close, plus a Sign out action.</li> <li><strong>Role-aware</strong> entry list (admin items hidden from non-admins, etc.); navigation-only, mirroring <code>CommandPalette.tsx</code>.</li> <li>New shared <code>assets/js/command-palette.js</code> wired into every signed-in shell page.</li> </ul> </div> <div class="tl-commit">💾 feat(web): ⌘K command palette for keyboard-first navigation (v210)</div> </div> </div> <!-- v209 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v209 — Done</span> <span class="tl-title">Active Sessions — per-device sign-out on the Profile screen</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">security</span> <span class="tag tag-new">sessions</span> <span class="tag tag-new">profile</span> </div> <div class="tl-desc"> <ul> <li>New <strong>💻 Active Sessions</strong> card on the Profile screen listing every device currently signed in (browser/OS, IP, last-active, signed-in time), with the current device flagged <em>This device</em>.</li> <li><strong>Sign out</strong> any individual device, or <strong>Sign out other devices</strong> in one click — mirrors the implementation's stateful per-device sessions (JWT <code>sid</code> claim + <code>GET/DELETE /auth/sessions</code> and <code>POST /auth/sessions/revoke-all</code>).</li> <li>Complements the all-devices sign-out and the 30-minute inactivity auto-logout (v208).</li> </ul> </div> <div class="tl-commit">💾 feat(auth): per-device sessions with Active Sessions management (v209)</div> </div> </div> <!-- v208 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v208 — Done</span> <span class="tl-title">Inactivity auto-logout with 5-minute countdown warning + login email pre-fill</span> <span class="tl-date">27 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">security</span> <span class="tag tag-new">auth</span> <span class="tag tag-new">session</span> </div> <div class="tl-desc"> <ul> <li>Signed-in users are now auto-logged-off after <strong>30 minutes of inactivity</strong> and returned to the login page.</li> <li>The final <strong>5 minutes</strong> show a <em>“⏳ Still there?”</em> countdown modal with <strong>Stay signed in</strong> and <strong>Sign out now</strong>; any activity in the active phase resets the timer, while only an explicit “Stay signed in” dismisses the countdown.</li> <li>On timeout the login page shows a <em>“You were signed out due to inactivity”</em> notice and <strong>pre-fills the remembered email</strong> so the user can request a fresh magic link / OTP without retyping.</li> <li>New shared <code>assets/js/idle-logout.js</code> (mirrors <code>useIdleLogout.ts</code> + <code>IdleWarningModal.tsx</code>) wired into every signed-in shell page; includes an unobtrusive <strong>“⏳ Idle demo”</strong> pill that fires a short countdown for review.</li> <li>Login check-inbox OTP now <strong>auto-submits on the 6th digit</strong>, matching the implementation.</li> </ul> </div> <div class="tl-commit">💾 feat(web): 30-min inactivity auto-logout with countdown warning + login pre-fill (v208)</div> </div> </div> <!-- v207 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v207 — Done</span> <span class="tl-title">Help & Documentation in-app hub with screenshots + detailed step-by-step guides</span> <span class="tl-date">26 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">help</span> <span class="tag tag-new">docs</span> <span class="tag tag-new">screenshots</span> </div> <div class="tl-desc"> <ul> <li>New <code>/help</code> route — in-app Help & Documentation screen accessible to every authenticated role.</li> <li>Two-column layout: sticky left nav (8 topics) + scrollable content pane per topic.</li> <li>Topics: Getting Started, Ups & Downs, Priorities & Achievements, Project Timeline, Reports & Analytics, Audit Log, MCP Integration, Profile & Tokens.</li> <li>Inline screenshots for every feature section using images from <code>mockup/screenshots/</code> (served via <code>public/screenshots/</code>).</li> <li>Added <code>timeline.png</code> to capture script and regenerated all screenshots.</li> <li>Step-by-step numbered guides for each workflow; role tables, status tables, capture tables; Note / Tip / Warn callout boxes.</li> <li>❓ Help nav item added to the AppShell Account section sidebar; <code>Help & Documentation</code> topbar title registered.</li> <li>28 Vitest tests covering layout, all 8 topic navigations, and content spot-checks.</li> </ul> </div> <div class="tl-commit">💾 feat(web): add in-app Help & Documentation screen with screenshots (v207)</div> </div> </div> <!-- v206 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v206 — Done</span> <span class="tl-title">Mockup: login check-inbox screen updated with 6-digit OTP code entry UI</span> <span class="tl-date">26 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">login</span> <span class="tag tag-new">otp</span> <span class="tag tag-new">mockup</span> </div> <div class="tl-desc"> <ul> <li>Step 2 "Check your inbox" card now shows both sign-in paths: the magic link button and a 6-digit OTP code entry.</li> <li>Six separate digit boxes with auto-advance on input, backspace-to-previous, and paste support (pastes full code across all boxes).</li> <li>"Sign In with Code" button is disabled until all 6 digits are filled; enabled state uses full opacity.</li> <li>Demo hint shows the code (<strong>482 917</strong>) — click it to auto-fill all boxes.</li> <li>Entering the wrong code shows an inline error with red border on all boxes; correct code calls <code>simulateMagicLinkClick()</code> to continue the demo flow.</li> <li>Updated description copy: "A sign-in link <em>and</em> a 6-digit code were sent…"</li> <li>Animated progress bar (900 s shrink) signals the 15-minute expiry window.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): add OTP code entry to login check-inbox screen (v206)</div> </div> </div> <!-- v205 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v205 — Done</span> <span class="tl-title">Feat: 6-digit OTP code alternative to magic link — enter code directly on check-inbox screen</span> <span class="tl-date">26 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-new">auth</span> <span class="tag tag-new">login</span> <span class="tag tag-new">otp</span> </div> <div class="tl-desc"> <ul> <li>Magic link email now contains both a sign-in button <strong>and</strong> a 6-digit OTP code (e.g. <code>123 456</code>) in the same message. Users can use either.</li> <li>Check-inbox screen has a new six-box OTP input with auto-advance, backspace, and paste support. "Sign In with Code" button submits via <code>POST /auth/verify-code</code>.</li> <li>Code has the same 15-minute expiry and single-use enforcement as the magic link token.</li> <li>Non-production: the OTP code is shown inline on the check-inbox card (click-to-fill) alongside the existing clickable link, so both paths are easily testable without email.</li> <li>New API: <code>POST /api/v1/auth/verify-code</code> — accepts <code>{ email, code }</code>, issues session cookie + JWT, records audit event.</li> </ul> </div> <div class="tl-commit">💾 feat(auth): add 6-digit OTP code as alternative magic-link sign-in (v205)</div> </div> </div> <!-- v204 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v204 — Done</span> <span class="tl-title">Fix: invitation expiry email now shows correct calendar date per timezone</span> <span class="tl-date">24 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">email</span> <span class="tag tag-fix">timezone</span> </div> <div class="tl-desc"> <ul> <li><strong>Bug</strong>: <code>fmtExpiryMultiTz</code> used the IST calendar date as a single prefix for all three timezone blocks. When the expiry falls in the early IST morning (e.g. 01:39 AM IST on Sun 28 Jun), GMT and EST are on the <em>previous calendar day</em> (Sat 27 Jun) but the email showed the wrong date for those recipients.</li> <li><strong>Fix</strong>: Rewrote <code>fmtExpiryMultiTz</code> to compute each timezone’s <code>Date</code> instance independently from UTC and emit <code>"Day DD Mon YYYY, HH:MM AM/PM TZ"</code> per segment.</li> <li>Before: <em>Sun 28 Jun 2026, 01:39 AM IST / 08:09 PM GMT / 03:09 PM EST</em></li> <li>After: <em>Sun 28 Jun 2026, 01:39 AM IST / Sat 27 Jun 2026, 08:09 PM GMT / Sat 27 Jun 2026, 03:09 PM EST</em></li> <li>All 33 <code>timeFormat</code> tests pass; added a 6th <code>fmtExpiryMultiTz</code> test reproducing the screenshot scenario. <code>fmtDeadlineDate</code> and <code>fmtMondayDeadline</code> are unchanged (their fixed IST times never cross midnight for GMT or EST).</li> </ul> </div> <div class="tl-commit">💾 fix(email): show correct per-timezone calendar date in invitation expiry (v204)</div> </div> </div> <!-- v203 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v203 — Done</span> <span class="tl-title">Fix: logo broken on sub-path deployments (IIS virtual directory)</span> <span class="tl-date">24 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">logo</span> <span class="tag tag-fix">deploy</span> </div> <div class="tl-desc"> <ul> <li><strong>Bug</strong>: <code>PodGovLogo.tsx</code> used a hardcoded absolute path <code>src="/pod-governance.svg"</code> which resolved to the server root, not the app’s sub-path (e.g. <code>/PODGovernance_Dev/</code>). The logo rendered as a broken image in the live environment.</li> <li><strong>Fix</strong>: Changed to <code>src={`${import.meta.env.BASE_URL}pod-governance.svg`}</code>. Vite injects <code>BASE_URL</code> as the correct base path (“/” in local dev, <code>/PODGovernance_Dev/</code> in sub-path builds via <code>VITE_BASE</code> env var).</li> <li>Updated <code>PodGovLogo.test.tsx</code> assertion to <code>toContain()</code> so it works for any base path.</li> </ul> </div> <div class="tl-commit">💾 fix(logo): use import.meta.env.BASE_URL for pod-governance.svg path (v203)</div> </div> </div> <!-- v202 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v202 — Done</span> <span class="tl-title">Replace inline "PG" hexagon with official POD Governance logo across all pages</span> <span class="tl-date">24 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">logo</span> <span class="tag tag-feat">branding</span> </div> <div class="tl-desc"> <ul> <li>Downloaded the official <code>pod-governance.svg</code> (indigo rounded-square org-chart icon, <code>#4338ca</code>) from the AiDELoop assets server and placed it in <code>assets/img/pod-governance.svg</code>.</li> <li>Replaced every inline <code><svg></code> hexagon “PG” logo with <code><img src="assets/img/pod-governance.svg"></code> across all 24 pages (login, auth-verify, auth-activate, index, history, and all 19 sidebar files).</li> <li>Also updated the React app: <code>src/web/public/pod-governance.svg</code> (new), <code>favicon.svg</code> replaced, and <code>PodGovLogo.tsx</code> now renders the <code><img></code> instead of the inline hexagon SVG.</li> </ul> </div> <div class="tl-commit">💾 feat(logo): adopt official pod-governance.svg — replace inline PG hexagon everywhere (v202)</div> </div> </div> <!-- v201 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v201 — Done</span> <span class="tl-title">Login: full sign-in scenario coverage (validation, account states, rate-limit)</span> <span class="tl-date">22 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">auth</span> <span class="tag tag-fix">login</span> </div> <div class="tl-desc"> <ul> <li><strong>Every magic-link sign-in path is now handled</strong> on <code>login.html</code>. <em>Send Magic Link</em> validates and branches up front instead of always showing “Check your inbox”:</li> <li><strong>Inline validation</strong> — empty address, malformed email, and non-work domain (must be <code>@valuelabs.com</code>) each show a field-level error.</li> <li><strong>Email Address Not Found</strong> — unknown address gets a dedicated screen that echoes the email and asks the user to contact their POD Administrator to be added (invitation-only).</li> <li><strong>Account Not Yet Activated</strong> — invited-but-unactivated accounts are pointed to their invitation email / the activation page.</li> <li><strong>Account Deactivated</strong> — admin-disabled accounts are told to contact an Administrator to reactivate.</li> <li><strong>Too Many Requests</strong> — more than 3 magic-link requests for one address per session trips a rate-limit screen.</li> <li><strong>Happy path</strong> — active accounts get the “Check your inbox” confirmation. A new <em>“Demo — login scenarios”</em> chip row lets reviewers jump to each state, each chip driving the real <code>handleLogin()</code> branch.</li> </ul> </div> <div class="tl-commit">💾 feat(login): implement all sign-in scenarios (validation, not-found, pending, deactivated, rate-limit) (v201)</div> </div> </div> <!-- v200 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v200 — Done</span> <span class="tl-title">Project Timeline: stronger card borders</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">style</span> <span class="tag tag-feat">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>Stronger borders</strong>: event card borders bumped from 1 px <code>#e2e8f0</code> to 1.5 px <code>#cbd5e1</code> (with a slightly deeper shadow) so cards read as clearly defined panels against the light background; the type-coloured spine-edge accent is unchanged. Mirrored to the React implementation.</li> </ul> </div> <div class="tl-commit">💾 style(timeline): stronger card borders (v200)</div> </div> </div> <!-- v199 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v199 — Done</span> <span class="tl-title">Project Timeline: type-colour thread polish (accent edge, dot halo, type icons)</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">style</span> <span class="tag tag-feat">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>Type-colour thread</strong>: each event’s type colour now runs through its dot (soft halo), its connector line, a 3 px accent on the card’s spine-facing edge, and the card border on hover — tying card → connector → dot into one coherent coloured strand. Cards lift a touch more on hover. Type badges gained a leading icon (📌 🎉 ⚠️ ⛔ 🧭 📝). Mirrored to the React implementation (<code>TimelineScreen</code> + <code>custom.css</code> <code>.tl-*</code>).</li> <li>In the single-column mobile view the accent moves to the left (spine) edge for every card.</li> <li><strong>"N can see" tooltip</strong>: the hover roster now lists each viewer on its own line, sorted by role hierarchy (most senior first). In the React app the backend returns the roster (<code>seenBy</code>) so the tooltip resolves real names; same-day posts now show their real time (a backdated event stores a date and shows date-only, instead of a misleading UTC-midnight time).</li> </ul> </div> <div class="tl-commit">💾 style(timeline): type-colour thread polish (v199)</div> </div> </div> <!-- v198 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v198 — Done</span> <span class="tl-title">Project Timeline: alternating two-sided (zigzag) layout around a centre spine</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">layout</span> <span class="tag tag-feat">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>Zigzag timeline</strong>: <code>mockup/timeline.html</code> feed redrawn as a classic two-sided timeline — cards alternate left/right of a centre spine with a margin gutter, each with a dot on the spine and a small pointer toward it. Day separators are centred chips that sit on the spine and don’t consume an alternation slot, so the left/right rhythm stays consistent. Cards fade-and-rise in as you move down.</li> <li><strong>Mirrored header</strong>: the author (avatar + name) is kept nearest the spine on <em>both</em> sides — the left card’s header is reversed so identity sits beside its dot and the timestamp moves to the outer edge; footer tags / action buttons hug the spine on left cards too.</li> <li><strong>Staggered interleave</strong>: each card is pulled up to sit beside the previous one’s lower half for a dense zigzag — safe because adjacent cards are on opposite sides (they overlap vertically, never horizontally). The first card of each day resets, and the stagger is switched off in the single-column mobile view.</li> <li><strong>Type-coloured connectors</strong>: a thin connector line ties each card to its dot on the spine, coloured by event type (via a per-card <code>--ev-color</code> variable) so the alternating links read as a weave; cards lift slightly on hover. Connectors hidden in the mobile column view.</li> <li><strong>Responsive</strong>: below 760 px the stream collapses to a single left-aligned column (spine on the far left) so it stays readable on narrow screens.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): timeline alternating two-sided layout (v198)</div> </div> </div> <!-- v197 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v197 — Done</span> <span class="tl-title">Project Timeline: full-width stretch layout (matches the Ups & Downs review screens)</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">layout</span> <span class="tag tag-feat">timeline</span> </div> <div class="tl-desc"> <ul> <li><strong>Stretch layout</strong>: <code>mockup/timeline.html</code> now fills the full content width like <code>workflow/spoc.html</code> & the other review screens — dropped the <code>max-width:1000px; margin:0 auto</code> centring on <code>.tl-wrap</code> and the <code>padding:0</code> / custom-background override on <code>.main-content</code>, so the composer and feed stretch edge-to-edge with the standard 28 px content gutters and the shared <code>--bg-body</code>.</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): timeline full-width stretch layout parity with U&D review (v197)</div> </div> </div> <!-- v196 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v196 — Done</span> <span class="tl-title">Project Timeline hardening — reporting-graph scoping, revisions/audit, draft-sync guards</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">timeline</span> <span class="tag tag-feat">collaboration</span> <span class="tag tag-fix">a11y</span> </div> <div class="tl-desc"> <ul> <li><strong>Reporting-graph visibility</strong>: events are now scoped to <em>project membership</em>, not a flat global role rank. Each project carries its own member list (the local chain), so cross-project peers no longer see each other. The demo <em>Preview as</em> control lists the selected project’s actual members. A <code>👁 N can see</code> tag (with a hover roster) makes the audience explicit, and posting toasts how many people were notified.</li> <li><strong>Append-only edits + audit</strong>: editing an event now <em>keeps the previous version</em> — a “view N revisions” toggle shows the prior text struck through with attribution. A new <strong>Activity log</strong> view records every post / edit / add-info / delete (modelling the unified system audit log). Authors can delete their own events.</li> <li><strong>Hardened draft sync</strong>: captures route to the <em>most current open</em> cycle/week — if the current cycle is locked they fall through to the next open one (flagged <em>next open</em>). Priorities/AiDE respect the weekly 3-priority limit: when full they post as a <em>Suggestion</em> rather than a hard draft. Draft tags are now clickable, deep-linking into Ups & Downs / Priorities & Achievements.</li> <li><strong>Feed UX + a11y</strong>: search, type filter, date grouping and <em>Load more</em> pagination. Capture chips are real <code><button aria-pressed></code> controls (keyboard-operable, focus rings); the <em>Preview as</em> bar is marked <code>MOCKUP</code> so it reads as a demo affordance. All user text is HTML-escaped on render.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): timeline reporting-graph scoping + revisions/audit + draft-sync guards + a11y (v196)</div> </div> </div> <!-- v195 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v195 — Done</span> <span class="tl-title">Project Timeline: peer/above collaborative editing + AiDE capture option</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">timeline</span> <span class="tag tag-feat">collaboration</span> <span class="tag tag-feat">priorities</span> </div> <div class="tl-desc"> <ul> <li><strong>Collaborative editing</strong>: any project member at the <em>author’s level or above</em> in the reporting chain can now open an event and <em>edit its detail</em> or <em>add more info</em> as a threaded note. Contributions are attributed (“✎ Updated by Project Manager”, “+ Added by …”). Peers at the same rank retain shared visibility <em>and</em> edit rights; juniors below the author cannot edit.</li> <li><strong>Two-way sync</strong>: when an event that was captured into Ups / Downs / Priorities / Achievements is edited, the linked draft items in the most current cycle/week update too — the editor previews exactly which targets will be refreshed and toasts each sync.</li> <li><strong>AiDE capture</strong>: added 🤖 <em>AiDE</em> to the capture multi-select alongside Ups, Downs, Priorities and Achievements — it drafts an AiDE-tagged priority into the most current week, matching the AiDE-priority category in the P&A module.</li> <li>Permission and visibility are both demonstrable via the existing <em>Preview as</em> role selector; <code>mockup/timeline.html</code> only.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): timeline collaborative editing + draft sync + AiDE capture (v195)</div> </div> </div> <!-- v194 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v194 — Done</span> <span class="tl-title">New Project Timeline — a shared per-project event log for every role (except Admin)</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">timeline</span> <span class="tag tag-feat">collaboration</span> <span class="tag tag-feat">nav</span> </div> <div class="tl-desc"> <ul> <li><strong>New page</strong> <code>mockup/timeline.html</code> — a project-scoped running log where <em>anyone on the team can post an event</em> (milestone / win / risk / blocker / decision / update). Linked to a project via a selector and surfaced in the sidebar <em>Workflow</em> section on every page.</li> <li><strong>Hierarchy visibility</strong>: by default an event is visible to its author and <em>everyone above them</em> in the reporting chain (PL → PM → Delivery SPOC → Sales SPOC → POD Owner → Cluster Head). A <strong>“Visible to everyone”</strong> checkbox overrides this to share with all project roles. A <em>Preview as</em> role selector demonstrates how the feed changes per viewer.</li> <li><strong>Capture into governance</strong>: a multi-select lets the author also draft the event into <em>Ups</em>, <em>Downs</em>, <em>Priorities</em> and/or <em>Achievements</em> — Ups & Downs draft into the project’s most current cycle, Priorities & Achievements into the most current week. Posted events show the resulting draft tags.</li> <li><strong>Administrator excluded</strong>: signing in as Admin shows an access-denied state instead of the timeline. Sidebar <em>Project Timeline</em> link added across all 18 shell pages; index landing card + page count (32) updated.</li> </ul> </div> <div class="tl-commit">💾 feat(mockup): project timeline with hierarchy visibility + governance draft capture (v194)</div> </div> </div> <!-- v193 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v193 — Done</span> <span class="tl-title">Monthly “Nth weekday” deadlines (1st & 3rd Friday) + Projects-screen parity sync</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-sync">parity</span> <span class="tag tag-feat">scheduler</span> <span class="tag tag-feat">projects</span> <span class="tag tag-feat">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>New monthly schedule type</strong>: the cycle modal now offers a <em>Day of month</em> vs <em>The Nth weekday</em> toggle. The Nth-weekday mode pairs multi-select occurrence pills (<em>1st 2nd 3rd 4th Last</em>) with a weekday dropdown — so a deadline can be the <strong>1st & 3rd Friday</strong> of every month</li> <li><strong>Use case</strong>: Paymentsense now runs on a dedicated <em>1st & 3rd Friday</em> cycle while every other monthly project follows the standard <em>2nd Friday</em> cycle — achieved by grouping projects into separate cycles, no per-project override needed</li> <li>Backend: <code>dayConfig</code> gains a <code>monthlyMode</code> discriminator (<code>day_of_month</code> | <code>nth_weekday</code>) with <code>weekday</code> + <code>ordinals[]</code> (validated, <code>-1</code> = last); <code>computeNextRun</code> resolves the soonest matching occurrence. Fully backward-compatible — an absent <code>monthlyMode</code> keeps the legacy fixed-day behaviour. Forward path: this discriminator is the stepping stone toward an iCalendar RRULE model for arbitrary recurrences</li> <li><strong>Projects-screen parity</strong>: brought the mockup in line with the implementation now that cycle scheduling lives in the Scheduler — removed the per-project <em>Review Cycle</em> & <em>Cycle Start Date</em> fields, the <em>All Cycles</em> filter, and the <em>Project ID</em> / <em>Cycle</em> table columns. The project modal’s senior chain (<em>Cluster Head, POD Owner, Delivery SPOC, Sales SPOC</em>) is now required, with a note pointing to <strong>Admin → Scheduler</strong></li> </ul> </div> <div class="tl-commit">💾 feat(scheduler): monthly Nth-weekday deadlines + projects parity (v193)</div> </div> </div> <!-- v193 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v193 — Done</span> <span class="tl-title">Mockup week/cycle tabs now show full date ranges — matching the implementation</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-sync">parity</span> <span class="tag tag-feat">priorities</span> <span class="tag tag-feat">workflow</span> </div> <div class="tl-desc"> <ul> <li><strong>P&A screen</strong> (<code>mockup/priorities/pl.html</code>): week tabs updated from <em>Current Week (W25, 2026)</em> / <em>Next Week (W26, 2026)</em> to <em>Current Week (2026-W25 (15 Jun – 21 Jun))</em> / <em>Next Week (2026-W26 (22 Jun – 28 Jun))</em> — matching the <code>withWeekRange()</code> output in the live app</li> <li><strong>U&D PL screen</strong> (<code>mockup/workflow/pl.html</code>): cycle tabs updated from <em>Current Cycle (JUN-2026-W25)</em> / <em>Next Cycle (JUN-2026-W26)</em> to include the Mon–Sun range in parentheses, matching the implementation exactly</li> </ul> </div> <div class="tl-commit">💾 fix(mockup): display date ranges on week/cycle tabs — parity with implementation (v193)</div> </div> </div> <!-- v192 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v192 — Done</span> <span class="tl-title">Cycle scheduler: drop start/end dates, port advanced recurrence to the app</span> <span class="tl-date">21 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-sync">parity</span> <span class="tag tag-feat">scheduler</span> <span class="tag tag-feat">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>Removed</strong> the cycle modal’s <strong>Start date</strong> (full date) field and the leftover <strong>Until</strong> (end date) wiring from the Outlook-style scheduler — review cycles recur indefinitely from their schedule, so neither belongs on a cycle</li> <li><strong>Ported the remaining advanced options into the implementation</strong> (AdminSchedulerScreen): a <em>Repeat every N</em> interval (weeks/months) and multi-select <em>day-of-week pills</em> (M T W T F S S) replacing the single day dropdown</li> <li>Backend: <code>dayConfig</code> now carries optional <code>days[]</code> + <code>interval</code> (validated 1–12 / known weekdays); <code>computeNextRun</code> returns the soonest selected weekday and clamps monthly day-of-month to month length</li> </ul> </div> <div class="tl-commit">💾 feat(scheduler): multi-day + interval recurrence; remove cycle start/end dates (v192)</div> </div> </div> <!-- v191 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v191 — Done</span> <span class="tl-title">Current Week / Current Cycle tabs now show their date range too</span> <span class="tl-date">20 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-sync">parity</span> <span class="tag tag-feat">priorities</span> <span class="tag tag-feat">workflow</span> </div> <div class="tl-desc"> <ul> <li><strong>Symmetry fix</strong>: the <em>Current Week</em> (P&A) and <em>Current Cycle</em> (U&D) tabs now display their period code beside the label — e.g. <em>Current Week (W25, 2026)</em> and <em>Current Cycle (JUN-2026-W25)</em> — mirroring the <em>Next Week / Next Cycle</em> tabs which already showed it</li> <li>Implementation: PAScreen now stores <code>weekIdStr</code> from <code>/priorities/current</code> and renders it via <code>withWeekRange</code>; PLScreen shows the active cycle’s range on the Current Cycle tab</li> </ul> </div> <div class="tl-commit">💾 feat(pa): show the week/cycle range on the Current tab, matching the Next tab (v191)</div> </div> </div> <!-- v190 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v190 — Done</span> <span class="tl-title">Login demo tiles synced to the live app — all 27 seeded users</span> <span class="tl-date">20 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-sync">sync</span> <span class="tag tag-chore">login</span> </div> <div class="tl-desc"> <ul> <li><strong>Parity fix</strong>: the login screen’s demo tiles now match the implementation’s seeded users exactly — added the <strong>7 missing Project Leads</strong> (Kuntal Singha, Indurthi Hari Babu, Anitha Deva, Sanjay Kumar, Karthikeyan Ramaswamy, Rajyalakshmi Palnati, Shabbir Ahmed) so the mockup now shows all <strong>27</strong> demo users</li> <li>Corrected two demo names to match the seed data: <em>Chenchireddy G D K Reddy</em> (PMO Associate) and <em>Pavani Prathyusha Mulpuru</em> (ESO SPOC)</li> </ul> </div> <div class="tl-commit">💾 chore(mockup): sync login demo tiles with the live LoginScreen DEMO_USERS (v190)</div> </div> </div> <!-- v189 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v189 — Done</span> <span class="tl-title">Next-iteration pre-planning — Next Week / Next Cycle tabs + submission window</span> <span class="tl-date">19 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-feat">workflow</span> <span class="tag tag-feat">priorities</span> </div> <div class="tl-desc"> <ul> <li><strong>Record work for the next iteration as it happens</strong>: both Priorities & Achievements (<em>Next Week</em> tab) and Ups & Downs (<em>Next Cycle</em> tab) let you pre-plan and <strong>Save as Draft</strong> at any time</li> <li><strong>Submission window</strong>: the next period’s <em>Submit to your manager</em> button stays disabled until <strong>one day before the period begins</strong> — enforced on both the screen and the API</li> <li><strong>U&D Next Cycle</strong>: the upcoming cycle is created on demand per the project’s cadence (weekly / biweekly / monthly); its “cycle started” kickoff email still fires when the period actually begins, and a pre-planned cycle never appears as the live “active” cycle until then</li> </ul> </div> <div class="tl-commit">💾 feat(preplan): next-iteration pre-planning for P&A + U&D with submit-window gating (v189)</div> </div> </div> <!-- v188 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v188 — Done</span> <span class="tl-title">Audit Log — unified, app-wide trail across every operation</span> <span class="tl-date">19 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-feat">admin</span> </div> <div class="tl-desc"> <ul> <li><strong>One unified audit log</strong>: the System Audit Log now records <em>every</em> operation in the portal — U&D cycle submit/approve/return, Priorities & Achievements bilateral reviews (full event trail, not just latest status), and admin changes to users, projects, PODs, settings, scheduler, email templates, reporting relationships, access tokens and sign-ins</li> <li><strong>Per-entity trails</strong>: each row is tagged with its <code>entity</code> (cycle / priorities / user / project / …) so any record’s detail screen can surface its own activity trail; the admin viewer gains an <strong>Entity</strong> filter and expanded event types</li> <li>Backed by the live app’s new append-only <code>app_audit_log</code> table (the cycle-scoped <code>audit_log</code> was unified into it) and a generic <code>appAuditService.record()</code> instrumented across all 60+ mutating endpoints</li> </ul> </div> <div class="tl-commit">💾 feat(audit): unified app-wide append-only audit log + per-entity trails (v188)</div> </div> </div> <!-- v187 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v187</span> <span class="tl-title">Projects — Black Sun merge + standardise cadence to Monthly (Paymentsense Bi-Weekly), all projects active</span> <span class="tl-date">18 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">data</span> </div> <div class="tl-desc"> <ul> <li><strong>Canonical project list 15 → 14</strong>: <em>Black Sun Technology Services</em> (P002) and <em>BLACK SUN PLC</em> (P005) are combined and continue as a single <strong>Black Sun PLC</strong>, keeping the P002 id; P005 is retired</li> <li><strong>Cadence standardised</strong>: every project now runs <strong>Monthly</strong> except <em>Paymentsense Ltd</em>, which is the only <strong>Bi-Weekly</strong> account; all projects are now <strong>active</strong> (MagicBooking flipped from inactive)</li> <li>Synced across <code>admin/admin.js</code>, <code>projects.html</code>, <code>dashboard.html</code> & <code>reports.html</code>, plus the live app’s <code>seed.ts</code> (also stopped seeding workflow cycles — they are now created on demand via UI manual runs), e2e fixtures and <code>AdminUsersScreen</code> test data</li> </ul> </div> <div class="tl-commit">💾 data(projects): merge Black Sun, monthly cadence (Paymentsense bi-weekly), all active, no seeded cycles (v187)</div> </div> </div> <!-- v186 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v186 — Done</span> <span class="tl-title">Activity Trail — Project Contributor entry + role full forms in sync with app</span> <span class="tl-date">18 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> </div> <div class="tl-desc"> <ul> <li><strong>Mockup/app parity</strong>: the live app’s Activity Trail was rendering raw backend role keys (e.g. <code>project_contributor</code>); <code>roleLabel()</code> in <code>AuditTrailSidebar.tsx</code> now maps <em>Project Contributor</em>, <em>ESO SPOC</em> & <em>Recruitment SPOC</em> to full forms, matching the mockup which always showed friendly labels</li> <li><strong>priorities/pl.html & priorities/review.html</strong>: added a representative <em>Project Contributor</em> submission entry (Gopal Krishna Tripathi) to the Activity Trail sample data so the demo visually reflects the contributor → PL P&A flow</li> </ul> </div> <div class="tl-commit">💾 feat(audit): Project Contributor in Activity Trail + role full forms parity (v186)</div> </div> </div> <!-- v185 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v185 — Done</span> <span class="tl-title">Email templates — show submission deadline in all three timezones</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> </div> <div class="tl-desc"> <ul> <li><strong>ET-007 (Monday Kickoff)</strong>: deadline now reads <em>“by Monday, 12:00 PM IST / 06:30 AM GMT / 01:30 AM EST”</em> instead of bare <code>Monday 12:00</code>, matching the multi-timezone <code>{{deadline}}</code> convention used by the other templates</li> <li><strong>ET-008 (Submission Reminder)</strong>: demo body deadline updated to <em>“12:00 PM IST / 06:30 AM GMT / 01:30 AM EST today”</em></li> <li>The shared <code>fmtMultiTz</code> formatter now emits <strong>12-hour clock with AM/PM</strong>, so every token-rendered <code>{{deadline}}</code>/expiry string switches to 12-hour too</li> <li>Synced across <code>seed.ts</code>, a new <code>et007_deadline_multitz</code> migration, and the <code>admin.js</code> template previews</li> </ul> </div> <div class="tl-commit">💾 feat(email): show P&A submission deadline in IST/GMT/EST across templates (v185)</div> </div> </div> <!-- v184 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v184 — Done</span> <span class="tl-title">Project Contributor mappings, login tiles, docs & refreshed screenshots</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-docs">docs</span> </div> <div class="tl-desc"> <ul> <li><strong>Seed / mockup data</strong>: replaced the sample contributors (Meera/Arjun → Swati) with <em>Gopal Krishna Tripathi</em> & <em>Shivsagar Mishra</em> reporting to <em>Kuntal Singha</em> (Black Sun) — <code>seed.ts</code>, <code>admin.js</code> users + RR-025/RR-026, E2E fixtures & spec</li> <li><strong>login.html</strong>: added two Project Contributor demo tiles + <code>DEMO_USERS</code> entries (land on the P&A submission screen)</li> <li><strong>docs.html</strong>: new “Project Contributor Submission” screen card + TOC link; <code>rp-projectContributor</code> pill</li> <li><strong>screenshots</strong>: regenerated all mockup screenshots (login now shows the contributor tiles; admin Users / Reporting Relationships show the new mappings)</li> </ul> </div> <div class="tl-commit">💾 feat(role): Project Contributor mappings + login tiles + docs/screenshots (v184)</div> </div> </div> <!-- v183 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v183 — Done</span> <span class="tl-title">Docs portal — document the Project Contributor role & chain</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">docs</span> </div> <div class="tl-desc"> <ul> <li><strong>mockup/docs.html</strong>: added <code>project_contributor</code> to the Roles & Access table; updated the Introduction approval-chain note and the Reporting Relationships role combinations to include <em>Project Contributor → Project Lead</em></li> <li><strong>mockup/docs.html</strong>: P&A Screen section documents the “My Contributors” review card and the contributor’s P&A-only home; Bilateral Review section now lists all reviewer roles (PL reviews contributors, PM reviews PLs, …)</li> </ul> </div> <div class="tl-commit">💾 docs(mockup): document Project Contributor role in docs.html (v183)</div> </div> </div> <!-- v182 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v182 — Done</span> <span class="tl-title">Project Contributor role — P&A-only tier under the Project Lead</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-api">api</span> <span class="tag tag-ux">ux</span> </div> <div class="tl-desc"> <ul> <li><strong>schema.prisma / migration</strong>: added <code>project_contributor</code> to the <code>UserRole</code> enum (P&A-only bottom tier)</li> <li><strong>permissions.ts</strong>: new P&A-scoped <code>PA_CAN_SUBMIT</code> (adds contributor) and <code>PA_CAN_REVIEW</code> (adds PL) — kept separate from the U&D <code>CAN_*</code> sets</li> <li><strong>bilateralChainService.ts</strong>: submitter-aware chain — <code>REVIEWER_LADDER</code> with PL at the bottom + <code>chainRolesFor()</code> (PC’s chain starts at PL, then up the normal hierarchy)</li> <li><strong>priorities.ts</strong>: P&A routes use the scoped role sets and the submitter’s chain; <strong>reportingRelationships.ts</strong>: read endpoint gains a <code>managerId</code> filter</li> <li><strong>PAScreen.tsx</strong>: “My Contributors” card lets a PL review their contributors; PC sees a P&A-only home (no Ups & Downs)</li> <li><strong>mockup/admin</strong>: role definition + badge (<code>rb-projectContributor</code>), demo user, RR-025 (PC→PL), and P&A chain text now <em>Project Contributor → PL → PM → …</em></li> </ul> </div> <div class="tl-commit">💾 feat(role): Project Contributor — P&A-only tier reporting to the Project Lead (v182)</div> </div> </div> <!-- v181 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v181 — Done</span> <span class="tl-title">Save as Draft for all submissions + next-week pre-planning + reviewer Save Note</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-ux">ux</span> <span class="tag tag-api">api</span> </div> <div class="tl-desc"> <ul> <li><strong>schema.prisma</strong>: added <code>draft</code> to <code>BilateralStatus</code> enum; added <code>plDraftNote</code>/<code>plDraftSavedAt</code>/<code>reviewerDraftNote</code>/<code>reviewerNoteSavedAt</code> to <code>BilateralReview</code>; added <code>isDraft</code>/<code>draftNote</code> to <code>CyclePlSubmission</code></li> <li><strong>migration SQL</strong>: <code>ALTER TYPE BilateralStatus ADD VALUE 'draft'</code> + new columns on both tables</li> <li><strong>priorities.ts</strong>: <code>GET /priorities/next-week</code> (creates/returns next week record); <code>POST /priorities/:weekId/save-draft</code> (PL saves P&A draft); <code>PATCH /priorities/:weekId/bilateral-save-note</code> (reviewer saves draft note); <code>POST submit-pl</code> promotes draft → pending</li> <li><strong>cycles.ts</strong>: <code>POST /cycles/:id/save-draft</code> (PL saves U&D draft); <code>POST submit-pl</code> promotes draft → full submission; <code>submittedPlIds</code> excludes draft records from "all PLs submitted" count</li> <li><strong>PAScreen.tsx</strong>: Current Week / Next Week tab switcher; “💾 Save as Draft” button; future-week info banner; submit disabled on next-week tab</li> <li><strong>PLScreen.tsx</strong>: “💾 Save as Draft” button in U&D action bar</li> <li><strong>PMPAReviewScreen.tsx</strong>: “💾 Save Note” button in reviewer action bar</li> <li><strong>mockup/priorities/pl.html</strong>: week tab switcher (Current / Next Week); Save as Draft button</li> <li><strong>mockup/priorities/review.html</strong>: Save Note button prepended to action bar</li> <li><strong>mockup/workflow/pl.html</strong>: Save as Draft button in action bar</li> </ul> </div> <div class="tl-commit">💾 feat(draft): save-as-draft for P&A and U&D + next-week pre-planning (v181)</div> </div> </div> <!-- v180 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v180 — Done</span> <span class="tl-title">Show week date ranges everywhere — pages, emails, PDF, and mockup</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-ux">ux</span> <span class="tag tag-email">email</span> </div> <div class="tl-desc"> <ul> <li><strong>weekLabel.ts</strong> (frontend): <code>formatWeekLabel</code> now shows full date range — “W22, 2026  (25 May – 31 May)” instead of just the start date</li> <li><strong>timeFormat.ts</strong> (API): added <code>isoWeekToDateRange()</code> (“2026-W22” → “25 May – 31 May”) and <code>isoWeekSpanToDateRange()</code> for combined two-week spans</li> <li><strong>Email templates</strong> (ET-007 – ET-012, ET-022): <code>{{weekDates}}</code> token added alongside <code>{{weekLabel}}</code> in all P&A email bodies so recipients see e.g. “<strong>2026-W24 & 2026-W25</strong> <em>(8 Jun – 21 Jun)</em>”</li> <li><strong>schedulerService.ts</strong> + <strong>priorities.ts</strong>: <code>weekDates</code> token passed in all ET-007/008/009/010/011/012/022 email sends; combined-week kickoff uses <code>isoWeekSpanToDateRange(prevWeek, currentWeek)</code></li> <li><strong>pdfService.ts</strong>: PDF header now reads “Week: 2026-W22  (25 May – 31 May)”</li> <li><strong>mockup/priorities/history.html</strong>: week selector options and digest header labels updated to the new range format</li> </ul> </div> <div class="tl-commit">💾 feat(ux): show week date ranges on pages, emails, and PDF (v180)</div> </div> </div> <!-- v179 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v179 — Done</span> <span class="tl-title">admin.js — remove “notify PLs” from ET-007 job label</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">admin</span> </div> <div class="tl-desc"> <ul> <li>ET-007 label updated from “Priorities & Achievements Monday kickoff (notify PLs)” to “Priorities & Achievements Monday kickoff” — now covers all roles via reporting relationships</li> </ul> </div> <div class="tl-commit">💾 fix(scheduler): remove “notify PLs” from ET-007 job label (v179)</div> </div> </div> <!-- v178 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v178 — Done</span> <span class="tl-title">admin.js — remove POD Gamma placeholder</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-admin">admin</span> <span class="tag tag-data">data</span> </div> <div class="tl-desc"> <ul> <li>Removed <strong>POD Gamma</strong> (placeholder entry with no projects, no owner) from <code>mockup/admin/admin.js</code> pods array</li> <li>Canonical POD list is now 2: POD Basu and POD Ananth</li> <li>Matching removal from <code>seed.ts</code> (POD constant + podSpecs), header comment updated to “2 PODs”</li> <li>Test fixtures renamed from “POD Gamma” to generic names; step28 script + memento doc updated</li> </ul> </div> <div class="tl-commit">💾 fix(seed): remove POD Gamma placeholder from seed data and all references (v178)</div> </div> </div> <!-- v177 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v177 — Done</span> <span class="tl-title">docs.html — replace CSS illustrations with real mockup screenshots (30 pages)</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">docs</span> <span class="tag tag-sprint">reference</span> </div> <div class="tl-desc"> <ul> <li>Captured 30 screenshots from live mockup HTML pages using Playwright (1280×800 viewport, headless Chromium)</li> <li>All standalone pages: Login, Auth Verify, Auth Activate, Dashboard, Projects, 7 Workflow screens, Cycle History, Cycle Detail, 4 Priorities & Achievements screens, Reports, Profile, Status</li> <li>All 10 Admin sections: Projects, PODs, Users, Scheduler, Email Templates, Reporting Relationships, Reports & Exports, MCP Access Tokens, MCP Interaction Log, Audit Log</li> <li>Each <code>.illus</code> div in <code>docs.html</code> replaced with <code><img src="screenshots/xxx.png"></code> — click-to-enlarge lightbox still works on all images</li> <li>Scripts <code>capture.js</code> + <code>inject.js</code> added to <code>mockup/screenshots/</code> for re-capture when mockup pages update</li> </ul> </div> <div class="tl-commit">💾 docs(mockup): replace CSS illustrations with real mockup screenshots in docs.html (v177)</div> </div> </div> <!-- v176 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v176 — Done</span> <span class="tl-title">docs.html — expand abbreviations, full scheduler job table, lightbox click-to-expand</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">docs</span> <span class="tag tag-sprint">reference</span> </div> <div class="tl-desc"> <ul> <li>Replaced all abbreviations in <code>docs.html</code> and <code>PAGES.md</code>: "PL" → "Project Lead", "PM" → "Project Manager", "Del SPOC" → "Delivery SPOC", "Priorities & Achievements" replaces all "P&A" short forms</li> <li>Admin Scheduler section now includes a full table of all 9 registered cron jobs with job type, label, cron schedule, email template, and detailed description</li> <li><code>pa_kickoff_all</code> highlighted as manual-only job targeting all roles via the <code>reportingRelationship</code> table with combined week label</li> <li>Click-to-expand lightbox added: clicking any screen illustration opens a 1.85× scaled overlay with the screen title</li> </ul> </div> <div class="tl-commit">💾 docs(mockup): expand abbreviations, add scheduler job table + lightbox to docs.html (v176)</div> </div> </div> <!-- v175 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v175 — Done</span> <span class="tl-title">docs.html — HTML implementation reference with CSS screen illustrations</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">docs</span> <span class="tag tag-sprint">reference</span> </div> <div class="tl-desc"> <ul> <li>Created <code>mockup/docs.html</code> — self-contained HTML documentation page covering every screen implemented in the production React application</li> <li>31 implemented screens across 33 routes documented with CSS/SVG mini illustrations, route badges, role access pills, and 5–8 key implemented features per screen</li> <li>Sticky TOC sidebar with scroll-spy; Roles & Access table; Tech Stack summary</li> </ul> </div> <div class="tl-commit">💾 docs(mockup): add docs.html — HTML implementation reference with screen illustrations</div> </div> </div> <!-- v174 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v174 — Done</span> <span class="tl-title">PAGES.md — detailed mockup pages & features reference documentation</span> <span class="tl-date">16 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-docs">docs</span> <span class="tag tag-sprint">reference</span> </div> <div class="tl-desc"> <ul> <li>Created <code>mockup/PAGES.md</code> — comprehensive reference document covering every page, section, panel, feature, and demo user in the mockup</li> <li>Covers all 31 pages: Authentication (3), Dashboard & Navigation (2), Ups & Downs Workflow (9), Priorities & Achievements (4), Reports & Analytics, Account & Integrations (3), Admin Portal (11 sections), Reference (2)</li> <li>Documents the Design System (<code>design-system.css</code>), app shell/sidebar/topbar composition, notification bell, and shared component patterns</li> <li>Includes full file structure tree, ET code reference table (ET-001 to ET-022), role colour-coding table, and all 18 demo user accounts</li> <li>Documents the new <code>pa_kickoff_all</code> scheduler job (added in <code>schedulerService.ts</code>) — sends ET-007 to all active direct reports across all roles for the current + previous week</li> <li>Maintained alongside the mockup; updated as pages, features, or demo data change; does not reflect the production implementation</li> </ul> </div> <div class="tl-commit">💾 docs(mockup): add PAGES.md — detailed pages & features reference</div> </div> </div> <!-- v173 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v173 — Done</span> <span class="tl-title">Scheduler Upcoming Runs gains ▶ Run Now button for missed P&A jobs</span> <span class="tl-date">15 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-sprint">scheduler</span> </div> <div class="tl-desc"> <ul> <li>Added an <strong>Actions</strong> column to the Upcoming Runs table in Admin → Scheduler → Activity & Run Log</li> <li>Each row now has a <strong>▶ Run Now</strong> button that fires the job immediately — use this when the scheduler misses a Monday P&A kickoff (ET-007), PL reminder (ET-008), Cluster Head digest (ET-011), or any other cron job</li> <li>Fires <code>POST /api/v1/admin/scheduler/jobs/:jobType/fire</code>; the run is logged with <code>trigger: manual</code> and appears instantly in Run History</li> <li>Mirrors the new <code>fireJobByType()</code> export in <code>schedulerService.ts</code> and the corresponding admin route added to <code>admin.ts</code></li> </ul> </div> </div> </div> <!-- v172 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v172 — Done</span> <span class="tl-title">Scheduler gains an Activity & Run Log tab (past runs + upcoming runs)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feature</span> <span class="tag tag-sprint">scheduler</span> </div> <div class="tl-desc"> <ul> <li>Added a <strong>Configuration | Activity & Run Log</strong> tab switcher to the Admin → Scheduler screen (<code>admin/index.html</code>)</li> <li><strong>Upcoming Runs</strong> table merges each active cycle’s next run with the fixed-cron jobs (ET-007/008/011/012, reminders, scheduled reports), sorted soonest-first</li> <li><strong>Run History</strong> table audits jobs already executed — started time, trigger (cron/manual), status pill (success/partial/error), items affected, duration, and an expandable JSON/error detail; filter by status + Export CSV</li> <li>Mirrors the implemented feature: a new <code>scheduler_runs</code> table + <code>GET /admin/scheduler/runs</code>, <code>/runs/export</code> and <code>/upcoming</code> endpoints persist and surface every scheduler execution</li> </ul> </div> </div> </div> <!-- v171 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v171 — Done</span> <span class="tl-title">All demo/sample data across the mockup replaced with real seed identities</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">data</span> <span class="tag tag-sprint">parity</span> </div> <div class="tl-desc"> <ul> <li>Swept every demo page (<code>workflow/*</code>, <code>priorities/*</code>, <code>dashboard.html</code>, <code>cycle-detail.html</code>, <code>profile.html</code>, <code>reports.html</code>, <code>admin/*</code>) to replace the placeholder accounts (Accenture / Deloitte / HSBC / Capgemini / Infosys, <code>ACC-001…005</code>, <code>POD Alpha/Beta</code>) with the real seed projects (APS Bank, Black Sun, Krispy Kreme… <code>P001–P015</code>) and PODs (POD Basu / POD Ananth)</li> <li>Replaced phantom people (Daniel Chen, Reema Kapoor, James Okafor, Vikram Singh, Elena Russo, Arjun Mehta…) with seed users (Swati Nandha, Vishnu Kiran Reddy Goluguri, Basavaiah Potla, Vish Lakshmanan…)</li> <li>The same alignment was applied to the React app’s sample data (email-template preview tokens, Swagger examples, form placeholders) and the unit-test fixtures</li> </ul> </div> </div> </div> <!-- v170 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v170 — Done</span> <span class="tl-title">Select-a-Project board now lists the real seed projects (P001–P015)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">data</span> </div> <div class="tl-desc"> <ul> <li>Replaced the 5 placeholder accounts (Accenture / Deloitte / HSBC / Capgemini / Infosys — <code>ACC-001…005</code>) on <code>projects.html</code> with the 15 real seed projects <code>P001–P015</code> (APS Bank, Coventry University, Paymentsense, Globalisation Partners…) including their POD, cadence and full SPOC / PM / PL assignments from <code>prisma/seed.ts</code></li> <li>The board now shows <strong>only the projects the signed-in user is assigned to</strong> (matching the page footer); Admin, Cluster Head and PMO see the full portfolio. An empty-state message appears when none match</li> <li>Updated the workflow-preview demo blob (<code>PG_DEMO</code>) header from the fake “Accenture / POD Alpha” to a real seed project (APS Bank · POD Basu · P001)</li> </ul> </div> </div> </div> <!-- v169 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v169 — Done</span> <span class="tl-title">Demo user emails synced to seed.ts — realistic <code>firstname.lastname</code> addresses</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">data</span> <span class="tag tag-sprint">parity</span> </div> <div class="tl-desc"> <ul> <li>Synced all 25 demo-user emails in <code>admin/admin.js</code> and the 18 login tiles + <code>DEMO_USERS</code> map in <code>login.html</code> to the new backend seed scheme: <code>firstname.lastname.test@valuelabs.com</code> (e.g. <code>vishnu.test</code> → <code>vishnu.goluguri.test</code>, <code>admin.test</code> → <code>system.admin.test</code>)</li> <li>Fixed a stale typo — Ananth Reddy’s email was <code>ananta.test</code>, now <code>ananth.reddy.test</code></li> <li>Updated the Admin “Add / Invite user” email placeholders to <code>firstname.lastname.test@valuelabs.com</code> to reflect the convention</li> <li>Mockup demo logins now match the live seeded Dev / QA / UAT databases</li> </ul> </div> </div> </div> <!-- v168 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v168 — Done</span> <span class="tl-title">System Status page is now open access (no login required)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">enhancement</span> <span class="tag tag-sprint">ops</span> </div> <div class="tl-desc"> <ul> <li>Removed the login-redirect guard from <code>status.html</code> so the System Status page is reachable directly without signing in</li> <li>The topbar now adapts when signed-out — it shows a <strong>🔐 Sign In</strong> link instead of the user avatar / Profile / Sign Out actions</li> <li>(The landing-page link added in v167 now opens the page directly instead of bouncing to login)</li> </ul> </div> </div> </div> <!-- v167 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v167 — Done</span> <span class="tl-title">New System Status page — Website / API / MCP across all environments</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">feature</span> <span class="tag tag-sprint">ops</span> </div> <div class="tl-desc"> <ul> <li>Added <code>status.html</code> — a System Status dashboard rendering the health of the three services (<strong>Website</strong>, <strong>API</strong>, <strong>MCP server</strong>) across <strong>all four environments</strong> (Production, Staging, QA, Development) as a per-environment card grid</li> <li>Each service shows a status pill (operational / degraded / down / maintenance), latency, uptime and its <code>/health</code> endpoint; an overall banner + summary counts roll up the worst status, with a Refresh action that re-simulates the checks</li> <li>Wired into the landing page (index.html) and a new sidebar “Operations” section on the status page</li> </ul> </div> </div> </div> <!-- v166 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v166 — Done</span> <span class="tl-title">Fix remote MCP “Bad Request” — stateless HTTP transport</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">mcp</span> </div> <div class="tl-desc"> <ul> <li>Enabling the remote MCP server in AiDE failed with <strong>“Bad Request”</strong>. Root cause: the HTTP transport kept sessions in a per-process in-memory map keyed by <code>Mcp-Session-Id</code>; under iisnode (multiple workers + app-pool recycles) the worker that handled <code>initialize</code> often wasn’t the one that received the follow-up <code>tools/call</code>, so the session wasn’t found and the server returned <code>400 Bad Request: no valid session ID</code></li> <li>Switched the Streamable HTTP transport to <strong>stateless</strong> mode (<code>sessionIdGenerator: undefined</code>): each <code>POST /mcp</code> spins up a fresh server, handles one JSON-RPC message, and returns plain JSON — no session to lose. <code>GET</code>/<code>DELETE /mcp</code> now return 405</li> <li>Updated the MCP guide transport section to describe stateless mode; mockup mirror refreshed</li> </ul> </div> </div> </div> <!-- v165 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v165 — Done</span> <span class="tl-title">MCP: admin CRUD tools for projects, PODs & users</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">feature</span> <span class="tag tag-sprint">mcp</span> <span class="tag tag-sprint">docs</span> </div> <div class="tl-desc"> <ul> <li>The MCP server gained 13 admin-portal tools (now <strong>33 total</strong>) wrapping the <code>/admin/*</code> CRUD endpoints: full create/read/update/delete for <strong>projects</strong> and <strong>PODs</strong>, plus <strong>users</strong> (list, role/status update, project-membership replace, and invite-by-email as the create-user path)</li> <li>All admin tools require an <strong>admin/PMO</strong> token (others get a 403) and respect the same delete guards as the portal (project with active cycles → 409; POD with projects → 409)</li> <li>The public MCP guide gained an <strong>“Admin Portal”</strong> tool subsection and a <strong>section 8 of the Prompt Library</strong> with admin examples; tool counts updated 20 → 33 across the guide, Profile copy, and docs</li> </ul> </div> </div> </div> <!-- v164 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v164 — Done</span> <span class="tl-title">MCP: full CRUD on items + expanded prompt-library docs</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">feature</span> <span class="tag tag-sprint">mcp</span> <span class="tag tag-sprint">docs</span> </div> <div class="tl-desc"> <ul> <li>The MCP server gained 6 new tools (now <strong>20 total</strong>) completing create/update/delete for the two core entities: <code>list_cycle_items</code>, <code>add_cycle_item</code>, <code>update_cycle_item</code>, <code>delete_cycle_item</code> for Ups & Downs, plus <code>update_pa_item</code> and <code>delete_pa_item</code> for Priorities & Achievements; <code>submit_pl_items</code> now carries the AiDE flag</li> <li>The public MCP guide (<code>mcp-guide.html</code>) gained a <strong>“Prompt Library — by task”</strong> section: 8 task groups with multiple natural-language prompt → tool-call examples covering every tool, plus updated tool grid and counts (14 → 20)</li> <li>The Profile page’s “Connect Your AI Assistant” copy reflects the new tool count</li> </ul> </div> </div> </div> <!-- v163 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v163 — Done</span> <span class="tl-title">Link the AiDE panel to the full setup documentation</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">enhancement</span> <span class="tag tag-sprint">docs</span> </div> <div class="tl-desc"> <ul> <li>The Profile page’s <em>Connect Your AI Assistant</em> guide listed the AiDE (VS Code) Remote Servers steps but had no path to the deeper reference. Added a <strong>“Read the full AiDE setup documentation”</strong> link at the bottom of the AiDE panel, deep-linking to <code>mcp-guide.html#aide-remote</code> and opening in a new tab</li> <li>Mirrors the same change in the React webapp (<code>ProfileScreen.tsx</code>), where the href is built from <code>import.meta.env.BASE_URL</code> so it resolves under any deploy base</li> </ul> </div> </div> </div> <!-- v162 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v162 — Done</span> <span class="tl-title">De-duplicate the design system into one shared <code>design-system.css</code></span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">refactor</span> <span class="tag tag-sprint">cleanup</span> </div> <div class="tl-desc"> <ul> <li>The full ~1,390-line design system (tokens, self-hosted Inter font-faces, base components) was duplicated inline in every page as <strong>7 drifted copies</strong> — a token tweak applied differently per page. Extracted it once to <code>assets/css/design-system.css</code>; the 15 app-shell pages now <code><link></code> it instead of carrying the block inline (each shrank by ~1,400 lines)</li> <li>Each page's genuine page-specific CSS is preserved as a small inline override after the link — rendering is byte-for-byte unchanged (verified: canonical ∪ per-page override fully covers every original declaration; all non-style content identical)</li> <li><code>login.html</code> keeps its inline block on purpose (bespoke SPA styles); <code>admin/</code> keeps its own <code>admin.css</code></li> <li>Webapp parallel: removed dead <code>src/web/src/App.css</code> (Vite scaffold demo styles, imported nowhere)</li> </ul> </div> </div> </div> <!-- v161 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v161 — Done</span> <span class="tl-title">Remove duplicate Profile / Sign Out from dashboard module-picker footer</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">cleanup</span> </div> <div class="tl-desc"> <ul> <li><code>dashboard.html</code>: the module-picker footer repeated <strong>🔑 Profile & API Tokens</strong> + <strong>🚪 Sign Out</strong>, which the shared topbar already provides on every app-shell page — removed the footer copies (footer is now copyright-only)</li> <li>The standalone <code>ModulePickerScreen.tsx</code> keeps its footer controls because that screen has no topbar; the mockup wraps it in the app shell, so they were duplicates here</li> <li>Completes the earlier sidebar-footer de-duplication (v122-era) — no app-shell page now shows Profile/Sign Out twice</li> </ul> </div> </div> </div> <!-- v160 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v160 — Done</span> <span class="tl-title">Accessibility: programmatic names on all form fields (WCAG 1.3.1 / 4.1.2)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">a11y</span> </div> <div class="tl-desc"> <ul> <li>Added <code>aria-label</code> to the remaining <strong>69 form controls</strong> that had a visible label but no programmatic association (screen readers previously announced only the field type)</li> <li>Covers every admin modal form (cycle / project / POD / user / invite / template / token / service-account / reporting-relationship), the workflow comment textareas + add-item inputs + file inputs, the profile & admin token forms, and the login email field</li> <li>Re-scan confirms <strong>every</strong> <code><input>/<select>/<textarea></code> now has a programmatic name — closes the a11y form-labelling work started in v158</li> </ul> </div> </div> </div> <!-- v159 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v159 — Done</span> <span class="tl-title">Accessibility: muted-text colour contrast → WCAG AA</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">a11y</span> </div> <div class="tl-desc"> <ul> <li>Measured muted-text contrast: <code>#94a3b8</code> on white = <strong>2.56:1</strong> and <code>#9ca3af</code> = 2.54:1 — both <strong>fail WCAG AA</strong> (needs 4.5:1)</li> <li>Darkened to the next same-hue shade that passes: <code>#94a3b8</code>→<code>#64748b</code> (4.76:1) and <code>#9ca3af</code>→<code>#6b7280</code> (4.83:1) — 215 instances across 15 light-theme pages (workflow, priorities, admin, reports, cycle-detail/history, profile)</li> <li>Deliberately <strong>excluded the dark-theme pages</strong> (dashboard, projects, login) where <code>#94a3b8</code> sits on dark backgrounds and already passes — darkening there would <em>reduce</em> contrast</li> </ul> </div> </div> </div> <!-- v158 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v158 — Done</span> <span class="tl-title">Accessibility: aria-labels on search & filter controls</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">a11y</span> </div> <div class="tl-desc"> <ul> <li>Labelled the placeholder-only / unlabelled <strong>search & filter</strong> toolbar controls (a placeholder is not a programmatic label): 17 controls across cycle-history, projects, reports, priorities (cluster-head / history / pl) and admin (users / templates / MCP-log filters)</li> <li>e.g. <code>proj-search</code>→"Search projects", <code>hist-status</code>→"Filter cycles by status", <code>member-search</code>→"Search team members", admin user/template/MCP-log filters</li> <li>Remaining (lower severity — visible <code><label></code> present, only the programmatic <code>for=</code> link missing): modal form fields, scheduler settings toggles, comment textareas, date-range inputs</li> </ul> </div> </div> </div> <!-- v157 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v157 — Done</span> <span class="tl-title">Accessibility: aria-labels on icon-only buttons (Close / Remove / Copy)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">a11y</span> </div> <div class="tl-desc"> <ul> <li>Accessibility sweep: all pages have <code><html lang></code>, <code><title></code>, and no unlabelled <code><img></code>. The one real gap was icon-only buttons with no accessible name</li> <li>Added <code>aria-label</code> to ~40 icon buttons across 17 pages: modal <strong>✕</strong> closes → "Close", list-item <strong>✕</strong> removes → "Remove", MCP code-block <strong>📋</strong> → "Copy"</li> <li>Screen readers now announce a meaningful name for every icon-only control; zero unlabelled icon buttons remain</li> </ul> </div> </div> </div> <!-- v156 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v156 — Done</span> <span class="tl-title">Dead-link sweep: restore version.js placeholder + fix My Profile link</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">link hygiene</span> </div> <div class="tl-desc"> <ul> <li>Swept every page for broken internal <code>href</code>/<code>src</code>. Two real issues found (rest were JS-concat / <code><code></code>-text false positives)</li> <li>Restored <code>mockup/version.js</code> — the CI version-badge placeholder (shows <code>vlocal</code> locally, CI overwrites). It was deleted in the inline-refactor but <code>index.html</code>, <code>history.html</code> & <code>admin/index.html</code> still <code><script src></code> it, so it 404'd on every load outside CI</li> <li><code>index.html</code>: "My Profile" card pointed at a hardcoded <code>file:///C:/…/login.html#profile</code> absolute path; repointed to the real, portable <code>profile.html</code></li> </ul> </div> </div> </div> <!-- v155 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v155 — Done</span> <span class="tl-title">New pages: Auth Verify & Auth Activate landing states</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li><code>auth-verify.html</code> mirrors <code>AuthVerifyScreen.tsx</code> (<code>/auth/verify</code>) — 🔐 verifying spinner, ✅ success redirect, ⚠️ expired/used error with "request a new magic link"; demo buttons toggle the three states</li> <li><code>auth-activate.html</code> mirrors <code>AuthActivateScreen.tsx</code> (<code>/auth/activate</code>) — display-name form, 🎉 success, ⚠️ activation error, 🚫 missing/invalid token; demo buttons toggle states</li> <li>Both reuse the login dark-gradient + white-card aesthetic; the index Authentication cards (Auth Verify / Auth Activate) now point to the real pages instead of the dead <code>login.html?view=</code> deep-links</li> </ul> </div> </div> </div> <!-- v154 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v154 — Done</span> <span class="tl-title">Notification bell in the shared topbar (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li>New shared <code>assets/js/notif-bell.js</code> mirroring <code>NotificationBell.tsx</code> — 🔔 button + unread badge in the topbar, dropdown panel with recent items, per-item mark-read, "Mark all read", outside-click/Escape close</li> <li>Self-injecting into <code>.topbar-right</code>; included on all 17 app-shell pages (root, priorities/, workflow/, admin) — the design-history & index catalog pages keep their own chrome</li> <li>Demo notifications cover the impl notification types (returns, approvals, reminders, cycle/Priorities & Achievements windows)</li> </ul> </div> </div> </div> <!-- v153 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v153 — Done</span> <span class="tl-title">New page: MCP Setup Guide (mirrors shipped public/mcp-guide.html)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li>Added <code>mockup/mcp-guide.html</code> mirroring the shipped <code>src/web/public/mcp-guide.html</code> — the standalone MCP integration guide the impl NavBar links ("📖 MCP Guide") for all users; the mockup previously had no equivalent page</li> <li>Self-contained static page (inline styles, no external deps); linked from <code>index.html</code> Reports & Account section (Integration card)</li> </ul> </div> </div> </div> <!-- v152 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v152 — Done</span> <span class="tl-title">Cluster Head Priorities & Achievements Digest — History link points to Priorities & Achievements History (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li><code>priorities/cluster-head.html</code>: digest-header "📅 History" link pointed to <code>../cycle-history.html</code>; repointed to <code>history.html</code> (Priorities & Achievements History) and relabeled "📅 Priorities & Achievements History" — matches ClusterHeadPAScreen.tsx header <code>/pa/history</code> link</li> <li>Same mislink class as the v145 quick-link fixes</li> </ul> </div> </div> </div> <!-- v151 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v151 — Done</span> <span class="tl-title">Priorities & Achievements Review — awaiting-previous-level notice (sequential chain)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li><code>priorities/review.html</code>: added <code>awaiting-notice</code> (blue ⏳ "An earlier level in the review chain has not approved yet") — matches PMPAReviewScreen.tsx <code>awaiting-notice</code> for the sequential-chain "in chain" bilateral state (GAP-5 #799)</li> <li>Completes the bilateral status set in the mockup: returned / approved / awaiting</li> </ul> </div> </div> </div> <!-- v150 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v150 — Done</span> <span class="tl-title">Priorities & Achievements submission — return + submit-success banners (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li><code>priorities/pl.html</code>: added <code>pa-return-banner</code> (amber "Returned by your Project Manager" + reason) and <code>pa-submit-success</code> (green "Submitted successfully!") — matches PAScreen.tsx returnNote / successMsg alerts</li> <li>This is the Priorities & Achievements submission page (PAScreen), distinct from <code>workflow/pl.html</code> (Ups & Downs) which got its banners in v141</li> </ul> </div> </div> </div> <!-- v149 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v149 — Done</span> <span class="tl-title">Admin Projects / PODs / Users — info banners (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin parity</span> </div> <div class="tl-desc"> <ul> <li>Added the amber 💡 info banner to <code>admin/index.html</code> sections <strong>projects</strong>, <strong>pods</strong>, and <strong>users</strong> — matches the notes in AdminProjects/Pods/Users screens</li> <li>Projects banner uses canonical chain names (PL → PM → Delivery SPOC → Sales SPOC → POD Owner → Cluster Head); the impl text still carries stale "AM/CEO" labels</li> <li>All admin sections with an impl info note now have a matching mockup banner</li> </ul> </div> </div> </div> <!-- v148 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v148 — Done</span> <span class="tl-title">Admin Reports & Exports — snapshot/scheduled info banner (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin parity</span> </div> <div class="tl-desc"> <ul> <li>Added the amber 💡 info banner to <code>admin/index.html</code> section-reports — matches the snapshot/scheduled-recipients note in <code>AdminReportsScreen.tsx</code></li> <li>Reused the <code>.admin-alert.warning</code> variant added in v147</li> <li>Summary stats, on-demand export rows (6), date range, and the scheduled-reports table (incl. paused row) were already aligned</li> </ul> </div> </div> </div> <!-- v147 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v147 — Done</span> <span class="tl-title">Admin Audit Log — immutability info banner (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin parity</span> </div> <div class="tl-desc"> <ul> <li>Added the amber 💡 info banner to <code>admin/index.html</code> section-audit-log — matches the immutability/compliance note in <code>AdminAuditLogScreen.tsx</code></li> <li>Added a reusable <code>.admin-alert.warning</code> variant to <code>admin.css</code> (amber), complementing the existing <code>.info</code></li> <li>Audit-log filters, table, and pagination were already aligned</li> </ul> </div> </div> </div> <!-- v146 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v146 — Done</span> <span class="tl-title">Admin Reporting Relationships — KPI strip (Total / Active / Inactive / Role Pair Types)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin parity</span> </div> <div class="tl-desc"> <ul> <li>Added a 4-card KPI strip to <code>admin/index.html</code> section-reporting — matches <code>AdminReportingRelationshipsScreen.tsx</code> <code>rel-kpi-strip</code> (Total Pairs / Active / Inactive / Role Pair Types)</li> <li>Every other admin section already had a stat strip; reporting was the only one without</li> <li>Wired live counts in <code>admin.js</code> <code>renderReportingRelationships()</code> — recomputes on add/edit/toggle/delete</li> </ul> </div> </div> </div> <!-- v145 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v145 — Done</span> <span class="tl-title">Wire Priorities & Achievements History quick links to the new history page (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li>Fixed "📅 Priorities & Achievements History →" Quick Links in <code>workflow/pmo.html</code> and <code>workflow/spoc.html</code> — were pointing at <code>priorities/review.html</code>, now correctly target the new <code>priorities/history.html</code></li> <li>Added missing "📅 Priorities & Achievements History →" Quick Link to <code>workflow/pl.html</code>, <code>pm.html</code>, <code>pod.html</code>, <code>cluster-head.html</code> — matches the <code>/pa/history</code> link present in PL/PM/PODOwner/ClusterHead screens</li> <li>All role workflow sidebars now reach the read-only Priorities & Achievements archive, consistent with the implementation</li> </ul> </div> </div> </div> <!-- v144 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v144 — Done</span> <span class="tl-title">New page: Priorities & Achievements History (read-only archive)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">mockup parity</span> </div> <div class="tl-desc"> <ul> <li>New <code>priorities/history.html</code> mirrors <code>HistoricalPAScreen.tsx</code> (route <code>/pa/history</code>) — previously had no mockup at all</li> <li>Week selector dropdown, 3-stat summary bar (Total / Submitted / Pending), submission-rate progress bar</li> <li>Per-member collapsible cards with status badge (Approved / Submitted / Returned / Pending), 🎯/🏆 count pills, priorities & achievements with AiDE badges, and reviewer "Review Submission →" action</li> <li>Member search + status filter + clear, "Read-only Archive" badge, Export PDF + Dashboard links</li> <li>Linked from <code>index.html</code> Priorities & Achievements section (Archive card)</li> </ul> </div> </div> </div> <!-- v143 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v143 — Done</span> <span class="tl-title">Profile MCP tokens — three-way status (active / expired / revoked)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">mcp sync</span> </div> <div class="tl-desc"> <ul> <li><code>profile.html</code>: <code>renderMyTokens()</code> upgraded from binary active/revoked to three-way status pill — adds grey <strong>Expired</strong> state, matches ProfileScreen.tsx:367-371</li> <li>Revoke button + row dimming now keyed on <code>status !== 'active'</code> (not just revoked) so expired tokens read as inactive</li> <li>Added an expired demo token (<code>MT-003</code> VS Code extension) to <code>profileState.myTokens</code> so the state is visible</li> </ul> </div> </div> </div> <!-- v142 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v142 — Done</span> <span class="tl-title">Workflow forward/return success banners — PM, Delivery SPOC, POD Owner</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-desc"> <ul> <li><code>pm.html</code>: added <code>pm-forward-success</code> (green), <code>pm-return-success</code> (warning), <code>pm-spoc-return-banner</code> — matches PMScreen.tsx:617/627/637</li> <li><code>spoc.html</code>: added <code>spoc-forward-success</code> ("Forwarded to Sales SPOC!") and <code>spoc-return-success</code> ("Returned to PM") — matches DeliverySpocScreen.tsx:486/496</li> <li><code>pod.html</code>: added <code>pod-forward-success</code> ("Forwarded to Cluster Head!") and <code>pod-return-success</code> ("Returned to Sales SPOC") — matches PODOwnerScreen.tsx:485/495</li> </ul> </div> </div> </div> <!-- v141 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v141 — Done</span> <span class="tl-title">PLScreen submit banners + Scheduler cycle Archive button</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-desc"> <ul> <li>Added <code>pl-submit-success</code> banner to <code>mockup/workflow/pl.html</code> — matches impl <code>submit-success-alert</code> in PLScreen.tsx:579 ("Submitted successfully!")</li> <li>Added <code>pl-all-submitted</code> notice with "📅 View Cycle History →" CTA — matches impl <code>all-submitted-notice</code> in PLScreen.tsx:631 ("All Project Leads have submitted.")</li> <li>Added Archive button (🗄) per cycle row in admin scheduler <code>renderScheduler()</code> — matches impl <code>archive-btn-{id}</code> in AdminSchedulerScreen.tsx:763</li> <li>Added <code>archiveCycle(id)</code> stub in admin.js — soft-sets status to archived and re-renders</li> </ul> </div> </div> </div> <!-- v140 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v140 — Done</span> <span class="tl-title">Admin Reports — Scheduled Reports Actions column (Edit / Pause / Delete)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-desc"> <ul> <li>Added 6th Actions column to Scheduled Reports table — matches impl <code>edit-schedule-{i}</code>, <code>pause-schedule-{i}</code>, <code>delete-schedule-{i}</code> buttons in AdminReportsScreen.tsx:371-373</li> <li>Paused row (Return Rate Alert) now shows Resume instead of Pause, and is dimmed at 60% opacity — matches impl <code>sr.paused ? opacity 0.6</code></li> <li>Added report-type sub-label under schedule name (e.g. "Priorities & Achievements Weekly") — matches impl's <code>REPORT_TYPE_LABEL[sr.reportType]</code> sub-line</li> <li>Added JS stubs: <code>editScheduledReport()</code>, <code>toggleScheduledReport()</code>, <code>deleteScheduledReport()</code></li> </ul> </div> </div> </div> <!-- v139 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v139 — Done</span> <span class="tl-title">Admin MCP Tokens — Expired status pill + inactive row dimming</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-desc"> <ul> <li>Token status pill: added <code>● Expired</code> state (grey pill) between Active and Revoked — matches impl AdminMcpTokensScreen.tsx:283-288 three-way status</li> <li>Row dimming + Revoke action: was keyed on <code>revoked</code> boolean; now keyed on <code>inactive</code> (covers both revoked and expired) — revoked/expired rows show "—" instead of Revoke button</li> </ul> </div> </div> </div> <!-- v138 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v138 — Done</span> <span class="tl-title">Admin Users — Invited filter option + Revoke button + pending-invites stat</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-desc"> <ul> <li>Status filter: added "Invited" option between Active and Inactive — matches impl <code>status-filter</code> in AdminUsersScreen.tsx:566-569</li> <li>Actions column: invited users now show 🔄 Resend + ✕ Revoke buttons — matches impl <code>resend-btn-{id}</code> + <code>revoke-btn-{id}</code> in AdminUsersScreen.tsx:643-654</li> <li>Added <code>revokeInvitation(id)</code> JS stub that sets status→inactive and re-renders the table</li> <li>Stats bar: <code>user-stat-pending</code> now updated live from invited-user count — was always static 2</li> </ul> </div> </div> </div> <!-- v137 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v137 — Done</span> <span class="tl-title">Reports — Ups & Downs Trend project filter dropdown</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">reports sync</span> </div> <div class="tl-desc"> <ul> <li>Added project filter <code><select></code> (id=<code>trend-project-filter</code>) to Ups & Downs Trend card header, between the table/chart toggle and the Export button</li> <li>Matches impl: <code>data-testid="trend-project-filter"</code> in ReportsScreen.tsx:648 — filters trend rows by project name</li> <li>Added <code>filterTrendProject(val)</code> JS mock stub that shows a toast simulating the filter action</li> </ul> </div> </div> </div> <!-- v136 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v136 — Done</span> <span class="tl-title">Cycle History — PDF export button + View button for all cycles</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">cycle sync</span> </div> <div class="tl-desc"> <ul> <li>Actions column: replaced plain "View →" / "Open →" links with styled View button for all cycles + 📄 PDF button for approved cycles</li> <li>Matches impl: <code>data-testid="btn-view-{id}"</code> (all cycles) + <code>data-testid="btn-pdf-{id}"</code> (only when <code>status === 'cluster_head_approved'</code>) in CycleHistoryScreen.tsx:436-452</li> <li>Added <code>exportCyclePdf()</code> JS mock stub to simulate PDF download flow</li> </ul> </div> </div> </div> <!-- v135 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v135 — Done</span> <span class="tl-title">Workflow — Attachments card added to pod.html, pm.html, cluster-head.html</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-desc"> <ul> <li>Added 📎 Attachments card (before Comment/Action bar) in <code>pod.html</code>, <code>pm.html</code>, <code>cluster-head.html</code></li> <li>Matches <code>data-testid="attachments-card"</code> + <code>FileUploadWidget</code> in PODOwnerScreen.tsx:605, PMScreen.tsx:780, ClusterHeadScreen.tsx:463</li> <li><code>workflow/pl.html</code> and <code>workflow/spoc.html</code> (v134) already had the card — completing the full workflow chain</li> </ul> </div> </div> </div> <!-- v134 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v134 — Done</span> <span class="tl-title">SPOC workflow — Attachments card added between Downs and Comment</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-desc"> <ul> <li>Added 📎 Attachments card between Downs card and Comment card in <code>mockup/workflow/spoc.html</code></li> <li>Matches <code>data-testid="attachments-card"</code> + <code>FileUploadWidget</code> present in both <code>DeliverySpocScreen.tsx:606</code> and <code>SalesSpocScreen.tsx:605</code></li> <li>CSS for <code>.file-upload-zone</code> already existed in spoc.html — only HTML card was missing</li> </ul> </div> </div> </div> <!-- v133 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v133 — Done</span> <span class="tl-title">Admin Email Templates — Other tab, Active/Draft/Archived filter, templateCode badge</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-desc"> <ul> <li>Added "📧 Other" category tab (matches impl's 5th <code>CATEGORY_TABS</code> entry in AdminEmailTemplatesScreen.tsx)</li> <li>Status filter dropdown: Enabled/Disabled → Active/Draft/Archived (matches impl's <code>data-testid="filter-status"</code> options)</li> <li>Preview panel header: added <code>templateCode</code> badge (<code>id="preview-code"</code>) alongside template name — matches impl's <code>data-testid="preview-template-code"</code></li> <li>admin.js: added "other" group to renderTemplates groups array; updated status filter logic to match <code>t.status</code>; previewTemplate() now populates preview-code element</li> </ul> </div> </div> </div> <!-- v132 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v132 — Done</span> <span class="tl-title">Dashboard — stats row + footer + table headers parity with ModulePickerScreen</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">dashboard sync</span> </div> <div class="tl-desc"> <ul> <li>Stats row: replaced Ups/Downs/Priorities/Approved Cycles YTD with Total Cycles / Approved YTD / Active Cycles / Priorities & Achievements Completion % (matches <code>data-testid="dashboard-stats"</code> in ModulePickerScreen.tsx)</li> <li>Footer added: copyright text + 🔑 Profile & API Tokens button + 🚪 Sign Out button (matches <code>module-picker-footer</code>, <code>btn-module-profile</code>, <code>btn-module-signout</code>)</li> <li>Recent Activity table headers: Event→Status, When→Date (matches impl column labels)</li> </ul> </div> </div> </div> <!-- v131 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v131 — Done</span> <span class="tl-title">Admin Scheduler — trim settings to match implementation (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-body"><ul> <li>Removed "Default Submission Deadline" field — not in <code>SchedulerSettings</code> interface or API</li> <li>Removed "Send digest summary to Cluster Head" toggle — not implemented</li> <li>Removed "Reset to Defaults" button — not in <code>AdminSchedulerScreen.tsx</code></li> <li>Renamed "Save Settings" → "💾 Save Changes" to match implementation label</li> <li>Updated timezone options to match impl <code>TIMEZONES</code> array (Asia/Kolkata, UTC, America/New_York, America/Los_Angeles, Europe/London)</li> <li>Updated hint text to match implementation wording throughout</li> </ul></div> <div class="tl-commit">💾 fix(mockup): trim scheduler settings to match implementation (v131)</div> </div> </div> <!-- v130 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v130 — Done</span> <span class="tl-title">PL Priorities & Achievements screen — attachments card (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">priorities sync</span> </div> <div class="tl-body"><ul> <li>Added Attachments card (📎) between Achievements and Note to Manager in <code>priorities/pl.html</code></li> <li>Uses existing <code>.file-upload-zone</code> CSS; drag-drop + click-to-upload zone with file list area</li> <li>Matches <code>data-testid="attachments-card"</code> / <code>FileUploadWidget</code> in <code>PAScreen.tsx</code> line 767</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pl pa attachments card (v130)</div> </div> </div> <!-- v129 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v129 — Done</span> <span class="tl-title">Review screen — approved alert, full category set, attachments card (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">priorities sync</span> </div> <div class="tl-body"><ul> <li>Added Approved alert (✅ Bilateral Commitment Approved) — matches <code>data-testid="approved-alert"</code> in <code>PMPAReviewScreen.tsx</code></li> <li>Expanded add-priority category select from 4 → 8 options (added hiring, client, skills, process) — matches <code>VALID_CATEGORIES</code> and <code>data-testid="add-priority-category"</code></li> <li>Added Attachments card in right sidebar (read-only) — matches <code>data-testid="attachments-card"</code> with <code>FileUploadWidget readOnly</code></li> </ul></div> <div class="tl-commit">💾 feat(mockup): review screen approved alert category set attachments (v129)</div> </div> </div> <!-- v128 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v128 — Done</span> <span class="tl-title">Admin MCP Log — filter parity + info banner (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-body"><ul> <li>Replaced "Search" text input with "Identity" dropdown — matches <code>data-testid="filter-identity"</code> in <code>AdminMcpLogScreen.tsx</code></li> <li>Updated "Outcome" → "Status" with options 2xx/4xx/5xx matching implementation values</li> <li>Added "Clear" button alongside Apply — matches <code>data-testid="filter-clear"</code></li> <li>Added info banner below page header (🤖 MCP audit explanation) — matches impl alert block</li> </ul></div> <div class="tl-commit">💾 feat(mockup): mcp log filter parity and info banner (v128)</div> </div> </div> <!-- v127 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v127 — Done</span> <span class="tl-title">Admin Audit Log — To Date filter + Clear button (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-body"><ul> <li>Added "To Date" date input to Audit Log filter card — matches <code>data-testid="to-filter"</code> in <code>AdminAuditLogScreen.tsx</code></li> <li>Added "Clear" button alongside Apply — matches <code>data-testid="clear-filters"</code></li> <li>Filter grid expanded from 5 to 6 columns: search · role · event type · from date · to date · apply+clear</li> </ul></div> <div class="tl-commit">💾 feat(mockup): audit log to-date filter and clear button (v127)</div> </div> </div> <!-- v126 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v126 — Done</span> <span class="tl-title">Admin Projects — Status filter in toolbar (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-body"><ul> <li>Added "All Status" filter select to Projects toolbar in <code>admin/index.html</code></li> <li>Matches <code>data-testid="filter-status"</code> in <code>AdminProjectsScreen.tsx</code></li> <li>Options: All Status / Active / Inactive; id <code>proj-status-filter</code> wired to <code>renderProjects()</code></li> <li>Toolbar now has 4 controls: search · POD · Cycle · Status</li> </ul></div> <div class="tl-commit">💾 feat(mockup): admin projects status filter (v126)</div> </div> </div> <!-- v125 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v125 — Done</span> <span class="tl-title">Admin Users — Pending Invites KPI card (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-body"><ul> <li>Added "Pending Invites" stat card to Users KPI strip in <code>admin/index.html</code></li> <li>Matches <code>data-testid="kpi-pending-invites"</code> in <code>AdminUsersScreen.tsx</code></li> <li>Placed between Active and Distinct Roles; amber colour (<code>#d97706</code>); id <code>user-stat-pending</code></li> <li>KPI strip now 4 cards: Total Users · Active · Pending Invites · Distinct Roles</li> </ul></div> <div class="tl-commit">💾 feat(mockup): admin users pending invites KPI card (v125)</div> </div> </div> <!-- v124 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v124 — Done</span> <span class="tl-title">SPOC workflow — Quick Links sidebar card (impl parity)</span> <span class="tl-date">14 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">spoc sync</span> </div> <div class="tl-body"><ul> <li>Added "🔗 Quick Links" card to right sidebar in <code>workflow/spoc.html</code> (after Summary)</li> <li>Matches <code>data-testid="link-pa-review"</code>, <code>data-testid="link-pa-history"</code>, <code>data-testid="link-cycle-history"</code> in <code>SalesSpocScreen.tsx</code></li> <li>Links: 🎯 Review Priorities & Achievements Submissions, 📅 Priorities & Achievements History, 🗂️ Cycle History</li> </ul></div> <div class="tl-commit">💾 feat(mockup): spoc workflow quick links sidebar card (v124)</div> </div> </div> <!-- v123 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v123 — Done</span> <span class="tl-title">Reports — Return Rate by Stage card with table/chart toggle (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">reports sync</span> </div> <div class="tl-body"><ul> <li>Added "↩️ Return Rate by Stage" card to left column in <code>reports.html</code></li> <li>Matches <code>data-testid="return-rate-table"</code> / <code>data-testid="return-hbar-chart"</code> in <code>ReportsScreen.tsx</code></li> <li>Table shows Stage / Returns Issued / % of Cycles / Most Common Reason; chart is SVG horizontal bar</li> <li>Table/Chart toggle uses existing <code>toggleReportView('return','table'|'chart')</code></li> <li>Placed between Ups & Downs Trend and SLA Metrics cards (matches impl column order)</li> </ul></div> <div class="tl-commit">💾 feat(mockup): reports return rate by stage card (v123)</div> </div> </div> <!-- v122 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v122 — Done</span> <span class="tl-title">PMO Observer — Priorities & Achievements History quick link in sidebar (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">pmo sync</span> </div> <div class="tl-body"><ul> <li>Added "📅 Priorities & Achievements History →" link to Quick Links sidebar in <code>workflow/pmo.html</code></li> <li>Matches <code>data-testid="link-pa-history"</code> in <code>PMOScreen.tsx</code></li> <li>Links to <code>../priorities/review.html</code>; placed between Reports and Cycle History</li> </ul></div> <div class="tl-commit">💾 feat(mockup): PMO observer Priorities & Achievements History quick link (v122)</div> </div> </div> <!-- v121 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v121 — Done</span> <span class="tl-title">Cycle Detail — Export PDF button in approved banner (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">detail sync</span> </div> <div class="tl-body"><ul> <li>Added "📄 Export PDF" button to the approved banner in <code>cycle-detail.html</code></li> <li>Matches <code>data-testid="btn-export-pdf"</code> in <code>CycleDetailScreen.tsx</code></li> <li>Calls <code>exportReport('pdf')</code> stub (toast notification); grouped with "← Back to History" in a flex row</li> </ul></div> <div class="tl-commit">💾 feat(mockup): cycle detail export PDF button (v121)</div> </div> </div> <!-- v120 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v120 — Done</span> <span class="tl-title">Cycle History — Sort toggle button + toggleSort() (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">history sync</span> </div> <div class="tl-body"><ul> <li>Added sort toggle button to filter bar in <code>cycle-history.html</code>: "↓ Newest" / "↑ Oldest"</li> <li>Matches <code>data-testid="btn-sort"</code> in <code>CycleHistoryScreen.tsx</code></li> <li>Added <code>toggleSort()</code> JS + <code>sortDesc</code> state; <code>filterCycles()</code> now respects sort order (defaults newest-first)</li> </ul></div> <div class="tl-commit">💾 feat(mockup): cycle history sort toggle button (v120)</div> </div> </div> <!-- v119 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v119 — Done</span> <span class="tl-title">Cluster Head Priorities & Achievements — Clear Filters button + clearMemberFilters() (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">priorities sync</span> </div> <div class="tl-body"><ul> <li>Added ✕ Clear button to filter bar in <code>priorities/cluster-head.html</code></li> <li>Matches <code>data-testid="btn-clear-filters"</code> in <code>ClusterHeadPAScreen.tsx</code> (resets search + status to defaults)</li> <li>Added <code>clearMemberFilters()</code> JS function: resets <code>#member-search</code> + <code>#status-filter</code> and calls <code>filterMembers()</code></li> </ul></div> <div class="tl-commit">💾 feat(mockup): cluster-head PA clear filters button (v119)</div> </div> </div> <!-- v118 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v118 — Done</span> <span class="tl-title">Dashboard — role switcher for multi-role users (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">dashboard sync</span> </div> <div class="tl-body"><ul> <li>Added role switcher bar between header and module cards in <code>dashboard.html</code> module picker section</li> <li>Matches <code>data-testid="role-switcher"</code> + <code>role-chip-{role}</code> in <code>ModulePickerScreen.tsx</code></li> <li>Active role chip highlighted blue; inactive chips are muted — matches <code>module-role-chip-active</code> CSS in implementation</li> <li>JS populates chips from <code>user.roles[]</code> in sessionStorage; demo falls back to PM + Delivery SPOC dual-role view for PM users</li> <li>Switcher hidden (<code>display:none</code>) for single-role users — only shown when 2+ roles detected</li> </ul></div> <div class="tl-commit">💾 feat(mockup): dashboard role switcher for multi-role users (v118)</div> </div> </div> <!-- v117 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v117 — Done</span> <span class="tl-title">Admin Scheduler — reminders table Code + Actions columns (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">admin sync</span> </div> <div class="tl-body"><ul> <li>Added "Code" column (reminder ID badge) as first column in reminders table — matches <code>data-testid="reminder-row-{code}"</code> code cell in <code>AdminSchedulerScreen.tsx</code></li> <li>Renamed "Reminder" column header → "Name" to match separate Code + Name split in implementation</li> <li>Added "Actions" column with ✏️ Edit button per row — matches <code>data-testid="btn-edit-rem-{code}"</code> in <code>AdminSchedulerScreen.tsx</code></li> <li>Updated group separator <code>colspan</code> from 7 → 9 in <code>admin.js</code> <code>renderScheduler</code></li> <li>Added <code>editReminder(id)</code> stub function in <code>admin.js</code></li> <li>"No Template" warning cell for reminders with no linked email template</li> </ul></div> <div class="tl-commit">💾 feat(mockup): admin scheduler reminders — Code + Actions columns (v117)</div> </div> </div> <!-- v116 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v116 — Done</span> <span class="tl-title">PL workflow — return banner + RTE add rows + attachments card (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-body"><ul> <li>Added "Returned by Project Manager" amber banner to <code>workflow/pl.html</code> matching <code>data-testid="return-reason-alert"</code> in <code>PLScreen.tsx</code></li> <li>Replaced <code><input type="text"></code> in add-Up row with <code>.wysiwyg-wrapper</code> matching <code>AddItemRow</code> RichTextEditor (<code>data-testid="add-up-row"</code>)</li> <li>Replaced <code><input type="text"></code> in add-Down row with <code>.wysiwyg-wrapper</code> (<code>data-testid="add-down-row"</code>)</li> <li>Added Attachments card with <code>.file-upload-zone</code> and demo file entry matching <code>FileUploadWidget</code> (<code>data-testid="attachments-card"</code>)</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pl workflow — return banner + RTE add rows + attachments card (v116)</div> </div> </div> <!-- v115 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v115 — Done</span> <span class="tl-title">POD Owner workflow — return banner, editable items (not read-only), RTE add rows, legend fix (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-body"><ul> <li>Added "Returned for revision" amber banner to <code>workflow/pod.html</code> matching <code>data-testid="pod-return-reason-alert"</code> in <code>PODOwnerScreen.tsx</code></li> <li>Removed incorrect "Read-only at this level" labels — POD Owner CAN edit+add items (matches <code>PODOwnerItemCard</code> + <code>PODOwnerAddItemRow</code>)</li> <li>Added <code>.wysiwyg-wrapper</code> add-Up and add-Down rows matching <code>PODOwnerAddItemRow</code> RichTextEditor</li> <li>Updated context alert text: "You may add new items, modify existing ones…" (matches <code>data-testid="pod-info-alert"</code>)</li> <li>Fixed color legend: "Modified at prior levels" → "Modified"; "Added at prior levels" → "Added here"</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pod workflow — return banner + editable items + RTE add rows (v115)</div> </div> </div> <!-- v114 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v114 — Done</span> <span class="tl-title">SPOC workflow — return reason banner + RichTextEditor add-item rows (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-body"><ul> <li>Added "Returned for revision" amber banner to <code>workflow/spoc.html</code> matching <code>data-testid="delivery-spoc-return-reason-alert"</code> in <code>DeliverySpocScreen.tsx</code></li> <li>Replaced <code><input type="text"></code> in add-Up row with <code>.wysiwyg-wrapper</code> matching <code>PgMAddItemRow</code> (<code>data-testid="delivery-spoc-add-up-input"</code>)</li> <li>Replaced <code><input type="text"></code> in add-Down row with <code>.wysiwyg-wrapper</code> matching <code>PgMAddItemRow</code> (<code>data-testid="delivery-spoc-add-down-input"</code>)</li> </ul></div> <div class="tl-commit">💾 feat(mockup): spoc workflow — return reason banner + RTE add-item rows (v114)</div> </div> </div> <!-- v113 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v113 — Done</span> <span class="tl-title">Priorities & Achievements Review mockup — returned alert, RichTextEditor add-forms, correct action labels, summary chain-status (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">priorities sync</span> </div> <div class="tl-body"><ul> <li>Added "Returned for Revision" amber alert with reviewer comment to <code>priorities/review.html</code> (matches <code>ReturnedAlert</code> component, <code>data-testid="returned-alert"</code>)</li> <li>Replaced plain <code><input></code> in add-priority/add-achievement rows with <code>.wysiwyg-wrapper</code> matching <code>RichTextEditor</code> component</li> <li>Category <code><select></code> added to add-priority row (matches implementation's category dropdown)</li> <li>Action buttons corrected: "↩ Return for Revision" and "✅ Approve — Bilateral Commitment" (matching <code>data-testid="return-btn"</code> and <code>data-testid="approve-btn"</code>)</li> <li>Summary sidebar now shows chain-status text "⏳ Awaiting review" (matches <code>data-testid="pri-review-chain-status"</code>)</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pa review — returned alert + RTE forms + correct action labels (v113)</div> </div> </div> <!-- v112 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v112 — Done</span> <span class="tl-title">PM workflow — PM Member Tab Bar + PL submissions "all submitted" alert (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-body"><ul> <li>Added PM Member Tab Bar card to <code>workflow/pm.html</code> matching <code>PMScreen.tsx</code> <code>PMemberTabBar</code> component (<code>pm-member-tabs</code>)</li> <li>Multi-PM support: active tab (Vishnu K R Goluguri) shown as <code>btn-primary</code>, inactive (Priya Sinha) as <code>btn-outline</code></li> <li>Updated PL Submissions panel header to "2 of 2 submitted" and added <code>alert-success</code> "All N PLs have submitted" banner</li> <li>Matches implementation's <code>data-testid="all-pls-submitted-alert"</code> and <code>data-testid="pls-pending-alert"</code> states</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pm workflow — PM member tab bar + PL submitted alert (v112)</div> </div> </div> <!-- v111 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v111 — Done</span> <span class="tl-title">Cluster Head chain table — badge-draft level badges + Changes Made column (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-body"><ul> <li>Updated <code>workflow/cluster-head.html</code> Review Chain Summary table to match <code>ClusterHeadScreen.tsx</code> <code>ReviewChainTable</code> component</li> <li>Level badges: <code>role-badge rb-*</code> → <code>badge badge-draft</code> (matches implementation)</li> <li>Column "Changes" → "Changes Made"; action badges use <code>#d1fae5/#065f46</code> green for Approved</li> <li>Changes Made column: count-based ("2 changes", "1 change", "—") with quoted reviewer comment inline</li> <li>Timestamps formatted as "DD Mon YYYY, HH:MM" matching <code>fmtDatetime()</code> output</li> <li>Pending row: "● Pending" dot prefix; Submitted row: "● Submitted"</li> </ul></div> <div class="tl-commit">💾 feat(mockup): cluster-head chain table — badge-draft levels + Changes Made column (v111)</div> </div> </div> <!-- v110 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v110 — Done</span> <span class="tl-title">PMO chain table — Action/Notes columns + timestamps + change counts (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">workflow sync</span> </div> <div class="tl-body"><ul> <li>Updated <code>workflow/pmo.html</code> Full Approval Chain Status table to match <code>PMOScreen.tsx</code> <code>FullChainTable</code> component</li> <li>Column "Status" → "Action"; column "Notes" → "Notes / Changes"</li> <li>Card header subtitle updated to "Live view — updates as approvals progress"</li> <li>Level badges changed from role-badge style to <code>badge-draft</code> (matches implementation)</li> <li>Approved rows use green badge (<code>#d1fae5 / #065f46</code>); Submitted uses <code>badge-final</code></li> <li>Notes/Changes column now shows: change count, quoted reviewer comment, formatted action timestamp</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pmo chain table — Action/Notes columns + timestamps + change counts (v110)</div> </div> </div> <!-- v109 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v109 — Done</span> <span class="tl-title">PL Priorities & Achievements screen — category filter bar + team submission status sidebar (impl parity)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">Priorities & Achievements sync</span> </div> <div class="tl-body"><ul> <li>Added <strong>category filter bar</strong> above the priorities list in <code>priorities/pl.html</code> — matches the <code>select-priority-filter</code> dropdown in <code>PAScreen.tsx</code> (GAP-6 AzDO #810)</li> <li>Categories: All / 🤖 AiDE / 🚀 Delivery / 📈 Growth / 👥 Hiring / 🤝 Client / 📚 Skills / ⚙️ Process / 📌 Other</li> <li>Added <strong>Team Submission Status</strong> sidebar card matching <code>PAScreen.tsx</code> GAP-S12-02 — shows each PL's submission status with icon (✅ approved / ⏳ pending / ↩ returned / ⬜ not submitted)</li> <li>Demo data: Swati Nandha (⏳ current user), Dinesh Kumar Purohit (⬜ not submitted), Priya Sinha (✅ approved)</li> </ul></div> <div class="tl-commit">💾 feat(mockup): pl Priorities & Achievements — add category filter bar + team submission status sidebar (v109)</div> </div> </div> <!-- v108 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v108 — Done</span> <span class="tl-title">Cluster Head Priorities & Achievements — per-member digest view with search, filter, and individual acknowledge</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">Priorities & Achievements sync</span> </div> <div class="tl-body"><ul> <li>Replaced consolidated bilateral-chain table + flat priorities/achievements lists with per-member digest card view matching <code>ClusterHeadPAScreen.tsx</code></li> <li>Page header: dark gradient (navy→purple), week label, Team Members / Submitted / Pending stat counters, Change Project + History links</li> <li>Filter bar: name search input + status dropdown (All / Pending / Approved / Returned) + live member count</li> <li>Color legend strip (Original / Modified / Added by reviewer / AiDE)</li> <li>3 demo member cards: Swati Nandha (acknowledged ✅), Dinesh Kumar Purohit (pending, with acknowledge button), Priya Sinha (not submitted, collapsed)</li> <li>Each card: avatar initials, name, submitted time, priorities count, achievements count, status badge, collapsible body, per-member "✅ Acknowledge & Close Week" button</li> <li>Demo <code>toggleCard()</code>, <code>filterMembers()</code>, <code>acknowledgeDemo()</code> scripts replace old consolidated-view <code>acknowledgeWeek()</code></li> </ul></div> <div class="tl-commit">💾 feat(mockup): cluster-head Priorities & Achievements digest redesign — per-member cards with search/filter/acknowledge (v108)</div> </div> </div> <!-- v107 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v107 — Done</span> <span class="tl-title">Dashboard module picker — dark glass-morphism redesign with role-aware buttons</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-body"><ul> <li>Replaced the plain white module cards + welcome banner with a dark glass-morphism module picker (deep navy gradient background, semi-transparent frosted cards with faint watermark icons)</li> <li>Each card: icon, bold title, description, 3 feature chips, contextual info box (chain / Priorities & Achievements note / available-to / restricted access), full-width CTA button in module accent colour (blue / purple / green / orange)</li> <li>Role-aware routing: Ups & Downs button goes to <code>projects.html</code> for PL/ESO/Rec SPOC, or directly to role workflow page for PM, Delivery SPOC, Sales SPOC, POD Owner, Cluster Head, PMO Associate</li> <li>Priorities & Achievements button routes to <code>priorities/pl.html</code>, <code>priorities/cluster-head.html</code>, or <code>priorities/review.html</code> based on role</li> <li>Admin Portal card is dimmed + disabled (pointer-events: none) for roles without admin access</li> <li>Welcome heading personalised with first name from sessionStorage</li> </ul></div> <div class="tl-commit">💾 feat(mockup): dark glass-morphism dashboard module picker with role-aware CTA buttons (v107)</div> </div> </div> <!-- v106 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v106</span> <span class="tl-title">Full-width layout audit — remove .page-layout max-width cap across all pages</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-body"><ul> <li>Cross-page consistency audit: all 17 pages pass nav-placeholder, role labels, sidebar footer, font links, admin nav checks</li> <li>Removed <code>max-width:1200px; margin:0 auto</code> from <code>.page-layout</code> CSS in 15 files — two-column content+audit-sidebar grid now fills the full available width on all screen sizes</li> <li>Affected: workflow/pl, pm, pmo, pod, spoc, cluster-head; priorities/pl, review, cluster-head; dashboard, projects, reports, profile, cycle-detail, cycle-history</li> </ul></div> <div class="tl-commit">💾 fix(mockup): remove .page-layout max-width cap across 15 pages — full-width audit pass (v106)</div> </div> </div> <!-- v105 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v105</span> <span class="tl-title">Reports page auto-scales to full screen width</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-body"><ul> <li>Removed <code>max-width:1200px;margin:0 auto</code> wrapper from <code>reports.html</code> — content now fills the full available viewport width</li> </ul></div> <div class="tl-commit">💾 fix(mockup): remove max-width cap from reports page so it scales to screen width (v105)</div> </div> </div> <!-- v104 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v104</span> <span class="tl-title">Expand "Del. SPOC" abbreviation to "Delivery SPOC" across all live pages</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-body"><ul> <li>Replaced all <code>Del. SPOC</code> abbreviations with <strong>Delivery SPOC</strong> in 16 files: workflow/pl, pm, pmo, pod, spoc, cluster-head; priorities/pl, review, cluster-head; dashboard, projects, reports, profile, cycle-detail, cycle-history, index</li> <li>History changelog entries left unchanged (they describe past version state)</li> </ul></div> <div class="tl-commit">💾 chore(mockup): expand Del. SPOC → Delivery SPOC across all live pages (v104)</div> </div> </div> <!-- v103 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v103</span> <span class="tl-title">Remove redundant "← Dashboard" back-link from priorities and profile pages</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">cleanup</span></div> <div class="tl-desc"><ul> <li>Removed <code>← Dashboard</code> back-link from <code>priorities/pl.html</code>, <code>priorities/review.html</code>, <code>priorities/cluster-head.html</code>, and <code>profile.html</code> — redundant now that Dashboard is always reachable via the sidebar</li> </ul></div> <div class="tl-commit">💾 chore(mockup): remove redundant Dashboard back-link from priorities + profile pages (v103)</div> </div> </div> <!-- v102 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v102 — Done</span> <span class="tl-title">Unified nav: admin portal now uses shared sidebar + topbar; role-controlled links across all screens</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-chore">nav</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html restructured</strong> — custom <code>.admin-topnav</code>, <code>.admin-shell</code>, and <code>.admin-sidebar</code> replaced by shared <code>#nav-placeholder</code> + <code>#topbar-placeholder</code> + <code>.main-content</code>; the shared nav IIFE (same as all 15 workflow/priority pages) now runs on the admin page</li> <li><strong>Role-controlled links</strong> — sidebar sections (Workflow, Management, Automation, Settings, AI Integration, Reporting, Account) shown or hidden by <code>roleKey</code>; admin-specific sections only appear for <code>admin</code> role</li> <li><strong>Consistent visual identity</strong> — same dark sidebar, same dark topbar, same logo/user info/Profile/Sign Out layout as every other page; no more separate admin chrome</li> <li><strong>admin.css cleaned up</strong> — 200 lines of now-obsolete layout CSS removed (<code>.admin-topnav</code>, <code>.admin-shell</code>, <code>.admin-sidebar</code>, <code>.nav-item</code>, <code>.admin-main</code>); content styles untouched</li> <li><strong>admin/index.html head</strong> — inline <code><style></code> block adds the dark-topbar override + <code>.topbar-*</code> component classes + mobile-sidebar rules that <code>assets/css/style.css</code> does not include</li> </ul></div> <div class="tl-commit">💾 feat(mockup): unify admin portal nav with shared sidebar/topbar; role-controlled links (v102)</div> </div> </div> <!-- v101 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v101 — Done</span> <span class="tl-title">Rename "Priorities & Achievements" — replace all Priorities & Achievements abbreviations with the full label across all 18 pages</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">rename</span><span class="tag tag-chore">nav</span></div> <div class="tl-desc"><ul> <li><strong>Sidebar nav label</strong> — "Priorities & Achievements" replaces "Priorities & Achievements" (short form) across all 15 workflow/priority/dash/cycle pages</li> <li><strong>Page titles</strong> — <code><title></code> tags updated for all three priorities pages</li> <li><strong>Page headings</strong> — <code><h2></code> headings in priorities pages updated</li> <li><strong>Quick-links, card titles, reports labels</strong> — all HTML-context occurrences of <code>Priorities & Achievements</code> updated; JS string toast messages and CSS/JS comments (which used the raw short form) left unchanged</li> </ul></div> <div class="tl-commit">💾 feat(mockup): rename Priorities & Achievements — replace all abbreviations with full label (v101)</div> </div> </div> <!-- v100 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v100 — Done</span> <span class="tl-title">Move full admin menu into main sidebar (admin role only); remove sidebar footer identity card</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-chore">nav</span></div> <div class="tl-desc"><ul> <li><strong>Admin menu in main sidebar</strong> — for <code>roleKey === 'admin'</code> users, five new sections appear in the sidebar: Management (Projects, PODs, Users & Roles, Org Hierarchy), Automation (Scheduler, Email Templates), Settings (Reporting Relationships), AI Integration (MCP Access Tokens, MCP Interaction Log), Reporting (Reports & Exports, Audit Log); each link deep-links to the admin portal via URL hash (e.g. <code>admin/index.html#users</code>)</li> <li><strong>"Admin Portal" single link removed</strong> from the ACCOUNT section — replaced by the full inline menu above</li> <li><strong>Sidebar footer identity card removed</strong> across all 15 pages — user info is already visible in the topbar; dead CSS (<code>.sidebar-footer</code>, <code>.sidebar-user</code>, <code>.sidebar-user-chevron</code> + orphaned properties block) cleaned up</li> </ul></div> <div class="tl-commit">💾 feat(mockup): move admin menu into main sidebar for admin role; remove sidebar footer (v100)</div> </div> </div> <!-- v99 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v99 — Done</span> <span class="tl-title">Remove redundant inner padding wrapper — content now fills full available width</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">layout</span></div> <div class="tl-desc"><ul> <li><strong>Double-padding removed</strong> across all 15 pages — each had a <code><div style="padding:20px"></code> wrapper inside <code>.main-content</code> which already has <code>padding: 28px</code>; removing the inner wrapper gives 40px more usable width per page</li> <li><strong>reports.html / profile.html</strong> — kept <code>max-width</code> constraint and auto-centering but removed the extra 20px inner padding</li> <li><strong>projects.html</strong> — added <code>padding:0</code> to <code>.main-content</code> so the full-bleed dark project picker background reaches edge-to-edge</li> </ul></div> <div class="tl-commit">💾 fix(mockup): remove redundant inner padding — content fills full width (v99)</div> </div> </div> <!-- v98 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v98 — Done</span> <span class="tl-title">Remove duplicate Profile / Sign Out buttons from sidebar footer across all pages</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">css</span></div> <div class="tl-desc"><ul> <li><strong>Sidebar footer actions removed</strong> — <code>.sidebar-footer-actions</code> div (🔑 Profile + 🚪 Sign Out buttons) deleted from all 15 pages; these already appear in the topbar</li> <li><strong>Sidebar footer simplified</strong> — now only contains the identity card (<code>.sidebar-user</code>); <code>style="display:flex"</code> and <code>flex-direction:column</code> removed since only one child remains</li> <li><strong>Dead CSS comment updated</strong> — <code>.sidebar-footer</code> comment no longer references Profile/Sign Out</li> </ul></div> <div class="tl-commit">💾 fix(mockup): remove duplicate sidebar footer Profile/SignOut buttons (v98)</div> </div> </div> <!-- v97 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v97 — Done</span> <span class="tl-title">Topbar layout fixes + admin portal dynamic user + hamburger mobile-only</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">css</span><span class="tag tag-chore">js</span></div> <div class="tl-desc"><ul> <li><strong>.topbar-left / .topbar-right CSS</strong> added to all 15 pages — <code>display:flex; flex: 1</code> on left, <code>flex-shrink:0</code> on right so title fills the gap and user area stays pinned right</li> <li><strong>Hamburger button</strong> moved from inline styles to <code>.topbar-hamburger</code> class — hidden on desktop (≥901px), visible on mobile (≤900px) via media query</li> <li><strong>Admin portal topnav</strong> — user avatar, name, and role badge now loaded dynamically from <code>sessionStorage.pg_demo_user</code> on page load</li> <li><strong>Admin profile link</strong> fixed from hardcoded <code>file:///…</code> absolute path → <code>../profile.html</code></li> <li><strong>Admin back link</strong> changed from "← Back to Workflow" → "← Dashboard" pointing to <code>../dashboard.html</code></li> <li><strong>adminSignOut()</strong> now clears <code>sessionStorage.pg_demo_user</code> before redirecting</li> </ul></div> <div class="tl-commit">💾 fix(mockup): topbar left/right layout, mobile hamburger, admin dynamic user (v97)</div> </div> </div> <!-- v96 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v96 — Done</span> <span class="tl-title">Topbar redesign: consistent dark nav with avatar, role badge, and action buttons across all pages</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">nav</span><span class="tag tag-chore">css</span><span class="tag tag-chore">js</span></div> <div class="tl-desc"><ul> <li><strong>Topbar background</strong> changed to dark (<code>var(--bg-sidebar, #1a1a2e)</code>) on all 16 pages — matches admin portal nav style</li> <li><strong>User avatar circle</strong> with initials replaces plain name link; sized 30×30px with brand-primary background</li> <li><strong>Role badge</strong> added: role-specific colour per role key (blue PL, green PM, amber Del-SPOC, cyan Sales-SPOC, gray POD, red CEO, slate PMO, admin amber <code>#e8a020</code>)</li> <li><strong>Action buttons</strong> (<code>.topbar-action-btn</code>): 🔑 Profile + 🚪 Sign Out, styled with ghost border to match admin topnav</li> <li><strong>New CSS classes</strong>: <code>.topbar-user</code>, <code>.topbar-avatar</code>, <code>.topbar-role-badge</code>, <code>.topbar-action-btn</code>, <code>.topbar-action-btn:hover</code></li> </ul></div> <div class="tl-commit">💾 style(mockup): consistent dark topbar with avatar + role badge + action buttons (v96)</div> </div> </div> <!-- v95 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v95 — Done</span> <span class="tl-title">CSS sync: align inline styles with implementation design system (custom.css)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">sync</span><span class="tag tag-chore">css</span></div> <div class="tl-desc"><ul> <li><strong>Variable aliases:</strong> added <code>--primary</code>, <code>--primary-dark</code>, <code>--primary-light</code>, <code>--bg</code>, <code>--surface</code>, <code>--text</code>, <code>--success</code>, <code>--danger</code>, <code>--warning</code>, <code>--info</code>, <code>--radius</code>, <code>--shadow</code> to the <code>:root</code> block — both <code>--brand-primary</code> and <code>--primary</code> naming schemes now work</li> <li><strong>Badge colours fixed</strong> to match <code>custom.css</code>: <code>.badge-pending</code> blue (#dbeafe/#1e40af), <code>.badge-final</code>/<code>.badge-approved</code> green (#dcfce7/#15803d); added <code>.badge-submitted</code></li> <li><strong>Stepper aliases:</strong> added <code>.podgov-stepper-bar</code>, <code>.podgov-stepper-inner</code>, <code>.podgov-step</code>, <code>.podgov-step-circle</code>, <code>.podgov-step-connector</code>, <code>.podgov-step-label</code> (implementation naming alongside existing <code>.workflow-stepper/.step</code> classes)</li> <li><strong>Layout:</strong> added <code>max-width:1200px; margin:0 auto</code> to <code>.page-layout</code>; added <code>.page-screen</code> shell class</li> <li><strong>New utilities:</strong> <code>.summary-stat/value/label</code>, <code>.stat-card.ups/downs</code>, <code>.add-item-row.aide-add</code>, <code>.history-stats-bar</code>, <code>.pl-member-tabs/tab</code></li> <li><strong>Fixed:</strong> notification unread highlight changed from stale AiDE purple (<code>rgba(108,99,255)</code>) to POD blue (<code>rgba(37,99,168)</code>)</li> </ul></div> <div class="tl-commit">💾 style(mockup): sync inline CSS with custom.css — variable aliases, badge colours, stepper classes</div> </div> </div> <!-- v94 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v94</span> <span class="tl-title">Refactor: inline all CSS + JS into each HTML page; remove 23 redundant SPA files</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">refactor</span><span class="tag tag-fix">clean-up</span></div> <div class="tl-desc"><ul> <li>CSS inlined in all 16 MPA pages: Inter @font-face (paths adjusted for root vs subdir) + <code>style.css</code> + <code>styles.css</code> as a single <code><style></code> block per page</li> <li>JS inlined in all 16 MPA pages: <code>nav.js</code> + <code>pg-app.js</code> as inline <code><script></code> blocks — each page is now fully self-contained</li> <li><strong>Deleted:</strong> <code>app.js</code>, <code>version.js</code>, <code>cycles.js</code>, <code>priorities.js</code>, <code>screens/</code> (13 SPA screen files), <code>assets/js/nav.js</code>, <code>assets/js/pg-app.js</code>, <code>styles.css</code></li> <li><strong>Kept:</strong> <code>assets/css/style.css</code> + <code>assets/fonts/inter.css</code> (still used by admin portal)</li> </ul></div> <div class="tl-commit">💾 refactor(mockup): inline CSS+JS into all 16 HTML pages; delete 23 redundant SPA files</div> </div> </div> <!-- v93 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v93</span> <span class="tl-title">SPA → MPA conversion: 16 standalone HTML pages replace the 2212-line SPA engine</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-nav">nav</span><span class="tag tag-chore">refactor</span></div> <div class="tl-desc"><ul> <li><strong>assets/js/nav.js</strong>: Shared sidebar + topbar injection; role-based links; <code>window.PG_ROOT</code> prefix support</li> <li><strong>assets/js/pg-app.js</strong>: Shared demo data (<code>window.PG_DEMO</code>), render helpers, workflow & Priorities & Achievements action functions, MCP token & notif prefs management</li> <li><strong>login.html</strong>: 18-tile demo login; saves <code>pg_demo_user</code> to sessionStorage → navigates to dashboard</li> <li><strong>dashboard.html</strong>, <strong>projects.html</strong>, <strong>profile.html</strong>, <strong>reports.html</strong>, <strong>cycle-history.html</strong>, <strong>cycle-detail.html</strong>: Root-level pages</li> <li><strong>workflow/pl.html</strong>, <strong>workflow/pm.html</strong>, <strong>workflow/spoc.html</strong> (Del.SPOC + Sales SPOC), <strong>workflow/pod.html</strong>, <strong>workflow/cluster-head.html</strong>, <strong>workflow/pmo.html</strong>: 6-stage U&D approval chain</li> <li><strong>priorities/pl.html</strong>, <strong>priorities/review.html</strong> (PM/Del.SPOC/Sales SPOC/POD Owner), <strong>priorities/cluster-head.html</strong>: Priorities & Achievements bilateral agreement chain</li> </ul></div> <div class="tl-commit">💾 feat(mockup): SPA→MPA conversion — 16 standalone HTML pages + shared nav/app JS</div> </div> </div> <!-- v92 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v92</span> <span class="tl-title">Fix: All Profile links use absolute file:/// URL for local mockup browsing</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-nav">nav</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html</strong>: Profile topnav link updated to <code>file:///C:/Projects/ValueLabs/PODGovernance/mockup/login.html#profile</code></li> <li><strong>index.html</strong>: My Profile card link updated from <code>login.html?view=profile</code> to same absolute <code>file:///</code> URL</li> </ul></div> <div class="tl-commit">💾 fix(mockup): use absolute file:/// URL for all Profile links</div> </div> </div> <!-- v91 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v91</span> <span class="tl-title">Revert: Admin Profile uses single /profile route (not admin-specific) — mockup + impl aligned</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-nav">nav</span><span class="tag tag-sync">sync</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html</strong>: Profile topnav link restored to <code>href="../login.html#profile"</code> — opens shared Profile screen in workflow SPA</li> <li><strong>admin/index.html</strong>: Removed inline <code>section-profile</code> div (no separate admin profile section)</li> <li><strong>admin/admin.js</strong>: Removed <code>case 'profile'</code> from <code>navigateTo()</code></li> <li><strong>AdminTopNav.tsx</strong>: Profile links reverted to <code>/profile</code>; <strong>App.tsx</strong>: <code>/admin/profile</code> route removed — single <code>/profile</code> route serves all roles</li> </ul></div> <div class="tl-commit">💾 fix(admin+mockup): unify Profile on /profile for all roles</div> </div> </div> <!-- v90 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v90</span> <span class="tl-title">Fix: Admin Portal Profile button now navigates within the portal (not back to workflow)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-nav">nav</span><span class="tag tag-sync">sync</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html</strong>: Profile topnav link changed from <code>href="../login.html#profile"</code> to <code>onclick="navigateTo('profile')"</code></li> <li><strong>admin/index.html</strong>: Added <code>section-profile</code> with account details + MCP tokens table</li> <li><strong>admin/admin.js</strong>: Added <code>case 'profile'</code> to <code>navigateTo()</code></li> <li><strong>App.tsx + AdminTopNav.tsx</strong>: Added <code>/admin/profile</code> route & links (later reverted in v91)</li> </ul></div> <div class="tl-commit">💾 fix(admin+mockup): Profile button routes within admin portal</div> </div> </div> <!-- v89 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v89</span> <span class="tl-title">Fix: AiDE tab panel visible on load (desktop panel was default-shown)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li><strong>screen-profile.js</strong>: <code>data-panel="desktop"</code> gets <code>display:none</code>; <code>data-panel="aide"</code> loses <code>display:none</code> — AiDE panel now visible on load, matching the active tab</li> </ul></div> <div class="tl-commit">💾 fix(mockup): show AiDE panel by default on MCP guide load</div> </div> </div> <!-- v88 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v88</span> <span class="tl-title">AiDE MCP tab: Remote Servers UI replaces stdio steps (mockup + impl)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-mcp">mcp</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li><strong>screen-profile.js</strong>: AiDE (VS Code) tab — 4 stdio steps replaced with Remote Servers UI steps (open panel → fill URL → generate token → Add Server); <code>mcp-aide-config</code> snippet now shows the MCP endpoint URL</li> <li><strong>ProfileScreen.tsx</strong>: <code>MCP_ENDPOINT_URL</code> derived from <code>MCP_API_URL</code>; <code>aideConfig</code> snippet updated to endpoint URL; AiDE panel rewritten with Remote Servers UI flow</li> <li><strong>.vscode/mcp.json</strong>: switched from <code>type: stdio</code> to <code>type: http</code> pointing at Dev MCP endpoint; comments now match #aide-remote guide steps</li> </ul></div> <div class="tl-commit">💾 feat(mockup): AiDE tab — Remote Servers UI replaces stdio steps</div> </div> </div> <!-- v87 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v87</span> <span class="tl-title">Sync: Quick Links emojis across all role screens (impl → mockup)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li><strong>screen-am, screen-ceo, screen-pl, screen-pm</strong>: 🔄 Cycle History → <strong>🗂️ Cycle History</strong></li> <li><strong>screen-ceo, screen-pod</strong>: 📊 Reports → <strong>📈 Reports & Analytics</strong></li> <li>Completes the Quick Links emoji sync started in v86 (PMO only) — all role screens now consistent</li> </ul></div> <div class="tl-commit">💾 fix(mockup): sync Quick Links emojis across AM, CEO, PL, PM, POD screens</div> </div> </div> <!-- v86 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v86</span> <span class="tl-title">Sync: PMO Quick Links labels & emojis (impl → mockup)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>📊 Reports → <strong>📈 Reports & Analytics</strong> (more descriptive; matches Reports page heading)</li> <li>🔄 Cycle History → <strong>🗂️ Cycle History</strong> (🗂️ = file cabinet = archive; 🔄 implied refresh/recycle)</li> <li>Priorities & Achievements History label unchanged; all three now match <code>PMOScreen.tsx</code> Link labels</li> </ul></div> <div class="tl-commit">💾 fix(mockup): sync PMO Quick Links labels and emojis to implementation</div> </div> </div> <!-- v85 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v85</span> <span class="tl-title">Fix: login screen — remove duplicate Vishnu tile; demo grid scroll; button emoji sync</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sync">sync</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>Removed duplicate <code>vishnu.test</code> "Delivery SPOC" tile — implementation uses a single tile per user; dual-role switching handled by ModulePickerScreen role switcher</li> <li>Implementation (<code>LoginScreen.tsx</code>) button emoji synced: <strong>📧</strong> → <strong>🔗</strong> to match mockup — 🔗 is more semantically correct for a magic <em>link</em></li> <li>Implementation (<code>custom.css</code>) <code>.demo-hint-grid</code> gains <code>max-height: 340px; overflow-y: auto</code> — matches mockup inline style; 18 tiles now scroll inside the card instead of overflowing</li> </ul></div> <div class="tl-commit">💾 fix(web,mockup): login screen tile dedup + demo grid scroll + button emoji</div> </div> </div> <!-- v84 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v84</span> <span class="tl-title">Sync: Priorities & Achievements PL screen sidebar — add Approval Chain card (impl → mockup)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-feat">feat</span></div> <div class="tl-desc"><ul> <li><code>screen-priorities-pl.js</code> right sidebar: added <strong>🔗 Approval Chain</strong> card showing the bilateral review chain PM → Del. SPOC → AM → POD → Cluster Head</li> <li>Matches <code>PAChainStatus</code> component added to <code>PAScreen.tsx</code> — mockup was missing this card entirely</li> <li>Each chain step rendered as a styled row matching the implementation's <code>pri-chain-step</code> pattern; active step highlighted when live data loads</li> </ul></div> <div class="tl-commit">💾 feat(mockup): add Approval Chain sidebar card to Priorities & Achievements PL screen</div> </div> </div> <!-- v83 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v83</span> <span class="tl-title">Sync: PMO screen summary label "Account" → "Project" (impl → mockup)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-fix">fix</span></div> <div class="tl-desc"><ul> <li><code>screen-pmo.js</code> Final Summary card: <strong>Account:</strong> relabelled to <strong>Project:</strong> — implementation uses "Project" which is the correct entity name in POD Governance</li> <li>The platform tracks projects, not accounts; "Account" was a carry-over from an earlier design iteration</li> </ul></div> <div class="tl-commit">💾 fix(mockup): relabel "Account" → "Project" in PMO screen summary card</div> </div> </div> <!-- v82 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v82</span> <span class="tl-title">Sync: PL screen action button label — "Reset View" → "Reset Comment" (impl → mockup)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li><code>screen-pl.js</code> action bar: <strong>Reset View</strong> relabelled to <strong>Reset Comment</strong> to match the implementation's more accurate <code>data-testid="reset-btn"</code> label</li> <li>Implementation clears only the comment textarea; "Reset View" implied a full screen reload which isn't implemented — mockup now reflects actual behaviour</li> </ul></div> <div class="tl-commit">💾 fix(mockup): relabel "Reset View" → "Reset Comment" in PL screen action bar</div> </div> </div> <!-- v81 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v81</span> <span class="tl-title">Sync: ClusterHead review chain table — add Time column (impl → mockup)</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-sync">sync</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>Review Chain Summary table in <code>screen-ceo.js</code> gains a <strong>Time</strong> column showing when each level acted</li> <li>Matches <code>ClusterHeadScreen.tsx</code> which renders <code>actionTime</code> via <code>formatTime()</code> helper; mockup was missing this column</li> <li>Each row now has a <code>*-chain-time</code> id; pending rows show <code>—</code></li> </ul></div> <div class="tl-commit">💾 fix(mockup): add Time column to ClusterHead review chain table — sync impl → mockup</div> </div> </div> <!-- v80 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v80</span> <span class="tl-title">Fix: module-picker workflow chain — update PgM/AM/CEO to Del. SPOC/Sales SPOC/Cluster Head</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-roles">roles</span></div> <div class="tl-desc"><ul> <li>Workflow step badges in the Ups & Downs module card updated: <code>PgM</code> → <code>Del. SPOC</code>, <code>AM</code> → <code>Sales SPOC</code>, <code>CEO</code> → <code>Cluster Head</code></li> <li>Matches the canonical role rename applied across the implementation (EPIC-16 role key mapping: pgm→delivery_spoc, am→sales_spoc, ceo→cluster_head)</li> <li>Implementation <code>ModulePickerScreen.tsx</code> already used the new names; mockup was stale</li> </ul></div> <div class="tl-commit">💾 fix(mockup): update workflow chain role abbreviations to new canonical names</div> </div> </div> <!-- v79 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v79</span> <span class="tl-title">Fix: pm1.test phantom tile replaced — login screen fully canonical</span> <span class="tl-date">13 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-data">seed</span></div> <div class="tl-desc"><ul> <li>The <code>pm1.test@valuelabs.com</code> demo tile showed “Vishnu K R Goluguri” as a standalone PM — but <code>pm1.test</code> has no seed entry; Vishnu’s canonical email is <code>vishnu.test</code></li> <li>Changed <code>onclick</code> to <code>simulateLogin('vishnu.test@valuelabs.com')</code> and relabelled badge to <strong>PM + Delivery SPOC</strong> to reflect the dual role</li> <li>The duplicate <code>vishnu.test</code> tile that previously showed only “Delivery SPOC” remains; the first tile now shows the combined role label for discoverability of the multi-role feature (FEAT-15D)</li> <li>All 19 login tiles now map 1-to-1 to seeded users</li> </ul></div> <div class="tl-commit">💾 fix(mockup): pm1.test tile → vishnu.test with PM+Delivery SPOC badge</div> </div> </div> <!-- v78 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v78</span> <span class="tl-title">Fix: Profile button broken — sidebar-footer div missing from login.html DOM</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">nav</span></div> <div class="tl-desc"><ul> <li>Added <code><div class="sidebar-footer" id="sidebar-footer"></code> inside <code><aside></code> — pins Profile & Sign Out footer to sidebar bottom</li> </ul></div> <div class="tl-commit">💾 fix(mockup): add missing sidebar-footer — Profile button now works</div> </div> </div> <!-- v77 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v77</span> <span class="tl-title">Gap audit: stale role labels in module-picker, priorities-pl, reports; Cluster Head row in CEO chain; currentUser in action buttons</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">screens</span></div> <div class="tl-desc"><ul> <li><strong>screen-module-picker.js</strong>: "POD CEO" → "Cluster Head" (description); "Program Manager, POD CEO" → "Project Manager, Cluster Head" (Available to list)</li> <li><strong>screen-priorities-pl.js</strong>: Priorities & Achievements chain description — "Program Manager → POD Owner → POD CEO" → "Delivery SPOC → Sales SPOC → POD Owner → Cluster Head"</li> <li><strong>screen-reports.js</strong>: comment, return-rate table badge, SVG bar label, SVG comment, SLA footer — all "CEO" → "Cluster Head"; "POD Owner → AM" → "POD Owner → Sales SPOC"</li> <li><strong>screen-ceo.js</strong>: added missing <strong>Cluster Head row</strong> to the 6-level chain table (was 5 rows, now complete); <code>returnReview()</code> hardcoded name → <code>currentUser ? currentUser.name : 'Vish Lakshmanan'</code></li> <li><strong>screen-am.js</strong>: <code>returnReview/approveReview</code> hardcoded "Sekhar Posina" → <code>currentUser ? currentUser.name : …</code></li> <li><strong>screen-pod.js</strong>: <code>returnReview/approveReview</code> hardcoded "Basavaiah Potla" → <code>currentUser ? currentUser.name : …</code></li> <li><strong>screen-priorities-review.js</strong>: header comment chain "AM ↔ POD Owner ↔ CEO" → canonical labels</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(mockup): stale role labels + CEO chain row + currentUser in action buttons</div> </div> </div> <!-- v76 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v76</span> <span class="tl-title">Remove dead screen-program.js — no role routes to it; deliverySpoc uses screen-am by design</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span><span class="tag tag-chore">cleanup</span></div> <div class="tl-desc"><ul> <li>Deleted <code>screens/screen-program.js</code> — file was preloaded but <code>domSlugMap</code> routes <code>deliverySpoc → 'am'</code> so the screen was never rendered</li> <li>Removed <code>'screen-program'</code> from the preload array in <code>app.js</code></li> <li>Removed <code><script src="screens/screen-program.js"></code> from <code>login.html</code></li> </ul></div> <div class="tl-commit">💾 pending commit — chore(mockup): delete dead screen-program.js + remove preload references</div> </div> </div> <!-- v75 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v75</span> <span class="tl-title">Gap audit: stale labels in cycle-detail chain, POD Owner description fix, admin role added to Role Definitions</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">admin</span><span class="tag tag-chore">data</span></div> <div class="tl-desc"><ul> <li><strong>cycles.js</strong>: cycle-detail approval chain labels — <code>'AM'</code> → <code>'Sales SPOC'</code> and <code>'CEO'</code> → <code>'Cluster Head'</code> (stale abbreviations from pre-rename era)</li> <li><strong>admin/index.html Role Definitions</strong>: POD Owner description changed from "POD CEO" → "POD Owner"; <code>Administrator</code> role row added (was the only role missing from the 10-role system)</li> <li><strong>Dead file noted</strong>: <code>screen-program.js</code> is preloaded but no role routes to it — <code>deliverySpoc</code> intentionally uses <code>screen-am</code> per <code>domSlugMap</code></li> </ul></div> <div class="tl-commit">💾 pending commit — fix(mockup): stale chain labels + POD Owner description + admin role in definitions</div> </div> </div> <!-- v74 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v74</span> <span class="tl-title">Gap audit: stale names & badge colors corrected across screens, PMO chain, audit log, notifications, email tokens</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">data</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li><strong>screen-pmo.js</strong>: chain table — James Okafor → Vishnu Kiran Reddy Goluguri (Del. SPOC), Vikram Singh → Basavaiah Potla (POD Owner), Elena Russo → Vish Lakshmanan (Cluster Head)</li> <li><strong>screen-cycle-detail.js</strong>: approved banner — "Elena Russo (POD CEO)" → "Vish Lakshmanan (Cluster Head)"</li> <li><strong>app.js</strong>: notification bell — "James Okafor returned your Priorities & Achievements submission" → "Vishnu Kiran Reddy Goluguri returned…"</li> <li><strong>admin.js SAMPLE_TOKENS</strong>: Anoop Singh → Vish Lakshmanan (<code>clusterHeadName</code>); James Okafor → Vishnu Kiran Reddy Goluguri (<code>deliverySpocName</code>, <code>escalateToName</code>)</li> <li><strong>admin/index.html audit log</strong>: Anoop Singh → Vish Lakshmanan, Vikram Singh → Basavaiah Potla, Sara Nair → Sekhar Posina, James Okafor → Vishnu Kiran Reddy Goluguri; "Forwarded to CEO" → "Forwarded to Cluster Head"; Cluster Head / POD Owner / Sales SPOC badges converted from inline styles to <code>role-badge rb-*</code> classes</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(mockup): stale names + audit log badge colors from gap audit sweep</div> </div> </div> <!-- v73 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v73</span> <span class="tl-title">Org chart: proper CSS branch connectors, canonical rb-* colors, corrected names (Sekhar Posina, Pavani, Devi Alekya)</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li>Replaced hand-coded <code>display:flex</code> org chart with <code>.oc-wrap / .oc-row / .oc-col / .oc-node / .oc-stem</code> CSS class system</li> <li><strong>Branch connectors</strong>: <code>.oc-col::before/::after</code> pseudo-elements with <code>var(--lc)</code> color inheritance draw proper T-junction horizontal bars; <code>:first-child::before</code> and <code>:last-child::after</code> hidden to cap the ends</li> <li><strong>Canonical colors</strong>: Cluster Head <code>#dc2626</code>, POD Owner <code>#ea580c</code>, Delivery SPOC <code>#0d9488</code>, Sales SPOC <code>#2563eb</code>, ESO SPOC <code>#7c3aed</code>, Recruitment SPOC <code>#db2777</code>, PM <code>#b45309</code>, PL <code>#15803d</code></li> <li><strong>Name fixes</strong>: Sara Nair → Sekhar Posina (Sales SPOC), Priya Mehta → Pavani Prathyusha Mulpuru (ESO SPOC), Kiran Babu → Devi Alekya Abburi (Recruitment SPOC)</li> <li><strong>Basavaiah Potla</strong> (POD Basu) and <strong>Ananth Reddy</strong> (POD Ananth) now show with correct POD Owner orange</li> </ul></div> <div class="tl-commit">💾 pending commit — ux(mockup): org chart CSS branch connectors + canonical colors + name corrections</div> </div> </div> <!-- v72 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v72</span> <span class="tl-title">Color sync: rb-* classes across admin Role Definitions, org legend, audit log & Level column; login tile scroller</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">admin</span><span class="tag tag-chore">screens</span></div> <div class="tl-desc"><ul> <li><strong>admin.js</strong>: added <code>labelToKey</code> reverse map + <code>levelBadge()</code> helper; <code>renderReportingRelationships()</code> Level column now uses <code>levelBadge(r.level)</code> for correct per-role color badges</li> <li><strong>Role Definitions table</strong>: all 9 <code><span class="role-badge"></code> → <code>role-badge rb-*</code> (projectLead, pm, deliverySpoc, salesSpoc, esoSpoc, recruitmentSpoc, podOwner, clusterHead, pmoAssociate)</li> <li><strong>Org chart legend</strong>: replaced 8 hard-coded inline <code>background/color</code> styles with <code>role-badge rb-*</code> classes — now tracks the canonical color palette automatically</li> <li><strong>Audit log role badges</strong>: all inline-styled role cells (Project Lead ×4, Project Manager ×2, Delivery SPOC ×1, PMO Associate ×1) converted to <code>role-badge rb-*</code> with size overrides retained</li> <li><strong>screen-login.js</strong>: demo tile grid is now a scrollable 2×4 viewport (<code>max-height:340px; overflow-y:auto; scrollbar-width:thin</code>) — shows 8 tiles at once, rest scroll into view</li> </ul></div> <div class="tl-commit">💾 ux(mockup): sync rb-* role colors across admin + scrollable login tile grid</div> </div> </div> <!-- v71 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v71</span> <span class="tl-title">Cycle modal: remove All day checkbox, Recurring toggle & Until date fields</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li>Removed <strong>All day</strong> checkbox — not applicable to deadline-only cycle scheduling</li> <li>Removed <strong>↻ Recurring</strong> toggle button — all cycles are recurring by definition; panel is always visible</li> <li>Removed <strong>Until</strong> date picker (and clear button) from both weekly and monthly recurring rows — cycles repeat indefinitely until manually closed</li> </ul></div> <div class="tl-commit">💾 pending commit — ux(mockup): remove all-day, recurring toggle, until date from cycle modal</div> </div> </div> <!-- v70 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v70</span> <span class="tl-title">Gap audit: role key sweep across all workflow screens, Priorities & Achievements module & login tiles</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">UX</span><span class="tag tag-chore">screens</span></div> <div class="tl-desc"><ul> <li><strong>screen-am.js</strong>: <code>returnReview / approveReview</code> keys <code>'am'→'salesSpoc'</code>, name Sara Nair→Sekhar Posina, return target <code>'programManager'→'deliverySpoc'</code></li> <li><strong>screen-program.js</strong>: keys <code>'programManager'→'deliverySpoc'</code>, name James Okafor→Vishnu Kiran Reddy Goluguri, approve target <code>'am'→'salesSpoc'</code>; summary chain “PL → PM” → “PL → PM → Del. SPOC”</li> <li><strong>screen-pod.js</strong>: return target <code>'am'→'salesSpoc'</code>, approve target <code>'podCeo'→'clusterHead'</code>, name Vikram Singh→Basavaiah Potla; “CEO”→“Cluster Head” in placeholder and summary chain</li> <li><strong>screen-ceo.js</strong>: return key <code>'podCeo'→'clusterHead'</code>, Elena Russo→Vish Lakshmanan; chain table <code>badge-draft</code>→<code>role-badge rb-*</code> with correct role colors; reviewer names corrected; “CEO Sign-Off Comment”→“Cluster Head Sign-Off Comment”</li> <li><strong>app.js roles config</strong>: salesSpoc Sara Nair→Sekhar Posina; esoSpoc Priya Mehta→Pavani Prathyusha Mulpuru; recruitmentSpoc Kiran Babu→Devi Alekya Abburi</li> <li><strong>app.js finalApprove()</strong>: <code>state.comments.podCeo→clusterHead</code>; hardcoded Elena Russo→<code>currentUser.name</code>; label <code>'CEO COMMENT'→'CLUSTER HEAD COMMENT'</code></li> <li><strong>priorities.js</strong>: <code>priReviewCfg</code> keys <code>programManager→deliverySpoc</code>, <code>am→salesSpoc</code>, <code>podCeo→clusterHead</code> with updated names; <code>showPrioritiesForRole</code>, <code>approvePrioritiesReview</code> statusMap/chainIdMap, <code>nextRoleKey</code> guard, and <code>finalApprovePriorities</code> all updated to match</li> <li><strong>screen-priorities-review.js CEO section</strong>: title/badge “CEO”→“Cluster Head”; bilateral chain table extended with <strong>Sales SPOC row</strong>, names corrected; reporting chain sidebar +Sales SPOC step; return button <code>'podCeo','Elena Russo'→'clusterHead','Vish Lakshmanan'</code>; “CEO Notes”→“Cluster Head Notes”</li> <li><strong>screen-login.js</strong>: added 7 missing demo tiles — Sekhar Posina, Pankaj Singhal, Neelanjana Jaswal (Sales SPOC), Pavani Prathyusha Mulpuru, Shalini (ESO SPOC), Devi Alekya Abburi, Harjeev Kaur Arora (Recruitment SPOC)</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(mockup): gap audit — role key sweep, stale names, Priorities & Achievements module, login tiles</div> </div> </div> <!-- v69 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v69</span> <span class="tl-title">Users: merge dual-role users into one row with role popup</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li>Vishnu, Snehal, Ravi, Suresh each held PM + Delivery SPOC as separate user records — merged into single records with <code>roles: ['deliverySpoc','pm']</code></li> <li>Delivery SPOC is the primary role (higher in approval chain); its email becomes the canonical login email for each user</li> <li>All project <code>deliverySpoc</code> references and reporting-relationship <code>reportId</code>s updated (u5→u3, u14→u4, u15→u25, u16→u26)</li> <li><code>renderUsers()</code>: primary role badge shown; additional roles revealed on hover via <code>.user-roles-more +N</code> chip → <code>.user-roles-popup</code> dropdown</li> <li>Added <code>.user-roles-host / .user-roles-more / .user-roles-popup</code> CSS to <code>admin.css</code></li> </ul></div> <div class="tl-commit">💾 pending commit — ux(mockup): merge dual-role users, show roles in hover popup</div> </div> </div> <!-- v68 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v68</span> <span class="tl-title">Fix: New Cycle modal — broken select dropdowns</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li>Three <code>${'{'}Array.from(...){'}'}</code> JS template literals in static HTML were never evaluated — browser rendered them as literal text, breaking the modal</li> <li>Replaced with pre-written <code><option></code> tags: 48-slot AM/PM time picker (Deadline time), 1–12 interval select (Repeat every), 1–28 day-of-month select (Monthly)</li> </ul></div> </div> </div> <!-- v67 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v67</span> <span class="tl-title">Role color consistency across entire site</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">styles</span></div> <div class="tl-desc"><ul> <li>Added <code>.rb-*</code> per-role color classes to <code>admin.css</code> and <code>styles.css</code> — one canonical color per role</li> <li>Role palette: Cluster Head red, POD Owner orange, Delivery SPOC teal, Sales SPOC blue, ESO SPOC violet, Recruitment SPOC pink, PM amber, PL green, PMO slate, Admin sky</li> <li><code>admin.js</code>: new <code>roleBadge()</code> helper generates <code>.role-badge.rb-*</code> HTML; 3 render sites (PODs, Users, Reminders tables) updated</li> <li><code>app.js</code>: <code>ROLE_TAG_CLASS</code> map wires audit-trail <code>.role-tag</code> chips to <code>.rb-*</code> classes</li> <li><code>screen-login.js</code>: all 7 demo-tile inline badge styles replaced with <code>role-badge rb-*</code> classes</li> <li><code>screen-pmo.js</code>: approval chain level cells updated from <code>badge-draft</code> to <code>role-badge rb-*</code>; AM→Sales SPOC, CEO→Cluster Head labels corrected</li> </ul></div> </div> </div> <!-- v66 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v66</span> <span class="tl-title">Cycle scheduler: single deadline time, no duration or availability</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li>Removed End time field — only a single <strong>Deadline time</strong> picker (AM/PM 30-min intervals)</li> <li>Removed “100% available” badge from time suggestions</li> <li>Suggestions now read <em>Deadline: every Monday at 9:00 AM</em> — no duration suffix</li> <li>All day checkbox now hides only the deadline time field (not an end time)</li> <li>Removed <code>endTime</code> from cycle data schema and <code>saveCycle</code> / <code>openCycleModal</code></li> </ul></div> </div> </div> <!-- v65 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v65</span> <span class="tl-title">Real Sales/ESO/Recruitment SPOCs + Outlook-style cycle scheduler</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">data</span><span class="tag tag-ux">UX</span><span class="tag tag-sprint">Org</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li><strong>Sales SPOC</strong>: Sekhar Posina (P001–P008), Pankaj Singhal (P009–P015), Neelanjana Jaswal (P009 co-SPOC) — replaced Sara Nair / Sanjay Patel placeholders</li> <li><strong>ESO SPOC</strong>: Pavani Prathyusha Mulpuru (POD Basu P001–P010), Shalini (POD Ananth P011–P015) — replaced Priya Mehta placeholder</li> <li><strong>Recruitment SPOC</strong>: Devi Alekya Abburi (POD Basu P001–P010), Harjeev Kaur Arora (POD Ananth P011–P015) — replaced Kiran Babu placeholder</li> <li><strong>admin/admin.js</strong>: u6/u11/u12/u13 renamed; u27/u28/u29 added; project salesSpoc/esoSpoc/recruitmentSpoc fields updated (P009 gets salesSpocCo); RR-022/023/024 added; renderProjects now shows ESO + Recruit SPOC rows + co-SPOC display</li> <li><strong>app.js</strong>: userDirectory SPOC entries updated with 7 real people; old Sara/Priya/Kiran entries replaced</li> <li><strong>cycles.js, screen-pmo.js</strong>: Sara Nair → Sekhar Posina in all demo audit entries</li> <li><strong>PM before PL</strong>: Delivery Roles column now shows PM row above PL row (admin/admin.js renderProjects)</li> <li><strong>Outlook-style Cycle Scheduler</strong>: Full redesign of Add/Edit Cycle modal — Start date, Start/End time AM/PM dropdowns (30-min intervals), All day checkbox, Recurring toggle panel, “Repeat every N [day/week/month/year]”, M T W T F S S day-of-week pill buttons, Until date picker, Time suggestions panel showing recurrence preview with availability badge; JS helpers: <code>onCycleRecurringToggle</code>, <code>toggleCycleDow</code>, <code>onCycleAllDayChange</code>, <code>onCycleTimeChange</code>, <code>updateCycleSuggestions</code>; <code>openCycleModal</code> + <code>saveCycle</code> updated for new schema</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(mockup): real SPOC names + Outlook-style cycle scheduler</div> </div> </div> <!-- v64 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v64</span> <span class="tl-title">PM before PL in Delivery Roles; Outlook-style time picker</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-ux">UX</span><span class="tag tag-chore">admin</span></div> <div class="tl-desc"><ul> <li>PM now listed before PL in the admin Projects table (admin/admin.js renderProjects)</li> <li>“Time (24h)” inputs replaced with 30-min interval AM/PM select dropdowns (admin/index.html)</li> </ul></div> <div class="tl-commit">💾 committed — ux(mockup): PM-first in delivery roles; Outlook-style time selector</div> </div> </div> <!-- v63 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v63</span> <span class="tl-title">Delivery SPOCs mapped as Project Managers for all 15 projects</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">data</span><span class="tag tag-sprint">Org</span><span class="tag tag-sprint">PM</span></div> <div class="tl-desc"><ul> <li>Each project’s PM is now the same person as its Delivery SPOC — Vishnu (P001–P008), Snehal (P009–P010), Ravi (P011), Suresh (P012–P015)</li> <li><strong>app.js</strong>: pm1→Vishnu, pm2→Snehal; pm3/pm4 added for Ravi/Suresh; all projectManagers arrays filled</li> <li><strong>admin/admin.js</strong>: u3→Vishnu-PM, u4→Snehal-PM, u25/u26 added; all projectManagers updated; RR-003/004 removed</li> <li><strong>cycles.js, priorities.js, screens</strong>: all PM display names updated</li> <li><strong>admin/index.html</strong>: org chart PM boxes updated (Daniel→Vishnu, Reema→Snehal)</li> </ul></div> <div class="tl-commit">💾 committed — chore(mockup): map Delivery SPOCs as Project Managers for all projects</div> </div> </div> <!-- v62 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v62</span> <span class="tl-title">Project Leads mapped to all 10 POD Basu projects</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">data</span><span class="tag tag-sprint">Org</span><span class="tag tag-sprint">Project Leads</span></div> <div class="tl-desc"><ul> <li>9 real Project Leads mapped across 10 POD Basu projects (previously all demo placeholder names)</li> <li><strong>PL assignments</strong>: Swati Nandha (APS Bank), Kuntal Singha (Black Sun ×2), Indurthi Hari Babu (Krispy Kreme), Dinesh Kumar Purohit & Anitha Deva (Coventry), Anitha Deva (St Mary’s), Sanjay Kumar (TrakCel), Karthikeyan Ramaswamy (Smart Currency), Rajyalakshmi Palnati & Shabbir Ahmed (Paymentsense), Rajyalakshmi Palnati (Novatiq)</li> <li><strong>app.js</strong>: projectDirectory projectLeads arrays updated (P001–P010); userDirectory pl1→Swati, pl2→Dinesh, pl3–pl9 new; teamMembers, items, notifications updated</li> <li><strong>admin/admin.js</strong>: u1/u2 renamed, u17–u23 added; project records updated; 9 new reportingRelationships; SAMPLE_TOKENS updated</li> <li><strong>admin/index.html, cycles.js, priorities.js, screens</strong>: all PL display names updated</li> </ul></div> <div class="tl-commit">💾 committed — chore(mockup): map real Project Leads to all POD Basu projects</div> </div> </div> <!-- v61 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v61</span> <span class="tl-title">PMO Associate renamed — Chenchireddy Gari Dilip Kumar Reddy mapped to POD Basu</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">data</span><span class="tag tag-sprint">Users</span><span class="tag tag-sprint">POD Basu</span></div> <div class="tl-desc"><ul> <li><strong>app.js</strong>: PMO Associate renamed from “Chris Park” to <strong>Chenchireddy Gari Dilip Kumar Reddy</strong> in users login list and ROLE_META display name</li> <li><strong>admin/admin.js</strong>: user record u9 already carried the correct name; project list scoped to POD Basu (P001–P010)</li> <li><strong>screens/screen-login.js</strong>: quick-login button label updated</li> </ul></div> <div class="tl-commit">💾 committed — chore(mockup): map Dilip Kumar Reddy as PMO Associate under POD Basu</div> </div> </div> <!-- v60 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v60</span> <span class="tl-title">Role-key rename sync — Delivery SPOC / Sales SPOC / Cluster Head</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">refactor</span><span class="tag tag-sprint">Roles</span><span class="tag tag-sprint">Parity</span></div> <div class="tl-desc"><ul> <li><strong>Status values synced to the renamed real-app enum</strong>: <code>pgm_approved → delivery_spoc_approved</code>, <code>am_approved → sales_spoc_approved</code>, <code>ceo_approved → cluster_head_approved</code> (app.js CYCLE_STATUS_CONFIG, approveReview map, finalApprove)</li> <li><strong>Stepper completed-counts remapped</strong>: <code>delivery_spoc_approved</code> now completes the Del. SPOC step (3 done); <code>sales_spoc_approved</code> has no dedicated step in the 5-step mockup stepper (3 done)</li> <li><strong>Display labels</strong>: “Program Manager” → “Delivery SPOC”, “Sales / Account Manager” → “Sales SPOC”, “POD CEO” → “Cluster Head” across app.js, priorities.js, cycles.js, admin.js, index.html and screen templates (12 files)</li> <li>Internal camelCase wiring keys (<code>deliverySpoc / salesSpoc / clusterHead</code>, legacy <code>programManager</code>, DOM slugs) unchanged — already aligned or wiring-only</li> </ul></div> <div class="tl-commit">💾 committed — refactor(roles): rename pgm/am/ceo to delivery_spoc/sales_spoc/cluster_head</div> </div> </div> <!-- v59 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v59</span> <span class="tl-title">Priorities & Achievements 8-category alignment (GAP-6 / AzDO #810)</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Priorities & Achievements</span><span class="tag tag-sprint">Parity</span></div> <div class="tl-desc"><ul> <li><strong>priorities.js PRI_CATEGORIES</strong>: 8-category metadata matching the real-app <code>PriorityCategory</code> enum — <code>ai, delivery, growth, other, hiring, client, skills, process</code>; new <code>priCategoryBadge()</code> renders a coloured category badge on every priority item (PL, review and Cluster Head digest screens)</li> <li><strong>Category key rename</strong>: mockup <code>aide</code> → canonical <code>ai</code> across data, checks, add flow and checklist</li> <li><strong>screen-priorities-pl.js</strong>: added missing <code>growth</code> option to the add-priority selector (now all 8 incl. the dedicated AiDE row); new “Filter by category” bar above the priorities list (counts stay on the full set)</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(pa): 8-category alignment — badges, filter bar, ai key (AzDO #810)</div> </div> </div> <!-- v58 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v58</span> <span class="tl-title">Full 8-value cycle status enum (GAP-36 / AzDO #801)</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Workflow</span><span class="tag tag-sprint">Parity</span></div> <div class="tl-desc"><ul> <li><strong>app.js CYCLE_STATUS_CONFIG</strong>: canonical 8-value status enum matching the real-app <code>CycleStatus</code> — <code>draft, pl_submitted, pm_submitted, pgm_approved, am_approved, pod_approved, ceo_approved, returned</code> (replaces ad-hoc <code>draft / pl-submitted / program-review / approved</code>)</li> <li><strong>Transitions</strong>: <code>submitPL()</code> → <code>pl_submitted</code>; <code>submitPM()</code> → <code>pm_submitted</code>; <code>approveReview()</code> sets <code>am_approved / pod_approved</code> per level; <code>finalApprove()</code> → <code>ceo_approved</code>; all returns → <code>returned</code> (re-entry at the returning level)</li> <li><strong>Status pills</strong>: shared <code>cycleStatusBadge()</code> helper renders label + colour per status; PMO workflow pill now covers all 8 states; new <code>.badge-returned</code> amber style in styles.css</li> <li><strong>Stepper</strong>: <code>updateStepper()</code> completed checkmarks now driven by cycle status (<code>statusCompletedSteps()</code>) — active highlight still follows the viewing role</li> <li><strong>submitPM()</strong>: fixed stale <code>setRole('programManager')</code> (role removed in v56) → forwards to <code>deliverySpoc</code>; toast + audit text updated</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(mockup): full 8-value cycle status enum — pills, stepper, returned banner (AzDO #801)</div> </div> </div> <!-- v57 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v57</span> <span class="tl-title">Sync real-app features into admin mockup</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin</span><span class="tag tag-sprint">Sync</span></div> <div class="tl-desc"><ul> <li><strong>Reporting hierarchy</strong>: replaced stale Anoop Singh / Vikram Singh visualization with real org — Vish Lakshmanan (Cluster Head) → POD Basu (Basavaiah Potla) and POD Ananth (Ananth Reddy) with full SPOC / PM / PL chains</li> <li><strong>Scheduler KPI strip</strong>: added 4-card stat row (Active Cycles, Archived Cycles, Active Reminders, Disabled Reminders) above the cycles/reminders grid; <code>renderScheduler()</code> populates from live <code>adminState</code></li> <li><strong>Scheduler Global Settings</strong>: added “Disable All Automation” master kill switch (amber warning style); renamed “Auto-close cycle after CEO approval” → “Auto-Create Cycles” and “CC Delivery SPOC on all escalations” → “Send Notifications (email)” to match real app labels</li> <li><strong>MCP Log stats</strong>: expanded 4-card row to 5 cards — Total Calls, Success (2xx/3xx), Client Errors (4xx), Server Errors (5xx), Avg Duration (ms) — matching <code>AdminMcpLogScreen.tsx</code></li> <li><strong>Token modal — service account tab</strong>: added two-tab UI “Existing user” / “New service account”; new tab has Name, Description, Scope, Expiry fields with a warning note; <code>switchTokenTab()</code> wired to toggle panels</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(mockup): sync real-app features — scheduler KPIs, MCP log stats, token service account tab</div> </div> </div> <!-- v56 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v56</span> <span class="tl-title">Full navigation audit & fix — all 12 broken paths resolved</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Mockup</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>app.js roles[]</strong>: pointed <code>deliverySpoc / salesSpoc / esoSpoc / recruitmentSpoc</code> to <code>screen-am</code> (reuse existing review DOM); pointed <code>clusterHead</code> to <code>screen-ceo</code> — eliminates 5 missing-screen crashes</li> <li><strong>app.js domSlugMap</strong>: all SPOC roles map to slug <code>am</code>; <code>clusterHead</code> maps to slug <code>ceo</code> — makes <code>renderReviewScreen()</code> find the right DOM elements</li> <li><strong>app.js renderScreen()</strong>: added cases for <code>deliverySpoc</code>, <code>salesSpoc</code>, <code>esoSpoc</code>, <code>recruitmentSpoc</code>, <code>clusterHead</code>; removed dead <code>podCeo</code> and <code>programManager</code> cases</li> <li><strong>app.js renderAllScreens()</strong>: replaced stale <code>programManager</code> / <code>am</code> render calls with <code>deliverySpoc</code></li> <li><strong>app.js cfgMap</strong>: replaced old <code>programManager / am</code> entries with <code>deliverySpoc / salesSpoc / esoSpoc / recruitmentSpoc</code></li> <li><strong>app.js project card</strong>: renamed “Account Mgr” column + field reference <code>p.am</code> → <code>p.deliverySpoc</code> “Delivery SPOC”</li> <li><strong>app.js selectProject()</strong>: fixed <code>state.account.am = project.am</code> → <code>state.account.deliverySpoc = project.deliverySpoc</code></li> <li><strong>app.js deep-link roleEmail map</strong>: replaced 4 non-existent emails (<code>pgm / am / podowner / ceo</code>) with real org emails; fixed <code>ACC-001</code> → <code>P001</code> throughout</li> <li><strong>screens/screen-projects.js</strong>: fixed POD filter options from “POD Alpha / POD Beta” → “POD Basu / POD Ananth”</li> <li><strong>admin/admin.js navigateTo()</strong>: added <code>case 'reports'</code> and <code>case 'audit-log'</code> so those nav items activate their sections instead of being no-ops</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(mockup): full navigation audit — 12 broken paths resolved</div> </div> </div> <!-- v55 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v55</span> <span class="tl-title">Fix: “Open Project” crash — null sidebar identity elements</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Mockup</span></div> <div class="tl-desc"><ul> <li><strong>app.js</strong> <code>setRole()</code>: added null guards on <code>sidebar-user-name</code>, <code>sidebar-user-role</code>, <code>sidebar-avatar</code> — these elements were removed in v53 (sidebar footer removal) but the code still called <code>.textContent</code> on them unconditionally, throwing a TypeError that prevented <code>switchScreen()</code> from ever running, leaving the project selector frozen on screen after “Open Project” was clicked</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(app): null-guard sidebar identity elements in setRole()</div> </div> </div> <!-- v54 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v54</span> <span class="tl-title">Collapsible org hierarchy tree in admin portal</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html</strong>: added “🌳 Org Hierarchy” nav item and full section with search box, Expand All / Collapse All controls, and role-colour legend</li> <li><strong>admin/admin.js</strong>: added <code>renderOrgTree()</code>, <code>toggleOrgNode()</code>, <code>expandAllOrgNodes()</code>, <code>collapseAllOrgNodes()</code>, <code>filterOrgTree()</code> — builds tree from <code>adminState.reportingRelationships</code>; cluster head is root, click ▶/▼ to expand/collapse branches; search highlights matches and auto-expands tree</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(admin): collapsible org hierarchy tree with search and role badges</div> </div> </div> <!-- v53 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v53</span> <span class="tl-title">Remove sidebar footer identity card + Profile/Sign Out buttons from login.html</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Mockup</span></div> <div class="tl-desc"><ul> <li><strong>login.html</strong>: removed <code>.sidebar-footer</code> block — identity card (avatar, name, role) and Profile / Sign Out action row deleted from sidebar; matches implementation which already removed this in v47 for the admin portal</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(mockup): remove sidebar footer identity card from login.html</div> </div> </div> <!-- v52 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v52</span> <span class="tl-title">PODs renamed to POD Basu and POD Ananth</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-data">data</span><span class="tag tag-sprint">Mockup</span></div> <div class="tl-desc"><ul> <li><strong>admin/admin.js</strong> + <strong>app.js</strong>: "POD Alpha" renamed to <strong>POD Basu</strong> (Basavaiah Potla's POD); "POD Beta" renamed to <strong>POD Ananth</strong> (Ananth Reddy's POD) — all project records, pod records, and state references updated</li> </ul></div> <div class="tl-commit">💾 pending commit — chore(mockup): rename PODs to POD Basu and POD Ananth</div> </div> </div> <!-- v51 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v51</span> <span class="tl-title">Real org data — 15 live projects, 4 Delivery SPOCs, 2 POD Owners, Cluster Head (Vish Lakshmanan's cluster)</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-data">data</span><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Mockup</span></div> <div class="tl-desc"><ul> <li><strong>Org data sourced from ValueLabs Re-Org document</strong> — Vish Lakshmanan cluster; POD Alpha: Basavaiah Potla (POD Owner); POD Beta: Ananth Reddy (POD Owner); Cluster Head: Vish Lakshmanan</li> <li><strong>15 real projects</strong> mapped to Delivery SPOCs: Vishnu Kiran Reddy Goluguri (8 projects — APS Bank, Black Sun Technology Services, Krispy Kreme UK Ltd, Coventry University, BLACK SUN PLC, Saint Mary's University, TrakCel Limited, Smart Currency Exchange Ltd), Snehal Sandeep Chougule (2 — Paymentsense Ltd, Novatiq Limited), Ravi Thalupula (1 — Globalisation Partners), Suresh Jamma (4 — Maxica, TFS Buying Ltd, MagicLeague, MagicBooking)</li> <li><strong>admin/admin.js</strong>: users array fully replaced with real names + <code>.test@valuelabs.com</code> emails; 15 projects replace 4 placeholder projects; POD records updated; scheduler cycles reference real project IDs (P001–P015); reporting relationships expanded to 14 entries covering all SPOC → POD Owner → Cluster Head chains</li> <li><strong>app.js</strong>: <code>projectDirectory</code> replaced with 15 real projects; <code>userDirectory</code> updated with real Delivery SPOC and POD Owner entries; <code>state.account</code> set to APS Bank / Basavaiah Potla / Vish Lakshmanan</li> <li><strong>screen-login.js</strong>: demo tiles updated — 4 real Delivery SPOCs, 2 POD Owners, Vish Lakshmanan as Cluster Head; long names abbreviated in tile display (e.g. "Vishnu K R Goluguri")</li> <li><strong>cycles.js</strong>: audit trail names updated — Vishnu Kiran Reddy Goluguri (Delivery SPOC), Basavaiah Potla (POD Owner), Vish Lakshmanan (Cluster Head / approver)</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(mockup): real org data — 15 projects, Vish Lakshmanan cluster</div> </div> </div> <!-- v50 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v50</span> <span class="tl-title">Login page visual redesign — matches live app style (dark navy, white card, name + role pill tiles)</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Mockup</span></div> <div class="tl-desc"><ul> <li><strong>screen-login.js</strong>: complete visual rewrite based on live app at <code>/PODGovernance_Dev/login</code> — dark navy background (<code>#1a1f3a</code>), hexagonal PG logo with DEV badge sitting above the white card, white card with no coloured header gradient, clean form layout with blue alert box, blue CTA button, and footer below the card</li> <li>Demo quick-login tiles redesigned: each shows bold name on top with a full-text coloured pill badge below (e.g. "Project Lead", "Delivery SPOC", "Cluster Head") — matching the live app tile pattern; hover state adds blue border glow</li> <li>12 demo tiles covering all new org roles: System Admin, Project Lead ×2, Project Manager ×2, Delivery SPOC, Sales SPOC, ESO SPOC, Recruitment SPOC, POD Owner, Cluster Head, PMO Associate</li> <li>Badge colours: Project Lead green, Project Manager orange, Delivery SPOC teal, Sales SPOC amber, ESO SPOC sky-blue, Recruitment SPOC violet, POD Owner purple, Cluster Head red, PMO Associate slate</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(mockup): login page visual redesign matching live app style</div> </div> </div> <!-- v49 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v49</span> <span class="tl-title">Org hierarchy redesign — Delivery/Sales/ESO/Recruitment SPOCs + Cluster Head replace old PgM / AM / POD CEO chain</span> <span class="tl-date">12 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-data">data</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li>New reporting chain: <strong>Cluster Head → POD Owner → Delivery SPOC / Sales SPOC / ESO SPOC / Recruitment SPOC → Project Manager → Project Lead</strong>; Sales, ESO and Recruitment SPOCs have no downward delivery reportees; POD Owner and Cluster Head auto-inherit all projects in their POD / cluster</li> <li><strong>admin/admin.js</strong>: replaced <code>podCeo</code> / <code>programManager</code> / <code>am</code> role keys throughout — new roles array (9 roles), updated <code>adminState.users</code> (Anoop Singh/Cluster Head, James Okafor/Delivery SPOC, Sara Nair/Sales SPOC, Priya Mehta/ESO SPOC, Kiran Babu/Recruitment SPOC), <code>adminState.pods</code> gains <code>clusterHead</code> field, <code>adminState.reportingRelationships</code> rebuilt with 9 entries, email templates updated with new tokens</li> <li><strong>admin/index.html</strong>: org hierarchy visualisation, role filter dropdowns, POD table (6 cols with Cluster Head), audit log entries, invite modal roles — all updated to new hierarchy</li> <li><strong>app.js</strong>: <code>userDirectory</code> — replaced pgm/am/ceo entries with 4 new SPOC emails + <code>clusterhead.test@valuelabs.com</code>; <code>roles</code> array rebuilt (deliverySpoc step 2, podOwner step 3, clusterHead step 4, SPOC variants step null); <code>getUserProjects()</code> updated; <code>domSlugMap</code> and <code>state.comments</code> updated</li> <li><strong>login.html</strong>: sidebar role-switcher — replaced 3 old nav links with 6 new (Delivery SPOC, Sales SPOC, ESO SPOC, Recruitment SPOC, POD Owner, Cluster Head); workflow stepper trimmed from 6 steps to 5 (Proj. Lead → Proj. Mgr → Del. SPOC → POD Owner → Cluster Head)</li> <li><strong>cycles.js</strong>: all audit-trail role strings updated — "Program Manager" → "Delivery SPOC", "Sales / Account Manager" → "Sales SPOC", "POD CEO" → "Cluster Head"; Elena Russo → Anoop Singh in approved-by and audit who fields; forwarding action strings updated throughout</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(mockup): org hierarchy redesign — SPOC roles + Cluster Head</div> </div> </div> <!-- v48 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v48</span> <span class="tl-title">Build version number displayed on all pages (YYYY.MM.DD.xxxx)</span> <span class="tl-date">11 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">CI/CD</span></div> <div class="tl-desc"><ul> <li><strong>azure-pipelines.yml</strong>: added <code>BUILD_SEQ</code> pipeline variable using <code>$[counter('pod-governance-build', 1)]</code> — ever-increasing sequence that never resets regardless of date; <code>setver</code> step in <code>DetectChanges</code> computes <code>YYYY.MM.DD.xxxx</code>, updates the AzDO build number, and exports <code>APP_VERSION</code>; <code>VITE_APP_VERSION</code> passed to all three Vite builds (UAT / Dev / QA); <code>PackageMockupSeq</code> generates <code>version.js</code> in the mockup artifact</li> <li><strong>NavBar.tsx</strong> + <strong>AdminTopNav.tsx</strong>: tiny monospace version label (<code>9px</code>, <code>rgba(255,255,255,.38)</code>) appended to brand text — visible on every authenticated page</li> <li><strong>mockup/version.js</strong>: new file — placeholder shows <code>vlocal</code> when served outside CI; CI overwrites it with the real <code>YYYY.MM.DD.xxxx</code> string that injects a fixed-position bottom-right badge on every mockup page</li> <li><strong>login.html</strong>, <strong>index.html</strong>, <strong>history.html</strong>, <strong>admin/index.html</strong>: each loads <code>version.js</code> (or <code>../version.js</code> for admin) before <code></body></code></li> </ul></div> <div class="tl-commit">💾 pending commit — feat(ci): build version YYYY.MM.DD.xxxx displayed on all pages</div> </div> </div> <!-- v47 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v47</span> <span class="tl-title">Remove duplicated sidebar footer identity card</span> <span class="tl-date">11 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html</strong>: removed <code>.sidebar-footer</code> block (identity card + Profile / Sign Out action row) from the sidebar — duplicated info already present in the top nav bar</li> <li><strong>admin/admin.css</strong>: removed <code>.sidebar-footer</code>, <code>.sidebar-user</code>, <code>.sidebar-user-*</code>, <code>.sidebar-footer-actions</code>, <code>.sidebar-footer-btn</code> rule-sets</li> <li><strong>AdminLayout.tsx</strong>: removed sidebar-footer JSX block; dropped unused <code>useNavigate</code>, <code>Link</code>, <code>useAuth</code>, <code>getInitials</code>, <code>initials</code>, <code>roleLabel</code>, <code>handleSignOut</code></li> <li><strong>custom.css</strong>: removed matching sidebar-footer CSS rule-sets</li> <li><strong>AdminLayout.test.tsx</strong>: removed 6 sidebar-footer tests that tested now-deleted UI</li> </ul></div> <div class="tl-commit">💾 feat(ci): build version YYYY.MM.DD.xxxx displayed on all pages</div> </div> </div> <!-- v46 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v46</span> <span class="tl-title">Export CSV for Projects and PODs screens</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Export</span></div> <div class="tl-desc"><ul> <li><strong>screen-projects.js</strong>: added “⬇ Export CSV” button to the search/filter toolbar; exports the currently-filtered project list (Project Name, POD, Cycle Type, Status) as <code>pod-governance-projects.csv</code></li> <li><strong>app.js</strong>: added <code>exportProjectsCsv()</code> — respects active search + POD filter, client-side Blob CSV, shows toast on completion</li> <li><strong>admin/index.html</strong>: added “⬇ Export CSV” button alongside “+ Add POD” in the PODs card header</li> <li><strong>admin/admin.js</strong>: added <code>exportPodsCsv()</code> — respects active search + status filter, exports POD Name, POD Owner, Projects, Status as <code>pod-governance-pods.csv</code></li> <li><strong>React</strong>: <code>ProjectsScreen.tsx</code> + <code>AdminPodsScreen.tsx</code> updated with matching client-side CSV export logic + disabled state when no rows</li> </ul></div> <div class="tl-commit">💾 pending commit — feat(ux): CSV export for Projects and PODs screens</div> </div> </div> <!-- v45 — done --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v45</span> <span class="tl-title">Admin sidebar footer: identity card + Profile / Sign Out buttons</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>admin/index.html</strong>: replaced bare “POD Governance v1.0” text in sidebar footer with identity card (<code>.sidebar-user</code>) + Profile / Sign Out action row (<code>.sidebar-footer-actions</code>) — mirrors the workflow mockup sidebar footer and the updated React <code>AdminLayout</code></li> <li><strong>admin/admin.css</strong>: added <code>.sidebar-user</code>, <code>.sidebar-user-avatar/info/name/role/chevron</code>, <code>.sidebar-footer-actions</code>, <code>.sidebar-footer-btn.is-profile</code>, <code>.sidebar-footer-btn.is-signout</code> — exact same tokens as workflow <code>styles.css</code> (profile: <code>#dbeafe</code> text; signout: <code>#fca5a5</code> text, red border)</li> <li>Also bumped <code>.sidebar-footer</code> from plain text style to flex-column container matching <code>custom.css</code></li> </ul></div> <div class="tl-commit">💾 pending commit — feat(ux): admin sidebar footer identity card + Profile/Sign Out buttons</div> </div> </div> <!-- v44 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v44</span> <span class="tl-title">Color contrast fixes: admin badge, avatar, nav pills — WCAG AA sync</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">ux</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>Admin role badge</strong>: changed <code>.navbar-role-badge--admin</code> from <code>rgba(232,160,32,0.55)</code> semi-transparent amber + <code>var(--primary)</code> navy text (contrast ~1.2–1.7:1 ❌) to solid <code>#e8a020</code> amber + <code>#1a3c5e</code> dark-navy text (4.74:1 ✓) in both <code>custom.css</code> and <code>admin.css</code></li> <li><strong>NavBar avatar</strong>: changed initials text from <code>var(--primary)</code> (#2563a8, 2.6:1 ❌) to <code>var(--primary-dark)</code> (#1a3c5e, 4.74:1 ✓) on amber background</li> <li><strong>Sign Out pill (workflow NavBar)</strong>: replaced frosted-light background (<code>rgba(255,255,255,0.10)</code>, ~3.9:1 ❌) with dark overlay (<code>rgba(0,0,0,0.12)</code>) and full white text (7.5:1 ✓); border strengthened to 0.30 opacity</li> <li><strong>Profile label</strong>: raised opacity from 0.85 → 0.95 for stronger white on blue</li> <li><strong>Admin topnav Profile/Sign Out buttons</strong>: raised text opacity from 0.6 → 0.85 and border from 0.15 → 0.25 in both <code>custom.css</code> and <code>admin.css</code></li> <li><strong>Mockup admin topnav parity</strong>: added <code>.topnav-role-badge--admin</code> pill to <code>admin/index.html</code> topnav; added <code>.topnav-role-badge</code> / <code>.topnav-role-badge--admin</code> styles to <code>admin.css</code> matching the React implementation</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(ux): WCAG AA color contrast for navbar badges, avatar, and action buttons</div> </div> </div> <!-- v43 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v43</span> <span class="tl-title">Env overlay on all SPA screen logos (login, auth, module-picker, projects)</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>Added <code>class="pg-env-icon"</code> to the PG logo div in <code>screen-login.js</code>, <code>screen-auth.js</code> (both verify & activate), <code>screen-module-picker.js</code>, and <code>screen-projects.js</code></li> <li>New <code>_makeEnvOverlay()</code> helper + <code>stampEnvIcons()</code> in <code>app.js</code> — called after <code>loadScreens()</code> so all screen HTML is in the DOM before stamping</li> <li><code>style.css</code>: <code>.pg-env-icon { position:relative; overflow:visible }</code> anchors the overlay without touching inline styles</li> <li>All 8 PG logo instances across the mockup now show DEV / QA / UAT / LOCAL at the bottom of the hex</li> </ul></div> <div class="tl-commit">💾 pending commit</div> </div> </div> <!-- v42 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v42</span> <span class="tl-title">Env overlay on all pages — history.html gets inline badge script</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>Added env-detection inline script to <code>history.html</code> targeting <code>.hist-logo</code> — same URL param + file:// detection, same bottom-centre pill overlay as <code>index.html</code> and <code>login.html</code></li> <li>All four mockup pages now show the DEV / QA / UAT / LOCAL overlay on the PG hex logo</li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v41 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v41</span> <span class="tl-title">Remove orange dot from PG logo in all three pages</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>Removed the hardcoded <code><circle fill="#e8a020"/></code> from the PG hexagon SVG in <code>login.html</code>, <code>index.html</code>, and <code>history.html</code> — env overlay badge makes it redundant</li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v40 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v40</span> <span class="tl-title">Env overlay on index.html landing-page logo</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li><code>index.html</code> inline env script now supports <code>?env=dev|qa|uat|local</code> URL param and treats empty hostname (<code>file://</code>) as LOCAL — same detection logic as <code>app.js</code></li> <li>Env tag pill overlaid directly on the <code>.index-logo</code> hex (bottom-centre, bright colour, dark text) in addition to the existing <code>.index-meta-row</code> badge</li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v39 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v39</span> <span class="tl-title">Env badge: URL param override + file:// hostname support</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li><code>ENV_CONFIG</code> now accepts a <strong><code>?env=dev|qa|uat|local</code></strong> URL parameter — overrides hostname detection, so the overlay is visible when opening <code>index.html</code> directly as a <code>file://</code> URL</li> <li>Empty hostname (<code>file://</code> protocol) is now treated as <code>LOCAL</code>, so the badge also shows without any param when running locally</li> <li>Lookup order: URL param → hostname → null (production)</li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v38 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v38</span> <span class="tl-title">Env overlay badge on logo icon (sidebar hex + admin topnav)</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>DEV / QA / UAT / LOCAL tag now renders as a small pill <strong>overlaid on the logo hex icon</strong> itself — bottom-centre, bright background with dark text, no extra sidebar space consumed</li> <li>Main app (<code>app.js</code>): <code>applyEnvBadge()</code> injects <code>.env-logo-overlay</code> span inside <code>.sidebar-logo .logo-icon</code> using absolute positioning</li> <li>Admin portal (<code>admin.js</code>): new <code>ADMIN_ENV_CONFIG</code> + <code>applyAdminEnvBadge()</code> applies the same overlay to <code>.topnav-logo</code></li> <li><code>style.css</code>: <code>.sidebar-logo .logo-icon</code> gains <code>position:relative; overflow:visible</code> to anchor the overlay without clipping</li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v37 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v37</span> <span class="tl-title">Environment name label on log screens (MCP Log + Audit Log)</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-ux">ux</span></div> <div class="tl-desc"><ul> <li>Added a prominent <strong>DEV / QA / UAT</strong> environment label strip at the top of the MCP Interaction Log and System Audit Log sections</li> <li>Label shows environment name in bold uppercase with a left-accent border and tinted background — visible at a glance without relying on color alone</li> <li>React: <code>AdminMcpLogScreen</code> and <code>AdminAuditLogScreen</code> read <code>getEnvConfig()</code>; banner is hidden on production (no env config)</li> <li>Mockup: static DEV label added to both admin log sections in <code>index.html</code></li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v36 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v36</span> <span class="tl-title">IST timezone annotations — admin.js scheduled-time labels</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span><span class="tag tag-chore">timezone</span></div> <div class="tl-desc"><ul> <li>All hardcoded scheduled times in <code>admin.js</code> now carry an explicit <strong>IST</strong> suffix (e.g. <code>'Every Monday 08:00 IST'</code>) — aligns the static mockup with the timezone-aware React app</li> <li>Reminder triggers updated: R-005 (08:00 IST), R-006 (11:00 IST), R-009 (18:00 IST), R-010 (09:00 IST)</li> <li>Email template triggers updated: ET-007, ET-008, ET-011, ET-012 — all four cron-fired Priorities & Achievements templates</li> <li>Usage-stats <code>lastSent</code> labels updated: ET-007 <code>Mon 08:00 IST</code>, ET-008 <code>Mon 11:00 IST</code>, ET-011 <code>Mon 18:00 IST</code></li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v35 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v35</span> <span class="tl-title">FUTURE-05: Analytics dashboard — SVG charts + SLA Metrics</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-chore">analytics</span></div> <div class="tl-desc"><ul> <li>Added <strong>table ↔ chart view toggles</strong> to three panels: Ups & Downs Trend (bar chart), Return Rate by Stage (horizontal bar chart), Priorities & Achievements Completion (line chart) — zero external chart dependencies, pure inline SVG</li> <li>Trend panel opens in <strong>chart view by default</strong> in the mockup; all three panels start in table view in the React implementation</li> <li>New <strong>⏱️ Approval SLA Metrics card</strong>: avg / fastest / slowest approval time + % within 3-day SLA target, derived from existing trend data — no new API calls</li> <li>SVG charts: <code>UdBarChart</code> (green/red grouped bars), <code>PaLineChart</code> (purple line + dots, SLA target dashed line), <code>ReturnHBarChart</code> (orange horizontal bars)</li> <li>25 new tests cover toggle state, chart rendering, SLA tile values, and all colour-variant branches</li> </ul></div> <div class="tl-commit">💾 <a href="https://github.com/ValueLabs/PODGovernance/commit/7a7cfb8" target="_blank" rel="noopener noreferrer">7a7cfb8</a></div> </div> </div> <!-- v34 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v34</span> <span class="tl-title">Hex SVG logo mark + environment badge system</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-chore">branding</span></div> <div class="tl-desc"><ul> <li>Replaced the plain "PG" text square with a <strong>pointy-top hexagon SVG mark</strong> (navy fill, gold accent dot) in the sidebar, index, and history header — single SVG, no image file</li> <li>Added <strong>environment badge system</strong> to <code>app.js</code>: auto-detects LOCAL / DEV / UAT / QA from hostname, injects a coloured pill below the sidebar logo and prefixes the page title — production shows nothing</li> <li>Same detection script inlined in <code>index.html</code> (no <code>app.js</code> on that page)</li> <li>Email layout: single <code>emailLayout()</code> wrapper in <code>email.ts</code> — one logo source for all transactional emails, no per-template duplication</li> </ul></div> <div class="tl-commit">💾 6de0921</div> </div> </div> <!-- v33 — done --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v33</span> <span class="tl-title">Admin Users: Export CSV button on Users & Roles</span> <span class="tl-date">10 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin / Users & Roles</span></div> <div class="tl-desc"><ul> <li>Added <strong>⬇️ Export CSV</strong> button to the User Directory header (next to Invite User) — exports the currently-filtered users list</li> <li>CSV columns: Name, Email, Roles, Projects, Status — roles and projects rendered as display labels joined with "; "</li> <li>Respects the active search / role / status filters; shows a toast with the exported count, and warns when there are no users</li> <li>Mirrors the React <code>AdminUsersScreen</code> export added in the same change (mockup/impl parity)</li> </ul></div> <div class="tl-commit">💾 committed</div> </div> </div> <!-- v32 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v32</span> <span class="tl-title">Profile: AiDE (VS Code) tab first in MCP guide</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Profile / MCP Setup</span></div> <div class="tl-desc"><ul> <li>Reordered MCP guide client tabs so <strong>AiDE (VS Code)</strong> appears first (was third), followed by Claude Desktop then Claude Code CLI</li> <li>AiDE tab is now the active default on page load in both mockup and React implementation</li> </ul></div> <div class="tl-commit">💾 pending commit</div> </div> </div> <!-- v31 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v31</span> <span class="tl-title">Admin Users: sync React implementation to mockup layout</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin / Users & Roles</span></div> <div class="tl-desc"><ul> <li>Combined Name + Email into a single <strong>User</strong> column with initials avatar (matches mockup user-avatar style)</li> <li>Removed separate Email and Joined columns — table is now User | Roles | Projects | Status | Actions (5 columns, matches mockup)</li> <li>Action buttons changed to icon-only (✏️ edit, ⏸/▶️ toggle) with <code>title</code> tooltips for accessibility</li> <li>Role Definitions panel updated: Role column now shows role badge, added Permissions column, removed raw key column — matches mockup columns (Role / Description / Permissions)</li> <li><code>am</code> label corrected to "Sales / Account Manager" throughout (was "Account Manager") to match mockup</li> </ul></div> <div class="tl-commit">💾 feat(admin-users): sync React implementation to mockup layout (combined user col, icon buttons, role defs permissions)</div> </div> </div> <!-- v30 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v30</span> <span class="tl-title">Admin Users: project badge tooltip shows only role chips, no repeated project name</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Admin / Users & Roles</span></div> <div class="tl-desc"><ul> <li>Removed the redundant project name heading from the hover tooltip on project badges — the name is already visible in the badge itself; tooltip now shows only the role chips (e.g. "Project Lead")</li> <li>Same change applied to React <code>AdminUsersScreen.tsx</code> — <code><strong>{pr.projectName}</strong></code> removed from the tooltip, roles-only display</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(admin-users): tooltip shows roles only, remove redundant project name heading</div> </div> </div> <!-- v29 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v29</span> <span class="tl-title">Admin Users: project badge tooltip shows project name instead of raw ID</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Admin / Users & Roles</span></div> <div class="tl-desc"><ul> <li>Hover tooltip on project badges in the Users & Roles grid now shows the full project name (e.g. "Accenture Federal Services") instead of the raw project ID (e.g. "ACC-001") — matches React implementation after fix commit 89888fd</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(admin-users): show project name in badge tooltip instead of raw ID</div> </div> </div> <!-- v28 --> <div class="tl-entry"> <div class="tl-dot"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver">v28</span> <span class="tl-title">Profile: MCP config snippets use published site URL instead of localhost</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Profile / MCP</span></div> <div class="tl-desc"><ul> <li>All three MCP guide snippets (Claude Desktop, Claude Code CLI, AiDE) now show the deployed API URL (<code>window.location.origin/PODGovernance_Staging/api/v1</code>) instead of the hardcoded <code>localhost:3001</code> placeholder</li> <li>React <code>ProfileScreen.tsx</code> derives the URL dynamically via <code>VITE_API_BASE_URL</code> or <code>BASE_URL+api/v1</code> fallback — same logic as <code>apiClient.ts</code> — ensuring correctness across local dev, staging, and production</li> </ul></div> <div class="tl-commit">💾 pending commit — fix(profile): use published site URL in MCP config snippets</div> </div> </div> <!-- v27 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v27</span> <span class="tl-title">Admin: remove duplicate CTA buttons from all email templates</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li>Removed inline <code>👉 …: {{token}}</code> lines from all 17 affected template bodies (ET-001 through ET-021) — these lines were being converted to <code><p class="email-cta"></code> buttons by <code>plainToHtml()</code></li> <li>The <code>EMAIL_CTA_DEFAULTS</code> / CTA button system already appends a branded action button below every template body — the inline lines were redundant, producing two buttons in the preview</li> <li>Templates ET-003, ET-008, ET-017, ET-018 had inline link tokens as plain text (no <code>👉</code>), so were not affected</li> </ul></div> <div class="tl-commit">💾 cb21189 — fix(templates): remove duplicate CTA buttons from email templates</div> </div> </div> <!-- v26 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v26</span> <span class="tl-title">Admin: fix project tooltip clipping — separate badge and tooltip into sibling elements</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>Root cause</strong>: <code>.proj-name-badge</code> had <code>overflow:hidden</code> and was also the <code>proj-tooltip-host</code> positioning context — absolutely-positioned <code>.proj-tooltip</code> children were clipped by the badge's own overflow</li> <li><strong>Fix</strong>: restructured to <code><span class="proj-tooltip-host"><span class="proj-name-badge">name</span><span class="proj-tooltip">...</span></span></code> — host has no overflow, badge handles truncation, tooltip is a sibling (never clipped)</li> <li><strong>admin.css</strong>: added <code>display:inline-block</code> to <code>.proj-tooltip-host</code> so the wrapper sizes correctly to the badge for tooltip centering</li> <li>Applies to both User Directory and Scheduler project name badges; hover now shows project code + user roles as intended</li> </ul></div> <div class="tl-commit">💾 fix(mockup): separate proj-tooltip-host from overflow:hidden badge to unclip hover tooltip</div> </div> </div> <!-- v25 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v25</span> <span class="tl-title">Admin: project names replace codes in User Directory + Scheduler; tooltip dedup</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul> <li><strong>User Directory — Projects column</strong>: badges now show the project name (e.g. <em>Accenture Federal Services</em>) instead of the code (<code>ACC-001</code>); hover tooltip shows the code + user's roles on that project — no duplication</li> <li><strong>Scheduler table — Projects column</strong>: project name chips replace code chips; tooltip shows the code on hover</li> <li><strong>Invite & Edit User modals</strong>: project checkboxes show name as primary text with code as small muted monospace label</li> <li><strong>admin.css</strong>: new <code>.proj-name-badge</code> class (sans-serif, <code>max-width:160px</code> with truncation); dead <code>tooltipText</code> variable and redundant <code>data-proj-*</code> attributes removed from JS</li> </ul></div> <div class="tl-commit">💾 <code>117d12e</code> — feat(mockup): show project names instead of codes; refactor tooltip to remove name duplication</div> </div> </div> <!-- v24 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v24</span> <span class="tl-title">RichTextEditor: width consistency + placeholder + focus ring in mockup CSS</span> <span class="tl-date">09 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-fix">fix</span> <span class="tag tag-sprint">UI</span> </div> <div class="tl-desc"> <ul> <li><strong>mockup/styles.css</strong>: <code>.wysiwyg-wrapper</code> and <code>.wysiwyg-editor</code> now have <code>width:100%; box-sizing:border-box</code> — consistent width in all layout contexts</li> <li><code>.add-item-row .wysiwyg-editor</code> min-height bumped <code>36px → 4.5em</code> (matches <code>minRows=3</code> in the React RichTextEditor)</li> <li>Mirrors real-app changes: <code>.rte-wrapper</code>/<code>.rte-editor</code> width rules + focus-within blue border + italic placeholder added to <code>custom.css</code></li> </ul> </div> <div class="tl-commit">💾 <code>78f7410</code> — fix(ui): enforce width:100% on RichTextEditor wrapper and editor divs</div> </div> </div> <!-- v23 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v23</span> <span class="tl-title">EPIC-14C — MCP “Connect Your AI Assistant” guide in real ProfileScreen</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">EPIC-14</span> <span class="tag tag-sprint">ProfileScreen</span> </div> <div class="tl-desc"> <ul> <li><strong>MCP Integration Guide card</strong> added to real <code>src/web/src/screens/ProfileScreen.tsx</code> (closes FEAT-14C #771)</li> <li>3-tab interface: Claude Desktop · Claude Code CLI · AiDE (VS Code); tab state via React <code>useState</code></li> <li>Each tab has numbered steps with dark code blocks + one-click 📋 copy via <code>navigator.clipboard.writeText</code></li> <li>Inline troubleshooting table: 401 / read-only 403 / role-mismatch 403 scenarios</li> <li>Matches the mockup guide added in screen-profile.js v17 (mockup v23 unchanged — real impl now in parity)</li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — src/web/src/screens/ProfileScreen.tsx</div> </div> </div> <!-- v22 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v22</span> <span class="tl-title">EPIC-13 — Reminder template coverage: ET-019/020/021 + templateCode linkage</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">Admin</span> <span class="tag tag-sprint">EPIC-13</span> </div> <div class="tl-desc"> <ul> <li><strong>ET-019</strong> PL Submission Reminder — dedicated reminder-toned template for R-001 (24h before Ups & Downs deadline)</li> <li><strong>ET-020</strong> PM Review Reminder — dedicated template for R-002 (12h after all PLs submit)</li> <li><strong>ET-021</strong> Priorities & Achievements Reviewer Nudge — dedicated template for R-007 (4h after PL submits Priorities & Achievements)</li> <li>All 10 reminders gain a <code>templateCode</code> field linking each trigger to its email template</li> <li>Automated Reminders admin table gains an <strong>Email Template</strong> column — clickable template badge opens the preview panel</li> <li>Category logic updated: ET-019/020 classified as <em>workflow</em>, ET-021 as <em>pa</em> (previously would have fallen in <em>access</em>)</li> </ul> </div> <div class="tl-commit">💾 <code>9b041a8</code> — admin/admin.js · admin/index.html</div> </div> </div> <!-- v21 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v21</span> <span class="tl-title">EPIC-14 parity batch — Auth flows + Notification Bell in mockup</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">EPIC-14</span> </div> <div class="tl-desc"> <ul> <li><strong>Auth Verify screen</strong> (FEAT-14B) — <code>login.html?view=auth-verify</code> — mirrors real <code>AuthVerifyScreen.tsx</code>; three demo states: Verifying (spinner), Success, Error with back-to-login link</li> <li><strong>Auth Activate screen</strong> (FEAT-14B) — <code>login.html?view=auth-activate</code> — mirrors real <code>AuthActivateScreen.tsx</code>; three demo states: Activation form, Success (redirect animation), Missing-token error</li> <li><strong>Notification Bell</strong> (FEAT-14A) — 🔔 icon in topbar with unread badge, dropdown panel, per-item + mark-all-read; mirrors real <code>NotificationBell.tsx</code>; seeded with 3 mock notifications</li> <li>Bell shown on login, hidden on logout; outside-click closes panel</li> <li>CSS: <code>@keyframes pg-spin</code> spinner + full <code>.notif-*</code> rule set synced from <code>custom.css</code></li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — screens/screen-auth.js · app.js · login.html · styles.css</div> </div> </div> <!-- v20 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v20</span> <span class="tl-title">Email Templates — configurable CTA button label + link (synced from AiDE Loop)</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">Admin</span> </div> <div class="tl-desc"> <ul> <li>Every email template now carries a <strong>CTA button</strong> — an editable <strong>label</strong> + <strong>link token</strong> — rendered as a branded action button below the body (matches AiDE Loop)</li> <li>All 18 templates seeded with sensible CTAs (e.g. <em>Submit Ups & Downs</em> → <code>{{submissionLink}}</code>, <em>Activate Your Account</em> → <code>{{activationLink}}</code>)</li> <li>Edit modal gains <strong>CTA Button Label</strong> + <strong>CTA Button Link</strong> fields; rendered Preview and the inline preview panel both show the button</li> <li>Leave the label blank for a no-button (link-only) email</li> </ul> </div> <div class="tl-commit">💾 <code>5f164dd</code> — admin/admin.js · admin/index.html</div> </div> </div> <!-- v19 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v19</span> <span class="tl-title">All-links index expanded to every page & subpage — 10 admin sections deep-linked + Cycle Detail + Design History</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-docs">nav</span> </div> <div class="tl-desc"> <ul> <li><code>index.html</code> grew from 17 to <strong>29 direct links</strong> — every page and subpage is now one click from the landing index</li> <li><strong>Admin Portal</strong> expanded from a single link into all <strong>10 sections</strong> (Projects, PODs, Users, Scheduler, Email Templates, Reporting Relationships, MCP Tokens, MCP Log, Reports, Audit Log), grouped Management / Automation & Settings / AI Integration & Reporting</li> <li>Added hash deep-linking to the admin app (<code>admin.js</code>): <code>admin/index.html#users</code> opens that section directly; supports back/forward via <code>hashchange</code></li> <li>New <strong>Cycle Detail</strong> workflow card (<code>app.js routeDeepLink</code> case drills into the latest cycle) and a <strong>Design History</strong> reference card</li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — index.html · admin/admin.js · app.js</div> </div> </div> <!-- v18 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v18</span> <span class="tl-title">Profile → Email Notification preferences (parity with shipped app); from the mockup/implementation gap analysis</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">Parity</span> </div> <div class="tl-desc"> <ul> <li>New <strong>Email Notifications</strong> card on the Profile screen, mirroring the shipped <code>NotificationPreferences</code> component (US-12A-02, EPIC-12)</li> <li>Three per-category email toggles — <strong>Ups & Downs workflow</strong>, <strong>Priorities & Achievements</strong>, <strong>Weekly digest</strong> — each with a description and a saved toast</li> <li>Note that account & security mail (sign-in links, invitations, deactivation) always sends and is not listed</li> <li>Closes one of four gaps found by comparing the mockup against <code>src/web</code>/<code>src/api</code> vice-versa (AzDO EPIC-12 #754)</li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — screens/screen-profile.js</div> </div> </div> <!-- v17 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v17</span> <span class="tl-title">Profile → step-by-step MCP integration guide (Claude Desktop / Claude Code CLI / AiDE VS Code)</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">MCP</span> </div> <div class="tl-desc"> <ul> <li>New <strong>"Connect Your AI Assistant — Step by Step"</strong> card on the Profile screen, surfacing the integration walkthrough that previously lived only in <code>docs/claude-desktop-config.md</code></li> <li>Tabbed by client: <strong>Claude Desktop</strong> (config-file path + <code>mcpServers</code> snippet + restart), <strong>Claude Code CLI</strong> (<code>claude mcp add</code> + <code>.mcp.json</code>), <strong>AiDE VS Code</strong> (<code>.vscode/mcp.json</code> + <code>${workspaceFolder}</code>)</li> <li>Numbered steps: build the server → generate a token → paste into config → restart/reload → verify with sample prompts; one-click <strong>copy</strong> on every code snippet</li> <li>Inline <strong>troubleshooting</strong> table (401 / read-only 403 / forbidden) + pointer to the Admin MCP Interaction Log</li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — screens/screen-profile.js</div> </div> </div> <!-- v16 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v16</span> <span class="tl-title">Email Templates — HTML emails, rendered Preview, usage metrics, enable/disable & filters (synced from AiDE Loop)</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-sprint">Admin</span> </div> <div class="tl-desc"> <ul> <li>Admin → Email Templates brought to parity with AiDE Loop's template management + usage page</li> <li><strong>HTML emails</strong>: bodies are HTML (auto-upgraded from plain text); edit modal is an HTML editor with the shared header/footer added automatically</li> <li><strong>Rendered Preview</strong> button (preview panel + edit modal) opens the email in a branded POD Governance shell with <code>{{tokens}}</code> filled from sample data; unknown variables shown as chips</li> <li>Usage KPI strip (Total / Enabled / Sent 24 h / Needs Review) + per-template usage (Sent 24 h & 7 d, Open Rate, Last Sent)</li> <li>Per-template enable/disable toggle (card + preview + edit modal); disabled templates never dispatch</li> <li>Category <strong>tabs</strong> (All / Ups & Downs / Priorities & Achievements / Invitations & Access) + search + status filter across all 18 templates; clickable variable palette inserts <code>{{tokens}}</code> at the cursor</li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — admin/index.html · admin/admin.js · admin/admin.css</div> </div> </div> <!-- v15 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v15</span> <span class="tl-title">All-links mockup index + Design History timeline</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"> <span class="tag tag-feat">feat</span> <span class="tag tag-docs">docs</span> </div> <div class="tl-desc"> <ul> <li>New <code>index.html</code> — clickable index of all 17 mockup views, grouped by area (now the default landing page)</li> <li>The workflow SPA moved to <code>login.html</code>; the all-links index takes over <code>index.html</code></li> <li>New <code>history.html</code> — this design-iteration timeline, sourced from git history</li> <li>Deep-link routing added to <code>app.js</code> (<code>routeDeepLink()</code>) — <code>login.html?view=<key></code> opens any screen pre-authenticated as the right demo role</li> </ul> </div> <div class="tl-commit">💾 <code>working copy</code> — index.html · login.html · history.html · app.js</div> </div> </div> <!-- v14 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v14</span> <span class="tl-title">Project badge tooltip shows user roles per project in User Directory</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul><li>Admin User Directory project badges now reveal each user's per-project roles on hover</li></ul></div> <div class="tl-commit">💾 <code>1508846</code> — feat(admin): project badge tooltip shows user roles per project</div> </div> </div> <!-- v13 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v13</span> <span class="tl-title">Wire up the Open Admin Portal button</span> <span class="tl-date">08 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span></div> <div class="tl-desc"><ul><li>Module picker "Open Admin Portal" button now navigates to the standalone admin app</li></ul></div> <div class="tl-commit">💾 <code>18e2350</code> — fix(mockup): wire up Open Admin Portal button</div> </div> </div> <!-- v12 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v12</span> <span class="tl-title">Manage POD screen + multi-role users + role-mapped dropdowns</span> <span class="tl-date">07 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul><li>New Manage POD admin screen; users can hold multiple roles; assignment dropdowns mapped per role</li></ul></div> <div class="tl-commit">💾 <code>cdb68ad</code> — feat(admin): Manage POD screen + multi-role users + role-mapped dropdowns</div> </div> </div> <!-- v11 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v11</span> <span class="tl-title">MCP tokens + profile self-service, nav polish</span> <span class="tl-date">07 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span></div> <div class="tl-desc"><ul><li>Profile self-service with Personal Access Tokens for MCP / API; navigation polish across screens</li></ul></div> <div class="tl-commit">💾 <code>8d985bd</code> — chore(mockup/docs/azdo): MCP tokens + profile self-service, nav polish</div> </div> </div> <!-- v10 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v10</span> <span class="tl-title">Sprint 17 sync mockup from implementation</span> <span class="tl-date">05 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-docs">docs</span><span class="tag tag-sprint">Sprint 17</span></div> <div class="tl-desc"><ul><li>Back-links, Quick Links, all-submitted notice, PL search, cycle-id search, Priorities & Achievements header links</li></ul></div> <div class="tl-commit">💾 <code>7d8a99e</code> — docs(mockup): S17 sync mockup from impl</div> </div> </div> <!-- v9 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v9</span> <span class="tl-title">Dashboard = module picker + Admin Portal tile</span> <span class="tl-date">04 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span></div> <div class="tl-desc"><ul><li>Post-login dashboard reworked into the module picker; Admin Portal tile + NavBar dashboard link</li></ul></div> <div class="tl-commit">💾 <code>c6923a6</code> — feat(web): dashboard = module picker + Admin Portal tile</div> </div> </div> <!-- v8 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v8</span> <span class="tl-title">Reports & Analytics module added</span> <span class="tl-date">04 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span></div> <div class="tl-desc"><ul><li>New <code>screen-reports.js</code>; Reports card wired into the module picker</li></ul></div> <div class="tl-commit">💾 <code>b54437b</code> — feat(mockup): add screen-reports.js + wire Reports card</div> </div> </div> <!-- v7 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v7</span> <span class="tl-title">Login integration fixes — one-click demo login</span> <span class="tl-date">03 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-fix">fix</span></div> <div class="tl-desc"><ul><li>One-click demo login; <code>.test</code> email addresses aligned across seed / e2e / mockup</li></ul></div> <div class="tl-commit">💾 <code>8f5aecc</code> — fix(web): login integration fixes</div> </div> </div> <!-- v6 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v6</span> <span class="tl-title">Sprint 7A gap closures</span> <span class="tl-date">03 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Sprint 7A</span></div> <div class="tl-desc"><ul><li>GAP-07/08/09/10/11/15/18 implemented with tests</li></ul></div> <div class="tl-commit">💾 <code>7a763dd</code> — feat(gaps): Sprint 7A</div> </div> </div> <!-- v5 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v5</span> <span class="tl-title">Fresh mockup screens</span> <span class="tl-date">03 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span></div> <div class="tl-desc"><ul><li>Rebuilt mockup screens on the AiDELoop shell design system</li></ul></div> <div class="tl-commit">💾 <code>ee2cad7</code> — Mockup fresh screens</div> </div> </div> <!-- v4 --> <div class="tl-entry"> <div class="tl-dot tl-dot-done"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-done">v4</span> <span class="tl-title">Reporting relationships CRUD + NavBar sign-out fix</span> <span class="tl-date">02 Jun 2026</span> </div> <div class="tl-tags"><span class="tag tag-feat">feat</span><span class="tag tag-sprint">Admin</span></div> <div class="tl-desc"><ul><li>Admin reporting-relationships CRUD; NavBar sign-out SVG fix</li></ul></div> <div class="tl-commit">💾 <code>4cfd323</code> — feat(admin): reporting relationships CRUD</div> </div> </div> <!-- v3 --> <div class="tl-entry"> <div class="tl-dot tl-dot-minor"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-minor">v3</span> <span class="tl-title">Add System Admin user to all login demo panels</span> <span class="tl-date">31 May 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span></div> <div class="tl-desc"><ul><li>System Admin demo user added to login panels and user lists</li></ul></div> <div class="tl-commit">💾 <code>061bb71</code> — chore(mockup): add System Admin user</div> </div> </div> <!-- v2 --> <div class="tl-entry"> <div class="tl-dot tl-dot-minor"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-minor">v2</span> <span class="tl-title">Align user names & emails with seed data</span> <span class="tl-date">31 May 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span></div> <div class="tl-desc"><ul><li>All demo user names and emails updated to match backend seed data</li></ul></div> <div class="tl-commit">💾 <code>9667773</code> — chore(mockup): update all user names and emails</div> </div> </div> <!-- v1 --> <div class="tl-entry"> <div class="tl-dot tl-dot-minor"></div> <div class="tl-card"> <div class="tl-top"> <span class="tl-ver ver-minor">v1</span> <span class="tl-title">Project foundation</span> <span class="tl-date">31 May 2026</span> </div> <div class="tl-tags"><span class="tag tag-chore">chore</span></div> <div class="tl-desc"><ul><li>Renamed mockup folder, pipeline, env template, AzDO scripts — initial scaffold</li></ul></div> <div class="tl-commit">💾 <code>1dee7c5</code> — chore: project foundation</div> </div> </div> </div> <div class="hist-footer"> POD Governance — Mockup Design History · ValueLabs · sourced from git log of <code style="background:rgba(255,255,255,.07);padding:1px 6px;border-radius:4px;">mockup/</code> · <a href="index.html">← Back to mockup index</a> </div> </div> <script> // Environment badge — URL param ?env=dev|qa|uat|local overrides hostname; file:// = LOCAL (function () { var param = new URLSearchParams(window.location.search).get('env'); var key = (param || window.location.hostname).toLowerCase(); var cfg = null; if (key === 'dev' || key.includes('-dev') || key.includes('.dev.')) cfg = { tag: 'DEV', color: '#93c5fd' }; else if (key === 'qa' || key.includes('-qa') || key.includes('.qa.')) cfg = { tag: 'QA', color: '#d8b4fe' }; else if (key === 'uat' || key.includes('staging') || key.includes('-uat') || key.includes('.uat.')) cfg = { tag: 'UAT', color: '#fcd34d' }; else if (key === 'local' || key === 'localhost' || key === '127.0.0.1' || key === '' || /^192\.168\./.test(key)) cfg = { tag: 'LOCAL', color: '#e2e8f0' }; if (!cfg) return; if (!document.title.startsWith('[')) document.title = '[' + cfg.tag + '] ' + document.title; var logoWrap = document.querySelector('.hist-logo'); if (logoWrap && !logoWrap.querySelector('.env-logo-overlay')) { logoWrap.style.position = 'relative'; logoWrap.style.overflow = 'visible'; var lbl = document.createElement('span'); lbl.className = 'env-logo-overlay'; lbl.textContent = cfg.tag; lbl.style.cssText = 'position:absolute;bottom:-7px;left:50%;transform:translateX(-50%);font-size:9px;font-weight:900;letter-spacing:.07em;text-transform:uppercase;padding:2px 7px;border-radius:10px;white-space:nowrap;line-height:1.4;background:' + cfg.color + ';color:#1e293b;pointer-events:none;z-index:2;'; logoWrap.appendChild(lbl); } })(); </script> <script src="version.js"></script> </body> </html>