v483 — Current
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