# Structural Chips — disseny

**Estat**: v0.1 · 2026-05-11 · disseny aprovat, implementació iniciada
**Origen**: sessió 2026-05-11 amb Jordi sobre la limitació de v2 detectada al cas "què és la mandra?"
**Spec germà**: `meta_globalium_system_prompt_v2.txt` (postura mestre savi)

---

## 1. Problema

Amb el system prompt v2, la categorització del Meta-Globàlium és **implícita** (les categories surten a la prosa si el LLM les invoca) i **a posteriori** (`arkadium_compute_category_relevance` les compta a partir del text generat). Conseqüència: si v2, per síntesi o elegància, **no nomena** les categories que estructuralment expliquen el fenomen, no apareixen als xips ni s'il·luminen al model 3D — i la pedagogia de "tot és una sola cosa" es perd.

**Cas test (msg id 142)**: pregunta "què és la mandra?" → v2 fa tres-fenòmens-diagnòstics excel·lents (descans / desalineació / circuit disfuncional, Grandjean+Deci-Ryan+Barkley-Seligman) amb 𝓦=0.91, però **no nomena** STT, INT, SGE, ACC, ni la cadena TRB→EXP→POL que constitueix la resolució operativa del tercer cas. Jordi reflecteix correctament: «com hem pogut oblidar aquestes categories?». La resposta: perquè v2 té com a regla "no force cicle a preguntes ontològiques", i ha sobre-corregit per a estats **dysfuncionals** on l'operativa **és** constitutiva de la definició.

## 2. Tesi

La categorització ha de ser **explícita** (separada de la prosa) i **estructurada per rol** funcional. La cobertura ha de ser dimensionalment completa: a totes les 80 categories canòniques, identifica les més significatives per al fenomen, classificades en tres rols, i si un dels 6 cicles operacionalitza la pregunta, identifica'l i marca les estacions actives.

## 3. Esquema funcional

**Tres rols funcionals**:

| Rol | Funció | Quan apareix |
|---|---|---|
| `tema` | Què és el fenomen — categories que el constitueixen ontològicament | Sempre. 2-3 categories. |
| `causa` | Per què s'origina, què el genera o el manté | Quan la pregunta toca etiologia, desencadenants, factors. 0-3 categories. |
| `resolució` | Com es travessa, integra, transforma o cura | Quan la pregunta demana sortida (procedural, orientacional, estat disfuncional). **Pot ser zero** si el tema és neutre o sense direcció (què és el silenci?). 0-3 categories. |

Total: 4-9 categories per resposta, **no més**.

**Cicles simultanis**:

Si un o més dels 6 cicles canònics (Coneixement, Mètode, Revelació, Universal, Relació, Consistència) **opera** sobre la pregunta — típicament la transició causa→resolució — s'identifiquen amb la llista d'estacions actives. Els rols i el cicle es **reforcen**: les estacions del cicle sovint coincideixen amb categories de rol `resolució`.

Pot haver-hi:
- 0 cicles (pregunta ontològica neutra, reconeixement fractal sense narrativa)
- 1 cicle (cas típic)
- 2 cicles en composició (cas mandra: Revelació per l'orientació subjectiva + Mètode per l'execució escalada)
- Mateix cicle a múltiples escales (`fractal: true`) — quan la pregunta posa de manifest la recurrència del mateix patró

## 4. Esquema JSON

Output del pre-pass, exposat com `output.structural` a la resposta `/ask`:

```json
{
  "categories": [
    {
      "code": "STM",
      "role": "tema",
      "interpretation": "drive vital — la pulsió que es manifesta com a resistència a l'acció quan està ferida"
    },
    {
      "code": "PSI",
      "role": "causa",
      "interpretation": "experiència psíquica acumulada de frustració trenca la connexió desig→acció (indefensió apresa de Seligman)"
    },
    {
      "code": "STT",
      "role": "resolució",
      "interpretation": "seny — escalar el repte de manera realista i motivant per restaurar la connexió"
    },
    {
      "code": "INT",
      "role": "resolució",
      "interpretation": "intenció madura — la voluntat re-orientada per propòsit propi (Deci-Ryan motivació autònoma)"
    },
    {
      "code": "SGE",
      "role": "resolució",
      "interpretation": "signe concret del primer petit avenç visible — el 'això' davant teu que ancora el moviment"
    },
    {
      "code": "ACC",
      "role": "resolució",
      "interpretation": "impuls que arrenca — plasmàtic de TEC, força inicial encara turbulenta"
    },
    {
      "code": "EXP",
      "role": "resolució",
      "interpretation": "cicle d'aprenentatge per intent i error sense moralisme — turbulència fertil → experiència → polidesa"
    }
  ],
  "voltes_active": [
    {
      "name": "revelació",
      "stations": ["STM","STT","SGT","SGE","PRA"],
      "rationale": "el fenomen demana caminar d'orientació-trencada a orientació-restaurada",
      "walk": "STM (el dolor original) → STT (seny que calibra) → SGT (sentit recuperat) → SGE (signe concret) → PRA (acció reconstituïda)"
    },
    {
      "name": "mètode",
      "stations": ["ANA","SIN","AMO","EXP"],
      "rationale": "la dimensió procedural exigeix cicle d'acció escalable",
      "walk": "ANA (analitzar el bloqueig) → SIN (sintetitzar nou plantejament) → AMO (compromís amb el procés) → EXP (assaig escalat)"
    }
  ]
}
```

