Skip to content

Hyperpart presentation process

Audience: /improve framework-ux + example-apps agents Doctrine source: antagonist HYPERPART_PRESENTATION_PROCESS (2026-08-01) Stills: a local dazzle qa capture writes examples/*/.dazzle/qa/screenshots. That directory is gitignored. Stills beat claims, and they are a capture of this run, not files in the tree. Related: #1626 · product-maturity.md · HM pick-a-surface (authoring, orthogonal)

Closed role × host → Hyperpart density matrix with one emit seam (dazzle.render.presentation.present). Authoring picks region modes (queue vs kanban); this process picks cell presentation.


Philosophy (non-negotiable)

  1. Stills beat claims — no residual-only credit without recapture.
  2. Semantic role beats field label — Assigned To is chrome; the value is person.
  3. Host is first-class — same person → Avatar density varies by host.
  4. One emit seam — host-local str(person) is a defect.
  5. Closed matrix — no invention on the polish path; miss → plain + residual.
  6. Framework-wide over one-app hacks.
  7. Floors / residuals, not human composite scores in CI.
  8. Catalogue discovery ≠ product selection — HM pick-a-surface is authoring; this is emit.

Vocabulary

Role Signals
person ref → User/Person/Contact…; keys assignee/author/owner/…
money money/currency types
status lifecycle badge enums
color color / hex
datetime date/time
plain fallback
Host Examples
list_cell / detail_cell Entity list / detail
queue_meta Queue row secondary meta strip
kanban_field / card_meta / timeline_meta Board / card / timeline
metrics_tile KPI tiles (person refused)

Density variants: avatar_only, avatar_name, badge, swatch, money, plain, refuse.


Matrix v1 (normative)

Role Host Emit
person list_cell, detail_cell avatar_name (existing user_chip)
person queue_meta avatar_only — no visible Assigned To: prose
person kanban_field, card_meta, timeline_meta avatar_name
person metrics_tile refuse
money queue_meta / list / detail money format (R1 fold currency)
status list-like badge
color list-like swatch (R5)
datetime queue_meta plain / relative

Living code: PRESENTATION_MATRIX in src/dazzle/render/presentation.py.

Queue meta person (product intent)

[title]  [status badges]
[avatar SA]  ·  Created 2d ago

Not: Assigned To: Support Agent · Created At: …


Agent loop (required order)

  1. Preflight — workspace health if recapturing
  2. OBSERVE — hero still + dazzle qa hyperpart-opportunities --app <app> --table
  3. MAP — field → role → hosts → current emit vs matrix
  4. SELECT — matrix density only (or matrix_miss + plain)
  5. IMPLEMENT — framework present() / matrix registration, not one-app CSS
  6. PROVE — recapture; DOM has .dz-avatar on queue_meta; no Assigned To: Name prose
  7. RECORD — matrix rows + still paths (no bake-off pass from residual alone)

Residuals / opportunity statuses

status Meaning
emit_covered Listed hosts use matrix hyperpart
emit_partial Some hosts covered, some not
author_action Product must change display mode / DSL
matrix_miss No matrix row

Suggested residual ids: person_as_text, ref_as_repr, host_emit_skew, hyperpart_matrix_miss, person_in_metrics (plus existing label_glue, cta_add_double).

Stills are the residual (T2): open the hero PNG and look for dict/UUID chrome (ref_as_repr) and queue pilot Assigned To: prose (person_as_text on ticket_queue_*). Floors alone cannot catch presentation honesty.

Never report full green for person refs while queue_meta still stringifies them.


Relationship to other artefacts

Artefact Role
HM pick-a-surface / work_surface_utility Authoring region mode
user_chip + present() Product emit
qa hyperpart-opportunities Observe host coverage
demo_fleet Floors (seed / still bytes)
counter-prior ref_as_repr KG inoculation vs dict/UUID chrome
Mid-dot R1 separators Between segments; not a substitute for Avatar

Agent surfaces (find and apply)

Downstream Dazzle consumers and monorepo agents should not invent a second presentation process. Use the published surfaces:

Surface How to find / invoke What it answers
Doctrine docs/reference/hyperpart-presentation.md · KG doc page hyperpart-presentation Rules + matrix
Opportunity scan CLI dazzle qa hyperpart-opportunities Host emit coverage
Counter-prior MCP knowledge(operation=counter_prior, id=ref_as_repr) Wrong vs right shape
Recapture scripts/recapture_demo_fleet_1626.py --apps <app> Still proof after emit

Force routing: when stills show presentation residual, next force is framework-ux hyperpart_presentation (framework emit fix). Use example-apps hyperpart_presentation only for recapture/prove after emit is fixed.

Knowledge graph: the KG seeds the counter-prior + doc page so knowledge queries surface the doctrine without grepping the monorepo; the opportunity scan is the CLI above. (The MCP presentation tool was removed in flense ship I — no consumer called it.)


Prove (minimum stills)

Still Expect
support_tickets/.../ticket_queue_agent_desktop_light.png Assignee as avatar/chip, not sole prose identity
fieldtest_hub/.../issue_triage_* Person meta → chip if present
simple_task kanban No regression

CLI:

# From example app dir (cwd = examples/<app>):
dazzle qa hyperpart-opportunities --table
# JSON includes presentation_cognition (hosts audited vs matrix-only).
.venv/bin/python scripts/recapture_demo_fleet_1626.py --apps support_tickets

Agent cognition (how to read the scan)

Opportunity reports are schema_version 2 with presentation_cognition:

Field Meaning
hosts_audited_by_scanner Static scan actually walks these hosts (all matrix hosts as of cycle 2163)
hosts_not_yet_audited Matrix rows exist; scan does not residual them yet (empty after kanban_field scan)
hosts_wired_to_seam Emit calls present() or equivalent chip path (list/detail/queue/kanban/timeline/card_meta/metrics_tile)
person_rows_all_emit_covered True only for audited person rows
caveat Do not treat all-green as fleet presentation done
how_to_extend Legal creativity path for new matrix rows

Rule: Open the hero still. Machine green + un-audited hosts → still read stills.


Agent creativity (within the closed system)

Creativity is not inventing a fourth assignee widget.

Allowed Forbidden
Map domain fields → roles; propose matrix row with still evidence One-app HTML/CSS for person/money
Implement present() density + unit test + recapture Second avatar class outside dual-lock
Extend scanner to a host once wired Claiming default_emit / all-green while queue stringifies
Pick region mode via work_surface_utility Bypassing matrix for “taste”

Extension recipe (when stills show a gap):

  1. Residual id hyperpart_matrix_miss (or host incompleteness note).
  2. Add PRESENTATION_MATRIX[(role, host)] = density.
  3. Implement density in present().
  4. Unit test + recapture hero still.
  5. Optionally add host to HOSTS_AUDITED_BY_SCANNER when static residual exists.