AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗PitSimulator es un prototipo de simulador visual de componentes electrónicos para experimentar con conexiones, pines y lógica básica sin necesidad de hardware físico.
El motor consulta ComponentBehaviorRegistry (ver
js/simulator/ComponentBehaviorRegistry.js)
antes de decidir cómo evaluar la señal, dibujar el componente o armar su
panel de propiedades. Esto significa que agregar un componente nuevo no
requiere editar SignalEngine.js, Renderer.js ni PropertyPanel.js
— solo se declaran archivos nuevos:
components/<tipo>/<tipo>.json — definición (pines, propiedades,
categoría). Obligatorio.
components/<tipo>/<tipo>.svg — gráfico. Obligatorio, salvo que el
componente se dibuje por código (ver usesCodeGraphic más abajo,
como neopixel_matrix/max7219).
components/<tipo>/<tipo>.hal.py — driver MicroPython que corre
dentro de QEMU y habla el protocolo por WebSocket (GPIO:, OLED:,
PININFO:, etc. — ver QemuBridge.parseLine()). Opcional: solo
hace falta si el componente necesita hardware simulado del lado del
firmware (sensor, display, bus I2C propio, etc.).
components/<tipo>/<tipo>.behavior.js — opcional. Solo hace
falta si el componente necesita algo más que "dibujar el .svg tal
cual y mostrar el panel de propiedades genérico". Se auto-registra
llamando a ComponentBehaviorRegistry.register(...), y app.js lo
carga solo (fetch dinámico basado en manifest.json — un 404 acá es
normal si el tipo no lo necesita). Forma:
ComponentBehaviorRegistry.register("mi_tipo", {
signal: {
evaluate(component, engine) { /* reemplaza evaluateXxx() */ },
},
render: {
usesCodeGraphic: false, // true = se dibuja por código, sin .svg
tag(component, graphic, renderer) { /* decorar el .svg recién cargado */ },
initialState(component, renderer) { /* estado apagado/default al crear */ },
},
propertyPanel: {
render(component, panel) { /* panel.content, panel.simulator, panel._renderCommonProperties(component) */ },
},
});
Dos tipos que comparten EXACTAMENTE el mismo comportamiento (ej.
lcd16x2/lcd_16x2_i2c, keypad3x4/keypad4x4) pueden registrarse
juntos: ComponentBehaviorRegistry.register(["tipoA", "tipoB"], behavior),
o incluso desde un solo archivo físico (ver
components/keypad4x4/keypad4x4.behavior.js — keypad3x4 no tiene
archivo propio, comparte el registro del otro).
Una línea nueva en components/manifest.json ({ type, name, category }) para que aparezca en el Toolbox.
La mayoría de los sensores/actuadores simples (que no necesitan
decorar su SVG ni tener un panel especial) no necesitan
.behavior.js en absoluto — el motor cae solo en el comportamiento
genérico (sin signal.evaluate propio, .svg sin decorar, panel
_renderGeneric).
Otras recomendaciones:
Cubre las partes de SignalEngine, Utils y Component que no dependen del
DOM, del navegador ni de QEMU — se pueden correr con Node solo, sin abrir
index.html ni levantar server.js.
npm test
(usa node --test, incluido en Node ≥ 18 — no hace falta instalar Jest,
Mocha ni nada más)
tests/signalEngine.test.js — getNet (BFS sobre cables + botones
presionados), isKeyConnectedToHighDriver, isKeyConnectedToGnd,
isComponentPowered, evaluateLed. Incluye un test que documenta a
propósito un comportamiento no definido: dos drivers en conflicto sobre
la misma net (cortocircuito real) hoy no se detecta. No es un bug — es una
decisión de diseño pendiente, dejada visible para que no se cuele por
sorpresa en un refactor futuro.tests/utils.test.js — snapToGrid (incluye test de regresión del
bug de división por cero con gridSize=0 que ya está resuelto en el
código real, para que no vuelva), computeElbow, normalizeHex,
lightenColor, clamp, generateId.tests/component.test.js — getPinPosition con rotación, flip, y
ambos combinados (es la matemática más fácil de romper sin darse cuenta
en un refactor de Component.js, y no tenía ningún test). Incluye test
de regresión del bug x=0 (|| vs ??) ya corregido en el código real.lib/SignalEngineCore.js — por qué existeEs una copia textual (sin reescribir ni una línea) de los métodos de
SignalEngine.js que no tocan renderer/DOM. Se separó así por dos
motivos:
getNet) con
Node puro, sin mockear todo un navegador.ComponentBehaviorRegistry en la conversación de diseño) — este archivo
es, en chiquito, la prueba de que esa separación es viable sin romper
nada: los 15 tests de signalEngine.test.js pasan exactamente igual
con la lógica aislada del resto.Importante: si SignalEngine.js cambia alguno de estos métodos en el
código real, lib/SignalEngineCore.js hay que actualizarlo a mano para que
siga siendo un espejo fiel — no está importado automáticamente del archivo
real (para no arrastrar sus dependencias de window/DOM). El paso
siguiente natural es que estos métodos vivan en su propio archivo sin
mezcla de DOM en el proyecto real, y ahí lib/SignalEngineCore.js deja de
hacer falta: se importa directo.
evaluateL298n / _computeL298nMotorState (lógica de puente H, tiene
varias combinaciones IN1/IN2/enable que se prestan a tests de tabla).isWiredToDeclaredPins (la validación de PININFO contra el cableado
real).WireManager.movePointWithConstraint / Utils.buildOrthogonalPoints
(geometría de ruteo de cables).