← Back to Policy Tracker guide

Pre-Launch Fix List, Everything Outstanding

3 items on the page today, added 2026-07-13: the Top Item reset race, the navy spinner colour, and the skeleton-card loading state for Main. Everything from the previous round (the OnVisible/Owner fix, the Close-button data-loss fix, Overview sort, Consultation Only visibility, the Owner-flash fix) has been cleared off this page at your request — see the collapsed list at the bottom if you need to double check exactly what that covered.

Incident, 2026-07-13, corrected twice now — here's the actual timeline: item 1's original formula was built from old, unverified guide text and broke ViewItem.OnVisible when pasted in. The first "fix" for that was built from a local file that turned out to be a stale 2026-07-09 export — it was missing an entire block (varPlannedPublishDate, varShowThursdayPicker, the 104-week colThursdayOptions collection) that had been added since, from a Thursday-date-picker feature this file was never re-synced against. That's the "variables missing" you hit. You recovered by hand from your own posted copy in issue #27, which was the right move. The formula below is now rebuilt against that exact file — issue #27's 2-ViewItem.txt, byte-diffed line by line — with only the one intended change on top (Reset(...) block moved earlier). It also turns out the cmb_Owner1 reset and Table()-based Owner fix I dismissed as "speculative" earlier today were real and correctly applied — that was wrong of me to claim, sorry. Local files in this repo have now been re-synced to issue #27 so this doesn't happen a third time.
3
Race condition, confirmed broken
3
Visual polish
1
Performance, real trade-off
Jump to: 1. Top Item (and every other field) can lose your click — Reset was waiting on the links refresh 2. Navy blue loading spinner on Main and StartScreen 3. Skeleton-card loading state for Main, replaces the built-in spinner entirely 4. Skeleton cards don't appear on tab switch, blue spinner still flashes there 5. Skeleton cards missing a header, duplicates rendering blank 6. ViewItem: links panel still flickers and resets after ticking a box 7. Links panel goes blank and reloads every single open, even with items 1 and 6 applied 8. Diagnostic only — confirm whether OnVisible is firing twice 9. Root cause found: one card click fires two separate Navigate(ViewItem) calls 10. Real preloading: skip the reload entirely when the links were already fetched before navigating

1. Top Item (and every other field) can lose your click — Reset was waiting on the links refresh RACE CONDITION, CONFIRMED BROKEN NOW

Matches what you saw directly: open an existing item, click Top Item, it unticks itself; click again, unticks again; eventually it sticks. Close without saving and reopen the same item and it can briefly show ticked, then flip back to unticked a moment later once the links pane finishes loading.

Root cause is ordering, not the checkbox itself. ckbTopItem1.Default reads varSelectedRelease.'Top Item', which is already correct the instant the screen opens — but the block of Reset(...) calls that actually pushes that value onto the visible controls (Reset(ckbTopItem1) and 15 others) sits at the very end of OnVisible, after Refresh(PolicyLinks). That's an unscoped refresh of the entire PolicyLinks list, and Power Fx runs each ;-chained statement one at a time, waiting for the previous one to finish — so every Reset(), including Top Item's, sits blocked behind that network round trip on every single visit.

If you click Top Item while that refresh is still in flight, you see your click land, then the queued Reset(ckbTopItem1) finally fires once the refresh completes and snaps it straight back to the old SharePoint value, discarding what you just did. Same mechanism explains the delayed "flicker" on reopen and the general feeling that fields populate a little late — they're not slow themselves, they're stuck in a queue behind an unrelated large-list refresh.

The fix doesn't touch the links loading logic at all — it just moves the Reset(...) block to run immediately after varSelectedRelease is finalized, before the links refresh starts, so form fields are never gated behind link data again.

Sourcing on this version: every line below except the block-move is copied verbatim from 2-ViewItem.txt, the file you attached to issue #27 — your own recovered, working copy, byte-diffed against the version below before publishing. The one edit is exactly the fix this item describes: the 17 Reset(...) lines (including Reset(cmb_Owner1), confirmed real this time) moved from the end of the formula to right after the deep-link block, before the final Refresh(PolicyLinks) block. Nothing else in the formula was touched — the Thursday-picker block, the Table()-based Owner fix, and the varDeepLinkNotFound handling are all still exactly as they are in your real file.

ViewItem.OnVisible, full replacement:

=Set(varLoadingLinks, true);
Set(varSaving, false);
Set(varShowLinkModal, false);
Set(varSelectedLink, Blank());
Set(varErrTitle, false);
Set(varErrOwner, false);
Set(varErrDocType, false);
Set(varErrPublishDate, false);
Set(
    varOwnerDefault,
    If(
        IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.Owner.Email),
        Table({DisplayName: User().FullName, Mail: User().Email}),
        Table({DisplayName: varSelectedRelease.Owner.DisplayName, Mail: varSelectedRelease.Owner.Email})
    )
);
Set(
    varPlannedPublishDate,
    If(
        IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.'Planned Publish Date'),
        DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7), "Days"),
        varSelectedRelease.'Planned Publish Date'
    )
);
Set(varShowThursdayPicker, false);
ClearCollect(
    colThursdayOptions,
    ForAll(
        Sequence(104),
        With(
            {_thu: DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7) + (Value - 1) * 7, "Days")},
            {
                ThursdayDate: _thu,
                ItemCount: CountRows(
                    Filter(
                        'Policy Proof Tracker',
                        Year('Planned Publish Date') = Year(_thu) &&
                        Month('Planned Publish Date') = Month(_thu) &&
                        Day('Planned Publish Date') = Day(_thu)
                    )
                )
            }
        )
    )
);
If(
    !varDeepLinkHandled && !IsBlank(Param("ID")),
    Set(varDeepLinkHandled, true);
    Set(varItemID, Param("ID"));
    Set(varLoading, true);
    Refresh('Policy Proof Tracker');
    Set(varDeepLinkItem, LookUp('Policy Proof Tracker', ID = Value(varItemID)));
    If(
        !IsBlank(varDeepLinkItem),
        Set(varSelectedRelease, varDeepLinkItem);
        Set(varSelectPolicy, "Filled");
        Set(varParentSaved, true);
        Set(varSelectedItem, varDeepLinkItem);
        Set(varSourceScreen, "Main");
        Set(varSelectedPerson, varDeepLinkItem.Owner);
        Refresh(PolicyLinks);
        BuildLinksForSource(varDeepLinkItem.ID);
        Set(varOwnerDefault, Table({DisplayName: varDeepLinkItem.Owner.DisplayName, Mail: varDeepLinkItem.Owner.Email}));
        Set(varPlannedPublishDate, varDeepLinkItem.'Planned Publish Date'),
        Notify("This item could not be found. It may have been deleted or the link may be incorrect.", NotificationType.Error);
        Set(varDeepLinkNotFound, true)
    );
    Set(varLoading, false)
);
Reset(txtTitle1);
Reset(drpDocType1);
Reset(dpkPublishDate1);
Reset(ckbHighPriority1);
Reset(txtReasonHighPri1);
Reset(ckbExtConsult1);
Reset(txtExtConsultDetails1);
Reset(ckbTopItem1);
Reset(txtNewsletterTitle1);
Reset(txtAudience1);
Reset(txtSummary1);
Reset(txtRemarks1);
Reset(ckbPillarLead1);
Reset(radApproval1);
Reset(ckbPublished1);
Reset(dpkPublishedDate1);
Reset(cmb_Owner1);
If(
    !IsBlank(varSelectedRelease.ID),
    Refresh(PolicyLinks);
    BuildLinksForSource(varSelectedRelease.ID);
    Set(varLoadingLinks, false),
    Clear(colLinks);
    Set(varLoadingLinks, false)
);

Only one thing moved: the 17 Reset(...) lines now run right after the deep-link block resolves, before the Refresh(PolicyLinks) / BuildLinksForSource block instead of after it. The links pane (LinksGallery_1 / the empty-state placeholder) is unaffected — both still key off varLoadingLinks exactly as before, they just no longer hold every other field hostage while they load.

Test: open an existing item and immediately click Top Item once, before the links pane has finished appearing on the right. It should stick on the first click, no unticking. Then close without saving and reopen the same item — the checkbox should show the correct state immediately, with no flash or delayed flip. Also spot-check the Thursday date picker and Owner still work normally, since this formula carries all of that unchanged.

2. Navy blue loading spinner on Main and StartScreen VISUAL POLISH

Main.yaml and StartScreen.yaml both still have the screen's built-in LoadingSpinnerColor set to RGBA(56, 96, 178, 1), a steel/navy blue left over from before the app's green branding was settled. Every other screen (ViewItem, NewsletterPack) was already updated to the app's real accent, RGBA(11, 74, 54, 1). This is the spinner you're seeing on Main whenever a gallery's data source is loading — it's the built-in Power Apps data-refresh spinner, not a custom control, so a one-line property change on each screen fixes it everywhere it appears.

On Main, click the screen itself in Tree view (not a control inside it), find LoadingSpinnerColor in the properties list, and replace it with:

=RGBA(11, 74, 54, 1)

Repeat the same change on StartScreen (same property, same value).

Test: navigate to Main from a cold load (or force a refresh) and watch for the spinner while the gallery populates — it should now be the same dark green used everywhere else in the app instead of blue.

3. Skeleton-card loading state for Main, replaces the built-in spinner entirely VISUAL POLISH, MOCKUP APPROVED

Goes further than item 2 — instead of just recolouring the built-in spinner, this turns it off and shows 2–3 pulsing grey placeholder cards, shaped like the real release cards, in the same spot while Refresh('Policy Proof Tracker') runs. Mockup approved: skeleton-card mockup (option A on that page).

Five steps, pasted as components rather than a full screen — existing HeaderGallery content, Container1, and everything downstream of it is untouched.

Honesty check on validation: ran this through payaml-validate before writing it up. Layers A (schema) and C (layout/FillPortions) pass clean. Layer B (property cross-check against your existing screens) flags every Timer@2.1.0 property as "unproven" — not because anything's wrong, but because no screen in your app has ever used a Timer control yet, so the validator has nothing in the corpus to confirm against. Sourced from Microsoft's documented Timer schema, not guessed. Once a Timer is pasted in and re-exported, this flag clears itself.

Step 1: Main screen, OnVisible, full replacement (adds the loading flag around the existing refresh, nothing else changes):

=Set(varMainLoading, true);
Refresh('Policy Proof Tracker');
Set(varMainLoading, false)

Step 2: select GalleryContainer in Tree view (the white panel that already holds HeaderGallery), Insert → search "Timer", drop it in as a child of GalleryContainer, rename it tmrSkeletonPulse, and set these properties:

Visible: =false
AutoStart: =varMainLoading
Repeat: =true
Duration: =1300
Start: =varMainLoading
OnTimerEnd: =Set(varSkeletonPulse, 1 - varSkeletonPulse)

