Gracias por el interés. Este proyecto calcula impuestos de empresas reales, así que las reglas son un poco más estrictas de lo habitual — y todas tienen un motivo concreto.
pnpm check # sincronía de reglas + validación + 158 pruebas
pnpm build # deja apps/web/dist listoNo hace falta pnpm install para trabajar en el motor, la web ni la CLI: no hay dependencias
de producción, y CI falla si aparece alguna.
Es el cambio más delicado del repositorio. Una tasa equivocada no rompe nada visiblemente: produce números plausibles que aparecen meses después como una diferencia con el SII.
Toda modificación debe incluir, sin excepción:
- Vigencia — a qué año comercial aplica.
- Fuente oficial primaria (
source), enlazable y verificable. - Fecha de verificación (
lastVerified), el día en que abriste esa fuente. - El cambio en
packages/chile-tax-rules/rules/<año>.json. - Regenerar el módulo embebido:
node scripts/build-rules.mjs. - Una prueba que demuestre el nuevo comportamiento.
- Nota de migración si rompe un escenario existente.
Un año nuevo es un archivo nuevo. rules/2026.json describe cómo se calculaba en 2026 y
debe seguir describiéndolo para siempre: es lo que permite recalcular un período antiguo y
obtener lo que se declaró entonces, no lo que se declararía hoy.
loadRules(2027) sin rules/2027.json debe fallar. Devolver silenciosamente las reglas de
2026 sería el peor error posible de este sistema.
cp packages/chile-tax-rules/rules/2026.json packages/chile-tax-rules/rules/2027.json
# editar valores, source y lastVerified de cada regla
node scripts/build-rules.mjs
pnpm testLas pruebas de tests/rules.test.mjs exigen que toda regla numérica del año nuevo declare
fuente y fecha de verificación. Si falta una, el año no entra.
packages/company-operations/workspace.mjs corre en el navegador, en Android y en Windows.
- No importes
node:*ahí. Ni enstore.mjs,rut.mjs,accounting-engine/ochile-tax-rules/. El build falla y una prueba lo comprueba, pero conviene saber por qué: ese import deja la pantalla en blanco dentro del APK sin ningún error visible. - Lo que necesite disco va en
node-store.mjsoindex.mjs, que sólo carga Node. - Toda mutación tiene que dejar una línea en la bitácora (
this.audit(...)).
- Una vista por archivo en
apps/web/src/views/, exportando{ id, label, title, icon, render() }y opcionalmentemount(root, rerender)ybadge(). - Registrarla en
NAVdentro deapps/web/src/app.js. Hay una prueba que lo verifica. - Interpola siempre con la plantilla
htmldelib/dom.js, que escapa por defecto. Los datos los escribe el usuario y después se muestran en tablas y en la bitácora. - Sin dependencias externas ni recursos remotos: la CSP los bloquea y el APK debe funcionar sin conexión.
Si una propuesta relaja alguna de estas, la respuesta será que no, aunque el código esté bien:
- un trámite o una obligación no puede marcarse cumplida sin evidencia;
- un período cerrado no admite altas, bajas ni modificaciones;
- reabrir un período exige un motivo escrito;
- la bitácora no expone ninguna operación de borrado o edición;
- el sandbox nunca escribe en la empresa real.
Runner nativo de Node, sin framework:
node --test tests/*.test.mjsEscribe la prueba describiendo la regla de negocio, no la implementación. Compara:
test('un período cerrado es inmutable en las dos direcciones', ...) // sí
test('closePeriod pushea a closed-periods.json', ...) // noNunca subas al repositorio contabilidad real, respaldos exportados de EMPRESA REAL,
certificados digitales, claves privadas ni cartolas. El workflow de seguridad los busca en cada
push, pero el filtro de verdad eres tú. Para datos de prueba está data/scenarios/.
Ver SECURITY.md.
- Español en el código de usuario, los mensajes de error y la documentación.
- Comentarios que expliquen por qué, no qué. El qué ya está en el código.
- Mensajes de error escritos para una persona que no programó esto.
Explica qué problema resuelve y cómo lo comprobaste. Si toca una tasa, incluye el enlace a la fuente oficial en la descripción. CI debe quedar en verde antes de la revisión.