{
  "version": 1,
  "updated": "2026-10-24",
  "sprint": {
    "name": "Instawards Chile",
    "day1": "2026-10-19",
    "day30": "2026-11-17",
    "tz": "America/Santiago",
    "code_freeze": "2026-11-06",
    "run": { "from": "2026-11-08T03:00:00Z", "to": "2026-11-15T03:00:00Z" }
  },
  "labels": {
    "sim": { "es": "Entrada simulada · Stellar testnet", "en": "Simulated input · Stellar testnet" }
  },
  "anchor": {
    "account": null,
    "target": { "low": 2, "med": 2, "high": 3, "signers": 3, "signer_weight": 1, "master_weight": 0 }
  },
  "feeds": [
    { "id": "ensayo-8oct", "base": "/evidence/feeds/ensayo-8oct/", "label": "testnet", "prior": true,
      "title": { "es": "Ensayo del 8 oct", "en": "8 Oct rehearsal" },
      "note": { "es": "Dos lotes anclados en Stellar testnet en una cuenta desechable (pruebas C y L). Entrada simulada · Stellar testnet.", "en": "Two batches anchored on Stellar testnet on a throwaway account (tests C and L). Simulated input · Stellar testnet." } },
    { "id": "muestra", "base": "/evidence/feeds/muestra/", "label": "prototipo", "prior": false,
      "title": { "es": "Feed de muestra", "en": "Sample feed" },
      "note": { "es": "Un día simulado en el formato actual, con intervalos rechazados y sus motivos. No está anclado: no enviamos transacciones.", "en": "A simulated day in the current format, with refused intervals and their reasons. Not anchored: we send no transactions." } },
    { "id": "corrida", "base": null, "label": "planificado", "prior": false,
      "title": { "es": "Feed público de la corrida", "en": "Public run feed" },
      "note": { "es": "Los lotes de la cuenta definitiva, en el repositorio público de evidencia. En preparación (semana 2).", "en": "The real account's batches, in the public evidence repository. In preparation (week 2)." } }
  ],
  "tests": {
    "worked_example": {
      "abcd": "/evidence/rehearsal/rehearsal-2026-10-08T20-46-13-037Z.json",
      "independence": "/evidence/e2e/e2e-2026-10-08T20-50-44-831Z.json"
    }
  },
  "weeks": [
    { "n": 0, "id": "previo", "from": "2026-08-22", "to": "2026-10-18",
      "title": { "es": "Trabajo previo", "en": "Prior work" },
      "summary": { "es": "Prototipo del hackathon de agosto 2026 y el trabajo anterior al Día 1: público, rotulado y no financiado por el programa.", "en": "The August 2026 hackathon prototype and the work before Day 1: public, labeled and not funded by the programme." },
      "changelog": null, "release": null, "highlights": [] },
    { "n": 1, "id": "s1", "from": "2026-10-19", "to": "2026-10-23",
      "title": { "es": "Semana 1", "en": "Week 1" },
      "summary": { "es": "Seis formas de engañar al verificador, cerradas; pruebas 154 → 194; umbrales 2/2/3 decididos; acuerdo de arquitectura v3.", "en": "Six ways to fool the verifier, closed; tests 154 → 194; thresholds 2/2/3 decided; architecture freeze v3." },
      "changelog": { "en": "Week 1 — 19 to 23 October 2026", "es": "Semana 1 — 19 al 23 de octubre de 2026" },
      "release": "https://github.com/academiaseul/QWATT/releases/tag/semana-1",
      "highlights": [
        { "id": "h-fallas", "status": "done", "label": "prototipo", "live": null,
          "title": { "es": "Dos formas de engañar a nuestro propio verificador, cerradas", "en": "Two ways to fool our own verifier, closed" },
          "text": { "es": "Falla 1, «el total heredado»: el verificador ahora recorre la cadena hasta el último lote anclado y recalcula cada huella y cada total. Falla 2, «la misma energía, dos veces»: se rechazan intervalos repetidos, superpuestos, fuera de la grilla de 5 minutos o de otra instalación. En rojo en el CI antes del arreglo, en verde después.", "en": "Flaw 1, \"the inherited total\": the verifier now walks back to the last anchored batch and recomputes every fingerprint and total. Flaw 2, \"the same energy, twice\": repeated, overlapping, off-grid or other-installation intervals are refused. Red in CI before the fix, green after." },
          "evidence": [
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/7" },
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/5" },
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/1" },
            { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39589564074", "result": "red" },
            { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39589526847", "result": "red" },
            { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593831385", "result": "green" },
            { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593847463", "result": "green" } ] },
        { "id": "h-revision", "status": "done", "label": "prototipo", "live": null,
          "title": { "es": "Cuatro más, encontradas al revisar esos arreglos; y el anclaje ya no puede quedar detenido", "en": "Four more, found by reviewing those fixes; and anchoring can no longer stall for good" },
          "text": { "es": "DV-1 a DV-4 cierran otras formas de contar dos veces la misma energía. Además, el anclaje ya no puede quedar detenido para siempre después de muchos lotes rechazados seguidos (nuevo código verifier.walk_too_long).", "en": "DV-1 to DV-4 close other ways to count the same energy twice. Also, anchoring can no longer stop for good after a long run of rejected batches (new code verifier.walk_too_long)." },
          "evidence": [
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/1" },
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/8" } ] },
        { "id": "h-pruebas", "status": "done", "label": "info", "live": null,
          "title": { "es": "Pruebas automáticas: 154 → 194, 0 en rojo", "en": "Automated tests: 154 → 194, 0 failing" },
          "text": { "es": "La mayoría de las 40 nuevas son intentos de manipulación que deben ser rechazados.", "en": "Most of the 40 new ones are tampering attempts that must be refused." },
          "evidence": [ { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39943161382", "result": "green" } ] },
        { "id": "h-umbrales", "status": "done", "label": "prototipo", "live": null,
          "title": { "es": "Umbrales 2/2/3 decididos para la cuenta de anclaje", "en": "Thresholds 2/2/3 decided for the anchoring account" },
          "text": { "es": "En esa cuenta, en preparación para la semana 2, ninguna clave sola, ni siquiera una de nuestras dos, podrá enviar una transacción; anclar exigirá 2 de las 3 claves, y cambiar firmantes o umbrales, las 3. Ya está en la herramienta que configura la cuenta, probado contra una red simulada.", "en": "On that account, in preparation for week 2, no single key, not even one of our two, will be able to send a transaction; anchoring will need 2 of the 3 keys, and changing signers or thresholds all 3. Already in the account setup tool, tested against a simulated network." },
          "evidence": [ { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/9" } ] },
        { "id": "h-acuerdo", "status": "done", "label": "info", "live": null,
          "title": { "es": "Acuerdo de arquitectura v3", "en": "Architecture freeze v3" },
          "text": { "es": "Acordado por los dos fundadores el miércoles 21 oct. Fija el formato de la evidencia, las reglas de firma y de rechazo, y el plan de cada semana.", "en": "Agreed by both founders on Wednesday 21 Oct. It sets the evidence format, the signing and rejection rules, and the plan for each week." },
          "evidence": [
            { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/b304ddb" },
            { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/ARCHITECTURE-FREEZE-v3.md" } ] },
        { "id": "h-d1", "status": "done", "label": "prototipo", "live": null,
          "title": { "es": "Evidencia de la Entrega 1", "en": "Deliverable 1 evidence" },
          "text": { "es": "Modbus, HTTP y CSV producen registros idénticos byte a byte; 24 de 24 intervalos aceptados en cada vía, con Modbus leído desde un simulador. Abierto: dos registros del controlador EPEver y el banco del PZEM-017 necesitan hardware real, fuera de este sprint.", "en": "Modbus, HTTP and CSV produce byte-identical records; 24 of 24 intervals accepted on every path, with Modbus read from a simulator. Open: two EPEver controller registers and the PZEM-017 bench settings need real hardware, outside this sprint." },
          "evidence": [
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/10" },
            { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/DELIVERABLE-1-EVIDENCE.md" } ] },
        { "id": "h-rechazado", "status": "done", "label": "prototipo", "live": null,
          "title": { "es": "Un lote rechazado ya no suma energía al total", "en": "A rejected batch no longer adds energy to the total" },
          "text": { "es": "Estaba planificado para la semana 3; lo adelantamos porque sin esta regla la misma energía podía contarse dos veces.", "en": "It was planned for week 3; we moved it up because without it the same energy could count twice." },
          "evidence": [ { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/8" } ] },
        { "id": "h-cero-tx", "status": "done", "label": "testnet", "live": "week-tx",
          "title": { "es": "0 transacciones en testnet en la semana 1, a propósito", "en": "0 testnet transactions in week 1, on purpose" },
          "text": { "es": "Compruébalo en vivo: contamos las transacciones de cada cuenta que nombra el repositorio (11) entre el lunes 19 y el viernes 23 de octubre, hora de Chile; las claves que solo firman no tienen cuenta.", "en": "Check it live: we count the transactions of every account the repository names (11) from Monday 19 to Friday 23 October, Chile time; keys that only sign have no account." },
          "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/CHANGELOG.md" } ] },
        { "id": "h-cero-claves", "status": "done", "label": "info", "live": null,
          "title": { "es": "0 claves secretas de Stellar en el repositorio", "en": "0 Stellar secret keys in the repository" },
          "text": { "es": "Revisando cada commit de cada rama y etiqueta públicas: 156 commits al 23 oct.", "en": "Checking every commit of every public branch and tag: 156 commits on 23 Oct." },
          "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/CHANGELOG.md" } ] },
        { "id": "h-firmante", "status": "done", "label": "info", "live": null,
          "title": { "es": "Firmante externo al equipo: confirmado", "en": "Signer from outside the team: confirmed" },
          "text": { "es": "Su clave secreta queda en su poder; su clave pública se agregará al crear la cuenta definitiva.", "en": "Their secret key stays with them; their public key is added when the real account is created." },
          "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/CHANGELOG.md" } ] },
        { "id": "h-previo", "status": "done", "label": "info", "live": null,
          "title": { "es": "Trabajo previo, público y rotulado", "en": "Prior work, public and labeled" },
          "text": { "es": "Los 20 commits de Diego Ostertag del 8 al 17 oct, con sus fechas originales; el ensayo del 8 oct se describe como lo que fue: 48 horas simuladas en 4 min 18 s, con cuentas desechables.", "en": "Diego Ostertag's 20 commits from 8 to 17 Oct, with their original dates; the 8 Oct run is described as what it was: 48 simulated hours in 4 min 18 s, on throwaway accounts." },
          "evidence": [
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/4" },
            { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/PRIOR-WORK.md" } ] },
        { "id": "h-quitamos", "status": "done", "label": "info", "live": null,
          "title": { "es": "Quitamos lo que no correspondía", "en": "We removed what did not belong" },
          "text": { "es": "Google Analytics, las páginas de agosto (vuelven ahora, rotuladas) y la página de conciliación, hasta que lea desde Stellar los firmantes y los umbrales.", "en": "Google Analytics, the August pages (back now, labeled) and the reconciliation page, until it reads signers and thresholds from Stellar." },
          "evidence": [
            { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/3" },
            { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/8175ba9" },
            { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/141089a" } ] }
      ] },
    { "n": 2, "id": "s2", "from": "2026-10-26", "to": "2026-10-30",
      "title": { "es": "Semana 2", "en": "Week 2" },
      "summary": { "es": "Cuenta 2 de 3 real, pruebas A–D, samples_root, dos repositorios de evidencia.", "en": "Real 2-of-3 account, tests A–D, samples_root, two evidence repositories." },
      "changelog": null, "release": null, "highlights": [] },
    { "n": 3, "id": "s3", "from": "2026-11-02", "to": "2026-11-06",
      "title": { "es": "Semana 3", "en": "Week 3" },
      "summary": { "es": "Un rechazo del verificador es definitivo; ventana de validez de 60 minutos como máximo; marca de error de reloj; recuperación reforzada; congelación del código el viernes 6 nov.", "en": "A verifier refusal is final; validity window of at most 60 minutes; clock-error watermark; hardened recovery; code freeze on Friday 6 Nov." },
      "changelog": null, "release": null, "highlights": [] },
    { "n": 4, "id": "corrida", "from": "2026-11-08", "to": "2026-11-15",
      "title": { "es": "Corrida contada", "en": "Counted run" },
      "summary": { "es": "7 días en testnet, del domingo 8 nov 00:00 al domingo 15 nov 00:00, hora de Chile, con entrada simulada.", "en": "7 days on testnet, from Sunday 8 Nov 00:00 to Sunday 15 Nov 00:00, Chile time, with simulated input." },
      "changelog": null, "release": null, "highlights": [] }
  ],
  "deliverables": [
    { "id": "D1", "title": { "es": "Entrega 1 · Leer cualquier medidor", "en": "Deliverable 1 · Read any meter" },
      "summary": { "es": "Modbus, HTTP o CSV producen registros idénticos byte a byte.", "en": "Modbus, HTTP or CSV produce byte-identical records." },
      "items": ["D1-READER", "D1-EVID", "V3-6", "V3-10", "D1-OPEN-EPEVER", "D1-OPEN-PZEM", "D1-1"] },
    { "id": "D2", "title": { "es": "Entrega 2 · Evidencia en lotes encadenados", "en": "Deliverable 2 · Evidence in chained batches" },
      "summary": { "es": "Lotes con huella SHA-256 encadenada, raíz de lecturas crudas y descarga pública.", "en": "Batches with a chained SHA-256 fingerprint, a raw-reading root and public download." },
      "items": ["D2-CHAIN", "V3-2", "V3-3", "DV-1-4", "V3-5", "V3-7"] },
    { "id": "D3", "title": { "es": "Entrega 3 · Anclaje 2 de 3 y pruebas A–D", "en": "Deliverable 3 · 2-of-3 anchoring and tests A–D" },
      "summary": { "es": "Ninguna clave sola podrá escribir una constancia; la propia red lo rechazará.", "en": "No single key will be able to write a record; the network itself will refuse it." },
      "items": ["D3-REHEARSAL", "V3-1", "DV-5", "OD-1", "V3-4", "V3-8", "V3-11"] },
    { "id": "D4", "title": { "es": "Entrega 4 · Corrida de 7 días, conciliación y recuperación", "en": "Deliverable 4 · 7-day run, reconciliation and recovery" },
      "summary": { "es": "Siete días sin intervención en Stellar testnet, con cada ancla conciliada con su lote.", "en": "Seven unattended days on Stellar testnet, with every anchor reconciled with its batch." },
      "items": ["D4-REHEARSAL", "V3-9", "V3-12", "V3-13", "CODE-FREEZE", "V3-14"] }
  ],
  "items": [
    { "id": "AUG-HACKATHON", "ref": null, "deliverable": null, "week": 0, "status": "prior", "label": "testnet", "nodes": [],
      "title": { "es": "Prototipo del hackathon de agosto 2026", "en": "August 2026 hackathon prototype" },
      "summary": { "es": "Sitio, demo en Stellar testnet y documentos del hackathon; sus páginas vuelven ahora, cada una con su rótulo.", "en": "Site, Stellar testnet demo and hackathon documents; its pages are back now, each with its label." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/PRIOR-WORK.md" } ] },
    { "id": "D1-READER", "ref": null, "deliverable": "D1", "week": 0, "status": "prior", "label": "prototipo", "nodes": ["medidor", "entrada"],
      "title": { "es": "Lector de medidores: Modbus, HTTP y CSV", "en": "Meter reader: Modbus, HTTP and CSV" },
      "summary": { "es": "Construido el 9 sep, antes del Día 1.", "en": "Built on 9 Sep, before Day 1." },
      "evidence": [ { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/98b281a" } ] },
    { "id": "D2-CHAIN", "ref": null, "deliverable": "D2", "week": 0, "status": "prior", "label": "prototipo", "nodes": ["lotes"],
      "title": { "es": "Lotes, cadena de huellas y prueba a escala", "en": "Batches, fingerprint chain and scale test" },
      "summary": { "es": "Lotes encadenados, y un mes de datos públicos NREL PVDAQ (no son mediciones nuestras): 720 lotes, 0 rechazados.", "en": "Chained batches, and one month of public NREL PVDAQ data (not our measurements): 720 batches, 0 rejected." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/PRIOR-WORK.md" }, { "kind": "site", "url": "/evidence/scale/scale-pvdaq-4902-2017-09.json" } ] },
    { "id": "D3-REHEARSAL", "ref": null, "deliverable": "D3", "week": 0, "status": "prior", "label": "testnet", "nodes": ["proponente", "verificador", "cuenta"],
      "title": { "es": "Ensayo 2 de 3 en cuentas desechables (8 oct)", "en": "2-of-3 rehearsal on throwaway accounts (8 Oct)" },
      "summary": { "es": "Pruebas A–D con umbrales 1/2/3: con una firma, rechazada; con dos, anclada. Se comprueba en vivo en esta web.", "en": "Tests A–D with thresholds 1/2/3: with one signature, refused; with two, anchored. Checked live on this site." },
      "evidence": [ { "kind": "site", "url": "/evidence/rehearsal/rehearsal-2026-10-08T20-46-13-037Z.json" } ] },
    { "id": "D4-REHEARSAL", "ref": null, "deliverable": "D4", "week": 0, "status": "prior", "label": "testnet", "nodes": ["cualquiera"],
      "title": { "es": "Ensayo acelerado: 48 horas simuladas en 4 min 18 s (8 oct)", "en": "Accelerated rehearsal: 48 simulated hours in 4 min 18 s (8 Oct)" },
      "summary": { "es": "En cuentas desechables y con conciliación. Entrada simulada · Stellar testnet.", "en": "On throwaway accounts and with reconciliation. Simulated input · Stellar testnet." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/PRIOR-WORK.md" } ] },

    { "id": "PRIOR-PUBLIC", "ref": null, "deliverable": null, "week": 1, "status": "done", "label": "info", "nodes": [],
      "title": { "es": "Trabajo previo público, rotulado y con la etiqueta dia-1", "en": "Prior work public, labeled and tagged dia-1" },
      "summary": { "es": "Todo lo anterior al Día 1 queda separado de lo hecho en el sprint.", "en": "Everything before Day 1 is kept apart from the sprint's work." },
      "evidence": [ { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/4" }, { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/7336e20" } ] },
    { "id": "V3-1", "ref": "S1", "deliverable": "D3", "week": 1, "status": "done", "label": "prototipo", "nodes": ["verificador"],
      "title": { "es": "Antes de firmar, el verificador recorre la cadena hasta el último anclaje (Falla 1, «el total heredado»)", "en": "Before signing, the verifier walks the chain back to the last anchor (Flaw 1, \"the inherited total\")" },
      "summary": { "es": "Antes copiaba el total del lote anterior sin comprobarlo; ahora recalcula cada huella y cada total hasta lo anclado en Stellar.", "en": "It used to copy the previous batch's total without checking it; now it recomputes every fingerprint and total back to what is anchored on Stellar." },
      "evidence": [
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/7" },
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/5" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/bdd5784" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/09210b0" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39589564074", "result": "red" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593831385", "result": "green" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593847463", "result": "green" } ] },
    { "id": "V3-2", "ref": "S2", "deliverable": "D2", "week": 1, "status": "done", "label": "prototipo", "nodes": ["filtros", "lotes"],
      "title": { "es": "Se rechazan intervalos repetidos, superpuestos, fuera de grilla o de otra instalación (Falla 2, «la misma energía, dos veces»)", "en": "Repeated, overlapping, off-grid or other-installation intervals are refused (Flaw 2, \"the same energy, twice\")" },
      "summary": { "es": "Antes, un lote armado con intervalos ya contados pasaba como nuevo.", "en": "Before, a batch built from intervals already counted passed as new." },
      "evidence": [
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/5" },
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/1" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/6204b12" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/40aaa3d" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39589526847", "result": "red" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593831385", "result": "green" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593847463", "result": "green" } ] },
    { "id": "DV-1-4", "ref": "DV-1…DV-4", "deliverable": "D2", "week": 1, "status": "done", "label": "prototipo", "nodes": ["entrada", "filtros", "lotes", "verificador"],
      "title": { "es": "Revisión de los arreglos: cuatro formas más de contar dos veces la misma energía, cerradas", "en": "Review of the fixes: four more ways to count the same energy twice, closed" },
      "summary": { "es": "Referencia de tiempo solo desde el último lote aceptado; cada lote anterior se descarga una vez y se recalcula su huella; la entrada rechaza solo el intervalo dudoso; la entrada HTTP escribe cada instante de una sola forma.", "en": "Time reference only from the last accepted batch; each earlier batch is downloaded once and rehashed; the input refuses only the doubtful interval; the HTTP input writes each instant one way only." },
      "evidence": [
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/1" },
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/8" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/301bc50" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/8385da3" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39587187862", "result": "red" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593250856", "result": "red" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39593847463", "result": "green" } ] },
    { "id": "DV-5", "ref": "DV-5", "deliverable": "D3", "week": 1, "status": "done", "label": "prototipo", "nodes": ["proponente", "verificador"],
      "title": { "es": "El anclaje ya no puede quedar detenido para siempre tras muchos lotes rechazados", "en": "Anchoring can no longer stop for good after many rejected batches" },
      "summary": { "es": "Llegar al límite del recorrido tiene su propio código, verifier.walk_too_long, y el proponente hace el mismo recorrido antes de proponer.", "en": "Reaching the walk's limit has its own code, verifier.walk_too_long, and the proposer runs the same walk before proposing." },
      "evidence": [ { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/8" }, { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/8385da3" } ] },
    { "id": "V3-3", "ref": "F6", "deliverable": "D2", "week": 1, "status": "done", "label": "prototipo", "nodes": ["lotes"],
      "title": { "es": "Un lote rechazado no suma energía al total", "en": "A rejected batch adds no energy to the total" },
      "summary": { "es": "Estaba planificado para la semana 3; se adelantó porque sin esta regla la misma energía podía contarse dos veces.", "en": "It was planned for week 3; it moved up because without it the same energy could count twice." },
      "evidence": [ { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/8" }, { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/8385da3" } ] },
    { "id": "OD-1", "ref": "OD-1", "deliverable": "D3", "week": 1, "status": "done", "label": "prototipo", "nodes": ["cuenta"],
      "title": { "es": "Umbrales 2/2/3 decididos y construidos en la herramienta de la cuenta", "en": "Thresholds 2/2/3 decided and built into the account tool" },
      "summary": { "es": "Ninguna clave sola podrá enviar una transacción; anclar exigirá 2 de 3 claves y cambiar firmantes o umbrales, las 3. Probado contra una red simulada; la cuenta real es el punto V3-4.", "en": "No single key will be able to send a transaction; anchoring will need 2 of 3 keys and changing signers or thresholds all 3. Tested against a simulated network; the real account is item V3-4." },
      "evidence": [
        { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/9" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/075b14e" },
        { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/666c65b" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39939377387", "result": "green" },
        { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39939391730", "result": "green" } ] },
    { "id": "FREEZE-V3", "ref": null, "deliverable": null, "week": 1, "status": "done", "label": "info", "nodes": [],
      "title": { "es": "Acuerdo de arquitectura v3, acordado el 21 oct", "en": "Architecture freeze v3, agreed on 21 Oct" },
      "summary": { "es": "Formato de la evidencia, reglas de firma y de rechazo, y el plan de cada semana.", "en": "Evidence format, signing and rejection rules, and the plan for each week." },
      "evidence": [ { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/b304ddb" }, { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/ARCHITECTURE-FREEZE-v3.md" } ] },
    { "id": "D1-EVID", "ref": null, "deliverable": "D1", "week": 1, "status": "done", "label": "prototipo", "nodes": ["entrada"],
      "title": { "es": "Evidencia de la Entrega 1: 24 de 24 intervalos idénticos por Modbus, HTTP y CSV", "en": "Deliverable 1 evidence: 24 of 24 intervals identical over Modbus, HTTP and CSV" },
      "summary": { "es": "Modbus leído desde un simulador; cinco pruebas nuevas de lectura de medidores.", "en": "Modbus read from a simulator; five new meter-reading tests." },
      "evidence": [ { "kind": "pr", "url": "https://github.com/academiaseul/QWATT/pull/10" }, { "kind": "commit", "url": "https://github.com/academiaseul/QWATT/commit/cae00a6" }, { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/DELIVERABLE-1-EVIDENCE.md" } ] },
    { "id": "TESTS-194", "ref": null, "deliverable": null, "week": 1, "status": "done", "label": "info", "nodes": [],
      "title": { "es": "Pruebas automáticas: 154 → 194, 0 en rojo", "en": "Automated tests: 154 → 194, 0 failing" },
      "summary": { "es": "En la corrida #34 del CI, sobre main, después del último cambio de código de la semana.", "en": "In CI run #34, on main, after the week's last code change." },
      "evidence": [ { "kind": "run", "url": "https://github.com/academiaseul/QWATT/actions/runs/39943161382", "result": "green" }, { "kind": "compare", "url": "https://github.com/academiaseul/QWATT/compare/dia-1...semana-1" } ] },
    { "id": "D1-OPEN-EPEVER", "ref": null, "deliverable": "D1", "week": 1, "status": "open", "label": "prototipo", "nodes": ["medidor"],
      "title": { "es": "Dos registros del controlador EPEver (0x3104, 0x3105) necesitan hardware real", "en": "Two EPEver controller registers (0x3104, 0x3105) need real hardware" },
      "summary": { "es": "El hardware queda fuera de este sprint; lo deciden los fundadores.", "en": "Hardware is outside this sprint; the founders decide." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/DELIVERABLE-1-EVIDENCE.md" } ] },
    { "id": "D1-OPEN-PZEM", "ref": null, "deliverable": "D1", "week": 1, "status": "open", "label": "prototipo", "nodes": ["medidor"],
      "title": { "es": "Los ajustes del banco del PZEM-017 necesitan hardware real", "en": "The PZEM-017 bench settings need real hardware" },
      "summary": { "es": "El hardware queda fuera de este sprint; lo deciden los fundadores.", "en": "Hardware is outside this sprint; the founders decide." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/DELIVERABLE-1-EVIDENCE.md" } ] },
    { "id": "D1-1", "ref": "D1-1", "deliverable": "D1", "week": 1, "status": "open", "label": "info", "nodes": ["entrada"],
      "title": { "es": "Desviación D1-1: la interfaz de las entradas difiere del primer acuerdo de arquitectura", "en": "Deviation D1-1: the input interface differs from the first architecture freeze" },
      "summary": { "es": "Lo deciden los fundadores.", "en": "The founders decide." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/DELIVERABLE-1-EVIDENCE.md" } ] },

    { "id": "V3-4", "ref": null, "deliverable": "D3", "week": 2, "status": "planned", "label": "planificado", "nodes": ["cuenta"],
      "title": { "es": "Cuenta 2 de 3 real en Stellar testnet y pruebas A–D", "en": "Real 2-of-3 account on Stellar testnet and tests A–D" },
      "summary": { "es": "Proponente, verificador independiente y firmante externo al equipo; umbrales 2/2/3; la clave con que se crea la cuenta queda en peso 0. Pruebas A y B (la red las rechaza), C (anclada), D (el verificador la rechaza) e independencia.", "en": "Proposer, independent verifier and a signer from outside the team; thresholds 2/2/3; the key that creates the account goes to weight 0. Tests A and B (the network refuses them), C (anchored), D (the verifier refuses it) and independence." },
      "evidence": [ { "kind": "doc", "url": "https://github.com/academiaseul/QWATT/blob/main/docs/ARCHITECTURE-FREEZE-v3.md" } ] },
    { "id": "V3-5", "ref": "F7", "deliverable": "D2", "week": 2, "status": "planned", "label": "planificado", "nodes": ["lotes"],
      "title": { "es": "samples_root: una huella de todas las lecturas crudas de cada lote", "en": "samples_root: a fingerprint of every raw reading in each batch" },
      "summary": { "es": "Esquema de lote 1.1.0; las lecturas crudas se publican junto a cada lote y el verificador recalcula la raíz.", "en": "Batch schema 1.1.0; raw readings are published next to each batch and the verifier recomputes the root." },
      "evidence": [] },
    { "id": "V3-6", "ref": "F9", "deliverable": "D1", "week": 2, "status": "planned", "label": "planificado", "nodes": ["entrada"],
      "title": { "es": "Cada entrada registra cuánto se desvía su reloj", "en": "Every input records how far its clock is off" },
      "summary": { "es": "clock_skew_s en Modbus, CSV, HTTP y el simulador.", "en": "clock_skew_s on Modbus, CSV, HTTP and the simulator." },
      "evidence": [] },
    { "id": "V3-7", "ref": "F12", "deliverable": "D2", "week": 2, "status": "planned", "label": "planificado", "nodes": ["feed"],
      "title": { "es": "Dos repositorios públicos de evidencia", "en": "Two public evidence repositories" },
      "summary": { "es": "Uno que escribe solo el proponente y otro que escribe solo el verificador; lo publicado no se reescribe.", "en": "One written only by the proposer and one only by the verifier; what is published is never rewritten." },
      "evidence": [] },
    { "id": "V3-8", "ref": "F13", "deliverable": "D3", "week": 2, "status": "planned", "label": "planificado", "nodes": ["cuenta", "proponente"],
      "title": { "es": "Claves sin navegador", "en": "Keys without a browser" },
      "summary": { "es": "Cada clave se crea con stellar-cli en la máquina que la usa; una copia offline por titular, probada una vez antes de la congelación del código.", "en": "Each key is created with stellar-cli on the machine that uses it; one offline copy per holder, tested once before the code freeze." },
      "evidence": [] },
    { "id": "V3-9", "ref": "F15", "deliverable": "D4", "week": 2, "status": "planned", "label": "planificado", "nodes": ["cualquiera"],
      "title": { "es": "Rótulo fijo con el nivel A0 y una conciliación que lee firmantes y umbrales desde Stellar", "en": "Fixed label with level A0 and a reconciliation that reads signers and thresholds from Stellar" },
      "summary": { "es": "«Entrada simulada · assurance A0 · Stellar testnet» en la corrida, la conciliación y el informe.", "en": "\"Simulated input · assurance A0 · Stellar testnet\" on the run, the reconciliation and the report." },
      "evidence": [] },
    { "id": "V3-10", "ref": null, "deliverable": "D1", "week": 2, "status": "planned", "label": "planificado", "nodes": ["filtros"],
      "title": { "es": "Sin energía estimada en un hueco de más de tres lecturas", "en": "No energy estimated across a gap of more than three readings" },
      "summary": { "es": "Cuando un medidor se corta, el hueco queda a la vista.", "en": "When a meter drops out, the gap stays visible." },
      "evidence": [] },
    { "id": "V3-11", "ref": "F3", "deliverable": "D3", "week": 3, "status": "planned", "label": "planificado", "nodes": ["verificador"],
      "title": { "es": "Un rechazo del verificador es definitivo; ventana de validez de 60 minutos como máximo", "en": "A verifier refusal is final; validity window of at most 60 minutes" },
      "summary": { "es": "El anclaje sigue con el lote siguiente y la energía rechazada nunca entra al total.", "en": "Anchoring continues with the next batch and refused energy never enters the total." },
      "evidence": [] },
    { "id": "V3-12", "ref": null, "deliverable": "D4", "week": 3, "status": "planned", "label": "planificado", "nodes": ["filtros"],
      "title": { "es": "Marca de error de reloj", "en": "Clock-error watermark" },
      "summary": { "es": "Un intervalo rechazado por tiempo no mueve la referencia de tiempo, ni siquiera después de un reinicio.", "en": "An interval refused for a time reason does not move the time reference, not even after a restart." },
      "evidence": [] },
    { "id": "V3-13", "ref": null, "deliverable": "D4", "week": 3, "status": "planned", "label": "planificado", "nodes": ["proponente", "verificador"],
      "title": { "es": "Recuperación reforzada", "en": "Hardened recovery" },
      "summary": { "es": "Vigilancia desde fuera de los dos servidores, simulacro del firmante suplente y pruebas de caída de cada servicio.", "en": "Monitoring from outside both servers, a stand-in signer drill and failure tests on each service." },
      "evidence": [] },
    { "id": "CODE-FREEZE", "ref": null, "deliverable": "D4", "week": 3, "status": "planned", "label": "planificado", "nodes": [],
      "title": { "es": "Congelación del código: viernes 6 nov (Día 19)", "en": "Code freeze: Friday 6 Nov (Day 19)" },
      "summary": { "es": "Después, solo arreglos documentados; todo cambio posterior es una desviación numerada.", "en": "After it, only documented fixes; any later change is a numbered deviation." },
      "evidence": [] },
    { "id": "V3-14", "ref": null, "deliverable": "D4", "week": 4, "status": "planned", "label": "planificado", "nodes": ["cualquiera"],
      "title": { "es": "Corrida contada de 7 días en Stellar testnet", "en": "Counted 7-day run on Stellar testnet" },
      "summary": { "es": "Del domingo 8 nov 00:00 al domingo 15 nov 00:00, hora de Chile, con entrada simulada; cada lote anclado con dos firmas o rechazado con su motivo publicado.", "en": "From Sunday 8 Nov 00:00 to Sunday 15 Nov 00:00, Chile time, with simulated input; every batch anchored with two signatures or refused with its published reason." },
      "evidence": [] },

    { "id": "HW-PILOT", "ref": null, "deliverable": null, "week": null, "status": "out_of_scope", "label": "info", "nodes": ["medidor"],
      "title": { "es": "Piloto con hardware real", "en": "Pilot with real hardware" },
      "summary": { "es": "Fuera de este sprint; el plan está en Piloto solar.", "en": "Outside this sprint; the plan is in Solar pilot." },
      "evidence": [ { "kind": "site", "url": "/piloto.html" } ] },
    { "id": "MAINNET", "ref": null, "deliverable": null, "week": null, "status": "out_of_scope", "label": "info", "nodes": [],
      "title": { "es": "Red principal de Stellar", "en": "Stellar main network" },
      "summary": { "es": "Fuera del acuerdo v3: QWATT opera solo en Stellar testnet.", "en": "Outside freeze v3: QWATT runs only on Stellar testnet." },
      "evidence": [] },
    { "id": "SOROBAN", "ref": null, "deliverable": null, "week": null, "status": "out_of_scope", "label": "info", "nodes": [],
      "title": { "es": "Contrato de verificación en Soroban", "en": "Verification contract on Soroban" },
      "summary": { "es": "Fuera del acuerdo v3.", "en": "Outside freeze v3." },
      "evidence": [] }
  ],
  "nodes": [
    { "id": "medidor", "status": "prototipo", "items": ["D1-READER", "D1-OPEN-EPEVER", "D1-OPEN-PZEM", "HW-PILOT"] },
    { "id": "entrada", "status": "prototipo", "items": ["D1-READER", "DV-1-4", "D1-EVID", "D1-1", "V3-6"] },
    { "id": "filtros", "status": "prototipo", "items": ["V3-2", "DV-1-4", "V3-10", "V3-12"] },
    { "id": "lotes", "status": "prototipo", "items": ["D2-CHAIN", "V3-2", "DV-1-4", "V3-3", "V3-5"] },
    { "id": "feed", "status": "planificado", "items": ["V3-7"] },
    { "id": "proponente", "status": "prototipo", "items": ["D3-REHEARSAL", "DV-5", "V3-8", "V3-13"] },
    { "id": "verificador", "status": "prototipo", "items": ["D3-REHEARSAL", "V3-1", "DV-1-4", "DV-5", "V3-11", "V3-13"] },
    { "id": "cuenta", "status": "planificado", "items": ["D3-REHEARSAL", "OD-1", "V3-4", "V3-8"] },
    { "id": "cualquiera", "status": "testnet", "items": ["D4-REHEARSAL", "V3-9", "V3-14"] }
  ]
}