This flips a single 0/1 variable every 1.3 seconds, only while varMainLoading is true. Every skeleton block below reads that same variable, so they all pulse together.

Step 3: still inside GalleryContainer, paste this as a new component (select GalleryContainer in Tree view first, then paste — Studio adds it as a sibling of HeaderGallery):

- SkeletonLoadingStack:
    Control: GroupContainer@1.5.0
    Variant: AutoLayout
    Properties:
      Fill: =RGBA(0, 0, 0, 0)
      LayoutDirection: =LayoutDirection.Vertical
      LayoutGap: =10
      PaddingTop: =20
      Visible: =varMainLoading
      Width: =Parent.Width
      Y: =1
    Children:
      - SkeletonCard1:
          Control: GroupContainer@1.5.0
          Variant: ManualLayout
          Properties:
            Fill: =RGBA(255, 255, 255, 1)
            FillPortions: =0
            Height: =100
            Width: =Parent.Width - 92
          Children:
            - SkelAccentBar1:
                Control: Rectangle@2.3.0
                Properties:
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =Parent.Height
                  Width: =8
            - SkelAvatar1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =25
                  RadiusBottomLeft: =50
                  RadiusBottomRight: =50
                  RadiusTopLeft: =50
                  RadiusTopRight: =50
                  Text: =""
                  Width: =25
                  X: =25
                  Y: =70
            - SkelTitleBar1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =12
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =340
                  X: =50
                  Y: =24
            - SkelSubtitleBar1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =9
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =220
                  X: =50
                  Y: =44
            - SkelPill1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =16
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                  Text: =""
                  Width: =46
                  X: =Parent.Width - 90
                  Y: =20

Every shape inside SkeletonCard1 reads the same Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12) formula, so nothing needs a per-control timer binding — flip varSkeletonPulse once, every block darkens or lightens together. FillPortions: =0 on SkeletonCard1 matters: it's a ManualLayout container sitting inside an AutoLayout stack, and skipping this is exactly the bug that broke ViewItem_1's layout earlier in this project (a ManualLayout child defaults to flexible height and ignores its own Height unless FillPortions is explicitly zeroed).

Step 4: duplicate the card two more times. Right-click SkeletonCard1 in Tree view → Duplicate, twice. No property edits needed on the copies — every value is either a fixed shape offset or the shared varSkeletonPulse formula, so three identical cards stacked by SkeletonLoadingStack's LayoutGap: =10 is enough to read as "a few rows loading," matching the mockup.

Step 5: hide the real gallery while the skeleton shows. Select HeaderGallery in Tree view, add:

Visible: =!varMainLoading

Item 2's spinner-colour fix still applies underneath this as a fallback (first paint, or if LoadingSpinner ever fires for some other data call on this screen) — do that one too, they're not mutually exclusive.

Test: navigate to Main from a cold load. You should see three pulsing grey cards in the exact slot the real cards occupy, no spinner at all, then a clean swap to real data once the refresh completes. Compare directly against the "Simulate opening Main" button on the mockup link above — the pulse timing and shape should match.

4. Skeleton cards don't appear on tab switch, blue spinner still flashes there SCOPE GAP IN ITEM 3, CONFIRMED AGAINST YOUR LATEST FILES

You did item 3 exactly right — checked your latest Main.yaml from issue #27 directly and tmrSkeletonPulse, SkeletonLoadingStack, and HeaderGallery.Visible: =!varMainLoading are all there, correct, matching the guide. The gap is mine: item 3 only ever set varMainLoading inside Main.OnVisible, which fires once when you navigate onto Main. It does not fire when you click Future/Issues/etc. while you're already sitting on Main — so on every tab click, varMainLoading just never moves, the skeleton never shows, and the real gallery never hides.

Separately, and this is what you're actually seeing as the leftover blue: all four dashboard tab buttons (Button2, Button2_1, Button2_2, Button2_3) and the "My items only" toggle (MyItems) each call Refresh('Policy Proof Tracker') directly in their own OnSelect/OnChange — a real network round-trip, on every single click, completely independent of OnVisible. That's a genuine live data fetch, which is exactly why it's brief but real ("a fraction of a second"), and it's what's actually producing the flash you're seeing — item 2's screen-level colour fix doesn't reach it because this isn't the screen's own spinner, it's tied to these five controls' own data calls.

Fix: wrap the same varMainLoading flag around each of these five controls' existing Refresh() call, same pattern as OnVisible. Nothing else in any of these formulas changes — every line below except the two new Set(varMainLoading, ...) lines is copied verbatim from your issue #27 1-Main.txt.

Button2 (Due Next 4 Weeks / "Current" tab), OnSelect, full replacement:

=Set(varMainLoading, true);
Refresh('Policy Proof Tracker');
Set(varSelectedState, "Current");
Set(
    colTypeCounts,
    Filter(
        'Policy Proof Tracker',
        'Planned Publish Date' >= Today() &&
        'Planned Publish Date' <= DateAdd(Today(), 28, "Days") &&
        (varFilterOwner = false || Owner.Email = User().Email)
    )
);
Reset(HeaderGallery);
Set(varMainLoading, false)

Button2_1 (Future Releases tab), OnSelect, full replacement:

=Set(varMainLoading, true);
Refresh('Policy Proof Tracker');
Set(varSelectedState, "Future");
Set(
    colTypeCounts,
    Filter(
        'Policy Proof Tracker',
        'Planned Publish Date' > DateAdd(Today(), 28, "Days") &&
        (varFilterOwner = false || Owner.Email = User().Email)
    )
);
Reset(HeaderGallery);
Set(varMainLoading, false)

Button2_2 (Issues tab), OnSelect, full replacement:

=Set(varMainLoading, true);
Refresh('Policy Proof Tracker');
Set(varSelectedState, "UnapprovedHistoric");
Set(
    colTypeCounts,
    Filter(
        'Policy Proof Tracker',
        'Planned Publish Date' < Today() &&
        Published = false &&
        (varFilterOwner = false || Owner.Email = User().Email)
    )
);
Reset(HeaderGallery);
Set(varMainLoading, false)

Button2_3 (Previously Published / "Historic" tab), OnSelect, full replacement:

=Set(varMainLoading, true);
Refresh('Policy Proof Tracker');
Set(varSelectedState, "Historic");
Set(
    colTypeCounts,
    Filter(
        'Policy Proof Tracker',
        'Planned Publish Date' >= DateAdd(Today(), -varHistoricLimit, "Days") &&
        'Planned Publish Date' < Today() &&
        Published = true &&
        (varFilterOwner = false || Owner.Email = User().Email)
    )
);
Reset(HeaderGallery);
Set(varMainLoading, false)

MyItems toggle ("My items only" switch), OnChange, full replacement:

=Set(varMainLoading, true);
Refresh('Policy Proof Tracker');
Set(varFilterOwner, Self.Value);
Set(
    colTypeCounts,
    Filter(
        'Policy Proof Tracker',
        (
            (varSelectedState = "Current" && 'Planned Publish Date' >= Today() && 'Planned Publish Date' <= DateAdd(Today(), 28, "Days")) ||
            (varSelectedState = "Future" && 'Planned Publish Date' > DateAdd(Today(), 28, "Days")) ||
            (varSelectedState = "UnapprovedHistoric" && 'Planned Publish Date' < Today() && Published = false) ||
            (varSelectedState = "Historic" && 'Planned Publish Date' >= DateAdd(Today(), -varHistoricLimit, "Days") && 'Planned Publish Date' < Today() && Published = true)
        ) &&
        (Self.Value = false || Owner.Email = User().Email)
    )
);
Set(varMainLoading, false)
Optional belt-and-braces, unverified: if any blue flash remains after the five pastes above, it's likely HeaderGallery's own built-in loading indicator, which some data-bound controls carry independently of the screen's LoadingSpinnerColor. Try selecting HeaderGallery in Tree view and checking whether a LoadingSpinnerColor property is offered in its properties panel — if it is, set it to RGBA(11, 74, 54, 1) too. Flagging this as a "check if it exists" rather than a guaranteed paste, since no screen in your app has used this property on a Gallery before and I'm not going to hand you an unverified property block again today.
Test: from Main, click through all four tabs and the "My items only" toggle in quick succession. Each click should show the three pulsing skeleton cards briefly, no blue flash, then real data. This is the actual everyday interaction you described — more important to get right than the cold-load case in item 3's test.

5. Skeleton cards missing a header, duplicates rendering blank VISUAL POLISH

From your screenshots: one card shows correctly, the two duplicated ones render as blank white boxes with no shapes, and there's nothing mimicking the "Thursday, 16th July 2026 · 1 item" header bar that sits above each group of real cards. The blank duplicates are most likely a Studio "Duplicate" quirk, not a formula problem — rather than debug that blind, this is a full replacement with three cards spelled out explicitly (no duplicating) plus one placeholder header bar. The header bar is a generic grey shape, not real text — the skeleton can't know the real date/count before data has loaded, so it mimics the shape of the header (title-width bar + count pill) rather than faking real content.

Delete SkeletonLoadingStack entirely (Tree view → right-click → Delete), then select GalleryContainer and paste this in its place:

- SkeletonLoadingStack:
    Control: GroupContainer@1.5.0
    Variant: AutoLayout
    Properties:
      Fill: =RGBA(0, 0, 0, 0)
      LayoutDirection: =LayoutDirection.Vertical
      LayoutGap: =10
      PaddingTop: =20
      Visible: =varMainLoading
      Width: =Parent.Width
      Y: =1
    Children:
      - SkelHeaderBar1:
          Control: GroupContainer@1.5.0
          Variant: ManualLayout
          Properties:
            Fill: =RGBA(244, 246, 243, 1)
            FillPortions: =0
            Height: =40
            Width: =Parent.Width - 92
          Children:
            - SkelHeaderTitle1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =14
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =180
                  X: =14
                  Y: =13
            - SkelHeaderPill1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =20
                  RadiusBottomLeft: =10
                  RadiusBottomRight: =10
                  RadiusTopLeft: =10
                  RadiusTopRight: =10
                  Text: =""
                  Width: =54
                  X: =Parent.Width - 70
                  Y: =10
      - SkeletonCard1:
          Control: GroupContainer@1.5.0
          Variant: ManualLayout
          Properties:
            Fill: =RGBA(255, 255, 255, 1)
            FillPortions: =0
            Height: =100
            Width: =Parent.Width - 92
          Children:
            - SkelAccentBar1:
                Control: Rectangle@2.3.0
                Properties:
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =Parent.Height
                  Width: =8
            - SkelAvatar1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =25
                  RadiusBottomLeft: =50
                  RadiusBottomRight: =50
                  RadiusTopLeft: =50
                  RadiusTopRight: =50
                  Text: =""
                  Width: =25
                  X: =25
                  Y: =70
            - SkelTitleBar1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =12
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =340
                  X: =50
                  Y: =24
            - SkelSubtitleBar1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =9
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =220
                  X: =50
                  Y: =44
            - SkelPill1:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =16
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                  Text: =""
                  Width: =46
                  X: =Parent.Width - 90
                  Y: =20
      - SkeletonCard2:
          Control: GroupContainer@1.5.0
          Variant: ManualLayout
          Properties:
            Fill: =RGBA(255, 255, 255, 1)
            FillPortions: =0
            Height: =100
            Width: =Parent.Width - 92
          Children:
            - SkelAccentBar2:
                Control: Rectangle@2.3.0
                Properties:
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =Parent.Height
                  Width: =8
            - SkelAvatar2:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =25
                  RadiusBottomLeft: =50
                  RadiusBottomRight: =50
                  RadiusTopLeft: =50
                  RadiusTopRight: =50
                  Text: =""
                  Width: =25
                  X: =25
                  Y: =70
            - SkelTitleBar2:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =12
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =340
                  X: =50
                  Y: =24
            - SkelSubtitleBar2:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =9
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =220
                  X: =50
                  Y: =44
            - SkelPill2:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =16
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                  Text: =""
                  Width: =46
                  X: =Parent.Width - 90
                  Y: =20
      - SkeletonCard3:
          Control: GroupContainer@1.5.0
          Variant: ManualLayout
          Properties:
            Fill: =RGBA(255, 255, 255, 1)
            FillPortions: =0
            Height: =100
            Width: =Parent.Width - 92
          Children:
            - SkelAccentBar3:
                Control: Rectangle@2.3.0
                Properties:
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =Parent.Height
                  Width: =8
            - SkelAvatar3:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =25
                  RadiusBottomLeft: =50
                  RadiusBottomRight: =50
                  RadiusTopLeft: =50
                  RadiusTopRight: =50
                  Text: =""
                  Width: =25
                  X: =25
                  Y: =70
            - SkelTitleBar3:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =12
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =340
                  X: =50
                  Y: =24
            - SkelSubtitleBar3:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =9
                  RadiusBottomLeft: =4
                  RadiusBottomRight: =4
                  RadiusTopLeft: =4
                  RadiusTopRight: =4
                  Text: =""
                  Width: =220
                  X: =50
                  Y: =44
            - SkelPill3:
                Control: Classic/Button@2.2.0
                Properties:
                  BorderThickness: =0
                  DisplayMode: =DisplayMode.View
                  Fill: =ColorFade(RGBA(228, 233, 229, 1), varSkeletonPulse * -0.12)
                  Height: =16
                  RadiusBottomLeft: =8
                  RadiusBottomRight: =8
                  RadiusTopLeft: =8
                  RadiusTopRight: =8
                  Text: =""
                  Width: =46
                  X: =Parent.Width - 90
                  Y: =20

Validated with payaml-validate before publishing — all three layers pass clean, no unproven flags (unlike the Timer in item 3, every control type here is already proven elsewhere in your corpus).

Test: trigger the loading state (cold navigate to Main, or a tab click). You should see one header-shaped bar, then three full cards, all pulsing together, no blank boxes.

6. ViewItem: links panel still flickers and resets after ticking a box — a second, different slow operation was still blocking Reset() CONFIRMED, SAME BUG CLASS AS ITEM 1

Item 1's Reset-reorder fix is confirmed correctly pasted in your current file — checked directly, Reset(...) does run before the Refresh(PolicyLinks) block. But your live OnVisible has grown a second slow operation since item 1 was written, sitting before Reset(...): a ClearCollect(colThursdayOptions, ForAll(Sequence(104), ...)), from the Thursday date-picker feature. That's 104 separate Filter+CountRows passes over the whole Policy Proof Tracker list, run unconditionally on every single open — even though colThursdayOptions is only ever read by the date-picker popover, which isn't even visible until you click to open it. Reset(...) now waits on this instead of on Refresh(PolicyLinks) — same bug, different cause, which is exactly the "still doing it" you're seeing.

Checked first: nothing in the Reset(...) list depends on colThursdayOptions or varShowThursdayPicker (only the picker popover itself reads them, confirmed via a direct search of your file). Safe to move that whole block to run after Reset(...) instead of before it — that's the only change below, byte-diffed against your current file to confirm it's a pure reorder, nothing added or removed.

ViewItem.OnVisible, full replacement:

=Set(varLoadingLinks, true);
Set(varSaving, false);
Set(varShowLinkModal, false);
Set(varSelectedLink, Blank());
Set(varErrTitle, false);
Set(varErrOwner, false);
Set(varErrDocType, false);
Set(varErrPublishDate, false);
Set(
    varOwnerDefault,
    If(
        IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.Owner.Email),
        Table({DisplayName: User().FullName, Mail: User().Email}),
        Table({DisplayName: varSelectedRelease.Owner.DisplayName, Mail: varSelectedRelease.Owner.Email})
    )
);
Set(
    varPlannedPublishDate,
    If(
        IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.'Planned Publish Date'),
        DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7), "Days"),
        varSelectedRelease.'Planned Publish Date'
    )
);
If(
    !varDeepLinkHandled && !IsBlank(Param("ID")),
    Set(varDeepLinkHandled, true);
    Set(varItemID, Param("ID"));
    Set(varLoading, true);
    Refresh('Policy Proof Tracker');
    Set(varDeepLinkItem, LookUp('Policy Proof Tracker', ID = Value(varItemID)));
    If(
        !IsBlank(varDeepLinkItem),
        Set(varSelectedRelease, varDeepLinkItem);
        Set(varSelectPolicy, "Filled");
        Set(varParentSaved, true);
        Set(varSelectedItem, varDeepLinkItem);
        Set(varSourceScreen, "Main");
        Set(varSelectedPerson, varDeepLinkItem.Owner);
        Refresh(PolicyLinks);
        BuildLinksForSource(varDeepLinkItem.ID);
        Set(varOwnerDefault, Table({DisplayName: varDeepLinkItem.Owner.DisplayName, Mail: varDeepLinkItem.Owner.Email}));
        Set(varPlannedPublishDate, varDeepLinkItem.'Planned Publish Date'),
        Notify("This item could not be found. It may have been deleted or the link may be incorrect.", NotificationType.Error);
        Set(varDeepLinkNotFound, true)
    );
    Set(varLoading, false)
);
Reset(txtTitle1);
Reset(drpDocType1);
Reset(dpkPublishDate1);
Reset(ckbHighPriority1);
Reset(txtReasonHighPri1);
Reset(ckbExtConsult1);
Reset(txtExtConsultDetails1);
Reset(ckbTopItem1);
Reset(txtNewsletterTitle1);
Reset(txtAudience1);
Reset(txtSummary1);
Reset(txtRemarks1);
Reset(ckbPillarLead1);
Reset(radApproval1);
Reset(ckbPublished1);
Reset(dpkPublishedDate1);
Reset(cmb_Owner1);
Set(varShowThursdayPicker, false);
ClearCollect(
    colThursdayOptions,
    ForAll(
        Sequence(104),
        With(
            {_thu: DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7) + (Value - 1) * 7, "Days")},
            {
                ThursdayDate: _thu,
                ItemCount: CountRows(
                    Filter(
                        'Policy Proof Tracker',
                        Year('Planned Publish Date') = Year(_thu) &&
                        Month('Planned Publish Date') = Month(_thu) &&
                        Day('Planned Publish Date') = Day(_thu)
                    )
                )
            }
        )
    )
);
If(
    !IsBlank(varSelectedRelease.ID),
    Refresh(PolicyLinks);
    BuildLinksForSource(varSelectedRelease.ID);
    Set(varLoadingLinks, false),
    Clear(colLinks);
    Set(varLoadingLinks, false)
);

On "can we preload this instead of piecemeal" — this is the closest practical answer without a bigger rebuild: every field on the left now populates as fast as this formula can possibly run, with zero dependency on either slow operation. The right-side links panel and the Thursday-picker collection still load in the background afterward (Power Fx can't truly run them in parallel within one formula), but they can no longer delay or interfere with anything on the left. A further step — a single "screen ready" flag gating the whole form behind one skeleton state, similar to Main's, so nothing renders partially at all — is possible but bigger than today's fix; say if you want that scoped out separately.

Test: open an existing item and tick Top Item immediately, before anything else has visibly loaded. It should stick on the first click. Then watch the right side while it settles — the "Add Document Link" panel may still take a moment to populate (that's the real, separate Refresh(PolicyLinks) network call, not fixable without removing that refresh), but the left side and your click should never flicker or reset again.

7. Links panel goes blank and reloads every single open, even with items 1 and 6 applied REAL NETWORK CALL, NOT A RACE THIS TIME — TRADE-OFF, READ BEFORE PASTING

Everything else now loads instantly, which is exactly what exposed this: the links panel briefly shows, goes fully blank for about a second, then reloads with the same content. That's not a race condition like items 1 and 6 — it's Refresh(PolicyLinks) in the last block of OnVisible, a genuine full-table re-fetch of the entire PolicyLinks list from SharePoint, on every single open, before BuildLinksForSource even filters down to this one item's links. That round trip is real, and no amount of reordering removes it — it has to actually finish before the panel can show anything.

The fix is to stop doing that refresh at all, not hide it better. BuildLinksForSource just runs Filter(PolicyLinks, ...) against Power Apps' own already-cached copy of the list — which stays fresh in-session already, because both places that actually change links (frmLink_2.OnSuccess when you save a new link, and the delete-link modal) already call Refresh(PolicyLinks) themselves right after the change. Removing the redundant refresh here means BuildLinksForSource runs against memory instead of the network, which is what makes it feel instant.

The actual trade-off, not hidden: if a link gets added or deleted by someone else, in a different session, between when your local cache last refreshed and when you open this item, you won't see that change until something in your own session triggers a fresh Refresh(PolicyLinks) (reopening the app, or editing links yourself). For a small internal tool where it's rare for two people to touch the same item's links at the same moment, this is very likely the right trade — instant response on every single click, at the cost of a rare stale-by-a-few-minutes edge case. If that trade-off doesn't sit right with you, don't paste this one and the panel will keep taking ~1 second on every open instead.

Built directly on top of item 6's version, which you've already pasted — the only change is deleting one line, Refresh(PolicyLinks);, from the final block. Byte-diffed to confirm nothing else moved.

ViewItem.OnVisible, full replacement:

=Set(varLoadingLinks, true);
Set(varSaving, false);
Set(varShowLinkModal, false);
Set(varSelectedLink, Blank());
Set(varErrTitle, false);
Set(varErrOwner, false);
Set(varErrDocType, false);
Set(varErrPublishDate, false);
Set(
    varOwnerDefault,
    If(
        IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.Owner.Email),
        Table({DisplayName: User().FullName, Mail: User().Email}),
        Table({DisplayName: varSelectedRelease.Owner.DisplayName, Mail: varSelectedRelease.Owner.Email})
    )
);
Set(
    varPlannedPublishDate,
    If(
        IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.'Planned Publish Date'),
        DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7), "Days"),
        varSelectedRelease.'Planned Publish Date'
    )
);
If(
    !varDeepLinkHandled && !IsBlank(Param("ID")),
    Set(varDeepLinkHandled, true);
    Set(varItemID, Param("ID"));
    Set(varLoading, true);
    Refresh('Policy Proof Tracker');
    Set(varDeepLinkItem, LookUp('Policy Proof Tracker', ID = Value(varItemID)));
    If(
        !IsBlank(varDeepLinkItem),
        Set(varSelectedRelease, varDeepLinkItem);
        Set(varSelectPolicy, "Filled");
        Set(varParentSaved, true);
        Set(varSelectedItem, varDeepLinkItem);
        Set(varSourceScreen, "Main");
        Set(varSelectedPerson, varDeepLinkItem.Owner);
        Refresh(PolicyLinks);
        BuildLinksForSource(varDeepLinkItem.ID);
        Set(varOwnerDefault, Table({DisplayName: varDeepLinkItem.Owner.DisplayName, Mail: varDeepLinkItem.Owner.Email}));
        Set(varPlannedPublishDate, varDeepLinkItem.'Planned Publish Date'),
        Notify("This item could not be found. It may have been deleted or the link may be incorrect.", NotificationType.Error);
        Set(varDeepLinkNotFound, true)
    );
    Set(varLoading, false)
);
Reset(txtTitle1);
Reset(drpDocType1);
Reset(dpkPublishDate1);
Reset(ckbHighPriority1);
Reset(txtReasonHighPri1);
Reset(ckbExtConsult1);
Reset(txtExtConsultDetails1);
Reset(ckbTopItem1);
Reset(txtNewsletterTitle1);
Reset(txtAudience1);
Reset(txtSummary1);
Reset(txtRemarks1);
Reset(ckbPillarLead1);
Reset(radApproval1);
Reset(ckbPublished1);
Reset(dpkPublishedDate1);
Reset(cmb_Owner1);
Set(varShowThursdayPicker, false);
ClearCollect(
    colThursdayOptions,
    ForAll(
        Sequence(104),
        With(
            {_thu: DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7) + (Value - 1) * 7, "Days")},
            {
                ThursdayDate: _thu,
                ItemCount: CountRows(
                    Filter(
                        'Policy Proof Tracker',
                        Year('Planned Publish Date') = Year(_thu) &&
                        Month('Planned Publish Date') = Month(_thu) &&
                        Day('Planned Publish Date') = Day(_thu)
                    )
                )
            }
        )
    )
);
If(
    !IsBlank(varSelectedRelease.ID),
    BuildLinksForSource(varSelectedRelease.ID);
    Set(varLoadingLinks, false),
    Clear(colLinks);
    Set(varLoadingLinks, false)
);