## 5. Arquitectura

### Flux server `/ask` (modificat)

```
1. Pregunta arriba
2. RAG retrieval (KB-A + KB-B)           [existent]
3. Frame detection                       [existent]
4. STRUCTURAL PRE-PASS                   ★ NOU
   ├─ LLM call (Haiku, ~1s)
   ├─ Input: pregunta + catàleg 80 categories + 6 cicles
   └─ Output: JSON {categories, voltes_active}
5. systemPrompt construction
   ├─ Base v2 prompt                     [existent]
   ├─ Frame context                      [existent]
   ├─ Fitxes canòniques                  [existent]
   └─ === ESTRUCTURA CANÒNICA ===        ★ NOU (injectat des de step 4)
6. Main LLM call (Sonnet)                [existent, with new structural backbone]
7. Verifier + 𝓦 + polish                 [existent]
8. Response JSON
   ├─ answer                             [existent]
   ├─ meta                               [existent]
   └─ structural                         ★ NOU (JSON del step 4)
```

### Components nous

| Fitxer | Què | Línies aprox |
|---|---|---|
| `data/structural_prepass_instruction.txt` | Prompt template per la pre-pass | 60 |
| `data/categories_catalog.txt` | Catàleg compacte de les 80 (code · nom · breu) | 100 |
| `structural_prepass.php` | Funció `arkadium_structural_prepass($q, $lang)` que retorna l'array | 80 |
| `api.php` (edit) | Cridar prepass + injectar a systemPrompt + adjuntar a output | +30 |
| `src/assets/js/dashboard.js` (edit) | Renderitzar xips amb role pill + tooltip | +80 |
| `src/assets/css/styles.css` (edit) | Estil role pills (tema=blau, causa=vermell, resolució=verd) | +20 |

### Components diferits (v2 d'aquesta feature)

- **Corbes 3D**: dibuixar el `walk` de cada cicle com a arc connectant sprites al iframe del Metamodeler. Requereix extensió de `embed_bridge.js` i lògica three.js. Diferit per no allargar massa l'iteració actual.
- **Colors per rol al 3D**: paletes diferents per `tema`/`causa`/`resolució` sobre els sprites. Avui tots són il·luminats amb el mateix gradient.

## 6. Prompt del pre-pass (esborrany)

```
Ets un classificador estructural del Meta-Globàlium. Donada una pregunta, identifiques de les 80 categories canòniques quines són les més significatives per al fenomen, classificades per rol funcional.

ROLS:
- tema (sempre, 2-3): categories que constitueixen el fenomen ontològicament
- causa (0-3): categories que generen, originen o mantenen el fenomen
- resolució (0-3): categories que travessen, integren, transformen o curen el fenomen. ZERO si el fenomen és neutre i no admet "resolució" (silenci, felicitat, mateix cicle a múltiples escales).

CICLES (6 canònics) — Coneixement (FEN-ART-SUB-MTP-NOU-MTF-OBJ-CIE), Mètode (FEN-ANA-TEO-SIN-NOU-AMO-PRA-EXP), Revelació (PRA-STM-SUB-STT-TEO-SGT-OBJ-SGE), Universal (TEO-CAS-PRA-COS-MON-COV-PLA-CAV), Relació (NOU-CNF-FEN-CMN-MON-EXC-PLA-ATZ), Consistència (SUB-FEL-OBJ-INT-MON-AFI-PLA-BOS).

Per cada cicle que operacionalitzi la pregunta (típicament la transició causa→resolució), llista les seves estacions actives + 1 línia de rationale + descripció de la caminada.

CATÀLEG DE LES 80 CATEGORIES:
[…catàleg generat des de DB…]

RETORNA JSON ESTRICTAMENT:
{
  "categories": [{"code","role","interpretation"}, ...],
  "voltes_active": [{"name","stations","rationale","walk"}, ...]
}

Cap text fora del JSON. Interpretacions en l'idioma de la pregunta (CA o EN), 1-2 frases concretes per a aquesta pregunta (no genèriques del catàleg).

PREGUNTA: {QUESTION}
```

## 7. Injecció al system prompt

Després del bloc FITXES CANÒNIQUES, abans del LLM call principal, s'afegeix:

