gioser

tawasuyu/brahman

Rust 575TOML 218Markdown 68JSON 198402 Sutichaykuna

⎇ 7bdc26e61a68bc0a878122ce6659f0020a56af4e CHANGELOG.md Markdown · 331 siq'ikuna · 16.8 KB Ñawpa willay ch'uya

feat(nouser): Phase A — mecanismo determinista de Mónadas 7bdc26e61 · Sergio ·

1# Changelog
2
3Registro cronológico de cambios sustantivos en el monorepo Brahman. Cada
4entrada lista las acciones concretas tras un commit; para detalles de
5ratio/diff ver `git show <sha>`.
6
7## 2026-05-08
8
9### feat(nouser): Phase A — mecanismo determinista de Mónadas
10Primer trozo del módulo Nouser (Kairos): explorador de Mónadas como
11"imanes semánticos" sobre el filesystem. Phase A cubre el 90% de los
12casos sin tocar IA — sólo metadatos y heurísticas.
13
14Crates nuevos:
15
16- `crates/modules/nouser/card`: `MonadManifest` (la Tarjeta de
17  Presentación de una Mónada — espejo conceptual de `brahman::Card`
18  pero para datos, no para procesos runtime). Campos: id (Ulid),
19  label, summary, centroid (vacío en Phase A), keywords, cardinality,
20  entropy [0,1], dominant_lens, pins, members, timestamps,
21  extensions (forward-compat). 6 tests de validación + JSON roundtrip.
22- `crates/modules/nouser/core`: pipeline determinista.
23  - `scanner`: walkdir → `Vec<FileEntry>` con metadatos (path, size,
24    mtime, extension). Skipea hidden por default. Configurable max
25    depth y follow_links.
26  - `cluster::by_directory`: agrupa por parent dir, mínimo 3 archivos
27    para promover a Mónada (configurable). Calcula keywords (top-N
28    extensiones por frecuencia + alfabético), elige `Lens` dominante
29    (Code/Gallery/Markdown/Database/Grid) según extensión más
30    frecuente, computa entropía de Shannon normalizada [0,1].
31  - `db`: `MonadDb` en memoria con índices BTreeMap files/monads y
32    `resolve_members(monad_id)` que filtra IDs huérfanos. Phase B
33    traerá persistencia.
34  - bin `nouser`: subcomandos `scan <dir>`, `show <dir> <prefix>`,
35    `json <dir>`. Env var `NOUSER_MIN_FILES` para tunear el threshold.
36  - 13 tests (4 scanner + 6 cluster + 3 db).
37
38Demo end-to-end:
39
40  $ nouser scan crates
41  scan: 255 archivos en crates, 19 mónadas (min_files=3)
42    [01KR4C13]  src                             card=12  ent=0.00  lens=Code
43             keywords: rs
44    [01KR4C13]  tests                           card=14  ent=0.00  lens=Code
45             keywords: rs
46    [01KR4C13]  fixtures                        card=5   ent=0.00  lens=Grid
47             keywords: rhai
48    ...
49
50  $ nouser show crates 01KR4C
51  Monad 01KR4C1370DVF6NMTW6SECNXAF
52    label:       src
53    summary:     4 archivos en crates/modules/nouser/core/src (ext: rs)
54    cardinality: 4
55    entropy:     0.0000
56    lens:        Code
57    members (4):
58            4132 bytes  crates/modules/nouser/core/src/db.rs
59            ...
60
61Pendientes para próximas fases (anotados, no urgentes):
62- **Phase B**: bin `nouser daemon` que sidecarea a brahman-init
63  declarando flows (`scan-request:json` → `monad-update:json`).
64- **Phase C**: pseudo-embeddings deterministas (hash de path/ext/size
65  a 32-d) + atracción por centroide via cosine similarity. Implementa
66  el "imán" sin LLM.
67- **Phase D**: módulo `nouser-nous` aparte para el LLM real
68  (Llama/ONNX). En `priority_contexts.test` el Init pinea a
69  `mock-nous` (embeddings determinísticos); en `prod` a `real-nous`.
70- **Polish**: labels de Mónada incluir 2-3 componentes del path para
71  desambiguar `src/` repetidos en monorepo.
72
73Workspace: 0 errores, 0 warnings. Tests acumulados: 58
74(card 11, broker 15, handshake codec+transport 2 + integ 7,
75card-wit 4, admin 0, nouser-card 6, nouser-core 13).
76
77### feat(broker): priority contexts — biases per-contexto operativo
78- `brahman-card::ContextBias { pin_to: Option<String>, priority_offset: i8 }`
79  declara un override per-contexto.
80- `Card.priority_contexts: BTreeMap<String, ContextBias>` y mismo en
81  `WireCard` (cruza el wire). Las conversiones `From` lo propagan.
82- `BrokerConfig.current_context: Option<String>`. Cuando el broker corre
83  bajo un contexto y una Card declara biases para ese nombre, se aplican:
84  - Como **consumidor**: `pin_to` sobreescribe el `Flow.pin_to` estático.
85  - Como **productor**: `priority_offset` se suma a la priority base
86    (clamp en `[Low=0, Critical=3]`) para el ranking.
87- `BrokeredCard` propaga `priority_contexts`. `find_producer_for` usa
88  `effective_priority(card)` y `effective_pin(card, input)` antes de
89  los tiebreaks.
90- `brahman-admin::AdminConfig.current_context` + `StatusSnapshot.current_context`
91  espejan el contexto activo. `brahman-status` lo imprime como
92  `Context: <nombre>` justo debajo de `Init: ...`.
93- `ente-zero` lee `BRAHMAN_BROKER_CONTEXT` env var y la propaga al
94  broker y al admin. Sin var, biases per-contexto inactivos.
95- 4 tests nuevos en brahman-broker:
96  `context_priority_offset_lifts_producer_above_alphabetic_winner`,
97  `context_pin_to_overrides_static_pin`, `unknown_context_no_op`,
98  `priority_offset_clamps_to_critical`.
99- Validación end-to-end: `BRAHMAN_BROKER_CONTEXT=test ente-zero` →
100  `brahman-status` muestra `Context: test`.
101
102### feat(card): WireCard + extensions — forward-compat sin romper postcard
103- `Card.extensions: BTreeMap<String, serde_json::Value>` restaurado con
104  `#[serde(flatten, default, skip_serializing_if = is_empty)]`. Los
105  campos JSON/TOML desconocidos sobreviven el roundtrip de archivos.
106- Nuevo `WireCard`: proyección postcard-friendly (sin `extensions`,
107  `genesis: Vec<WireCard>` recursivo). Conversiones `From<Card>` y
108  `From<WireCard>` con descarte/recreación de extensions.
109- `brahman-handshake::Hello.card` pasa de `Card` a `WireCard`. Client
110  hace `card.into()` antes de enviar; Server hace `hello.card.into()`
111  para volver a Card antes de validar/registrar.
112- 3 tests nuevos en brahman-card:
113  `extensions_preserved_in_json_roundtrip`,
114  `wire_card_roundtrip_strips_extensions`,
115  `wire_card_postcard_friendly` (postcard encode/decode efectivo).
116- brahman-card gana `postcard` como dev-dep para el último test.
117- Contrato documentado: extensions = anotaciones locales que NO cruzan
118  al Init; sólo viven en archivos.
119
120### `9420eae` chore: limpia warnings dead-code en arje (commit del usuario)
121- `ente-zero/src/events.rs`: `#![allow(dead_code)]` a nivel módulo —
122  es vocabulario de eventos con variantes/campos reservados para flujos
123  no cableados aún (CapabilityRequested, ShutdownReason::Signal,
124  CapabilityGrant::{Granted, Denied, QuotaExceeded}, ExitStatus
125  fields).
126- `ente-zero/src/graph/mod.rs`: comentado el re-export ahora innecesario
127  de `SHUTDOWN_GRACE`. `DEFAULT_GRANT_TTL` con `#[allow(dead_code)]`
128  + nota "reservado para capability granting".
129- `ente-zero/src/graph/capabilities.rs`: `renew_grant` con
130  `#[allow(dead_code)]` (capability renewal pendiente).
131- `ente-kernel/src/surface.rs`: drop de `use anyhow::Context` (no se
132  usaba).
133- `ente-hostnamed-compat/src/main.rs`: drop de `Connection` (no se
134  usaba).
135- `ente-polkit-compat/src/main.rs`: `PolicyDecision.source` con
136  `#[allow(dead_code)]` (sólo aparece en `Debug` para logging).
137- `cargo check --workspace`: 17 warnings → 0.
138
139### feat(sidecar): WIT al sidecar — módulos conscientes vivos
140- `brahman-card::WitInterface` deriva `Serialize`, `Deserialize`,
141  `PartialEq`, `Eq` para cruzar el wire postcard.
142- `brahman-handshake::Hello` lleva `wit: Option<WitInterface>`. Server
143  usa `ResolvedCard::from_conscious` cuando viene presente, `from_agnostic`
144  cuando no.
145- `brahman-handshake::Client::connect` queda como wrapper agnóstico de
146  `connect_with(path, card, wit: Option<WitInterface>)`.
147- `brahman-broker::Broker::register` ahora toma `Option<WitInterface>`
148  como tercer arg. `BrokeredCard` guarda el wit. 25 sitios de tests
149  actualizados con `, None`.
150- `brahman-sidecar::SidecarConfig` con campo `wit`. Helpers nuevos:
151  `SidecarConfig::new(card).with_wit(wit)` y `spawn_conscious(card, wit)`.
152  El log `attached` reporta `conscious=true|false`.
153- `brahman-status` muestra marker 🧠 + sección `wit:` (package/world,
154  imports, exports) por sesión consciente.
155- Example nuevo `crates/shared/brahman-sidecar/examples/presence-conscious.rs`:
156  toma label + path .wit (default `shared_wit/protocol.wit`), parsea
157  con brahman-card-wit, spawna sidecar consciente.
158- Validado end-to-end:
159  ```
160  $ presence-conscious demo.conscious shared_wit/protocol.wit &
161  $ brahman-status
162  Sessions (1):
163    01K... demo.conscious 🧠  lifecycle=Daemon
164        wit: brahman:protocol@0.1.0 / module
165             imports: types, handshake, lifecycle
166             exports: run
167  ```
168
169### feat(core): brahman-card-wit — extractor opcional de contratos WIT
170- Crate nuevo `crates/core/brahman-card-wit` con `wit-parser = "0.230"`.
171- API: `parse_wit(source)` y `parse_wit_file(path)` devuelven
172  `Vec<WitInterface>` (uno por `world` declarado).
173- Interfaces importadas/exportadas (no sólo funciones) se resuelven
174  por nombre via `resolve.interfaces[id].name`.
175- Example `crates/core/brahman-card-wit/examples/brahman-wit-info.rs`
176  CLI: `brahman-wit-info shared_wit/protocol.wit` → lista paquete,
177  worlds, imports y exports.
178- 4 tests: inline, archivo real (`shared_wit/protocol.wit`), parse
179  error, world vacío.
180- Validado contra `protocol.wit`: detecta worlds `module` y
181  `admin-host` con sus imports/exports correctos.
182
183### `7b589b8` chore: agrega CHANGELOG.md retroactivo
184- `CHANGELOG.md` en la raíz con los 11 commits previos documentados
185  acción por acción. A partir de este punto, cada cambio sustantivo
186  actualiza también este archivo en el mismo commit.
187
188### `8a83a26` feat(handshake): notificación push de matches
189- Frame `MatchEvent { kind: Available | Lost, ... }` añadido al protocolo.
190- `Session::run_post_handshake` usa `tokio::select!` para multiplexar
191  reads del cliente y un canal `mpsc` push del server.
192- Server: `SessionTxTable` (Arc<Mutex<HashMap<SessionId, Sender<Frame>>>>)
193  y `LastMatches` para diff por sesión. `broadcast_match_diffs` corre
194  tras cada `register` y `unregister`, emite sólo los cambios.
195- Capacity del canal push: 32 (ephemeral, `try_send` non-blocking).
196- Client: `VecDeque<MatchEvent>` interno, `take_event()` (non-blocking)
197  y `await_event(timeout)`. `ping()` ahora drena MatchEvents intermedios
198  hasta encontrar el Pong.
199- Example `crates/core/brahman-handshake/examples/subscriber.rs`.
200- Test `match_event_pushed_on_producer_arrival` (handshake integ 6→7).
201
202### `70a7a0d` feat: segundo módulo (nakui) + admin API + brahman-status
203- Crate nuevo `crates/shared/brahman-sidecar` (DRY del thread + tokio +
204  ping loop). API: `spawn(card)` / `spawn_with_handle(config)`.
205- `nakui` cmd_run llama `brahman_sidecar::spawn` antes de `run_server`.
206  Card: lifecycle Daemon, supervision Restart, flow `command` (json) /
207  `report` (json).
208- Crate nuevo `crates/core/brahman-admin` con `StatusSnapshot` JSON
209  line-delim, `AdminServer` y `client::query`.
210- ente-zero levanta también el AdminServer en `primordial_loop`.
211- Example `crates/shared/brahman-sidecar/examples/presence.rs`
212  (módulo dummy long-lived parametrizable por label).
213- Example `crates/core/brahman-admin/examples/brahman-status.rs`
214  (CLI que pretty-printa el snapshot).
215- `brahman-broker`: `BrokeredCard` ahora incluye `lifecycle`. `Endpoint`
216  y `Match` derivan `Serialize`/`Deserialize`. Nuevo `Broker::cards()`
217  iterador.
218- `brahman-card`: `pub use ::ulid` para que módulos no dependan de ulid.
219- yahweh-shell migrado al sidecar compartido (96→53 LOC).
220
221### `595f68e` feat(yahweh-shell): primer módulo brahman vivo
222- yahweh-shell spawnea sidecar antes de `Application::new()`.
223- Card declarada: label `brahman.ui_engine`, lifecycle Widget,
224  supervision Delegate, payload Virtual, flow input `render-data`
225  (json) / output `user-intent` (json).
226- Sidecar en thread aparte con tokio current_thread runtime,
227  desacoplado del runtime GPUI.
228
229### `df9d10c` feat(ente-zero): enchufa el handshake server al Init real
230- ente-zero levanta `brahman_handshake::server::Server::bind` en
231  `primordial_loop` después del ente-bus, con degradación grácil
232  si bind falla (mismo patrón que uevents).
233- Nuevo módulo `brahman-handshake/src/transport.rs`: helper
234  `default_socket_path()` con resolución `BRAHMAN_INIT_SOCKET` →
235  `XDG_RUNTIME_DIR` → `TMPDIR`.
236- Example `crates/core/brahman-handshake/examples/probe.rs`.
237- Validación end-to-end manual: probe contra ente-zero vivo
238  imprime `HelloAck: session=... init_attached=true`.
239
240### `07d77a3` feat(handshake): integra el broker con el ciclo de sesiones
241- `ServerConfig` acepta `Option<Arc<Mutex<Broker>>>`.
242- `register_session` indexa la Card en el broker y la `SessionRegistry`
243  antes de emitir HelloAck.
244- `Session::handle` refactor a `do_handshake → run_post_handshake →
245  cleanup` con cleanup unificado (broker + sessions).
246- Tests integ nuevos: `broker_registers_and_unregisters_with_session`
247  y `broker_matches_two_live_modules`.
248- Fix colateral: `brahman-card::TypeRef` pasa de internally-tagged
249  (`#[serde(tag = "kind")]`) a externally-tagged. Postcard no soporta
250  internally-tagged en formatos no self-describing. JSON cambia de
251  `{"kind":"primitive","name":"x"}` a `{"primitive":{"name":"x"}}`.
252
253### `5091106` feat(core): brahman-broker — matching híbrido
254- Crate nuevo `crates/core/brahman-broker`.
255- 3 estrategias de matching: `Exact`, `Structural`, `ExactThenStructural`
256  (default). Devuelven `Match::via` con la estrategia que ganó.
257- Override `pin_to`: el consumer pide un productor por label; si la
258  pista no resuelve, cae en type-search.
259- Tiebreak por `Card.priority` desc, luego `label` asc (estable y
260  determinista).
261- API: `register`, `unregister`, `find_producer_for`, `all_matches`,
262  `cards`, `sessions`, `len`, `is_empty`.
263- 11 tests (matching, pin_to, priority, no-self-loops, all-matches).
264
265### `814390f` feat(core): brahman-handshake — protocolo runtime
266- Crate nuevo `crates/core/brahman-handshake` con server y client
267  Rust↔Rust sobre Unix socket.
268- Frames length-prefixed (4 bytes LE) + cuerpo postcard.
269- Mensajes: `Hello`, `HelloAck`, `Ping`, `Pong`, `Farewell`, `Error`.
270- `MAX_FRAME_BYTES = 4 MiB` para evitar reservas absurdas.
271- Tradeoff: drop `extensions`/`extra` de Card por incompat
272  postcard ↔ `serde_json::Value`. Forward-compat queda en
273  `schema_version` + `protocol_version` negotiation.
274- 4 tests integ + 1 unit en codec.
275
276### `ed0e973` refactor(arje): migra ente-card a re-export de brahman-card
277- `ente-card/src/lib.rs` reescrito como crate-shim de re-export
278  (327 LOC → 25 LOC).
279- `EntityCard` ≡ `brahman_card::Card` por type alias.
280- `ente-card/Cargo.toml`: deps reducidas a `brahman-card`.
281- `Card` impl `Default` (Ulid::nil(), label vacío) para que
282  `..Default::default()` funcione en struct-literals.
283- 4 sitios en `ente-zero/src/seed.rs` actualizados con
284  `..Default::default()` para los campos aditivos.
285- Los 21 consumidores arje compilan sin tocar fuente.
286
287### `0feba74` feat(core): brahman-card — Tarjeta canónica híbrida
288- Crate nuevo `crates/core/brahman-card`.
289- Hereda de arje: `id: Ulid`, `lineage`, `Capability` tipado,
290  `Payload::{Wasm, Native, Virtual, Legacy}`, `SomaSpec`
291  (namespaces, cgroups, rlimits, cpu_affinity), `Supervision`
292  (Restart con backoff, OneShot, Delegate), `genesis` recursivo.
293- Aditivo brahman: `Permissions` enumerados (`NetworkingPolicy`,
294  `FsPolicy`, `IpcPolicy`), `Lifecycle` ortogonal a Supervision,
295  `Priority` de scheduling, `Flows` con `TypeRef` discriminado
296  (Primitive | Wit), `pin_to` opcional.
297- `TrustLevel` derivado de `Permissions` (no declarado).
298- `ResolvedCard { card, wit: Option<WitInterface>, trust }`.
299- Soporta JSON (canónico) + TOML (auto-detectado por extensión).
300- 8 tests incluido `arje_seed_format_compatible` que valida que
301  el JSON de arje sigue parseando con defaults para los aditivos.
302
303### `4d50bfc` chore: absorbe nakui (ERP matemático) en modules/nakui
304- `~/nakui` → `crates/modules/nakui/{core,modules}`.
305- `core/`: el crate `nakui-core` con 4 bins (nakui, demo,
306  inventory_demo, sales_demo) y tests.
307- `modules/{inventory,sales,treasury}/`: data declarativa
308  (`nsmc.json`, `schema.k`, `morphisms/`) que el crate consume.
309  No son crates Cargo.
310- Deps directas (no `workspace = true`): thiserror v1, surrealdb,
311  rhai, petgraph. No conflicto con el resto del workspace.
312
313### `53dbdf0` chore: monorepo inicial con arje + minga + yahweh absorbidos
314- 45 crates absorbidos en 4 ejes:
315  - `crates/core/`: 24 crates de arje (Init systemd-compatible:
316    `ente-card`, `ente-zero`, `ente-kernel`, `ente-bus`, `ente-cas`,
317    `ente-soma`, `ente-wasm`, `ente-snapshot`, `ente-brain`,
318    `ente-echo`, `ente-policy-provider`, + 12 `*-compat`).
319  - `crates/modules/semantic_dht/`: 5 crates de minga (`minga-core`
320    con AST/CAS/MST, `minga-p2p` con libp2p Kad, `minga-store`,
321    `minga-vfs`, `minga-cli`).
322  - `crates/modules/ui_engine/`: 11 crates de yahweh (libs/{core,
323    theme, bus, providers}, widgets/{tree, splitter, tabs, tiled,
324    container_core, text_input}).
325  - `crates/apps/`: 5 crates de yahweh (file_explorer,
326    database_explorer, text_viewer, image_viewer, yahweh-shell).
327- `shared_wit/protocol.wit` con handshake/lifecycle inicial.
328- `Cargo.toml` unificado: thiserror bumped a 2 (transparente para
329  arje), tokio "full", paths intra-workspace de yahweh redirigidos.
330- `cargo check --workspace`: 0 errores (sólo dead-code warnings
331  preexistentes en ente-zero).

CHANGELOG.md

Changelog

Registro cronológico de cambios sustantivos en el monorepo Brahman. Cada entrada lista las acciones concretas tras un commit; para detalles de ratio/diff ver git show <sha>.

2026-05-08

feat(nouser): Phase A — mecanismo determinista de Mónadas

Primer trozo del módulo Nouser (Kairos): explorador de Mónadas como "imanes semánticos" sobre el filesystem. Phase A cubre el 90% de los casos sin tocar IA — sólo metadatos y heurísticas.

Crates nuevos:

Demo end-to-end:

$ nouser scan crates scan: 255 archivos en crates, 19 mónadas (min_files=3) [01KR4C13] src card=12 ent=0.00 lens=Code keywords: rs [01KR4C13] tests card=14 ent=0.00 lens=Code keywords: rs [01KR4C13] fixtures card=5 ent=0.00 lens=Grid keywords: rhai ...

$ nouser show crates 01KR4C Monad 01KR4C1370DVF6NMTW6SECNXAF label: src summary: 4 archivos en crates/modules/nouser/core/src (ext: rs) cardinality: 4 entropy: 0.0000 lens: Code members (4): 4132 bytes crates/modules/nouser/core/src/db.rs ...

Pendientes para próximas fases (anotados, no urgentes):

Workspace: 0 errores, 0 warnings. Tests acumulados: 58 (card 11, broker 15, handshake codec+transport 2 + integ 7, card-wit 4, admin 0, nouser-card 6, nouser-core 13).

feat(broker): priority contexts — biases per-contexto operativo

feat(card): WireCard + extensions — forward-compat sin romper postcard

9420eae chore: limpia warnings dead-code en arje (commit del usuario)

feat(sidecar): WIT al sidecar — módulos conscientes vivos

feat(core): brahman-card-wit — extractor opcional de contratos WIT

7b589b8 chore: agrega CHANGELOG.md retroactivo

8a83a26 feat(handshake): notificación push de matches

70a7a0d feat: segundo módulo (nakui) + admin API + brahman-status

595f68e feat(yahweh-shell): primer módulo brahman vivo

df9d10c feat(ente-zero): enchufa el handshake server al Init real

07d77a3 feat(handshake): integra el broker con el ciclo de sesiones

5091106 feat(core): brahman-broker — matching híbrido

814390f feat(core): brahman-handshake — protocolo runtime

ed0e973 refactor(arje): migra ente-card a re-export de brahman-card

0feba74 feat(core): brahman-card — Tarjeta canónica híbrida

4d50bfc chore: absorbe nakui (ERP matemático) en modules/nakui

53dbdf0 chore: monorepo inicial con arje + minga + yahweh absorbidos