Note the deep-link branch (opening ViewItem via a direct link/QR code) still keeps its own Refresh(PolicyLinks) untouched — that's a rarer, one-off entry point rather than the repeated in-app click you're describing, so it wasn't in scope for this fix. Say if you want that trimmed too once you've confirmed this one feels right.

Test: open several different existing items in a row, normally (not via deep link). The links panel should appear once and stay, no blank flash, no reload. Then add or delete a link on one item and confirm it still shows up correctly — that path still refreshes explicitly and isn't affected by this change.

8. Diagnostic only — confirm whether OnVisible is firing twice NOT A FIX, TEMPORARY, REMOVE AFTER TESTING

Item 7 didn't fix the flicker, and the ScreenTransition.FadeNone theory was tested and ruled out. The video evidence (same correct link data disappearing then reappearing unchanged, roughly a second apart) still points at OnVisible running twice per open rather than a data problem — but that's an inference from timing, not something either of us has actually seen happen. This step makes it visible directly instead of guessing again.

Add these two lines to the very top of ViewItem.OnVisible, before the existing Set(varLoadingLinks, true); line — don't remove or replace anything else in the formula, just insert this above it:

Notify("OnVisible fired, run #" & (varOnVisibleRunCount + 1), NotificationType.Information);
Set(varOnVisibleRunCount, varOnVisibleRunCount + 1);
Test: open any existing item normally. Watch for toast notifications in the corner — one toast ("run #1") means OnVisible only fires once and the cause is elsewhere (likely the links Gallery itself, not the formula). Two toasts back to back ("run #1" then "run #2") confirms it's genuinely running twice, and narrows the next fix to finding what triggers the second run. Report back which you see, then remove these two lines afterward either way — they're diagnostic only, not meant to stay in the app.

9. Root cause found: one card click fires two separate Navigate(ViewItem) calls CONFIRMED VIA DIAGNOSTIC, EXACT LINE FOUND

Two toasts confirmed it. Traced to the exact cause in Main.yaml: every card has an invisible full-card Rectangle named Selector sitting on top as the actual click target (X=46, Width=1194, matching the card exactly). Its OnSelect starts with Select(Parent); — inside a Gallery template, that line specifically re-triggers the Gallery row's own click handling, which is wired to ReleaseGallery.OnSelect (a separate, older handler: Set(varSelectedRelease, ...); Navigate(ViewItem, ScreenTransition.Fade)). Select() doesn't stop the calling formula — so after that line fires the Gallery's handler, Selector.OnSelect keeps running its own code afterward, which sets varSelectedRelease again, preloads the links, and calls Navigate(ViewItem, ScreenTransition.Fade) a second time. One click, two full navigations, two OnVisible runs — the second one repeats the whole load (including the ~1 second colThursdayOptions build from item 6), which is exactly the blank-then-reload you're seeing on the links panel.

