v319 — CurrentReporting-relationship Direct Report & Manager fields become type-to-filter user autocompletes4 Jul 2026
autocompleteadminreporting
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 — DoneMeeting Notes AI opened to everyone — access driven entirely by the participants list4 Jul 2026
meetingsaccesssharing
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 — DoneMeeting Notes AI moved into the Workflow sidebar group on the Admin shell4 Jul 2026
navsidebarmeetings
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 — DoneMeeting Notes AI — participants autocomplete multi-select with organiser & owner designation4 Jul 2026
meetingsautocompleteparticipantsorganiser
Participants autocomplete widget: the plain
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.
v315 — DoneMeeting Notes AI — recording & transcript become local-file uploads + dark-mode refresh3 Jul 2026
meetingsuploaddark-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.
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.
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 — DoneMeeting Notes AI — admin oversight section, menu entries, PM-and-below personal tier, Phase-2 video placeholders3 Jul 2026
adminmeetingsaccess
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 — DoneMeeting Notes AI — new AiDE-powered module (transcript → MoM, mindmap, action items)3 Jul 2026
new moduleaide
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.
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.
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.
v309 — DoneRun History — hide zero-email runs by default, job-type filter added3 Jul 2026
uxscheduler
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)
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.
v307 — DoneRoster unification — last ghost people made real or replaced, contributor reporting edges resolved3 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.
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).
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 — DoneOne 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
dataflowsrbac
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)
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).
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)
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.
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.
v299 — DoneRedundant-style removal — login.html de-duplicated against the shared design system, pixel-verified2 Jul 2026
cssde-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)
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.
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.
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.
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.
v294 — DoneAccessibility pass — WCAG 2.1 AA across all pages, audited with axe-core (light + dark)2 Jul 2026
a11ywcagaudit
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.
v293 — DoneDark mode validated headlessly across all pages — form controls, redundant inline tints & overlays now fully theme-adaptive2 Jul 2026
dark modevalidationrefactor
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 — DoneTheme system hardening — no-FOUC guard on every page, dark mode on the last 3 pages, full light/dark/system parity2 Jul 2026
dark modethemea11y
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 — DoneDark mode — item cards, priority/achievement rows & inline panels rendered bright light in dark theme2 Jul 2026
bugfixdark 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)
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)
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.
v288 — DoneApp-wide — removed the redundant topbar Help icon (parity gap, 21 pages)1 Jul 2026
mockup syncnav
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 — DoneLogin — self-service "Resend Activation Link" on the pending-activation card (parity gap)1 Jul 2026
mockup synclogin
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).
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.
💾 fix(mockup): Profile inline name editing parity (v286)
v285 — DoneBilateral Review — one level's approval accepts the P&A; higher levels are informational-only1 Jul 2026
featurepriorities
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.
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)
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 — DoneP&A Team Submission Status — labelled status pills instead of a bare icon1 Jul 2026
mockup syncpriorities
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 — DoneProject Timeline — per-event Share link + gist & the unified update-history trail1 Jul 2026
featuremockup synctimeline
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 — DoneP&A — surface the "Draft" stage in Team Submission Status + the 2-level review matrix30 Jun 2026
mockup syncpriorities
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 — DoneScheduler cycles — final data-sync sweep (monthly cycle time + Paymentsense cycle conflict)30 Jun 2026
mockup syncscheduler
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 — DoneDemo data — fix 5 member emails to match the seed + remove the retired P005 project references30 Jun 2026
mockup syncdemo 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 — DoneAdmin Scheduler settings — correct the Stale Project Nudge recipient + timeline schedule wording30 Jun 2026
mockup syncaccuracy
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 — DoneEmail Templates — add the "Project Timeline" category (tab + group + filter) to match implementation30 Jun 2026
mockup syncemail 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 — DoneAdmin Scheduler + Email Templates — sync timeline reminders & templates with implementation30 Jun 2026
mockup syncscheduleremail 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).
v274 — DoneP&A team status — reporting hierarchy everywhere + click-to-open navigator30 Jun 2026
prioritiesteam statusnavigatormockup 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 — DoneNotifications — theme-aware unread tint + HTML entity decoding in title/body30 Jun 2026
notificationsdark moderendering
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.
v272 — DoneLogin split-input, Profile timezone card, R-006 all-submitter reminders, Timeline header alignment, Admin Edit User timezone picker30 Jun 2026
loginprofilescheduleradmintimeline
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.
v271 — DoneEmail Log — redact single-use credentials (sign-in codes & invite tokens) from stored bodies30 Jun 2026
securityemail
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 — DoneAdmin portal dark mode — dark theme for the AiDELoop base + tokenised admin components30 Jun 2026
admindark-modetheme
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 — DoneDark-mode colour parity — port the web's semantic tint tokens into the design system30 Jun 2026
themedark-modetokens
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 — DoneEmail Log — Resend a failed delivery (re-dispatch the stored email)30 Jun 2026
adminemailresend
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.
v267 — DoneEmail Log per-recipient drill-down — click a recipient to see all their emails30 Jun 2026
adminemaildrill-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.
v266 — DoneEmail Log stat cards + retention setting (daily cleanup of old email records)30 Jun 2026
adminemailretention
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.
v265 — DoneAdmin Email Log — report of every email the system sent, with filters & body preview29 Jun 2026
adminemailreport
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.
v264 — DoneRole full-forms: expand abbreviated PL / PM in approval chains, status tables & charts28 Jun 2026
consistencyroles
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)
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 — DoneIndustry UX gaps X: Ctrl+Enter hints on 4 review screens, Print button on Reports28 Jun 2026
keyboardworkflowreports
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)
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 — DoneIndustry UX gaps VIII: admin automation-disabled warning banner wired to global toggle28 Jun 2026
adminsystem-statebanner
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)
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)
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)
v257Industry UX gaps V: review-comment required/optional hint on 4 workflow pages, cycle phase indicator on project cards28 Jun 2026
ux-hintphase-indicatorworkflow
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)
v256Industry 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 undo28 Jun 2026
undo-barauto-saveempty-stateno-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)
v255Industry 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 CTA28 Jun 2026
drill-downfile-uploadexpiry-bannerempty-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)
v254Industry UX gaps II: admin pagination (10/page), undo-bar for deletes, char counters on all comment fields, aria-sort on reports table headers28 Jun 2026
paginationundo-barchar-counta11y
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.
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)
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.
v252 — DoneNav/topbar parity pass: apostrophe JS fix, logo subtitle, icon labels, admin order, topbar icon buttons — all 23 pages28 Jun 2026
navtopbaradmin
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.
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.
v251Admin portal sidebar sections added to help / notifications / whats-new pages28 Jun 2026
navrbac
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)
v250Role-aware sidebar nav — fix visibility, P&A routing, Reports, admin access28 Jun 2026
uxnavrbac
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)
v249MCP tool count 33 → 34 (get_cycle_digest tool added to server)28 Jun 2026
w→mmcp
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 — CurrentNotification bell: snooze-aware — 🔕 icon + paused note when email notifications are snoozed28 Jun 2026
notificationsw→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.
v247 — CurrentUpdate Digest modal: Changes-only toggle + Copy to clipboard; Update Digest on cycle-detail page28 Jun 2026
workflowcycle-detailw→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.
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.
v245 — CurrentAdmin portal: results-count footer on Projects, PODs, Users, Reporting Relationships tables; Cluster Head: cumulative review-impact badges28 Jun 2026
adminworkfloww→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.
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().
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.
v242Fix sidebar Account section order + add Notifications and MCP Setup Guide on all 21 pages28 Jun 2026
sidebarnotificationsmcp-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 — DoneAdd What’s New + Help pages; sidebar links on all 19 pages; fix notifications.html shell.js gap28 Jun 2026
whats-newhelpsidebarnotifications
whats-new.html (new): mirrors WhatsNewScreen.tsx — 8 release-note cards newest-first, matching all entries from whatsNew.ts.
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)
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.
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.tsxpaCardTitle/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.
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).
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)
v236P&A mockup sync — approval chain status, My Contributors (all roles), review queue, changes badge, PL search28 Jun 2026
pa-chaincontributorsreview-queueworkflow
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.
v235Mockup ↔ web sync (W→M) — workflow Help/Digest buttons, dashboard banners, status docs, reports timeline, notifications page28 Jun 2026
syncnotificationsdashboardworkflowstatusreports
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.
v234Toggle button consistency — proper switch with white thumb across all pages28 Jun 2026
toggledesign-systemprofile
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)
v233Admin Scheduler: Timeline Notification Schedule + emoji fix28 Jun 2026
schedulertimelineemoji
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.
v232 — DoneOTP paste auto-submits when all 6 digits are pasted28 Jun 2026
loginotp
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 — DoneReset notification preferences to defaults27 Jun 2026
profilenotifications
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 — DonePer-project timeline email mute + mark notifications unread27 Jun 2026
timelinenotifications
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.
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.
v226 — DonePause email notifications (quiet period)27 Jun 2026
notificationsprofile
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)
v224 — DoneExport CSV on Project Accounts27 Jun 2026
adminexport
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 — DoneNotifications & accessibility polish27 Jun 2026
notificationsaccessibilityprofile
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 — DoneDaily digest runs on weekdays only27 Jun 2026
schedulerdigest
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 — DoneDaily digest job in the scheduler activity27 Jun 2026
schedulerdigest
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 — DoneDedicated Project Timeline notifications section27 Jun 2026
profilenotifications
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)
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.
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 — DoneDashboard returned-actions CTA & Job Health27 Jun 2026
dashboardschedulerdigest
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 — DoneAdmin digest run insights27 Jun 2026
schedulerinsightsadmin
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 — DoneWeekly digest preview & test-send27 Jun 2026
notificationsdigestprofile
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.
v214 — DoneWeekly pending-actions digest (ET-026)27 Jun 2026
notificationsschedulerdigest
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.
v213 — DoneDark mode in the mockup (light / dark / system)27 Jun 2026
themedark-modeux
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 search27 Jun 2026
navigationsearchprojects
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 — DoneAdmin · Bulk Invite users (CSV)27 Jun 2026
admininvitationsbulk
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 navigation27 Jun 2026
navigationkeyboardux
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 — DoneActive Sessions — per-device sign-out on the Profile screen27 Jun 2026
securitysessionsprofile
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 — DoneInactivity auto-logout with 5-minute countdown warning + login email pre-fill27 Jun 2026
securityauthsession
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.
v205 — DoneFeat: 6-digit OTP code alternative to magic link — enter code directly on check-inbox screen26 Jun 2026
authloginotp
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 — DoneFix: invitation expiry email now shows correct calendar date per timezone24 Jun 2026
emailtimezone
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 — DoneFix: logo broken on sub-path deployments (IIS virtual directory)24 Jun 2026
logodeploy
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 — DoneReplace inline "PG" hexagon with official POD Governance logo across all pages24 Jun 2026
logobranding
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.
v201 — DoneLogin: full sign-in scenario coverage (validation, account states, rate-limit)22 Jun 2026
authlogin
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.
v200 — DoneProject Timeline: stronger card borders21 Jun 2026
styletimeline
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 — DoneProject Timeline: type-colour thread polish (accent edge, dot halo, type icons)21 Jun 2026
styletimeline
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).
v198 — DoneProject Timeline: alternating two-sided (zigzag) layout around a centre spine21 Jun 2026
layouttimeline
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.
v197 — DoneProject Timeline: full-width stretch layout (matches the Ups & Downs review screens)21 Jun 2026
layouttimeline
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.
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.
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.
v194 — DoneNew Project Timeline — a shared per-project event log for every role (except Admin)21 Jun 2026
timelinecollaborationnav
New pagemockup/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.
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
v193 — DoneMockup week/cycle tabs now show full date ranges — matching the implementation21 Jun 2026
parityprioritiesworkflow
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 — DoneCycle scheduler: drop start/end dates, port advanced recurrence to the app21 Jun 2026
parityscheduleradmin
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
v191 — DoneCurrent Week / Current Cycle tabs now show their date range too20 Jun 2026
parityprioritiesworkflow
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 — DoneLogin demo tiles synced to the live app — all 27 seeded users20 Jun 2026
synclogin
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 — DoneNext-iteration pre-planning — Next Week / Next Cycle tabs + submission window19 Jun 2026
featureworkflowpriorities
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 — DoneAudit Log — unified, app-wide trail across every operation19 Jun 2026
featureadmin
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
v187Projects — Black Sun merge + standardise cadence to Monthly (Paymentsense Bi-Weekly), all projects active18 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 — DoneActivity Trail — Project Contributor entry + role full forms in sync with app18 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 — DoneEmail templates — show submission deadline in all three timezones16 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)
v183 — DoneDocs portal — document the Project Contributor role & chain16 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 — DoneProject Contributor role — P&A-only tier under the Project Lead16 Jun 2026
featapiux
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 — DoneSave as Draft for all submissions + next-week pre-planning + reviewer Save Note16 Jun 2026
featuxapi
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 — DoneShow week date ranges everywhere — pages, emails, PDF, and mockup16 Jun 2026
featuxemail
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 — Doneadmin.js — remove “notify PLs” from ET-007 job label16 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 — Doneadmin.js — remove POD Gamma placeholder16 Jun 2026
admindata
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 — Donedocs.html — replace CSS illustrations with real mockup screenshots (30 pages)16 Jun 2026
docsreference
Captured 30 screenshots from live mockup HTML pages using Playwright (1280×800 viewport, headless Chromium)
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 — Donedocs.html — expand abbreviations, full scheduler job table, lightbox click-to-expand16 Jun 2026
docsreference
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
v175 — Donedocs.html — HTML implementation reference with CSS screen illustrations16 Jun 2026
docsreference
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
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 — DoneScheduler Upcoming Runs gains ▶ Run Now button for missed P&A jobs15 Jun 2026
featurescheduler
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 — DoneScheduler gains an Activity & Run Log tab (past runs + upcoming runs)14 Jun 2026
featurescheduler
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 — DoneAll demo/sample data across the mockup replaced with real seed identities14 Jun 2026
dataparity
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 — DoneSelect-a-Project board now lists the real seed projects (P001–P015)14 Jun 2026
fixdata
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 — DoneDemo user emails synced to seed.ts — realistic firstname.lastname addresses14 Jun 2026
dataparity
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 — DoneSystem Status page is now open access (no login required)14 Jun 2026
enhancementops
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 — DoneNew System Status page — Website / API / MCP across all environments14 Jun 2026
featureops
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
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 — DoneMCP: admin CRUD tools for projects, PODs & users14 Jun 2026
featuremcpdocs
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 — DoneMCP: full CRUD on items + expanded prompt-library docs14 Jun 2026
featuremcpdocs
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 — DoneLink the AiDE panel to the full setup documentation14 Jun 2026
enhancementdocs
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 — DoneDe-duplicate the design system into one shared design-system.css14 Jun 2026
refactorcleanup
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
v161 — DoneRemove duplicate Profile / Sign Out from dashboard module-picker footer14 Jun 2026
fixcleanup
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 — DoneAccessibility: programmatic names on all form fields (WCAG 1.3.1 / 4.1.2)14 Jun 2026
fixa11y
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
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 — DoneAccessibility: aria-labels on search & filter controls14 Jun 2026
fixa11y
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 — DoneAccessibility: aria-labels on icon-only buttons (Close / Remove / Copy)14 Jun 2026
fixa11y
Accessibility sweep: all pages have <html lang>, <title>, and no unlabelled <img>. The one real gap was icon-only buttons with no accessible name
Screen readers now announce a meaningful name for every icon-only control; zero unlabelled icon buttons remain
v156 — DoneDead-link sweep: restore version.js placeholder + fix My Profile link14 Jun 2026
fixlink 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
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
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 — DoneNotification bell in the shared topbar (impl parity)14 Jun 2026
featmockup 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
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 — DoneCluster Head Priorities & Achievements Digest — History link points to Priorities & Achievements History (impl parity)14 Jun 2026
fixmockup 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
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
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 — DoneAdmin Projects / PODs / Users — info banners (impl parity)14 Jun 2026
featadmin 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 — DoneAdmin Reports & Exports — snapshot/scheduled info banner (impl parity)14 Jun 2026
featadmin 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 — DoneAdmin Audit Log — immutability info banner (impl parity)14 Jun 2026
featadmin 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 — DoneAdmin Reporting Relationships — KPI strip (Total / Active / Inactive / Role Pair Types)14 Jun 2026
featadmin parity
Added a 4-card KPI strip to admin/index.html section-reporting — matches AdminReportingRelationshipsScreen.tsxrel-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.jsrenderReportingRelationships() — recomputes on add/edit/toggle/delete
v145 — DoneWire Priorities & Achievements History quick links to the new history page (impl parity)14 Jun 2026
fixmockup 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 — DoneNew page: Priorities & Achievements History (read-only archive)14 Jun 2026
featmockup 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 — DoneProfile MCP tokens — three-way status (active / expired / revoked)14 Jun 2026
fixmcp 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 — DoneWorkflow forward/return success banners — PM, Delivery SPOC, POD Owner14 Jun 2026
v139 — DoneAdmin MCP Tokens — Expired status pill + inactive row dimming14 Jun 2026
fixadmin 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
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 — DoneCycle History — PDF export button + View button for all cycles14 Jun 2026
fixcycle 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 — DoneWorkflow — Attachments card added to pod.html, pm.html, cluster-head.html14 Jun 2026
admin.js: added "other" group to renderTemplates groups array; updated status filter logic to match t.status; previewTemplate() now populates preview-code element
v132 — DoneDashboard — stats row + footer + table headers parity with ModulePickerScreen14 Jun 2026
fixdashboard 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)
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.jsrenderScheduler
Added editReminder(id) stub function in admin.js
"No Template" warning cell for reminders with no linked email template
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 — DonePM workflow — PM Member Tab Bar + PL submissions "all submitted" alert (impl parity)13 Jun 2026
featworkflow sync
Added PM Member Tab Bar card to workflow/pm.html matching PMScreen.tsxPMemberTabBar 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 — DoneCluster Head chain table — badge-draft level badges + Changes Made column (impl parity)13 Jun 2026
featworkflow sync
Updated workflow/cluster-head.html Review Chain Summary table to match ClusterHeadScreen.tsxReviewChainTable component
v109 — DonePL Priorities & Achievements screen — category filter bar + team submission status sidebar (impl parity)13 Jun 2026
featPriorities & 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 — DoneCluster Head Priorities & Achievements — per-member digest view with search, filter, and individual acknowledge13 Jun 2026
v107 — DoneDashboard module picker — dark glass-morphism redesign with role-aware buttons13 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)
v106Full-width layout audit — remove .page-layout max-width cap across all pages13 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
💾 fix(mockup): remove .page-layout max-width cap across 15 pages — full-width audit pass (v106)
v105Reports page auto-scales to full screen width13 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)
v104Expand "Del. SPOC" abbreviation to "Delivery SPOC" across all live pages13 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)
v103Remove redundant "← Dashboard" back-link from priorities and profile pages13 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
v102 — DoneUnified nav: admin portal now uses shared sidebar + topbar; role-controlled links across all screens13 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 — DoneRename "Priorities & Achievements" — replace all Priorities & Achievements abbreviations with the full label across all 18 pages13 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 — DoneMove full admin menu into main sidebar (admin role only); remove sidebar footer identity card13 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 — DoneRemove redundant inner padding wrapper — content now fills full available width13 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
v98 — DoneRemove duplicate Profile / Sign Out buttons from sidebar footer across all pages13 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
v97 — DoneTopbar layout fixes + admin portal dynamic user + hamburger mobile-only13 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 — DoneTopbar redesign: consistent dark nav with avatar, role badge, and action buttons across all pages13 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 — DoneCSS 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
💾 fix(admin+mockup): Profile button routes within admin portal
v89Fix: 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
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
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
v81Sync: 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
v80Fix: module-picker workflow chain — update PgM/AM/CEO to Del. SPOC/Sales SPOC/Cluster Head13 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
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
v78Fix: Profile button broken — sidebar-footer div missing from login.html DOM12 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
v77Gap audit: stale role labels in module-picker, priorities-pl, reports; Cluster Head row in CEO chain; currentUser in action buttons12 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"
v75Gap audit: stale labels in cycle-detail chain, POD Owner description fix, admin role added to Role Definitions12 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
v74Gap audit: stale names & badge colors corrected across screens, PMO chain, audit log, notifications, email tokens12 Jun 2026
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
v72Color sync: rb-* classes across admin Role Definitions, org legend, audit log & Level column; login tile scroller12 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
v71Cycle modal: remove All day checkbox, Recurring toggle & Until date fields12 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
v70Gap audit: role key sweep across all workflow screens, Priorities & Achievements module & login tiles12 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 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
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
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)
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)
v58Full 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)
v57Sync real-app features into admin mockup12 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
v56Full navigation audit & fix — all 12 broken paths resolved12 Jun 2026
app.jssetRole(): 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 — CurrentCollapsible org hierarchy tree in admin portal12 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
v53Remove sidebar footer identity card + Profile/Sign Out buttons from login.html12 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
v52PODs renamed to POD Basu and POD Ananth12 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
v51Real 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")
💾 pending commit — feat(mockup): real org data — 15 projects, Vish Lakshmanan cluster
v50Login 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
v49Org hierarchy redesign — Delivery/Sales/ESO/Recruitment SPOCs + Cluster Head replace old PgM / AM / POD CEO chain12 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
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
v48Build 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
v47Remove duplicated sidebar footer identity card11 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
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
v46Export CSV for Projects and PODs screens10 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
v45Admin sidebar footer: identity card + Profile / Sign Out buttons10 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
v44 — CurrentColor contrast fixes: admin badge, avatar, nav pills — WCAG AA sync10 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
v43Env 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
v42Env overlay on all pages — history.html gets inline badge script10 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
v41Remove orange dot from PG logo in all three pages10 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
v40Env overlay on index.html landing-page logo10 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
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
v38Env 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
v37Environment 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
v36IST timezone annotations — admin.js scheduled-time labels10 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
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
v34Hex SVG logo mark + environment badge system10 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
v33Admin Users: Export CSV button on Users & Roles10 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
v32Profile: AiDE (VS Code) tab first in MCP guide09 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
v31Admin Users: sync React implementation to mockup layout09 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)
v30Admin Users: project badge tooltip shows only role chips, no repeated project name09 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
v29Admin Users: project badge tooltip shows project name instead of raw ID09 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
v28Profile: MCP config snippets use published site URL instead of localhost09 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
v27Admin: remove duplicate CTA buttons from all email templates09 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
v26Admin: fix project tooltip clipping — separate badge and tooltip into sibling elements09 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
v25Admin: project names replace codes in User Directory + Scheduler; tooltip dedup09 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
v24RichTextEditor: width consistency + placeholder + focus ring in mockup CSS09 Jun 2026
fixUI
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
v23EPIC-14C — MCP “Connect Your AI Assistant” guide in real ProfileScreen08 Jun 2026
featEPIC-14ProfileScreen
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
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
v21EPIC-14 parity batch — Auth flows + Notification Bell in mockup08 Jun 2026
featEPIC-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
v20Email Templates — configurable CTA button label + link (synced from AiDE Loop)08 Jun 2026
featAdmin
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
v19All-links index expanded to every page & subpage — 10 admin sections deep-linked + Cycle Detail + Design History08 Jun 2026
featnav
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
v18Profile → Email Notification preferences (parity with shipped app); from the mockup/implementation gap analysis08 Jun 2026
featParity
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
v17Profile → step-by-step MCP integration guide (Claude Desktop / Claude Code CLI / AiDE VS Code)08 Jun 2026
featMCP
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
v16Email Templates — HTML emails, rendered Preview, usage metrics, enable/disable & filters (synced from AiDE Loop)08 Jun 2026
featAdmin
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)