```
=== ESTRUCTURA CANÒNICA DE LA RESPOSTA ===
Aquesta pregunta s'articula al voltant de les següents categories (identificades estructuralment abans de generar):

TEMA: {STM} (drive vital — la pulsió que es manifesta com a...), {PRA} (...)
CAUSA: {PSI} (experiència acumulada de frustració...), {CNF} (...)
RESOLUCIÓ: {STT} (seny — escalar el repte realista), {INT} (...), {SGE} (...), {ACC} (...), {EXP} (...)

CICLES OPERATIUS:
- revelació: STM → STT → SGT → SGE → PRA (caminada d'orientació trencada a restaurada)
- mètode: ANA → SIN → AMO → EXP (cicle procedural escalable)

Usa aquestes categories com a esquelet estructural de la teva resposta — no totes han d'aparèixer literalment al text (regla B de v2: codis per necessitat, no com a etiqueta), però la prosa s'ha de poder llegir com a articulació d'aquestes operacions. Si nomenes alguna, ha de fer feina (operació activa, no decoració). Si camines un cicle, fes-ho com a cicle viu (cada estació transforma l'anterior).
```

Així la prosa de v2 pot continuar essent **elegant i sintètica** — el bastiment estructural viu als xips, no a la prosa. **Això resol també el conflicte 𝓦 v2 ↔ prompt v2**: 𝓦 podrà mesurar la coherència entre `structural.categories` i els codis que apareixen al text, en lloc de penalitzar la manca de citacions explícites.

## 8. Render frontend

### Xips (current vs new)

**Abans** (post-hoc): xip mostra només `CODE · nom` extret per relevance count del text.
**Després**: xip mostra `CODE · nom` + **pill de rol** (color), i en hover mostra **interpretació específica** d'aquesta pregunta.

```html
<div class="chip" data-code="STT" data-role="resolucio" data-interpretation="seny — escalar el repte de manera realista i motivant per restaurar la connexió">
  <span class="chip-role chip-role-resolucio">resolució</span>
  STT · Sentit
</div>
```

Estils:
- `.chip-role-tema` → blau suau (#3a82d6, fons #eaf2fc)
- `.chip-role-causa` → vermell suau (#c54a3a, fons #fbecea)
- `.chip-role-resolucio` → verd suau (#3a8a4d, fons #e8f4ec)

Tooltip: native `title` attribute → ràpid i sense JS extra; UI v2 podria fer-lo HTML al hover.

### Llegenda de cicles

Sota els xips, una nova fila:

```
Cicles actius: [revelació] STM→STT→SGT→SGE→PRA · [mètode] ANA→SIN→AMO→EXP
```

Cada cicle clickable → activa una nova vista al 3D (en una iteració futura: traça una corba; ara: highlight de totes les estacions amb un color de cicle).

## 9. Quan NO aplica

El pre-pass ha de retornar buit/menys quan:
- Pregunta de 1-2 paraules (e.g., "hola", "bon dia") — no estructural
- Pregunta sobre el sistema mateix ("què és el Meta-Globàlium?") — meta, no fenomen
- Pregunta clarament fora del 80 (gairebé impossible donar bona resposta)

Llindar: si el pre-pass torna `categories.length < 2`, s'omet la injecció al system prompt i `output.structural` no s'inclou (l'usuari veu el chat normal).

## 10. Cost i latència

- 1 trucada Haiku per `/ask` (model: `claude-haiku-4-5-20251001`, ~2000 tokens in + ~500 out)
- Cost: ~$0.001-0.002 per trucada
- Latència: ~0.8-1.2s addicional
- Total `/ask` passa de ~3-5s a ~4-6s amb prepass

Optimitzable més endavant amb caching per hash de pregunta.

## 11. Tradeoffs

**Pro**:
- Pedagogia visible — l'usuari veu **com pensa** Arkadium, no només què respon
- Resol el bug v2 "categories oblidades" estructuralment
- Allibera el text de la càrrega de scaffolding → preserva l'elegància del v2
- Permet refinar 𝓦 cap a "coherència esquelet ↔ prosa" en lloc d'"axis_explicit al text"
- Cicles integrats quan apliquen, sense forçar-los

**Contra**:
- Cost extra (~25% més per /ask)
- Latència extra (~1s)
- Risc que el pre-pass s'equivoqui i posi categories absurdes (mitigat amb sanity check: codes ∈ 80, intersecció amb FITXES)
- Pot fer que el chat se senti més "burocràtic" si els xips dominen visualment — mitigar amb UI subtil
- Si la prosa del LLM principal contradiu el pre-pass, l'usuari es confonia — mitigat amb la regla d'injecció (la prosa **s'articula sobre** l'esquelet, no en contra)

## 12. Iteracions futures (post-MVP)

- Corbes 3D per cicles (arcs connectats al iframe Metamodeler)
- Color-coding per rol al 3D (no només intensitat, també paleta tema/causa/resolució)
- Cache per hash de pregunta
- 𝓦 v3: redefinida com a coherència esquelet ↔ prosa + qualitat de les interpretacions
- Clic a xip de "resolució" → genera una sub-resposta breu que aprofundeix només en aquesta categoria
- Clic a cicle → mostra animació de la caminada al 3D

## 13. Decisions pendents

Cap bloquejant. Implementació pot procedir.
