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; it is now -YYYYMMDD-HHMM-mindmap- — project name first, then date and time, then the meeting title. For a common meeting with no project link the prefix is meeting. Mirrors MeetingDetailScreen.tsx (#3437).
📝 mockup(mna): v506 — mindmap download filename with project + date #3458
v505 — Done
Admin Users table shows when each account last signed in
19 Sep 2026
Admin
- A new column in the Users & Roles table shows the last sign-in date and how long ago that was. 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 Never. Mirrors
AdminUsersScreen.tsx (#3446).
📝 mockup(admin): v505 — Users table: last sign-in column #3457
v504 — Done
Cycle ids on the detail and history pages use the format the app actually writes
17 Sep 2026
Cycles
- Both pages printed a cycle id the app abandoned twice. Every id read
MAY-2026-W2 — 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.
- 35 ids were rewritten across the two pages, not the six the report counted. 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.
- Each id keeps its own cadence and period. A weekly cycle for 12–18 May 2026 becomes
W20-2026-W20, the ISO week that actually covers it; the three monthly rows become M03-2026-W10, M02-2026-W6 and M01-2026-W2. They were not renumbered to a single example, because the history table’s periods and frequencies are shown beside them and would then disagree.
- The month NAME that #3342 adds is a screen-level transform, and is deliberately not baked in here. The detail screen renders
M05-2026-W19 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.
- The same stale format is still on eight other pages — dashboard, my-work, notifications, profile, projects, reports and timeline. That is the parity sweep’s job, not this one. 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.
💄 mockup(cycles): v504 — cycle ids in the format the app writes #3432
v503
The admin portal stops advertising Reporting Lines, a screen the product no longer has
17 Sep 2026
Admin
- The capability was removed from the product and left standing here. 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.
- The 🌳 Hierarchy tab stays, and that was the whole risk. 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.
- The dialog’s person-picker went with it. Nothing else on the page used it, so leaving it would have left a widget behind that no screen can reach.
- An old link to the removed tab now lands on the default page rather than opening an empty one — the honest answer once the destination has gone.
- What is left is prose, not controls. 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.
🔥 mockup(admin): v503 — remove the Reporting Lines surface #3431
v502
Parity sweep: four places where the mockup had fallen behind the shipped app
16 Sep 2026
Parity
- A reviewer can send a cycle straight back to its author. 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.
- A Project Lead or PM can edit their own project from the Projects list. 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.
- Help explains the AiDE Risk Radar. 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.
- The pages reference stops quoting its own version. 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.
- Two known gaps are deliberately still open. 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.
💄 mockup(parity): v502 — four drifts closed from the #3427 sweep #3427
v501
The corrections worklist lists mis-heard terms alphabetically instead of in the order AiDE emitted them
16 Sep 2026
Meeting Notes
- Finding one term meant reading every row. 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.
- Case is ignored, and numbers read as numbers. 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”.
- Speaker rows are deliberately left where they are. 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.
- Sorted on a copy. 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.
💄 mockup(meetings): v501 — alphabetical ordering for the corrections worklist #3425
v500
A Pomodoro focus timer on My Action Items, and a start and end time recorded against every task
16 Sep 2026
Action Items
- A task recorded when it was closed and nothing about when work began. 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.
- The countdown is anchored to an instant, not accumulated from ticks. 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.
- A session can never credit more time than it was set for. 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.
- Reopening keeps the history. 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.
- The keyboard stays out of the way. 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.
- Four presets, or your own numbers. 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.
💄 mockup(actions): v500 — Pomodoro focus timer + task time tracking #3414
v499
A series’ occurrences fold into Year, Month and Week sections instead of one list that only grows
16 Sep 2026
Meetings
- A daily standup adds about twenty rows a month, and nothing folded. 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.
- Each section states its own rollup. 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.
- A level with only one child is dropped. 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.
- The grouping follows the reader’s clock, not the meeting’s. 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.
- Sections sort by their newest meeting, never by their number. January holds weeks 53, 01 and 02, and week 53 is the earliest of them — so ordering by week number would put the oldest first in exactly the month where it is hardest to notice.
💄 mockup(meetings): v499 — Year/Month/Week accordion for series occurrences #3406
v498
Every occurrence of a series gets its own completion bar, not just the series total
16 Sep 2026
Meetings
- The aggregate had a picture; the parts had arithmetic. 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, 9/20 actions closed. Finding the standups that went badly meant reading two dozen fractions and comparing them in your head.
- The same bar, scaled to one occurrence. 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.
- The track had to change colour to be visible at all. 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.
- The bar and its number are one unit. 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.
💄 mockup(meetings): v498 — per-occurrence completion slider on series rows #3405
v497
The index stops keeping its own copy of the backlog, because a copy of a live system is only ever briefly true
13 Sep 2026
Parity
- A snapshot that was correct for a moment. 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 eight days — eight of its nine items closed, and 25 of the 26 then-open items missing.
- The page never lied; the source comment did. 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 was the complete status dashboard, which is the sentence the next reader trusts instead of checking.
- Rebuilding it a third time was the option not taken. 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.
- So the duplication is gone rather than re-dated. 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.
💄 mockup(index): v497 — drop the Open Backlog block; AzDO is the source of truth #2736
v496
The mockup’s role ranking disagreed with the API, and the React screen was faithful to the mockup (#2950)
13 Sep 2026
admin
Parity
- Two copies agreed with each other and both disagreed with the API.
admin.js’s ROLE_PRIORITY ranked deliverySpoc fifth; api/src/models/permissions.ts ranks it eighth, below esoSpoc and recruitmentSpoc, because visibility-only SPOC roles deliberately sit between the chain reviewers. AdminUsersScreen said it mirrored this file and did so faithfully — which is exactly how the divergence survived being looked at.
- What a user saw. Someone holding both
salesSpoc and deliverySpoc was badged Delivery SPOC by the mockup and the React screen, and Sales SPOC by the API. Owner decision, 13 Sep 2026: the API is authoritative, so both copies moved to match it.
projectContributor was missing from the list entirely, so a contributor fell through to roles[0] 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.
- A guard replaces the prose promise.
roleParity.test.ts 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.
💄 mockup(admin): v496 — rank roles by the API’s order, and guard all three copies
v495
The whole Temporary Access feature was missing from the mockup — 531 lines of shipped screen with no counterpart (#2743)
11 Sep 2026
admin
Parity
- Not a missing control — a missing feature.
ProjectGrantsPanel.tsx has shipped since #2465 and the mockup had no panel, no list and no picker. A grep across mockup/ 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 personLabel, and looking for its picker found that the entire surface was absent.
- A missing SECTION in an existing screen, not a missing screen. The panel is mounted from the project edit modal (
ProjectEditModal.tsx:322), which the mockup already has — so it lands inside openProjectModal()’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.
- ⚠ Transcribed, not designed. 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 misdocuments 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
data-testid as its element id so the two can be diffed directly.
- The three states that must not look alike. A failed load (
grants-load-failed) is a warning panel, not 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 (grants-empty) is its own line. Both are display:none with a note saying when they show — the same convention as #org-tree-error.
- Four rows, covering every status and the inline editor. Live access nearly over carries a separate “Ends in 2 days” 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 extend editor open, which the app allows one at a time. Expired and revoked rows offer neither Extend nor Withdraw: a button with nothing to do is a promise the row cannot keep.
- The give-access form, with its three easily-lost details. The search is company-wide, 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 same box, alongside results rather than only when there are none, since two colleagues can share a first name.
- The 90-day cap is quoted, not invented — read from
MAX_GRANT_DAYS in projectAccessGrantService.ts. 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.
- No impl-pending item: 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.
💄 mockup(admin): v495 — document the Temporary Access panel the mockup never had
v494
The admin mockup declared escHtml twice and the BROKEN one won — all 155 escaping calls in admin.js were no-ops (#2747)
11 Sep 2026
admin
Consistency
- An escaper that escaped nothing.
admin/index.html declared function escHtml(t) whose every replacement mapped a character to itself — &→&, <→<, >→>, "→". It was named like an escaper, called like one, and returned its input unchanged.
- ⚠ The damage was not the three local calls — it was the SHADOWING.
admin.js declares a correct escHtml and is loaded at line 3375; the broken duplicate sat in an inline block evaluated at 3690+. Both are global function declarations, so the later one wins — and it wins for admin.js too. All 155 escaping calls in that file — user names, project names, POD names, emails, saved-view names, every table cell built into innerHTML — were silently no-ops.
- Proven by running it, not by reading it. Hoisting rules are enough to suspect which declaration wins; only executing them settles it. A probe that evaluates
admin.js and the inline blocks in the real document order returned the input <img src=x onerror=alert(1)> & "quoted" completely unchanged.
- Fixed by DELETING the duplicate, not by repairing it. Two implementations of one rule is the defect;
admin.js’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 — and was re-run against the pre-fix file to confirm it still reports the failure, so the green is evidence rather than an assumption.
- Swept the whole repo for siblings: none. Zero other self-mapping replacements across 1,072 tracked files. The four
mockup/assets/js helpers that each declare esc are all inside IIFEs, so they are function-scoped and cannot shadow each other; the two other escHtml declarations are on pages that never load admin.js.
- A tempting origin story, refuted. The broken function is the same shape as
cycle-history.html’s correct one with the entities missing, which suggests an HTML-entity-decoding pass over the file — but 68 & literals survive intact in that same file, so no global decode ever happened. It was a one-off.
- Scope, stated honestly: this is the mockup — a static demo with fixture data — so nothing here was a live XSS. What it was is a function whose name asserted a property it did not have, sitting in front of 155 call sites, in the artefact people read to understand what the app does.
- No impl-pending item: a defect in mockup-only scaffolding with no web/API counterpart — React escapes by construction.
🐛 mockup(admin): v494 — delete the no-op escHtml that shadowed the real one
v493
Four truncating names become recoverable — two only from a 22px avatar, two not at all (#2746)
11 Sep 2026
Parity
- Direction is web → mockup: catch-up on #2666, already on
main, so there is no implementation to pend.
- #2666 put the
title on the TRUNCATING span itself, 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 was recoverable — but only from a much smaller hover target — and it still got its own.
- The mockup was in the pre-#2666 state at four sites, in two grades. The participant and meeting-owner rows truncate a name and role, recoverable only by hovering the 22px avatar beside them. The two attendee-label rows — including the name of whoever claimed a label — had no title anywhere on the row or its container.
- Already correct and deliberately left alone: the participant chip truncates at
max-width:130px — the same shape as the modal chip #2666 fixed — but its outer span already carries the name and role, which is the recoverable case.
- Also excluded: an attachment filename and an email-subject preview truncate non-person values, and four of the fourteen ellipsis hits in the mockup are CSS class definitions rather than elements, which cannot carry a title — a detector that counts them over-reports by a third.
- ⚠ The first verification proved nothing and said so. 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. 0 of 0 is not a pass. The probe now calls
sharingCardHtml and attendeeLabelsHtml directly, asserts seven truncating elements across them, and fails loudly if either renders none.
- No impl-pending item: already on
main (#2666).
💬 mockup(meetings): v493 — titles on the four truncating name labels
v492
My Contributors gains the THIRD status — a failed request no longer reads as “Not submitted” (#2745)
11 Sep 2026
Parity
Fix
- Direction is web → mockup: catch-up on code already on
main (#2444), so there is no implementation to pend.
- The mockup modelled a two-state world, and said so in a comment. It enumerated the statuses as “clickable to view;
none is a non-clickable Not submitted”. #2444 added a third, and the comment is exactly the kind that rots when the set grows.
- ⚠ Why the third state exists, in #2444’s own words: a failed status fetch used to degrade to
none, which renders as Not submitted — so one failed request accused a contributor who HAD submitted of not having, and a PL could act on that. It now reads “⚠️ Couldn’t load”.
- The distinction is careful and preserved here: a missing bilateral record genuinely IS not-submitted and stays
none. Only a request that throws becomes unknown.
- ⚠ And it is CLICKABLE, 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.
- The colours are copied, not chosen:
--tint-warning-bg-strong / -fg / -border, taken from utils/paStatusChip.ts.
- Verified by rendering — and on the property that matters rather than on appearance: the unknown chip is an
<a>, both not-submitted chips are still <span>, the two states coexist, and the class really does use all three warning tokens.
- No impl-pending item: already on
main (#2444).
💬 mockup(priorities): v492 — the “Couldn’t load” contributor status
v491
Admin Users: the amber panel naming the people who are on no project or POD (#2744)
11 Sep 2026
Parity
- Direction is web → mockup: catch-up on code already on
main (#2494), so there is no implementation to pend.
- ⚠ This is not an arbitrary missing panel — it is the diagnostic for the population v484’s Default POD setting exists to serve. #2681 found roughly 20 of 23 people holding zero project memberships, which is why the P&A scope picker correctly stood down for them. The mockup already showed the setting and the picker’s three states, and did not show the screen that tells an admin who is in that state.
- Rendered ONLY when there is something to act on, the same rule the stale-assignment panel above it follows — a fully-mapped org sees nothing at all. Amber, where that one is red.
- The copy is the app’s, not a paraphrase: “N active P&A submitter(s) is/are on no project or POD”, then the part that matters — they can still submit, but receive no Monday kickoff or reminder and appear in nobody’s review roster. Show details opens Name / Role / Email.
- ⚠ The mockup has no API, so it DERIVES the set rather than inventing one: active users with an empty
projects list. POD reachability runs through project membership (#2681), so no projects means no POD either — which is why one condition is enough and the panel is not guessing.
- Mirrored, not invented — #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.
- Verified by rendering: the panel appears for the one unmapped fixture user, the summary uses the singular “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 nothing.
- No impl-pending item: already on
main (#2494).
💬 mockup(admin): v491 — the unmapped-P&A-submitters panel
v490
Nine more pickers — the v488 scan never opened a .js file, so this one enumerates from the APP instead (#2741)
11 Sep 2026
Parity
Fix
- ⚠ v488 said “the whole mockup enumerated at last”. It globbed
mockup/**/*.html, so it never opened a .js file — and the admin mockup builds its option lists in admin/admin.js. That is a file-selection 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.
- So the method changed. Instead of classifying mockup markup by eye, the list now comes from the app: the eleven files that import
personLabel, each mapped to its mockup counterpart. That is an authoritative set rather than a hopeful one.
buildUserSelect — one function, SEVEN pickers. 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 — AdminProjectsScreen and AdminPodsScreen — adopted personLabel.
- The token-owner picker in the MCP token modal, counterpart
AdminMcpTokensScreen.
- The command palette’s People results read
Name · Role — a fourth spelling of the same fact. CommandPalette.tsx records that it was Name · email before #2591 unified it. The palette is where you type a name to find a person, so the email is exactly what it needs.
- ⚠ And one deliberately NOT converted, which only the authoritative-set method caught:
timeline.html’s member picker also reads Name — Role, but TimelineScreen.tsx is not in the adopted set. Converting it would run ahead of the app rather than mirror it — the mockup documents the screen, it does not propose changes to it.
- Also excluded: 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.
- Verified by rendering — not just the label rule over five shapes, but the real picker:
buildUserSelect called against the live fixture, every option asserted to be Name (email) and no Name — Role left. The probe fails loudly if the fixture has no eligible user, so it cannot pass by matching nothing.
- No impl-pending item: already on
main (#2457, #2591).
💬 mockup(admin,palette): v489 — nine more pickers, enumerated from the app's adopted set
v489
The index’s Open Backlog comment stops claiming to be the complete AzDO dashboard (#2740)
11 Sep 2026
Chore
- An HTML comment only — nothing renders differently, and there is no implementation to pend. The visible caption already reads “Every AzDO work item still open on 3 Sep 2026”, which is honest: it names its date, so a reader knows to check. The comment above it said, in the present tense, that the index “is the complete AzDO work item status dashboard”.
- It is not, and was not for long. Measured 2026-09-11: eight of the nine listed items are closed, and 25 of the 26 then-open items are absent.
- ⚠ A false claim in a comment is worse than an admitted gap, which is why this half was separable from the design question. The documented state is what the next reader trusts instead of checking AzDO — the dated caption invites exactly the check the comment discouraged.
- ⚠ The list was deliberately NOT rebuilt by hand. That would be the third time: it was already rebuilt once (#2416 / v483) after ~7 weeks of rot, and it rotted again in eight days, 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 #2736.
- The cheap guard is ruled out, and the reason is worth carrying: 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.
- Correcting it cannot pre-empt the owner’s choice, 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.
v488
Five MORE people-pickers — the whole mockup enumerated at last, after three passes that each missed some (#2739)
11 Sep 2026
Parity
- 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. A broad scan found five more — 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.
- The five: the reassign-action select’s two option lists (its “no access” entry for an assignee who lost access, and its eligible list — one
<select>, 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 My Action Items. MyActionItemsScreen.tsx imports personLabel for that last one.
- The scan that finally worked was a DENYLIST, and that is the point. Every
<option> line mentioning .name or person( — 18 hits — then classified by hand. It fails loudly, with too many to read; the three narrower detectors before it failed silently, each returning a plausible short list.
- Eight of the 18 are correctly excluded, recorded so the next reader does not “finish the job”: two saved-view selects (
v.name is a view), five project/POD selects, and the Preview as demo bar.
- ⚠ My Action Items shows no visible change, and that is not a reason to skip it. Its attendee fixtures carry
id and name but no email, so the shared rule degrades to the bare name — exactly what personLabel’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.
- Verified by rendering both files 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.
- No impl-pending item: already on
main (#2457).
💬 mockup(meetings,my-actions): v488 — the last five people-pickers, found by a denylist scan
v487
Meeting Notes AI: five people-pickers read Name (email), the search finds an email, and one datetime stops using a format the app removed (#2738)
11 Sep 2026
Parity
- Direction is web → mockup: catch-up on code already on
main, so there is no implementation to pend. Found by continuing v486’s method into the next-highest-churn screen — MeetingDetailScreen has nine commits since the v482 sweep.
- One datetime was still in the format #2621 removed. 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
06/07/2026, 17:37:44 — and it renders, as “Processing since …”. Its own sibling field two lines below already read 06 Jul 2026, 18:07 IST, so one object held both formats, which is what made it unambiguous rather than a judgement call.
- Five people-pickers now read
Name (email), mirroring utils/personLabel.ts 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 degrades to whichever half exists rather than printing “Name (undefined)” — an invited account with no name yet has exactly that shape.
- ⚠ I found two of those five by reading and three by grepping, which is the point. 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. Enumerate from what the app converted, not from what you happen to see — the same lesson v486 recorded one iteration earlier.
- And a sixth thing: the autocomplete now SEARCHES the email too. The app exports
personMatches beside personLabel 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.
- ⚠ Role is kept as an extra search term 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.
- Deliberately unchanged, so the next reader does not “finish the job”: the Preview as bar is a mockup-only demo control and keeps
Name — Role; participant chips, list rows and avatar tooltips are not pickers and keep theirs. Only option lists a user picks from were converted.
- Verified by rendering — 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).
- No impl-pending item: both halves are already on
main (#2621, #2457).
💬 mockup(meetings): v487 — Name (email) across five pickers, email-searchable, and the #2621 datetime
v486
Reports: five org-only blocks stop being shown to roles the API refuses, and the return-rate export arrives (#2737)
11 Sep 2026
Parity
Fix
- Direction is web → mockup: catch-up on code already on
main, so there is no implementation to pend. Found by checking this page against the seven ReportsScreen commits since the v482 whole-app sweep.
- The mockup showed four—really five—blocks to roles the app now hides them from. Its only role logic was
reportsRoles, which gates access to the page for five roles and nothing on it. The app computes canViewOrgReports from ORG_REPORT_ROLES, which is exactly two — PMO and admin — and hides the Notifications & Digest Delivery card, the User Adoption & Access card and three 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.
- ⚠ The Digest Delivery Log export was nearly missed. It sits in the same
canViewOrgReports 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.
- The Return Rate by Stage — CSV export is new here (#2636 shipped it as the one panel on this page you could only read on screen).
- ⚠ And the obvious way to add it would have been wrong. 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. v482 removed them from that very header on purpose, with a note saying
ChartDownloadButtons is mounted on exactly two charts in the app and Return Rate has none, which is still true. #2636 added a CSV export, in the Export panel. The chart header is untouched.
- ⚠ It also carries NO “org-wide” caption, unlike the Audit and User exports beside it: this one applies the caller’s scope and honours the POD/project filter (#1742 made it do so), so that caption would be false. Copying the neighbouring markup wholesale would have attached it.
- Verified by rendering — the page driven in a real DOM as all five roles: five org blocks hidden for Delivery SPOC, POD Owner and Cluster Head, zero hidden for PMO and admin, and the return-rate export present, never gated, and without an org-wide caption in every case.
- No impl-pending item: both halves are already on
main (#2628, #2630, #2636).
💬 mockup(reports): v486 — org-only blocks gated to PMO/admin, return-rate CSV added
v485
Two AiDE switches the admin mockup never showed, and three settings that were never really settings (#2712)
10 Sep 2026
Parity
Fix
- #2707 landed two toggles in Global Automation Settings hours after v484 shipped, and the mockup did not have them. Attendee suggestions for ambiguous names and Flag decisions that may relate to an earlier one — 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.
- The hint text says what each one does NOT do, deliberately, because that is the load-bearing half. Attendee suggestions never assign anyone — AiDE only ranks a list the server already built and the owner still picks. The overlap check judges no contradiction and changes nothing — 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.
- Both carry
ga-toggle, 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 Invitation Link Expiry stays live — the one control that is exempt on purpose. Without that second half, “they were disabled” would only prove that everything was.
- #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. Ten settings, and three failed it.
defaultTimezone was a leftover of a select this mockup deliberately deleted (“no such setting”); timelineDigestDay was orphaned when v482 removed the Timeline Digest card and relocated only its stale-threshold field; and disableAllAutomation had a control that drove the banner and the disabled attributes directly, so the field it is named after was permanently false. The two dead fields are gone and the kill switch now records itself.
- ⚠ A fourth “finding” was a false positive, and it is worth recording which. The first pass matched state keys to control ids by kebab-casing, and flagged
disableAllAutomation as having no control at all — its id is disable-automation-toggle, 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.
- Checked and left alone: v484’s Default POD select is not
ga-toggle, and should not be — the app puts no disabled prop on it either.
- No impl-pending item: every switch here is already on
main (#2707). This makes the mockup show them.
💬 mockup(admin): v485 — the two AiDE switches, and three settings that were never settings
v484
The default POD reaches the mockup: an admin setting, and the P&A picker’s third state (#2705)
10 Sep 2026
Parity
- Direction is web → mockup: this is catch-up on code that already shipped, so there is no implementation to pend. #2681 added a configurable default POD and #2686 the backfill script that gives existing rows the same answer. A grep for
defaultPod across docs/ and mockup/ on 10 Sep returned zero hits — neither surface that documents this product knew the feature existed.
- Admin → Scheduler gains a 🏷️ Priorities & Achievements card with Default POD for unmapped submitters, mirroring
AdminSchedulerScreen.tsx:1968-2009: a select that reads — None configured — until an admin picks one, the hint explaining why the field exists, and the Not configured 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.
- The option list shows POD names and carries POD ids, and only active PODs are offered. That is not cosmetic: a POD id is environment-specific, and matching the default by name would let a rename repoint every unscoped item in the product. The FK guarantees the row exists; it cannot guarantee anyone still works there.
- The P&A demo toggle now cycles THREE states, not two. 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 exactly that POD 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.
- The two lists are mutually exclusive in that state, deliberately. 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.
- Documentation caught up in the same change — a new ADR-28 in the decision log (why the default is a configured id and never a name, why
SET NULL, why the backfill is a reviewed script and not a migration, and why it is forward-only), an amendment on ADR-25 recording that the rule never changed — only who has something to choose — and 02-domain-data-model.md now carries SchedulerSettings.defaultPodId and the warning that untagged rows survive in past weeks.
- Verified by rendering, and falsified in both directions. Both pages were loaded in a real DOM and driven: the admin select lists the two active PODs, holds the id when POD Basu is chosen, hides the Not configured badge only once set and restores it when cleared, and refuses an inactive POD — with an active 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:
own lists Projects and PODs, default lists one POD and no projects and still requires a scope, none requires none, and the cycle wraps. Plus node --check on admin.js and the five inline blocks of pl.html, and check-mockup-history.mjs green.
- No impl-pending item: the web and API halves are already on
main (#2681, #2686). This change makes the mockup and the docs describe them.
💬 mockup(admin,priorities): v484 — the default POD, in the admin settings and the P&A picker
v483
Landing page: Open Backlog refreshed from the live query, admin area cards caught up with the hubs (#2416)
3 Sep 2026
Parity
index.html is meant to be the mockup’s complete AzDO status dashboard, and its Open Backlog was dated 11 July. 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 node scripts/ado.js query 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.
- The 🚧 ribbon is back on the cards that have a feature gap. The legend has promised “dashed border + 🚧 corner + ticket link” since v412, but no card carried it. Now four do, each naming its item: System Status (#2396 — per-service uptime % and 7-day incident history, designed in #1164 and never built), Meeting Notes AI (#2401 — diarization label quality never evaluated against a real recording), Health (#2403 — scheduled unattended AiDE runs, design complete) and the new AiDE 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.
- The admin area had drifted two consolidations behind. Its cards still linked
#templates, #mcp-tokens and #mcp-log 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 Admin Portal · System section holds Settings, with the note that it is the one group gated on the admin role alone. That is AppShell.tsx’s ADMIN_GROUPS, card for card.
- Smaller drift closed on the same pass: the Health card was still titled “Project Health” (#2238 made it one entry, three scopes);
docs.html had no card and now sits in Reference as Solution Overview; the page footer read “Iteration v62 · 12 Jun 2026”.
- Verified by rendering — the page loads with zero errors, exactly four
page-card--todo cards, every new admin hash present as a card, and nine backlog rows each carrying a work-item link. check-mockup-history.mjs green.
- No impl-pending item: nothing here is a design awaiting build — the four ribbons point at the existing open items, which is the whole point of them.
💬 mockup(index): v483 — Open Backlog refreshed from the live query, admin cards caught up with the hubs
v482
Parity sweep: every screen compared against the shipped app — 30 mockup files, one shared Account Update widget (#2413)
3 Sep 2026
Parity
Fix
- Direction is web → mockup, and this time the whole app, not the last four days. v481 walked the 43 commits since v480; this sweep put every one of the 51 screens under
src/web/src/screens 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 history.html mentions it.
- Shared chrome (
nav.js) — the Workflow group now runs in the app’s order (Health before Meeting Notes AI, My Work right after 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: 🪝 Webhooks under AI Integration and a System → ⚙️ Settings group that only the admin role sees — a PMO Associate gets every other admin group and not that one, exactly as AppShell.tsx gates it.
- Ups & Downs — one widget for the biggest gap. The app mounts 🤖 AiDE Account Update — for leadership (#2040) on six rungs plus Cycle Detail; no mockup showed it. It is now
assets/js/account-update-card.js, mounted once per page with the same active-role gate as accountUpdateRoles.ts: 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 before 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.
- Priorities & Achievements — the project/POD scope picker 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 1–3, 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
PAChainStatus layout, and the last AiDE priority cannot be deleted. Cluster Head’s digest gained its project-picker landing and a returned member whose Acknowledge is “↩ Awaiting Resubmission”. History’s malformed <h3>…</h5> is fixed and 📤 Submitted moved to the success colour family the app uses.
- Meeting Notes AI carried the most debt: the 👤 Named in the transcript attendee-label panel (map / dismiss / invite / parked counter), the 🤖 Automatic processing 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 series, 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.
- Health and Reports — 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 Why this score 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.
- Hub screens — 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
?topic= 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.
- Admin — the page’s own inline sidebar matches
AppShell.tsx 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 dropdown 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 EmptyState 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.
- Where the web is wrong, the mockup keeps the truth and the web gets a bug.
ProfileScreen.tsx 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: projects.html’s filter threw on every gated load, timeline.html had no event whose author matched the signed-in user so 🗑 could never render, and workflow/pl.html carried literal ✅ escape sequences no editor could match.
- Every touched page was rendered, not just edited — Playwright over
file:// with a seeded demo session, per role, driving each new state in both directions: the widget present for a permitted role and absent for a Project Lead, Add disabled until a scope is chosen and enabled after, Past runs shown in POD scope and hidden in Project scope. Zero page errors across the final pass.
- No impl-pending item: every feature here already ships. This is the mockup documenting shipped behaviour, the same call v480 and v481 made.
- Follow-up in the same iteration —
PAGES.md brought to v482. The reference doc still described the v312 mockup: it listed 33 pages, omitted help, whats-new, notifications, project-health and docs 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.
💬 mockup(parity): v482 — every screen compared against the shipped app
v481
Parity sweep: six screens caught up with four days of shipped work (#2238 #2258 #2259 #2263 #2276 #2308 #2314 #2360 #2380 #2393)
3 Sep 2026
Parity
- Direction is web → mockup. 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
history.html itself, which merely describes them. Re-scanned against the screen that should host each one, eight gaps were real.
- profile.html — My AiDE Usage card (#2393), between the Fabric Token and MCP Tokens cards, exactly where
ProfileScreen.tsx:522 renders it.
- my-actions.html — 🔀 Reassign (#2360) on meeting-born items only, gated as the app gates it (
canReassign + at least one other active attendee), and the required-justification modal (#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 yours.
- project-health.html + nav.js — the screen is Health now, not Project Health (#2221/#2238): one entry, three scopes, defaulting to My portfolio. The sidebar label, the topbar title and the page title all followed. Plus the Past runs panel (#2308/#2314), seeded with a failed run and a trace-less run — the two rows the feature actually exists for.
- admin/index.html + admin.js — new 🤖 AiDE Configuration 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.
- reports.html — the NL query resolution is no longer a dead end (#2258): AiDE’s reading is shown and Apply to reports sets the live filter. Withheld when there is nothing to apply, which is the rule the control exists for.
- dashboard.html — What changed since you were last here (#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.
- Two pre-existing bugs found and fixed on the way.
ADMIN_SECTIONS in admin.js is an allowlist that had never been given webhooks (#1522) or settings — both exist as sections and nav buttons, so #webhooks and #settings had never resolved. And dashboard.html:1028 read (user && user.email) where user was declared inside an IIFE 500 lines above; a bare undeclared identifier throws rather than evaluating to undefined, so that line killed its whole script block and dashboard show/hide personalisation had never run.
- Every screen was rendered in a real browser, not just edited. Playwright over
file://, asserting behaviour in both directions — Apply offered and withheld, confirm disabled and enabled, every deep-link resolving and 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 esc() helper that does not exist on that page.
- No impl-pending item: every feature here already ships. This is the mockup documenting shipped behaviour, not a design awaiting build — the same call v480 made.
💬 mockup(parity): v481 — six screens caught up with four days of shipped work
v480
MCP tool catalog: server-side governance digest added, count 63 → 64 (#2265)
30 Aug 2026
Parity
- Same direction as v479 and v447 — documentation keeping pace with the real server. #2265 adds
synthesize_governance_digest, so the guide’s catalog and headline count were about to understate the server by one.
- What the tool is for: the server’s three governance prompts hand the connecting client a templated instruction for its own 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.
- mcp-guide.html — 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.
- profile.html — both MCP tool-count mentions bumped.
- Verified mechanically: 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
src/mcp (server.test.ts, validate.test.ts ×2, validate/spec.ts). The v447 lesson holds — the catalog entry landed with the number, not after it.
- No impl-pending item: 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.
📝 mockup(mcp-guide,profile): v480 — MCP tool catalog 63 → 64 for the governance digest tool (#2265)
v479
MCP tool catalog: 2 Account Update tools added, count 61 → 63 (#2041)
13 Aug 2026
Parity
- Documentation catching up to the real server, 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.
- mcp-guide.html — added
generate_cycle_account_update (tagged with the amber “AiDE” chip, like every tool that spends the caller’s own Fabric Token) and get_cycle_account_update (deliberately untagged: 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.
- profile.html — the 2 MCP tool-count mentions bumped, and the capability list now names the Account Update summary alongside AiDE-suggestion drafting.
- Verified mechanically:
tool-card 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).
- No impl-pending item: 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.
📝 mockup(mcp-guide,profile): v479 — MCP tool catalog 61 → 63 for the Account Update tools (#2041)
v478
Two phone-width overflow bugs, ported from a live web sweep (#2019)
6 Aug 2026
Fix
Parity
Mobile
- Where it came from: 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 already correct here (the web had drifted from them), but these two were not.
.card-header (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 .card-header .card-title + div { flex-wrap: wrap; ... } at ≤575px — targets the action row without a class at every call site, since it is always the element immediately after .card-title in this markup.
.alert is display:flex with no flex-wrap — a flex container’s raw text content is an anonymous flex item that does not wrap at the container’s width under the default nowrap, so a long alert message grows to its full unwrapped width instead. The overflow is invisible to a bounding-rect check (the .alert box itself stays inside its parent) — it only shows up as extra page scrollWidth, which is why it survived past a rect-based sweep and needed a scrollWidth-vs-clientWidth check to surface at all. Added flex-wrap: wrap to the shared rule.
- Not changed here: 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.
💄 mockup: v478 — two phone-width overflow fixes ported from the web sweep (#2019)
v477
My Work can raise an action item without leaving the hub (#2007)
3 Aug 2026
Drift
Parity
My Work
- The drift: #2006 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 create one — you had to leave for My Action Items and come back.
- Why the hero, not the card header: “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.
- What changed: the button plus a create-only port of my-actions.html’s
#1140 modal — same rich-text toolbar, same 🙋 Myself-defaulted assignee list, same due date, and the same #1143 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.
- A delegated item does not join your own list: 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 their 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.
- Verified by driving the page headlessly (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.
- Direction of travel: mockup catch-up to already-shipped web behaviour — no
impl-pending item to raise, the implementation is #2006.
💄 mockup: v477 — My Work can raise an action item without leaving the hub (#2007)
v476
Transcript intake is multi-file, matching the web (#1959)
29 Jul 2026
Drift
Parity
Meeting Notes AI
- The drift: the mockup’s transcript intake (create modal + draft intake) accepted exactly one file via a single global
pendingTx / m.transcriptFile, while the real web’s TranscriptDropzone has accepted multiple files since #1949/#1950. Recording upload stays single-file in both — the real app’s recordingFile: File | null state is genuinely one-at-a-time, so it was deliberately left out of scope.
- What changed:
pendingTx → pendingTxList (array); txZoneHtml now shows every already-staged chip alongside 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. m.transcriptFile → m.transcriptFiles[] everywhere: demo data, the meeting-card stored-file chips, the draft-intake “already uploaded” preview, stageTranscript, transcribeRecording and the create-modal submission. Each stored file now gets its own delete button (deleteStoredFile(mid,'transcript',idx)).
- #1956 parity: added the same “N files combined” indicator the web gained in #1956, shown on the draft-intake preview and demoed live on M-1042 (re-seeded with two transcript-part files instead of one).
- Found & fixed a real bug while wiring this up:
pickTx captured input.files by reference and then cleared input.value before the caller read it — a live FileList 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).
- Direction of travel: mockup catch-up to already-shipped web behaviour — no
impl-pending item to raise, this change is the pending item (#1959).
💄 mockup: v476 — transcript intake is multi-file, matching the web (#1959)
v475
Help stopped telling users video upload doesn’t exist (#1958)
28 Jul 2026
Drift
Docs
Meeting Notes AI
- The drift: the app’s Help page said “Recording upload is a Phase-2 feature — for now, provide the transcript.” Video upload shipped in #1413/#1414 and real transcription in #1808. Documentation that denies a working feature is worse than saying nothing: a user reads it and never tries. This was the unpropagated remainder of #1948, which removed the “Phase 1” pill from the intake tabs that morning but left the docs asserting the same dead phasing in stronger terms.
- Found by 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 only one; every other hit is fictional sample content inside the worked examples.
- Fixed in three places: 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),
help.html here, and PAGES.md, whose “Transcript intake (Phase 1)” label contradicted the video-intake line directly beneath it.
- Guarded both ways: 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.
💄 mockup: v475 — Help no longer denies video intake (#1958)
v474
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)
28 Jul 2026
Parity
Re-sync
Admin
Reports
- Scheduled Reports (AdminReportsScreen parity): the Add/Edit Schedule modal only had Name / Report Type / Frequency / Recipients — no way to actually pick when 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 (
scheduleSummary() on the web side).
- AiDE Fabric Token adoption: the per-user connected/not-connected table had no aggregate context. Added the “4 of 5 connected · 80%” summary header + progress bar above it, matching AdminMeetingsScreen’s token-adoption panel.
- Email Templates “Test Send”: 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
TestSendModal, from both the template-preview panel and the rendered-preview modal.
- Reports — 3 new cards: Cycle Time by Stage (SLA) (overall avg/median/p90 + per-stage dwell time, bottleneck called out), By POD & Project (cycles/completion/returns/on-time per project), and User Activity (active-user KPIs + per-role adoption table) — all three already exist on the web ReportsScreen but had no mockup equivalent.
- Direction of travel: mockup catch-up on all four — every web feature already exists, so there is no
impl-pending item to raise.
💄 mockup: v474 — scheduled-report cadence fields, token-adoption summary bar, Test Send recipient modal, 3 new report cards (#1874)
v473
The intake tabs drop their “Phase 1” / “Live” pills — both intakes are real now (#1948)
28 Jul 2026
Drift
Parity
Meeting Notes AI
- The drift: the transcript tab still wore a green
Phase 1 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 #1413/#1414 and real whisper transcription in #1808, so the pill was advertising a phasing that no longer exists and quietly implying the sibling tab was still coming.
- What landed: the pill is gone from the transcript tab, and the matching
Live 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 stays: that is a live permission state, not a phasing label.
- Direction of travel: shipped together with the web change (same commit), so the prototype and the app drop the label in step.
💄 mockup: v473 — drop the Phase 1 / Live intake pills (#1948)
v472
“AiDE Summaries” is now Project Health 🩺 (#1939)
28 Jul 2026
Rename
Parity
Nav
- Why: the old name described who wrote it (AiDE) rather than what it tells you. “Project Health” names the answer, and the 🩺 stethoscope replaces the 🤖 robot — which also frees the robot to mean one thing across the prototype: AiDE did this.
- Renamed: the page title + hero, the sidebar entry (
nav.js), the index card, the Help topic + its nav row, the Admin → Scheduler toggle (“Scheduled Project Health summaries”), and the “summary generated” toast.
- The page file moved too:
aide-summaries.html → project-health.html, with its act() nav key and help-topic mapping following it, so the mockup’s URL matches the web’s new /project-health route. Older entries below still cite the old file name — those are records of what shipped at the time and are left alone.
- Deliberately NOT renamed: the
data-testid handles and the stored summary type 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.
- The 🤖 badges INSIDE the page stay: they attribute the narrative to AiDE, which is still true and still the point. Only the module name changed, not the author.
- Direction of travel: shipped together with the web change (same commit) — the mockup is not catching up here, it is moving in step. The web keeps
/aide-summary alive as a query-preserving redirect so existing deep links and ET-057 emails still land.
💄 mockup: v472 — rename AiDE Summaries to Project Health (#1939)
v471
App-icon badge shows what’s URGENT, not what’s unread — and the demo tile panel is labelled dev-only (#1938 / #1937)
28 Jul 2026
Drift
Parity
PWA
- The drift (#1938):
profile.html 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 single number with no colour or split, so AppShell.tsx has to choose: useAppBadge(myWorkCounts.immediate > 0 ? myWorkCounts.immediate : unreadCount). Anything urgent outranks passive notifications.
- What landed: 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
immediate is overdue action items + RETURNED submissions (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.
- #1937 was already satisfied: the audit asked for a note that the demo tiles come from the live DB, but v455 (#1795) had already rebuilt them as the three-state roster (loading / empty-with-reason / populated) and already named the real endpoint. Two corrections only: the endpoint is
GET /auth/dev-users (not /auth/demo-users as the item claimed), and the panel is now explicitly marked dev-only — the route is registered solely when ENABLE_DEV_TOKEN=true and the app is not production, so it 404s in prod and no tiles can render.
- Direction of travel: mockup catch-up to shipped web behaviour — no
impl-pending item (#1776/#1777 and #1781 are both live).
💄 mockup: v471 — app-icon badge priority + dev-only demo tiles note (#1938, #1937)
v470
Scheduler: the fake Automated Reminders table is gone — a read-only Meeting Notes AI catalog takes its place (#1239 / #1874)
27 Jul 2026
Drift
Parity
Scheduler
- The drift: 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 removed 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.
- What landed (matching AdminSchedulerScreen): the fake table + its two KPI tiles + the
toggleReminder/editReminder handlers were removed. In their place is a read-only Meeting Notes AI Reminders catalog (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.
- Direction of travel: mockup catch-up to a web removal — no
impl-pending item (the web already shipped #1239 / MNA-44).
💄 mockup: v470 — remove fake reminders table, add read-only MNA reminders catalog (#1874)
v469
Scheduled Reports gain a per-report “Run now” action (#1874)
27 Jul 2026
Parity
Re-sync
Reports
- The gap: the web Admin Reports screen (AdminReportsScreen) lets an admin send a scheduled report immediately with a per-row Run now button (POST
/admin/scheduled-reports/:id/run, “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.
- What landed: a Run now 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.
- Direction of travel: mockup catch-up — the web action already exists, so there is no
impl-pending item to raise.
💄 mockup: v469 — Scheduled Reports “Run now” action (#1874)
v468
P&A review shows the submitter’s “Note to Manager” (read-only) — #1209 (#1874)
27 Jul 2026
Parity
Re-sync
P&A
- The gap: on the web bilateral-review screen (PMPAReviewScreen, Bug #1209) the reviewer sees the submitter’s Note to Manager — 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 (
pl.html), but the review screen never surfaced it, so in the prototype the note was write-only: captured on submit, shown to nobody.
- What landed: a 📝 Note to Manager from <submitter> card above the feedback card in
review.html, populated per-submitter by selectQueueCard() from a data-queue-note 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).
- Direction of travel: mockup catch-up — the web card already exists (#1209), so there is no
impl-pending item to raise.
💄 mockup: v468 — P&A review shows the submitter’s Note to Manager (#1874)
v467
Dashboard gains a “Recent Cycles” table alongside the activity feed (#1874)
27 Jul 2026
Parity
Re-sync
Dashboard
- The gap: the web dashboard (DashboardScreen) shows two distinct cards — the personal Recent Activity feed AND a 🔁 Recent Cycles 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.
- What landed: a 🔁 Recent Cycles 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.
- Direction of travel: mockup catch-up — the web card already exists, so there is no
impl-pending item to raise.
💄 mockup: v467 — Dashboard Recent Cycles table (#1874)
v466
MCP Interactions log gains a “Per-tool health” rollup — error rate + latency percentiles (#1874)
27 Jul 2026
Parity
Re-sync
MCP
- The gap: 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.
- What landed: a “🩺 Per-tool health” card above the interactions table, computed client-side from the interaction set grouped by tool (
renderMcpRollups()), 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.
- Direction of travel: mockup catch-up — the web card already exists, so there is no
impl-pending item to raise.
💄 mockup: v466 — MCP log Per-tool health rollup (#1874)
v465
Admin Email Log gains From / To date filters (#1874)
27 Jul 2026
Parity
Re-sync
Email Log
- The gap: the web Admin Email Log (AdminEmailLogScreen) filters by a From / To date range (its
f-from / f-to 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.
- What landed: From and To
<input type="date"> controls (email-log-from / email-log-to) that narrow the table on the send date, wired into renderEmailLog() and reset by clearEmailLogFilters().
- Direction of travel: mockup catch-up — the web filters already exist, so there is no
impl-pending item to raise.
💄 mockup: v465 — Email Log From/To date filters (#1874)
v464
Audit Log gains an Entity column — every row shows its entity discriminator (#1874)
27 Jul 2026
Parity
Re-sync
Audit
- The gap: the web Audit Log (AdminAuditLogScreen) tags every row with its entity 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 what kind of record each event touched. The mockup already had the entity filter 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.
- What landed: an Entity column between Event and Project / Module, rendering the same friendly labels as the web (
AUDIT_ENTITY_LABELS), plus the two colspan values (empty-state + change-detail rows) bumped 7→8 to match.
- Direction of travel: mockup catch-up — the web column already exists, so there is no
impl-pending item to raise.
💄 mockup: v464 — Audit Log Entity column (#1874)
v463
Meetings register gains the AiDE “Processing failed” state — KPI, filter and pill (#1874)
27 Jul 2026
Parity
Re-sync
Meetings
- The 4th AiDE state: the API derives a
failed meeting state (a run that is processing but recorded an aideError), 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 draft / processing / ready plus the #993 Stuck flag — so a reviewer comparing the two saw a state the product has but the prototype didn’t.
- What landed: a Processing Failed stat card (
mtg-stat-failed), a Processing failed option in the Status filter, a .status-pill.failed / .mtg-cal-chip.st-failed style, and a sample failed meeting whose aideError reason renders under the pill (and in the calendar chip). Distinct from #993 Stuck, which is a crashed run that never recorded an error.
- Direction of travel: mockup catch-up — the web surface already exists (AdminMeetingsScreen), so there is no
impl-pending item to raise.
💄 mockup: v463 — meetings register “Processing failed” KPI + filter + pill (#1874)
v462
My Work gains the “Returned to you” tile and the dashboard gains a Reporting Relationships quick link (#1874)
27 Jul 2026
Parity
Re-sync
- Two small mockup↔web catch-ups from a full parity audit. The web My Work screen shows five summary tiles including a Returned to you 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.
- Dashboard Quick Links: the web dashboard offers a Reporting Relationships shortcut alongside Cycle History, Timeline, Profile and Reports; the mockup was missing it. Added so the two Quick-Links cards match.
- Direction of travel: this row follows the implementation — both surfaces already exist in the web app, so this is mockup catch-up with no
impl-pending item to raise.
💄 mockup: v462 — My Work “Returned to you” tile + dashboard Reporting Relationships link (#1874)
v461
ONE page-level Help button in the topbar, plus My Work & AiDE Summaries help topics (#1870/#1869)
26 Jul 2026
UX
Parity
Help
- The problem: 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.
- One button, one place:
assets/js/nav.js now renders #topbar-help-btn in .topbar-right, beside the theme / search / bell cluster, on every page that uses the shared shell. All 35 per-page Help controls removed (15 of them were the repeated per-tab link in admin/index.html alone).
- It is context-aware, not generic: a page → topic map in
nav.js (mirroring src/web/src/utils/helpRoute.ts) opens help.html#<topic> for the page you are on, ordered most-specific-first so admin/audit-log does not get swallowed by admin/.
- Two new help topics: My Work and AiDE Summaries — both modules shipped without one, so their Help button had nowhere correct to point. Added to the left nav and as full sections in
help.html.
- Direction of travel: this row follows the implementation rather than leading it — the web change landed in the same commit, so there is no
impl-pending item to raise.
✨ feat(web): 45 help videos, 2 new help topics, and ONE page-level Help button (#1867–#1870)
v460
Admin Scheduler Settings: Scheduled AiDE Summaries toggle (from-impl parity, #1838)
26 Jul 2026
Parity
Admin
- Toggle added:
admin/index.html Global Automation Settings now carries a Scheduled AiDE Summaries 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.”).
- Why it was missing: 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.
- The web also disables the control while Disable All Automation is on. The mockup’s kill switch only raises the banner, so that state is deliberately not simulated — noted inline.
💄 mockup(admin): v460 — Scheduled AiDE Summaries toggle in Scheduler Settings (#1838)
v459 — Done
Parity audit 2026-07-26 #1827: remove orphan card-todo-ribbon span from AiDE Summaries index card
26 Jul 2026
Parity audit
Maintenance
- Orphan span removed:
index.html AiDE Summaries card (line 191) had a stale from when #1821 was closed. The parent had no page-card--todo class so the ribbon was invisible — but it was unnecessary dead HTML. Removed.
- 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.
- Last-audit date updated in
.aiderules.
📝 mockup(parity): v459 — orphan card-todo-ribbon removed from AiDE Summaries index card (#1827)
v458 — Done
Parity audit 2026-07-26: login.html privileged-tile padlock badge + dev passphrase prompt (#1783 parity, #1825)
26 Jul 2026
Parity audit
Security UX
- Privileged tile padlock badge: the Administrator demo tile (
vishnu.goluguri@valuelabs.com) now displays a 🔒 badge in its name cell, matching the demo-hint-lock span added in LoginScreen.tsx (#1783). All other tiles are unchanged.
- Dev passphrase prompt: 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
sessionStorage (mirrors devTokenSecret.ts) 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.
DEMO_TILES[0] updated with privileged: true — matches the DevRosterUser.privileged shape in demoRoster.ts.
- Three new JS helpers added:
showPrivilegedPrompt(email, name), cancelPrivilegedPrompt(), submitPrivilegedPassphrase() — wired to the prompt's buttons.
- AzDO #1825 azref chip added to the demo hint panel; filed as from-impl; mockup-pending PBI, immediately resolved in this commit.
- 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
aide-summaries.html, all admin sections present.
📝 mockup(parity): v458 — login.html privileged-tile padlock + passphrase prompt (#1783 parity, #1825)
v457 — Done
Parity audit 2026-07-25: resolve merge conflicts, remove stale azref chips (#1809/#1673/#1811), update MNA and AiDE Summaries cards (#1818)
25 Jul 2026
Parity audit
Maintenance
- Resolved git merge conflicts in both
index.html and history.html left by the cherry-pick of commit 39cfb6fa (v454) — HEAD wins in all three conflict blocks.
- Removed stale azref chip #1809 from the Meeting Notes AI card — AzDO #1809 (MNA mockup transcribe-ready state) is Done; the feature was shipped in v454.
- Removed stale azref chip #1673 from the Meeting Notes AI card — AzDO #1673 is Removed (superseded by #1808, which fully implemented the video→transcript pipeline).
- Removed stale azref chip #1811 from the AiDE Summaries card — AzDO #1811 is Done; the full AiDE Summaries screen and API were shipped in the same session.
- Removed
page-card--todo treatment 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.
- Updated MNA card description to reflect the completed pipeline: "Video upload and transcription are implemented (upload recording → Generate transcript → AiDE MoM pipeline)."
- 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.
📝 mockup(parity): v457 — merge-conflict fix + stale azref cleanup + MNA & AiDE Summaries cards updated (#1818)
v456 — Done
AiDE Summaries tweaks: Delivery Health rename, allocation %, evidence source, approval status, trend, tabs (#1810)
25 Jul 2026
AiDE
Refinement
- Renamed the momentum score to "Delivery Health" across the monthly & weekly views.
- Period-over-period trend 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.)
- Compact score header strip — 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.
- Sections collapsed into tabs — Achievements / Meetings / Risks / Highlights are now tabs (with counts) rather than one long scroll.
- Each mapped associate now shows their project allocation % (mini-bar) and their P&A approval status (✅ approved / 🕓 pending / ↩ returned). A note explains AiDE weights approved, well-staffed work more heavily — reinforcing that the score is AiDE's judgment, not arithmetic.
- Added a 4th source: 📎 Evidence & attachments — files on timeline events and meetings that AiDE cites; surfaced in the sources panel, on achievement lines (EVIDENCE tag) and in the attribution footer.
- The "AiDE token connected" chip now also shows on the SPOC / POD / PMO reviewer pages and the P&A PL / Cluster-Head pages (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).
- Extends the AiDE Summaries feature (#1810). No new impl item — folded into #1811.
✨ mockup(aide-summaries): v456 — Delivery Health rename, allocation %, evidence, approval status, trend & tabs (#1810)
v455 — Done
"AiDE token connected" status chip on every AiDE-integrated page (#1810)
25 Jul 2026
AiDE
Consistency
- Only some AiDE screens told you whether your token was connected. 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.
- One shared status chip, in the topbar, on every AiDE page. Added an opt-in
PGNav.render({ aide:true }) flag to the shared assets/js/nav.js; it injects a single 🟢 "AiDE token connected" chip (or an amber 🔑 "Connect AiDE token" link to Profile when it isn't) into the top navigation bar — same element, same place, every time.
- It reads the SAME token as Meeting Notes AI (
localStorage.pg_aide_token), 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.
- Enabled on the six AiDE-integrated pages —
meeting-notes-ai.html, reports.html, priorities/review.html, workflow/pl.html, workflow/pm.html, workflow/cluster-head.html — plus aide-summaries.html, 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.
- Extends the AiDE Summaries work (#1810). No new impl item — the real app already tracks token status via
useAideTokenStatus / AideTokenErrorHint; #1811 covers surfacing it consistently across the AiDE screens.
✨ mockup(nav): v455 — AiDE token status chip on every AiDE page (#1810)
v454 — Done
New screen: AiDE Summaries — AiDE-authored weekly & monthly project summaries (#1810)
25 Jul 2026
AiDE
New screen
- The three governance signals for a project were never brought together. 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.
- New
aide-summaries.html screen asks AiDE to write that summary. Pick a project and a Week or Month; AiDE reads all three sources for that period and returns one shareable narrative — an executive summary, key achievements grouped by associate (each tagged with its source: 🎯 P&A or 🗓️ Timeline), meeting outcomes that deep-link back into Meeting Notes AI, risks & lowlights, and highlights.
- Achievements come from the mapped associates, not just the poster. 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
ProjectMember.projectId → userId → PriorityItem(type=achievement) plus reporting-graph contributors.
- A momentum score gauge (SVG donut, mirrors
ReportsScreen's AideDonut) sits atop the narrative — captioned explicitly as AiDE's own holistic 0–100 verdict, not a ratio computed from the source counts, per the said-vs-done precedent. A "Sources AiDE will read" panel shows the per-period counts up front so the aggregation is visible.
- Copy / PDF / email export on the output, plus an Auto-generate & deliver 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.
- Wired into the shared sidebar (
assets/js/nav.js, Workflow group, same audience as the Project Timeline) and the index gallery. Created feature PBI #1810 and dependent implementation PBI #1811 (New, unassigned, impl-pending; from-mockup) to extend aideClient.ts's schema and build the web + API surface.
✨ mockup(aide-summaries): v454 — AiDE weekly & monthly project summaries (#1810)
v453 — Done
Admin mockup: ⚙️ Customise view added to all five register tables — meetings, audit log, email log, MCP log, scheduler run history (#1077/#1801)
24 Jul 2026
Admin
Customise View
- Meetings register: ⚙️ Customise button added to the card-header toolbar, alongside the List/Calendar view toggle.
- Audit Log register: ⚙️ Customise button added to the card-header alongside “Most recent first”.
- Email Log register: ⚙️ Customise button added to the card-header alongside “Most recent first”.
- MCP Interaction Log: ⚙️ Customise button added to the quick-search toolbar row.
- Scheduler Run History: ⚙️ Customise button added alongside “⬇ Export CSV” in the Run History card-header.
- Shared modal:
openCustomiseView(section) opens a full-featured dialog mirroring CustomiseViewModal.tsx — 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.
- Column visibility drives live
cell.style.display toggling on the table; density applies .density-compact. All five sections have their own isolated CV_STATE object.
- Mockup-only, no impl-pending item needed — all five real screens already ship this under #1077; this closes the #1801 gap.
💤 mockup(admin): v453 — ⚙️ Customise view added to all five admin register tables (#1801)
v452
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)
24 Jul 2026
Meeting Notes AI
POD
- Added
MNA_PODS data array (two demo PODs with members[] rosters) + podOf() lookup + podChipHtml() (purple 🪷 chip, mirroring MeetingDetailScreen.tsx's meeting-detail-pod-chip testid).
- Demo data: one POD-linked meeting
M-1044 and a POD-linked series SR-02 — exercises every new path (detail header chip, list card chip, series row chip, calendar chip, filter).
- List filter select widened from project-only to project-or-POD: two
s (Projects / PODs), proj:/pod: namespace prefixes, matching AdminMeetingsScreen.tsx’s pattern. Filter logic updated: “linked” matches either, “none” excludes both, pod: isolates a POD.
- Detail header: POD 🪷 chip alongside existing project chip; Change link control (one select, two optgroups) offered to
canEditAide users, wired to new saveProjectLink() that patches m.projectId or m.podId XOR-style.
- Create-modal step 3 label changed to “Link to project or POD”; select gains a PODs optgroup; selecting a POD calls
cmPodChanged() which previews the POD roster and offers “Add all team” — exactly mirroring CreateMeetingModal.tsx’s handleLinkChange/handlePodChange. New cmLinkChanged() dispatcher replaces cmProjectChanged as the onchange handler.
- Series row, calendar chip,
addOccurrence(), createMeeting(), and cmPrefillFrom() all updated to propagate podId, matching MeetingDetailScreen.tsx / CreateMeetingModal.tsx behaviour exactly.
- Mockup-only, no impl-pending item needed — all features already ship under #1757; this closes the #1799 gap.
📝 mockup(meetings): v452 — full POD-link concept (MNA_PODS, chip, select, Change link, series, calendar) (#1799)
v451 — Done
My Work mockup: trim stale Timeline escalation row from “Awaiting your review” (#1803)
23 Jul 2026
Fix
My Work
- Removed the “Timeline escalation — UAT sign-off risk” row from the Awaiting your review section in
mockup/my-work.html. This row has existed since the v304-era mockup (~8 months ago) as aspirational design but was never backed by the real GET /api/v1/my-work endpoint — which only ever aggregates kind: 'upsdowns' and kind: 'pa' items. There is no timeline-escalation acknowledgement concept anywhere in the codebase (no DB column, no API route, no frontend type in MyWorkScreen.tsx), confirmed by a grep sweep. aideRiskRadarService.ts itself notes the TimelineEvent 'escalation' type has no queryable backing model.
- Corrected the derived counts: the Awaiting your review summary tile (3→2), the hero badge
⚠ 3/11→⚠ 2/10 (immediate and total both drop by 1), and the tooltip text.
- Mockup-only, no impl-pending item — the trimmed row was already a gap pointing in the wrong direction (mockup richer than reality); removing it closes the gap rather than creating one. AzDO #1803.
🗑️ mockup(my-work): v451 — trim stale timeline-escalation awaiting-review row (#1803)
v450 — Done
U&D workflow mockups: lock the FULL edit surface after an action, not just the action bar (#1796)
23 Jul 2026
Fix
U&D
- The real screens (
DeliverySpocScreen.tsx/SalesSpocScreen.tsx/PMScreen.tsx/PODOwnerScreen.tsx/ClusterHeadScreen.tsx) all compute canEdit from the same “is it my turn” guard as the action bar (#1766) — 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 wfLockActionBar() demo logic only ever disabled the .action-bar buttons after Forward/Return/Override-Close — the rest of the edit surface stayed fully live.
- Added a matching
wfLockEditSurface() to spoc.html, pod.html, and pm.html, called alongside every existing wfLockActionBar() 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 WFPreview.renderTopicNotes({ editable: false }), and disables the file-upload zone.
cluster-head.html turned out to have NO edit-surface lock or action-bar lock at all on Final Approve/Override-Close (the ticket's claim that it shared spoc.html's wfLockActionBar() logic didn't hold on inspection — worth flagging since audit descriptions aren't always accurate) — added wfLockEditSurface() there too, wired into wfFinalApprove() and wfSubmitOverrideClose(), matching ClusterHeadScreen.tsx's own canEdit = cycleInfo.status === 'pod_approved' && !approved 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.
pm.html needed a different mechanism: 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 readOnly-aware data array — so its wfLockEditSurface() hides the existing Edit/Remove buttons in place (🕘 History stays, matching every sibling file) instead of re-rendering the list.
- Verified with a jsdom-backed Node harness (borrowed from
src/web's own dependency) across all 4 files: Edit/Remove affordances present before locking and gone after, add-item rows hidden, upload zone disabled, and WFPreview.renderTopicNotes called with editable:false — plus, for pm.html specifically, that the 🕘 History button stays visible while Edit/Remove don't.
- Mockup-only, no impl-pending item needed — #1766's
canEdit gate already shipped across all 5 real screens; this only brings the workflow mockups' demo lock into parity with it.
🐛 mockup(workflow): v450 — lock the full edit surface after an action (#1796)
v449 — Done
U&D workflow mockups: Co-Sales SPOC added to the reviewer chain (#1797)
23 Jul 2026
Parity
U&D
- The real API (
assertCanOverrideClose / reviewScopeFor in cycles.ts/myWorkService.ts) treats a project's optional Co-Sales SPOC (salesSpocCoId, #1790/GAP-915) as fully equal to the primary Sales SPOC — either may review, forward, return, or override-close a cycle — and it's already shown once in admin/admin.js's project detail (“Sales SPOC: Name / Name”). None of the 4 U&D workflow mockups mentioned the possibility of a second Sales SPOC anywhere.
workflow/cluster-head.html and workflow/pmo.html have an actual Review Chain table with a reviewer-name cell — added the same muted “/ Neelanjana Jaswal” span next to “Sekhar Posina” that admin.js uses, with a title tooltip explaining the equal-rights relationship.
workflow/spoc.html and workflow/pod.html have no such table (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 comment 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.
- Verified:
node --check clean on all 5 inline scripts per file across all 4 files; a standalone Node harness confirmed renderAuditTrail() in both spoc.html and pod.html actually renders the new comment text from their real PG_DEMO.audit data.
- 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.
✨ mockup(workflow): v449 — Co-Sales SPOC added to the reviewer chain (#1797)
v448 — Done
Admin: meetings register gains a POD filter group + badge (#1800)
23 Jul 2026
Admin
Parity
- The real
AdminMeetingsScreen.tsx (#1757) added a POD half to its Project/POD filter and badge — a meeting links to a project OR a POD, never both — but admin/index.html's meetings register filter stayed Project-only (hardcoded P001/P009 options) with no POD group or badge anywhere.
- Read the real screen's exact contract (
projectFilter values namespaced proj:<id>/pod:<id>, “Common” meaning no project AND no POD, the row badge showing 🔗 for a project or 🫧 for a POD) and mirrored it: added a <optgroup label="PODs"> with pod:POD-001/pod:POD-002 options, updated renderAdminMeetings()'s filter so none now excludes POD-linked rows too and a pod:-prefixed value isolates that POD, and updated the project/POD cell to render a distinct purple 🫧 badge when a meeting has pod set instead of project.
- Gave two existing “common” demo meetings a POD link to exercise the new group end-to-end:
M-1043 (Cluster Delivery Review) → POD Basu, M-1041 (ESO Enablement Weekly) → POD Ananth.
- Verified with a standalone Node harness (eval
admin.js directly, stub document/window.location): each pod: filter isolates exactly its own meeting and shows the right badge, none now correctly excludes both project- and POD-linked rows, and the pre-existing project-only filters (P001, linked) are unaffected by the change.
- 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.
✨ mockup(admin): v448 — meetings register POD filter + badge (#1800)
v447 — Done
MCP Guide: tool count/catalog stale at 54, real server exposes 61 (#1802)
23 Jul 2026
MCP Guide
Fix
- mockup/mcp-guide.html said “54 tools” in 4 places 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).
- Read the real MCP server's tool registrations (
src/mcp/src/tools/*.ts, six register*Tools() modules totalling 61 server.registerTool() calls) to find exactly which 7 are missing from the mockup catalog: all seven are the AiDE-powered advisory tools added under #1424/#1466 — draft_cycle_updown & get_cycle_reviewer_brief (Cycle Workflow), get_pa_said_vs_done (Priorities & Achievements), get_risk_radar, get_reports_aide_commentary & ask_aide_reports_query (Reports & Admin), and get_meeting_series_intelligence (Meeting Notes AI).
- Added all 7 as
.tool-card 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.
- Verified:
tool-card element count now matches 61 exactly; no remaining “54” references anywhere in the file; inline <script> re-checked with node --check.
- 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.
🐛 mockup(mcp-guide): v447 — tool count/catalog corrected to 61 (#1802)
v446 — Done
Login: demo roster mirrors the real three-state fetch instead of a static button grid (#1795)
23 Jul 2026
Fix
Login
- The mockup's 27 demo-login tiles were hardcoded static
<button> elements, unrelated to the separate DEMO_USERS object used only for simulateLogin() validation — so the mockup could never show what the real LoginScreen.tsx does under GET /auth/dev-users (#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).
- Replaced the static grid with a
DEMO_TILES array + renderDemoTiles() driven by a demoTilesState variable (null = loading, [] = a real "nothing to offer" answer, populated array = the roster) — the same three states LoginScreen.tsx models with demoTiles. On load the panel shows the loading text, then a simulated fetch (setTimeout, no backend to call from a static page) resolves to the populated grid, with testids (demo-roster-loading/demo-roster-empty/demo-hint-grid/demo-btn-<email>) and copy matching the real screen exactly.
- Added a “preview: empty roster” toggle 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.
- Verified with a standalone Node harness (extract the inline
<script>, stub document): 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.
- Mockup-only, no impl-pending item needed — the real three-state behavior already shipped in
LoginScreen.tsx under #1781; this only brings the mockup's demo affordance into parity with it.
🐛 mockup(login): v446 — demo roster mirrors the real three-state fetch (#1795)
v445 — Done
Meeting Notes AI: build the series “add participant to all occurrences” picker (#1798)
23 Jul 2026
Meeting Notes AI
- Picked up #1798 from the v444 parity audit's own backlog: the real
SeriesOwnersPanel (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. seriesOwnersHtml() now renders a second <select>, and a new addSeriesParticipant(sid, email) 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 addSeriesParticipant exactly.
- #1792 parity too: the new picker also offers an invited (not-yet-activated) demo person (
Nithya Rao, the mockup's first PEOPLE entry with a status 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 addable gained its own status !== 'invited' filter).
- Verified end-to-end with a standalone Node harness (extract the inline
<script>, stub document/localStorage): 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 <select>s with font-style:italic.
✨ mockup(meetings): v445 — build the series participant-add picker (#1798)
v444 — Done
Mockup/impl parity sync: stale azref cleanup + Profile/Reports/Projects/P&A/U&D/Admin refresh (#1793)
23 Jul 2026
Fix
Parity
- Whole-mockup-suite parity audit (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).
- Removed 6 stale 🔗 azref chips whose underlying AzDO items are Done: dashboard.html #983, admin/index.html #1073/#1674/#993/#982/#1086.
- Admin — Meeting Notes AI register now shows a “Stuck (AiDE processing)” stat + a per-row ⚠ badge (elapsed hours + last AiDE stage) for a crashed run that never sets
aideError 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.
- Profile: MCP tool count corrected 54→61 (matching the real copy, incl. AiDE-suggestion drafting); added the 🔑 AiDE Fabric Token card (#1706) — the one common connect point for every AiDE-powered feature, not just Meeting Notes AI where it originally lived. Shares the same
pg_aide_token localStorage key as meeting-notes-ai.html, so "connected" is consistent across mockup pages.
- Account activation error state gained the self-service “request a fresh activation link” form (#1233) that the real screen has had for a while.
- Priorities & Achievements 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.
- Reports 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).
- Projects cards gained the ★/☆ pin-to-sidebar toggle (#1412) —
nav.js grew the write side (togglePinnedProject/isProjectPinned) to go with the sidebar's pre-existing read-only pinnedProjects().
- Ups & Downs 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
draft too.
🐛 mockup(parity): v444 — stale azref cleanup + Profile/Reports/Projects/P&A/U&D/Admin refresh (#1793)
v443 — Done
Meeting Notes AI: broaden occurrence edit permission, fix next-occurrence date, add activity log (#1787)
23 Jul 2026
Fix
Meeting Notes AI
- Editing an occurrence's own date/time was owner-only, even though the "✏️ Edit meeting" button also covers title/platform/duration/follow-up — broadened its gating from
isOwner(m) to canEditAide(m), 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.
- "+ Add occurrence" set the new occurrence's date to today's real-world date instead of the series' own cadence — a weekly-Monday series could land its next occurrence on any weekday. Added
nextSeriesOccurrenceDate(), which computes the correct next date from the series' frequency/dayOfWeek (weekly/bi-weekly) or Nth-weekday/day-of-month (monthly) fields — the same fields seriesRrule() already uses for the .ics export, so the occurrence date and the calendar invite now agree.
- New unified activity log 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.
🐛 mockup(meetings): v443 — broaden occurrence edit permission, fix next-occurrence date, add activity log (#1787)
v442 — Done
Parity audit 2026-07-21: stale chips cleaned, new gaps #1673 + #1674 filed (#1672)
21 Jul 2026
- Stale azref chips removed — #1414 (video intake), #1075 (What’s New drift), #1082 (preview bar) all marked Done in AzDO; their chips removed from
index.html and meeting-notes-ai.html. Admin meetings stale chips #1068, #1080, #1081 (deleted), #921 also cleaned from admin/index.html.
- New impl-pending PBI #1673 filed:
MeetingNotesScreen.tsx 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.
- New impl-pending PBI #1674 filed:
AdminMeetingsScreen missing the List / 🗓️ Calendar toggle present in the admin meetings mockup since v369 (#1069). Monday-first month grid with series/project/status chips.
- #1673 chip added to the Meeting Notes AI card in
index.html and to the list-header gap-chip div in meeting-notes-ai.html. #1674 chip added to the admin meetings section in admin/index.html.
📝 docs(mockup): v442 — parity audit 2026-07-21 (#1672)
v441 — Done
Fold "My Action Items" nav into "My Work" — one cross-module entry instead of two (#1665)
21 Jul 2026
Navigation
- "My Action Items" and "My Work" both surfaced overlapping details — two separate sidebar entries pointing at content that already overlapped.
- My Work is the superset, so it survives: 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.
- The My Action Items page itself is untouched — 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.
- The mobile bottom tab bar already used only the My Work entry, so the desktop sidebar's second entry was the redundant one.
💄 mockup(nav): v441 — fold My Action Items into My Work (#1665)
v440
Meeting Notes AI: 👑 co-owner equal-permission parity at the series and occurrence level (#1645)
20 Jul 2026
Meeting Notes AI
- A meeting series had no co-owner concept at all — only a single
owner. Only the person who created the series could ever add a new occurrence to it, with no way to delegate that.
- An occurrence's existing 👑 co-owner crown was under-powered — 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.
- New "SERIES OWNER(S)" panel 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.
- The "Access & sharing" card grew a third state: 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.
- 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.
💄 mockup(meetings): v440 — 👑 co-owner equal-permission parity at the series and occurrence level (#1645)
v439
Team P&A Status: reverse the week columns to current -> current-1 -> current-2 (#1630)
20 Jul 2026
Priorities & Achievements
- The 3-week window ran oldest-to-newest and looked one week into the future (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.
- Reversed the order to current -> current-1 -> current-2 (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.
- The AiDE score rule is unchanged 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
🤖 73% 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.
- 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".
- 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.
✨ mockup(priorities): v439 — reverse Team P&A Status columns to current/current-1/current-2 (#1630)
v438
Fix: AiDE score belongs on the week it scores AGAINST, not the week it scores (#1630)
20 Jul 2026
Fix
Priorities & Achievements
- v437 anchored the score to the wrong cell. It stacked the
🤖 73% chip under W24's Pending pill (the week whose achievements were judged), on its own second line. User feedback: the score belongs on the previous week — 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.
- Moved Kuntal Singha's
🤖 73% chip from the W24 Pending cell to the W23 Approved cell, rendered inline right after the status pill on one line. W24 reverts to a bare Pending 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.
- 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."
- Left a comment on impl PBI #1631 flagging the corrected layout so implementation doesn't build against the superseded v437 screenshot.
🐛 mockup(priorities): v438 — anchor AiDE score to the previous (scored-against) week, inline (#1630)
v437
AiDE score propagates into the P&A review landing page listings (#1630)
20 Jul 2026
Priorities & Achievements
- v436 only showed the AiDE Achievement Score on the individual review page — 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.
- Added the same
🤖 score chip to both listings, gated by a rule stated explicitly this time: shown only once a week has left Draft/Not-submitted (i.e. Pending, Returned or Approved) AND a previous week exists with priorities recorded to compare against. Concretely in the demo data: Kuntal Singha's W24 (Pending, prior W23 Approved) gets 🤖 73%; 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.
- Same score, same person, same value in both places — the queue card's Swati Nandha row shows
73% Good, 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.
- 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.
- Created dependent implementation PBI #1631 (New, unassigned,
impl-pending; from-mockup), 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.
✨ mockup(priorities): v437 — AiDE score in the review landing page listings (#1630)
v436
AiDE said-vs-done gets a scored Achievement gauge (#1628)
20 Jul 2026
Priorities & Achievements
- The 🤖 AiDE said-vs-done card only ever gave three free-text bullets (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.
- Added a circular Achievement Score gauge (SVG donut, mirrors
ReportsScreen's AideDonut pattern) plus a colour-coded grade chip — 🌟 Excellent (≥80), ✅ Good (60–79), ⚠️ Fair (40–59), 🔴 Needs Attention (<40) — next to the existing bullets, with a one-line rationale underneath.
- Deliberately NOT a locally-computed formula. The three bullets are already AiDE's own free-text judgment (
aideSaidVsDoneService.ts's fetchAideSaidVsDone), 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 score + rationale directly.
- Created dependent implementation PBI #1629 (New, unassigned,
impl-pending; from-mockup) to extend aideClient.ts's said-vs-done prompt/schema and wire the gauge into PMPAReviewScreen.tsx.
✨ mockup(priorities): v436 — AiDE-scored Achievement gauge on said-vs-done card (#1628)
v435
"Add to calendar" (.ics export) for Meeting Notes AI meetings and series (#1524)
19 Jul 2026
Feature
- No calendar integration existed at all — meetings carry date, start time, duration, timezone (#1063) and an advanced recurrence model (#1202), but grepping for
.ics / text/calendar / BEGIN:VCALENDAR across the app returned zero hits. Users had to retype meetings into Outlook/Teams by hand.
- 📅 Add to calendar 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
.ics file client-side (no backend needed for the mockup) via the same Blob+createObjectURL pattern already used by every CSV export in admin.js.
- Series occurrences get a real
RRULE, mapped from the same frequency/dayOfWeek/monthlyMode/dayOfMonth/weekday/ordinals fields the #1202 recurrence picker already writes onto SERIES — weekly/bi-weekly → FREQ=WEEKLY;INTERVAL=1|2;BYDAY=..., monthly day-of-month → BYMONTHDAY, monthly Nth-weekday → BYDAY=1FR etc. (repeated per ordinal, so "1st & 3rd Friday" becomes two BYDAY values). A one-off meeting gets a single VEVENT, no RRULE.
- Reused the #1063 timezone conversion (
zonedToUtc) rather than adding a second wall-time→UTC path — DTSTART/DTEND 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 .ics.
- Created dependent impl PBIs for the API-side
.ics generation utility + email-attachment wiring and the web-side buttons, referencing this mockup version.
✨ mockup(meeting-notes-ai): v435 — "Add to calendar" .ics export for meetings and series (#1524)
v434
This page's own stats were wrong — and nothing was checking them (#1539)
19 Jul 2026
Fix
Tooling
- The design history had drifted from itself. The header claimed
v299 iterations total and 196 releases, while the page actually carried 433 distinct versions across 434 entries — the first stale by 134, the second off by more than 2×.
- Why it drifted so far: both counters were maintained by hand and nothing ever compared them to the document. The releases badge was being faithfully incremented
+1 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.
- Added
scripts/check-mockup-history.mjs, which recomputes the counts from the document and also verifies what the numbers cannot: exactly one current marker (a stale second one is a known past failure), that the current marker is the highest version, that index.html agrees with it, and that the sequence has no duplicates or gaps. --fix rewrites only the two counters.
- One genuine duplicate surfaced: v193 is used twice, for "Monthly Nth-weekday deadlines" and "week/cycle tabs show full date ranges". Deliberately not 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 new duplicate still fails.
- Otherwise the log is in good shape: v1..v433 with no gaps at all.
🐛 mockup(history): v434 — correct the header stats and add an integrity checker (#1539)
v433
Admin: combine Email Templates+Log and MCP Tokens+Log into two hubs (#1532)
19 Jul 2026
Admin Portal
Screen-combining
- Same pattern as the v323 People & Organisation hub, applied twice more: Email (Templates + Delivery Log tabs) and MCP (Tokens + Activity Log tabs) each collapse two nav entries into one, with the sub-sections relocated into tab panels at load by
initEmailHub()/initMcpHub() — every existing render fn, modal and action keeps working unchanged.
- 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.
- Deep links preserved:
#templates, #email-log, #mcp-tokens, #mcp-log all still resolve — into the right hub AND the right tab — via the same legacy-key mapping the People hub established (EMAIL_TAB_FOR/MCP_TAB_FOR).
- Found a real duplicate-of-a-duplicate along the way:
admin/index.html doesn’t even use the shared assets/js/nav.js 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.
- 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.
node --check clean on all 3 touched JS files.
💄 mockup(admin): v433 — combine Email + MCP into hubs (#1532)
v432
Duplicate a meeting — one click prefills the create wizard (#1525)
19 Jul 2026
Meeting Notes AI
- Why: 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.
- ⧉ Duplicate now sits on each list card and on the meeting report, and opens the create wizard (v425) prefilled from that meeting, landing on Basics so the only thing left to set is the date.
- It copies the SHAPE, not the CONTENT. Title, mode, duration, timezone, project link, participants (with their organiser/owner chips) and visibility carry over, because those describe how the meeting is run. The date resets to today, and the transcript, recording and AiDE outcome are deliberately not copied — those belong to the occurrence that already happened, and carrying them would silently attach one meeting's minutes to another.
- Recurrence is not copied either. A series already owns an "add occurrence" flow, so duplicating one into a second series would create two competing schedules for the same meeting.
- The list card is entirely a click target, so the button calls
event.stopPropagation() — 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.
💄 mockup(meeting-notes-ai): v432 — duplicate a meeting prefills the create wizard (#1525)
v431
Fix: the reveal-once secret warning was rendering unstyled (my v428 bug)
19 Jul 2026
Fix
- v428’s webhook reveal modal used
class="admin-alert warn". admin.css defines .admin-alert.info and .admin-alert.warning — there is no .warn 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.
- Correcting the record. v430’s commit message reported this as a pre-existing bug affecting 6 places. Both halves were wrong. The count came from grepping
admin-alert warn, which matches admin-alert warning as a substring, so it counted the 6 correct usages; the real total was 1. And that one was introduced by v428 — by me — not inherited. Every variant now in use (info ×13, warning ×7) has a matching CSS rule.
💄 mockup(admin): v431 — fix the unstyled reveal-once warning
v430
Admin portal: back-fill the Settings section the app already ships (#1521)
19 Jul 2026
Parity
Admin
- Third web → mockup back-fill in a row, after v428’s Webhooks and v429’s Reports view controls. The app has shipped
/admin/settings since #1335 — a read-only view of the API’s runtime configuration plus a live SMTP connection test — while the admin mockup had 14 nav sections and no Settings. No impl item: there is nothing for the web to build.
- 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”.
- Secrets are presence-only. 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.
- The sample config carries two real warnings 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.
💄 mockup(admin): v430 — back-fill the Settings section (#1521)
v429
Admin portal: back-fill the Settings section the app already ships (#1521)
19 Jul 2026
Parity
Admin
- Second of the two web → mockup back-fills, after v428’s Webhooks. The app has shipped
/admin/settings since #1335 — a read-only view of the API’s runtime configuration plus a live SMTP connection test — while the admin mockup had 14 nav sections and no Settings. No impl item: there is nothing for the web to build.
- 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”.
- Secrets are presence-only. 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.
- The sample config carries two real warnings 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.
💄 mockup(admin): v429 — back-fill the Settings section (#1521)
v428
Admin portal: back-fill the Webhooks section the app already ships (#1522)
19 Jul 2026
Parity
Admin
- Direction is web → mockup, which is the unusual one. The app has shipped
/admin/webhooks 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. No impl item: there is nothing for the web to build.
- Modelled deliberately on the two nearest existing sections rather than inventing a shape: MCP Tokens 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 MCP Log for the status-badge attempt table.
- The event catalog is the app's
WEBHOOK_ELIGIBLE_EVENTS verbatim — 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.
- The sample delivery log carries both failure modes on purpose: an ordinary
503 that succeeds on its retry, and a 301 refused outright — because the SSRF guard added in #1506 deliberately does not follow redirects. A mockup that only ever showed happy-path deliveries would misrepresent how this screen actually behaves.
💄 mockup(admin): v428 — back-fill the Webhooks section (#1522)
v427
Streamlining round 2: scheduler projects disclosure + Single/Bulk invite combined (#1527)
19 Jul 2026
Admin Portal
Entry-flow streamlining
- Review-cycle modal (the last OVERLOADED form from the audit): the Assigned Projects checkbox grid moved into a disclosure section with a live "N selected" count 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.
- Screens combined: the separate "Invite New User" and "Bulk Invite Users" modals — same job, two dialogs — are now ONE ✉️ Invite Users modal with 👤 Single / 📋 Bulk CSV tabs (ARIA tabs pattern). One toolbar entry point;
openBulkInviteModal() stays as a deep-link alias onto the Bulk tab. The bulk send/results/Done flow swaps only its own tab's panel.
- Hardening: tab buttons carry
role=tab/aria-selected, panels role=tabpanel; footers swap with the active tab so the primary action always matches the visible form. Also fixed a silent default bug: openInviteModal() set role to 'pl', a value no option has — now 'projectLead' explicitly.
- Round 2 of #1516 (v425 wizard, v426 admin tabs/collapse). Verified offline with Playwright: 18 checks green incl. v426 regressions.
💄 mockup(admin): v427 — scheduler projects disclosure + combined Single/Bulk invite modal (#1527)
v426
Admin entry flows: email-template tabs + collapsible project approval chain (#1516)
19 Jul 2026
Admin Portal
Entry-flow streamlining
- Email-template editor (the densest admin form: ~9 fields + a 13-chip variable palette in one flat scroll) is now 3 tabs: ✏️ Content (Name, Subject, HTML body + palette — both required fields live here, and a save validation failure switches back to it), 📮 Delivery & CTA (Trigger, Recipient, CTA label/link), ⚙️ Settings (Enabled toggle, Category). Reuses the design-system
.mode-tab-btn pills; every field ID unchanged, so editTemplate()/saveTemplate()/insertVar() work as before.
- Project modal: the ~6 dynamically-rendered approval-chain selects moved into a native
<details> section — open for a new project (the senior chain is required), collapsed 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.
- Second chunk of the #1516 entry-flow streamlining audit (first: v425 create-meeting wizard). Verified offline with Playwright: 14 checks green across both modals.
💄 mockup(admin): v426 — email-template tabs + collapsible project approval chain (#1516)
v425
Create-meeting popup becomes a 4-step wizard (#1516)
19 Jul 2026
Meeting Notes AI
Entry-flow streamlining
- Why: the create-meeting modal had grown to ~14 field groups / 20+ controls in one scroll — 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.
- Now a stepped wizard using the existing
.podgov-stepper-bar circles + connectors: 1 Basics (the six required fields) → 2 Schedule (recurring series + follow-up, which moved up from the old form's tail — it is schedule semantics) → 3 People & sharing (project link, participants, org-visibility — visibility moved next to participants because both decide who sees it) → 4 Content (recording, transcript file / pasted text).
- Only Basics is required. "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
createMeeting() behaviour are unchanged — this is a pure regrouping.
- Verified offline with Playwright against the static file: 22 checks (step switching, series/follow-up interlock, validation jump-back, create + modal close) all green.
💄 mockup(meeting-notes-ai): v425 — create-meeting popup becomes a 4-step wizard (#1516)
v424
Accent colours: the light palette failed AA wherever it carried text (#1503)
19 Jul 2026
Accessibility
Design system
- 11 of the 14
--accent-green/--accent-red usages failed WCAG AA. Two different failure modes, which is why a single re-tone could not fix it: text on a light surface (.change-label, .old-text/.new-text, .btn-delete:hover — worst 2.28:1 on 12px body text) and white text on a fill (.toast.success/.danger, .pri-chain-step.done, .notif-bell-badge, and login's .btn-success/.btn-danger — also 2.28:1). Only 3 usages were safe: a border-left and two audit dots, none of which carry text.
- Why it survived v294. That pass fixed the buttons by hardcoding darker hexes (
.btn-danger #dc2626, .btn-success #15803d) rather than fixing the tokens, so the light tokens lived on and every other consumer stayed broken. login.html then overrode .btn-success/.btn-danger back to the raw tokens, undoing that fix on the login page entirely.
- Two fixes, matched to the two failure modes. Text usages moved to the existing
--tint-*-fg scale (5.02:1 / 6.47:1). Fills moved to new --accent-green-solid / --accent-red-solid tokens — deliberately theme-invariant, because the base accents lighten in dark mode and that drops white-on-fill to 1.74:1. Their values are not invented: they are the ones v294 already hardcoded into the buttons, now tokenised so every fill inherits the fix.
- Also caught:
.btn-success:hover was lighter than its own base (#16a34a, white-on 3.30:1) — a hover that reduces contrast. Now #166534, 7.13:1.
- No impl-pending item: 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.
💄 mockup(design-system): v424 — accent colours that carry text now clear AA (#1503)
v423
Design system: the muted tint token the v294 accessibility pass missed (#1501)
19 Jul 2026
Accessibility
Design system
--tint-neutral-fg was still #64748b, giving 4.34:1 against its own paired --tint-neutral-bg-strong (#f1f5f9) — under the 4.5 AA floor for normal text. On the weaker --tint-neutral-bg it scrapes 4.55, which is likely why it survived: the token only fails against one of the two surfaces it is authored to sit on.
- A residual miss from v294’s axe-core WCAG pass, which darkened
--text-muted/--text-secondary from #64748b to #576475 for this exact reason (“table headers were 4.36:1”) but left this sibling on the old value. Now #576475 too — 5.50:1 on -bg-strong, 5.76:1 on -bg. Two stale var(--text-muted, #64748b) fallbacks in the account-switcher rules were updated to match.
- Found by the web, not by eye. #1493 added a derived assertion to the app’s test suite — every
--tint-*-fg must clear 4.5:1 against its paired --tint-*-bg 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.
- No impl-pending item: the web side is already shipped. #1454 reconciled the app’s whole muted family (
--text-muted, --text-faint, --tint-neutral-fg) onto #576475 to match this file, so this change restores parity rather than creating new work.
💄 mockup(design-system): v423 — darken --tint-neutral-fg to clear AA (#1501)
v422
Design system: one canonical segmented control, retiring three imitators (#1482)
19 Jul 2026
Design system
Consistency
- Four different “pick one of N views” patterns had accumulated: this page's own
.view-toggle (bordered group, flat blue active tab, no track) disagreed with timeline.html's .view-switch (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).
- Canonical shape = the raised-pill track (this page's
.view-toggle retoned to match timeline.html's .view-switch) — 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.
- Implemented alongside this mockup update, not deferred: impl item #1482 itself ships a new shared
SegmentedControl component and repoints Reports, My Action Items, and the Timeline view switcher at it in the same commit — no separate impl-pending item needed.
💄 mockup(design-system): v422 — unify the segmented control (#1482)
v421 — done
Data alignment pass: tabular figures + vertical rhythm in every data table (#1428)
18 Jul 2026
Polish
Design system
- Shared
design-system.css rules, so the fix lands on every data table site-wide: font-variant-numeric: tabular-nums 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 vertical-align: middle so sort icons sit on the text line.
- Complements the chart-token work (v416) and the web-side alignment pass already specced in impl item #1426 — noted there so the implementation mirrors both.
💄 mockup(design-system): v421 — tabular figures + table rhythm (#1428)
v420 — done
Reports: export ALL charts as images in one click (#1427)
18 Jul 2026
Feature
Reports
- v416 gave every chart card its own ⬇ PNG / SVG buttons; the Data Exports card still offered CSVs only. A new 🖼 All charts — PNG 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.
- Web build-out rides with the v416 chart work in impl item #1420 (bundle action noted there) — no separate item needed.
💄 mockup(reports): v420 — export all charts as images (#1427)
v419 — done
Web↔mockup sync: MNA attachment delete (#1360 mirror) + series completion slider (#1425)
18 Jul 2026
Feature
Parity
- Impl→mockup catch-up: the web app shipped delete the stored transcript/recording (#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.
- Series completion slider (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 #1426. Mockup-planned features were preserved throughout — sync merges both directions, never deletes design-side work.
💄 mockup(meetings): v419 — attachment delete mirror + series slider (#1425)
v418 — done
AiDE everywhere: drafted U&D, reviewer briefs, said-vs-done, series intelligence, risk radar, report insights (#1423)
18 Jul 2026
Feature
AiDE
- Six AiDE expansions, each built on data the platform already holds and all following the review-before-commit guardrail: 🤖 AiDE suggestions 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); reviewer brief on the PM rung (delta vs last cycle, recurring items, attention points); said-vs-done on the P&A bilateral review (last week’s priorities vs this week’s achievements).
- 🧠 Series intelligence on Meeting Notes AI (series meetings only): changed-since-last-occurrence, recurring unresolved topics, and a drafted agenda for next time. 🛰 Risk radar for the Cluster Head: weekly ranked cross-project risks from downs, blockers, escalations and overdue actions. 🤖 AiDE insights on Reports: generated commentary on the page’s own numbers plus a natural-language “Ask AiDE” query box.
- MCP catalog growth (meetings/timeline/reports tools, outbound webhooks) is spec-only here — carried by impl item #1424 together with the full web/api build-out (caller-scoped access, run attribution, failure notifications, server-side gates).
💄 mockup(aide): v418 — AiDE expansion set across six surfaces (#1423)
v417 — done
Meeting Notes AI: edit / delete individual summary points + refresh the mindmap & action items (#1421)
18 Jul 2026
Feature
Meeting Notes AI
- Until now the AiDE outcome supported spelling corrections and a full re-run — but a contradictory or not-required point in the minutes could not be removed or reworded on its own. Every summary and decision bullet now shows hover/focus ✏️ edit (inline textarea) and 🗑 remove controls for the owner / organiser / designated owner / admin, in the review stage only (locked once shared or finalized — same gates as corrections).
- Edits accumulate into a visible “n edited · m removed” bar with ↻ Refresh mindmap & action items: AiDE re-derives the downstream artefacts from the curated minutes, and the run lands in the processing-run history as a 🧽 Refresh after summary curation entry.
- Implementation item #1422 (New, impl-pending) carries the web/api build-out incl. the server-side gate parity and the derived-action-item reconciliation rule.
💄 mockup(meetings): v417 — per-point summary curation + derived refresh (#1421)
v416 — done
Chart quality pass (theme-aware, CVD-safe) + image downloads for every chart & the MNA mindmap (#1419)
18 Jul 2026
Feature
Reports
Accessibility
- Chart tokens: the four Reports SVG charts (Ups&Downs trend, return-rate bars, P&A completion line, AiDE donut) hard-coded light-theme hexes (grid
#e2e8f0, ink #64748b) that broke in dark mode. They now draw from --ch-* CSS variables with per-theme steps validated with the data-viz palette checker against the real surfaces (#ffffff / #1e293b).
- Colorblind-safe Ups/Downs: the old green/red pair fails deutan simulation (ΔE 4.1). Ups vs Downs is polarity, so it now uses the diverging blue↔red pair — 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.
- Downloads: new shared
assets/js/chart-tools.js — PGChart.download() exports any inline SVG chart as .svg or .png (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.
- Meeting Notes AI: the discussion mindmap downloads separately as an image (user request) — PNG/SVG buttons on the mindmap card, filename derived from the meeting title.
- Implementation item #1420 (New, impl-pending): mirror in web ReportsScreen/MeetingDetail — chart tokens, CVD-safe pair, downloads, plus the full hover/tooltip layer per the dataviz spec.
💄 mockup(reports,meetings): v416 — chart quality pass + image downloads (#1419)
v415 — done
X/Y attention counters — immediate-action vs total-open, on My Work & My Action Items (#1417)
18 Jul 2026
Feature
Navigation
- User request: a compact X/Y counter where X = tasks needing immediate action (overdue action items; for My Work also returned submissions) and Y = total tasks not completed yet.
- Sidebar badges (shared nav.js): My Work shows
3/11, My Action Items shows 2/5 — 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.
- Page headers: 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 #1418).
💄 mockup(nav): v415 — X/Y attention counters (#1417)
v414 — done
Cycle History: Project + POD columns for row-level visibility (#1415)
18 Jul 2026
Feature
Cycle History
- 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 Project column (bold name) and a POD column (purple chip).
- Both are wired into the Customise View 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.
- Implementation item filed for the web CycleHistoryScreen (columns + view-prefs + CSV + API payload fields): #1416 (New, impl-pending; from-mockup).
💄 mockup(cycle-history): v414 — Project + POD columns (#1415)
v413 — done
Meeting Notes AI: video intake ENABLED — 50 MB upload cap, Project Lead and above only (#1413)
18 Jul 2026
Feature
Meeting Notes AI
- The 🎥 Video recording intake is no longer a “Phase 2 — coming soon” placeholder: the intake tab and the create-meeting recording zone are live. Accepts
.mp4 / .mkv / .webm / .mov with a hard 50 MB 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.
- Role gate: video upload is available to Project Lead and above 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).
- 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 #1414 (upload API with server-side 50 MB limit + 403 for contributors, AiDE transcribe pipeline, ET-035/ET-043 notifications).
💄 mockup(meetings): v413 — enable video intake, 50 MB cap, Project Lead+ (#1413)
v412 — done
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)
18 Jul 2026
Feature
Navigation
Parity
- 📥 My Work hub (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.
- ⌘K palette v2: typing now also finds data — cycles by id, meetings, action items and (admin/PMO-gated) people — not just pages. Breadcrumbs + Older/Newer switcher on Cycle Detail walk the archive without bouncing to the list; slide-over previews on Cycle History open a row’s summary in a right-hand drawer keeping filters/selection intact.
- Shell: sidebar collapses to a 64px icon rail (persisted, tooltips carry labels), a Pinned projects section deep-links into the role’s workflow page, and a mobile bottom tab bar (≤768px) carries Home / My Work / Ups & Downs / Meetings / More. Dashboard gains show/hide section personalisation (persisted) and a 4-step first-run tour (re-run via 🧭 Tour).
- Notifications: 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.
- Web-parity sweep (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.
💄 mockup(nav): v412 — navigation & layout batch + stale-chip parity sweep (#1409)
v411 — done
Reports & Analytics: per-feature report coverage — Meetings, action items, users, email, MCP, attachments (#1407)
18 Jul 2026
Feature
Reports
- The Reports page covered Ups & Downs, Priorities & Achievements, Timeline and digests — but six feature areas had no report at all. Added one card per gap: 🎤 Meeting Notes AI (meetings held, AiDE runs, MoM success rate, failed runs, action items per project), ✅ Action Item Aging (open/overdue/completed KPIs, age buckets, per-assignee table), 👥 User Adoption & Access (active users by role, sign-ins, pending invites), 📧 Email Deliverability (delivered/failed/recovered, by category), 🔌 MCP Plugin Usage (tokens, calls, success rate, top tools), and 📎 Evidence Attachments (files by module, storage, uploaders).
- KPI strip gains an Open action items tile (with overdue delta); the Data Exports card gains five matching CSV buttons. New tables reuse the comparison-table + sortable-header pattern and carry
scope="col" headers.
- Implementation item filed for the web/API build-out of these report cards (New, impl-pending; from-mockup), dependent on #1407.
💄 mockup(reports): v411 — per-feature report coverage (#1407)
v410 — done
Admin Access & Security: Auth Rate Limit min aligned to the API floor (5), fixing a guaranteed 400 (#1228)
17 Jul 2026
Fix
Admin
- The Auth Rate Limit (per 15 min) input allowed
min=1, but the API validates the value as an integer between 5 and 1000 and returns a 400 otherwise. So a security-conscious admin tightening 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.
- Raised the input’s
min to 5 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.
- Implemented in the same batch, not filed as a separate impl-pending item:
src/web/src/screens/AdminSchedulerScreen.tsx (the live field’s min={5} + hint) and its test.
🐛 fix(mockup,web): v410 — Auth Rate Limit min aligned to the API floor of 5 (#1228)
v409 — done
MCP guide + profile: tool count and catalog updated for Meeting Notes AI + Project Timeline (#1357)
15 Jul 2026
Docs
MCP
- The MCP server (
src/mcp) 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 54 tools.
mcp-guide.html: bumped every “34 tools” reference to “54” and added two new tool-grid sections (Meeting Notes AI, Project Timeline) after the existing Admin Portal grid, matching the live catalog exactly.
profile.html: the MCP connect card's tool-count blurb and the AiDE Remote Servers step now read 54 tools and name the two new modules.
- Implemented in the same batch, not filed as a separate impl-pending item:
src/mcp/src/tools/meetings.ts + timeline.ts, server registration, the drift-guarded server.test.ts/validate/spec.ts harness, new Jest suites, and docs/claude-desktop-config.md + docs/mcp-setup.html + README.md updated to match.
✨ feat(mockup,mcp): v409 — MCP tool catalog synced to 54 tools incl. Meeting Notes AI + Timeline (#1357)
v408 — done
Ups & Downs: SPOC-level-and-above override-close + posted-to-leadership date (#1337)
14 Jul 2026
Feature
Workflow
- New ⚡ Override — Close Cycle Now action on
spoc.html (both Delivery + Sales SPOC), pod.html, and cluster-head.html: 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.
cluster-head.html: the existing Sign-Off card gains a required “Date posted to leadership” 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.
- Described precisely in
PAGES.md 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.
- Implemented in the same batch, not filed as a separate impl-pending item:
src/api (schema + migration, cycleWorkflow.ts, new POST /cycles/:id/override-close, review-chain + audit vocabulary) and src/web (shared OverrideCloseCard, all 4 workflow screens, ClusterHeadScreen/CycleDetailScreen chain badges).
💄 mockup: v408 — SPOC-level-and-above override-close + posted-to-leadership date (#1337)
v407 — done
Mockup corrections from the non-workflow parity sweep — three annotations that misdescribed the shipped app (#1327–#1330)
14 Jul 2026
Parity
- A parity sweep of the ten non-workflow screens found several places where the mockup — not the web — was the stale side. Three of them actively misdescribed what has already shipped, which would mislead the next implementer into “fixing” working code. Corrected here.
projects.html: the search box’s own placeholder promises “Search by account name, ID, or POD”, but the filter never matched POD. It does now — the shipped React screen already did.
my-actions.html: the design-forward badge claimed the project filter was not shipped. It is (#1160). Re-pointed at what genuinely is design-forward: the row-level project chip and the 🔁 series-context line (#1062).
profile.html: removed the #1076 “impl-pending” azref claiming per-project timeline mute toggles were missing. They are implemented (NotificationPreferences.tsx → PATCH /notifications/timeline-mute).
- The genuine web-side 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).
- Profile came back at full parity — recorded so it is not re-swept.
💄 mockup: v407 — correct three annotations that misdescribed the shipped app (#1327)
v406 — done
PM — Quick Link 1 standardised to the shipped copy (#1207)
13 Jul 2026
Parity
- The PM gap-audit sweep flagged Quick Link 1 as a React/mockup divergence — but on checking,
pod.html and spoc.html had already been standardised to “🎯 Review Priorities & Achievements Submissions” by the POD Owner sweep (#1182), and all four React screens use that wording. pm.html was simply the last stale mockup, still on “🤝 Priorities & Achievements Review”.
- So the mockup was wrong here, not the app — a good reminder that “mockup is source of truth” is a default, not a reflex. Standardised
pm.html to match its three siblings and the implementation.
- No implementation work item needed: the React screens already render the standard copy.
💄 mockup(pm): v406 — standardise Quick Link 1 to the shipped copy (#1207)
v405 — done
PMO — Ups/Downs read-only caption synced to the shipped screen (#1205)
13 Jul 2026
Parity
- Gap-audit sweep of
pmo.html vs PMOScreen.tsx (following the POD Owner #1182, Sales SPOC #1183 and Cluster Head #1204 sweeps) found exactly one divergence: the Ups and Downs card headers read Read-only in the mockup but Read-only — current reviewed version in the shipped screen.
- Synced the mockup up to the implementation 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 current reviewed state, not a historical snapshot), so downgrading the app to match a terser mockup would have been a regression.
- 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.
💄 mockup(pmo): v405 — sync Ups/Downs read-only caption to the shipped screen (#1205)
v404 — done
Meeting Notes AI — advanced recurrence picker for Recurring series (PBI #1202)
13 Jul 2026
Feature
Workflow
- Follow-up to v403/#1200: asked to “use the advanced setting for the recurring selection”, pointing at
AdminSchedulerScreen's Add/Edit Cycle recurrence editor (Frequency, Days of Week pills, monthly Nth-weekday, live Schedule preview, Timezone) as the reference pattern.
- Replaced the New Meeting modal's flat
CADENCE dropdown (Weekly/Bi-weekly/Monthly/Ad hoc) with the same picker already built for the mockup's own admin/index.html “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.
- Deliberately does not duplicate Deadline time/Timezone the way the Cycle modal does — a meeting series already has its own Start time (
#cm-time) and Timezone (#cm-tz) fields earlier in the same form, so the schedule preview reads those live instead of asking twice.
SERIES entries now carry structured recurrence (frequency, dayOfWeek[], monthlyMode, dayOfMonth, weekday, ordinals[]) in place of a single cadence string; a new seriesScheduleLabel() renders the series-card and series-bar pills (e.g. “Weekly · Mon, Wed”, “Monthly · 2nd Friday”) and falls back to the legacy seed shape.
- 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
SERIES record; the pre-seeded SR-01 series still renders its pill correctly under the new label function. Zero console/page errors.
- Dependent implementation work item #1203 (
impl-pending; from-mockup, To Do/unassigned) tracks the matching CreateMeetingModal.tsx + MeetingSeries model/API change.
✨ feat(mockup): v404 — advanced recurrence picker for Recurring series (#1202)
v403 — done
Meeting Notes AI — hide the one-off Follow-up meeting toggle for recurring series (Bug #1200)
13 Jul 2026
Bug
Workflow
- 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”.
- Create modal: checking “Recurring series” now hides the Follow-up meeting block (
cmSeriesToggled()) and clears its state, replaced by a hint explaining the series' own next-occurrence flow.
- Edit modal: when the meeting being edited belongs to a series (
meeting.seriesId set), the Follow-up meeting toggle is not rendered at all — the same hint is shown instead, and saveMeetingEdit() forces followUp.created=false for series occurrences regardless of any stale DOM state.
- Dependent implementation work item #1201 (
impl-pending; from-mockup, New/unassigned) tracks the matching fix in CreateMeetingModal.tsx / EditMeetingModal.tsx.
🐛 fix(mockup): v403 — hide Follow-up meeting toggle for recurring series (#1200)
v402 — done
My Action Items — WYSIWYG rich-text editor + wider modal (#1187)
13 Jul 2026
Feature
Layout
- The “What needs doing?” field's plain textarea gained a rich-text toolbar (Bold/Italic/Underline/bullet/numbered list) — mockup-cosmetic, mirroring
priorities/pl.html's existing .rt-toolbar/.rt-btn pattern. The shipped React screen's RichTextEditor is fully functional (contentEditable, sanitized on save).
- The modal widened from 520px to
min(900px,95vw) to give the toolbar and multi-line editing real room, rather than a cramped single-line field.
- Investigated before implementing: switching the field to rich HTML meant the API had to sanitize on write (
cleanRichText, mirroring priorities.ts) and the ET-030/031/032 reminder emails had to project the HTML to plain text first (richTextToPlain) — 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.
- Implemented in the same batch as this mockup change —
ActionItemModal.tsx, MyActionItemsScreen.tsx (List/Table/Board render real formatting via <RichText>; the compact Calendar chip shows a plain-text preview instead), meetingService.ts, and schedulerService.ts in src/web/src/api, so no separate impl-pending placeholder item was created.
✨ feat(web+api): v402 — My Action Items WYSIWYG rich-text editor + wider modal (#1187)
v401 — done
Restricted-access copy + admin invite domain enforcement (Bug #1194)
13 Jul 2026
Bug
Copy
- 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:
admin.ts's invitation creation only validated email shape, no domain restriction (unlike /auth/magic-link and /auth/register, which already enforce @valuelabs.com-only). Confirmed there is no non-@valuelabs.com access path anywhere in the system, by design.
- Fixed on both mockup and web:
login.html'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 (admin/index.html) copy and placeholder were corrected to match, and admin.js's sendInvitation() now rejects a non-@valuelabs.com email client-side.
- Implemented in the same batch —
admin.ts's createSingleInvitation (shared by the single and bulk invite endpoints) and AdminUsersScreen.tsx's Invite User modal both gained the matching @valuelabs.com-only guard, so no separate impl-pending placeholder item was created.
🐛 fix(web+api): v401 — restrict invitations + fix restricted-access copy (#1194)
v400 — done
My Action Items — 🎤 voice-command capture via browser Web Speech API (#1187)
13 Jul 2026
Feature
Accessibility
- New “🎤 Voice add” button next to “➕ New action item” on My Action Items. Uses the browser-native
SpeechRecognition/webkitSpeechRecognition API to transcribe speech client-side — no new backend secret or STT service for v1.
- 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
POST /meetings/my-actions (#1140) — no backend changes needed.
- Feature-detected: the button is
hidden (not just disabled) on a browser with no SpeechRecognition, e.g. iOS Safari, matching the shipped React screen's behaviour.
- Implemented in the same batch as this mockup change —
useVoiceCapture hook + MyActionItemsScreen/ActionItemModal wiring in src/web, so no separate impl-pending placeholder item was created.
✨ feat(web): v400 — My Action Items voice-command capture (Web Speech API) (#1187)
v399 — done
POD Owner screen sweep — Chain-summary self-inclusion, stale Quick-Links copy, Preview-journey placement (#1182)
13 Jul 2026
Workflow
Copy
- Mockup↔web gap-audit sweep of
pod.html (Ups & Downs, Step 5, POD Owner) vs the shipped PODOwnerScreen.tsx.
- Quick Links: first link's icon/copy (🤝 “Priorities & Achievements Review →”) was stale — the web already standardized on 🎯 “Review Priorities & Achievements Submissions” (matching
spoc.html's already-updated copy, and identical across DeliverySpocScreen/SalesSpocScreen/PMScreen). Updated pod.html to match; no impl impact, web was already correct.
- 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
pl.html/pm.html precedent; no impl impact.
- Also fixed in the same pass (web-only, no mockup change needed): the Summary card's “Chain:” text in
PODOwnerScreen.tsx 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.
🐛 fix(web): v399 — POD Owner Chain-summary + mockup copy/placement parity (#1182)
v398 — done
Meeting Notes AI “gap chips” audit badges were stacked on top of each other
13 Jul 2026
Layout
Polish
- 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
.azref, which is position:absolute by design (a single corner badge per element) — so all six stacked at one point and only the top one was clickable.
- Matched index.html’s multi-badge pattern: flow them inline with
position:static (dropping the corner 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.
💄 mockup(meetings): v398 — Meeting Notes AI gap-chip badges flow in a row instead of stacking
v397 — done
Two more mockup pages were broken: Meeting Notes AI rendered fully blank; History scrolled sideways
13 Jul 2026
Layout
Bug
- How they were found: after the index-page nested-
<a> 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.
- Meeting Notes AI was completely BLANK (Bug #1184): a “Gap chips” block of AzDO ticket links had been pasted as raw HTML into the middle of a
var html = '…' + '…' string-concatenation, leaving an unterminated string literal — Invalid or unexpected token — 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).
- History scrolled sideways (Bug #1184): a timeline description contained a literal, unescaped
<select multiple> tag which the browser rendered as a real ~8000px-wide form control, blowing out the page width. Escaped it to display as text.
- No dependent impl work items — both are mockup-only rendering bugs on the mockup’s own pages, with no product/web surface to change.
🐛 fix(mockup): v397 — Meeting Notes AI blank-page (JS parse error) + History overflow (unescaped <select>)
v396 — done
Index landing page: 15 cards silently broken by illegal nested <a> (AzDO ticket links)
13 Jul 2026
Layout
Bug
- The bug (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
.page-card is an <a>, and the cards that carry an AzDO ticket badge nested a second <a> (the .azref corner link, and the inline #NNN link inside a .tag-todo tag) inside that card anchor. Nested <a> 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.
- The fix: converted the 12
.azref corner anchors and the 3 inline .tag-todo ticket anchors to <span data-href> (a <span> inside <a> 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 #NNN links were left as real anchors — they live in <div> rows, not inside a card <a>, so they were never nested. Verified every grid now has zero spilled children and all cards render uniformly.
- No dependent impl work item — this is the mockup’s own links-landing page (
index.html), not a product screen, so there is no web/API surface to change.
🐛 fix(mockup): v396 — index cards no longer broken by illegal nested <a> ticket links
v395 — done
FUTURE-01 scoped out — multi-account dashboard / account switcher (#889)
13 Jul 2026
Dashboard
New Feature
- The ask (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
Account entity exists — Project.name, e.g. “APS Bank”, IS the client account; confirmed via schema doc-comments and existing .account-header usage across the mockup), the existing dashboard (already has an org-wide “By POD & project” aggregate table), and existing selector patterns (ProjectsScreen's card-grid, ClusterHeadPAScreen's inline project-picker-when-missing).
- Direction chosen (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.
- Built:
assets/js/nav.js gained a PGAccountSwitcher (new PG_ACCOUNTS 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 .account-switcher* classes in design-system.css. dashboard.html now reads the selection (sessionStorage.pg_selected_account): shows a #dash-scope-banner, 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.
- 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.
- 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.
💄 mockup(dashboard): v395 — FUTURE-01 account switcher scoped out (#889)
v394 — done
Delivery/Sales SPOC context-alert copy was stale vs. the shipped screens
13 Jul 2026
Workflow
Copy
- The gap (Task #1176, found during a
spoc.html vs DeliverySpocScreen.tsx deep-compare): both role branches of spoc.html's context alert (spoc-alert-text) 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). pod.html (POD Owner) had already been updated to a longer form explaining the colour legend, and DeliverySpocScreen.tsx / SalesSpocScreen.tsx already ship that exact longer copy for both roles — the mockup was the one out of sync, not the web.
- Replaced both branches' alert text with “You may add new items, modify existing ones, or remove incorrect ones. Modified items highlighted in orange; newly added in blue.”, matching the shipped web copy verbatim for both the Delivery SPOC and Sales SPOC role views this shared page serves.
- 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
DeliverySpocScreen.tsx (item-meta “Added by (Role)” + Preview-journey button copy/placement) under Bug #1175, committed separately.
💄 mockup(workflow): v394 — SPOC context-alert copy synced with shipped screens (#1176)
v393 — done
MCP Setup Guide gains the 4 sections the shipped web Help MCP tab had grown
13 Jul 2026
MCP Guide
Parity
- The gap (PBI #1166, follow-up to Bug #1165's tools-table fix from the same sweep): the web Help screen's MCP Integration tab (
HelpScreen.tsx) had grown 4 sections the standalone mcp-guide.html 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.
- Product decision: port all 4 sections. Added MCP Token vs AiDE Fabric Token (
#pat-vs-fabric-token) right after the Option A/B comparison table; added Other MCP Clients (#other-clients, per-client config table + stdio/HTTP/Zed code samples) and its Any MCP Client — The Generic Recipe subsection (#generic-client), plus Remove or Reset the Integration (#mcp-remove, 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 pod-governance server-key / http://localhost:3001/api/v1 example conventions), styled with the mockup's existing callout/.steps/table classes — no new CSS needed.
- No dependent impl work item — the web Help tab already has this content; this only brings the standalone reference into parity (#1166).
💄 mockup(mcp-guide): v393 — port 4 missing sections from web Help MCP tab (#1166)
v392 — done
Login/footer/admin-invite copy no longer claims “invitation-only”, contradicting shipped self-registration
13 Jul 2026
Login
Copy
- The gap (
login.html:693,1006, auth-verify.html:93, auth-activate.html:110, admin/index.html:1964): 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 @valuelabs.com 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: @valuelabs.com addresses can sign in or self-register (no invite); only non-@valuelabs.com addresses require an Administrator invitation (auth.ts's /magic-link and /register both enforce the domain; /admin/users/invite has no such restriction).
- Replaced the login banner and all four footer lines' “Invitation-only access” with “Restricted access” / “
@valuelabs.com 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 @valuelabs.com users can self-register instead.”
- Web mirrors:
LoginScreen.tsx (banner + footer), AuthVerifyScreen.tsx + AuthActivateScreen.tsx (footers), AdminUsersScreen.tsx (invite modal explainer), custom.css (comment only). Updated LoginScreen.test.tsx and AdminUsersScreen.test.tsx assertions to match. No dependent impl work item — web and mockup updated together in this same pass (#1170).
💄 fix(web): v392 — restricted-access copy replaces stale invitation-only claim (#1170)
v391 — done
System Status — dropped uptime %/incident-history from spec and mockup (would require fabricated data)
13 Jul 2026
System Status
PAGES.md
- The gap (
PAGES.md:661,666, System Status spec): the spec called for per-cell uptime % and a 7-day per-service incident history, but the shipped StatusScreen.tsx 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: status.html's uptimeFor() 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.
- Product decision: drop the requirement from
PAGES.md 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 PAGES.md's System Status section and added a note explaining why they're deliberately absent. Also removed status.html's uptimeFor() function and its use in the per-service metrics line (now latency-only, matching what StatusScreen.tsx 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.
- 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).
💄 mockup(status): v391 — drop uptime %/incident-history from spec + mockup (#1164)
v390 — done
Admin Reporting Relationships — removed the manual Level field (regression risk vs. web's derived-only approach)
13 Jul 2026
Admin
Reporting Relationships
- The gap (
admin/index.html:2153-2166, Add/Edit Reporting Relationship modal): the mockup had a required, independently-selected Level 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 (AdminReportingRelationshipsScreen.tsx) has no such field — Level is derived purely for display from the direct report's role (pairLabel()), and the API schema (ReportingRelationship) 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.
- Removed the
Level form-group/select from the Add/Edit Reporting Relationship modal (replaced with a hint that Level is derived automatically); admin.js's saveRelationship() now derives level from the selected Direct Report's primary role (new deriveLevel() helper, mirrors web's pairLabel()) 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 r.level, now auto-derived on save instead of manually chosen).
- 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).
💄 mockup(admin): v390 — Reporting Relationships Level field now derived, not manually picked (#1155)
v389 — done
MCP Setup Guide — tools table missing get_cycle_digest, undercounting its own header
13 Jul 2026
MCP Guide
Tools Table
- The gap (
mcp-guide.html, Available Tools section, #tools): 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 get_cycle_digest — a real, shipped MCP tool (src/mcp/src/tools/cycles.ts:160, tested in src/mcp/src/tests/cycles.test.ts and enumerated in server.test.ts's full tool list) that the web Help screen's MCP Integration tab already lists correctly under “Cycle workflow (10)” (HelpScreen.tsx:1818-1833), totaling 34. A stale/incomplete tool table is a real usability gap for anyone wiring up an MCP client from this reference.
- Added a
get_cycle_digest tool-card to the Cycle Workflow grid (between get_review_chain and forward_cycle, matching the web's ordering), bringing the listed count to 34 and back in sync with the header.
- 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.
💄 mockup(mcp-guide): v389 — tools table gains missing get_cycle_digest row (#1165)
v388 — done
System Status — About/Roles copy was stale vs. the shipped StatusScreen
13 Jul 2026
System Status
Copy
- The gap (
status.html:164-193, About/Roles section): the mockup's About paragraph and per-role Responsibility text were an older, terser draft, while the shipped StatusScreen.tsx (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 (PL)/(PM) abbreviations on the first two roles.
- Synced
status.html'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.
- 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:
StatusScreen.tsx never renders a per-service uptime % (mockup's uptimeFor() 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.
💄 mockup(status): v388 — About/Roles copy synced with shipped StatusScreen.tsx (#1163)
v387 — done
Profile — My MCP Access Tokens table had no empty state
13 Jul 2026
Profile
MCP Tokens
- The gap (
profile.html:634-663, renderMyTokens()): when window.profileState.myTokens is an empty array, the function maps over it and joins the result, which for zero rows is just '' — the table renders with a header row and nothing below it, no message at all. The shipped web app's ProfileScreen.tsx (lines 512-515, data-testid="tokens-empty") 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.
- Fixed
renderMyTokens() to short-circuit on an empty list: renders a single full-width (colspan="8") row with matching copy and also hides the token-expiry banner in that case (previously left in whatever state the last render left it).
- No dependent impl work item needed — the web app already has this empty state; this only fixes the mockup's own missing affordance (#1158).
💄 mockup(profile): v387 — My MCP Access Tokens table gains an empty state (#1158)
v386 — done
Cycle-detail post-approval note: char counter said “/ 2000”, API/web enforce 500
13 Jul 2026
Cycle Detail
Copy
- The gap (
cycle-detail.html:56,58,470): the post-approval note textarea (#post-note-text) used the app's generic 2000-char comment-field convention (n+' / 2000', warn past 1800, no maxlength attribute) — but this field is special-cased server-side: routes/cycles.ts:2775 throws “Note text must be 500 characters or fewer.” The shipped CycleDetailScreen.tsx (lines 512, 520-521) already correctly uses maxLength={500} with a warn threshold past 450 — the mockup was the one out of sync with both the API contract and the shipped web implementation.
- Fixed the mockup: added
maxlength="500" to the textarea, changed the oninput counter/warn-threshold to / 500 and >450, and fixed the same stale '0 / 2000' reset string in toggleAddNoteForm().
- 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).
💄 mockup(cycles): v386 — post-approval note char counter now matches the API's 500-char limit (#1157)
v385 — done
Edit-meeting modal: mockup drifted from the web component it claims to mirror (title, required-field markers, follow-up toggle)
13 Jul 2026
Meeting Notes AI
Edit modal
- The gap:
openEditMeetingModal()'s own comment (line 2710-2711) states it was built to mirror EditMeetingModal.tsx — but three things had drifted: (1) the modal title said “✏️ Edit meeting” vs web's “✏️ Edit meeting details”; (2) no required-field * 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 create-meeting modal, #cm-followup) 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.
- Fixed all three: aligned the title text, added the
* markers, and added an #em-followup-toggle checkbox that show/hides #em-followup exactly like the create modal's #cm-followup; saveMeetingEdit() now reads the toggle state instead of inferring “created” from whether the date field has a value.
- Reverse-direction fix: the mockup's owner-only helper note (“Only the meeting owner can change these…”, line 2724) was missing from
EditMeetingModal.tsx entirely — ported it into the web modal verbatim.
- No dependent impl work item needed beyond the web-side port already made in this same commit.
💄 mockup(meetings),fix(web): v385 — Edit-meeting modal parity (title, required markers, follow-up toggle, owner note) (#1156)
v384 — done
Projects: search placeholder gains “ID” (already matched by filterProjects()) + web's Open button now says “Open Cycle →”
13 Jul 2026
Ups & Downs
Copy
- Search placeholder (
projects.html:34): said “account name or POD”, but filterProjects() (line 445) already matches by project ID too — the placeholder was stale relative to its own logic. Web's placeholder (ProjectsScreen.tsx:353) already correctly says “account name, ID, or POD”. Updated the mockup to match.
- Open button label: mockup's project card (
projects.html:436) reads “Open Cycle →”; the shipped ProjectsScreen.tsx (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.
- 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.
💄 mockup(projects),fix(web): v384 — Projects search placeholder + Open Cycle button copy parity (#1153)
v383 — done
New Meeting modal: allow pasting the transcript text at creation, not just uploading a file
12 Jul 2026
Meeting Notes AI
Create modal
- The gap: the shipped web app's create-meeting modal (
CreateMeetingModal.tsx) reuses the shared TranscriptDropzone component, which offers both a file upload and a paste-text option at creation time — the mockup's create modal (openCreateModal()) only ever offered the file upload (txZoneHtml()); pasting was possible only afterwards, from the meeting's own detail page (renderDraftIntake's #tx-text textarea).
- 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).
- Added an “or paste the text” divider + textarea (
#cm-tx-text) 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 pendingTx mechanism a dropped file already uses — mirroring the shipped API, which attaches either a file or transcriptText to the meeting at creation.
- 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.
💄 mockup(meetings): v383 — New Meeting modal accepts a pasted transcript, not just a file (#1152)
v382 — done
Meeting Notes AI: add the missing ❓ Help link (list & detail views)
12 Jul 2026
Meeting Notes AI
Help
- The gap (
meeting-notes-ai.html): 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 help.html#help-meetings already having a full, ready-to-link “🤝 Meeting Notes AI” section.
- The shipped web app implements this exact affordance on both screens:
MeetingNotesScreen.tsx and MeetingDetailScreen.tsx each render a ❓ Help button opening <HelpModal topic="meetings"> — the mockup was the one out of sync.
- Added a
❓ Help link to the list view header (next to “+ New Meeting”) and the detail view's top action bar (next to “← All meetings”), both pointing at help.html#meetings, mirroring the existing timeline.html Help-link markup/style exactly.
- No dependent impl work item needed — the web app already has this on both screens; this only fixes the mockup's own missing affordance.
💄 mockup(meetings): v382 — add the missing Help link to Meeting Notes AI (#1151)
v381 — done
Command palette (⌘K): add the five missing People & Organisation tab deep-links
12 Jul 2026
Navigation
Command Palette
- The gap (
assets/js/command-palette.js): the shared palette's Admin group had a single People & Organisation entry linking to the hub landing page, while the shipped web CommandPalette.tsx (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.
- The mockup's own admin router already supports this:
admin/admin.js's PEOPLE_TAB_FOR map resolves legacy hash keys #projects/#pods/#users/#reporting/#org-hierarchy straight to the matching hub tab — the capability existed, it just wasn't exposed as palette commands.
- Added the five entries to
COMMANDS, mirroring the web app's icons/labels/keywords exactly (admin-projects, admin-pods, admin-users, admin-reporting, admin-org).
- 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.
💄 mockup(nav): v381 — command palette gains the five People & Organisation tab deep-links (#1150)
v380 — done
Admin sidebar: add the missing Meeting Notes AI link (Management group)
12 Jul 2026
Navigation
Admin
- The gap:
admin/index.html’s #section-meetings register (Meeting Notes AI stats, filters, and table — already tracking #1068/#1080/#1081) has always had real content, but assets/js/nav.js’s Management group only ever linked People & Organisation — the meetings register was reachable only by typing the URL hash directly, never from the sidebar.
- Found via a mockup↔web parity audit: the shipped web app’s
AppShell Management group already lists People & Organisation then 🤝 Meeting Notes AI side by side — the mockup was the one out of sync, not the implementation.
- Added
🤝 Meeting Notes AI to the Management section, immediately after People & Organisation, mirroring the web app’s own order exactly.
- No dependent impl work item needed — the web screen (
AdminMeetingsScreen.tsx, routed at /admin/meetings) already exists and is already reachable from its own sidebar; this only fixes the mockup’s discoverability.
💄 mockup(admin): v380 — add the missing Meeting Notes AI sidebar link (#1146)
v379 — done
Per-item reminder mute for self-raised action items (🔔 switch in the modal, 🔕 badge on the row)
12 Jul 2026
My Action Items
Reminders
- The gap (
my-actions.html): a meeting-born action item inherits its meeting’s reminders enabled switch (the owner’s per-meeting toggle), but a self-raised item (v378 / #1140) has no meeting to inherit from — so it always sent ET-030/031/032 with no way to quiet it.
- 🔔 Remind me about this: the modal’s static “reminders follow the due date” note becomes a real checkbox, on by default (a due date that never chases you is a trap), that spells out the consequence when unticked — “🔕 Muted — still tracked, but sends no reminders”.
- 🔕 No reminders badge on any OPEN item whose reminders won’t fire — a muted self-raised one, and 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).
- Muting is curation: 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.
- Mirrors the SHIPPED behaviour (#1143, implemented in the same batch) — no new impl work item needed.
💄 mockup(my-actions): v379 — per-item reminder mute for self-raised action items (#1143)
v378 — done
My Action Items: four views (List / Table / Calendar / Board), group-by, and self-raised action items on the same reminder pipeline
12 Jul 2026
My Action Items
Views
Grouping
Self-raised items
- Four views (
my-actions.html): the existing 📋 List and 🗓️ Calendar are joined by a dense ▦ Table and a 🗂️ Board — a kanban by due bucket (Overdue / Due today / Due this week / Later / Closed) where an empty 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.
- Group by: Due date (default), Meeting, Project, Status, Source — applies to List + Table; disabled on Calendar and Board, which group by due date already (the control says so in its tooltip).
- ➕ New action item (#1140): raise a standalone 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 same 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.
- 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.
💄 mockup(my-actions): v378 — four views + group-by + self-raised action items (#1141)
v377 — done
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
12 Jul 2026
Dashboard
Reports
Layout fix
- Dashboard (
dashboard.html): KPI tiles gain trend deltas (▲/▼ vs last week/cycle); a new “This week’s cycle” panel (stage pipeline, submitted/pending/returned counts, deadline countdown); a per-POD / per-project completion breakdown with bars; and a richer Recent Activity feed — type icons, actor + role, relative time, and All / P&A / U&D / Meetings filter chips.
- Reports (
reports.html): a global filter toolbar (date-range presets + custom, POD, project) that re-scopes every card with a live scope label; a KPI summary strip (cycles, P&A completion, return rate, avg cycle time, AiDE runs) with trend deltas; and a new Governance SLAs & Participation report (on-time submission, avg approval latency, active participants) with an expandable per-project drill-down.
- Index layout fix (
index.html): hardened .page-card — align-items:flex-start so no child stretches, the tag pinned to a uniform bottom line (margin-top:auto + align-self:flex-start + flex:0 0 auto, fixing the stretched-pill symptom), a min-height on the icon, and extra bottom padding for the azref chips — addressing the misaligned-card screenshot.
- Dependent impl PBIs filed: #1127 (dashboard detail) and #1128 (reports detail).
💄 mockup(reports,dashboard): v377 — reports + dashboard detail upgrade + index card-layout fix (#1126)
v376 — done
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)
12 Jul 2026
Login / Registration
Priorities & Achievements
Ups & Downs
Access control
- Self-registration (
login.html): a @valuelabs.com email with no account is now offered direct registration — the old “not invited / contact admin” dead-end became a Create your account step (name → registerAndContinue()). Since the backend always appends @valuelabs.com, every not-found address is a valid work email, so no invitation is required. The new account starts unmapped (no reporting manager, no project), so it lands on the Dashboard + Meeting Notes AI with P&A and U&D gated. New demo chip: 🆕 New user — self-register.
- P&A access gate (
nav.js + priorities/pl.html): Priorities & Achievements is accessible only when the reporting manager is mapped AND the mapping is active. Gated via a paNoManager 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 People & Organisation → Reporting Relationships.
- Ups & Downs access gate (
nav.js + projects.html): U&D is accessible only when the user is mapped to a project with a Project Lead (or above). Gated via a udNoProject flag — 🔒 locked nav item + an access-required page state pointing to People & Organisation → Projects.
- Flags default to granted when absent, so every existing demo user is unaffected; only the self-registered (unmapped) user demonstrates the gates. Dependent implementation PBIs filed (
impl-pending; from-mockup).
💄 mockup(auth,priorities,workflow): v376 — self-registration + P&A/U&D mapping-based access gates
v375 — done
Project team roster — add-all project team members (name preview) in the meeting create modal + map project contributors to a project (admin + inline)
12 Jul 2026
Meeting Notes AI
Admin · Projects
Project team
mockup-only
- Add all project team members (user request): in the Meeting Notes create 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 + Add all N to participants button. Members already added are excluded from the count; the preview stays in sync as participants change. Data:
MNA_PROJECTS[].members; logic: cmProjectChanged() / cmAddAllProjectMembers().
- Map project contributors to a project (user request, both surfaces): (a) admin Projects — the project edit modal gains a Project Contributor(s) multi-select, the projects table row shows the mapped contributors, and
saveProject() keeps each contributor’s own projects[] in sync (two-way); (b) inline — the create-modal team panel has a “🔗 Map a contributor to this project” picker (cmMapContributor()) that edits the project roster on the spot.
- Mockup-only per the stakeholder request — the option is enabled in the mockups only. A dependent New/To-Do impl PBI is filed (
impl-pending; from-mockup) so a future agent can decide whether to port it to the web app + API.
💄 mockup(meetings,admin): v375 — add-all project team members + map project contributors to a project (#1117)
v374 — done
My Action Items — consolidated page synced from the shipped web screen (impl→mockup, #1072)
11 Jul 2026
New page
Meeting Notes AI
Dashboard
- Direction W→M (stakeholder request, live-screen screenshot): the consolidated My Action Items experience shipped in the web app (#983 screen, #986 done-toggle, #987 nav + dashboard widget) but had no mockup counterpart.
- New
my-actions.html on the standard app shell, mirroring MyActionItemsScreen.tsx / GET /meetings/my-actions: KPI strip (📌 open, ⚠️ overdue, 📈 closure rate), 🔍 search by task or meeting, Pending only / All select, 4-column rows (task · “From meeting” link · 👤 owner + role · due pill + date) and an optimistic ✓ Mark done / ↩️ Reopen toggle that reconciles the KPIs and toasts. Empty states match the web copy.
- Forward-design (marked with a
design-forward 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.
assets/js/nav.js: ✅ My Action Items sidebar entry right after Meeting Notes AI (same everyone audience; mirrors the web nav-my-actions-link). dashboard.html: the v373 CTA banner now links to my-actions.html; the satisfied #987/#1072 azref chips removed. index.html: new page card (36 pages); stale #1081 (Removed, duplicate) and #1082 (Done, mockup-only) chips dropped from the MNA card.
- No dependent impl item — impl→mockup sync of already-shipped web features; the design-forward extras are already covered by open PBIs #1062/#1066.
💄 mockup(my-actions): v374 — My Action Items page synced from web (impl→mockup, #1072)
v373 — done
Dashboard — My Action Items CTA banner rendered as real HTML (impl→mockup sync, #1078)
11 Jul 2026
Dashboard
Meeting Notes AI
- Direction W→M: the shipped
DashboardScreen.tsx (#987) renders a My Action Items 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.
dashboard.html: new #my-actions-banner rendered after Returned to You (same order as the web) in the established banner idiom — info tint, ✅ icon, “You have 3 open action items (1 overdue) assigned to you across your meetings.” and a View → CTA. Mirrors data-testid="dashboard-my-actions".
- CTA links to
meeting-notes-ai.html (where action items live) until the consolidated My Action Items mockup page ships with #1072 — the #987/#1072 chips stay on the pending banner for that remaining sync; the satisfied #1078 chip was removed.
- No dependent impl item — this is an impl→mockup sync of an already-shipped web feature (#987); there is nothing to implement.
💄 mockup(dashboard): v373 — My Action Items CTA banner rendered (impl→mockup, #1078)
v372 — done
What’s New — sync the 🔔 Desktop & mobile push notifications release note from the shipped web (#1075)
11 Jul 2026
What’s New
- Content-drift fix (from-impl):
whats-new.html stopped at the Email Log note (30 Jun) but the shipped web (src/web/src/data/whatsNew.ts) already ships a newer release note.
- Added the Desktop & mobile push notifications 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.
- No implementation impact — the feature already shipped in
src/web; this only aligns the mockup release-note page, so no dependent impl PBI.
💄 mockup(whats-new): v372 — sync push-notifications release note (#1075)
v371 — done
Docs — PAGES.md Admin Portal section synced to the v323 People & Organisation hub (impl parity) (#1073)
11 Jul 2026
Docs
Admin Portal
- Impl→mockup documentation sync (#1073): the mockup admin portal already implements the People & Organisation hub (v323 — single sidebar entry, 5-tab strip,
initPeopleHub()/switchPeopleTab(), legacy-hash deep-links via PEOPLE_TAB_FOR), mirroring the shipped AdminPeopleHubScreen (#878). But PAGES.md still described the old five-separate-sections IA.
- Rewrote the Admin Portal section: added a People & Organisation hub paragraph (tab labels 👥 People & Roles | 🧩 PODs | 🏢 Projects | 🔗 Reporting Lines | 🌳 Hierarchy, matching the impl exactly; legacy
#users/#pods/#projects/#reporting/#org-hierarchy hashes deep-link onto the matching tab) and collapsed the sidebar list to the single hub entry.
- Verified tab-label parity against
AdminPeopleHubScreen.tsx (org tab = 🌳 Hierarchy on both sides). No HTML/JS change — the mockup was already at parity; this is a docs-only catch-up, so no dependent impl item (impl already shipped in #878).
📝 mockup(docs): v371 — PAGES.md People & Organisation hub sync (#1073)
v370 — done
Shell — one-click 🌙/☀️ light-dark swap on the top header (shell + admin topbars) (#1070)
11 Jul 2026
App shell
Admin Portal
- Stakeholder feedback: the theme swap should be clickable on the top header, not only via Profile → 🎨 Appearance or the ⌘K palette.
assets/js/nav.js: a 🌙/☀️ button in the shared shell topbar (before the 🔍/🔔 cluster) — click calls PGTheme.toggle(), writing an explicit light/dark preference (overrides System, same semantics as the existing controls). admin/index.html: the same button on the Admin Portal topbar.
assets/js/theme.js: apply() 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.
- Login/auth pages keep their fixed dark branding (no toggle) by design. jsdom-verified on both topbars (toggle →
data-theme + pg_theme + icon/tooltip; PGTheme.set() re-syncs the icon).
- Dependent impl PBI filed (impl-pending; from-mockup): AppShell topbar button in
src/web calling utils/theme.ts — the same toggle the CommandPalette uses.
💄 mockup(shell): v370 — topbar light/dark swap (#1070)
v369 — done
Admin — Meeting Notes AI register gains the 🗓️ calendar view with a 📋 List ↔ 🗓️ Calendar switch (#1069)
11 Jul 2026
Admin Portal
Meeting Notes AI
- 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.
- 📋 List ↔ 🗓️ Calendar toggle on the register card header. List view unchanged; calendar = Monday-first month grid with ‹ Prev / Next › + Today, chips on the admin’s viewer-local day (status-coloured edge, local time, 🔁 series-occurrence + 🔗 project markers, ⚠ overdue count), each chip linking to the meeting page.
- All register filters (search / status / mode / project) apply inside the calendar; content stays owner-controlled — chips carry metadata only, exactly like the table rows.
- 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).
- Impl folded into #1068 (AdminMeetingsScreen parity, shared impl item — references v368 + v369) rather than a new PBI.
💄 mockup(admin): v369 — register calendar view + list/calendar switch (#1069)
v368 — done
Admin — Meeting Notes AI register refreshed with the v365–v367 additions: 🔁 series chips, 🔗 project column + filter, viewer-zone times (#1067)
11 Jul 2026
Admin Portal
Meeting Notes AI
- Stakeholder follow-up: bring the administrator oversight register (
admin/index.html#meetings) in line with the user-facing additions from v365–v367.
- 🔁 Series: occurrence rows carry a series chip (series id · cadence · occurrence N of M). The register stays flat — 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).
- 🔗 Project: new column (project chip, or 🌐 Common for unlinked meetings) + a Project filter (All / Project-linked (any) / a specific project / No project) composing with search + status + mode; Clear resets it.
- 🌍 Viewer-zone When:
date/time/timezone fields replace the display string; the column renders in the admin’s browser zone (created-in zone in the tooltip + a “created in <zone>” note on non-IST rows). Demo: Cluster Delivery Review created in Europe/London.
- Deliberately no calendar view here — the register is closure-metrics-first; the 🗓️ calendar ships on the user-facing list (v367). jsdom-verified (12 assertions). Dependent impl PBI filed (impl-pending; from-mockup, AdminMeetingsScreen parity, sequenced on #1062/#1064/#1066).
💄 mockup(admin): v368 — Meeting Notes AI register parity with v365–v367 (#1067)
v367 — done
Meeting Notes AI — 🔎 project / common filter + 🗓️ calendar month view (series occurrences on their own dates) (#1065)
11 Jul 2026
Meeting Notes AI
- 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.
- Project filter in the toolbar: All meetings / 🔗 Project-linked (any) / a specific project / 🌐 No project (common). Composes with search + mode + status and applies in both views (builds on the v365 project link).
- 🗓️ Calendar view (📋 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). Series occurrences are deliberately un-stacked here — each occurrence sits on its own date.
- Days & times place by the viewer-local 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.
- jsdom-verified (17 assertions: filter isolation per option, occurrence splitting, today highlight, month nav, chip navigation, filters inside calendar). Dependent impl PBI filed (impl-pending; from-mockup).
💄 mockup(meetings): v367 — project/common filter + calendar month view (#1065)
v366 — done
Meeting Notes AI — 🌍 selectable timezone at creation; every time shown in the viewer’s browser timezone (#1063)
11 Jul 2026
Meeting Notes AI
- Stakeholder feedback: the create flow hardcoded IST (“Start time (IST)”). Meetings can now be created for any timezone and everyone sees them in their own.
- Create + Edit modals: a Timezone selector (curated IANA zones with live GMT offsets, “— your zone” marker) defaulting to the creator’s browser zone (
Intl.DateTimeFormat().resolvedOptions().timeZone). Stored per meeting (Meeting.timezone); legacy meetings default to Asia/Kolkata; series occurrences inherit the zone.
- Viewer-zone display everywhere: 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 8:00 BST for a London viewer). Tooltips + a “created in <zone>” note preserve the original wall time.
- Conversion helper mirrors
date-fns-tz zonedTimeToUtc using Intl.DateTimeFormat.formatToParts — no library. Verified under a forced viewer zone (IST 10:00 → 5:30 local; Berlin 09:00 → 8:00 local; exact UTC instants asserted).
- Demo:
M-1046 (Exyte client meeting) now created in Europe/Berlin. Dependent impl PBI filed (impl-pending; from-mockup) — 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 Meeting.timezone column).
💄 mockup(meetings): v366 — selectable meeting timezone + viewer-zone display (#1063)
v365 — done
Meeting Notes AI — 🔁 meeting series (a transcript per occurrence) + 🔗 optional project link with a 🤝 Timeline event (#1061)
11 Jul 2026
Meeting Notes AI
Timeline
- Stakeholder feedback: “a meeting series option so that under the same meeting I can add multiple transcripts based on the occurrence” + “link an MNA event to a project and surface it in the Timeline; common events stay unlinked”.
- Series = lightweight parent, every occurrence = a full meeting (its own transcript, AiDE run, action items, sharing, finalize — the hardened lifecycle is untouched). Create modal gains a 🔁 Recurring series toggle + cadence; the meeting list stacks occurrences into one series card (aggregate action closure, expandable occurrence rows); the detail page gains an occurrence switcher (prev / jump-to-date / next · “Occurrence N of M”) and the owner’s + Add occurrence (clones metadata + participants into a fresh draft; upload that occurrence’s transcript as normal). Models
MeetingSeries + Meeting.seriesId.
- Optional project link (
Meeting.projectId, nullable): “Link to project” selector in the create modal; 🔗 project chips on cards and the detail header. Meetings without a link are common meetings — behaviour unchanged.
- Timeline integration (post-on-share): the first time a linked meeting’s report is shared, a metadata-only 🤝 meeting event (title, date, outcome counts + deep link) is posted to the project Timeline.
timeline.html gains the 🤝 event type (system-authored: read-only, no edit/delete), a type-filter entry, and an “Open in Meeting Notes AI” link — click-through re-checks the meeting’s own participant-based access, so content never rides on timeline visibility.
- Demo data: series
SR-01 (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 (impl-pending; from-mockup).
💄 mockup(meetings): v365 — meeting series + project link with Timeline event (#1061)
v364 — done
Cycle History — ⚙️ Customise view + Saved Views: column chooser, density, pagination, per-user persisted views (#1059)
10 Jul 2026
Data management
Cycle History
- 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.
cycle-history.html now carries the canonical ⚙️ Customise view pattern for data-heavy tables.
- Column chooser (Cycle ID + Actions always shown), density (Comfortable / Compact) and rows per page (5 / 10 / 25 / All) with a Prev/Next pager — long histories render one page at a time instead of the full set.
- Saved Views: name + save the current combo (search, status filter, sort, columns, density, page size); apply from the toolbar selector or the modal; ★ default auto-applies on page load; re-saving an existing name updates it; delete supported. Persisted per user in
localStorage (pg_view_prefs::cycle-history::<email>) — models per-user server-side view preferences (GET/PUT /me/view-preferences/:screen).
- Export CSV = what you see: the toolbar export now downloads a real CSV honouring visible columns, active filters and the current sort, with formula-leading cells defanged (mirrors
utils/csv csvCell).
- ↺ Reset to standard restores the stock table. Dependent impl PBI filed (impl-pending; from-mockup) for the React/API implementation.
💄 mockup(cycle-history): v364 — Customise view + Saved Views (column chooser, density, pagination, per-user persistence) (#1059)
v363 — done
Dashboard — Sales SPOC gets the secondary “Submit My Own P&A” link (impl→mockup parity, #916)
10 Jul 2026
Dashboard
- impl→mockup refresh for gap-audit PBI #916 (Screens sweep).
DashboardScreen.tsx gives reviewer roles that also submit their own weekly P&A (the PA_REVIEWER_ALSO_SUBMITS set — currently Sales SPOC) a secondary “📝 Submit My Own Priorities & Achievements” link under the primary Review button. The mockup’s D-04 card showed only the Review button for Sales SPOC.
- Added a hidden
#module-pa-btn-secondary anchor to the P&A card, revealed by the per-role script only when roleKey === 'salesSpoc' (in the same PA_REVIEW branch that sets the Review copy) — mirroring the impl’s PA_REVIEWER_ALSO_SUBMITS.includes(user.role) gate.
- No dependent impl item — impl→mockup direction: the behaviour already ships in
DashboardScreen.tsx; this only brings the design reference into line.
💄 mockup(dashboard): v363 — Sales SPOC secondary Submit-My-Own-P&A link (#916)
v362 — done
Meeting Notes AI — Action Items: inline-editable rows + finalized curation lock (mockup catches up to shipped impl)
10 Jul 2026
Meeting Notes AI
- impl→mockup sync — the final bidirectional reconciliation of the Action Items tab against the shipped
MeetingDetailScreen ActionsTab/ActionRow.
- Inline editing replaces the pencil/re-assign buttons that opened
prompt() dialogs: the action text is an input (commit on blur/Enter), the assignee a select (owner + participants only), the due a date picker — all live in the row. New handlers editActionText / editActionDue / reassignActionTo replace editAction / reassignAction. The Manage column is delete-only now.
- Finalized lock (#1037): curation (add / edit / delete / re-assign) is hidden once the meeting is finalized (
canCurate = isOwner && !finalized), matching the API’s assertActionItemsUnlocked — only the done-toggle stays. The intro copy switches to “🔒 Finalized — action items are locked…”. The mockup previously never modelled this lock.
- Add-action form now requires an assignee (“Pick an assignee.”) with a “Select a person…” placeholder, matching
AddActionForm.
- 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 both directions.
💄 mockup(meetings): v362 — Action Items inline editing + finalized lock (sync to impl) #1048
v361 — done
Meeting Notes AI — mockup catches up to shipped impl (edit-modal modes, email owner recipient, sharing-card ⭐/👑 reassignment)
10 Jul 2026
Meeting Notes AI
- impl→mockup sync from a local run-vs-mockup comparison — three places where the mockup had drifted behind already-shipped web behaviour:
- Edit-meeting modal offered a
meet (Google Meet) platform that isn’t in the canonical MODES map (teams/zoom/inperson/hybrid), with mismatched icons. Now built from MODES, matching EditMeetingModal.tsx.
- Email report seeded its recipient set from participants only, dropping the meeting owner (always a recipient). Now uses
audienceEmails (owner + participants, or everyone when org-visible), mirroring meetingService.emailMeetingReport.
- Access & sharing card gained inline ⭐ organiser / 👑 owner reassignment per participant (new
setMeetingOrganiser / toggleMeetingOwner), matching MeetingDetailScreen.tsx’s SharingCard (PATCH /meetings/:id/organiser + the owner-flag mutation). Previously these could be set only at CREATE time.
- No dependent impl item — impl→mockup direction: the app already ships all three; the mockup is catching up. PBI #1047.
💄 mockup(meetings): v361 — sync to shipped impl (edit modes, email owner, sharing ⭐/👑) #1047
v360 — done
Meeting Notes AI — retire the last gap chip: “My Action Items” shipped (Feature #983 closed)
10 Jul 2026
Meeting Notes AI
- Feature #983 — the consolidated cross-meeting “My Action Items” dashboard — sat at New while all four of its child PBIs (#984–#987) were Done. It had shipped; nobody closed the parent.
- Verified in code, not from the child states:
GET /meetings/my-actions (registered before /:id) → listActionItemsForAssignee; MyActionItemsScreen.tsx with the inline done/reopen toggle; the /my-actions route and sidebar entry; and the post-login landing widget on DashboardScreen. Covered by tests in meetings.routes, meetingService, dashboard and MyActionItemsScreen.test.tsx.
- One scare worth recording: the landing widget calls
/dashboard/my-actions, a path #983 explicitly warned against. It is not a bug — that is the pre-existing P&A “returned to me” endpoint, and the meeting counts come from a separate /meetings/my-actions?status=open call, deliberately fetched in its own try so a P&A failure cannot hide the widget.
- With this chip gone, no gap chips remain: every gap this mockup once flagged has shipped. The
azref() helper and its .azref styles stay — the overlay is the standing device for annotating an element with the AzDO item tracking its gap.
- No dependent impl item — impl→mockup direction: the annotation is removed because the feature exists.
💄 mockup(meetings): v360 — retire the last gap chip; Feature #983 shipped & closed
v359
Meeting Notes AI — retire six stale AzDO gap chips whose gaps have shipped; only #983 remains open (#1022)
10 Jul 2026
Meeting Notes AI
- The
azref() chips overlay this mockup’s elements with the AzDO work item describing that element’s known gap. Seven remained after #912 retired the #989 chip — and six of the seven pointed at work that is now Done, so the mockup was advertising fixed gaps as open to anyone reading it as a design reference.
- Each removal was verified against the code, not merely the work item’s state: #992 (
getDecryptedAideToken catches a decrypt failure and prompts reconnect instead of an opaque 500), #993 (getAideRunStats + the admin route), #994 (aideRunLimiter on four routes), #995 (413/400 classification in errorHandler.ts), #996 (tabsA11y.ts + useModalA11y.ts), #997 (calendarDate.ts).
- #983 — the consolidated cross-meeting “My Action Items” dashboard — is still New, so its chip on the Open action items KPI stays. The
azref() helper and its styles stay with it.
- The
#997 chip was the fifth argument of a kpi() call; kpi renders (ref||''), so the argument is simply dropped rather than passed empty.
- Closes #1022, which was filed while closing #912 rather than swept in silently — the two changes justify themselves separately.
- No dependent impl item — the chips are annotations on the mockup; removing them has no implementation impact.
💄 mockup(meetings): v359 — retire six stale AzDO gap chips, keep #983 (#1022)
v358
Meeting Notes AI — Restart-processing control with stuck detection, done-toggle restricted to owner/assignee (closes #912)
10 Jul 2026
Meeting Notes AI
- Restart processing — a plain processing card had no way out of an interrupted run, the “stuck in processing forever” dead end. Mirrors
MeetingDetailScreen.tsx: the control is offered to the canProcess set (owner, ★ organiser, 👑 co-owner, admin), and emphasised once the run looks stuck — started over 3 minutes ago and not yet past the analysing stage, the same isLikelyStuck() && rank < 2 test the app uses. A non-owner is told the override will spend their own AiDE Fabric Token, because POST /:id/process?force=true runs on the caller’s token.
- Done-toggle restricted to the owner or the item’s assignee. The API 403s anyone else (
toggleActionItemDone, meetingService.ts); the mockup let any 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 .aiderules (Bug #921).
- The ticket described this control as owner-only. It is not: the app gates it on
canProcess. The mockup follows the code, not the ticket — the third wording error found on this PBI.
- Removed the stale
#989 gap chip from the processing card. It warned of “no reaper/retry”, plus #990 and #991; all three are now Done, and this very card now carries the restart control. Leaving it would advertise a fixed gap as open.
- Closes gap-audit PBI #912. Its remaining two low items are done; the medium items landed in v357 and the mockup→impl half in v356.
- No dependent impl item — impl→mockup direction: the mockup is corrected to match shipped, tested behaviour.
💄 mockup(meetings): v358 — restart-processing + stuck detection, done-toggle owner/assignee gating (#912)
v357
Meeting Notes AI — owner Edit-meeting modal, full action-item management, and the participant-removal 409 guard (impl→mockup parity, #912)
10 Jul 2026
Meeting Notes AI
- Clears the three medium impl→mockup items on gap-audit PBI #912. Each already ships in the app; the mockup was the stale side.
- Owner Edit-meeting modal — mirrors
EditMeetingModal.tsx / PATCH /meetings/:id (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.
- Full action-item management — per-row ✏️ edit text/due, 🔄 re-assign and 🗑️ delete, mirroring
PATCH …/actions/:id, PATCH …/assignee and DELETE …/actions/:id. The mockup had only the done-toggle and Add.
- All three are owner-only in the API, so the new Manage column — header and cells — and the ✏️ Edit-meeting button are gated on
isOwner(m), with a second guard inside each handler. UI visibility and API authorization gate on the same basis, per the role-gating parity rule in .aiderules (Bug #921). Re-assign offers only the owner + participants, the set the API validates against.
- Participant removal is now blocked when that person still holds open action items, surfacing the API’s real 409 message from
meetingService.ts instead of silently orphaning work that is still being chased. The optimistic checkbox reverts.
- 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.
- #912 is not closed: its remaining low items are the owner “Restart processing” control with stuck detection, and restricting the done-toggle to the owner or the assignee.
💄 mockup(meetings): v357 — owner edit-meeting modal + action-item management + participant-removal 409 (#912)
v356
Meeting Notes AI — email-report modal drops the editable Subject and the fake per-recipient checkboxes (impl→mockup parity, #912)
10 Jul 2026
Meeting Notes AI
- PBI #912 listed the mockup’s “editable Subject + per-recipient checklist” as a mockup→impl gap. It is the other way round.
POST /meetings/:id/email-report accepts only { message } (routes/meetings.ts); the subject is composed server-side and the recipient set is derived from the meeting’s own access model.
- Worse, the mockup’s checkboxes were decorative — its own
sendMeetingReport(mid, count) 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 cannot open the meeting — an information-disclosure vector, and precisely the blast radius PBI #994 narrowed when it restricted this endpoint to the owner / ★ organiser / 👑 co-owner / admin set.
- The mockup now mirrors
MeetingDetailScreen.tsx: the Subject field is gone, and recipients are listed read-only 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.
- Does not close PBI #912: 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.
- 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.
💄 mockup(meetings): v356 — email modal drops the Subject + fake recipient checkboxes (#912)
v355
Cycle History — bulk cycle management: row-select + bulk-approve / bulk-archive toolbar (#895)
10 Jul 2026
Ups & Downs
Cycle History
- Multi-select on the cycle table. Added a header select-all checkbox (with an indeterminate state) plus a per-row checkbox to
cycle-history.html. Selecting ≥1 cycle reveals a bulk-action bar above the table showing “N selected · A approvable · B archivable” and two actions: ✅ Approve selected and 🗄️ Archive selected, plus Clear selection.
- Per-row outcomes, not all-or-nothing. Bulk-approve acts only on cycles awaiting your approval (
in-progress); bulk-archive only on already approved cycles. Ineligible rows in a mixed selection are skipped and surfaced in the toast (“Approved 2 · 1 skipped (not awaiting your approval)”) — mirroring the { results:[…], summary } per-row response the API will return (house convention, cf. POST /invitations/bulk).
- New
archived end-state shown as a muted badge + a status-filter option, to illustrate the archive result. ⚠️ Archive is a net-new cycle state — it is NOT modeled today (no archived value on CycleStatus, no archivedAt), so the implementation needs a schema migration + new workflow transition + a permission gate. Bulk-approve needs none of that (reuses CAN_APPROVE + the CycleWorkflow state machine).
- Design for roadmap PBI #895 (FUTURE-07). Dependent impl work item filed (New / To-Do,
impl-pending; from-mockup) so a future agent can build it; it calls out the schema decision the archive half needs.
💄 mockup(cycle-history): v355 — bulk cycle management (row-select + approve/archive bar) (#895)
v354
History timeline — only the newest iteration is marked “Current” (#1007)
10 Jul 2026
History
- This page is meant to mark exactly one entry as current — the newest. Earlier commits demoted the previous entry inconsistently, so across 354 entries it carried 13
ver-current spans, 7 tl-card current cards and 3 tl-dot-current dots.
- Ten historical iterations (v259, v258, v248, v247, v246, v245, v239, v238, v54, v44) were highlighted as “Current”, which made the timeline useless for answering “which version are we on?”. Two more (v241, v240) carried the
ver-current class while their text read “Done” — styling and label disagreeing.
- Every entry normalised to the plain markers, then the newest re-promoted, so exactly 1 of each marker now exists. All 354 entries and the CSS rules are untouched — only the per-entry classes changed.
- Found while shipping the #914 impl→mockup refresh (v353); filed as Task #1007 rather than buried inside that parity commit.
- No dependent impl item — a mockup-only presentation fix with no implementation impact.
💄 mockup(history): v354 — only the newest entry is Current (#1007)
v353
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)
10 Jul 2026
Ups & Downs
Cycle Detail
- Comment counter corrected 0/500 → 0/2000. 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 does render a live counter (
RichTextEditor), capped at 2000 — which is exactly what the API enforces (routes/cycles.ts: “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 mockup was stale. Updated in workflow/spoc.html, workflow/pl.html, workflow/pm.html, workflow/cluster-head.html, priorities/pl.html, priorities/review.html and cycle-detail.html (workflow/pod.html was already 2000).
- Delivery-SPOC quick-link.
DeliverySpocScreen.tsx ships a “📈 Reports & Analytics” quick-link that workflow/spoc.html was missing; added in the same position.
- Post-approval note logging. The API records such a note as audit action
commented (routes/cycles.ts:2450), not a distinct Note type. cycle-detail.html now pushes type: 'commented' (with a dot colour) to match.
- Closes the impl→mockup half of gap-audit PBI #914; the mockup→impl half shipped separately (PL info alert, cycle-detail trend narrative, audit-trail titled card).
- 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.
💄 mockup(workflow): v353 — 0/2000 counter, Reports quick-link, note logs as commented (#914)
v352
Help — add “Meeting Notes AI” section + nav item (impl→mockup parity, #917)
9 Jul 2026
Help
Meeting Notes AI
- Added Meeting Notes AI nav item to the left-hand help navigation in
mockup/help.html (between Project Timeline and Reports & Analytics), with the 🤝 icon.
- Added the corresponding
#help-meetings section: what the module does, who can use it, connecting the AiDE Fabric Token (with note distinguishing it from the pgmcp_ 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.
- Closes the impl→mockup half of gap-audit PBI #917 (Help/MCP content — add Meeting Notes AI help topic to
mockup/help.html). The React HelpScreen.tsx already has the full Meeting Notes AI section (shipped 2026-07-04 MNA-55) — this commit brings the mockup reference page to parity.
- No new dependent impl item (the implementation already exists; this is impl→mockup direction).
📝 mockup(help): v352 — add Meeting Notes AI help section + nav item (#917)
v351 — Done
Mockup Index — AzDO ticket numbers on gap cards; corrected gap-card assignments; new .aiderules rule for auto-refresh on close
9 Jul 2026
Index
DX
AzDO
- Corrected gap-card assignments: 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.
- AzDO ticket links on gap cards: three cards now carry a clickable amber “🚧 Gap · #NNN” pill linking directly to the open AzDO work item — Meeting Notes AI (#930) (Logs tab in non-ready view), Project Lead (#931) (mandatory “AiDE & Other Topics” section), Audit Log (#909) (humanize MNA event labels + resolve user UUIDs). All other cards have no open impl items and are unmarked.
- Legend bar updated: 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.
- New .aiderules rule (step 5 of Mockup Version Tracking): when an AzDO impl-pending item is closed (feature implemented), remove the
page-card--todo 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.
📝 docs(mockup): v351 — AzDO gap-card tickets + corrected assignments + .aiderules auto-refresh rule
v350 — Done
Mockup Index — implementation-status legend + “Not Implemented” card treatment for mockup-only screens
9 Jul 2026
Index
DX
- Added an implementation-status legend bar at the top of
index.html (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.
- Not-yet-implemented card treatment: new
.page-card--todo CSS class — dashed amber border, reduced opacity (0.82), amber gradient shimmer in the ::before pseudo-element, amber hover state, and a CSS triangle corner-ribbon with a 🚧 emoji. A .tag-todo amber pill tag “🚧 Not Implemented” is appended inside the card.
- Meeting Notes AI card marked
page-card--todo — the only screen with zero React web implementation (confirmed by the mockup–web parity tracker: no MeetingNotesScreen, no route, no sidebar entry, no API client).
- All other existing cards remain visually unchanged (solid border, default styling).
- New CSS classes:
.tag-impl, .tag-todo, .page-card--todo, .page-card--todo::before, .page-card--todo:hover, .card-todo-ribbon corner triangle, .impl-legend, .impl-legend-item, .impl-legend-dot variants.
- No implementation impact — purely a design-tool DX change on the mockup index page only. No dependent impl work item needed.
📝 docs(mockup): v350 — index implementation-status legend + todo card treatment
v349 — Done
Version bump (8 Jul 2026 iteration)
8 Jul 2026
Version
v348 — Done
Profile — add “Push Notifications (this device)” card: MS-Teams-style app-icon unread badge + Web Push opt-in, per-category push toggles & test-push
8 Jul 2026
Profile
PWA
web-push
badge-notifications-jul2026
- New capability design: surface the unread notification count on the installed PWA app icon (taskbar / dock / home screen) like Microsoft Teams’ “9+”, and deliver alerts while the app is closed via Web Push. Added a Push Notifications (this device) card to
profile.html: 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.
- Backlog created in AzDO: Feature #967 (
badge-notifications-jul2026) with 7 PBIs — Phase 1 foreground app badge via the Badging API (#968), Phase 2 Web Push (subscription backend + VAPID #969, service-worker push/notificationclick #970, notificationService dispatch #971, opt-in UX + Profile prefs #972, support-matrix/QA #973, Help/observability #974).
- Dependent impl item for this mockup change: #972 (
impl-pending; from-mockup) — implements the push opt-in + Profile per-device/per-category preferences.
💄 mockup(profile): add Push Notifications (this device) card — app-icon badge + Web Push (v348)
v347 — Done
Profile — add the “Meeting Notes AI” email-notification preference row (4th toggle), matching the app
8 Jul 2026
Profile
parity
gap-audit-jul2026
- impl→mockup refresh for gap-audit PBI #916 (Screens sweep). The Profile page’s Email Notifications list had three toggles (Ups & Downs, Priorities & Achievements, Weekly digest) but was missing the app’s Meeting Notes AI row. Added it as the 4th toggle (
emailMeetings, on by default) — “Action-item reminders from meetings you own or are assigned an item in (due-soon, due-today and overdue)” — mirroring NotificationPreferences.tsx.
- Doc-parity only (
mockup/profile.html) — no dependent impl item: the app already ships this preference, so no implementation impact.
💄 mockup(profile): add Meeting Notes AI email-preference row (v347)
v346 — Done
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)
8 Jul 2026
Dashboard
parity
gap-audit-jul2026
- impl→mockup fix for gap-audit PBI #916 (Screens sweep). The Dashboard’s D-04 Priorities & Achievements card copy map was internally inconsistent: it labelled PM, ESO/Recruitment SPOC and PMO as “Reviewer” even though the button routed PM/ESO/Rec SPOC to the Submit page and PMO to nothing. Reconciled both role maps in
dashboard.html to DashboardScreen.tsx’s canonical four-way split: Submit = PL/PM/PC/ESO SPOC/Rec SPOC, Digest = Cluster Head, Review = Delivery SPOC/Sales SPOC/POD Owner, History = PMO.
- Added the missing PMO History card (title/desc/tag/button →
priorities/history.html, “Read-Only · PMO View”) and aligned the “awaiting your bilateral review” banner to the reviewer roles only (dropped PM & Cluster Head, matching PA_REVIEW_ROLES).
- Doc-parity only (
mockup/dashboard.html) — no dependent impl item: the app was already correct, so no implementation impact.
💄 mockup(dashboard): reconcile D-04 P&A card role map to the app (v346)
v345 — Done
Status page — correct the API health-probe URL to /api/health (was a 404-ing /api/v1/health)
8 Jul 2026
Status
parity
gap-audit-jul2026
- impl→mockup correctness fix for gap-audit PBI #916 (Screens sweep). The Status page advertised the API health probe at
/api/v1/health, which does not exist — the real endpoints are /health (dev) and /api/health (staging, after the IIS base path is stripped). Corrected all three references (the Quick-Links tile URL + its toast, and the SERVICES probe path) to /api/health, matching the shipped app (StatusScreen.tsx already probes /api/health).
- Doc-parity only (
mockup/status.html) — no dependent impl item: the app is already correct, so this change has no implementation impact.
💄 mockup(status): correct API health URL to /api/health (v345)
v344 — Done
Admin parity — Meeting Notes AI reminders shown read-only (data-driven), matching the app; Co-Sales SPOC now impl-backed
7 Jul 2026
Admin
parity
gap-audit-jul2026
- impl→mockup refresh for gap-audit PBI #915 (Admin). The scheduler’s Meeting Notes AI reminders (R-013/14/15) are now shown read-only (“🔒 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 (
AdminSchedulerScreen read-only catalog, MNA-44).
- The mockup’s Co-Sales SPOC (P009) is now backed by a real implementation field end-to-end (schema/API/web/CSV) — the two sides are aligned.
- Doc-parity only (
mockup/admin/admin.js). 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.
💄 mockup(admin): show Meeting Notes AI reminders read-only to match the app (v344)
v343 — Done
P&A parity — PL submission checklist shows the exactly-3 rule (4 rows) & reviewer can inline-edit items
7 Jul 2026
priorities
parity
gap-audit-jul2026
- Refreshed the mockup to match the shipped app (gap-audit PBI #913, impl→mockup): the PL Submission Checklist now states the exactly-3 rule the API + web enforce — N/3 priorities, 1 AiDE priority, N/3 achievements, Submitted for review (was three “at least 1” rows). The completion ring is now out of 4 items and the Submit button is gated on the rule (disabled with a tooltip until 3 priorities incl. 1 AiDE + 3 achievements).
- On the reviewer screen each submitted item now has an ✏️ Edit affordance (inline-editable text), not just ✕ remove — mirroring
PMPAReviewScreen’s ✏️ Edit + PATCH /items/:itemId.
- Pairs with the already-shipped app-side fixes in the same PBI (reviewer “Mark as AiDE” toggle + unsaved-changes guard). Doc-parity only (
mockup/priorities/pl.html, review.html) — no dependent impl item (the app already enforces this).
💄 mockup(priorities): show exactly-3 P&A submit rule + reviewer edit affordance (v343)
v342 — Done
Meeting Notes AI — restrict AiDE re-run by output lifecycle stage (review → shared → finalized)
7 Jul 2026
meeting-notes-ai
aide
governance
- Identified the AiDE output’s lifecycle and gated re-run on it. A meeting now carries a stage badge: 🔎 In review (default), 📤 Shared (report emailed), 🔒 Finalized (owner locked).
- 🔎 In review — re-run AiDE and corrections both allowed. 📤 Shared — re-run / ↻ Regenerate is locked (so the minutes recipients already have stay stable), but the deterministic ✏️ Apply now spelling fix still works (it updates wording in place). 🔒 Finalized — fully read-only: no re-run, no corrections.
- Sharing the report (Email → Send) advances a meeting to Shared; a new owner-side 🔒 Finalize minutes / 🔓 Reopen 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.
- Seeded demo stages so all three are visible: POD Alpha (in review), Cluster Delivery Review (shared), APS Bank personal notes (finalized). Mockup-only (
mockup/meeting-notes-ai.html); the gating requirement was appended to impl PBI #929.
💄 mockup(meeting-notes-ai): restrict AiDE re-run by output lifecycle stage (v342)
v341 — Done
Meeting Notes AI — per-meeting AiDE processing Logs tab (run history, token attribution, live activity)
7 Jul 2026
meeting-notes-ai
aide
logs
- New 🧾 Logs tab on every meeting records one entry per AiDE run — run type (initial / retry / re-run with corrections / regenerate), who triggered it, whose AiDE Fabric Token was used (masked), the model + endpoint, started/finished timestamps + duration, outcome (✅ success / ⚠️ failed / 🤖 in-progress), any corrections/context applied, and the captured live-activity stream (collapsible).
- Re-processing appends a new dated record rather than overwriting — so the full run history is preserved, newest first. The streamed live activity is now persisted into the log on completion instead of being discarded.
- Visible to everyone eligible for the meeting (the tab lives inside the access-gated detail view). Seeded demo runs on POD Alpha (success) and the failed Exyte meeting (HTTP 502) so the tab is populated. Tokens are always shown masked, never raw.
- Mockup-only (
mockup/meeting-notes-ai.html). Dependent implementation PBI #930 created for the web/API build.
💄 mockup(meeting-notes-ai): per-meeting AiDE processing Logs tab (v341)
v340 — Done
Meeting Notes AI — “Re-run AiDE” always streams the progress steps
7 Jul 2026
meeting-notes-ai
aide
fix
- Clicking 🤖 Re-run AiDE with corrections now always streams the live progress steps (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.
- Fix: the modal is now read before 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.
💄 mockup(meeting-notes-ai): Re-run AiDE always streams the progress steps (v340)
v339 — Done
Meeting Notes AI — corrections reflect on every tab (Summary, Mindmap, Actions, Report)
7 Jul 2026
meeting-notes-ai
aide
consistency
- The corrected wording already propagated to every tab (all tabs read the same AiDE data), but the “✏️ Corrected” chip and the ✍️ off-recording context only appeared on the Summary tab. Now the Corrected chip shows on Mindmap, Action Items and the Report too, and the Report gains an “Added context — discussed off-recording” section — so a correction or re-run is visibly reflected in all places, not just the minutes.
💄 mockup(meeting-notes-ai): corrections + context reflect on every tab (v339)
v338 — Done
Meeting Notes AI — corrections modal: off-recording context box fills the popup width
7 Jul 2026
meeting-notes-ai
polish
- Follow-up polish on v337: the “Add context discussed off-recording” 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.
💄 mockup(meeting-notes-ai): full-width off-recording context textarea (v338)
v337 — Done
Meeting Notes AI — correct AiDE transcription/spelling mistakes & add off-recording context
7 Jul 2026
meeting-notes-ai
aide
corrections
- 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 processed meeting, AiDE now flags low-confidence terms in the MoM with a dotted underline (✎); the owner / ⭐ organiser / 👑 owner can click any flagged term — or the new ✏️ Correct & add context button on the Summary tab — to open a Corrections & context modal.
- Two things in one place: (1) a heard-as → correct-spelling glossary (with an optional “remember these names for my future meetings”), and (2) an off-recording context box for points discussed but not recorded — folded into the minutes tagged ✍️ added by you.
- Two apply paths: 🤖 Re-run AiDE with corrections (the preferred flow — sends the glossary + context to AiDE and streams the live regeneration) or ✏️ Apply now (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.
- Mockup-only (
mockup/meeting-notes-ai.html). A dependent implementation PBI was created in AzDO for the web/API build.
💄 mockup(meeting-notes-ai): correct AiDE transcription mistakes + add off-recording context (v337)
v336 — Done
Help — installed app (PWA) stays signed in for 24h; browser sign-out unchanged
7 Jul 2026
help
pwa
session
- The Getting Started session note now explains that in a normal browser tab you are signed out after 30 minutes of inactivity (with the 5-minute Stay signed in warning), but when POD Governance is installed as an app (its own window) the idle window is extended to 24 hours and the sign-out is silent — a home-screen app is meant to feel persistent. The 7-day maximum still applies either way.
- Documentation-only mockup change — the behaviour itself already shipped in the web/API implementation (AzDO #924: 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.
💄 mockup(help): document installed-app 24h sessions vs browser sign-out (v336)
v335 — Done
Audit Log — meeting events show friendly action names & resolved names, not raw keys / UUIDs
7 Jul 2026
audit-log
meeting-notes-ai
admin
- The live Admin → Audit Log rendered Meeting Notes AI events with their raw internal event keys (e.g.
meeting.action.reassigned) in the Event column, and the expanded change detail printed raw user UUIDs (eaccbb79… → 9d5e22d9…) instead of people's names — unreadable to an admin.
- The mockup audit trail now carries Meeting Notes AI sample events using the same human-readable pattern as every other entity: friendly action pills (Re-assigned, Action Added, Action Completed, Notes Generated), a Meeting Notes entity label/filter, plain-language detail lines, and an expandable change diff that shows resolved assignee names (Assignee: Indurthi Hari Babu → Anitha Kumari) rather than IDs. Both the Entity and Event Type filter dropdowns gained the new options.
💄 mockup(admin): humanize Meeting Notes audit events — friendly action names & resolved names (v335)
v334 — Done
Meeting Notes AI — action items default to a 4-day close window
7 Jul 2026
meeting-notes-ai
action-items
- AiDE-extracted action items with no explicit date now default to a 4-day close window (was 2–3 days for the generated demo items), matching the requested default. The manual Add action item Due field now pre-fills to today + 4 days (was +7) and carries a small · defaults to 4 days hint; the
addAction() fallback when the date is cleared also lands on +4.
💄 mockup(meeting-notes-ai): default action items to a 4-day close window (v334)
v333 — Done
Meeting Notes AI — mindmap node boxes flex to fully cover their text
7 Jul 2026
meeting-notes-ai
mindmap
layout
- The AiDE discussion mindmap drew every node as a fixed-width SVG rect (branch 184px, leaf 212px), so any longer point — e.g. "3 initiatives: Data as Service, Intelligence, Innovation" or "Cross-domain products via Common Data Model" — spilled past the rounded border and read as broken.
- Boxes now flex to their content and share a consistent width per column:
mindmapHtml() estimates each label's rendered width (over-estimated so text never clips) and sizes every branch box to the widest branch label and every 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.
💄 mockup(meeting-notes-ai): flex mindmap node boxes to cover text (v333)
v332 — Done
Meeting Notes AI — live progress feed when retrying a failed AiDE run
7 Jul 2026
meeting-notes-ai
aide
live-updates
- Added the missing ⚠️ Processing failed meeting state to
meeting-notes-ai.html: the detail view now shows an "AiDE couldn't process this meeting" card — error reason, last-attempt timestamp, the owner-couldn't-complete note, and a 🔁 Retry processing 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 st-failed status badge and a list-card "open to retry" hint.
- The core ask — live updates on what's happening while retrying. The processing view gains a streamed Live activity feed: a pulsing live dot, an elapsed ⏱️ clock, 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.
💄 mockup(meeting-notes-ai): live retry-progress feed + failed state (v332)
v331 — Done
Scheduler — Timeline notifications folded into the Automated Reminders table
6 Jul 2026
scheduler
timeline
consolidation
- The standalone Timeline Notification Schedule card is gone. Its two jobs — Weekly Timeline Digest (R-011) and Stale Project Timeline Nudge (R-012) — now render inside the Automated Reminders table as a fourth group section, 🗓️ Timeline Notifications, 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.
- The two timeline-specific controls (Stale Project Threshold and Digest Delivery Day) move into a compact 🗓️ Timeline Digest Settings footer at the bottom of the same Automated Reminders card, keeping all timeline configuration in one place.
💄 mockup(admin): fold Timeline notifications into Automated Reminders (v331)
v330 — Done
Scheduler config — all tiles stacked in a single column
6 Jul 2026
scheduler
layout
- The Scheduler → Configuration panel previously placed Review Cycles and Automated Reminders side-by-side in a two-column grid, forcing both wide tables to scroll horizontally within their narrow halves. The
.scheduler-grid is now a single column so every tile — Review Cycles, Automated Reminders, Timeline Notification Schedule and Meeting Notes AI Reminders — renders full-width, one after the other.
- 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.
💄 mockup(admin): scheduler config tiles single-column stack (v330)
v329 — Done
Ups & Downs — AiDE & Other Topics now EDITABLE by every role above the Project Lead
6 Jul 2026
ups-downs
aide
editable
- v328 surfaced the consolidated “AiDE & Other Topics” read-only at every level. Now, like the Ups/Downs items, it is editable by every role ABOVE the Project Lead — PM, Delivery SPOC, Sales SPOC, POD Owner and Cluster Head can refine each Project Lead’s notes before forwarding. Each PL block becomes two text areas (AiDE-related points + optional Other topics); editing shows an “✎ edited at this level” chip and flows into the “👁 Preview journey” modal.
- Read-only is retained where it should be: the PMO observer and the archived cycle-detail still render the consolidated notes as read-only bullets. The
renderTopicNotes(id, { editable }) flag in the shared assets/js/wf-preview.js drives both modes; the preview always shows the current (possibly-edited) values.
- Mockup-only, for review first. React screens + the API modification-tracking (who edited which note at which level) are the remaining step.
💄 mockup(workflow): U&D AiDE & Other Topics editable above PL (v329)
v328 — Done
Ups & Downs — AiDE & Other Topics reflected to every level + “Preview journey” at each level
6 Jul 2026
ups-downs
aide
preview
- The v327 “AiDE & Other Topics” PL section now reflects to every eligible role. A new shared
assets/js/wf-preview.js renders a read-only consolidated card (the free-text each Project Lead submitted, per PL) on pm.html, spoc.html, pod.html, cluster-head.html, pmo.html and the archived cycle-detail.html — mirroring the API’s new topicNotes consolidation.
- New 👁 Preview journey button at every level (PL → PM → Delivery/Sales SPOC → POD Owner → Cluster Head, plus PMO observer). It opens a modal showing how the cycle looks all together 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.
- Backend already in place:
aide_notes / other_topics on CyclePlSubmission, persisted by save-draft/submit-pl and returned as a consolidated topicNotes array from the cycle GETs. React screens are the remaining step.
💄 mockup(workflow): U&D AiDE topics for all roles + Preview-journey at each level (v328)
v327 — Done
Ups & Downs — new mandatory “AiDE & Other Topics” section (single free-text per category)
6 Jul 2026
ups-downs
aide
form
- Added a 🤖 AiDE & Other Topics card to the Project Lead submission screen (
workflow/pl.html), sitting alongside the existing My Ups / My Downs cards. It captures two categories: AiDE-related points (adoption, time saved, wins, blockers) and any other topics worth raising this cycle.
- Deliberately different input model: unlike Ups/Downs — where each point is a separate submitted item with its own card, edit and history — each category here is a single free-text area 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.
- All three sections are mandatory: Ups, Downs and AiDE & Other Topics now carry a required * marker, and
submitPL() 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.
- Mockup-only, for review first. Once the shape is confirmed, the read-only rendering will be propagated up the review chain (
pm.html → spoc.html → pod.html → cluster-head.html) and into cycle-detail.html, then implemented in the React screens + API.
💄 mockup(workflow): U&D AiDE & Other Topics section on the PL screen (v327)
v326 — Done
Ups & Downs — per-item change history (🕐) at every level & Cluster Head can edit/add before final approval
6 Jul 2026
ups-downs
audit-trail
cluster-head
- The Ups & Downs report starts at the Project Lead and moves up the reporting chain (PL → PM → Delivery SPOC → Sales SPOC → POD Owner → Cluster Head). Every item card now carries a 🕐 History control that opens a modal showing that single point’s full trail — who added it and every edit at each level (old → new). Added to
pl.html, pm.html, spoc.html, pod.html and cluster-head.html.
- The Cluster Head screen is no longer read-only: during its own review turn (after the POD Owner forwards, before final sign-off) it can add new points, edit, or remove 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.
- Mirrors the app change: the API now stamps
subjectId=itemId on every add/edit/delete audit row (queryable via GET /audit/cycle/:id?subjectId=), and cluster_head joined CAN_EDIT.
✨ feat: U&D per-item history + Cluster Head editable cards (v326)
v325 — Done
Meeting Notes AI — delete a meeting (creator/owner, ⭐ organiser, 👑 owner, or Administrator)
6 Jul 2026
meeting-notes-ai
delete
permissions
- Added a 🗑️ Delete meeting action to the meeting detail header. The button appears for exactly the people allowed to remove a meeting: its creator/owner (
m.owner), its ⭐ organiser (m.organiser), any 👑 designated owner (m.meetingOwners), or a System Administrator — encapsulated in a new canDelete(m) gate that mirrors the API’s canDeleteMeeting.
- The header action row now renders when the meeting is ready or the viewer can delete it, so Delete is reachable in every status (draft / processing / ready), while Email / Print stay gated on a processed meeting.
- 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 System Admin demo persona was added to the preview-as switcher so the admin-can-delete-any-meeting path is demonstrable.
✨ feat(meetings): delete a meeting — owner/organiser/creator/admin (v325)
v324 — Done
People & Organisation hub — menu made consistent across every page & role (shared nav + command palette + PMO gating)
5 Jul 2026
admin
navigation
consolidation
- v323 restructured the admin portal’s own sidebar, but the shared sidebar (
assets/js/nav.js, 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 nav.js’ Management (Projects/PODs/Users) + Settings (Reporting/Org Hierarchy) groups into the single 👥 People & Organisation entry, matching the admin portal.
- Role consistency: the admin portal’s own sidebar gated the admin groups to
admin only, while nav.js (and the app) grant admin access to admin + pmoAssociate. Aligned the admin-portal gate to [admin, pmoAssociate] 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.
- Command palette (⌘K): collapsed the five separate Admin · Projects / Users / PODs / Reporting / Org Hierarchy commands into one Admin · People & Organisation (keywords
users roles invite pods projects reporting org hierarchy keep every term searchable); admin default landing now the hub.
- All legacy deep-links (
#users, #pods, …) still resolve to the hub + correct tab; both nav.js + command-palette.js pass node --check. Zero old menu links remain anywhere.
💄 mockup(admin): make People & Organisation menu consistent across all pages & roles (v324)
v323 — Done
Admin Portal restructured — People & Organisation hub goes live (consolidates Users, PODs, Projects, Org Hierarchy & Reporting into one tabbed section)
5 Jul 2026
admin
consolidation
IA
- The v322 standalone proposal is now implemented in the real admin mockup (
admin/index.html + admin.js). The five formerly-separate sidebar entries — Projects, PODs, Users & Roles, Org Hierarchy (Management) and Reporting Relationships (Settings) — collapse into a single 👥 People & Organisation nav item.
- New
#section-people hosts a five-tab workspace: People & Roles · PODs · Projects · Reporting Lines · Hierarchy (.people-tabs / .people-tab).
- Zero functionality lost:
initPeopleHub() 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 (#users-tbody, #projects-tbody, …). Only each area’s duplicate <h1> is dropped (demoted to the tab label); the action toolbars stay.
navigateTo() maps legacy deep-links (#users, #pods, #projects, #reporting, #org-hierarchy) onto the hub + the matching tab, so old links still resolve; default landing is now the hub.
- Redundancy removed: deleted the standalone
people-org.html 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.
- Theming: the new tab bar uses
--admin-* 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.
💄 mockup(admin): implement People & Organisation hub — consolidate 5 admin sections (v323)
v322 — Done
People & Organisation — proposed single admin hub consolidating Users, Invitations, PODs, Projects, Org Hierarchy & Reporting Relationships
5 Jul 2026
admin
consolidation
IA
- New standalone proposal page
people-org.html showcasing a single People & Organisation 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.
- Five tabs: People & Roles (the full user directory + every row action), PODs, Projects, Reporting Lines, and a read-only Hierarchy tree.
- Invitations promoted from a hidden button inside Users to a first-class Pending invitations segment of the People tab (create / bulk / resend / revoke preserved).
- New slide-in Person Drawer: 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.
- 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.
- Self-contained: theme-aware via
design-system.css tokens, vanilla-JS tab/segment/drawer interactions, no build step.
💄 mockup(admin): People & Organisation consolidation proposal (v322)
v321 — Done
Meeting Notes AI — ParticipantPicker chip widget in CreateMeetingModal (GAP-17)
5 Jul 2026
meetings
participants
react
- ParticipantPicker chip widget implemented in
CreateMeetingModal.tsx, 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.
- First participant added auto-becomes organiser (mirrors mockup
cmAddParticipant); Backspace on empty input removes the last chip.
- 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.
- The
handleCreate POST body now includes organiserUserId and ownerUserIds alongside the existing participantIds.
onIntakeTabChange in MeetingDetailScreen.tsx switches away from the video tab when the user selects transcript.
- 27 new Vitest tests covering all picker interactions; all pass.
tsc --noEmit 0 errors, ESLint 0 warnings.
✨ feat(web): ParticipantPicker chip widget in CreateMeetingModal — GAP-17 (v321)
v320 — Done
Meeting Notes AI — Phase 2 video upload: progress bar + attempt/retry counter
4 Jul 2026
meetings
video
upload
- meeting-notes-ai.html: The Phase 2 “Video recording” tab is now interactive — drop or browse an
.mp4, .mkv, .webm or .mov file and a live upload progress bar appears (0–100 %) with an Attempt N of 3 badge.
- Attempt 1 intentionally stalls at 67 % and triggers an automated retry (attempt 2) after 1.4 s, demonstrating the failure-and-retry UX.
- Attempt 2 completes to 100 % and hands off to the existing AiDE step-list pipeline (transcript received → mindmap → ready).
- A × Cancel button aborts the upload and restores the dropzone at any point.
- Switching intake tabs or opening a different meeting cancels any in-progress upload automatically.
- New CSS classes:
.vid-progress-wrap, .vid-track, .vid-fill, .vid-try-badge (ok / fail / retry variants).
💾 feat(mockup): Phase-2 video upload progress bar + attempt counter (v320)
v319 — Done
Reporting-relationship Direct Report & Manager fields become type-to-filter user autocompletes
4 Jul 2026
autocomplete
admin
reporting
- Autocomplete pickers: the Add / Edit Reporting Relationship modal's Direct Report and Manager plain
<select> 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.
- Reusable widget: new generic
initUserAutocomplete() helper in admin.js (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 overflow clip. Styles added to admin.css (.user-ac*).
💾 feat(mockup): reporting-relationship Direct Report/Manager user autocompletes (v319)
v318 — Done
Meeting Notes AI opened to everyone — access driven entirely by the participants list
4 Jul 2026
meetings
access
sharing
- No more role tiers: removed the old two-tier access model (SPOC-level & above = full sharing; PM & below = personal workspace). The module is now available to every role — the access gate,
FULL_ROLES/MODULE_ROLES and personalMode() are gone.
- Sharing = the participants list: a meeting is visible to its participants (plus the owner). The old role-grouped share list and the separate
sharedWith array are removed; the Access & sharing card now manages participants directly, and each participant receives the report and action-item reminders. The optional 🌐 Visible to everyone toggle now reads "everyone in the organisation" (no SPOC qualifier).
- Surfaces updated:
nav.js 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. index.html, dashboard.html and PAGES.md copy refreshed.
💾 feat(mockup): open Meeting Notes AI to everyone with participant-driven sharing (v318)
v317 — Done
Meeting Notes AI moved into the Workflow sidebar group on the Admin shell
4 Jul 2026
nav
sidebar
meetings
- Consistency fix: the Admin portal's hardcoded sidebar still listed Meeting Notes AI under the Management group, while every other role screen (shared
nav.js) already grouped it under Workflow. Moved it into the Workflow section (after Project Timeline, before Reports) and removed it from Management so the grouping is identical across all screens.
💾 fix(mockup): move Meeting Notes AI into the Workflow sidebar group on the Admin shell (v317)
v316 — Done
Meeting Notes AI — participants autocomplete multi-select with organiser & owner designation
4 Jul 2026
meetings
autocomplete
participants
organiser
- Participants autocomplete widget: the plain
<select multiple> 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.
- Organiser (1 only, ⭐): 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.
- Owner (multiple, 👑): 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.
- 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).
- 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.
💾 feat(mockup): Meeting Notes AI — participants autocomplete + organiser/owner designation (v316)
v315 — Done
Meeting Notes AI — recording & transcript become local-file uploads + dark-mode refresh
3 Jul 2026
meetings
upload
dark-mode
- Uploads replace links: 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.
- Dark-mode refresh: all hardcoded light-only colors moved to shared tint tokens across the module.
💾 feat(mockup): Meeting Notes AI — local-file uploads + dark-mode token refresh (v315)
v314 — Done
Rename "Weekly Meeting Tracker" → "Meeting Notes AI" — filename, nav, all content
3 Jul 2026
rename
nav
- Module renamed from Weekly Meeting Tracker / Weekly Meetings to Meeting Notes AI across all 10 files —
meeting-notes-ai.html (was meetings.html), sidebar nav, topbar, dashboard card, admin portal tabs, Scheduler reminder groups, email-template category, command-palette entries, index page card, and PAGES.md.
- Also added
?view= quick-launch handler to login.html — 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.
💾 fix(mockup): rename Weekly Meeting Tracker → Meeting Notes AI + ?view= quick-launch (v314)
v313 — Done
Meeting Notes AI — PMO Associate access granted (personal workspace tier)
3 Jul 2026
meetings
access
- PMO Associate role added to
MODULE_ROLES — they now access the Meeting Notes AI as a personal workspace (own transcriptions only, no sharing), matching the PM-and-below tier introduced in v312.
- Demo user Ramesh Kumar (PMO Associate) added to the PEOPLE roster so the "Preview as" bar reflects the change immediately.
💾 feat(mockup): Meeting Notes AI — grant PMO Associate personal-workspace access (v313)
v312 — Done
Meeting Notes AI — admin oversight section, menu entries, PM-and-below personal tier, Phase-2 video placeholders
3 Jul 2026
admin
meetings
access
- Admin → Meeting Notes AI (
#meetings): 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 AiDE Fabric Token adoption table. Meeting content stays owner-controlled — admins see the register, not the transcripts.
- Reminder rules R-013–R-015 (ET-030/031/032) 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.
- Menu options everywhere: 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".
- PM-and-below personal tier: Project Manager, Project Lead and Project Contributor now get the module as a personal workspace — they see only their own processed transcriptions; 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.
- Phase-2 video placeholders: 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.
- 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.
💾 feat(mockup): Meeting Notes AI admin section + menus + personal tier + video placeholders (v312)
v311 — Done
Meeting Notes AI — new AiDE-powered module (transcript → MoM, mindmap, action items)
3 Jul 2026
new module
aide
- New page
meeting-notes-ai.html: Meeting Notes AI for the recurring POD Owner / SPOC weekly meetings. Access is restricted to SPOC level and above (Delivery / Sales / ESO / Recruitment SPOC, POD Owner, Cluster Head) — other roles see an access-denied state.
- Meeting creation 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 “🌐 Visible to everyone” option.
- AiDE processing pipeline: the transcript is provided as text (doc upload or paste) and sent to the AiDE Brownfield Chat Completions API (
POST /api/v1/brownfield/chat/completions, model giga-brain, OpenAI-compatible). A staged progress card simulates parse → understand → MoM → action items → mindmap.
- AiDE Fabric Token collection: 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
Authorization: Bearer …; connect/manage/remove states + masked display throughout.
- Generated outcome tabs: 📝 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).
- Owner-controlled access: 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).
- Reminder process: 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.
- Share the outcome: 📧 Email-report modal (recipients from the share list, PDF attached) and 🖨️ Print / PDF (print-mode CSS renders the report only).
- Navigation: 🤝 “Meeting Notes AI” sidebar link (nav.js, SPOC+ roles only), role-gated dashboard module card, and a landing-page card on the mockup index.
💾 feat(mockup): Meeting Notes AI module — AiDE transcript processing + action tracking (v311)
v310 — Done
Admin portal — consistent dropdown chevrons, themed secondary buttons, dark-mode arrow fix
3 Jul 2026
ux
theme
- Custom dropdown chevron:
.filter-select and select.form-control now render a consistent inline SVG down-chevron (native arrow suppressed via appearance:none) with right padding so the caret never overlaps the value.
- Dark-mode arrow: added a
[data-theme="dark"] override swapping the light-grey chevron for a near-white one so it stays visible on dark select backgrounds.
- Themed secondary buttons: replaced hard-coded
#f1f5f9/#e2e8f0 inline styling on the Run History quick-date presets and “Load more” with the shared .btn-secondary class (now token-driven: --bg-card / --border-strong, brand-tinted hover) so they adapt to light/dark.
- Token cleanup: admin inputs/selects switched from legacy
--admin-text/--surface to canonical --text-primary/--bg-card; added .btn-secondary/.btn-link to admin.css; removed the duplicate/incorrect second design-system.css link in admin/index.html.
💾 fix(mockup): admin dropdown chevrons + themed secondary buttons + dark-mode arrow (v310)
v309 — Done
Run History — hide zero-email runs by default, job-type filter added
3 Jul 2026
ux
scheduler
- Hide 0-email runs by default: the Run History table in Admin → Scheduler → Activity & Run Log now hides scheduler runs where no emails were sent (
items = 0) on initial page load, removing noise from high-frequency cron jobs that fire successfully but find no recipients.
- “Hide 0-email runs” checkbox: 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.
- Hidden-count hint: when runs are hidden a small muted label shows how many were suppressed (e.g. “14 zero-email runs hidden”).
- Job-type filter: new “All job types” dropdown lets admins narrow history to a specific job (ET-003, ET-014, cycle_creation, etc.).
- Realistic sample data: 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.
💾 feat(mockup): Run History hide-zero-email toggle + job-type filter (v309)
v308 — Current
Left-nav cleanup — duplicate admin tab strip hidden (web parity), sidebar completed with Email Log
3 Jul 2026
nav
- Admin duplicate navigation removed: 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 (
#scheduler, #email-log, …) verified intact.
- Sidebar completed: “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).
- 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.
💾 fix(mockup): left-nav cleanup — admin tab strip hidden, sidebar Email Log added (v308)
v307 — Done
Roster unification — last ghost people made real or replaced, contributor reporting edges resolved
3 Jul 2026
data
- Kavya Reddaiah and Srinivas M are now real roster people (admin users u32/u33, Project Contributors reporting to Swati Nandha via RR-027/028) instead of names that existed only on P&A pages.
- Gopal contradiction resolved: 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 Shivsagar Mishra, whose reporting edge (RR-026) moves to Swati.
- 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.
💾 fix(mockup): roster unification — ghost people resolved, contributor RR edges split (v307)
v306 — Done
Deep-link params, breadcrumbs, docs back-link, timeline priority cap (audit Phase F, P2 tail — audit complete)
3 Jul 2026
ux
flows
- Cycle deep-links: cycle-detail.html now reads
?cycle= (validated against /^[A-Z]{3}-\d{4}-[WM]\d+$/, 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.
- Breadcrumbs on depth-2 pages:
Cycle History › <cycle id> on cycle-detail; Projects › <role title> on all six workflow pages (replacing the old stray “← Projects” link). docs.html gets a “← Back to App” TOC link plus a fixed back button when the TOC hides ≤900px — no longer a dead end.
- Timeline 3-priority cap fixed:
DRAFT_META.pri was missing priority:true, 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.
- 51 headless checks pass, zero page errors on all 16 page loads. This closes the industry-standard audit (v299–v306); the only open item is the return-semantics product decision (mockup one-step-back vs .aiderules returned-to-PL).
💾 feat(mockup): cycle deep-links + breadcrumbs + docs back-link + timeline cap — audit P2 tail (v306)
v305 — Done
Act → confirm → advance on review screens + mutually exclusive demo states + queue auto-advance (audit Phase F, P2)
3 Jul 2026
ux
flows
- Demo state switcher (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).
- Approve/Return now completes the loop 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.
- Review queue auto-advance (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.
- 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.
💾 feat(mockup): act→confirm→advance review loops + demo state switchers — audit Phase F P2 (v305)
v304 — Done
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)
2 Jul 2026
data
flows
rbac
- Single canonical “now”: current cycle
JUN-2026-W25 (15–21 Jun), previous JUN-2026-W24, next JUN-2026-W26, 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 cycle-detail.html 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 → JUN-2026-M1).
- Notification bell rejoined the same universe: its stale MAY-era demo set is now a subset of notifications.html’s JUN items and every item deep-links via the existing
PG_ROOT convention (workflow, review queue, cycle detail, timeline, reports).
- P&A chain converged on the reporting-graph model: priorities/review.html’s legacy fixed 6-rung ladder (with
pgm/ceo keys and PM as its own rung) replaced by levels-as-sets — L1 direct manager(s), L2 nearest Delivery SPOC (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.
- Ghosts & stale titles purged: 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).
- Reports properly role-gated: 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.
💾 fix(mockup): one world of data + reporting-graph chain + reports gating — audit Phase F P1 (v304)
v303 — Done
Data-flow audit P0 fixes — Admin demo login, admin role guard, broken add-item controls, admin deep-links (audit Phase F)
2 Jul 2026
flows
bugs
- Admin demo login fixed —
DEMO_USERS had vishnu.goluguri@valuelabs.com 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 (vishnu.goluguri.pm@) and full display name.
- Admin Portal role guard — 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
CAN_ACCESS_ADMIN).
- All three broken “Add item” controls repaired —
workflow/pod.html called an undefined addPodItem (ReferenceError); workflow/pl.html and spoc.html read a nonexistent add-*-text input instead of the add-*-rte contenteditable. All three verified headlessly: item appended, editor cleared, zero page errors.
- Admin deep-links resolve —
org-hierarchy and email-log were missing from ADMIN_SECTIONS, so every sidebar “Org Hierarchy” click silently landed on Projects. Both registered; #org-hierarchy verified.
- Source: 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).
💾 fix(mockup): data-flow audit P0 — admin login/guard, add-item controls, admin deep-links (v303)
v302 — Done
One design system — legacy style.css retired, admin rebranded to shared navy, login adopts post-WCAG palette (audit Phase E)
2 Jul 2026
de-dupe
brand
wcag
- assets/css/style.css deleted (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, admin/index.html, 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.
- Admin portal rebranded purple → POD navy:
--admin-primary now follows var(--brand-primary) and the two template-code chips in admin.js use var(--brand-light). Matches the real implementation, where purple only survives as a var() fallback in ProfileScreen.tsx.
- login.html fully on shared tokens: the two
:root:not([data-theme="dark"]) 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.
💾 refactor(mockup): retire style.css, admin navy rebrand, login WCAG palette adoption — audit Phase E (v302)
v301 — Done
Dark theme everywhere + PWA-shell polish (audit Phases C+D) — login/auth/docs/mcp-guide dark, safe-area, touch targets
2 Jul 2026
dark-mode
pwa
mobile
- Dark theme now covers every page. login.html gets full dark support (parity with
LoginScreen.tsx, which themes via shared tokens): its inline light-token pins are scoped to :root:not([data-theme="dark"]) 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 html[data-theme="dark"]; index/history declare their always-dark design via color-scheme: dark. Light renders verified byte-identical on login desktop/tablet.
- PWA-shell polish (design-system.css): safe-area insets on topbar/sidebar/toasts with
viewport-fit=cover added to all 29 pages; overscroll-behavior: contain on modal overlays and the drawer sidebar; 16px input font floor ≤900px (stops iOS focus zoom); pointer: coarse touch-target sizing (40px minimum on small buttons, icon buttons, nav links).
- Zero horizontal overflow on all 29 pages at 375px — closed the last three: mcp-guide (flex
.step-body min-width:0 + mobile table scroll + header-bleed containment), history (long code/commit strings now overflow-wrap: anywhere), docs (v300 follow-through). Desktop 1440px renders verified pixel-identical to v300 on all 8 spot-checked pages.
💾 feat(mockup): dark theme everywhere + PWA-shell polish — audit Phases C+D (v301)
v300 — Done
Responsive fluid-layout pass — mobile table scroll, desktop width cap, adaptive grids, docs mobile fix (audit Phases A+B)
2 Jul 2026
responsive
mobile
layout
- Wide tables now scroll instead of clipping/crushing — shared rules
.card-body:has(> table){overflow-x:auto} + .card{min-width:0} in design-system.css and .admin-card-body:has(> .admin-table) 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.
- Desktop readability cap —
.main-content > #topbar-placeholder + div 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.
- Fixed grids now adapt — 20 inline
repeat(N,1fr)/2fr 1fr…/1fr 1fr grids converted to repeat(auto-fit,minmax(…,1fr)) 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' 3fr 2fr master split gets a .rpt-split collapse ≤1100px. Dashboard's module picker also stops reserving an empty 4th track when a role-gated card is hidden.
- docs.html usable on mobile + overflow-free at 4K — fixed 260px TOC now hides ≤900px (mcp-guide pattern),
img{max-width:100%}, reference tables scroll in place (also fixes a pre-existing 1528px overflow at 1440px). Small-viewport units: @supports blocks add 100dvh fallbacks in design-system.css/style.css/admin.css/docs.html (mobile URL-bar bug). Topbar titles truncate with ellipsis instead of wrapping into the icon cluster on phones. P&A rich-text toolbar wraps at narrow widths.
💾 feat(mockup): responsive fluid-layout pass — audit Phases A+B (v300)
v299 — Done
Redundant-style removal — login.html de-duplicated against the shared design system, pixel-verified
2 Jul 2026
css
de-dupe
- login.html now links
assets/css/design-system.css instead of carrying a full inline fork of it — 298 duplicate rules removed (281 byte-identical + 17 identical once var(--token, fallback) 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.
- Pixel-verified: headless Chromium screenshots at 375/768/1440px plus forced-dark are byte-identical before vs after; removal was restricted to rules that compute to identical values, so hidden states (error cards, scenario chips) are covered by construction.
- Drift documented, not silently changed: ~16 of the kept inline rules differ from the design system only because login still carries pre-v159-WCAG literal colors (e.g.
.rb-pm text #b45309 vs token #78350f). Left as-is for pixel parity; adopting the corrected palette is a recommended follow-up in the responsive/theming audit.
- Audit context: this is the first, safest slice of a full industry-standard audit (fluid layouts, dark theme coverage, PWA-shell readiness, data-flow). Legacy
assets/css/style.css turned out to be the admin portal's separate purple brand theme — retiring it is a Phase-1 refactor, not a redundancy removal.
💾 refactor(mockup): de-dupe login.html against design-system.css, pixel-verified (v299)
v298 — Done
Parity re-sync round 3 — systemic consistency sweep: confirm dialogs, toolbar completeness, audit-diff coverage, taxonomy fixes
2 Jul 2026
safety
consistency
admin
- Destructive-action confirmation, closing the remaining gaps — round 1 built a confirm-before-delete dialog but wired it into only 4 workflow files; this pass found it missing from
timeline.html's note delete (real TimelineScreen.tsx confirms this, unlike its already-safe undo-snackbar event delete, left alone), profile.html's three revoke actions (token/session/all-other-sessions), and the admin portal's toggleUserStatus (previously had ZERO protection, not even undo) and forceLogoutUser (was a jarring raw browser confirm()). The other 9 admin delete/revoke actions keep their existing undo-snackbar pattern — an intentionally different but already-safe UX, left untouched.
- Rich-text toolbar completeness — corrected a stale claim from this same memory's own v296 entry:
workflow/pl.html, pod.html, and spoc.html 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 priorities/pl.html and priorities/review.html did. Fixed all three now (9 insertion points across static composers + the JS edit-template). Also gave workflow/cluster-head.html's Sign-Off Comment its first-ever rich-text toolbar — it was a plain <textarea> though the real ClusterHeadScreen.tsx uses a full RichTextEditor there.
- Audit-diff coverage extended to Priorities & Achievements — round 1's diff-view wiring only reached 7 U&D-side files; the 4 P&A files (
priorities/pl.html/review.html/cluster-head.html/history.html) each have their own separate renderAuditTrail() that never got it. priorities/pl.html now gets the full old/new diff (it uses the same shared AuditTrailSidebar component as U&D in real); the other three get the simpler italic comment-quote PMPAReviewScreen.tsx actually uses there.
- Login demo coverage: added the 2 of 8 real
LoginScreen.tsx states the mockup was missing — Wrong Email Domain and Invalid Email Format. Status auto-refresh: status.html only ever refreshed on manual click though PAGES.md itself documents a 60s auto-refresh — added the missing setInterval. Admin Projects: table + CSV export were missing the Cluster Head column (CSV also missing ESO/Recruitment SPOC), matching a same-day real fix. Admin Audit Log: entity-label map was missing timeline/notification keys present in real. Reports & Analytics: 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.
💾 fix(mockup): parity re-sync round 3 — confirm dialogs, toolbar + audit-diff completeness, login/status/admin/reports fixes (v298)
v297 — Done
Parity re-sync round 2 — in-page Help everywhere, Dashboard role-gated cards, content drift fixes
2 Jul 2026
help
dashboard
content
- In-page Help button, everywhere it was missing — a second completeness audit found every real
Admin*Screen.tsx (all 12) plus DashboardScreen, NotificationsScreen, ReportsScreen, ProfileScreen, and HistoricalPAScreen render an in-page ❓ Help button — none of the mockup equivalents had one (only the generic sidebar nav link). Added a topic-anchored help.html#<topic> link to all of them, styled to match each page's own existing header-button convention (dark-glass rgba(255,255,255,.15) pattern on dashboard/reports/profile/priorities-history.html, light btn-secondary btn-sm on notifications.html and all 12 admin/index.html sections — reusing org-hierarchy's existing page-header-actions pattern for the sections that didn't already have one).
- Dashboard cards weren't hidden per role, only dimmed —
DashboardScreen.tsx 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 element.style.display='none' 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.
- Content drift:
whats-new.html was missing the newest release note ("Admins: a complete Email Log", 30 Jun) present in the real whatsNew.ts; added it verbatim. projects.html's search placeholder still said "…or ID…" though the field only ever searches by name/POD; corrected to match ProjectsScreen.tsx's real placeholder text.
- Also confirmed, not re-fixed: a full file-level inventory found every real screen already has a mockup counterpart (no missing pages) and no orphaned/redundant mockup files (
docs.html/PAGES.md/screenshots/ 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.
💾 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)
v296 — Done
Implementation parity re-sync — reporting-graph P&A chain, workflow safety UX, functional Admin Audit Log
2 Jul 2026
parity
workflow
admin
- P&A reporting-graph approval chain — the real bilateral chain now resolves from the org reporting graph (a level can be a set of parallel approvers, any one of whom clears it) rather than a fixed 5-role ladder.
priorities/pl.html's Approval Chain Status card was still hard-coded to the old ladder; rebuilt it to match PAChainStatus.tsx exactly — no role-label heading, decided approvers shown plainly, pending multi-approver levels read "Any one of: A, B".
- Workflow item safety & audit fidelity — every Ups & Downs screen (PL/PM/Delivery/Sales SPOC/POD Owner) could only delete-and-recreate an item with zero confirmation; added in-place ✏️ Edit (reusing each page's own rich-text toolbar) and a confirm-before-remove dialog to all five. Wired up the Audit Trail's
.audit-change-item/.old-text/.new-text/.comment-text diff styling (already shipped in design-system.css but never used) across pl/pm/spoc/pod/pmo/cluster-head/cycle-detail. Added the ESO/Recruitment SPOC read-only observer mode to spoc.html, the missing ⏱ Cycle Time/bottleneck column to pmo.html, a read-only Attachments card to cycle-detail.html, PM's plain-<input> add-rows upgraded to the shared rich-text toolbar, and Underline/Numbered-list buttons added where toolbars were missing them (workflow/*.html, priorities/review.html, priorities/pl.html). 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 readOnly=true despite the page's own comments saying otherwise (no Edit/Remove ever rendered), and status.html's role badges referenced non-existent CSS classes (all 10 roles rendered identically green).
- Admin Portal — six real gaps closed, the largest being the Audit Log: it was static, hand-written HTML with fake data and toast-stub filters, the only log-style admin section not driven by
adminState — 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 pmoAssociate), 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; mcp-guide.html's two stale "33 tools" references corrected to 34.
💾 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)
v295 — Done
Standards hardening — color-scheme (native UI theming), page meta, link security, touch targets, print
2 Jul 2026
standards
theme
seo
- color-scheme — the theme work styled our own components but native UI (form-control defaults, scrollbars, spinners, autofill, date pickers) stayed light in dark mode. Added
<meta name="color-scheme" content="light dark"> to every page plus html { color-scheme: light } html[data-theme=dark] { color-scheme: dark } so the browser's own widgets follow the active theme.
- Page meta — every page now has a per-page
<meta name="description"> (derived from its title) and a <meta name="theme-color"> for the mobile browser chrome. Link security: added rel="noopener noreferrer" to the remaining target="_blank" link (reverse-tabnabbing). Fonts already ship font-display: swap.
- Touch targets (WCAG 2.5.8) — 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 print stylesheet that drops the app chrome (sidebar/topbar/overlays) and keeps cards readable. Re-verified all 22 pages still pass light/dark/system.
💾 feat(mockup): standards hardening — color-scheme native theming, page meta, link security, 24px touch targets, print styles (v295)
v294 — Done
Accessibility pass — WCAG 2.1 AA across all pages, audited with axe-core (light + dark)
2 Jul 2026
a11y
wcag
audit
- Ran axe-core (WCAG 2.1 A/AA + best-practice) headlessly over every page in Edge, in both 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.
- Contrast: tokenized hundreds of hardcoded muted / semantic / accent text colours (
#64748b, #16a34a, #7c3aed, #2563a8…) 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 both themes); darkened the light-mode --text-muted/--text-secondary tokens (table headers were 4.36:1); removed 3 pages' :root overrides that pinned the dark muted value in light mode; darkened .btn-success/.btn-danger/admin-primary so white button text passes.
- Structure & input: added a
<main> landmark + skip-to-content link on every page, accessible names to the injected sidebar navs (landmark-unique), aria-labels on unlabelled selects and toggle checkboxes, underlines on colour-only notification links, keyboard access (tabindex) to scrollable activity trails, a defined .btn-link, and fixed heading-order jumps. Proactively added a prefers-reduced-motion block, extended the :focus-visible ring to inputs, and a skip-link style. Re-verified all 22 pages still pass light/dark/system surface adaptation.
💾 feat(mockup): WCAG 2.1 AA accessibility pass (axe-core verified, light + dark) — contrast, landmarks, labels, focus, reduced-motion (v294)
v293 — Done
Dark mode validated headlessly across all pages — form controls, redundant inline tints & overlays now fully theme-adaptive
2 Jul 2026
dark mode
validation
refactor
- Rendered validation — drove every page headlessly in Edge (Playwright), forcing dark before load to exercise the FOUC guard, then asserted
<html data-theme> + 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 and system mode with zero unadapted surfaces.
- Removed redundant inline references —
<div class="alert" style="background:#f0fdf4;color:#14532d;…"> etc. just re-implemented the semantic .alert-* classes inline; replaced them with class="alert alert-success/info/warning/danger". Tokenized ~580 remaining hardcoded inline tint panels (stat cards, banners, card-headers) + inline background:#fff on selects/rows to the design-system tint/surface tokens so they follow the theme instead of duplicating light colours.
- Form controls & overlays — added a single shared
[data-theme="dark"] block in design-system.css 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.
💾 fix(mockup): dark mode headlessly validated on all pages; shared form-control theming + redundant inline tints removed (v293)
v292 — Done
Theme system hardening — no-FOUC guard on every page, dark mode on the last 3 pages, full light/dark/system parity
2 Jul 2026
dark mode
theme
a11y
- No-FOUC guard —
theme.js was loaded at the end of <body> 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 <head> (reads localStorage.pg_theme + prefers-color-scheme, sets <html data-theme> before first paint) to all 22 app-shell pages — the industry-standard pattern. theme.js still loads later for the PGTheme API + OS-change listener (idempotent).
- Missing pages —
help.html, whats-new.html and status.html linked design-system.css but never included theme.js, so they ignored the saved theme and always rendered light. Added the include, and tokenized their page-specific <style>/inline hex (note/tip/warn boxes, status pills, service rows, quick-links) which had never been dark-tested.
- Content sweep — swept every themed page for hardcoded near-black body text (
#0f172a/#1e293b/#1f2937/#374151) and neutral card surfaces/borders (#fafafa/#f9fafb/#e5e7eb) that don't adapt (biggest offenders: priorities/cluster-head.html, timeline.html, profile.html) → design tokens. Tokenized the shared overlays too (notif-bell.js, command-palette.js, digest-modal.js, idle-logout.js) 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.
💾 fix(mockup): no-FOUC theme guard on every page, dark mode on help/whats-new/status, full light/dark/system parity (v292)
v291 — Done
Dark mode — item cards, priority/achievement rows & inline panels rendered bright light in dark theme
2 Jul 2026
bugfix
dark mode
- The JS render helpers (
renderUdItems, renderPriorities, the achievements/add-reviewer inline renders) and several inline-styled panels hardcoded light hex (#f0fdf4/#fef2f2 Up/Down tints, #fff/#fffbeb priority cards, #0f172a body text, #f8fafc attachment & quick-link rows) instead of the design-system tokens. In dark mode those bypassed the [data-theme="dark"] re-tone, so item cards rendered as bright light boxes with theme-light text trapped on a light fill.
- Swapped the hardcoded hex for the existing tokens (
var(--up-bg)/var(--down-bg), var(--tint-warning-*), var(--tint-success-*), var(--tint-info-*), var(--surface)/var(--surface-subtle), var(--border), var(--text)) 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 login.html was left untouched. Mirrors the parallel fix in the web app's custom.css.
💾 fix(mockup): dark-mode item cards & inline panels use design tokens, not hardcoded light hex (v291)
v290 — Done
Bugfix — notifications/help/what's-new read the wrong sessionStorage field, always showed "Project Lead"
1 Jul 2026
bugfix
nav
- Found via a live-app-vs-mockup visual diff (screenshotting both side by side). notifications.html, help.html, and whats-new.html each read
user.roleKey from sessionStorage.pg_demo_user 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 login.html's simulateLogin(), matching the app's podgov_user shape) only ever has a role field, never roleKey. Every one of these three pages silently treated every 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.
- Fixed by reading
user.role (matching the working pattern already used on dashboard.html/profile.html/timeline.html and every other synced page) and correcting each page's no-session fallback object to the camelCase role: 'projectLead' instead of the display-label 'Project Lead' + a redundant unused roleKey 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 priorities/cluster-head.html instead of the Project-Lead default priorities/pl.html.
💾 fix(mockup): notifications/help/whats-new read user.role, not the nonexistent user.roleKey (v290)
v289 — Done
P&A review landing — "this week" at-a-glance submission summary (parity gap)
1 Jul 2026
mockup sync
priorities
- priorities/review.html — 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.
- Mirrors the app change (
feat(web) commit 2f477591): PMPAReviewScreen.tsx's team-pa-week-summary banner above the team-pa-overview-table.
💾 fix(mockup): P&A review "this week" submission summary parity (v289)
v288 — Done
App-wide — removed the redundant topbar Help icon (parity gap, 21 pages)
1 Jul 2026
mockup sync
nav
- Every authenticated page's shared topbar had a generic ❓ Help icon button (linking to
help.html) sitting alongside the sidebar's own ❓ Help nav link — and several pages (e.g. priorities/review.html) also have their own page-contextual Help button, so some screens showed three 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.
- Mirrors the app change (
fix(web) commit 27669389): AppShell.tsx dropped its topbar nav-help-topbar pill in favor of the sidebar's nav-help-link, which HelpModal's own footer already points users to.
💾 fix(mockup): remove redundant topbar Help icon app-wide (v288)
v287 — Done
Login — self-service "Resend Activation Link" on the pending-activation card (parity gap)
1 Jul 2026
mockup sync
login
- login.html — 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.
- Mirrors the app change (
feat(auth) commit 94402862 + fix(web) commit e4b912ed): LoginScreen.tsx's handleResendInvitation/POST /api/v1/auth/resend-invitation, and the later removal of the now-redundant "Go to activation page" link (bare /auth/activate needs a real token to do anything).
💾 fix(mockup): Login self-service resend-activation-link parity (v287)
v286 — Done
Profile — inline name editing (parity gap: app shipped it, mockup hadn't caught up)
1 Jul 2026
mockup sync
profile
- profile.html — the Account Details "Name" field was a static, read-only value with no edit affordance, even though
ProfileScreen.tsx 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 pf-name, the page heading, and sessionStorage.pg_demo_user on save.
- Mirrors the app change (
feat(profile/admin), commit d2667677): PATCH /api/v1/users/me accepts name; ProfileScreen.tsx's inline edit widget (profile-name-edit-btn / profile-name-input / profile-name-save-btn / profile-name-cancel-btn).
💾 fix(mockup): Profile inline name editing parity (v286)
v285 — Done
Bilateral Review — one level's approval accepts the P&A; higher levels are informational-only
1 Jul 2026
feature
priorities
- Business rule change: the P&A bilateral chain no longer requires every level to approve in sequence. Only the first active review level (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 Return the submission for revision at any time.
- priorities/review.html — 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.
- Mirrors the app change:
bilateralChainService.ts's contextIsFirstActive now gates the approve route directly (409 for non-first levels); bilateral-return 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 'informational' status (replacing 'awaiting') for levels above the first; PMPAReviewScreen.tsx and PAChainStatus.tsx render the new status and hide the Approve button (keeping Return) for informational levels.
💾 feat(pa): one-level bilateral approval, higher levels informational-only (v285)
v284 — Done
Timeline Share — copy fallback for non-secure (HTTP) contexts
1 Jul 2026
bugfix
timeline
- timeline.html —
shareEvent() only copied the type/gist/posted-by summary via navigator.clipboard, 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.
- Added a
copyTextFallback() helper (offscreen textarea + document.execCommand('copy')) used whenever navigator.clipboard is missing or its write rejects, so the full summary still gets copied over plain HTTP.
- Mirrors the app change (
fix(timeline)): same fallback added to TimelineScreen.tsx's handleShareLink.
💾 fix(mockup): Timeline Share clipboard fallback for HTTP (v284)
v283 — Done
Project Timeline — new 🚨 Escalation event type
1 Jul 2026
feature
timeline
- timeline.html — added a 7th event type, 🚨 Escalation (dark-red badge, distinct from the existing ⚠️ Risk), to the composer's TYPE dropdown, the feed's type filter, and
TYPE_STYLE. For something that needs to be raised up the reporting chain now, not just flagged as a concern.
- Mirrors the app change (
feat(timeline)): new TimelineEventType.escalation enum value (migration 20260701000000_add_timeline_escalation_type), API validation, and the web composer/badge/help-docs updates.
💾 feat(mockup): Project Timeline Escalation event type (v283)
v282 — Done
P&A Team Submission Status — labelled status pills instead of a bare icon
1 Jul 2026
mockup sync
priorities
- priorities/pl.html — the "Team Submission Status" sidebar (a manager's direct reports) showed each report's status as a bare ⏳ / 📝 / ✅ icon; it now renders the full labelled pill (⏳ Pending / 📝 Draft / ✅ Approved), matching the "My Contributors" pills right below and the React app.
- Mirrors the app change (
refactor(pa)): the shared paStatusChip 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.
💾 feat(mockup): P&A Team Submission Status labelled status pills (v282)
v281 — Done
Project Timeline — per-event Share link + gist & the unified update-history trail
1 Jul 2026
feature
mockup sync
timeline
- Each event card gains a 🔗 Share button that copies a paste-ready two-line gist (type · summary · project / author · when) plus a
?event= deep link — so a pasted share reads meaningfully in Teams/email, not just an opaque URL.
- The revisions-only "✎ Updated by" line is replaced by a chronological 🕑 update history 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 …".
- Mirrors the shipped React
TimelineScreen (Share button + eventTrail); the app also exposes a public Open-Graph unfurl endpoint so messaging apps render a preview card (gist only for "everyone"-visibility events).
💾 feat(mockup): timeline per-event Share link + update-history trail (v281)
v280 — Done
P&A — surface the "Draft" stage in Team Submission Status + the 2-level review matrix
30 Jun 2026
mockup sync
priorities
- A PL who saved a draft showed as a 📝 Draft · Preview row in the review queue but read as ⬜ Not submitted 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 📝 Draft chip (info-blue, distinct from amber Pending) across all three surfaces.
- review.html: 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. priorities/pl.html: Team Submission Status shows the 📝 draft icon.
- Mirrors the app change:
GET /reportees-status & GET /reportees-overview now report the draft row's own draft 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.
💾 fix(pa): surface "Draft" stage in Team Submission Status + 2-level matrix (v280)
v279 — Done
Scheduler cycles — final data-sync sweep (monthly cycle time + Paymentsense cycle conflict)
30 Jun 2026
mockup sync
scheduler
- admin/admin.js scheduler cycles: the Monthly Cycle (SC-003, 2nd Friday) fired at
08:00 but the seed's Monthly Governance Cycle is 09:00 — 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.
- Final data cross-check vs
prisma/seed.ts — 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).
💾 fix(mockup): final scheduler-cycle data sync (monthly time + Paymentsense conflict) (v279)
v278 — Done
Demo data — fix 5 member emails to match the seed + remove the retired P005 project references
30 Jun 2026
mockup sync
demo data
- Five member email handles diverged from
prisma/seed.ts (the canonical list the implementation login uses). Corrected across admin/admin.js, login.html (demo tiles + DEMO_USERS map) and projects.html (E map): Indurthi Hari Babu → haribabu.indurthi@, Sanjay Kumar → kumar.sanjay@, Karthikeyan → karthikeyan@, Dilip (PMO) → dilip.chenchireddy@, Gopal Krishna Tripathi → gopalkrishna.t@.
- Removed all dangling references to the retired P005 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).
- 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.
💾 fix(mockup): sync demo member emails with seed + drop retired P005 references (v278)
v277 — Done
Admin Scheduler settings — correct the Stale Project Nudge recipient + timeline schedule wording
30 Jun 2026
mockup sync
accuracy
- admin/index.html — Timeline Notification Schedule: the "Stale Project Threshold" hint said it alerts the Delivery SPOC, but the implementation (R-012,
roles_json ["pl"]) nudges the project's Project Lead(s) — 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".
- 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).
💾 fix(mockup): correct Stale Project Nudge recipient + timeline schedule wording in admin scheduler (v277)
v276 — Done
Email Templates — add the "Project Timeline" category (tab + group + filter) to match implementation
30 Jun 2026
mockup sync
email templates
- The Admin → Email Templates mockup categorised templates as Ups & Downs / P&A / Invitations & Access only, while the implementation (AdminEmailTemplatesScreen) also has a Timeline category. Added a "📅 Project Timeline" category tab (admin/index.html), section group (admin.js
renderTemplates), and edit-modal dropdown option, and recategorised the Project Timeline + timeline-reminder templates (ET-023/ET-024/ET-025/ET-027) from workflow to timeline. Now matches the impl taxonomy (ups-downs / pa / timeline / invitations / other).
💾 fix(mockup): add Project Timeline email-template category to match implementation (v276)
v275 — Done
Admin Scheduler + Email Templates — sync timeline reminders & templates with implementation
30 Jun 2026
mockup sync
scheduler
email templates
- admin/admin.js — Scheduler reminders: 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): R-011 "Weekly Timeline Digest" (ET-025, roles PL/PM/Delivery SPOC/POD Owner/Cluster Head) and R-012 "Stale Project Timeline Nudge" (ET-027, PL, 14-day threshold). Upcoming-runs + run-log timeline entries repointed to the real jobs
ET-025 (30 2 * * 1) and ET-027 (30 3 * * *) with implementation-shaped detail.
- admin/admin.js — Email Templates: added the five templates that exist in the implementation but were missing from the mockup list — ET-022 (Cluster Head P&A digest), ET-023/ET-024 (Project Timeline new/deleted event), ET-025 (Weekly Timeline Submission Reminder), ET-027 (Stale Project Timeline Nudge) — with subjects/bodies matching
seed.ts, usage stats, and category mapping (ET-022 → pa; timeline templates → workflow).
💾 fix(mockup): sync admin scheduler timeline reminders + email templates with implementation (v275)
v274 — Done
P&A team status — reporting hierarchy everywhere + click-to-open navigator
30 Jun 2026
priorities
team status
navigator
mockup sync
- priorities/pl.html — "Team Submission Status" now lists the submitter's direct reports (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.
- priorities/review.html — the in-review sidebar "Team Submissions" is now "My Team": 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).
- priorities/review.html — added the review-landing "Your Team's P&A Status" 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.
- Matches the implementation: new
GET /priorities/reportees-status (1-level) + GET /priorities/reportees-overview (2-level), with /team-status now backing only the PAScreen "Submitting As" selector.
💾 feat(web): P&A team status uses reporting hierarchy across PL + review screens; review-landing 2-level navigator (v274)
v273 — Done
Notifications — theme-aware unread tint + HTML entity decoding in title/body
30 Jun 2026
notifications
dark mode
rendering
- notifications.html: unread item tint now uses
rgba(59,130,246,0.10) in dark mode ([data-theme="dark"] .notif-item.unread) instead of the hard-coded light-blue #f0f7ff which was nearly invisible against dark backgrounds. Title, desc and time text switch to CSS variables (var(--text), var(--text-muted), var(--text-faint)) so they render correctly in both themes.
- src/web NotificationsScreen + NotificationBell: added
plainText() helper (exported from NotificationBell) — strips HTML tags and decodes HTML entities (—, ', etc.) before rendering notification title and body preview. Unread tint migrated from hardcoded inline style to theme-aware .notif-page-unread CSS class.
💾 fix(web): theme-aware notification unread tint + plainText entity decode in title/body (v273)
v272 — Done
Login split-input, Profile timezone card, R-006 all-submitter reminders, Timeline header alignment, Admin Edit User timezone picker
30 Jun 2026
login
profile
scheduler
admin
timeline
- login.html: email input split into username field + static
@valuelabs.com 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.
- profile.html: new Timezone card between Appearance and Email Notifications — IANA select (populated from
Intl.supportedValuesOf), Detect browser timezone button, Save button (disabled until changed); mirrors TimezoneSetting component + PATCH /users/me.
- admin/admin.js (R-006): trigger updated to Mon–Wed 07/11/15/19 submitter-local (4×/day) until submitted; 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.
- admin/index.html: Edit User modal now includes a Timezone IANA select (populated lazily on open, saved back to user record).
- timeline.html: Project dropdown and Email toggle button grouped in a single
align-items:flex-end flex row so the button sits beside the select rather than floating below the description.
💾 mockup(v272): sync login split-input, profile timezone, R-006 all-submitter, timeline header, admin timezone picker
v271 — Done
Email Log — redact single-use credentials (sign-in codes & invite tokens) from stored bodies
30 Jun 2026
security
email
- admin/admin.js (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.
- Mirrors a security fix:
emailLogService redacts magic-link bodies wholesale and blanks token/otp/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).
💾 fix(security): redact single-use credentials from stored email bodies (v271)
v270 — Done
Admin portal dark mode — dark theme for the AiDELoop base + tokenised admin components
30 Jun 2026
admin
dark-mode
theme
- assets/css/style.css: the AiDELoop base (loaded by the admin portal) gained a
[data-theme="dark"] block flipping the shared tokens (--bg-body, --bg-card, --surface, text, borders, shadows) plus the full --tint-* scale and --surface-subtle/--warn-bg/--danger-bg — so dark mode now reaches the admin pages, not just the 19 design-system pages.
- admin/admin.css: tokenised the hardcoded-light component colours (cards, toolbars, tables, status pills, role badges, cycle badges, alerts) to
var(--token, #originalHex) so they re-tone in dark; the white toggle knob was kept. Distinct-hue role badges keep their hues.
- No new toggle needed: admin/index.html already loads
assets/js/theme.js, and the global Appearance toggle in profile.html persists the preference that theme.js applies on every page. Verified dark + light render headlessly.
💾 feat(mockup): admin portal dark mode — AiDELoop base dark theme + tokenised admin.css (v270)
v269 — Done
Dark-mode colour parity — port the web's semantic tint tokens into the design system
30 Jun 2026
theme
dark-mode
tokens
- assets/css/design-system.css: Added a semantic tint scale (
--tint-{info,success,warning,danger,neutral,purple}-{bg,bg-strong,border,fg,fg-strong}) plus --surface-subtle, --warn-bg, --danger-bg and the muted text scale — defined for light in :root and re-toned for dark in [data-theme="dark"], mirroring the React app's src/web/src/styles/custom.css.
- Tokenised the hardcoded-light component colours (alerts, status badges, Ups & Downs item highlights, stat cards, panels, inset rows) to
var(--token, #originalHex) — 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.
- Mirrors the web change shipped earlier: theme-aware colour tokens for dark-mode contrast across the app.
💾 feat(mockup): dark-mode colour parity — port web semantic tint tokens (v269)
v268 — Done
Email Log — Resend a failed delivery (re-dispatch the stored email)
30 Jun 2026
admin
email
resend
- admin/admin.js (Email Log): failed-delivery rows now show a ↻ Resend button in their expanded detail (next to the "Delivery failed" reason) that re-dispatches the stored email to the original recipient.
- Mirrors the implementation:
POST /admin/email-log/:id/resend re-sends the EXACT stored subject + body via the sendEmail choke point (logged as a fresh attempt + audited as email.resent); AdminEmailLogScreen shows the Resend button on failed details and reloads.
💾 feat(mockup): Email Log resend-failed button (v268)
v267 — Done
Email Log per-recipient drill-down — click a recipient to see all their emails
30 Jun 2026
admin
email
drill-down
- admin/index.html + admin.js (Email Log): the recipient in each row is now clickable — selecting one shows every email to that address with an "📧 Showing emails to <address> · Clear" banner above the table.
drillEmailRecipient() / clearEmailDrill() filter the log client-side; Clear restores the full list.
- Mirrors the implementation: a
recipient filter on GET /admin/email-log (contains-match so it still catches comma-separated to-lines) + the clickable recipient + drill banner in AdminEmailLogScreen.
💾 feat(mockup): Email Log per-recipient drill-down (v267)
v266 — Done
Email Log stat cards + retention setting (daily cleanup of old email records)
30 Jun 2026
admin
email
retention
- admin/index.html (Scheduler → Global Settings): new Email Log Retention (days) 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).
- admin/admin.js:
schedulerSettings.emailLogRetentionDays added to state. (The Email Log section's stat cards — Total / Delivered / Failed / Sent Today — were already in v265.)
- Mirrors the implementation shipped this session:
GET /admin/email-log/summary + stat cards, the email_log_cleanup scheduler job, and the emailLogRetentionDays SchedulerSettings column.
💾 feat(mockup): Email Log retention setting + stat-cards parity (v266)
v265 — Done
Admin Email Log — report of every email the system sent, with filters & body preview
29 Jun 2026
admin
email
report
- admin/index.html: New ✉️ Email Log 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
▼ View expanding the FINAL rendered message body. Failed rows surface the SMTP error.
- admin/admin.js:
adminState.emailLog sample data across all kinds (notification, invitation, sign-in link, weekly digest, scheduled report, test send, plus a failed delivery); renderEmailLog() with client-side filtering, toggleEmailBody() body preview, clearEmailLogFilters(); wired into navigateTo('email-log').
- Mirrors the implementation shipped this session:
EmailLog model captured at the sendEmail SMTP choke point + GET /admin/email-log report and AdminEmailLogScreen.
💾 feat(mockup): admin Email Log report — recipient, body preview, filters (v265)
v264 — Done
Role full-forms: expand abbreviated PL / PM in approval chains, status tables & charts
28 Jun 2026
consistency
roles
- dashboard.html & admin/index.html: Ups & Downs / Priorities approval-chain renderings now spell out
Project Lead and Project Manager instead of PL / PM, matching the full-form labels (Delivery SPOC, Sales SPOC, POD Owner, Cluster Head) already used in the same chains.
- workflow/pmo.html, workflow/cluster-head.html, cycle-detail.html: "Full Approval Chain Status" / approval-history tables now show
Project Lead Team and Project Manager level badges.
- reports.html: Return-rate-by-stage table and SVG bar chart axis use
Project Manager; workflow/pm.html note byline reads "Added by Project Manager".
💾 feat(mockup): role full-forms — expand PL/PM across chains, tables & charts (v264)
v263
Industry UX gaps XI: PMO skeleton loaders, disabled-button tooltip, mark-all-read undo-bar
28 Jun 2026
skeleton
a11y
undo
- workflow/pmo.html: Skeleton loaders pre-populated in
#ups-list and #downs-list; DOMContentLoaded handler delayed 800 ms so skeletons are visible before real items render, signalling async data fetch to the user.
- priorities/cluster-head.html: "Awaiting submission" plain text replaced with a
disabled button with title tooltip — "Cannot acknowledge — waiting for team member to submit their Priorities & Achievements" — surfacing the blocked reason on hover without expanding the card.
- notifications.html: "Mark all read" now calls
markAllRead() — 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.
💾 feat(mockup): industry UX gaps XI — PMO skeletons, disabled tooltip, mark-all-read undo (v263)
v262 — Done
Industry UX gaps X: Ctrl+Enter hints on 4 review screens, Print button on Reports
28 Jun 2026
keyboard
workflow
reports
- workflow/spoc.html, pod.html, cluster-head.html, priorities/review.html: 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.
- reports.html: "🖨 Print" button added next to Export All in the header; calls
window.print() after a brief toast so the browser print/save-as-PDF dialog opens — common enterprise pattern for distributing KPI dashboards.
💾 feat(mockup): industry UX gaps X — ctrl+enter review hints + reports print button (v262)
v261 — Done
Industry UX gaps IX: post-approval Add Note, Ctrl+Enter hint, Copy Link, admin section quick-jump nav
28 Jun 2026
cycle-detail
workflow
admin
ux
- cycle-detail.html: "📝 Add Note" button in approved banner toggles an inline post-approval note form;
submitPostNote() appends the note to the live audit trail with timestamp and author.
- workflow/pl.html: Ctrl+Enter keyboard shortcut wired to
submitPL() on the Note to PM textarea; visible "(Ctrl+Enter to submit)" hint displayed right-aligned below the char counter.
- workflow/pm.html: "🔗 Copy link" button added to the cycle header; copies
window.location.href to clipboard via navigator.clipboard with toast confirmation.
- admin/index.html: 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
navigateTo()'s existing .nav-item.active toggle.
💾 feat(mockup): industry UX gaps IX — add-note, ctrl+enter, copy-link, admin section nav (v261)
v260 — Done
Industry UX gaps VIII: admin automation-disabled warning banner wired to global toggle
28 Jun 2026
admin
system-state
banner
- admin/index.html: Persistent red
#automation-disabled-banner 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.
- admin/admin.js:
toggleAutomationDisabled(disabled) shows/hides the banner and fires a warning/success toast for immediate feedback.
💾 feat(mockup): industry UX gaps VIII — automation-disabled system-state banner (v260)
v259
Industry UX gaps VII: approval chain turnaround times, P&A unsaved-changes guard + submit loading state
28 Jun 2026
cycle-time
dirty-guard
loading-state
- cycle-detail.html: 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.
- priorities/pl.html:
_isDirty flag + document-level input listener + window.onbeforeunload guard warns before navigating away with unsaved edits; saveDraft() and wfApprove() both reset the flag on success.
- priorities/pl.html: Submit button passes
this to wfApprove(); button disables + shows "⏳ Submitting…" during the async mock, re-enables after 2.5 s to prevent double-submit. Added title="Ctrl+Enter to submit" tooltip.
💾 feat(mockup): industry UX gaps VII — approval turnaround times, dirty guard, submit loading state (v259)
v258
Industry UX gaps VI: 6 remaining admin confirm() → undo-bar, date-range From/To labels in admin scheduler + exports
28 Jun 2026
undo-bar
a11y
admin
- admin/admin.js: 6 remaining
confirm() calls replaced with showUndoBar() — revokeInvitation (restores status), deleteScheduledReport, deleteCycle (snapshot restore), archiveCycle (status restore), deleteRelationship (snapshot restore), revokeToken (status restore). All destructive actions in the entire mockup now use undo-bar.
- admin/index.html: Scheduler Run History filter and On-Demand Exports date-range inputs wrapped with visible "From" / "to" / "To" text labels;
aria-label retained for screen-reader parity.
💾 feat(mockup): industry UX gaps VI — admin confirm()→undo-bar, date-range labels (v258)
v257
Industry UX gaps V: review-comment required/optional hint on 4 workflow pages, cycle phase indicator on project cards
28 Jun 2026
ux-hint
phase-indicator
workflow
- workflow/pm.html, spoc.html, pod.html, cluster-head.html: 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.
- projects.html:
renderCard() 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.
💾 feat(mockup): industry UX gaps V — review-comment hint, project card cycle-phase indicator (v257)
v256
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
28 Jun 2026
undo-bar
auto-save
empty-state
no-confirm
- 17 HTML files:
revokeMyToken() confirm() replaced with inline undo-bar snackbar (5 s grace + Undo link restores token to active); _revokeUndoFn global pattern mirrors admin undo-bar.
- timeline.html:
deleteEvent() confirm() replaced with same undo-bar pattern; note text clarifies linked drafts not removed.
- priorities/pl.html: "Save as Draft" now calls
saveDraft() which shows a "Last saved HH:MM" timestamp label (left-aligned in action-bar) alongside the success toast.
- cycle-history.html: Filter empty-state upgraded from inline
<tr><td> to a proper .no-results card with icon, message, and "Clear filters" button; table hidden when empty.
💾 feat(mockup): industry UX gaps IV — undo-bar confirm replacement, draft auto-save, empty-state parity (v256)
v255
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
28 Jun 2026
drill-down
file-upload
expiry-banner
empty-state
- dashboard.html: 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.
- workflow/pl.html: File-upload zone shows accepted-types hint ("PNG, PDF, DOCX, XLSX — max 5 files · 10 MB each") and wires
dragover/dragleave/drop events to the .dragover CSS class already in design-system.css.
- profile.html: 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.
- priorities/cluster-head.html: Member-filter empty state with clear-filters button when no members match.
- timeline.html: Differentiates filter-empty (🔍 no-match + Clear filters CTA) from genuine no-events state;
clearTlFilters() resets all three filter axes.
💾 feat(mockup): industry UX gaps III — stat drill-downs, file-upload hints, PAT expiry banner, empty-state parity (v255)
v254
Industry UX gaps II: admin pagination (10/page), undo-bar for deletes, char counters on all comment fields, aria-sort on reports table headers
28 Jun 2026
pagination
undo-bar
char-count
a11y
- admin/admin.js + index.html: Client-side pagination (10 per page) on Projects, PODs, and Users tables; page resets to 1 on filter change; pager controls show current range.
- admin/admin.js:
showUndoBar() replaces confirm()+immediate delete for projects, PODs, and users — 5-second grace period with one-click restore.
- admin/admin.css:
.pager / .pager-btn / .pager-info styles added.
- workflow/pl.html, pm.html, spoc.html, pod.html, cluster-head.html:
updateCharCount() + .char-count div on every comment textarea (0 / 500 live counter, warns at 80%, red at limit).
- priorities/pl.html, review.html: Same char-counter treatment on P&A comment and reviewer-feedback textareas.
- reports.html:
sortTable() now sets aria-sort="none" on non-sorted headers (was removing the attribute); remaining sortable headers given initial aria-sort="none".
💾 feat(mockup): industry UX gaps II — admin pagination, undo-bar, char-counters, aria-sort (v254)
v253
Industry UX gaps: skeleton CSS, sort indicators, no-results state, empty states, inline validation, undo bar — 5 pages + design-system.css
28 Jun 2026
ux
empty-state
validation
sort
- design-system.css: Added skeleton shimmer loader (
.skeleton, @keyframes skeleton-shimmer), sortable column headers (.th-sortable, .sort-icon), enhanced empty/no-results states, inline field validation (.field-error, .char-count, .form-control.invalid), and undo snackbar (.undo-bar).
- notifications.html:
applyFilters() now shows a "No notifications match your filters" empty state with a Clear filters CTA when all items are hidden.
- reports.html: All 5 comparison tables have sortable column headers with ascending/descending
aria-sort indicators; sortTable() function handles numeric and string comparisons.
- workflow/pl.html:
renderUdItems() renders a contextual no-results state when the ups or downs list is empty instead of a blank card body.
- priorities/pl.html: AiDE, general priority, and achievement inputs show inline
.field-error feedback on empty submit; live character count (updateCharCount) appears as user types; max-3 achievement guard added.
💾 feat(mockup): industry UX gaps — skeleton, sort, empty-states, inline validation (v253)
v252 — Done
Nav/topbar parity pass: apostrophe JS fix, logo subtitle, icon labels, admin order, topbar icon buttons — all 23 pages
28 Jun 2026
nav
topbar
admin
- Critical JS fix: raw apostrophe in
What's New 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 What's New.
- Logo subtitle: "Ups & Downs Workflow" → "ValueLabs Internal Platform" (matches AppShell.tsx).
- Ups & Downs icon: 📈📉 → 📈 (single icon, matches implementation).
- My P&A label/icon:
🎯 My P&A → 📝 My Priorities & Achievements.
- P&A History label/icon:
📜 P&A History → 🗂️ Priorities & Achievements History.
- Admin sidebar order: Org Hierarchy moved from Management → Settings; Reporting section now appears before AI Integration.
- Topbar icon buttons: Help ❓ / Search 🔍 / Notifications 🔔 icon buttons added; 🔑 Profile text replaced by avatar circle; 🚪 Sign Out text replaced by SVG logout icon.
- timeline.html + status.html: Admin block expanded to full 5-section standard; status.html loggedIn conditional topbar replaced with standard topbar.
💾 fix(mockup): nav/topbar parity — apostrophe JS fix + icon/label/admin/topbar alignment (v252)
v251
Admin portal sidebar sections added to help / notifications / whats-new pages
28 Jun 2026
nav
rbac
- help.html, notifications.html, whats-new.html: these three pages had
showAdminLinks defined but never used — admin portal sidebar sections (Management, Automation, Settings, AI Integration, Reporting) were missing. Added conditional (showAdminLinks ? ... : '') block, matching the pattern in all other pages. Admin and PMO Associate now see the full admin nav on every authenticated page.
💾 fix(mockup): admin portal sidebar on help/notifications/whats-new (v251)
v250
Role-aware sidebar nav — fix visibility, P&A routing, Reports, admin access
28 Jun 2026
ux
nav
rbac
- All 21 pages: sidebar nav now matches
AppShell.tsx 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).
- P&A routing fixed: pm/esoSpoc/recruitmentSpoc/projectContributor now go to
priorities/pl.html (submit) instead of review; salesSpoc gets a "My P&A" secondary link; admin/pmoAssociate have no current P&A link.
- Dashboard module picker: P&A card and button route correctly per role; hidden for admin/pmoAssociate.
💾 fix(mockup): role-aware sidebar nav across all pages (v250)
v249
MCP tool count 33 → 34 (get_cycle_digest tool added to server)
28 Jun 2026
w→m
mcp
- profile.html + mcp-guide.html: updated tool count references 33 → 34 to reflect new
get_cycle_digest MCP tool added in feat(mcp): get_cycle_digest tool (Jun 27 2026). All four "33 tools" occurrences replaced.
💾 fix(mockup): bump MCP tool count 33→34 (v249)
v248
Notification bell: snooze-aware — 🔕 icon + paused note when email notifications are snoozed
28 Jun 2026
notifications
w→m
- assets/js/notif-bell.js: snooze-aware bell — reads
window.pgNotifSnooze (ISO date); when active, bell shows 🔕 (no unread badge), title shows snooze label, and the dropdown panel gains a "🔕 Email notifications paused until … — manage in Profile" note below the header. Mirrors NotificationBell.tsx snoozedUntil / isSnoozeActive / snoozeLabel logic.
💾 feat(mockup): snooze-aware notification bell — muted icon + paused note (v248)
v247
Update Digest modal: Changes-only toggle + Copy to clipboard; Update Digest on cycle-detail page
28 Jun 2026
workflow
cycle-detail
w→m
- assets/js/digest-modal.js (new shared file): full
CycleDigestModal implementation — overlay modal with formatted digest text, Changes only checkbox toggle (swaps full vs. changes-only content), Copy to clipboard button with ✓ feedback. showDigestModal() / hideDigestModal() globals.
- workflow/pmo.html, spoc.html, pod.html, cluster-head.html: Update Digest button
onclick changed from showToast(…) to showDigestModal(); digest-modal.js script tag added.
- cycle-detail.html: 📋 Update Digest button added to header action bar (mirrors historical cycle digest in
CycleDetailScreen.tsx); digest-modal.js script tag added.
💾 feat(mockup): Update Digest modal with changes-only toggle + clipboard; cycle-detail digest button (v247)
v246
Dashboard: clickable Recent Activity rows; Timeline: results count; Projects: results count footer
28 Jun 2026
dashboard
timeline
projects
w→m
- dashboard.html: Recent Activity table rows are now clickable (
onclick + cursor:pointer + hover highlight) — navigates to cycle-detail.html; mirrors DashboardScreen.tsx row-click behaviour.
- timeline.html: results count line (N events, or N events (filtered from M) when a filter is active) appears above the feed; powered by
renderFeed() setting tl-results-count.
- projects.html: N of M projects count line between filter bar and cards grid;
filterProjects() sets proj-results-count.
💾 feat(mockup): dashboard clickable rows, timeline + projects results counts (v246)
v245
Admin portal: results-count footer on Projects, PODs, Users, Reporting Relationships tables; Cluster Head: cumulative review-impact badges
28 Jun 2026
admin
workflow
w→m
- admin/index.html + admin.js: Showing N of M results-count footer beneath each of the four admin tables (Projects, PODs, Users, Reporting Relationships);
renderProjects(), renderPods(), renderUsers(), renderReportingRelationships() each set the new footer div.
- workflow/cluster-head.html: cumulative review-impact badges (➕ X added ✏️ Y modified across all reviewers) between the info banner and the page layout — mirrors
ClusterHeadScreen.tsx pod-changes-summary.
💾 feat(mockup): admin results-count footers + cluster-head cumulative impact badges (v245)
v244
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
28 Jun 2026
notifications
cycle-history
profile
w→m
- notifications.html: per-row Mark read / Mark unread button; Clear filters link (appears when category ≠ All or Unread-only is on); results count N of M · K unread updates live. JS:
applyFilters(), clearFilters(), toggleRead().
- cycle-history.html: ⬇ Export CSV button in card header toolbar; Showing N of M cycles count footer below table.
- profile.html: PAT token table — ⚠ Expiring soon 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);
renderTlMuteTable() + toggleProjectMute().
💾 feat(mockup): notifications mark-read/clear-filters, cycle-history CSV export, profile PAT expiry badge + per-project timeline mute (v244)
v243
Admin portal gaps: scheduler trigger/date filter + pagination, MCP token search/filter + expiring-soon badge, MCP log slow-call badge + status filter fix
28 Jun 2026
scheduler
mcp-tokens
mcp-log
admin
- Scheduler Run History: added trigger (cron/manual) and date-range filters; load-more pagination (20/page); Export CSV button moved to card header.
- MCP Issued Tokens: search by name/owner, filter by status (active/revoked/expired) and scope (read/write); Expiring soon amber badge for tokens expiring within 14 days; Export CSV; Clear filters.
- MCP Interactions log: quick-search bar (identity, tool, endpoint); visible-count label; status filter fixed to
2xx/4xx/5xx (was ok/denied/error); slow-call ⚠ badge on duration ≥ 1000 ms.
💾 feat(mockup): admin portal gaps — scheduler filters/pagination, MCP token filter + expiry badge, MCP log search + slow-call badge (v243)
v242
Fix sidebar Account section order + add Notifications and MCP Setup Guide on all 21 pages
28 Jun 2026
sidebar
notifications
mcp-guide
- All 21 sidebar pages updated<\strong>: Account section now has 5 items in correct order matching
AppShell.tsx: 🔔 Notifications → ✨ What’s New → 👤 My Profile → ❓ Help → 🔌 MCP Setup Guide. Previously had 3 items in wrong order (What’s New, Help, My Profile).
- 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.
- 3 HTML-entity pages individually updated<\strong>:
whats-new.html, help.html, notifications.html — each uses HTML hex entities for emoji; order fixed and MCP Setup Guide added.
💾 feat(mockup): fix sidebar Account order + add Notifications & MCP Setup Guide on all pages (v242)
v241
Add What’s New + Help pages; sidebar links on all 19 pages; fix notifications.html shell.js gap
28 Jun 2026
whats-new
help
sidebar
notifications
- whats-new.html (new): mirrors
WhatsNewScreen.tsx — 8 release-note cards newest-first, matching all entries from whatsNew.ts.
- help.html (new): mirrors
HelpScreen.tsx — 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.
- All 19 sidebar pages updated: Account section now includes ✨ What’s New and ❓ Help links before 👤 My Profile. Batch-applied via Python to preserve UTF-8 emoji.
- notifications.html fixed: migrated from missing
assets/js/shell.js reference to full inline sidebar JS, matching the pattern of all other pages. Also adds Notifications self-link to the Account section.
💾 feat(mockup): add What’s New + Help pages, sidebar links on all pages (v241)
v240
Gap checklist complete — R-04 AiDE donut view, R-05/W-06 confirmed; 50/50 items resolved
28 Jun 2026
reports
audit
donut-chart
- reports.html — AiDE donut chart (R-04): added 🍩 Donut toggle button to AiDE Adoption card; table view wrapped in
rv-t-aide, new donut chart SVG in rv-c-aide — mirrors web AideDonut component (proportion ring, 100% centre text, legend). Uses existing toggleReportView() function.
- R-05 confirmed already present: return-rate horizontal bar chart in
rv-c-return was already there, toggled by 📊 Chart button.
- W-06 closed by design:
spoc.html handles both Delivery SPOC and Sales SPOC via JS roleKey check — no separate page needed.
- Gap checklist: 50/50 items resolved — all gaps either implemented (across v235–v240) or confirmed already present. Mockup is fully in sync with web implementation.
💾 feat(mockup): R-04 AiDE donut chart, gap checklist 50/50 complete (v240)
v239
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)
28 Jun 2026
pa-editor
dashboard
audit
- priorities/pl.html — Rich-text toolbar (PA-01): added
.rt-toolbar (B/I/U/bullet) above each of the three entry inputs (AiDE priority, regular priority, achievement); CSS added in page <style> block matching timeline.html rt-toolbar pattern.
- dashboard.html — Role-personalised P&A card (D-04): JS now updates
#module-pa-title, #module-pa-desc, #module-pa-tag, #module-pa-info, and button text based on role — Cluster Head sees Executive Digest copy, reviewers see Review copy, PL/contributor keep Submit copy — matches web DashboardScreen.tsx paCardTitle/paCardDesc.
- P-01 to P-05 confirmed already present:
NotificationPreferences.tsx fully implements digest frequency (P-01), include/exclude checkboxes (P-02), snooze controls (P-03), preview button (P-04), test send (P-05).
- AO-01/AO-02 confirmed already present:
AdminOrgHierarchyScreen.tsx has per-node expand/collapse (▶/▼) and search match count; mockup also has org-tree-match-count span.
- Checklist: 44/50 items complete; remaining open: R-04, R-05, W-06 (all 🟢 low priority).
💾 feat(mockup): PA-01 rt-toolbar on pl.html, D-04 role copy on dashboard, checklist audit (v239)
v238
Gap checklist batch — P-08 Appearance reorder, TL-01 rich-text toolbar, TL-02 upload area, TL-03/AE-01/AE-02 confirmed present
28 Jun 2026
profile
timeline
rich-text
upload
- profile.html — Appearance section reorder (P-08): moved 🎨 Appearance card to appear immediately after Account Details and before Email Notifications, matching the web ProfileScreen section order.
- timeline.html — Rich-text formatting toolbar (TL-01): added
.rt-toolbar row (B / I / U / bullet list / numbered list / clear) above the event textarea in the composer, mirroring web RichTextEditor toolbar.
- timeline.html — File upload area (TL-02): added
.upload-area drag-and-drop panel below the capture chips, before the Post button — matches web attachment support.
- TL-03 / AE-01 / AE-02 confirmed already present: audience tooltip (
seenTag title), email template category tabs (tmpl-tabbar), and usage stats strip (tmpl-usage-strip) were all already implemented.
- Checklist: 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).
💾 feat(mockup): P-08 Appearance reorder, TL-01/02 rich-text + upload, checklist audit (v238)
v237
Gap checklist batch — Help buttons (6 pages), cluster-head CE-01/02/03, PA-04 progress ring, W-03 downstream changes cards
28 Jun 2026
help-buttons
cluster-head
progress-ring
review-impact
- Help buttons — 6 pages (PA-05, PAR-05, CD-02, CH-01, CE-04, PR-01): added contextual Help button to
priorities/pl.html, priorities/review.html, cycle-detail.html, cycle-history.html, priorities/cluster-head.html, and projects.html account-meta / title rows.
- priorities/cluster-head.html — Week picker landing (CE-01): added Select Reporting Week card at top mirroring web
ClusterHeadPAScreen param-less state — shows W23–W26 buttons that simulate loading a digest.
- priorities/cluster-head.html — Acknowledge loading state (CE-02):
acknowledgeDemo() now shows ⏳ Acknowledging… for 1.2 s before confirming, matching web acknowledging loading state.
- priorities/cluster-head.html — ET-011 digest footer (CE-03): added footer note below members container explaining Monday 18:00 IST digest cadence.
- priorities/pl.html — Checklist progress ring (PA-04): added percentage display + animated progress bar above checklist items;
updateChecklist() now computes done/3 and updates colour (amber → green at 100%).
- workflow/pl.html + pm.html — Downstream Review Changes (W-03): added blue-bordered 🔁 Downstream Review Changes card to sidebar of both screens, showing ➕ added / ✏️ modified badges and contributing roles — mirrors web
ReviewImpactCard.
💾 feat(mockup): gap batch — Help buttons, CE-01/02/03, PA-04 progress ring, W-03 review-impact cards (v237)
v236
P&A mockup sync — approval chain status, My Contributors (all roles), review queue, changes badge, PL search
28 Jun 2026
pa-chain
contributors
review-queue
workflow
- priorities/pl.html — Approval Chain Status (PA-02): upgraded static chain to per-level status rows matching web
PAChainStatus component — each level shows reviewer name + status badge (✅ Approved / ⏳ Pending / ○ Awaiting).
- My Contributors card (PA-03, all roles): added to
priorities/pl.html sidebar showing direct reports' bilateral review status. Added matching Team Submissions sidebar card to priorities/review.html so PM/SPOC/POD/Cluster Head also see their team's submission status.
- priorities/review.html — Review queue landing (PAR-01): new Pending Reviews card above the account-header listing submissions awaiting the reviewer, with per-row Review → button — mirrors web
PMPAReviewScreen param-less landing state.
- workflow/pod.html + spoc.html — Changes summary badge (W-04): added ➕ N added / ✏️ N modified pill row beside the colour legend, matching web
changesSummary.
- workflow/pm.html — PL search field (W-05): added search input above the Project Lead Submissions list, matching web
PLSubmissionsPanel search.
💾 feat(mockup): P&A sync — chain status, My Contributors (all roles), review queue, changes badge, PL search (v236)
v235
Mockup ↔ web sync (W→M) — workflow Help/Digest buttons, dashboard banners, status docs, reports timeline, notifications page
28 Jun 2026
sync
notifications
dashboard
workflow
status
reports
- Workflow Help + Digest buttons — added ❓ Help to PL and PM account-headers; added ❓ Help + 📋 Update Digest to PMO, POD, Delivery SPOC, and Cluster Head account-headers — mirrors the quick-action bar present in the web implementation.
- Dashboard CTA banners — added Pending My Action (blue,
data-testid="pending-action-banner") and Returned to Me (orange, data-testid="returned-to-me-banner") banners above the stats grid, plus a Quick Links card (Cycle History / Project Timeline / My Profile / Reports) after Recent Activity.
- Status page informational sections — appended three cards: Important Links (6 link buttons), About POD Governance (workflow description + roles table), and User Manual (6 task-group cards in a 3-col grid).
- Reports — Project Timeline Activity card — added stat boxes (Total Events, Capture Rate, Contributors, Projects Active) + event-type bar chart before the Notifications & Digest Delivery section.
- New page:
notifications.html — 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.
💾 feat(mockup): sync W→M gaps — Help/Digest buttons, dashboard banners, status docs, reports timeline, notifications page (v235)
v234
Toggle button consistency — proper switch with white thumb across all pages
28 Jun 2026
toggle
design-system
profile
- Added
.toggle-switch / .toggle-slider component to assets/css/design-system.css — 40×22 px pill with a 16 px white circular thumb that slides via CSS ::before + translateX(18px); checked state uses var(--success). Matches the existing admin-portal toggle exactly.
- Updated 16 mockup pages (dashboard, reports, profile, cycle-detail, cycle-history, projects, all workflow screens, all priorities screens) to use the shared CSS classes instead of the previous inline-style
np-slider / tl-notif-slider pattern, which rendered as a plain coloured pill with no visible thumb.
- Removed per-page JavaScript that manually set
slider.style.background on every checkbox change — the CSS input:checked + .toggle-slider rule handles colouring automatically.
💾 fix(mockup): consistent toggle-switch across all pages — shared CSS thumb in design-system (v234)
v233
Admin Scheduler: Timeline Notification Schedule + emoji fix
28 Jun 2026
scheduler
timeline
emoji
- Timeline Notification Schedule — new card in Admin → Scheduler → Configuration listing three timeline jobs: TL-001 Weekly Activity Digest (Monday 07:00 IST, project members not muted), TL-002 Stale Project Alert (daily, Delivery SPOCs when no events for ≥14 days), and TL-003 Muted-Project Cleanup (Sunday 03:00, system job, no email). Each row has a live enable/disable toggle wired to
toggleReminder().
- Two new configurable settings added below the table: Stale Project Threshold (days, default 14) and Digest Delivery Day (day-of-week select), both persisted in
adminState.schedulerSettings.
- Run-history seeded with SR-009/010/011 (digest sent 23 emails, stale alert for 2 projects, cleanup no-op).
- Emoji/symbol corruption fixed in
admin/admin.js: PowerShell 5.1 mojibake had converted ▶ ▼ ○ ◑ ⚠ ➕ to garbled cp1252 sequences; all six restored to correct Unicode.
💾 feat(admin): Timeline scheduler section + fix mojibake symbols in admin.js (v233)
v232 — Done
OTP paste auto-submits when all 6 digits are pasted
28 Jun 2026
login
otp
- 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).
- Mirrors the React implementation:
handleOtpPaste calls verifyOtpCode() when pasted.length === 6.
💾 fix(mockup): OTP paste auto-submits when all 6 digits are pasted (v232)
v231 — Done
Reset notification preferences to defaults
27 Jun 2026
profile
notifications
- A Reset to defaults action on Profile → Email Notifications turns every setting (toggles, digest cadence/content, snooze, muted projects) back to its default in one click. Backed by
POST /notifications/preferences/reset.
💾 feat(notifications): reset preferences to defaults (v231)
v230 — Done
Per-project timeline email mute + mark notifications unread
27 Jun 2026
timeline
notifications
- On the Project Timeline you can now mute email for a specific project's timeline (the in-app bell still records events). Backed by
PATCH /notifications/timeline-mute + project-aware send gating.
- The notifications page lets you mark items read or unread via a per-row action.
💾 feat: per-project timeline email mute + mark-unread (v230)
v229 — Done
Digest content customization + scheduler activity filters
27 Jun 2026
digest
scheduler
- Profile → Email Notifications can now choose which sections the digest includes — Pending reviews and/or Returned submissions.
- Admin scheduler Run History gains Load more pagination, quick date-range presets, and a trigger (cron/manual) filter.
💾 feat: digest content customization + scheduler activity filters (v229)
v228 — Done
Reporting Relationships CSV export & admin results counts
27 Jun 2026
admin
export
- Admin → Reporting Relationships gains an Export CSV button, and "Showing N" results-count footers were added to the Projects, Users, PODs and Reporting Relationships tables.
💾 feat(admin): reporting-relationships CSV export + results counts (v228)
v227 — Done
Digest delivery log CSV export
27 Jun 2026
reports
export
- Reports → Data Exports gains a Digest Delivery Log — CSV (ET-026 weekly + daily runs: emails sent, candidates, skipped), via
GET /admin/reports/export?type=notifications.
💾 feat(reports): digest delivery log CSV export (v227)
v226 — Done
Pause email notifications (quiet period)
27 Jun 2026
notifications
profile
- Profile → Email Notifications can pause all category emails for 1 day / 1 week / 30 days (with "Resume now"). The in-app bell and sign-in/account mail keep working. Backed by
emailSnoozedUntil on the preference.
💾 feat(notifications): pause email notifications / quiet period (v226)
v225 — Done
Reports: notifications & digest delivery + notifications pagination
27 Jun 2026
reports
notifications
- Reports & Analytics gains a Notifications & Digest Delivery section: in-app volume by category and weekly/daily digest run stats (
GET /admin/reports/notifications).
- The full notifications page now supports Load more pagination (server offset).
💾 feat(reports): notification & digest delivery analytics (v225)
v224 — Done
Export CSV on Project Accounts
27 Jun 2026
admin
export
- Admin → Project Accounts gets an Export CSV button (respecting the active search / POD / status filters), matching the Users & Roles export.
💾 feat(admin): Export CSV on Project Accounts (v224)
v223 — Done
Notifications & accessibility polish
27 Jun 2026
notifications
accessibility
profile
- Notifications page: day grouping, URL-driven filters with "Clear filters", total/unread count, relative times, and retry-on-error; sidebar shows the unread count.
- Profile digest gets a cadence hint under the Weekly/Daily/Off selector.
- Accessibility: persistent toast live region, command-palette combobox semantics, route-change focus, reduced-motion support, and dialog aria-describedby.
💾 feat: notifications + a11y polish (v223)
v222 — Done
Daily digest runs on weekdays only
27 Jun 2026
scheduler
digest
- The daily pending-actions digest (ET-026-daily) now fires Monday–Friday only (
0 3 * * 1-5) — no weekend noise when there's typically no new activity.
💾 feat(scheduler): daily digest weekdays only (v222)
v221 — Done
Daily digest job in the scheduler activity
27 Jun 2026
scheduler
digest
- The Admin scheduler activity now shows a sample ET-026-daily run (and its Job Health card), with a "Skipped — other cadence" detail chip illustrating how weekly/daily users are split.
💾 chore(mockup): daily digest run sample in scheduler activity (v221)
v220 — Done
Dedicated Project Timeline notifications section
27 Jun 2026
profile
notifications
- Profile settings now has a separate Project Timeline Notifications card, splitting timeline event emails out of the general Email Notifications list for clearer control.
💾 feat(profile): separate Project Timeline notifications section (v220)
v219 — Done
Digest cadence (weekly / daily / off) & What's New
27 Jun 2026
digest
whats-new
scheduler
- Users choose their personal pending-actions digest cadence — Weekly (default), Daily, or Off — in Profile → Email Notifications. A new daily ET-026 scheduler job serves daily-cadence users; the weekly job serves the rest.
- New in-app What's New release-notes page (sidebar + ⌘K) with a "NEW" badge until viewed.
💾 feat: digest cadence + What's New (v219)
v218 — Done
Notification bell: category tags & unread filter
27 Jun 2026
notifications
filter
- Each bell item now carries a colour-coded category tag (Ups & Downs · Priorities · Digest · Timeline · Account), mirroring the server's template categories.
- New Unread only / Show all toggle in the panel header to focus on what still needs attention.
💾 feat(notifications): bell category tags + unread-only filter (v218)
v217 — Done
Dashboard returned-actions CTA & Job Health
27 Jun 2026
dashboard
scheduler
digest
- Dashboard surfaces the "returned to you" half of the weekly digest live (
GET /dashboard/my-actions) as a "needs an update" CTA, alongside the existing "awaiting your review" banner.
- Admin → Scheduler → Activity gains a Job Health card showing the most recent run of each job (status, when, items, duration) via
GET /admin/scheduler/runs/latest.
💾 feat: dashboard returned-actions CTA + scheduler Job Health (v217)
v216 — Done
Admin digest run insights
27 Jun 2026
scheduler
insights
admin
- Admin → Scheduler → Activity & Run Log now renders run detail as friendly stat chips (Emails sent, Skipped — nothing pending, …) above the raw JSON, and the ET-026 weekly digest run is shown in the log.
- The ET-026 job records richer stats (candidates, with-pending, sent, skipped-empty, skipped-recent); Run Now already fires it from Upcoming Runs.
💾 feat(scheduler): admin digest run insights (v216)
v215 — Done
Weekly digest preview & test-send
27 Jun 2026
notifications
digest
profile
- Profile → Email Notifications now has a Preview my digest button (renders your live ET-026 digest in an inline frame) and a Send me a test button — no need to wait for Monday.
- Backed by
GET /notifications/digest/preview and POST /notifications/digest/test; the test honours your Weekly digest opt-out and tells you when it's muted.
💾 feat(notifications): weekly digest preview & test-send (v215)
v214 — Done
Weekly pending-actions digest (ET-026)
27 Jun 2026
notifications
scheduler
digest
- New ET-026 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.
- Opt out via the Profile Weekly digest email preference. Shown in Admin → Email Templates and the scheduler's upcoming jobs.
💾 feat(notifications): weekly pending-actions digest (ET-026) (v214)
v213 — Done
Dark mode in the mockup (light / dark / system)
27 Jun 2026
theme
dark-mode
ux
- Opt-in dark theme mirroring the React app: new shared
assets/js/theme.js applies <html data-theme> from a saved preference; design-system.css flips the design tokens under [data-theme="dark"] (the sidebar/topbar were already dark, so this re-tones the content surfaces).
- Toggle from the ⌘K command palette (Toggle dark mode) or the new 🎨 Appearance card on Profile (Light / Dark / System; System follows the OS).
- Wired into all signed-in shell pages.
💾 feat(mockup): opt-in dark mode (light/dark/system) (v213)
v212 — Done
⌘K palette — live project search
27 Jun 2026
navigation
search
projects
- The ⌘K command palette now also surfaces matching projects (name / POD) under a “Projects” group; selecting one opens it at the role's workflow page.
- Mirrors the implementation, where project results come from the already-access-scoped
GET /projects (no new search surface).
💾 feat(web): live project search in the command palette (v212)
v211 — Done
Admin · Bulk Invite users (CSV)
27 Jun 2026
admin
invitations
bulk
- New ✉️ Bulk Invite action on Admin → Users: paste CSV (
email[, role] per line) with a default role, see a live valid-row count, then a per-row results table (invited / skipped / error) + summary.
- Mirrors the implementation's
POST /admin/invitations/bulk (each row processed independently; a bad/duplicate row never aborts the batch; capped at 200).
💾 feat(admin): bulk user invitations (CSV) (v211)
v210 — Done
⌘K command palette — keyboard-first navigation
27 Jun 2026
navigation
keyboard
ux
- New global ⌘K / Ctrl-K command palette (also a topbar 🔍 button) to jump to any screen by typing — ↑/↓ to move, Enter to open, Esc to close, plus a Sign out action.
- Role-aware entry list (admin items hidden from non-admins, etc.); navigation-only, mirroring
CommandPalette.tsx.
- New shared
assets/js/command-palette.js wired into every signed-in shell page.
💾 feat(web): ⌘K command palette for keyboard-first navigation (v210)
v209 — Done
Active Sessions — per-device sign-out on the Profile screen
27 Jun 2026
security
sessions
profile
- New 💻 Active Sessions card on the Profile screen listing every device currently signed in (browser/OS, IP, last-active, signed-in time), with the current device flagged This device.
- Sign out any individual device, or Sign out other devices in one click — mirrors the implementation's stateful per-device sessions (JWT
sid claim + GET/DELETE /auth/sessions and POST /auth/sessions/revoke-all).
- Complements the all-devices sign-out and the 30-minute inactivity auto-logout (v208).
💾 feat(auth): per-device sessions with Active Sessions management (v209)
v208 — Done
Inactivity auto-logout with 5-minute countdown warning + login email pre-fill
27 Jun 2026
security
auth
session
- Signed-in users are now auto-logged-off after 30 minutes of inactivity and returned to the login page.
- The final 5 minutes show a “⏳ Still there?” countdown modal with Stay signed in and Sign out now; any activity in the active phase resets the timer, while only an explicit “Stay signed in” dismisses the countdown.
- On timeout the login page shows a “You were signed out due to inactivity” notice and pre-fills the remembered email so the user can request a fresh magic link / OTP without retyping.
- New shared
assets/js/idle-logout.js (mirrors useIdleLogout.ts + IdleWarningModal.tsx) wired into every signed-in shell page; includes an unobtrusive “⏳ Idle demo” pill that fires a short countdown for review.
- Login check-inbox OTP now auto-submits on the 6th digit, matching the implementation.
💾 feat(web): 30-min inactivity auto-logout with countdown warning + login pre-fill (v208)
v207 — Done
Help & Documentation in-app hub with screenshots + detailed step-by-step guides
26 Jun 2026
help
docs
screenshots
- New
/help route — in-app Help & Documentation screen accessible to every authenticated role.
- Two-column layout: sticky left nav (8 topics) + scrollable content pane per topic.
- Topics: Getting Started, Ups & Downs, Priorities & Achievements, Project Timeline, Reports & Analytics, Audit Log, MCP Integration, Profile & Tokens.
- Inline screenshots for every feature section using images from
mockup/screenshots/ (served via public/screenshots/).
- Added
timeline.png to capture script and regenerated all screenshots.
- Step-by-step numbered guides for each workflow; role tables, status tables, capture tables; Note / Tip / Warn callout boxes.
- ❓ Help nav item added to the AppShell Account section sidebar;
Help & Documentation topbar title registered.
- 28 Vitest tests covering layout, all 8 topic navigations, and content spot-checks.
💾 feat(web): add in-app Help & Documentation screen with screenshots (v207)
v206 — Done
Mockup: login check-inbox screen updated with 6-digit OTP code entry UI
26 Jun 2026
login
otp
mockup
- Step 2 "Check your inbox" card now shows both sign-in paths: the magic link button and a 6-digit OTP code entry.
- Six separate digit boxes with auto-advance on input, backspace-to-previous, and paste support (pastes full code across all boxes).
- "Sign In with Code" button is disabled until all 6 digits are filled; enabled state uses full opacity.
- Demo hint shows the code (482 917) — click it to auto-fill all boxes.
- Entering the wrong code shows an inline error with red border on all boxes; correct code calls
simulateMagicLinkClick() to continue the demo flow.
- Updated description copy: "A sign-in link and a 6-digit code were sent…"
- Animated progress bar (900 s shrink) signals the 15-minute expiry window.
💾 feat(mockup): add OTP code entry to login check-inbox screen (v206)
v205 — Done
Feat: 6-digit OTP code alternative to magic link — enter code directly on check-inbox screen
26 Jun 2026
auth
login
otp
- Magic link email now contains both a sign-in button and a 6-digit OTP code (e.g.
123 456) in the same message. Users can use either.
- Check-inbox screen has a new six-box OTP input with auto-advance, backspace, and paste support. "Sign In with Code" button submits via
POST /auth/verify-code.
- Code has the same 15-minute expiry and single-use enforcement as the magic link token.
- 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.
- New API:
POST /api/v1/auth/verify-code — accepts { email, code }, issues session cookie + JWT, records audit event.
💾 feat(auth): add 6-digit OTP code as alternative magic-link sign-in (v205)
v204 — Done
Fix: invitation expiry email now shows correct calendar date per timezone
24 Jun 2026
email
timezone
- Bug:
fmtExpiryMultiTz 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 previous calendar day (Sat 27 Jun) but the email showed the wrong date for those recipients.
- Fix: Rewrote
fmtExpiryMultiTz to compute each timezone’s Date instance independently from UTC and emit "Day DD Mon YYYY, HH:MM AM/PM TZ" per segment.
- Before: Sun 28 Jun 2026, 01:39 AM IST / 08:09 PM GMT / 03:09 PM EST
- After: Sun 28 Jun 2026, 01:39 AM IST / Sat 27 Jun 2026, 08:09 PM GMT / Sat 27 Jun 2026, 03:09 PM EST
- All 33
timeFormat tests pass; added a 6th fmtExpiryMultiTz test reproducing the screenshot scenario. fmtDeadlineDate and fmtMondayDeadline are unchanged (their fixed IST times never cross midnight for GMT or EST).
💾 fix(email): show correct per-timezone calendar date in invitation expiry (v204)
v203 — Done
Fix: logo broken on sub-path deployments (IIS virtual directory)
24 Jun 2026
logo
deploy
- Bug:
PodGovLogo.tsx used a hardcoded absolute path src="/pod-governance.svg" which resolved to the server root, not the app’s sub-path (e.g. /PODGovernance_Dev/). The logo rendered as a broken image in the live environment.
- Fix: Changed to
src={`${import.meta.env.BASE_URL}pod-governance.svg`}. Vite injects BASE_URL as the correct base path (“/” in local dev, /PODGovernance_Dev/ in sub-path builds via VITE_BASE env var).
- Updated
PodGovLogo.test.tsx assertion to toContain() so it works for any base path.
💾 fix(logo): use import.meta.env.BASE_URL for pod-governance.svg path (v203)
v202 — Done
Replace inline "PG" hexagon with official POD Governance logo across all pages
24 Jun 2026
logo
branding
- Downloaded the official
pod-governance.svg (indigo rounded-square org-chart icon, #4338ca) from the AiDELoop assets server and placed it in assets/img/pod-governance.svg.
- Replaced every inline
<svg> hexagon “PG” logo with <img src="assets/img/pod-governance.svg"> across all 24 pages (login, auth-verify, auth-activate, index, history, and all 19 sidebar files).
- Also updated the React app:
src/web/public/pod-governance.svg (new), favicon.svg replaced, and PodGovLogo.tsx now renders the <img> instead of the inline hexagon SVG.
💾 feat(logo): adopt official pod-governance.svg — replace inline PG hexagon everywhere (v202)
v201 — Done
Login: full sign-in scenario coverage (validation, account states, rate-limit)
22 Jun 2026
auth
login
- Every magic-link sign-in path is now handled on
login.html. Send Magic Link validates and branches up front instead of always showing “Check your inbox”:
- Inline validation — empty address, malformed email, and non-work domain (must be
@valuelabs.com) each show a field-level error.
- Email Address Not Found — unknown address gets a dedicated screen that echoes the email and asks the user to contact their POD Administrator to be added (invitation-only).
- Account Not Yet Activated — invited-but-unactivated accounts are pointed to their invitation email / the activation page.
- Account Deactivated — admin-disabled accounts are told to contact an Administrator to reactivate.
- Too Many Requests — more than 3 magic-link requests for one address per session trips a rate-limit screen.
- Happy path — active accounts get the “Check your inbox” confirmation. A new “Demo — login scenarios” chip row lets reviewers jump to each state, each chip driving the real
handleLogin() branch.
💾 feat(login): implement all sign-in scenarios (validation, not-found, pending, deactivated, rate-limit) (v201)
v200 — Done
Project Timeline: stronger card borders
21 Jun 2026
style
timeline
- Stronger borders: event card borders bumped from 1 px
#e2e8f0 to 1.5 px #cbd5e1 (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.
💾 style(timeline): stronger card borders (v200)
v199 — Done
Project Timeline: type-colour thread polish (accent edge, dot halo, type icons)
21 Jun 2026
style
timeline
- Type-colour thread: 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 (
TimelineScreen + custom.css .tl-*).
- In the single-column mobile view the accent moves to the left (spine) edge for every card.
- "N can see" tooltip: 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 (
seenBy) 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).
💾 style(timeline): type-colour thread polish (v199)
v198 — Done
Project Timeline: alternating two-sided (zigzag) layout around a centre spine
21 Jun 2026
layout
timeline
- Zigzag timeline:
mockup/timeline.html 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.
- Mirrored header: the author (avatar + name) is kept nearest the spine on both 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.
- Staggered interleave: 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.
- Type-coloured connectors: a thin connector line ties each card to its dot on the spine, coloured by event type (via a per-card
--ev-color variable) so the alternating links read as a weave; cards lift slightly on hover. Connectors hidden in the mobile column view.
- Responsive: below 760 px the stream collapses to a single left-aligned column (spine on the far left) so it stays readable on narrow screens.
💾 feat(mockup): timeline alternating two-sided layout (v198)
v197 — Done
Project Timeline: full-width stretch layout (matches the Ups & Downs review screens)
21 Jun 2026
layout
timeline
- Stretch layout:
mockup/timeline.html now fills the full content width like workflow/spoc.html & the other review screens — dropped the max-width:1000px; margin:0 auto centring on .tl-wrap and the padding:0 / custom-background override on .main-content, so the composer and feed stretch edge-to-edge with the standard 28 px content gutters and the shared --bg-body.
💾 fix(mockup): timeline full-width stretch layout parity with U&D review (v197)
v196 — Done
Project Timeline hardening — reporting-graph scoping, revisions/audit, draft-sync guards
21 Jun 2026
timeline
collaboration
a11y
- Reporting-graph visibility: events are now scoped to project membership, 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 Preview as control lists the selected project’s actual members. A
👁 N can see tag (with a hover roster) makes the audience explicit, and posting toasts how many people were notified.
- Append-only edits + audit: editing an event now keeps the previous version — a “view N revisions” toggle shows the prior text struck through with attribution. A new Activity log view records every post / edit / add-info / delete (modelling the unified system audit log). Authors can delete their own events.
- Hardened draft sync: captures route to the most current open cycle/week — if the current cycle is locked they fall through to the next open one (flagged next open). Priorities/AiDE respect the weekly 3-priority limit: when full they post as a Suggestion rather than a hard draft. Draft tags are now clickable, deep-linking into Ups & Downs / Priorities & Achievements.
- Feed UX + a11y: search, type filter, date grouping and Load more pagination. Capture chips are real
<button aria-pressed> controls (keyboard-operable, focus rings); the Preview as bar is marked MOCKUP so it reads as a demo affordance. All user text is HTML-escaped on render.
💾 feat(mockup): timeline reporting-graph scoping + revisions/audit + draft-sync guards + a11y (v196)
v195 — Done
Project Timeline: peer/above collaborative editing + AiDE capture option
21 Jun 2026
timeline
collaboration
priorities
- Collaborative editing: any project member at the author’s level or above in the reporting chain can now open an event and edit its detail or add more info as a threaded note. Contributions are attributed (“✎ Updated by Project Manager”, “+ Added by …”). Peers at the same rank retain shared visibility and edit rights; juniors below the author cannot edit.
- Two-way sync: 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.
- AiDE capture: added 🤖 AiDE 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.
- Permission and visibility are both demonstrable via the existing Preview as role selector;
mockup/timeline.html only.
💾 feat(mockup): timeline collaborative editing + draft sync + AiDE capture (v195)
v194 — Done
New Project Timeline — a shared per-project event log for every role (except Admin)
21 Jun 2026
timeline
collaboration
nav
- New page
mockup/timeline.html — a project-scoped running log where anyone on the team can post an event (milestone / win / risk / blocker / decision / update). Linked to a project via a selector and surfaced in the sidebar Workflow section on every page.
- Hierarchy visibility: by default an event is visible to its author and everyone above them in the reporting chain (PL → PM → Delivery SPOC → Sales SPOC → POD Owner → Cluster Head). A “Visible to everyone” checkbox overrides this to share with all project roles. A Preview as role selector demonstrates how the feed changes per viewer.
- Capture into governance: a multi-select lets the author also draft the event into Ups, Downs, Priorities and/or Achievements — Ups & Downs draft into the project’s most current cycle, Priorities & Achievements into the most current week. Posted events show the resulting draft tags.
- Administrator excluded: signing in as Admin shows an access-denied state instead of the timeline. Sidebar Project Timeline link added across all 18 shell pages; index landing card + page count (32) updated.
💾 feat(mockup): project timeline with hierarchy visibility + governance draft capture (v194)
v193 — Done
Monthly “Nth weekday” deadlines (1st & 3rd Friday) + Projects-screen parity sync
21 Jun 2026
parity
scheduler
projects
admin
- New monthly schedule type: the cycle modal now offers a Day of month vs The Nth weekday toggle. The Nth-weekday mode pairs multi-select occurrence pills (1st 2nd 3rd 4th Last) with a weekday dropdown — so a deadline can be the 1st & 3rd Friday of every month
- Use case: Paymentsense now runs on a dedicated 1st & 3rd Friday cycle while every other monthly project follows the standard 2nd Friday cycle — achieved by grouping projects into separate cycles, no per-project override needed
- Backend:
dayConfig gains a monthlyMode discriminator (day_of_month | nth_weekday) with weekday + ordinals[] (validated, -1 = last); computeNextRun resolves the soonest matching occurrence. Fully backward-compatible — an absent monthlyMode keeps the legacy fixed-day behaviour. Forward path: this discriminator is the stepping stone toward an iCalendar RRULE model for arbitrary recurrences
- Projects-screen parity: brought the mockup in line with the implementation now that cycle scheduling lives in the Scheduler — removed the per-project Review Cycle & Cycle Start Date fields, the All Cycles filter, and the Project ID / Cycle table columns. The project modal’s senior chain (Cluster Head, POD Owner, Delivery SPOC, Sales SPOC) is now required, with a note pointing to Admin → Scheduler
💾 feat(scheduler): monthly Nth-weekday deadlines + projects parity (v193)
v193 — Done
Mockup week/cycle tabs now show full date ranges — matching the implementation
21 Jun 2026
parity
priorities
workflow
- P&A screen (
mockup/priorities/pl.html): week tabs updated from Current Week (W25, 2026) / Next Week (W26, 2026) to Current Week (2026-W25 (15 Jun – 21 Jun)) / Next Week (2026-W26 (22 Jun – 28 Jun)) — matching the withWeekRange() output in the live app
- U&D PL screen (
mockup/workflow/pl.html): cycle tabs updated from Current Cycle (JUN-2026-W25) / Next Cycle (JUN-2026-W26) to include the Mon–Sun range in parentheses, matching the implementation exactly
💾 fix(mockup): display date ranges on week/cycle tabs — parity with implementation (v193)
v192 — Done
Cycle scheduler: drop start/end dates, port advanced recurrence to the app
21 Jun 2026
parity
scheduler
admin
- Removed the cycle modal’s Start date (full date) field and the leftover Until (end date) wiring from the Outlook-style scheduler — review cycles recur indefinitely from their schedule, so neither belongs on a cycle
- Ported the remaining advanced options into the implementation (AdminSchedulerScreen): a Repeat every N interval (weeks/months) and multi-select day-of-week pills (M T W T F S S) replacing the single day dropdown
- Backend:
dayConfig now carries optional days[] + interval (validated 1–12 / known weekdays); computeNextRun returns the soonest selected weekday and clamps monthly day-of-month to month length
💾 feat(scheduler): multi-day + interval recurrence; remove cycle start/end dates (v192)
v191 — Done
Current Week / Current Cycle tabs now show their date range too
20 Jun 2026
parity
priorities
workflow
- Symmetry fix: the Current Week (P&A) and Current Cycle (U&D) tabs now display their period code beside the label — e.g. Current Week (W25, 2026) and Current Cycle (JUN-2026-W25) — mirroring the Next Week / Next Cycle tabs which already showed it
- Implementation: PAScreen now stores
weekIdStr from /priorities/current and renders it via withWeekRange; PLScreen shows the active cycle’s range on the Current Cycle tab
💾 feat(pa): show the week/cycle range on the Current tab, matching the Next tab (v191)
v190 — Done
Login demo tiles synced to the live app — all 27 seeded users
20 Jun 2026
sync
login
- Parity fix: the login screen’s demo tiles now match the implementation’s seeded users exactly — added the 7 missing Project Leads (Kuntal Singha, Indurthi Hari Babu, Anitha Deva, Sanjay Kumar, Karthikeyan Ramaswamy, Rajyalakshmi Palnati, Shabbir Ahmed) so the mockup now shows all 27 demo users
- Corrected two demo names to match the seed data: Chenchireddy G D K Reddy (PMO Associate) and Pavani Prathyusha Mulpuru (ESO SPOC)
💾 chore(mockup): sync login demo tiles with the live LoginScreen DEMO_USERS (v190)
v189 — Done
Next-iteration pre-planning — Next Week / Next Cycle tabs + submission window
19 Jun 2026
feature
workflow
priorities
- Record work for the next iteration as it happens: both Priorities & Achievements (Next Week tab) and Ups & Downs (Next Cycle tab) let you pre-plan and Save as Draft at any time
- Submission window: the next period’s Submit to your manager button stays disabled until one day before the period begins — enforced on both the screen and the API
- U&D Next Cycle: 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
💾 feat(preplan): next-iteration pre-planning for P&A + U&D with submit-window gating (v189)
v188 — Done
Audit Log — unified, app-wide trail across every operation
19 Jun 2026
feature
admin
- One unified audit log: the System Audit Log now records every 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
- Per-entity trails: each row is tagged with its
entity (cycle / priorities / user / project / …) so any record’s detail screen can surface its own activity trail; the admin viewer gains an Entity filter and expanded event types
- Backed by the live app’s new append-only
app_audit_log table (the cycle-scoped audit_log was unified into it) and a generic appAuditService.record() instrumented across all 60+ mutating endpoints
💾 feat(audit): unified app-wide append-only audit log + per-entity trails (v188)
v187
Projects — Black Sun merge + standardise cadence to Monthly (Paymentsense Bi-Weekly), all projects active
18 Jun 2026
data
- Canonical project list 15 → 14: Black Sun Technology Services (P002) and BLACK SUN PLC (P005) are combined and continue as a single Black Sun PLC, keeping the P002 id; P005 is retired
- Cadence standardised: every project now runs Monthly except Paymentsense Ltd, which is the only Bi-Weekly account; all projects are now active (MagicBooking flipped from inactive)
- Synced across
admin/admin.js, projects.html, dashboard.html & reports.html, plus the live app’s seed.ts (also stopped seeding workflow cycles — they are now created on demand via UI manual runs), e2e fixtures and AdminUsersScreen test data
💾 data(projects): merge Black Sun, monthly cadence (Paymentsense bi-weekly), all active, no seeded cycles (v187)
v186 — Done
Activity Trail — Project Contributor entry + role full forms in sync with app
18 Jun 2026
feat
- Mockup/app parity: the live app’s Activity Trail was rendering raw backend role keys (e.g.
project_contributor); roleLabel() in AuditTrailSidebar.tsx now maps Project Contributor, ESO SPOC & Recruitment SPOC to full forms, matching the mockup which always showed friendly labels
- priorities/pl.html & priorities/review.html: added a representative Project Contributor submission entry (Gopal Krishna Tripathi) to the Activity Trail sample data so the demo visually reflects the contributor → PL P&A flow
💾 feat(audit): Project Contributor in Activity Trail + role full forms parity (v186)
v185 — Done
Email templates — show submission deadline in all three timezones
16 Jun 2026
feat
- ET-007 (Monday Kickoff): deadline now reads “by Monday, 12:00 PM IST / 06:30 AM GMT / 01:30 AM EST” instead of bare
Monday 12:00, matching the multi-timezone {{deadline}} convention used by the other templates
- ET-008 (Submission Reminder): demo body deadline updated to “12:00 PM IST / 06:30 AM GMT / 01:30 AM EST today”
- The shared
fmtMultiTz formatter now emits 12-hour clock with AM/PM, so every token-rendered {{deadline}}/expiry string switches to 12-hour too
- Synced across
seed.ts, a new et007_deadline_multitz migration, and the admin.js template previews
💾 feat(email): show P&A submission deadline in IST/GMT/EST across templates (v185)
v184 — Done
Project Contributor mappings, login tiles, docs & refreshed screenshots
16 Jun 2026
feat
docs
- Seed / mockup data: replaced the sample contributors (Meera/Arjun → Swati) with Gopal Krishna Tripathi & Shivsagar Mishra reporting to Kuntal Singha (Black Sun) —
seed.ts, admin.js users + RR-025/RR-026, E2E fixtures & spec
- login.html: added two Project Contributor demo tiles +
DEMO_USERS entries (land on the P&A submission screen)
- docs.html: new “Project Contributor Submission” screen card + TOC link;
rp-projectContributor pill
- screenshots: regenerated all mockup screenshots (login now shows the contributor tiles; admin Users / Reporting Relationships show the new mappings)
💾 feat(role): Project Contributor mappings + login tiles + docs/screenshots (v184)
v183 — Done
Docs portal — document the Project Contributor role & chain
16 Jun 2026
docs
- mockup/docs.html: added
project_contributor to the Roles & Access table; updated the Introduction approval-chain note and the Reporting Relationships role combinations to include Project Contributor → Project Lead
- mockup/docs.html: 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, …)
💾 docs(mockup): document Project Contributor role in docs.html (v183)
v182 — Done
Project Contributor role — P&A-only tier under the Project Lead
16 Jun 2026
feat
api
ux
- schema.prisma / migration: added
project_contributor to the UserRole enum (P&A-only bottom tier)
- permissions.ts: new P&A-scoped
PA_CAN_SUBMIT (adds contributor) and PA_CAN_REVIEW (adds PL) — kept separate from the U&D CAN_* sets
- bilateralChainService.ts: submitter-aware chain —
REVIEWER_LADDER with PL at the bottom + chainRolesFor() (PC’s chain starts at PL, then up the normal hierarchy)
- priorities.ts: P&A routes use the scoped role sets and the submitter’s chain; reportingRelationships.ts: read endpoint gains a
managerId filter
- PAScreen.tsx: “My Contributors” card lets a PL review their contributors; PC sees a P&A-only home (no Ups & Downs)
- mockup/admin: role definition + badge (
rb-projectContributor), demo user, RR-025 (PC→PL), and P&A chain text now Project Contributor → PL → PM → …
💾 feat(role): Project Contributor — P&A-only tier reporting to the Project Lead (v182)
v181 — Done
Save as Draft for all submissions + next-week pre-planning + reviewer Save Note
16 Jun 2026
feat
ux
api
- schema.prisma: added
draft to BilateralStatus enum; added plDraftNote/plDraftSavedAt/reviewerDraftNote/reviewerNoteSavedAt to BilateralReview; added isDraft/draftNote to CyclePlSubmission
- migration SQL:
ALTER TYPE BilateralStatus ADD VALUE 'draft' + new columns on both tables
- priorities.ts:
GET /priorities/next-week (creates/returns next week record); POST /priorities/:weekId/save-draft (PL saves P&A draft); PATCH /priorities/:weekId/bilateral-save-note (reviewer saves draft note); POST submit-pl promotes draft → pending
- cycles.ts:
POST /cycles/:id/save-draft (PL saves U&D draft); POST submit-pl promotes draft → full submission; submittedPlIds excludes draft records from "all PLs submitted" count
- PAScreen.tsx: Current Week / Next Week tab switcher; “💾 Save as Draft” button; future-week info banner; submit disabled on next-week tab
- PLScreen.tsx: “💾 Save as Draft” button in U&D action bar
- PMPAReviewScreen.tsx: “💾 Save Note” button in reviewer action bar
- mockup/priorities/pl.html: week tab switcher (Current / Next Week); Save as Draft button
- mockup/priorities/review.html: Save Note button prepended to action bar
- mockup/workflow/pl.html: Save as Draft button in action bar
💾 feat(draft): save-as-draft for P&A and U&D + next-week pre-planning (v181)
v180 — Done
Show week date ranges everywhere — pages, emails, PDF, and mockup
16 Jun 2026
feat
ux
email
- weekLabel.ts (frontend):
formatWeekLabel now shows full date range — “W22, 2026 (25 May – 31 May)” instead of just the start date
- timeFormat.ts (API): added
isoWeekToDateRange() (“2026-W22” → “25 May – 31 May”) and isoWeekSpanToDateRange() for combined two-week spans
- Email templates (ET-007 – ET-012, ET-022):
{{weekDates}} token added alongside {{weekLabel}} in all P&A email bodies so recipients see e.g. “2026-W24 & 2026-W25 (8 Jun – 21 Jun)”
- schedulerService.ts + priorities.ts:
weekDates token passed in all ET-007/008/009/010/011/012/022 email sends; combined-week kickoff uses isoWeekSpanToDateRange(prevWeek, currentWeek)
- pdfService.ts: PDF header now reads “Week: 2026-W22 (25 May – 31 May)”
- mockup/priorities/history.html: week selector options and digest header labels updated to the new range format
💾 feat(ux): show week date ranges on pages, emails, and PDF (v180)
v179 — Done
admin.js — remove “notify PLs” from ET-007 job label
16 Jun 2026
admin
- ET-007 label updated from “Priorities & Achievements Monday kickoff (notify PLs)” to “Priorities & Achievements Monday kickoff” — now covers all roles via reporting relationships
💾 fix(scheduler): remove “notify PLs” from ET-007 job label (v179)
v178 — Done
admin.js — remove POD Gamma placeholder
16 Jun 2026
admin
data
- Removed POD Gamma (placeholder entry with no projects, no owner) from
mockup/admin/admin.js pods array
- Canonical POD list is now 2: POD Basu and POD Ananth
- Matching removal from
seed.ts (POD constant + podSpecs), header comment updated to “2 PODs”
- Test fixtures renamed from “POD Gamma” to generic names; step28 script + memento doc updated
💾 fix(seed): remove POD Gamma placeholder from seed data and all references (v178)
v177 — Done
docs.html — replace CSS illustrations with real mockup screenshots (30 pages)
16 Jun 2026
docs
reference
- Captured 30 screenshots from live mockup HTML pages using Playwright (1280×800 viewport, headless Chromium)
- All standalone pages: Login, Auth Verify, Auth Activate, Dashboard, Projects, 7 Workflow screens, Cycle History, Cycle Detail, 4 Priorities & Achievements screens, Reports, Profile, Status
- All 10 Admin sections: Projects, PODs, Users, Scheduler, Email Templates, Reporting Relationships, Reports & Exports, MCP Access Tokens, MCP Interaction Log, Audit Log
- Each
.illus div in docs.html replaced with <img src="screenshots/xxx.png"> — click-to-enlarge lightbox still works on all images
- Scripts
capture.js + inject.js added to mockup/screenshots/ for re-capture when mockup pages update
💾 docs(mockup): replace CSS illustrations with real mockup screenshots in docs.html (v177)
v176 — Done
docs.html — expand abbreviations, full scheduler job table, lightbox click-to-expand
16 Jun 2026
docs
reference
- Replaced all abbreviations in
docs.html and PAGES.md: "PL" → "Project Lead", "PM" → "Project Manager", "Del SPOC" → "Delivery SPOC", "Priorities & Achievements" replaces all "P&A" short forms
- 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
pa_kickoff_all highlighted as manual-only job targeting all roles via the reportingRelationship table with combined week label
- Click-to-expand lightbox added: clicking any screen illustration opens a 1.85× scaled overlay with the screen title
💾 docs(mockup): expand abbreviations, add scheduler job table + lightbox to docs.html (v176)
v175 — Done
docs.html — HTML implementation reference with CSS screen illustrations
16 Jun 2026
docs
reference
- Created
mockup/docs.html — self-contained HTML documentation page covering every screen implemented in the production React application
- 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
- Sticky TOC sidebar with scroll-spy; Roles & Access table; Tech Stack summary
💾 docs(mockup): add docs.html — HTML implementation reference with screen illustrations
v174 — Done
PAGES.md — detailed mockup pages & features reference documentation
16 Jun 2026
docs
reference
- Created
mockup/PAGES.md — comprehensive reference document covering every page, section, panel, feature, and demo user in the mockup
- 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)
- Documents the Design System (
design-system.css), app shell/sidebar/topbar composition, notification bell, and shared component patterns
- Includes full file structure tree, ET code reference table (ET-001 to ET-022), role colour-coding table, and all 18 demo user accounts
- Documents the new
pa_kickoff_all scheduler job (added in schedulerService.ts) — sends ET-007 to all active direct reports across all roles for the current + previous week
- Maintained alongside the mockup; updated as pages, features, or demo data change; does not reflect the production implementation
💾 docs(mockup): add PAGES.md — detailed pages & features reference
v173 — Done
Scheduler Upcoming Runs gains ▶ Run Now button for missed P&A jobs
15 Jun 2026
feature
scheduler
- Added an Actions column to the Upcoming Runs table in Admin → Scheduler → Activity & Run Log
- Each row now has a ▶ Run Now 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
- Fires
POST /api/v1/admin/scheduler/jobs/:jobType/fire; the run is logged with trigger: manual and appears instantly in Run History
- Mirrors the new
fireJobByType() export in schedulerService.ts and the corresponding admin route added to admin.ts
v172 — Done
Scheduler gains an Activity & Run Log tab (past runs + upcoming runs)
14 Jun 2026
feature
scheduler
- Added a Configuration | Activity & Run Log tab switcher to the Admin → Scheduler screen (
admin/index.html)
- Upcoming Runs table merges each active cycle’s next run with the fixed-cron jobs (ET-007/008/011/012, reminders, scheduled reports), sorted soonest-first
- Run History 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
- Mirrors the implemented feature: a new
scheduler_runs table + GET /admin/scheduler/runs, /runs/export and /upcoming endpoints persist and surface every scheduler execution
v171 — Done
All demo/sample data across the mockup replaced with real seed identities
14 Jun 2026
data
parity
- Swept every demo page (
workflow/*, priorities/*, dashboard.html, cycle-detail.html, profile.html, reports.html, admin/*) to replace the placeholder accounts (Accenture / Deloitte / HSBC / Capgemini / Infosys, ACC-001…005, POD Alpha/Beta) with the real seed projects (APS Bank, Black Sun, Krispy Kreme… P001–P015) and PODs (POD Basu / POD Ananth)
- 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…)
- 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
v170 — Done
Select-a-Project board now lists the real seed projects (P001–P015)
14 Jun 2026
fix
data
- Replaced the 5 placeholder accounts (Accenture / Deloitte / HSBC / Capgemini / Infosys —
ACC-001…005) on projects.html with the 15 real seed projects P001–P015 (APS Bank, Coventry University, Paymentsense, Globalisation Partners…) including their POD, cadence and full SPOC / PM / PL assignments from prisma/seed.ts
- The board now shows only the projects the signed-in user is assigned to (matching the page footer); Admin, Cluster Head and PMO see the full portfolio. An empty-state message appears when none match
- Updated the workflow-preview demo blob (
PG_DEMO) header from the fake “Accenture / POD Alpha” to a real seed project (APS Bank · POD Basu · P001)
v169 — Done
Demo user emails synced to seed.ts — realistic firstname.lastname addresses
14 Jun 2026
data
parity
- Synced all 25 demo-user emails in
admin/admin.js and the 18 login tiles + DEMO_USERS map in login.html to the new backend seed scheme: firstname.lastname.test@valuelabs.com (e.g. vishnu.test → vishnu.goluguri.test, admin.test → system.admin.test)
- Fixed a stale typo — Ananth Reddy’s email was
ananta.test, now ananth.reddy.test
- Updated the Admin “Add / Invite user” email placeholders to
firstname.lastname.test@valuelabs.com to reflect the convention
- Mockup demo logins now match the live seeded Dev / QA / UAT databases
v168 — Done
System Status page is now open access (no login required)
14 Jun 2026
enhancement
ops
- Removed the login-redirect guard from
status.html so the System Status page is reachable directly without signing in
- The topbar now adapts when signed-out — it shows a 🔐 Sign In link instead of the user avatar / Profile / Sign Out actions
- (The landing-page link added in v167 now opens the page directly instead of bouncing to login)
v167 — Done
New System Status page — Website / API / MCP across all environments
14 Jun 2026
feature
ops
- Added
status.html — a System Status dashboard rendering the health of the three services (Website, API, MCP server) across all four environments (Production, Staging, QA, Development) as a per-environment card grid
- Each service shows a status pill (operational / degraded / down / maintenance), latency, uptime and its
/health endpoint; an overall banner + summary counts roll up the worst status, with a Refresh action that re-simulates the checks
- Wired into the landing page (index.html) and a new sidebar “Operations” section on the status page
v166 — Done
Fix remote MCP “Bad Request” — stateless HTTP transport
14 Jun 2026
fix
mcp
- Enabling the remote MCP server in AiDE failed with “Bad Request”. Root cause: the HTTP transport kept sessions in a per-process in-memory map keyed by
Mcp-Session-Id; under iisnode (multiple workers + app-pool recycles) the worker that handled initialize often wasn’t the one that received the follow-up tools/call, so the session wasn’t found and the server returned 400 Bad Request: no valid session ID
- Switched the Streamable HTTP transport to stateless mode (
sessionIdGenerator: undefined): each POST /mcp spins up a fresh server, handles one JSON-RPC message, and returns plain JSON — no session to lose. GET/DELETE /mcp now return 405
- Updated the MCP guide transport section to describe stateless mode; mockup mirror refreshed
v165 — Done
MCP: admin CRUD tools for projects, PODs & users
14 Jun 2026
feature
mcp
docs
- The MCP server gained 13 admin-portal tools (now 33 total) wrapping the
/admin/* CRUD endpoints: full create/read/update/delete for projects and PODs, plus users (list, role/status update, project-membership replace, and invite-by-email as the create-user path)
- All admin tools require an admin/PMO token (others get a 403) and respect the same delete guards as the portal (project with active cycles → 409; POD with projects → 409)
- The public MCP guide gained an “Admin Portal” tool subsection and a section 8 of the Prompt Library with admin examples; tool counts updated 20 → 33 across the guide, Profile copy, and docs
v164 — Done
MCP: full CRUD on items + expanded prompt-library docs
14 Jun 2026
feature
mcp
docs
- The MCP server gained 6 new tools (now 20 total) completing create/update/delete for the two core entities:
list_cycle_items, add_cycle_item, update_cycle_item, delete_cycle_item for Ups & Downs, plus update_pa_item and delete_pa_item for Priorities & Achievements; submit_pl_items now carries the AiDE flag
- The public MCP guide (
mcp-guide.html) gained a “Prompt Library — by task” section: 8 task groups with multiple natural-language prompt → tool-call examples covering every tool, plus updated tool grid and counts (14 → 20)
- The Profile page’s “Connect Your AI Assistant” copy reflects the new tool count
v163 — Done
Link the AiDE panel to the full setup documentation
14 Jun 2026
enhancement
docs
- The Profile page’s Connect Your AI Assistant guide listed the AiDE (VS Code) Remote Servers steps but had no path to the deeper reference. Added a “Read the full AiDE setup documentation” link at the bottom of the AiDE panel, deep-linking to
mcp-guide.html#aide-remote and opening in a new tab
- Mirrors the same change in the React webapp (
ProfileScreen.tsx), where the href is built from import.meta.env.BASE_URL so it resolves under any deploy base
v162 — Done
De-duplicate the design system into one shared design-system.css
14 Jun 2026
refactor
cleanup
- The full ~1,390-line design system (tokens, self-hosted Inter font-faces, base components) was duplicated inline in every page as 7 drifted copies — a token tweak applied differently per page. Extracted it once to
assets/css/design-system.css; the 15 app-shell pages now <link> it instead of carrying the block inline (each shrank by ~1,400 lines)
- 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)
login.html keeps its inline block on purpose (bespoke SPA styles); admin/ keeps its own admin.css
- Webapp parallel: removed dead
src/web/src/App.css (Vite scaffold demo styles, imported nowhere)
v161 — Done
Remove duplicate Profile / Sign Out from dashboard module-picker footer
14 Jun 2026
fix
cleanup
dashboard.html: the module-picker footer repeated 🔑 Profile & API Tokens + 🚪 Sign Out, which the shared topbar already provides on every app-shell page — removed the footer copies (footer is now copyright-only)
- The standalone
ModulePickerScreen.tsx keeps its footer controls because that screen has no topbar; the mockup wraps it in the app shell, so they were duplicates here
- Completes the earlier sidebar-footer de-duplication (v122-era) — no app-shell page now shows Profile/Sign Out twice
v160 — Done
Accessibility: programmatic names on all form fields (WCAG 1.3.1 / 4.1.2)
14 Jun 2026
fix
a11y
- Added
aria-label to the remaining 69 form controls that had a visible label but no programmatic association (screen readers previously announced only the field type)
- 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
- Re-scan confirms every
<input>/<select>/<textarea> now has a programmatic name — closes the a11y form-labelling work started in v158
v159 — Done
Accessibility: muted-text colour contrast → WCAG AA
14 Jun 2026
fix
a11y
- Measured muted-text contrast:
#94a3b8 on white = 2.56:1 and #9ca3af = 2.54:1 — both fail WCAG AA (needs 4.5:1)
- Darkened to the next same-hue shade that passes:
#94a3b8→#64748b (4.76:1) and #9ca3af→#6b7280 (4.83:1) — 215 instances across 15 light-theme pages (workflow, priorities, admin, reports, cycle-detail/history, profile)
- Deliberately excluded the dark-theme pages (dashboard, projects, login) where
#94a3b8 sits on dark backgrounds and already passes — darkening there would reduce contrast
v158 — Done
Accessibility: aria-labels on search & filter controls
14 Jun 2026
fix
a11y
- Labelled the placeholder-only / unlabelled search & filter 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)
- e.g.
proj-search→"Search projects", hist-status→"Filter cycles by status", member-search→"Search team members", admin user/template/MCP-log filters
- Remaining (lower severity — visible
<label> present, only the programmatic for= link missing): modal form fields, scheduler settings toggles, comment textareas, date-range inputs
v157 — Done
Accessibility: aria-labels on icon-only buttons (Close / Remove / Copy)
14 Jun 2026
fix
a11y
- Accessibility sweep: all pages have
<html lang>, <title>, and no unlabelled <img>. The one real gap was icon-only buttons with no accessible name
- Added
aria-label to ~40 icon buttons across 17 pages: modal ✕ closes → "Close", list-item ✕ removes → "Remove", MCP code-block 📋 → "Copy"
- Screen readers now announce a meaningful name for every icon-only control; zero unlabelled icon buttons remain
v156 — Done
Dead-link sweep: restore version.js placeholder + fix My Profile link
14 Jun 2026
fix
link hygiene
- Swept every page for broken internal
href/src. Two real issues found (rest were JS-concat / <code>-text false positives)
- Restored
mockup/version.js — the CI version-badge placeholder (shows vlocal locally, CI overwrites). It was deleted in the inline-refactor but index.html, history.html & admin/index.html still <script src> it, so it 404'd on every load outside CI
index.html: "My Profile" card pointed at a hardcoded file:///C:/…/login.html#profile absolute path; repointed to the real, portable profile.html
v155 — Done
New pages: Auth Verify & Auth Activate landing states
14 Jun 2026
feat
mockup parity
auth-verify.html mirrors AuthVerifyScreen.tsx (/auth/verify) — 🔐 verifying spinner, ✅ success redirect, ⚠️ expired/used error with "request a new magic link"; demo buttons toggle the three states
auth-activate.html mirrors AuthActivateScreen.tsx (/auth/activate) — display-name form, 🎉 success, ⚠️ activation error, 🚫 missing/invalid token; demo buttons toggle states
- 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
login.html?view= deep-links
v154 — Done
Notification bell in the shared topbar (impl parity)
14 Jun 2026
feat
mockup parity
- New shared
assets/js/notif-bell.js mirroring NotificationBell.tsx — 🔔 button + unread badge in the topbar, dropdown panel with recent items, per-item mark-read, "Mark all read", outside-click/Escape close
- Self-injecting into
.topbar-right; included on all 17 app-shell pages (root, priorities/, workflow/, admin) — the design-history & index catalog pages keep their own chrome
- Demo notifications cover the impl notification types (returns, approvals, reminders, cycle/Priorities & Achievements windows)
v153 — Done
New page: MCP Setup Guide (mirrors shipped public/mcp-guide.html)
14 Jun 2026
feat
mockup parity
- Added
mockup/mcp-guide.html mirroring the shipped src/web/public/mcp-guide.html — the standalone MCP integration guide the impl NavBar links ("📖 MCP Guide") for all users; the mockup previously had no equivalent page
- Self-contained static page (inline styles, no external deps); linked from
index.html Reports & Account section (Integration card)
v152 — Done
Cluster Head Priorities & Achievements Digest — History link points to Priorities & Achievements History (impl parity)
14 Jun 2026
fix
mockup parity
priorities/cluster-head.html: digest-header "📅 History" link pointed to ../cycle-history.html; repointed to history.html (Priorities & Achievements History) and relabeled "📅 Priorities & Achievements History" — matches ClusterHeadPAScreen.tsx header /pa/history link
- Same mislink class as the v145 quick-link fixes
v151 — Done
Priorities & Achievements Review — awaiting-previous-level notice (sequential chain)
14 Jun 2026
feat
mockup parity
priorities/review.html: added awaiting-notice (blue ⏳ "An earlier level in the review chain has not approved yet") — matches PMPAReviewScreen.tsx awaiting-notice for the sequential-chain "in chain" bilateral state (GAP-5 #799)
- Completes the bilateral status set in the mockup: returned / approved / awaiting
v150 — Done
Priorities & Achievements submission — return + submit-success banners (impl parity)
14 Jun 2026
feat
mockup parity
priorities/pl.html: added pa-return-banner (amber "Returned by your Project Manager" + reason) and pa-submit-success (green "Submitted successfully!") — matches PAScreen.tsx returnNote / successMsg alerts
- This is the Priorities & Achievements submission page (PAScreen), distinct from
workflow/pl.html (Ups & Downs) which got its banners in v141
v149 — Done
Admin Projects / PODs / Users — info banners (impl parity)
14 Jun 2026
feat
admin parity
- Added the amber 💡 info banner to
admin/index.html sections projects, pods, and users — matches the notes in AdminProjects/Pods/Users screens
- 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
- All admin sections with an impl info note now have a matching mockup banner
v148 — Done
Admin Reports & Exports — snapshot/scheduled info banner (impl parity)
14 Jun 2026
feat
admin parity
- Added the amber 💡 info banner to
admin/index.html section-reports — matches the snapshot/scheduled-recipients note in AdminReportsScreen.tsx
- Reused the
.admin-alert.warning variant added in v147
- Summary stats, on-demand export rows (6), date range, and the scheduled-reports table (incl. paused row) were already aligned
v147 — Done
Admin Audit Log — immutability info banner (impl parity)
14 Jun 2026
feat
admin parity
- Added the amber 💡 info banner to
admin/index.html section-audit-log — matches the immutability/compliance note in AdminAuditLogScreen.tsx
- Added a reusable
.admin-alert.warning variant to admin.css (amber), complementing the existing .info
- Audit-log filters, table, and pagination were already aligned
v146 — Done
Admin Reporting Relationships — KPI strip (Total / Active / Inactive / Role Pair Types)
14 Jun 2026
feat
admin parity
- Added a 4-card KPI strip to
admin/index.html section-reporting — matches AdminReportingRelationshipsScreen.tsx rel-kpi-strip (Total Pairs / Active / Inactive / Role Pair Types)
- Every other admin section already had a stat strip; reporting was the only one without
- Wired live counts in
admin.js renderReportingRelationships() — recomputes on add/edit/toggle/delete
v145 — Done
Wire Priorities & Achievements History quick links to the new history page (impl parity)
14 Jun 2026
fix
mockup parity
- Fixed "📅 Priorities & Achievements History →" Quick Links in
workflow/pmo.html and workflow/spoc.html — were pointing at priorities/review.html, now correctly target the new priorities/history.html
- Added missing "📅 Priorities & Achievements History →" Quick Link to
workflow/pl.html, pm.html, pod.html, cluster-head.html — matches the /pa/history link present in PL/PM/PODOwner/ClusterHead screens
- All role workflow sidebars now reach the read-only Priorities & Achievements archive, consistent with the implementation
v144 — Done
New page: Priorities & Achievements History (read-only archive)
14 Jun 2026
feat
mockup parity
- New
priorities/history.html mirrors HistoricalPAScreen.tsx (route /pa/history) — previously had no mockup at all
- Week selector dropdown, 3-stat summary bar (Total / Submitted / Pending), submission-rate progress bar
- Per-member collapsible cards with status badge (Approved / Submitted / Returned / Pending), 🎯/🏆 count pills, priorities & achievements with AiDE badges, and reviewer "Review Submission →" action
- Member search + status filter + clear, "Read-only Archive" badge, Export PDF + Dashboard links
- Linked from
index.html Priorities & Achievements section (Archive card)
v143 — Done
Profile MCP tokens — three-way status (active / expired / revoked)
14 Jun 2026
fix
mcp sync
profile.html: renderMyTokens() upgraded from binary active/revoked to three-way status pill — adds grey Expired state, matches ProfileScreen.tsx:367-371
- Revoke button + row dimming now keyed on
status !== 'active' (not just revoked) so expired tokens read as inactive
- Added an expired demo token (
MT-003 VS Code extension) to profileState.myTokens so the state is visible
v142 — Done
Workflow forward/return success banners — PM, Delivery SPOC, POD Owner
14 Jun 2026
feat
workflow sync
pm.html: added pm-forward-success (green), pm-return-success (warning), pm-spoc-return-banner — matches PMScreen.tsx:617/627/637
spoc.html: added spoc-forward-success ("Forwarded to Sales SPOC!") and spoc-return-success ("Returned to PM") — matches DeliverySpocScreen.tsx:486/496
pod.html: added pod-forward-success ("Forwarded to Cluster Head!") and pod-return-success ("Returned to Sales SPOC") — matches PODOwnerScreen.tsx:485/495
v141 — Done
PLScreen submit banners + Scheduler cycle Archive button
14 Jun 2026
feat
workflow sync
- Added
pl-submit-success banner to mockup/workflow/pl.html — matches impl submit-success-alert in PLScreen.tsx:579 ("Submitted successfully!")
- Added
pl-all-submitted notice with "📅 View Cycle History →" CTA — matches impl all-submitted-notice in PLScreen.tsx:631 ("All Project Leads have submitted.")
- Added Archive button (🗄) per cycle row in admin scheduler
renderScheduler() — matches impl archive-btn-{id} in AdminSchedulerScreen.tsx:763
- Added
archiveCycle(id) stub in admin.js — soft-sets status to archived and re-renders
v140 — Done
Admin Reports — Scheduled Reports Actions column (Edit / Pause / Delete)
14 Jun 2026
feat
admin sync
- Added 6th Actions column to Scheduled Reports table — matches impl
edit-schedule-{i}, pause-schedule-{i}, delete-schedule-{i} buttons in AdminReportsScreen.tsx:371-373
- Paused row (Return Rate Alert) now shows Resume instead of Pause, and is dimmed at 60% opacity — matches impl
sr.paused ? opacity 0.6
- Added report-type sub-label under schedule name (e.g. "Priorities & Achievements Weekly") — matches impl's
REPORT_TYPE_LABEL[sr.reportType] sub-line
- Added JS stubs:
editScheduledReport(), toggleScheduledReport(), deleteScheduledReport()
v139 — Done
Admin MCP Tokens — Expired status pill + inactive row dimming
14 Jun 2026
fix
admin sync
- Token status pill: added
● Expired state (grey pill) between Active and Revoked — matches impl AdminMcpTokensScreen.tsx:283-288 three-way status
- Row dimming + Revoke action: was keyed on
revoked boolean; now keyed on inactive (covers both revoked and expired) — revoked/expired rows show "—" instead of Revoke button
v138 — Done
Admin Users — Invited filter option + Revoke button + pending-invites stat
14 Jun 2026
fix
admin sync
- Status filter: added "Invited" option between Active and Inactive — matches impl
status-filter in AdminUsersScreen.tsx:566-569
- Actions column: invited users now show 🔄 Resend + ✕ Revoke buttons — matches impl
resend-btn-{id} + revoke-btn-{id} in AdminUsersScreen.tsx:643-654
- Added
revokeInvitation(id) JS stub that sets status→inactive and re-renders the table
- Stats bar:
user-stat-pending now updated live from invited-user count — was always static 2
v137 — Done
Reports — Ups & Downs Trend project filter dropdown
14 Jun 2026
feat
reports sync
- Added project filter
<select> (id=trend-project-filter) to Ups & Downs Trend card header, between the table/chart toggle and the Export button
- Matches impl:
data-testid="trend-project-filter" in ReportsScreen.tsx:648 — filters trend rows by project name
- Added
filterTrendProject(val) JS mock stub that shows a toast simulating the filter action
v136 — Done
Cycle History — PDF export button + View button for all cycles
14 Jun 2026
fix
cycle sync
- Actions column: replaced plain "View →" / "Open →" links with styled View button for all cycles + 📄 PDF button for approved cycles
- Matches impl:
data-testid="btn-view-{id}" (all cycles) + data-testid="btn-pdf-{id}" (only when status === 'cluster_head_approved') in CycleHistoryScreen.tsx:436-452
- Added
exportCyclePdf() JS mock stub to simulate PDF download flow
v135 — Done
Workflow — Attachments card added to pod.html, pm.html, cluster-head.html
14 Jun 2026
fix
workflow sync
- Added 📎 Attachments card (before Comment/Action bar) in
pod.html, pm.html, cluster-head.html
- Matches
data-testid="attachments-card" + FileUploadWidget in PODOwnerScreen.tsx:605, PMScreen.tsx:780, ClusterHeadScreen.tsx:463
workflow/pl.html and workflow/spoc.html (v134) already had the card — completing the full workflow chain
v134 — Done
SPOC workflow — Attachments card added between Downs and Comment
14 Jun 2026
fix
workflow sync
- Added 📎 Attachments card between Downs card and Comment card in
mockup/workflow/spoc.html
- Matches
data-testid="attachments-card" + FileUploadWidget present in both DeliverySpocScreen.tsx:606 and SalesSpocScreen.tsx:605
- CSS for
.file-upload-zone already existed in spoc.html — only HTML card was missing
v133 — Done
Admin Email Templates — Other tab, Active/Draft/Archived filter, templateCode badge
14 Jun 2026
fix
admin sync
- Added "📧 Other" category tab (matches impl's 5th
CATEGORY_TABS entry in AdminEmailTemplatesScreen.tsx)
- Status filter dropdown: Enabled/Disabled → Active/Draft/Archived (matches impl's
data-testid="filter-status" options)
- Preview panel header: added
templateCode badge (id="preview-code") alongside template name — matches impl's data-testid="preview-template-code"
- admin.js: added "other" group to renderTemplates groups array; updated status filter logic to match
t.status; previewTemplate() now populates preview-code element
v132 — Done
Dashboard — stats row + footer + table headers parity with ModulePickerScreen
14 Jun 2026
fix
dashboard sync
- Stats row: replaced Ups/Downs/Priorities/Approved Cycles YTD with Total Cycles / Approved YTD / Active Cycles / Priorities & Achievements Completion % (matches
data-testid="dashboard-stats" in ModulePickerScreen.tsx)
- Footer added: copyright text + 🔑 Profile & API Tokens button + 🚪 Sign Out button (matches
module-picker-footer, btn-module-profile, btn-module-signout)
- Recent Activity table headers: Event→Status, When→Date (matches impl column labels)
v131 — Done
Admin Scheduler — trim settings to match implementation (impl parity)
14 Jun 2026
fix
admin sync
- Removed "Default Submission Deadline" field — not in
SchedulerSettings interface or API
- Removed "Send digest summary to Cluster Head" toggle — not implemented
- Removed "Reset to Defaults" button — not in
AdminSchedulerScreen.tsx
- Renamed "Save Settings" → "💾 Save Changes" to match implementation label
- Updated timezone options to match impl
TIMEZONES array (Asia/Kolkata, UTC, America/New_York, America/Los_Angeles, Europe/London)
- Updated hint text to match implementation wording throughout
💾 fix(mockup): trim scheduler settings to match implementation (v131)
v130 — Done
PL Priorities & Achievements screen — attachments card (impl parity)
14 Jun 2026
feat
priorities sync
- Added Attachments card (📎) between Achievements and Note to Manager in
priorities/pl.html
- Uses existing
.file-upload-zone CSS; drag-drop + click-to-upload zone with file list area
- Matches
data-testid="attachments-card" / FileUploadWidget in PAScreen.tsx line 767
💾 feat(mockup): pl pa attachments card (v130)
v129 — Done
Review screen — approved alert, full category set, attachments card (impl parity)
14 Jun 2026
feat
priorities sync
- Added Approved alert (✅ Bilateral Commitment Approved) — matches
data-testid="approved-alert" in PMPAReviewScreen.tsx
- Expanded add-priority category select from 4 → 8 options (added hiring, client, skills, process) — matches
VALID_CATEGORIES and data-testid="add-priority-category"
- Added Attachments card in right sidebar (read-only) — matches
data-testid="attachments-card" with FileUploadWidget readOnly
💾 feat(mockup): review screen approved alert category set attachments (v129)
v128 — Done
Admin MCP Log — filter parity + info banner (impl parity)
14 Jun 2026
feat
admin sync
- Replaced "Search" text input with "Identity" dropdown — matches
data-testid="filter-identity" in AdminMcpLogScreen.tsx
- Updated "Outcome" → "Status" with options 2xx/4xx/5xx matching implementation values
- Added "Clear" button alongside Apply — matches
data-testid="filter-clear"
- Added info banner below page header (🤖 MCP audit explanation) — matches impl alert block
💾 feat(mockup): mcp log filter parity and info banner (v128)
v127 — Done
Admin Audit Log — To Date filter + Clear button (impl parity)
14 Jun 2026
feat
admin sync
- Added "To Date" date input to Audit Log filter card — matches
data-testid="to-filter" in AdminAuditLogScreen.tsx
- Added "Clear" button alongside Apply — matches
data-testid="clear-filters"
- Filter grid expanded from 5 to 6 columns: search · role · event type · from date · to date · apply+clear
💾 feat(mockup): audit log to-date filter and clear button (v127)
v126 — Done
Admin Projects — Status filter in toolbar (impl parity)
14 Jun 2026
feat
admin sync
- Added "All Status" filter select to Projects toolbar in
admin/index.html
- Matches
data-testid="filter-status" in AdminProjectsScreen.tsx
- Options: All Status / Active / Inactive; id
proj-status-filter wired to renderProjects()
- Toolbar now has 4 controls: search · POD · Cycle · Status
💾 feat(mockup): admin projects status filter (v126)
v125 — Done
Admin Users — Pending Invites KPI card (impl parity)
14 Jun 2026
feat
admin sync
- Added "Pending Invites" stat card to Users KPI strip in
admin/index.html
- Matches
data-testid="kpi-pending-invites" in AdminUsersScreen.tsx
- Placed between Active and Distinct Roles; amber colour (
#d97706); id user-stat-pending
- KPI strip now 4 cards: Total Users · Active · Pending Invites · Distinct Roles
💾 feat(mockup): admin users pending invites KPI card (v125)
v124 — Done
SPOC workflow — Quick Links sidebar card (impl parity)
14 Jun 2026
feat
spoc sync
- Added "🔗 Quick Links" card to right sidebar in
workflow/spoc.html (after Summary)
- Matches
data-testid="link-pa-review", data-testid="link-pa-history", data-testid="link-cycle-history" in SalesSpocScreen.tsx
- Links: 🎯 Review Priorities & Achievements Submissions, 📅 Priorities & Achievements History, 🗂️ Cycle History
💾 feat(mockup): spoc workflow quick links sidebar card (v124)
v123 — Done
Reports — Return Rate by Stage card with table/chart toggle (impl parity)
13 Jun 2026
feat
reports sync
- Added "↩️ Return Rate by Stage" card to left column in
reports.html
- Matches
data-testid="return-rate-table" / data-testid="return-hbar-chart" in ReportsScreen.tsx
- Table shows Stage / Returns Issued / % of Cycles / Most Common Reason; chart is SVG horizontal bar
- Table/Chart toggle uses existing
toggleReportView('return','table'|'chart')
- Placed between Ups & Downs Trend and SLA Metrics cards (matches impl column order)
💾 feat(mockup): reports return rate by stage card (v123)
v122 — Done
PMO Observer — Priorities & Achievements History quick link in sidebar (impl parity)
13 Jun 2026
feat
pmo sync
- Added "📅 Priorities & Achievements History →" link to Quick Links sidebar in
workflow/pmo.html
- Matches
data-testid="link-pa-history" in PMOScreen.tsx
- Links to
../priorities/review.html; placed between Reports and Cycle History
💾 feat(mockup): PMO observer Priorities & Achievements History quick link (v122)
v121 — Done
Cycle Detail — Export PDF button in approved banner (impl parity)
13 Jun 2026
feat
detail sync
- Added "📄 Export PDF" button to the approved banner in
cycle-detail.html
- Matches
data-testid="btn-export-pdf" in CycleDetailScreen.tsx
- Calls
exportReport('pdf') stub (toast notification); grouped with "← Back to History" in a flex row
💾 feat(mockup): cycle detail export PDF button (v121)
v120 — Done
Cycle History — Sort toggle button + toggleSort() (impl parity)
13 Jun 2026
feat
history sync
- Added sort toggle button to filter bar in
cycle-history.html: "↓ Newest" / "↑ Oldest"
- Matches
data-testid="btn-sort" in CycleHistoryScreen.tsx
- Added
toggleSort() JS + sortDesc state; filterCycles() now respects sort order (defaults newest-first)
💾 feat(mockup): cycle history sort toggle button (v120)
v119 — Done
Cluster Head Priorities & Achievements — Clear Filters button + clearMemberFilters() (impl parity)
13 Jun 2026
feat
priorities sync
- Added ✕ Clear button to filter bar in
priorities/cluster-head.html
- Matches
data-testid="btn-clear-filters" in ClusterHeadPAScreen.tsx (resets search + status to defaults)
- Added
clearMemberFilters() JS function: resets #member-search + #status-filter and calls filterMembers()
💾 feat(mockup): cluster-head PA clear filters button (v119)
v118 — Done
Dashboard — role switcher for multi-role users (impl parity)
13 Jun 2026
feat
dashboard sync
- Added role switcher bar between header and module cards in
dashboard.html module picker section
- Matches
data-testid="role-switcher" + role-chip-{role} in ModulePickerScreen.tsx
- Active role chip highlighted blue; inactive chips are muted — matches
module-role-chip-active CSS in implementation
- JS populates chips from
user.roles[] in sessionStorage; demo falls back to PM + Delivery SPOC dual-role view for PM users
- Switcher hidden (
display:none) for single-role users — only shown when 2+ roles detected
💾 feat(mockup): dashboard role switcher for multi-role users (v118)
v117 — Done
Admin Scheduler — reminders table Code + Actions columns (impl parity)
13 Jun 2026
feat
admin sync
- Added "Code" column (reminder ID badge) as first column in reminders table — matches
data-testid="reminder-row-{code}" code cell in AdminSchedulerScreen.tsx
- Renamed "Reminder" column header → "Name" to match separate Code + Name split in implementation
- Added "Actions" column with ✏️ Edit button per row — matches
data-testid="btn-edit-rem-{code}" in AdminSchedulerScreen.tsx
- Updated group separator
colspan from 7 → 9 in admin.js renderScheduler
- Added
editReminder(id) stub function in admin.js
- "No Template" warning cell for reminders with no linked email template
💾 feat(mockup): admin scheduler reminders — Code + Actions columns (v117)
v116 — Done
PL workflow — return banner + RTE add rows + attachments card (impl parity)
13 Jun 2026
feat
workflow sync
- Added "Returned by Project Manager" amber banner to
workflow/pl.html matching data-testid="return-reason-alert" in PLScreen.tsx
- Replaced
<input type="text"> in add-Up row with .wysiwyg-wrapper matching AddItemRow RichTextEditor (data-testid="add-up-row")
- Replaced
<input type="text"> in add-Down row with .wysiwyg-wrapper (data-testid="add-down-row")
- Added Attachments card with
.file-upload-zone and demo file entry matching FileUploadWidget (data-testid="attachments-card")
💾 feat(mockup): pl workflow — return banner + RTE add rows + attachments card (v116)
v115 — Done
POD Owner workflow — return banner, editable items (not read-only), RTE add rows, legend fix (impl parity)
13 Jun 2026
feat
workflow sync
- Added "Returned for revision" amber banner to
workflow/pod.html matching data-testid="pod-return-reason-alert" in PODOwnerScreen.tsx
- Removed incorrect "Read-only at this level" labels — POD Owner CAN edit+add items (matches
PODOwnerItemCard + PODOwnerAddItemRow)
- Added
.wysiwyg-wrapper add-Up and add-Down rows matching PODOwnerAddItemRow RichTextEditor
- Updated context alert text: "You may add new items, modify existing ones…" (matches
data-testid="pod-info-alert")
- Fixed color legend: "Modified at prior levels" → "Modified"; "Added at prior levels" → "Added here"
💾 feat(mockup): pod workflow — return banner + editable items + RTE add rows (v115)
v114 — Done
SPOC workflow — return reason banner + RichTextEditor add-item rows (impl parity)
13 Jun 2026
feat
workflow sync
- Added "Returned for revision" amber banner to
workflow/spoc.html matching data-testid="delivery-spoc-return-reason-alert" in DeliverySpocScreen.tsx
- Replaced
<input type="text"> in add-Up row with .wysiwyg-wrapper matching PgMAddItemRow (data-testid="delivery-spoc-add-up-input")
- Replaced
<input type="text"> in add-Down row with .wysiwyg-wrapper matching PgMAddItemRow (data-testid="delivery-spoc-add-down-input")
💾 feat(mockup): spoc workflow — return reason banner + RTE add-item rows (v114)
v113 — Done
Priorities & Achievements Review mockup — returned alert, RichTextEditor add-forms, correct action labels, summary chain-status (impl parity)
13 Jun 2026
feat
priorities sync
- Added "Returned for Revision" amber alert with reviewer comment to
priorities/review.html (matches ReturnedAlert component, data-testid="returned-alert")
- Replaced plain
<input> in add-priority/add-achievement rows with .wysiwyg-wrapper matching RichTextEditor component
- Category
<select> added to add-priority row (matches implementation's category dropdown)
- Action buttons corrected: "↩ Return for Revision" and "✅ Approve — Bilateral Commitment" (matching
data-testid="return-btn" and data-testid="approve-btn")
- Summary sidebar now shows chain-status text "⏳ Awaiting review" (matches
data-testid="pri-review-chain-status")
💾 feat(mockup): pa review — returned alert + RTE forms + correct action labels (v113)
v112 — Done
PM workflow — PM Member Tab Bar + PL submissions "all submitted" alert (impl parity)
13 Jun 2026
feat
workflow sync
- Added PM Member Tab Bar card to
workflow/pm.html matching PMScreen.tsx PMemberTabBar component (pm-member-tabs)
- Multi-PM support: active tab (Vishnu K R Goluguri) shown as
btn-primary, inactive (Priya Sinha) as btn-outline
- Updated PL Submissions panel header to "2 of 2 submitted" and added
alert-success "All N PLs have submitted" banner
- Matches implementation's
data-testid="all-pls-submitted-alert" and data-testid="pls-pending-alert" states
💾 feat(mockup): pm workflow — PM member tab bar + PL submitted alert (v112)
v111 — Done
Cluster Head chain table — badge-draft level badges + Changes Made column (impl parity)
13 Jun 2026
feat
workflow sync
- Updated
workflow/cluster-head.html Review Chain Summary table to match ClusterHeadScreen.tsx ReviewChainTable component
- Level badges:
role-badge rb-* → badge badge-draft (matches implementation)
- Column "Changes" → "Changes Made"; action badges use
#d1fae5/#065f46 green for Approved
- Changes Made column: count-based ("2 changes", "1 change", "—") with quoted reviewer comment inline
- Timestamps formatted as "DD Mon YYYY, HH:MM" matching
fmtDatetime() output
- Pending row: "● Pending" dot prefix; Submitted row: "● Submitted"
💾 feat(mockup): cluster-head chain table — badge-draft levels + Changes Made column (v111)
v110 — Done
PMO chain table — Action/Notes columns + timestamps + change counts (impl parity)
13 Jun 2026
feat
workflow sync
- Updated
workflow/pmo.html Full Approval Chain Status table to match PMOScreen.tsx FullChainTable component
- Column "Status" → "Action"; column "Notes" → "Notes / Changes"
- Card header subtitle updated to "Live view — updates as approvals progress"
- Level badges changed from role-badge style to
badge-draft (matches implementation)
- Approved rows use green badge (
#d1fae5 / #065f46); Submitted uses badge-final
- Notes/Changes column now shows: change count, quoted reviewer comment, formatted action timestamp
💾 feat(mockup): pmo chain table — Action/Notes columns + timestamps + change counts (v110)
v109 — Done
PL Priorities & Achievements screen — category filter bar + team submission status sidebar (impl parity)
13 Jun 2026
feat
Priorities & Achievements sync
- Added category filter bar above the priorities list in
priorities/pl.html — matches the select-priority-filter dropdown in PAScreen.tsx (GAP-6 AzDO #810)
- Categories: All / 🤖 AiDE / 🚀 Delivery / 📈 Growth / 👥 Hiring / 🤝 Client / 📚 Skills / ⚙️ Process / 📌 Other
- Added Team Submission Status sidebar card matching
PAScreen.tsx GAP-S12-02 — shows each PL's submission status with icon (✅ approved / ⏳ pending / ↩ returned / ⬜ not submitted)
- Demo data: Swati Nandha (⏳ current user), Dinesh Kumar Purohit (⬜ not submitted), Priya Sinha (✅ approved)
💾 feat(mockup): pl Priorities & Achievements — add category filter bar + team submission status sidebar (v109)
v108 — Done
Cluster Head Priorities & Achievements — per-member digest view with search, filter, and individual acknowledge
13 Jun 2026
feat
Priorities & Achievements sync
- Replaced consolidated bilateral-chain table + flat priorities/achievements lists with per-member digest card view matching
ClusterHeadPAScreen.tsx
- Page header: dark gradient (navy→purple), week label, Team Members / Submitted / Pending stat counters, Change Project + History links
- Filter bar: name search input + status dropdown (All / Pending / Approved / Returned) + live member count
- Color legend strip (Original / Modified / Added by reviewer / AiDE)
- 3 demo member cards: Swati Nandha (acknowledged ✅), Dinesh Kumar Purohit (pending, with acknowledge button), Priya Sinha (not submitted, collapsed)
- Each card: avatar initials, name, submitted time, priorities count, achievements count, status badge, collapsible body, per-member "✅ Acknowledge & Close Week" button
- Demo
toggleCard(), filterMembers(), acknowledgeDemo() scripts replace old consolidated-view acknowledgeWeek()
💾 feat(mockup): cluster-head Priorities & Achievements digest redesign — per-member cards with search/filter/acknowledge (v108)
v107 — Done
Dashboard module picker — dark glass-morphism redesign with role-aware buttons
13 Jun 2026
- 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)
- 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)
- Role-aware routing: Ups & Downs button goes to
projects.html for PL/ESO/Rec SPOC, or directly to role workflow page for PM, Delivery SPOC, Sales SPOC, POD Owner, Cluster Head, PMO Associate
- Priorities & Achievements button routes to
priorities/pl.html, priorities/cluster-head.html, or priorities/review.html based on role
- Admin Portal card is dimmed + disabled (pointer-events: none) for roles without admin access
- Welcome heading personalised with first name from sessionStorage
💾 feat(mockup): dark glass-morphism dashboard module picker with role-aware CTA buttons (v107)
v106
Full-width layout audit — remove .page-layout max-width cap across all pages
13 Jun 2026
- Cross-page consistency audit: all 17 pages pass nav-placeholder, role labels, sidebar footer, font links, admin nav checks
- Removed
max-width:1200px; margin:0 auto from .page-layout CSS in 15 files — two-column content+audit-sidebar grid now fills the full available width on all screen sizes
- Affected: workflow/pl, pm, pmo, pod, spoc, cluster-head; priorities/pl, review, cluster-head; dashboard, projects, reports, profile, cycle-detail, cycle-history
💾 fix(mockup): remove .page-layout max-width cap across 15 pages — full-width audit pass (v106)
v105
Reports page auto-scales to full screen width
13 Jun 2026
- Removed
max-width:1200px;margin:0 auto wrapper from reports.html — content now fills the full available viewport width
💾 fix(mockup): remove max-width cap from reports page so it scales to screen width (v105)
v104
Expand "Del. SPOC" abbreviation to "Delivery SPOC" across all live pages
13 Jun 2026
- Replaced all
Del. SPOC abbreviations with Delivery SPOC 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
- History changelog entries left unchanged (they describe past version state)
💾 chore(mockup): expand Del. SPOC → Delivery SPOC across all live pages (v104)
v103
Remove redundant "← Dashboard" back-link from priorities and profile pages
13 Jun 2026
cleanup
- Removed
← Dashboard back-link from priorities/pl.html, priorities/review.html, priorities/cluster-head.html, and profile.html — redundant now that Dashboard is always reachable via the sidebar
💾 chore(mockup): remove redundant Dashboard back-link from priorities + profile pages (v103)
v102 — Done
Unified nav: admin portal now uses shared sidebar + topbar; role-controlled links across all screens
13 Jun 2026
featnavadmin
- admin/index.html restructured — custom
.admin-topnav, .admin-shell, and .admin-sidebar replaced by shared #nav-placeholder + #topbar-placeholder + .main-content; the shared nav IIFE (same as all 15 workflow/priority pages) now runs on the admin page
- Role-controlled links — sidebar sections (Workflow, Management, Automation, Settings, AI Integration, Reporting, Account) shown or hidden by
roleKey; admin-specific sections only appear for admin role
- Consistent visual identity — same dark sidebar, same dark topbar, same logo/user info/Profile/Sign Out layout as every other page; no more separate admin chrome
- admin.css cleaned up — 200 lines of now-obsolete layout CSS removed (
.admin-topnav, .admin-shell, .admin-sidebar, .nav-item, .admin-main); content styles untouched
- admin/index.html head — inline
<style> block adds the dark-topbar override + .topbar-* component classes + mobile-sidebar rules that assets/css/style.css does not include
💾 feat(mockup): unify admin portal nav with shared sidebar/topbar; role-controlled links (v102)
v101 — Done
Rename "Priorities & Achievements" — replace all Priorities & Achievements abbreviations with the full label across all 18 pages
13 Jun 2026
renamenav
- Sidebar nav label — "Priorities & Achievements" replaces "Priorities & Achievements" (short form) across all 15 workflow/priority/dash/cycle pages
- Page titles —
<title> tags updated for all three priorities pages
- Page headings —
<h2> headings in priorities pages updated
- Quick-links, card titles, reports labels — all HTML-context occurrences of
Priorities & Achievements updated; JS string toast messages and CSS/JS comments (which used the raw short form) left unchanged
💾 feat(mockup): rename Priorities & Achievements — replace all abbreviations with full label (v101)
v100 — Done
Move full admin menu into main sidebar (admin role only); remove sidebar footer identity card
13 Jun 2026
featnav
- Admin menu in main sidebar — for
roleKey === 'admin' 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. admin/index.html#users)
- "Admin Portal" single link removed from the ACCOUNT section — replaced by the full inline menu above
- Sidebar footer identity card removed across all 15 pages — user info is already visible in the topbar; dead CSS (
.sidebar-footer, .sidebar-user, .sidebar-user-chevron + orphaned properties block) cleaned up
💾 feat(mockup): move admin menu into main sidebar for admin role; remove sidebar footer (v100)
v99 — Done
Remove redundant inner padding wrapper — content now fills full available width
13 Jun 2026
fixlayout
- Double-padding removed across all 15 pages — each had a
<div style="padding:20px"> wrapper inside .main-content which already has padding: 28px; removing the inner wrapper gives 40px more usable width per page
- reports.html / profile.html — kept
max-width constraint and auto-centering but removed the extra 20px inner padding
- projects.html — added
padding:0 to .main-content so the full-bleed dark project picker background reaches edge-to-edge
💾 fix(mockup): remove redundant inner padding — content fills full width (v99)
v98 — Done
Remove duplicate Profile / Sign Out buttons from sidebar footer across all pages
13 Jun 2026
fixcss
- Sidebar footer actions removed —
.sidebar-footer-actions div (🔑 Profile + 🚪 Sign Out buttons) deleted from all 15 pages; these already appear in the topbar
- Sidebar footer simplified — now only contains the identity card (
.sidebar-user); style="display:flex" and flex-direction:column removed since only one child remains
- Dead CSS comment updated —
.sidebar-footer comment no longer references Profile/Sign Out
💾 fix(mockup): remove duplicate sidebar footer Profile/SignOut buttons (v98)
v97 — Done
Topbar layout fixes + admin portal dynamic user + hamburger mobile-only
13 Jun 2026
fixcssjs
- .topbar-left / .topbar-right CSS added to all 15 pages —
display:flex; flex: 1 on left, flex-shrink:0 on right so title fills the gap and user area stays pinned right
- Hamburger button moved from inline styles to
.topbar-hamburger class — hidden on desktop (≥901px), visible on mobile (≤900px) via media query
- Admin portal topnav — user avatar, name, and role badge now loaded dynamically from
sessionStorage.pg_demo_user on page load
- Admin profile link fixed from hardcoded
file:///… absolute path → ../profile.html
- Admin back link changed from "← Back to Workflow" → "← Dashboard" pointing to
../dashboard.html
- adminSignOut() now clears
sessionStorage.pg_demo_user before redirecting
💾 fix(mockup): topbar left/right layout, mobile hamburger, admin dynamic user (v97)
v96 — Done
Topbar redesign: consistent dark nav with avatar, role badge, and action buttons across all pages
13 Jun 2026
navcssjs
- Topbar background changed to dark (
var(--bg-sidebar, #1a1a2e)) on all 16 pages — matches admin portal nav style
- User avatar circle with initials replaces plain name link; sized 30×30px with brand-primary background
- Role badge 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
#e8a020)
- Action buttons (
.topbar-action-btn): 🔑 Profile + 🚪 Sign Out, styled with ghost border to match admin topnav
- New CSS classes:
.topbar-user, .topbar-avatar, .topbar-role-badge, .topbar-action-btn, .topbar-action-btn:hover
💾 style(mockup): consistent dark topbar with avatar + role badge + action buttons (v96)
v95 — Done
CSS sync: align inline styles with implementation design system (custom.css)
13 Jun 2026
synccss
- Variable aliases: added
--primary, --primary-dark, --primary-light, --bg, --surface, --text, --success, --danger, --warning, --info, --radius, --shadow to the :root block — both --brand-primary and --primary naming schemes now work
- Badge colours fixed to match
custom.css: .badge-pending blue (#dbeafe/#1e40af), .badge-final/.badge-approved green (#dcfce7/#15803d); added .badge-submitted
- Stepper aliases: added
.podgov-stepper-bar, .podgov-stepper-inner, .podgov-step, .podgov-step-circle, .podgov-step-connector, .podgov-step-label (implementation naming alongside existing .workflow-stepper/.step classes)
- Layout: added
max-width:1200px; margin:0 auto to .page-layout; added .page-screen shell class
- New utilities:
.summary-stat/value/label, .stat-card.ups/downs, .add-item-row.aide-add, .history-stats-bar, .pl-member-tabs/tab
- Fixed: notification unread highlight changed from stale AiDE purple (
rgba(108,99,255)) to POD blue (rgba(37,99,168))
💾 style(mockup): sync inline CSS with custom.css — variable aliases, badge colours, stepper classes
v94
Refactor: inline all CSS + JS into each HTML page; remove 23 redundant SPA files
13 Jun 2026
refactorclean-up
- CSS inlined in all 16 MPA pages: Inter @font-face (paths adjusted for root vs subdir) +
style.css + styles.css as a single <style> block per page
- JS inlined in all 16 MPA pages:
nav.js + pg-app.js as inline <script> blocks — each page is now fully self-contained
- Deleted:
app.js, version.js, cycles.js, priorities.js, screens/ (13 SPA screen files), assets/js/nav.js, assets/js/pg-app.js, styles.css
- Kept:
assets/css/style.css + assets/fonts/inter.css (still used by admin portal)
💾 refactor(mockup): inline CSS+JS into all 16 HTML pages; delete 23 redundant SPA files
v93
SPA → MPA conversion: 16 standalone HTML pages replace the 2212-line SPA engine
13 Jun 2026
featnavrefactor
- assets/js/nav.js: Shared sidebar + topbar injection; role-based links;
window.PG_ROOT prefix support
- assets/js/pg-app.js: Shared demo data (
window.PG_DEMO), render helpers, workflow & Priorities & Achievements action functions, MCP token & notif prefs management
- login.html: 18-tile demo login; saves
pg_demo_user to sessionStorage → navigates to dashboard
- dashboard.html, projects.html, profile.html, reports.html, cycle-history.html, cycle-detail.html: Root-level pages
- workflow/pl.html, workflow/pm.html, workflow/spoc.html (Del.SPOC + Sales SPOC), workflow/pod.html, workflow/cluster-head.html, workflow/pmo.html: 6-stage U&D approval chain
- priorities/pl.html, priorities/review.html (PM/Del.SPOC/Sales SPOC/POD Owner), priorities/cluster-head.html: Priorities & Achievements bilateral agreement chain
💾 feat(mockup): SPA→MPA conversion — 16 standalone HTML pages + shared nav/app JS
v92
Fix: All Profile links use absolute file:/// URL for local mockup browsing
13 Jun 2026
fixnav
- admin/index.html: Profile topnav link updated to
file:///C:/Projects/ValueLabs/PODGovernance/mockup/login.html#profile
- index.html: My Profile card link updated from
login.html?view=profile to same absolute file:/// URL
💾 fix(mockup): use absolute file:/// URL for all Profile links
v91
Revert: Admin Profile uses single /profile route (not admin-specific) — mockup + impl aligned
13 Jun 2026
fixnavsync
- admin/index.html: Profile topnav link restored to
href="../login.html#profile" — opens shared Profile screen in workflow SPA
- admin/index.html: Removed inline
section-profile div (no separate admin profile section)
- admin/admin.js: Removed
case 'profile' from navigateTo()
- AdminTopNav.tsx: Profile links reverted to
/profile; App.tsx: /admin/profile route removed — single /profile route serves all roles
💾 fix(admin+mockup): unify Profile on /profile for all roles
v90
Fix: Admin Portal Profile button now navigates within the portal (not back to workflow)
13 Jun 2026
fixnavsync
- admin/index.html: Profile topnav link changed from
href="../login.html#profile" to onclick="navigateTo('profile')"
- admin/index.html: Added
section-profile with account details + MCP tokens table
- admin/admin.js: Added
case 'profile' to navigateTo()
- App.tsx + AdminTopNav.tsx: Added
/admin/profile route & links (later reverted in v91)
💾 fix(admin+mockup): Profile button routes within admin portal
v89
Fix: AiDE tab panel visible on load (desktop panel was default-shown)
13 Jun 2026
fixux
- screen-profile.js:
data-panel="desktop" gets display:none; data-panel="aide" loses display:none — AiDE panel now visible on load, matching the active tab
💾 fix(mockup): show AiDE panel by default on MCP guide load
v88
AiDE MCP tab: Remote Servers UI replaces stdio steps (mockup + impl)
13 Jun 2026
syncmcpux
- screen-profile.js: AiDE (VS Code) tab — 4 stdio steps replaced with Remote Servers UI steps (open panel → fill URL → generate token → Add Server);
mcp-aide-config snippet now shows the MCP endpoint URL
- ProfileScreen.tsx:
MCP_ENDPOINT_URL derived from MCP_API_URL; aideConfig snippet updated to endpoint URL; AiDE panel rewritten with Remote Servers UI flow
- .vscode/mcp.json: switched from
type: stdio to type: http pointing at Dev MCP endpoint; comments now match #aide-remote guide steps
💾 feat(mockup): AiDE tab — Remote Servers UI replaces stdio steps
v87
Sync: Quick Links emojis across all role screens (impl → mockup)
13 Jun 2026
syncux
- screen-am, screen-ceo, screen-pl, screen-pm: 🔄 Cycle History → 🗂️ Cycle History
- screen-ceo, screen-pod: 📊 Reports → 📈 Reports & Analytics
- Completes the Quick Links emoji sync started in v86 (PMO only) — all role screens now consistent
💾 fix(mockup): sync Quick Links emojis across AM, CEO, PL, PM, POD screens
v86
Sync: PMO Quick Links labels & emojis (impl → mockup)
13 Jun 2026
syncux
- 📊 Reports → 📈 Reports & Analytics (more descriptive; matches Reports page heading)
- 🔄 Cycle History → 🗂️ Cycle History (🗂️ = file cabinet = archive; 🔄 implied refresh/recycle)
- Priorities & Achievements History label unchanged; all three now match
PMOScreen.tsx Link labels
💾 fix(mockup): sync PMO Quick Links labels and emojis to implementation
v85
Fix: login screen — remove duplicate Vishnu tile; demo grid scroll; button emoji sync
13 Jun 2026
fixsyncux
- Removed duplicate
vishnu.test "Delivery SPOC" tile — implementation uses a single tile per user; dual-role switching handled by ModulePickerScreen role switcher
- Implementation (
LoginScreen.tsx) button emoji synced: 📧 → 🔗 to match mockup — 🔗 is more semantically correct for a magic link
- Implementation (
custom.css) .demo-hint-grid gains max-height: 340px; overflow-y: auto — matches mockup inline style; 18 tiles now scroll inside the card instead of overflowing
💾 fix(web,mockup): login screen tile dedup + demo grid scroll + button emoji
v84
Sync: Priorities & Achievements PL screen sidebar — add Approval Chain card (impl → mockup)
13 Jun 2026
syncfeat
screen-priorities-pl.js right sidebar: added 🔗 Approval Chain card showing the bilateral review chain PM → Del. SPOC → AM → POD → Cluster Head
- Matches
PAChainStatus component added to PAScreen.tsx — mockup was missing this card entirely
- Each chain step rendered as a styled row matching the implementation's
pri-chain-step pattern; active step highlighted when live data loads
💾 feat(mockup): add Approval Chain sidebar card to Priorities & Achievements PL screen
v83
Sync: PMO screen summary label "Account" → "Project" (impl → mockup)
13 Jun 2026
syncfix
screen-pmo.js Final Summary card: Account: relabelled to Project: — implementation uses "Project" which is the correct entity name in POD Governance
- The platform tracks projects, not accounts; "Account" was a carry-over from an earlier design iteration
💾 fix(mockup): relabel "Account" → "Project" in PMO screen summary card
v82
Sync: PL screen action button label — "Reset View" → "Reset Comment" (impl → mockup)
13 Jun 2026
syncux
screen-pl.js action bar: Reset View relabelled to Reset Comment to match the implementation's more accurate data-testid="reset-btn" label
- Implementation clears only the comment textarea; "Reset View" implied a full screen reload which isn't implemented — mockup now reflects actual behaviour
💾 fix(mockup): relabel "Reset View" → "Reset Comment" in PL screen action bar
v81
Sync: ClusterHead review chain table — add Time column (impl → mockup)
13 Jun 2026
syncux
- Review Chain Summary table in
screen-ceo.js gains a Time column showing when each level acted
- Matches
ClusterHeadScreen.tsx which renders actionTime via formatTime() helper; mockup was missing this column
- Each row now has a
*-chain-time id; pending rows show —
💾 fix(mockup): add Time column to ClusterHead review chain table — sync impl → mockup
v80
Fix: module-picker workflow chain — update PgM/AM/CEO to Del. SPOC/Sales SPOC/Cluster Head
13 Jun 2026
fixroles
- Workflow step badges in the Ups & Downs module card updated:
PgM → Del. SPOC, AM → Sales SPOC, CEO → Cluster Head
- Matches the canonical role rename applied across the implementation (EPIC-16 role key mapping: pgm→delivery_spoc, am→sales_spoc, ceo→cluster_head)
- Implementation
ModulePickerScreen.tsx already used the new names; mockup was stale
💾 fix(mockup): update workflow chain role abbreviations to new canonical names
v79
Fix: pm1.test phantom tile replaced — login screen fully canonical
13 Jun 2026
fixseed
- The
pm1.test@valuelabs.com demo tile showed “Vishnu K R Goluguri” as a standalone PM — but pm1.test has no seed entry; Vishnu’s canonical email is vishnu.test
- Changed
onclick to simulateLogin('vishnu.test@valuelabs.com') and relabelled badge to PM + Delivery SPOC to reflect the dual role
- The duplicate
vishnu.test 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)
- All 19 login tiles now map 1-to-1 to seeded users
💾 fix(mockup): pm1.test tile → vishnu.test with PM+Delivery SPOC badge
v78
Fix: Profile button broken — sidebar-footer div missing from login.html DOM
12 Jun 2026
fixnav
- Added
<div class="sidebar-footer" id="sidebar-footer"> inside <aside> — pins Profile & Sign Out footer to sidebar bottom
💾 fix(mockup): add missing sidebar-footer — Profile button now works
v77
Gap audit: stale role labels in module-picker, priorities-pl, reports; Cluster Head row in CEO chain; currentUser in action buttons
12 Jun 2026
fixscreens
- screen-module-picker.js: "POD CEO" → "Cluster Head" (description); "Program Manager, POD CEO" → "Project Manager, Cluster Head" (Available to list)
- screen-priorities-pl.js: Priorities & Achievements chain description — "Program Manager → POD Owner → POD CEO" → "Delivery SPOC → Sales SPOC → POD Owner → Cluster Head"
- screen-reports.js: comment, return-rate table badge, SVG bar label, SVG comment, SLA footer — all "CEO" → "Cluster Head"; "POD Owner → AM" → "POD Owner → Sales SPOC"
- screen-ceo.js: added missing Cluster Head row to the 6-level chain table (was 5 rows, now complete);
returnReview() hardcoded name → currentUser ? currentUser.name : 'Vish Lakshmanan'
- screen-am.js:
returnReview/approveReview hardcoded "Sekhar Posina" → currentUser ? currentUser.name : …
- screen-pod.js:
returnReview/approveReview hardcoded "Basavaiah Potla" → currentUser ? currentUser.name : …
- screen-priorities-review.js: header comment chain "AM ↔ POD Owner ↔ CEO" → canonical labels
💾 pending commit — fix(mockup): stale role labels + CEO chain row + currentUser in action buttons
v76
Remove dead screen-program.js — no role routes to it; deliverySpoc uses screen-am by design
12 Jun 2026
chorecleanup
- Deleted
screens/screen-program.js — file was preloaded but domSlugMap routes deliverySpoc → 'am' so the screen was never rendered
- Removed
'screen-program' from the preload array in app.js
- Removed
<script src="screens/screen-program.js"> from login.html
💾 pending commit — chore(mockup): delete dead screen-program.js + remove preload references
v75
Gap audit: stale labels in cycle-detail chain, POD Owner description fix, admin role added to Role Definitions
12 Jun 2026
fixadmindata
- cycles.js: cycle-detail approval chain labels —
'AM' → 'Sales SPOC' and 'CEO' → 'Cluster Head' (stale abbreviations from pre-rename era)
- admin/index.html Role Definitions: POD Owner description changed from "POD CEO" → "POD Owner";
Administrator role row added (was the only role missing from the 10-role system)
- Dead file noted:
screen-program.js is preloaded but no role routes to it — deliverySpoc intentionally uses screen-am per domSlugMap
💾 pending commit — fix(mockup): stale chain labels + POD Owner description + admin role in definitions
v74
Gap audit: stale names & badge colors corrected across screens, PMO chain, audit log, notifications, email tokens
12 Jun 2026
fixdataadmin
- screen-pmo.js: chain table — James Okafor → Vishnu Kiran Reddy Goluguri (Del. SPOC), Vikram Singh → Basavaiah Potla (POD Owner), Elena Russo → Vish Lakshmanan (Cluster Head)
- screen-cycle-detail.js: approved banner — "Elena Russo (POD CEO)" → "Vish Lakshmanan (Cluster Head)"
- app.js: notification bell — "James Okafor returned your Priorities & Achievements submission" → "Vishnu Kiran Reddy Goluguri returned…"
- admin.js SAMPLE_TOKENS: Anoop Singh → Vish Lakshmanan (
clusterHeadName); James Okafor → Vishnu Kiran Reddy Goluguri (deliverySpocName, escalateToName)
- admin/index.html audit log: 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
role-badge rb-* classes
💾 pending commit — fix(mockup): stale names + audit log badge colors from gap audit sweep
v73
Org chart: proper CSS branch connectors, canonical rb-* colors, corrected names (Sekhar Posina, Pavani, Devi Alekya)
12 Jun 2026
UXadmin
- Replaced hand-coded
display:flex org chart with .oc-wrap / .oc-row / .oc-col / .oc-node / .oc-stem CSS class system
- Branch connectors:
.oc-col::before/::after pseudo-elements with var(--lc) color inheritance draw proper T-junction horizontal bars; :first-child::before and :last-child::after hidden to cap the ends
- Canonical colors: Cluster Head
#dc2626, POD Owner #ea580c, Delivery SPOC #0d9488, Sales SPOC #2563eb, ESO SPOC #7c3aed, Recruitment SPOC #db2777, PM #b45309, PL #15803d
- Name fixes: Sara Nair → Sekhar Posina (Sales SPOC), Priya Mehta → Pavani Prathyusha Mulpuru (ESO SPOC), Kiran Babu → Devi Alekya Abburi (Recruitment SPOC)
- Basavaiah Potla (POD Basu) and Ananth Reddy (POD Ananth) now show with correct POD Owner orange
💾 pending commit — ux(mockup): org chart CSS branch connectors + canonical colors + name corrections
v72
Color sync: rb-* classes across admin Role Definitions, org legend, audit log & Level column; login tile scroller
12 Jun 2026
UXadminscreens
- admin.js: added
labelToKey reverse map + levelBadge() helper; renderReportingRelationships() Level column now uses levelBadge(r.level) for correct per-role color badges
- Role Definitions table: all 9
<span class="role-badge"> → role-badge rb-* (projectLead, pm, deliverySpoc, salesSpoc, esoSpoc, recruitmentSpoc, podOwner, clusterHead, pmoAssociate)
- Org chart legend: replaced 8 hard-coded inline
background/color styles with role-badge rb-* classes — now tracks the canonical color palette automatically
- Audit log role badges: all inline-styled role cells (Project Lead ×4, Project Manager ×2, Delivery SPOC ×1, PMO Associate ×1) converted to
role-badge rb-* with size overrides retained
- screen-login.js: demo tile grid is now a scrollable 2×4 viewport (
max-height:340px; overflow-y:auto; scrollbar-width:thin) — shows 8 tiles at once, rest scroll into view
💾 ux(mockup): sync rb-* role colors across admin + scrollable login tile grid
v71
Cycle modal: remove All day checkbox, Recurring toggle & Until date fields
12 Jun 2026
UXadmin
- Removed All day checkbox — not applicable to deadline-only cycle scheduling
- Removed ↻ Recurring toggle button — all cycles are recurring by definition; panel is always visible
- Removed Until date picker (and clear button) from both weekly and monthly recurring rows — cycles repeat indefinitely until manually closed
💾 pending commit — ux(mockup): remove all-day, recurring toggle, until date from cycle modal
v70
Gap audit: role key sweep across all workflow screens, Priorities & Achievements module & login tiles
12 Jun 2026
fixUXscreens
- screen-am.js:
returnReview / approveReview keys 'am'→'salesSpoc', name Sara Nair→Sekhar Posina, return target 'programManager'→'deliverySpoc'
- screen-program.js: keys
'programManager'→'deliverySpoc', name James Okafor→Vishnu Kiran Reddy Goluguri, approve target 'am'→'salesSpoc'; summary chain “PL → PM” → “PL → PM → Del. SPOC”
- screen-pod.js: return target
'am'→'salesSpoc', approve target 'podCeo'→'clusterHead', name Vikram Singh→Basavaiah Potla; “CEO”→“Cluster Head” in placeholder and summary chain
- screen-ceo.js: return key
'podCeo'→'clusterHead', Elena Russo→Vish Lakshmanan; chain table badge-draft→role-badge rb-* with correct role colors; reviewer names corrected; “CEO Sign-Off Comment”→“Cluster Head Sign-Off Comment”
- app.js roles config: salesSpoc Sara Nair→Sekhar Posina; esoSpoc Priya Mehta→Pavani Prathyusha Mulpuru; recruitmentSpoc Kiran Babu→Devi Alekya Abburi
- app.js finalApprove():
state.comments.podCeo→clusterHead; hardcoded Elena Russo→currentUser.name; label 'CEO COMMENT'→'CLUSTER HEAD COMMENT'
- priorities.js:
priReviewCfg keys programManager→deliverySpoc, am→salesSpoc, podCeo→clusterHead with updated names; showPrioritiesForRole, approvePrioritiesReview statusMap/chainIdMap, nextRoleKey guard, and finalApprovePriorities all updated to match
- screen-priorities-review.js CEO section: title/badge “CEO”→“Cluster Head”; bilateral chain table extended with Sales SPOC row, names corrected; reporting chain sidebar +Sales SPOC step; return button
'podCeo','Elena Russo'→'clusterHead','Vish Lakshmanan'; “CEO Notes”→“Cluster Head Notes”
- screen-login.js: 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)
💾 pending commit — fix(mockup): gap audit — role key sweep, stale names, Priorities & Achievements module, login tiles
v69
Users: merge dual-role users into one row with role popup
12 Jun 2026
UXadmin
- Vishnu, Snehal, Ravi, Suresh each held PM + Delivery SPOC as separate user records — merged into single records with
roles: ['deliverySpoc','pm']
- Delivery SPOC is the primary role (higher in approval chain); its email becomes the canonical login email for each user
- All project
deliverySpoc references and reporting-relationship reportIds updated (u5→u3, u14→u4, u15→u25, u16→u26)
renderUsers(): primary role badge shown; additional roles revealed on hover via .user-roles-more +N chip → .user-roles-popup dropdown
- Added
.user-roles-host / .user-roles-more / .user-roles-popup CSS to admin.css
💾 pending commit — ux(mockup): merge dual-role users, show roles in hover popup
v68
Fix: New Cycle modal — broken select dropdowns
12 Jun 2026
fixadmin
- Three
${'{'}Array.from(...){'}'} JS template literals in static HTML were never evaluated — browser rendered them as literal text, breaking the modal
- Replaced with pre-written
<option> tags: 48-slot AM/PM time picker (Deadline time), 1–12 interval select (Repeat every), 1–28 day-of-month select (Monthly)
v67
Role color consistency across entire site
12 Jun 2026
UXstyles
- Added
.rb-* per-role color classes to admin.css and styles.css — one canonical color per role
- 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
admin.js: new roleBadge() helper generates .role-badge.rb-* HTML; 3 render sites (PODs, Users, Reminders tables) updated
app.js: ROLE_TAG_CLASS map wires audit-trail .role-tag chips to .rb-* classes
screen-login.js: all 7 demo-tile inline badge styles replaced with role-badge rb-* classes
screen-pmo.js: approval chain level cells updated from badge-draft to role-badge rb-*; AM→Sales SPOC, CEO→Cluster Head labels corrected
v66
Cycle scheduler: single deadline time, no duration or availability
12 Jun 2026
UXadmin
- Removed End time field — only a single Deadline time picker (AM/PM 30-min intervals)
- Removed “100% available” badge from time suggestions
- Suggestions now read Deadline: every Monday at 9:00 AM — no duration suffix
- All day checkbox now hides only the deadline time field (not an end time)
- Removed
endTime from cycle data schema and saveCycle / openCycleModal
v65
Real Sales/ESO/Recruitment SPOCs + Outlook-style cycle scheduler
12 Jun 2026
dataUXOrgadmin
- Sales SPOC: Sekhar Posina (P001–P008), Pankaj Singhal (P009–P015), Neelanjana Jaswal (P009 co-SPOC) — replaced Sara Nair / Sanjay Patel placeholders
- ESO SPOC: Pavani Prathyusha Mulpuru (POD Basu P001–P010), Shalini (POD Ananth P011–P015) — replaced Priya Mehta placeholder
- Recruitment SPOC: Devi Alekya Abburi (POD Basu P001–P010), Harjeev Kaur Arora (POD Ananth P011–P015) — replaced Kiran Babu placeholder
- admin/admin.js: 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
- app.js: userDirectory SPOC entries updated with 7 real people; old Sara/Priya/Kiran entries replaced
- cycles.js, screen-pmo.js: Sara Nair → Sekhar Posina in all demo audit entries
- PM before PL: Delivery Roles column now shows PM row above PL row (admin/admin.js renderProjects)
- Outlook-style Cycle Scheduler: 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:
onCycleRecurringToggle, toggleCycleDow, onCycleAllDayChange, onCycleTimeChange, updateCycleSuggestions; openCycleModal + saveCycle updated for new schema
💾 pending commit — feat(mockup): real SPOC names + Outlook-style cycle scheduler
v64
PM before PL in Delivery Roles; Outlook-style time picker
12 Jun 2026
UXadmin
- PM now listed before PL in the admin Projects table (admin/admin.js renderProjects)
- “Time (24h)” inputs replaced with 30-min interval AM/PM select dropdowns (admin/index.html)
💾 committed — ux(mockup): PM-first in delivery roles; Outlook-style time selector
v63
Delivery SPOCs mapped as Project Managers for all 15 projects
12 Jun 2026
dataOrgPM
- Each project’s PM is now the same person as its Delivery SPOC — Vishnu (P001–P008), Snehal (P009–P010), Ravi (P011), Suresh (P012–P015)
- app.js: pm1→Vishnu, pm2→Snehal; pm3/pm4 added for Ravi/Suresh; all projectManagers arrays filled
- admin/admin.js: u3→Vishnu-PM, u4→Snehal-PM, u25/u26 added; all projectManagers updated; RR-003/004 removed
- cycles.js, priorities.js, screens: all PM display names updated
- admin/index.html: org chart PM boxes updated (Daniel→Vishnu, Reema→Snehal)
💾 committed — chore(mockup): map Delivery SPOCs as Project Managers for all projects
v62
Project Leads mapped to all 10 POD Basu projects
12 Jun 2026
dataOrgProject Leads
- 9 real Project Leads mapped across 10 POD Basu projects (previously all demo placeholder names)
- PL assignments: 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)
- app.js: projectDirectory projectLeads arrays updated (P001–P010); userDirectory pl1→Swati, pl2→Dinesh, pl3–pl9 new; teamMembers, items, notifications updated
- admin/admin.js: u1/u2 renamed, u17–u23 added; project records updated; 9 new reportingRelationships; SAMPLE_TOKENS updated
- admin/index.html, cycles.js, priorities.js, screens: all PL display names updated
💾 committed — chore(mockup): map real Project Leads to all POD Basu projects
v61
PMO Associate renamed — Chenchireddy Gari Dilip Kumar Reddy mapped to POD Basu
12 Jun 2026
dataUsersPOD Basu
- app.js: PMO Associate renamed from “Chris Park” to Chenchireddy Gari Dilip Kumar Reddy in users login list and ROLE_META display name
- admin/admin.js: user record u9 already carried the correct name; project list scoped to POD Basu (P001–P010)
- screens/screen-login.js: quick-login button label updated
💾 committed — chore(mockup): map Dilip Kumar Reddy as PMO Associate under POD Basu
v60
Role-key rename sync — Delivery SPOC / Sales SPOC / Cluster Head
12 Jun 2026
refactorRolesParity
- Status values synced to the renamed real-app enum:
pgm_approved → delivery_spoc_approved, am_approved → sales_spoc_approved, ceo_approved → cluster_head_approved (app.js CYCLE_STATUS_CONFIG, approveReview map, finalApprove)
- Stepper completed-counts remapped:
delivery_spoc_approved now completes the Del. SPOC step (3 done); sales_spoc_approved has no dedicated step in the 5-step mockup stepper (3 done)
- Display labels: “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)
- Internal camelCase wiring keys (
deliverySpoc / salesSpoc / clusterHead, legacy programManager, DOM slugs) unchanged — already aligned or wiring-only
💾 committed — refactor(roles): rename pgm/am/ceo to delivery_spoc/sales_spoc/cluster_head
v59
Priorities & Achievements 8-category alignment (GAP-6 / AzDO #810)
12 Jun 2026
featPriorities & AchievementsParity
- priorities.js PRI_CATEGORIES: 8-category metadata matching the real-app
PriorityCategory enum — ai, delivery, growth, other, hiring, client, skills, process; new priCategoryBadge() renders a coloured category badge on every priority item (PL, review and Cluster Head digest screens)
- Category key rename: mockup
aide → canonical ai across data, checks, add flow and checklist
- screen-priorities-pl.js: added missing
growth 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)
💾 pending commit — feat(pa): 8-category alignment — badges, filter bar, ai key (AzDO #810)
v58
Full 8-value cycle status enum (GAP-36 / AzDO #801)
12 Jun 2026
featWorkflowParity
- app.js CYCLE_STATUS_CONFIG: canonical 8-value status enum matching the real-app
CycleStatus — draft, pl_submitted, pm_submitted, pgm_approved, am_approved, pod_approved, ceo_approved, returned (replaces ad-hoc draft / pl-submitted / program-review / approved)
- Transitions:
submitPL() → pl_submitted; submitPM() → pm_submitted; approveReview() sets am_approved / pod_approved per level; finalApprove() → ceo_approved; all returns → returned (re-entry at the returning level)
- Status pills: shared
cycleStatusBadge() helper renders label + colour per status; PMO workflow pill now covers all 8 states; new .badge-returned amber style in styles.css
- Stepper:
updateStepper() completed checkmarks now driven by cycle status (statusCompletedSteps()) — active highlight still follows the viewing role
- submitPM(): fixed stale
setRole('programManager') (role removed in v56) → forwards to deliverySpoc; toast + audit text updated
💾 pending commit — feat(mockup): full 8-value cycle status enum — pills, stepper, returned banner (AzDO #801)
v57
Sync real-app features into admin mockup
12 Jun 2026
featAdminSync
- Reporting hierarchy: 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
- Scheduler KPI strip: added 4-card stat row (Active Cycles, Archived Cycles, Active Reminders, Disabled Reminders) above the cycles/reminders grid;
renderScheduler() populates from live adminState
- Scheduler Global Settings: 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
- MCP Log stats: expanded 4-card row to 5 cards — Total Calls, Success (2xx/3xx), Client Errors (4xx), Server Errors (5xx), Avg Duration (ms) — matching
AdminMcpLogScreen.tsx
- Token modal — service account tab: added two-tab UI “Existing user” / “New service account”; new tab has Name, Description, Scope, Expiry fields with a warning note;
switchTokenTab() wired to toggle panels
💾 pending commit — feat(mockup): sync real-app features — scheduler KPIs, MCP log stats, token service account tab
v56
Full navigation audit & fix — all 12 broken paths resolved
12 Jun 2026
fixMockupAdmin
- app.js roles[]: pointed
deliverySpoc / salesSpoc / esoSpoc / recruitmentSpoc to screen-am (reuse existing review DOM); pointed clusterHead to screen-ceo — eliminates 5 missing-screen crashes
- app.js domSlugMap: all SPOC roles map to slug
am; clusterHead maps to slug ceo — makes renderReviewScreen() find the right DOM elements
- app.js renderScreen(): added cases for
deliverySpoc, salesSpoc, esoSpoc, recruitmentSpoc, clusterHead; removed dead podCeo and programManager cases
- app.js renderAllScreens(): replaced stale
programManager / am render calls with deliverySpoc
- app.js cfgMap: replaced old
programManager / am entries with deliverySpoc / salesSpoc / esoSpoc / recruitmentSpoc
- app.js project card: renamed “Account Mgr” column + field reference
p.am → p.deliverySpoc “Delivery SPOC”
- app.js selectProject(): fixed
state.account.am = project.am → state.account.deliverySpoc = project.deliverySpoc
- app.js deep-link roleEmail map: replaced 4 non-existent emails (
pgm / am / podowner / ceo) with real org emails; fixed ACC-001 → P001 throughout
- screens/screen-projects.js: fixed POD filter options from “POD Alpha / POD Beta” → “POD Basu / POD Ananth”
- admin/admin.js navigateTo(): added
case 'reports' and case 'audit-log' so those nav items activate their sections instead of being no-ops
💾 pending commit — fix(mockup): full navigation audit — 12 broken paths resolved
v55
Fix: “Open Project” crash — null sidebar identity elements
12 Jun 2026
fixMockup
- app.js
setRole(): added null guards on sidebar-user-name, sidebar-user-role, sidebar-avatar — these elements were removed in v53 (sidebar footer removal) but the code still called .textContent on them unconditionally, throwing a TypeError that prevented switchScreen() from ever running, leaving the project selector frozen on screen after “Open Project” was clicked
💾 pending commit — fix(app): null-guard sidebar identity elements in setRole()
v54
Collapsible org hierarchy tree in admin portal
12 Jun 2026
featuxAdmin
- admin/index.html: added “🌳 Org Hierarchy” nav item and full section with search box, Expand All / Collapse All controls, and role-colour legend
- admin/admin.js: added
renderOrgTree(), toggleOrgNode(), expandAllOrgNodes(), collapseAllOrgNodes(), filterOrgTree() — builds tree from adminState.reportingRelationships; cluster head is root, click ▶/▼ to expand/collapse branches; search highlights matches and auto-expands tree
💾 pending commit — feat(admin): collapsible org hierarchy tree with search and role badges
v53
Remove sidebar footer identity card + Profile/Sign Out buttons from login.html
12 Jun 2026
fixuxMockup
- login.html: removed
.sidebar-footer 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
💾 pending commit — fix(mockup): remove sidebar footer identity card from login.html
v52
PODs renamed to POD Basu and POD Ananth
12 Jun 2026
dataMockup
- admin/admin.js + app.js: "POD Alpha" renamed to POD Basu (Basavaiah Potla's POD); "POD Beta" renamed to POD Ananth (Ananth Reddy's POD) — all project records, pod records, and state references updated
💾 pending commit — chore(mockup): rename PODs to POD Basu and POD Ananth
v51
Real org data — 15 live projects, 4 Delivery SPOCs, 2 POD Owners, Cluster Head (Vish Lakshmanan's cluster)
12 Jun 2026
datafeatMockup
- Org data sourced from ValueLabs Re-Org document — Vish Lakshmanan cluster; POD Alpha: Basavaiah Potla (POD Owner); POD Beta: Ananth Reddy (POD Owner); Cluster Head: Vish Lakshmanan
- 15 real projects 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)
- admin/admin.js: users array fully replaced with real names +
.test@valuelabs.com 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
- app.js:
projectDirectory replaced with 15 real projects; userDirectory updated with real Delivery SPOC and POD Owner entries; state.account set to APS Bank / Basavaiah Potla / Vish Lakshmanan
- screen-login.js: 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")
- cycles.js: audit trail names updated — Vishnu Kiran Reddy Goluguri (Delivery SPOC), Basavaiah Potla (POD Owner), Vish Lakshmanan (Cluster Head / approver)
💾 pending commit — feat(mockup): real org data — 15 projects, Vish Lakshmanan cluster
v50
Login page visual redesign — matches live app style (dark navy, white card, name + role pill tiles)
12 Jun 2026
featuxMockup
- screen-login.js: complete visual rewrite based on live app at
/PODGovernance_Dev/login — dark navy background (#1a1f3a), 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
- 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
- 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
- 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
💾 pending commit — feat(mockup): login page visual redesign matching live app style
v49
Org hierarchy redesign — Delivery/Sales/ESO/Recruitment SPOCs + Cluster Head replace old PgM / AM / POD CEO chain
12 Jun 2026
featdataAdmin
- New reporting chain: Cluster Head → POD Owner → Delivery SPOC / Sales SPOC / ESO SPOC / Recruitment SPOC → Project Manager → Project Lead; Sales, ESO and Recruitment SPOCs have no downward delivery reportees; POD Owner and Cluster Head auto-inherit all projects in their POD / cluster
- admin/admin.js: replaced
podCeo / programManager / am role keys throughout — new roles array (9 roles), updated adminState.users (Anoop Singh/Cluster Head, James Okafor/Delivery SPOC, Sara Nair/Sales SPOC, Priya Mehta/ESO SPOC, Kiran Babu/Recruitment SPOC), adminState.pods gains clusterHead field, adminState.reportingRelationships rebuilt with 9 entries, email templates updated with new tokens
- admin/index.html: org hierarchy visualisation, role filter dropdowns, POD table (6 cols with Cluster Head), audit log entries, invite modal roles — all updated to new hierarchy
- app.js:
userDirectory — replaced pgm/am/ceo entries with 4 new SPOC emails + clusterhead.test@valuelabs.com; roles array rebuilt (deliverySpoc step 2, podOwner step 3, clusterHead step 4, SPOC variants step null); getUserProjects() updated; domSlugMap and state.comments updated
- login.html: 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)
- cycles.js: 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
💾 pending commit — feat(mockup): org hierarchy redesign — SPOC roles + Cluster Head
v48
Build version number displayed on all pages (YYYY.MM.DD.xxxx)
11 Jun 2026
featuxCI/CD
- azure-pipelines.yml: added
BUILD_SEQ pipeline variable using $[counter('pod-governance-build', 1)] — ever-increasing sequence that never resets regardless of date; setver step in DetectChanges computes YYYY.MM.DD.xxxx, updates the AzDO build number, and exports APP_VERSION; VITE_APP_VERSION passed to all three Vite builds (UAT / Dev / QA); PackageMockupSeq generates version.js in the mockup artifact
- NavBar.tsx + AdminTopNav.tsx: tiny monospace version label (
9px, rgba(255,255,255,.38)) appended to brand text — visible on every authenticated page
- mockup/version.js: new file — placeholder shows
vlocal when served outside CI; CI overwrites it with the real YYYY.MM.DD.xxxx string that injects a fixed-position bottom-right badge on every mockup page
- login.html, index.html, history.html, admin/index.html: each loads
version.js (or ../version.js for admin) before </body>
💾 pending commit — feat(ci): build version YYYY.MM.DD.xxxx displayed on all pages
v47
Remove duplicated sidebar footer identity card
11 Jun 2026
fixuxAdmin
- admin/index.html: removed
.sidebar-footer block (identity card + Profile / Sign Out action row) from the sidebar — duplicated info already present in the top nav bar
- admin/admin.css: removed
.sidebar-footer, .sidebar-user, .sidebar-user-*, .sidebar-footer-actions, .sidebar-footer-btn rule-sets
- AdminLayout.tsx: removed sidebar-footer JSX block; dropped unused
useNavigate, Link, useAuth, getInitials, initials, roleLabel, handleSignOut
- custom.css: removed matching sidebar-footer CSS rule-sets
- AdminLayout.test.tsx: removed 6 sidebar-footer tests that tested now-deleted UI
💾 feat(ci): build version YYYY.MM.DD.xxxx displayed on all pages
v46
Export CSV for Projects and PODs screens
10 Jun 2026
featuxExport
- screen-projects.js: added “⬇ Export CSV” button to the search/filter toolbar; exports the currently-filtered project list (Project Name, POD, Cycle Type, Status) as
pod-governance-projects.csv
- app.js: added
exportProjectsCsv() — respects active search + POD filter, client-side Blob CSV, shows toast on completion
- admin/index.html: added “⬇ Export CSV” button alongside “+ Add POD” in the PODs card header
- admin/admin.js: added
exportPodsCsv() — respects active search + status filter, exports POD Name, POD Owner, Projects, Status as pod-governance-pods.csv
- React:
ProjectsScreen.tsx + AdminPodsScreen.tsx updated with matching client-side CSV export logic + disabled state when no rows
💾 pending commit — feat(ux): CSV export for Projects and PODs screens
v45
Admin sidebar footer: identity card + Profile / Sign Out buttons
10 Jun 2026
featuxAdmin
- admin/index.html: replaced bare “POD Governance v1.0” text in sidebar footer with identity card (
.sidebar-user) + Profile / Sign Out action row (.sidebar-footer-actions) — mirrors the workflow mockup sidebar footer and the updated React AdminLayout
- admin/admin.css: added
.sidebar-user, .sidebar-user-avatar/info/name/role/chevron, .sidebar-footer-actions, .sidebar-footer-btn.is-profile, .sidebar-footer-btn.is-signout — exact same tokens as workflow styles.css (profile: #dbeafe text; signout: #fca5a5 text, red border)
- Also bumped
.sidebar-footer from plain text style to flex-column container matching custom.css
💾 pending commit — feat(ux): admin sidebar footer identity card + Profile/Sign Out buttons
v44
Color contrast fixes: admin badge, avatar, nav pills — WCAG AA sync
10 Jun 2026
fixuxAdmin
- Admin role badge: changed
.navbar-role-badge--admin from rgba(232,160,32,0.55) semi-transparent amber + var(--primary) navy text (contrast ~1.2–1.7:1 ❌) to solid #e8a020 amber + #1a3c5e dark-navy text (4.74:1 ✓) in both custom.css and admin.css
- NavBar avatar: changed initials text from
var(--primary) (#2563a8, 2.6:1 ❌) to var(--primary-dark) (#1a3c5e, 4.74:1 ✓) on amber background
- Sign Out pill (workflow NavBar): replaced frosted-light background (
rgba(255,255,255,0.10), ~3.9:1 ❌) with dark overlay (rgba(0,0,0,0.12)) and full white text (7.5:1 ✓); border strengthened to 0.30 opacity
- Profile label: raised opacity from 0.85 → 0.95 for stronger white on blue
- Admin topnav Profile/Sign Out buttons: raised text opacity from 0.6 → 0.85 and border from 0.15 → 0.25 in both
custom.css and admin.css
- Mockup admin topnav parity: added
.topnav-role-badge--admin pill to admin/index.html topnav; added .topnav-role-badge / .topnav-role-badge--admin styles to admin.css matching the React implementation
💾 pending commit — fix(ux): WCAG AA color contrast for navbar badges, avatar, and action buttons
v43
Env overlay on all SPA screen logos (login, auth, module-picker, projects)
10 Jun 2026
featux
- Added
class="pg-env-icon" to the PG logo div in screen-login.js, screen-auth.js (both verify & activate), screen-module-picker.js, and screen-projects.js
- New
_makeEnvOverlay() helper + stampEnvIcons() in app.js — called after loadScreens() so all screen HTML is in the DOM before stamping
style.css: .pg-env-icon { position:relative; overflow:visible } anchors the overlay without touching inline styles
- All 8 PG logo instances across the mockup now show DEV / QA / UAT / LOCAL at the bottom of the hex
💾 pending commit
v42
Env overlay on all pages — history.html gets inline badge script
10 Jun 2026
featux
- Added env-detection inline script to
history.html targeting .hist-logo — same URL param + file:// detection, same bottom-centre pill overlay as index.html and login.html
- All four mockup pages now show the DEV / QA / UAT / LOCAL overlay on the PG hex logo
💾 committed
v41
Remove orange dot from PG logo in all three pages
10 Jun 2026
choreux
- Removed the hardcoded
<circle fill="#e8a020"/> from the PG hexagon SVG in login.html, index.html, and history.html — env overlay badge makes it redundant
💾 committed
v40
Env overlay on index.html landing-page logo
10 Jun 2026
fixux
index.html inline env script now supports ?env=dev|qa|uat|local URL param and treats empty hostname (file://) as LOCAL — same detection logic as app.js
- Env tag pill overlaid directly on the
.index-logo hex (bottom-centre, bright colour, dark text) in addition to the existing .index-meta-row badge
💾 committed
v39
Env badge: URL param override + file:// hostname support
10 Jun 2026
fixux
ENV_CONFIG now accepts a ?env=dev|qa|uat|local URL parameter — overrides hostname detection, so the overlay is visible when opening index.html directly as a file:// URL
- Empty hostname (
file:// protocol) is now treated as LOCAL, so the badge also shows without any param when running locally
- Lookup order: URL param → hostname → null (production)
💾 committed
v38
Env overlay badge on logo icon (sidebar hex + admin topnav)
10 Jun 2026
featux
- DEV / QA / UAT / LOCAL tag now renders as a small pill overlaid on the logo hex icon itself — bottom-centre, bright background with dark text, no extra sidebar space consumed
- Main app (
app.js): applyEnvBadge() injects .env-logo-overlay span inside .sidebar-logo .logo-icon using absolute positioning
- Admin portal (
admin.js): new ADMIN_ENV_CONFIG + applyAdminEnvBadge() applies the same overlay to .topnav-logo
style.css: .sidebar-logo .logo-icon gains position:relative; overflow:visible to anchor the overlay without clipping
💾 committed
v37
Environment name label on log screens (MCP Log + Audit Log)
10 Jun 2026
featux
- Added a prominent DEV / QA / UAT environment label strip at the top of the MCP Interaction Log and System Audit Log sections
- Label shows environment name in bold uppercase with a left-accent border and tinted background — visible at a glance without relying on color alone
- React:
AdminMcpLogScreen and AdminAuditLogScreen read getEnvConfig(); banner is hidden on production (no env config)
- Mockup: static DEV label added to both admin log sections in
index.html
💾 committed
v36
IST timezone annotations — admin.js scheduled-time labels
10 Jun 2026
choretimezone
- All hardcoded scheduled times in
admin.js now carry an explicit IST suffix (e.g. 'Every Monday 08:00 IST') — aligns the static mockup with the timezone-aware React app
- Reminder triggers updated: R-005 (08:00 IST), R-006 (11:00 IST), R-009 (18:00 IST), R-010 (09:00 IST)
- Email template triggers updated: ET-007, ET-008, ET-011, ET-012 — all four cron-fired Priorities & Achievements templates
- Usage-stats
lastSent labels updated: ET-007 Mon 08:00 IST, ET-008 Mon 11:00 IST, ET-011 Mon 18:00 IST
💾 committed
v35
FUTURE-05: Analytics dashboard — SVG charts + SLA Metrics
10 Jun 2026
featanalytics
- Added table ↔ chart view toggles 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
- Trend panel opens in chart view by default in the mockup; all three panels start in table view in the React implementation
- New ⏱️ Approval SLA Metrics card: avg / fastest / slowest approval time + % within 3-day SLA target, derived from existing trend data — no new API calls
- SVG charts:
UdBarChart (green/red grouped bars), PaLineChart (purple line + dots, SLA target dashed line), ReturnHBarChart (orange horizontal bars)
- 25 new tests cover toggle state, chart rendering, SLA tile values, and all colour-variant branches
v34
Hex SVG logo mark + environment badge system
10 Jun 2026
featbranding
- Replaced the plain "PG" text square with a pointy-top hexagon SVG mark (navy fill, gold accent dot) in the sidebar, index, and history header — single SVG, no image file
- Added environment badge system to
app.js: auto-detects LOCAL / DEV / UAT / QA from hostname, injects a coloured pill below the sidebar logo and prefixes the page title — production shows nothing
- Same detection script inlined in
index.html (no app.js on that page)
- Email layout: single
emailLayout() wrapper in email.ts — one logo source for all transactional emails, no per-template duplication
💾 6de0921
v33
Admin Users: Export CSV button on Users & Roles
10 Jun 2026
featAdmin / Users & Roles
- Added ⬇️ Export CSV button to the User Directory header (next to Invite User) — exports the currently-filtered users list
- CSV columns: Name, Email, Roles, Projects, Status — roles and projects rendered as display labels joined with "; "
- Respects the active search / role / status filters; shows a toast with the exported count, and warns when there are no users
- Mirrors the React
AdminUsersScreen export added in the same change (mockup/impl parity)
💾 committed
v32
Profile: AiDE (VS Code) tab first in MCP guide
09 Jun 2026
fixProfile / MCP Setup
- Reordered MCP guide client tabs so AiDE (VS Code) appears first (was third), followed by Claude Desktop then Claude Code CLI
- AiDE tab is now the active default on page load in both mockup and React implementation
💾 pending commit
v31
Admin Users: sync React implementation to mockup layout
09 Jun 2026
featAdmin / Users & Roles
- Combined Name + Email into a single User column with initials avatar (matches mockup user-avatar style)
- Removed separate Email and Joined columns — table is now User | Roles | Projects | Status | Actions (5 columns, matches mockup)
- Action buttons changed to icon-only (✏️ edit, ⏸/▶️ toggle) with
title tooltips for accessibility
- Role Definitions panel updated: Role column now shows role badge, added Permissions column, removed raw key column — matches mockup columns (Role / Description / Permissions)
am label corrected to "Sales / Account Manager" throughout (was "Account Manager") to match mockup
💾 feat(admin-users): sync React implementation to mockup layout (combined user col, icon buttons, role defs permissions)
v30
Admin Users: project badge tooltip shows only role chips, no repeated project name
09 Jun 2026
fixAdmin / Users & Roles
- 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")
- Same change applied to React
AdminUsersScreen.tsx — <strong>{pr.projectName}</strong> removed from the tooltip, roles-only display
💾 pending commit — fix(admin-users): tooltip shows roles only, remove redundant project name heading
v29
Admin Users: project badge tooltip shows project name instead of raw ID
09 Jun 2026
fixAdmin / Users & Roles
- 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
💾 pending commit — fix(admin-users): show project name in badge tooltip instead of raw ID
v28
Profile: MCP config snippets use published site URL instead of localhost
09 Jun 2026
fixProfile / MCP
- All three MCP guide snippets (Claude Desktop, Claude Code CLI, AiDE) now show the deployed API URL (
window.location.origin/PODGovernance_Staging/api/v1) instead of the hardcoded localhost:3001 placeholder
- React
ProfileScreen.tsx derives the URL dynamically via VITE_API_BASE_URL or BASE_URL+api/v1 fallback — same logic as apiClient.ts — ensuring correctness across local dev, staging, and production
💾 pending commit — fix(profile): use published site URL in MCP config snippets
v27
Admin: remove duplicate CTA buttons from all email templates
09 Jun 2026
fixAdmin
- Removed inline
👉 …: {{token}} lines from all 17 affected template bodies (ET-001 through ET-021) — these lines were being converted to <p class="email-cta"> buttons by plainToHtml()
- The
EMAIL_CTA_DEFAULTS / CTA button system already appends a branded action button below every template body — the inline lines were redundant, producing two buttons in the preview
- Templates ET-003, ET-008, ET-017, ET-018 had inline link tokens as plain text (no
👉), so were not affected
💾 cb21189 — fix(templates): remove duplicate CTA buttons from email templates
v26
Admin: fix project tooltip clipping — separate badge and tooltip into sibling elements
09 Jun 2026
fixAdmin
- Root cause:
.proj-name-badge had overflow:hidden and was also the proj-tooltip-host positioning context — absolutely-positioned .proj-tooltip children were clipped by the badge's own overflow
- Fix: restructured to
<span class="proj-tooltip-host"><span class="proj-name-badge">name</span><span class="proj-tooltip">...</span></span> — host has no overflow, badge handles truncation, tooltip is a sibling (never clipped)
- admin.css: added
display:inline-block to .proj-tooltip-host so the wrapper sizes correctly to the badge for tooltip centering
- Applies to both User Directory and Scheduler project name badges; hover now shows project code + user roles as intended
💾 fix(mockup): separate proj-tooltip-host from overflow:hidden badge to unclip hover tooltip
v25
Admin: project names replace codes in User Directory + Scheduler; tooltip dedup
09 Jun 2026
featAdmin
- User Directory — Projects column: badges now show the project name (e.g. Accenture Federal Services) instead of the code (
ACC-001); hover tooltip shows the code + user's roles on that project — no duplication
- Scheduler table — Projects column: project name chips replace code chips; tooltip shows the code on hover
- Invite & Edit User modals: project checkboxes show name as primary text with code as small muted monospace label
- admin.css: new
.proj-name-badge class (sans-serif, max-width:160px with truncation); dead tooltipText variable and redundant data-proj-* attributes removed from JS
💾 117d12e — feat(mockup): show project names instead of codes; refactor tooltip to remove name duplication
v24
RichTextEditor: width consistency + placeholder + focus ring in mockup CSS
09 Jun 2026
fix
UI
- mockup/styles.css:
.wysiwyg-wrapper and .wysiwyg-editor now have width:100%; box-sizing:border-box — consistent width in all layout contexts
.add-item-row .wysiwyg-editor min-height bumped 36px → 4.5em (matches minRows=3 in the React RichTextEditor)
- Mirrors real-app changes:
.rte-wrapper/.rte-editor width rules + focus-within blue border + italic placeholder added to custom.css
💾 78f7410 — fix(ui): enforce width:100% on RichTextEditor wrapper and editor divs
v23
EPIC-14C — MCP “Connect Your AI Assistant” guide in real ProfileScreen
08 Jun 2026
feat
EPIC-14
ProfileScreen
- MCP Integration Guide card added to real
src/web/src/screens/ProfileScreen.tsx (closes FEAT-14C #771)
- 3-tab interface: Claude Desktop · Claude Code CLI · AiDE (VS Code); tab state via React
useState
- Each tab has numbered steps with dark code blocks + one-click 📋 copy via
navigator.clipboard.writeText
- Inline troubleshooting table: 401 / read-only 403 / role-mismatch 403 scenarios
- Matches the mockup guide added in screen-profile.js v17 (mockup v23 unchanged — real impl now in parity)
💾 working copy — src/web/src/screens/ProfileScreen.tsx
v22
EPIC-13 — Reminder template coverage: ET-019/020/021 + templateCode linkage
08 Jun 2026
feat
Admin
EPIC-13
- ET-019 PL Submission Reminder — dedicated reminder-toned template for R-001 (24h before Ups & Downs deadline)
- ET-020 PM Review Reminder — dedicated template for R-002 (12h after all PLs submit)
- ET-021 Priorities & Achievements Reviewer Nudge — dedicated template for R-007 (4h after PL submits Priorities & Achievements)
- All 10 reminders gain a
templateCode field linking each trigger to its email template
- Automated Reminders admin table gains an Email Template column — clickable template badge opens the preview panel
- Category logic updated: ET-019/020 classified as workflow, ET-021 as pa (previously would have fallen in access)
💾 9b041a8 — admin/admin.js · admin/index.html
v21
EPIC-14 parity batch — Auth flows + Notification Bell in mockup
08 Jun 2026
feat
EPIC-14
- Auth Verify screen (FEAT-14B) —
login.html?view=auth-verify — mirrors real AuthVerifyScreen.tsx; three demo states: Verifying (spinner), Success, Error with back-to-login link
- Auth Activate screen (FEAT-14B) —
login.html?view=auth-activate — mirrors real AuthActivateScreen.tsx; three demo states: Activation form, Success (redirect animation), Missing-token error
- Notification Bell (FEAT-14A) — 🔔 icon in topbar with unread badge, dropdown panel, per-item + mark-all-read; mirrors real
NotificationBell.tsx; seeded with 3 mock notifications
- Bell shown on login, hidden on logout; outside-click closes panel
- CSS:
@keyframes pg-spin spinner + full .notif-* rule set synced from custom.css
💾 working copy — screens/screen-auth.js · app.js · login.html · styles.css
v20
Email Templates — configurable CTA button label + link (synced from AiDE Loop)
08 Jun 2026
feat
Admin
- Every email template now carries a CTA button — an editable label + link token — rendered as a branded action button below the body (matches AiDE Loop)
- All 18 templates seeded with sensible CTAs (e.g. Submit Ups & Downs →
{{submissionLink}}, Activate Your Account → {{activationLink}})
- Edit modal gains CTA Button Label + CTA Button Link fields; rendered Preview and the inline preview panel both show the button
- Leave the label blank for a no-button (link-only) email
💾 5f164dd — admin/admin.js · admin/index.html
v19
All-links index expanded to every page & subpage — 10 admin sections deep-linked + Cycle Detail + Design History
08 Jun 2026
feat
nav
index.html grew from 17 to 29 direct links — every page and subpage is now one click from the landing index
- Admin Portal expanded from a single link into all 10 sections (Projects, PODs, Users, Scheduler, Email Templates, Reporting Relationships, MCP Tokens, MCP Log, Reports, Audit Log), grouped Management / Automation & Settings / AI Integration & Reporting
- Added hash deep-linking to the admin app (
admin.js): admin/index.html#users opens that section directly; supports back/forward via hashchange
- New Cycle Detail workflow card (
app.js routeDeepLink case drills into the latest cycle) and a Design History reference card
💾 working copy — index.html · admin/admin.js · app.js
v18
Profile → Email Notification preferences (parity with shipped app); from the mockup/implementation gap analysis
08 Jun 2026
feat
Parity
- New Email Notifications card on the Profile screen, mirroring the shipped
NotificationPreferences component (US-12A-02, EPIC-12)
- Three per-category email toggles — Ups & Downs workflow, Priorities & Achievements, Weekly digest — each with a description and a saved toast
- Note that account & security mail (sign-in links, invitations, deactivation) always sends and is not listed
- Closes one of four gaps found by comparing the mockup against
src/web/src/api vice-versa (AzDO EPIC-12 #754)
💾 working copy — screens/screen-profile.js
v17
Profile → step-by-step MCP integration guide (Claude Desktop / Claude Code CLI / AiDE VS Code)
08 Jun 2026
feat
MCP
- New "Connect Your AI Assistant — Step by Step" card on the Profile screen, surfacing the integration walkthrough that previously lived only in
docs/claude-desktop-config.md
- Tabbed by client: Claude Desktop (config-file path +
mcpServers snippet + restart), Claude Code CLI (claude mcp add + .mcp.json), AiDE VS Code (.vscode/mcp.json + ${workspaceFolder})
- Numbered steps: build the server → generate a token → paste into config → restart/reload → verify with sample prompts; one-click copy on every code snippet
- Inline troubleshooting table (401 / read-only 403 / forbidden) + pointer to the Admin MCP Interaction Log
💾 working copy — screens/screen-profile.js
v16
Email Templates — HTML emails, rendered Preview, usage metrics, enable/disable & filters (synced from AiDE Loop)
08 Jun 2026
feat
Admin
- Admin → Email Templates brought to parity with AiDE Loop's template management + usage page
- HTML emails: bodies are HTML (auto-upgraded from plain text); edit modal is an HTML editor with the shared header/footer added automatically
- Rendered Preview button (preview panel + edit modal) opens the email in a branded POD Governance shell with
{{tokens}} filled from sample data; unknown variables shown as chips
- Usage KPI strip (Total / Enabled / Sent 24 h / Needs Review) + per-template usage (Sent 24 h & 7 d, Open Rate, Last Sent)
- Per-template enable/disable toggle (card + preview + edit modal); disabled templates never dispatch
- Category tabs (All / Ups & Downs / Priorities & Achievements / Invitations & Access) + search + status filter across all 18 templates; clickable variable palette inserts
{{tokens}} at the cursor
💾 working copy — admin/index.html · admin/admin.js · admin/admin.css
v15
All-links mockup index + Design History timeline
08 Jun 2026
feat
docs
- New
index.html — clickable index of all 17 mockup views, grouped by area (now the default landing page)
- The workflow SPA moved to
login.html; the all-links index takes over index.html
- New
history.html — this design-iteration timeline, sourced from git history
- Deep-link routing added to
app.js (routeDeepLink()) — login.html?view=<key> opens any screen pre-authenticated as the right demo role
💾 working copy — index.html · login.html · history.html · app.js
v14
Project badge tooltip shows user roles per project in User Directory
08 Jun 2026
featAdmin
- Admin User Directory project badges now reveal each user's per-project roles on hover
💾 1508846 — feat(admin): project badge tooltip shows user roles per project
v13
Wire up the Open Admin Portal button
08 Jun 2026
fix
- Module picker "Open Admin Portal" button now navigates to the standalone admin app
💾 18e2350 — fix(mockup): wire up Open Admin Portal button
v12
Manage POD screen + multi-role users + role-mapped dropdowns
07 Jun 2026
featAdmin
- New Manage POD admin screen; users can hold multiple roles; assignment dropdowns mapped per role
💾 cdb68ad — feat(admin): Manage POD screen + multi-role users + role-mapped dropdowns
v11
MCP tokens + profile self-service, nav polish
07 Jun 2026
chore
- Profile self-service with Personal Access Tokens for MCP / API; navigation polish across screens
💾 8d985bd — chore(mockup/docs/azdo): MCP tokens + profile self-service, nav polish
v10
Sprint 17 sync mockup from implementation
05 Jun 2026
docsSprint 17
- Back-links, Quick Links, all-submitted notice, PL search, cycle-id search, Priorities & Achievements header links
💾 7d8a99e — docs(mockup): S17 sync mockup from impl
v9
Dashboard = module picker + Admin Portal tile
04 Jun 2026
feat
- Post-login dashboard reworked into the module picker; Admin Portal tile + NavBar dashboard link
💾 c6923a6 — feat(web): dashboard = module picker + Admin Portal tile
v8
Reports & Analytics module added
04 Jun 2026
feat
- New
screen-reports.js; Reports card wired into the module picker
💾 b54437b — feat(mockup): add screen-reports.js + wire Reports card
v7
Login integration fixes — one-click demo login
03 Jun 2026
fix
- One-click demo login;
.test email addresses aligned across seed / e2e / mockup
💾 8f5aecc — fix(web): login integration fixes
v6
Sprint 7A gap closures
03 Jun 2026
featSprint 7A
- GAP-07/08/09/10/11/15/18 implemented with tests
💾 7a763dd — feat(gaps): Sprint 7A
v5
Fresh mockup screens
03 Jun 2026
feat
- Rebuilt mockup screens on the AiDELoop shell design system
💾 ee2cad7 — Mockup fresh screens
v4
Reporting relationships CRUD + NavBar sign-out fix
02 Jun 2026
featAdmin
- Admin reporting-relationships CRUD; NavBar sign-out SVG fix
💾 4cfd323 — feat(admin): reporting relationships CRUD
v3
Add System Admin user to all login demo panels
31 May 2026
chore
- System Admin demo user added to login panels and user lists
💾 061bb71 — chore(mockup): add System Admin user
v2
Align user names & emails with seed data
31 May 2026
chore
- All demo user names and emails updated to match backend seed data
💾 9667773 — chore(mockup): update all user names and emails
v1
Project foundation
31 May 2026
chore
- Renamed mockup folder, pipeline, env template, AzDO scripts — initial scaffold
💾 1dee7c5 — chore: project foundation