Fix: delete the Select(Parent); line from Selector.OnSelect, nothing else. Checked first: nothing anywhere in Main.yaml reads ReleaseGallery.Selected, so nothing relies on that line for row-highlighting or any other visible effect — it's pure duplicate-trigger, safe to remove outright. Selector.OnSelect already does everything ReleaseGallery.OnSelect does and more (it also preloads links), so nothing is lost.

On Main, find the Selector control (inside ReleaseGallery's row template — it's the full-card rectangle, not the Gallery itself), select its OnSelect property, and replace the whole thing with:

=Set(varSelectPolicy, "Filled");
Set(varParentSaved, true);
Set(varSelectedItem, ThisItem);
Set(varSourceScreen, "Main");
Set(varSelectedRelease, LookUp('Policy Proof Tracker', ID = ThisItem.ID));
Set(varSelectedPerson, varSelectedRelease.Owner);

// Load links immediately
Set(varLoadingLinks, true);
BuildLinksForSource(ThisItem.ID);
Set(varLoadingLinks, false);

// Navigate to ViewItem
Navigate(ViewItem, ScreenTransition.Fade);

Identical to what's there now, minus the first line (Select(Parent);) and its blank line. Once this is in, you can also remove the two diagnostic lines from item 8 — the toast count should drop to one, and the links panel should stop blanking.

Test: remove item 8's diagnostic lines from ViewItem.OnVisible first. Then click into several different items from Main. The links panel should appear once and never blank or reload. If you want the diagnostic toast back briefly to double-check it's down to one run, re-add item 8's two lines temporarily, confirm, then remove them again.

10. Real preloading: skip the reload entirely when the links were already fetched before navigating BIGGER CHANGE, THREE SMALL ANCHORED EDITS — NOT A FULL PASTE THIS TIME

You weren't wrong about the old behaviour — item 9 just proved it. Selector.OnSelect on Main already calls BuildLinksForSource(ThisItem.ID) and populates colLinks correctly before it navigates. But ViewItem.OnVisible has no way to know that already happened, so its very first line unconditionally sets varLoadingLinks back to true, hides the panel, and makes you sit through the rest of the formula (including the colThursdayOptions build) before showing you data that was ready from the moment you clicked. This teaches OnVisible to check first.

Because your files have changed with almost every item on this page today, these are given as three small, precisely anchored edits — find the exact text named, not a whole-property paste over something that might have moved since I last saw it.

Edit 1 — Formulas.txt (the BuildLinksForSource user-defined function, on App's Formulas property): find the line that just says true, immediately before the function's closing };. Add one line directly above it:

Set(varLinksSourceID, SourceID);

This tags which item's links are currently sitting in colLinks, automatically, everywhere this function is already called — Selector.OnSelect on Main, both places in ViewItem.OnVisible, and the add/delete-link handlers. No other call site needs touching for this part.

Edit 2 — ViewItem.OnVisible, the very first line. Find Set(varLoadingLinks, true); at the top of the formula (before Set(varSaving, false);) and replace only that one line with:

Set(varLoadingLinks, varLinksSourceID <> varSelectedRelease.ID || IsBlank(varSelectedRelease.ID));

If the links already loaded for this exact item (tagged by edit 1), this evaluates to false and the panel never hides at all. Anything else — a different item, a brand new entry, or any of the few navigation paths that don't preload (search results, the older gallery click-through) — falls back to the normal loading behaviour, unchanged.

Edit 3 — ViewItem.OnVisible, the final block near the bottom. Find this exact block (the last If in the formula):

If(
    !IsBlank(varSelectedRelease.ID),
    BuildLinksForSource(varSelectedRelease.ID);
    Set(varLoadingLinks, false),
    Clear(colLinks);
    Set(varLoadingLinks, false)
);

Replace it with:

If(
    !IsBlank(varSelectedRelease.ID),
    If(
        varLinksSourceID <> varSelectedRelease.ID,
        BuildLinksForSource(varSelectedRelease.ID)
    );
    Set(varLoadingLinks, false),
    Clear(colLinks);
    Set(varLoadingLinks, false)
);

Skips the redundant rebuild when the data's already correct (harmless either way, but no reason to re-filter PolicyLinks twice for nothing).

Why not just always skip loading in OnVisible: only the card Selector on Main preloads before navigating. The "+ New Entry" button, search results, and a couple of older call sites don't — this fix specifically only skips the wait when the preload genuinely already happened for this exact item, so those other paths behave exactly as before, just without the double-load bug from item 9.

Test: click into several different items from Main, one after another. Links should now appear with the item, no visible loading gap at all — genuinely instant, not just "loads once instead of twice." Then try the same via search results (if you use that path) and confirm it still shows a brief normal load there, since that path was never covered by the preload.
Confirmed done, removed from this page (click to expand)
Removed 2026-07-13 at your request — believed fixed, not independently re-verified against a fresh export (click to expand)

If any of these turn out to still be live when you're back in the editor, tell me which one and I'll re-add it rather than you having to redescribe the whole bug from scratch.

Correction: the Owner-flash fix (cmb_Owner1 reset, Table()-based varOwnerDefault) was flagged unverified here earlier today — that was wrong. Confirmed against your real issue #27 file: both that fix and the varDeepLinkNotFound deep-link handling are genuinely live and correctly built. No action needed on either; item 1's formula above already preserves both as-is.