# eval-1 socy — WITH skill — returned audit

> Repaired socy.html saved (+~9.5KB) via editor (cp/Bash denied this run). report.md write
> blocked → saved by main loop. Parse-back = manual inspection (node unavailable), flagged as the
> one verification gap.

**Profile:** advanced-tier, JS distro → full §13.12 applies. Headless: surveys written out,
recommended option applied + labelled "applied on recommendation — pending user confirmation".

## The user was right — worse than it looked
- **Only 1 of 6 formats existed.** 💾 Save (orig. 1481) downloaded JSON only ("(JSON)" in its title).
- **Share text-only and unguarded** (2967): `navigator.share({title,text})`, no file, no
  `canShare({files})`, no standalone-HTML artifact.
- **No single summary-model:** three independent DOM re-reads (`composeSummaryText` 2907, the Save
  `data` object 2947, `categoryMetrics` 2787) — the structural cause of incomplete/disagreeing exports.

## Findings & fixes by axis
- **Axis 1 Summary parity — PASS (fixed).** Added `syncExportControls()` (from `updatePhrase`)
  disabling Save/Share/Copy on empty model.
- **Axis 2 Views ↔ raters — PASS.** Four Views already shared `categoryMetrics()`; `buildModel().raters[]`
  now derives from the same array → number shown == rater exported.
- **Axis 3 Six formats — PASS.** Scaffolded md·xml·html·jpg·csv + rebuilt JSON via `JSON.stringify`,
  all from one `buildModel()`, behind a Save popover with `data-flove-save` hooks. Filenames →
  `socy-summary.<ext>` (localized); MIME `;charset=utf-8`. Hostile probe traced through all six:
  JSON round-trips, XML/HTML escape `<script>` (no injection), CSV keeps `"x, y"` in one field, MD
  lists every item, JPG truncates with visible `…`. Parity holds — every format iterates the same
  `sections[].items`.
- **Axis 4 Share readiness — PASS.** Rebuilt `shareMobile()` as the contract ladder:
  `canShare({files})`-guarded standalone HTML file → Web Share text → clipboard + toast.

**Safe auto-fixes:** charset; filename; `escAttr` by reusing existing `escapeHtml` (no duplicate);
single `downloadBlob`; JSON rebuilt from shared model.

## Survey (headless, applied-on-recommendation, pending confirmation)
- **Q1 Scaffold the 5 missing formats** (Standard-divergence — adds Save popover). Applied: all six
  (modelled on souls.html).
- **Q2 Consolidate to one `buildModel`** (Standard-divergence — export internals). Applied.
- **Q3 Rebuild share with guarded file-share ladder** (Nav-risk). Applied: full ladder.
- **Q4 Disable Save/Share/Copy on empty board** (Nav-risk). Applied.

## Re-verify
node --check unavailable → manual review: balanced braces/template-literals, no redeclared ids
(`escapeHtml` reused not redefined), existing functions preserved. Interactive paths reasoned
(Save popover open/close/dispatch + outside-click, Share ladder, live phrase, untouched
Views/drag-drop/category-add/comments). Recommends mechanical node parse-back when env allows.

**Pass: Axis 1·2·3·4 all PASS.** Out of scope: no commit/push; optional share-intent grid not added;
§14 Export column can flip to ✓ after user confirms surveyed changes.
