Commit graph

3 commits

Author SHA1 Message Date
Ouroboros
c8869d41af One way to point at a Project: the reference door
"Take me to the Project this belongs to" was drawn six ways in the Main
transcript, in three looks: a card bar reading `in project ↗` or `running in
background ↗`, a pill with the Project's name, and a grey button reading
`Open Project ↗` — or `Open Project` with no arrow and a `title` the factory
silently dropped. Each call truthfully reused a shared primitive, which is why
no review, guard or document saw it: the callers still chose the label, the
glyph and the class.

`web/modules/project_reference.js` is now the only module that builds that
control and the only one that raises `ouro:open-project`. Callers pick a
layout (`inline`, `bar`, `footer`) and, for the converted card, the one closed
state; they pass no label and no class name. The reference names the Project
(a row that was never named reads `Project`, never its id), says the same
thing to a screen reader as to the eye, and carries a late-arriving name into
its text, its accessible name and its press alike.

The bound footer, the converted card, the question mirror, the completion
mirror, the System lifecycle rows and the routed owner message all use it.
`renderProjectChip` and `createSystemMessageAction` are gone with their CSS.
The durable row text, the event payload and the listener are unchanged.
2026-09-21 01:40:41 +03:00
Ouroboros
12c0709eaf fix(chat): fade the folded Project answer after a hidden-page mount
A completion mirror mounted while Chat is not the visible page has no layout
box, so the one-shot measurement read 0/0 and the long answer stayed clamped
without the fade that says "there is more". The row is now left unmarked
until it has a box, and one pair of window listeners re-measures every mirror
when a page is shown or the viewport is resized.

Review round fixes in the same batch:
- browser test: mount on #dashboard, open Chat, expect the fade (fails on
  the previous module);
- node test: the mirror replays from history byte-identical to the live row;
- architecture/03 and DESIGN no longer contradict the mirror paragraph;
- the producer comment names where the model's answer rides.
2026-09-20 18:59:30 +03:00
Ouroboros
46581328a4 Main shows a finished Project's answer as an ordinary Ouroboros message
When a Project root ended with a model-authored final answer, Main drew a
yellow System pointer (status word, a host clause, Open Project) and none
of the result: the owner had to open every Project to learn what happened.

The completion row now carries that answer whole in one additive typed key,
completion_answer, stamped only for terminal_origin=model_final, a settled
phase and a non-empty answer within MIRRORED_ANSWER_MAX_CHARS; otherwise the
key is absent and nothing is ever cut host-side. The row's plain text is
byte-identical, so the Telegram mirror, Ouroboros's own Main context, older
clients and one-ending-one-notification are unchanged.

The browser feeds the answer to the ordinary addMessage path as an assistant
message (keys, history, session snapshot, Copy and disposal are the ordinary
message's) and project_answer.js adds a CSS fold of about seven lines, with a
fade only when it hides text, and the Project chip that names and opens the
Project. Endings without an answer, start rows and older rows keep the System
row and its Open Project action. chat.js shrinks by 201 bytes.
2026-09-20 18:26:15 +03:00