diff --git a/docs/memory/architecture/frontend.md b/docs/memory/architecture/frontend.md index 121d53bd43..a12ff226f0 100644 --- a/docs/memory/architecture/frontend.md +++ b/docs/memory/architecture/frontend.md @@ -45,7 +45,7 @@ **Library system-install section (ent#126):** the install surface is a third stacked `
` on `views/Library.vue`, between Agent Templates and Skills. It originally shipped as a `?tab=`-driven strip on `Templates.vue`; ent#263 renamed that page to **Library** ("installable assets for your fleet") and chose stacked sections with jump anchors over tabs/filter pills, so ent#126 conforms to the page's model rather than reintroducing a competing one — the ordering puts Systems next to Agent Templates because both *install agents* (a template creates one, a manifest creates a wired fleet), leaving Skills last as the one that configures agents that already exist. The section is hidden outright below `creator` (gated on `hasMinRole('creator')`, mirroring `POST /api/systems/deploy`) rather than shown-and-disabled, since a browse surface gains nothing from a dead panel. It hosts `components/systems/` — `SystemInstallPanel` (bundled cards / upload / paste + Preview + Deploy) → `ManifestPreview` (agents, permission topology, schedules, blockers, acknowledgement gate) → `DeployResult` (all five `status` values) — over the new domain-scoped `stores/systems.js` (Invariant #6: a *System* is a manifest-deployed name-prefix group, a *System View* is a saved tag filter — different domains). The store's `normalizeError` collapses six response shapes and switches on `status`, never the HTTP code (`partial`/`invalid` are 200; `failed` is **500 with the full report as the body**), and binds `preview` to `previewedText` so Deploy is disabled after an edit. Plain `