# stac-workbench

Standalone STAC **viewer · selector · creator · contributor**. Since v0.4.0 the map IS the page
(redfish-style §4 map chrome): a full-viewport Leaflet map with the record riding as overlays —
a **records panel** (sortable table and card grid as tabs, each getting the panel's full width),
a **channel timeline** docked at the bottom (collapsed by default to a slim labeled bar; expanded
it is the fire-watch-grid idiom: channels = collections, expanded lanes / collapsed aggregate,
scrubbable playhead, UTC date+hour axis; pending swap for the shared `<redfish-timeline>`
component when the timeline fan closes), and a **launcher** that starts the bench from options
over ALL the STACs rather than a hardcoded preset. A creator turns the current selection into a
**new STAC saved into this app's bead** (`stacs/`), with `derived_from` lineage per item and the
source catalogs as `via` links. An **add face** (v0.2.0) deposits imagery and documents into the
loaded incident's record.

**Live:** [redfish.acequia.io/guerin/apps/stac-workbench/](https://redfish.acequia.io/guerin/apps/stac-workbench/) ·
**Authoring bead:** [stac-workbench `019f8680`](https://redfish.acequia.io/guerin/.agents/019f8680-fc72-792f-a940-1251647c31c2/about.md) ·
**Hub:** [acequia-hub?bead=019f8680…](https://redfish.acequia.io/acequia-hub/?bead=https%3A%2F%2Fredfish.acequia.io%2Fguerin%2F.agents%2F019f8680-fc72-792f-a940-1251647c31c2%2F) ·
**Sketch fan:** [workbench-layout, open forks + ballot](https://redfish.acequia.io/guerin/.agents/019f8680-fc72-792f-a940-1251647c31c2/2026-07-23/artifacts/sketches/workbench-layout-fan/index.html)

## Use

- **Start:** with no querystring, the **launcher** offers every STAC in the commons: the
  hand-curated registry
  ([stacs/registry/catalog.json](https://redfish.acequia.io/guerin/.agents/019f8680-fc72-792f-a940-1251647c31c2/stacs/registry/catalog.json),
  itself a STAC catalog-of-catalogs; edit it to grow the list), plus created STACs discovered
  live in the bead's `stacs/` (same-origin PROPFIND, degrading honestly elsewhere). Check
  several and open them together, **Open everything** (loads the registry as one
  catalog-of-catalogs), or paste any `catalog.json` URL. `?stac=<url>[,<url>…]` deep-links a
  source set and skips the launcher.
- **Read:** the records panel (top-left) holds table and grid as tabs at full panel width;
  click column heads to sort (newest first by default). The panel minimizes to a slim tab
  (§4 rule 10) when the map should own the room; `+ source` reopens the launcher.
- **Select:** click rows / cards / footprints; the selection is one set across every face.
- **Scrub:** expand the bottom timeline tab (collapsed by default per §4 rule 5); drag the
  playhead; "dim items far from playhead" applies the fire-watch-grid nearness filter
  everywhere. The axis defaults to the **event window** (a collection's second temporal
  interval when present, else the dense p10..p90 of item datetimes); "full range" expands to
  the coverage envelope, out-of-window items become edge counts, and interval items draw as
  thin coverage spans, never false event ticks. Axis labels are UTC date + hour (§4 rule 11).
  Undated items are counted, not faked onto the axis.
- **Chrome:** fullscreen and hide-UI fabs top-right (§4 rule 3); hide-UI withdraws everything
  but the restore control and the data attribution.
- **Create:** select items, name it → the selection becomes a new STAC PUT to
  [the bead's stacs/](https://redfish.acequia.io/guerin/.agents/019f8680-fc72-792f-a940-1251647c31c2/stacs/)
  with ambient auth (your acequia identity), then immediately re-loaded as a source
  (self-verifying). No write auth → an honest browser-download bundle instead. Created STACs
  appear in the launcher on the next visit.
- **Add (`?face=add`, added in v0.2.0):** a five-step contribution flow for incident records: who's adding
  (responder / community / news and media), what (files or a link, name, note, place), blast radius
  (per-type radio ladder, narrowest first), optional group with invites, deposit. The deposit PUTs
  each file to `<incident-base>/uploads/` with a `.meta.json` envelope beside it, using ambient
  auth. Any refusal (302 to sign-in included) degrades honestly to a downloadable deposit bundle
  with hand-off instructions; the flow never fakes a success. Blast radius and invites are recorded
  in the envelope as declared intent; per-person enforcement arrives with the acequia access layer,
  and the UI says exactly that. Copy by John (rhetoric bead `6715f286`, note 01, 2026-07-23).

## Verify

`node check.mjs` checks DOM ids, module exports, local assets, and that the registry catalog and
every registry child STAC respond 200.

## Honesty

Created STACs **reference** source assets by absolute URL (they die if sources move; fork W2 in
the fan is exactly this question). Sources keep their own licenses; the workbench adds none.
The add face never fakes a deposit: a refused PUT (302 to sign-in included) becomes a
downloadable deposit bundle, and blast radius plus invites are recorded as declared intent
until the acequia access layer enforces them. The launcher's created-STACs list requires the
acequia origin's PROPFIND; anywhere else it says so instead of showing an empty lie.

*© 2026 RedfishGroup · designed by Debbie (`c4a8e2f1`), animated by Claude Code (CE) for Stephen Guerin · v0.4.0, 2026-07-24*
