Saltar al contenido principal

CLI de operador: intenciones y grants

Desde v0.12.0 el binario korvun lleva las herramientas de autoridad del operador: contratos de intención (qué autorizas, con límites) y grants de autoridad (quién puede actuar bajo una intención, con menos). Trabajan contra la misma base de datos local que usa el servidor, con acceso breve y seguro sobre WAL — puedes usarlas mientras Korvun sirve.

Cada mutación deja un recibo identificado en el registro de acciones: tú como principal, evidencia loopback en proceso y una regla de auditoría finita — operator para tus actos, attenuation_violated para una delegación que el muro rechazó. Los rechazos también se registran: el rastro dice por qué.

Intenciones​

Un contrato de intención declara un resultado autorizado y sus límites: un propósito en palabras, un conjunto de operaciones, un conjunto grueso de recursos, un presupuesto de acciones opcional y una ventana de validez opcional.

korvun intent create --config korvun.json \
--purpose "test week" \
--operations calc,time \
--max-actions 10 \
--expires 2026-09-06T20:00:00Z

Imprime el id nuevo (int_…) en DRAFT. Flags: --purpose y --operations (separadas por comas) son obligatorias; --resources vale * por defecto; --max-actions 0 significa ilimitado; --valid-from por defecto es ahora; sin --expires no hay caducidad.

korvun intent activate --config korvun.json int_…
korvun intent revoke --config korvun.json int_…
korvun intent list --config korvun.json
korvun intent show --config korvun.json int_…

El ciclo de vida falla cerrado y se camina desde el estado ALMACENADO: DRAFT → ACTIVE → EXPIRED | REVOKED. Lo terminal es terminal — reactivar una intención revocada falla honestamente, y el intento fallido deja su recibo. show incluye el digest del contrato: un hash determinista de los TÉRMINOS (el estado queda fuera — revocar cierra la vida del contrato, no reescribe su identidad).

Grants​

Un grant da a un principal autoridad acotada bajo una intención.

korvun grant issue --config korvun.json \
--intent int_… \
--subject principal_brain_default \
--operations calc \
--max-actions 5 \
--depth 1

La intención debe estar EN VIGOR en el instante de emisión: una intención DRAFT deniega con intent_inactive, una ventana caducada con intent_expired — el reloj gana a un estado rancio, y el rechazo queda registrado.

korvun grant delegate --config korvun.json \
--parent grant_… \
--subject principal_ch_telegram \
--operations calc

Delegar traspasa autoridad — y la autoridad solo puede menguar. El hijo hereda la intención, la caducidad y el presupuesto del padre salvo que los estreches con flags, lo emite el subject del padre con profundidad padre − 1, y debe ser subconjunto de su padre en TODAS las dimensiones: operaciones, recursos, presupuesto, caducidad, ventana de validez, profundidad. Un hijo que amplía se deniega nombrando la dimensión ampliada y jamás toca el disco. El mismo muro gobierna al propio kernel — la CLI del operador no tiene aquí ningún poder especial.

korvun grant revoke --config korvun.json grant_…

Un grant revocado ya no delega nada (authority_revoked).

Techos de efecto (v0.13.0)​

Un grant puede llevar un techo de efecto: la clase de consecuencia más alta que su autoridad puede alcanzar, sobre la escalera pure < read_external < write_reversible < write_compensatable < write_irreversible < critical.

korvun grant issue --config korvun.json \
--intent int_… \
--subject principal_brain_default \
--operations calc \
--effect-ceiling read_external

Delegar también tiene que menguar aquí: el hijo hereda el techo del padre salvo que lo estreches, y un hijo que alcance POR ENCIMA se deniega nombrando effect_ceiling — la décima dimensión de la atenuación, juzgada por el mismo validador en todas partes. Bajo un grant con techo (autoridad acotada), las acciones write_irreversible y critical exigen además aprobación humana — que, hasta que llegue el workflow de aprobación, muere con el no honesto approval_unavailable. Los grants sin techo (la autoridad permanente de la raíz y los derivados de config) se comportan exactamente como antes.

El verificador (v0.14.0)​

Desde v0.14.0 cada desenlace terminal deja un recibo firmado en una cadena hash de solo-añadir, y la CLI lleva al juez.

korvun receipt verify --config korvun.json rcpt_…

Un recibo (o todos los de un id act_…), re-juzgado offline contra el fichero del store con siete checks nombrados: roundtrip canónico, recomputación del hash, firma Ed25519 contra la clave pública REGISTRADA, la ventana de validez de la clave, el eslabón de cadena con su predecesor y la coherencia con la fila de la acción. Cada fallo lleva su nombre (hash_mismatch, signature_invalid, custody_mismatch, …) — jamás un «invalid» genérico.

korvun ledger check --config korvun.json

La cadena entera, estructura primero: un recibo borrado se denuncia por su hueco (chain_seq_gap con la posición que falta), una posición clonada como chain_seq_duplicate, y después cada eslabón por los mismos siete checks — el PRIMER eslabón roto detiene el veredicto con su id de recibo y su motivo.

korvun receipt rotate-key --config korvun.json

Rotación atómica retira-y-activa de la clave de firma del perfil. El acto de rotación deja SU PROPIO recibo sellado con la clave NUEVA; las claves retiradas se conservan para siempre, así cada era de la cadena verifica con la clave de su era. La verificación es de solo lectura; el alcance honesto está documentado: el libro es tamper-evident, jamás «immutable» — el operador controla almacenamiento y claves.

Leer el rastro​

Los recibos viven en el registro de acciones junto a todas las demás acciones registradas. Cada fila lleva sus columnas de identidad — principal, intención, autoridad — y su evidencia por intento (proveedor, clase de credencial, subject). Nunca se almacena material secreto: las CLASES de credencial son un enum finito por construcción.