Skip to content

feat(explorer): hide erased + breadcrumb trail + auto-refresh (Carl explorer improvements)#175

Merged
jrosskopf merged 4 commits into
mainfrom
feat/explorer-hide-erased
Jun 15, 2026
Merged

feat(explorer): hide erased + breadcrumb trail + auto-refresh (Carl explorer improvements)#175
jrosskopf merged 4 commits into
mainfrom
feat/explorer-hide-erased

Conversation

@jrosskopf

@jrosskopf jrosskopf commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Operator-requested improvements to the Carl/Wissensbasis knowledge-base explorer (packages/escurel_explorer_kit). Consumed by Carl via vendor/escurel; one re-pin + dz-carl redeploy ships all of it. No-mock widget/provider tests throughout (FixtureEscurelClient); full kit suite 91 green, flutter analyze clean.

1 — Hide erased instances (default hidden, toggle to reveal)

Tombstones (members erased via /delete-my-data) were listed like live records. Keyed on the real signal Carl writes (status: erased / status: revoked). InstanceSummary.erased; showErasedProvider (default false) + a raw/filtered provider split (toggle doesn't refetch); breadcrumb count + auto-focus skip tombstones; a "Gelöschte anzeigen" toggle reveals them struck-through.

2 — Breadcrumb history trail + back

The back-stack + Back button already existed; the history was just invisible. The breadcrumb now renders the nav stack as clickable crumbs A › B › current (scrollable), each jumping to that depth (navigateToDepth).

3 — Auto-refresh (no manual F5)

Read views were pull-once providers. AutoRefresher invalidates them on a timer (default on, 15s) so the KB stays current; a sync-icon toggle in the breadcrumb pauses/resumes; interval configurable. Pragmatic polling v1 — an event-driven path over Escurel's existing /ws (awareness()) can replace it later behind the same seam.

Resizable left pane (already present)

The kit already has a draggable divider (_DragDivider + leftPaneFractionProvider, clamps 20–75%) — it ships the moment dz-carl is rebuilt from current main. Optional follow-up: persist the width across reloads (resets to 42% today) — not yet included (would add a shared_preferences dep).

🤖 Generated with Claude Code

jrosskopf and others added 4 commits June 15, 2026 18:42
The Wissensbasis/CRM explorer listed tombstoned instances (members erased on
user request) indistinguishably from live ones. Erasure is signalled by
`status: erased` (members) / `status: revoked` (consent) in frontmatter —
exactly what Carl's erase_member writes, keeping required keys so the page still
parses.

- InstanceSummary.erased + shared isErasedFrontmatter() (models.dart).
- showErasedProvider (default false) + allInstancesRawProvider/allInstancesProvider
  split so the filter is a pure view filter (no refetch on toggle). The
  breadcrumb count + auto-focus now skip tombstones too.
- Instances directory: a 'Gelöschte anzeigen' toggle; erased rows render
  struck-through/dimmed with a 'gelöscht' marker when revealed.

No-mock widget + provider tests over a FixtureEscurelClient corpus (one live +
one erased member): hidden by default, revealed + marked when toggled. Full kit
suite green (89), analyze clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The top breadcrumb showed only the currently-focused entity, so the navigation
history (already tracked in navBackStackProvider for the instance-pane Back
button) was invisible. Now render the back-stack as clickable ancestor crumbs —
`A › B › current` — scrollable so a deep trail never overflows the title row.

- navigateToDepth(ref, index): focus stack[index], truncate history before it
  (preserves the trail left of the click, drops everything right).
- CrmBreadcrumb: ancestors as _TrailCrumb (semantics 'crumb:<slug>'), the
  focused entity stays the final 'focused-entity' crumb.

Complements (doesn't replace) the existing Back button. No-mock widget test:
nav a→b→c renders crumb:a, crumb:b, focused-entity; tapping crumb:a refocuses a
and empties the stack. Full kit suite green (90), analyze clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Read views were pull-once FutureProviders, so the knowledge base went stale
until a manual reload. Add an AutoRefresher that invalidates the read providers
on a timer (default ON, 15s) — watched views re-fetch, idle ones stay lazy. An
operator toggle (sync icon in the breadcrumb) pauses/resumes; interval is
configurable via autoRefreshIntervalProvider.

This is the pragmatic v1; an event-driven path over Escurel's existing /ws (the
client's awareness() stream) can replace the poll later without changing the
provider seam.

- auto_refresh.dart: autoRefreshEnabledProvider/IntervalProvider,
  refreshExplorerData(), AutoRefresher widget (re-arms on toggle/interval change,
  cancels on dispose).
- Wired into CrmWorkspace; toggle in CrmBreadcrumb actions.

No-mock widget test drives the fake clock with explicit pumps (never
pumpAndSettle — a periodic timer never settles): one interval re-resolves a
watched provider; disabling stops it. Full kit suite green (91), analyze clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… clean)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jrosskopf jrosskopf changed the title feat(explorer): hide erased instances by default (toggle to reveal) feat(explorer): hide erased + breadcrumb trail + auto-refresh (Carl explorer improvements) Jun 15, 2026
@jrosskopf jrosskopf merged commit 08ff468 into main Jun 15, 2026
1 check passed
@jrosskopf jrosskopf deleted the feat/explorer-hide-erased branch June 15, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant