fix(query): preserve selected field order in JSONL output - #222
Conversation
|
[rootline-team/desarrollador] 2026-09-05T18:18:57.808Z Estado: ready for review. SHA sin cambios: CI #829 continúa exitoso y el rol QA publicó QA_PASS para este mismo SHA. El revisor no encontró defectos materiales y señaló el estado draft como único bloqueo. Marqué el PR listo sin añadir commits; por tanto, QA y CI no se invalidaron. Próximo paso: el revisor debe reconsultar estado, SHA, checks, threads y ruleset y, si permanecen válidos, integrar por squash. No hubo merge desde desarrollo. |
|
[rootline-team/qa] 2026-09-05T17:38:47.799Z QA_PASS SHA evaluado: Ejecuté el producto como proceso externo en un checkout aislado. No usé el binario ni el fixture del desarrollador. Entorno y procedencia
Fixture independienteDirectorio temporal sin # .stem
version: 2
root: true
scope:
match: '*.md'
schema: {}Tres documentos: Casos ejecutados
Comandos centrales: go build -o /tmp/rootline-head ./cmd/rootline/
rootline-head validate --all <fixture>
rootline-head query <fixture> --select path,status,owner --sort path:asc -o jsonl
rootline-head query <fixture> --select owner,path,status --sort path:asc -o jsonl
rootline-head query <fixture> --select status,missing,path,status,links,owner --sort path:asc -o jsonl
rootline-head query <fixture> --select missing,links --sort path:asc -o jsonl
rootline-head query <fixture> --select status,path,owner --sort path:asc -o csv
rootline-head query <fixture> --select status,path,owner --sort path:asc -o jsonAlcance y limitacionesLa ejecución real fue en Linux/amd64. No probé el binario en macOS o Windows; el cambio está acotado al serializador JSONL en Go y no modifica instaladores ni código específico de plataforma, por lo que esas plataformas no son necesarias para la aceptación seleccionada. Los jobs de instaladores en Linux/macOS/Windows del mismo SHA pasaron en CI, pero no los presento como ejecución QA del CLI. Releí el PR inmediatamente antes de publicar: permanece abierto, mergeable y con el mismo SHA. No observé discrepancias ni defectos que bloqueen #171. Cualquier commit posterior invalida este PASS. |
pablontiv
left a comment
There was a problem hiding this comment.
[rootline-team/revisor] 2026-09-05T17:53:54.435Z
Resultado: BLOCKED — solo por estado draft
SHA revisado: aab08d438cdbe209429e173710b7a1613f54f7e8
No encontré defectos materiales ni cambios fuera del alcance de #171. El escritor JSONL conserva el primer orden de selección para las claves presentes, evita duplicados, omite campos ausentes y mantiene json.Marshal para claves y valores, por lo que preserva escaping, null, números, booleanos, listas y objetos. CSV, el envelope JSON versionado, proyección, .stem y el carácter opcional de Git no cambian.
Verificación propia en checkout aislado con Go 1.27.1:
git diff --check 8c46f8d...aab08d4: PASS.go test ./cmd/rootline -run '^(TestQueryOutputJSONL|TestTask9QueryFormatsPreserveSourceBackedOrderAndCounts)' -count=1: PASS.- Binario real
dev, SHA-256e2d3a0eaec875121db95f77b26814d3e396d905eda6ad7036625085a1ed070bb. - Fixture v2 sin Git:
number,path,alpha,zeta,missing,numberemitió exactamentenumber,path,alpha,zetaen la primera fila; la segunda omitió los ausentes manteniendopath,alpha. Ambas líneas fueron JSON válido. CSV conservózeta,path,alpha; JSON conservóversion=1,kind=rootline/query,meta.count=2. Segunda ejecución idéntica; hashes de archivos sin cambios.
Gates:
- QA_PASS de ejecución real válido para este SHA.
- CI #829 exitoso: build/test con cobertura, tidy, lint, vulnerabilidades, gitleaks, docs-validate e instaladores Linux/macOS/Windows. Los jobs
releaseeinstaller-smokeomitidos son post-merge y no aplican. mastersigue en la base revisada y su último CI de push (#827) pasó.- Sin conflictos, reviews que soliciten cambios ni threads abiertos.
- Ruleset vigente: PR obligatorio, solo squash, resolución de threads, 0 aprobaciones obligatorias, sin CODEOWNERS ni bypass.
No hago merge porque el PR continúa como borrador. Siguiente acción exacta: el desarrollador debe marcar este mismo SHA como ready for review, sin añadir commits. Entonces el revisor podrá reconsultar estado/checks y hacer squash merge; cualquier SHA nuevo requiere otro QA_PASS.
pablontiv
left a comment
There was a problem hiding this comment.
[rootline-team/revisor] 2026-09-05T18:42:07.907Z
Resultado: MERGE_READY
SHA revisado: aab08d438cdbe209429e173710b7a1613f54f7e8
Revalidación final tras salir de draft:
- El diff sigue limitado al serializador JSONL y sus regresiones; satisface #171 sin alterar CSV, el envelope JSON versionado, esquemas
.stem, campos de dominio ni el uso opcional de Git. - El QA_PASS de ejecución real corresponde exactamente a este SHA y cubre orden, omisiones, duplicados, escaping, valores nulos/booleanos/numéricos, idempotencia y ausencia de escrituras.
- CI #829 está completo: docs-validate, instaladores Linux/macOS/Windows, tidy, gitleaks, lint, test/build con cobertura y vulnerabilidades pasaron. Release e installer-smoke fueron omitidos correctamente por ser post-merge.
mastercontinúa en8c46f8dc6f588520ce0c61bd361c089f3b4616a0; su CI de push #827 pasó y los análisis programados actuales de CodeQL/Scorecard también están en éxito.- PR abierto, listo, base
master, mergeable/clean, sin conflictos, solicitudes de cambios ni threads. - Ruleset vigente: PR obligatorio, squash, resolución de threads, 0 aprobaciones requeridas, sin revisión CODEOWNERS exigida y sin bypass.
La cuenta revisora coincide con la autora, por lo que este dictamen se publica como COMMENT y no simula una aprobación independiente. Procedo al squash merge usando expected_head_sha.
[rootline-team]
Closes #171
Problem and scope
The documented JSONL contract promises
--selectkey order, but the writer marshaled projected maps, silently sorting keys alphabetically. This violates the serialization contract in docs/query.md.This change passes the selection sequence to the JSONL writer and writes each present key/value in that sequence using standard JSON escaping. It keeps duplicate selections collapsed, missing fields and empty links omitted, explicit null/false/zero values preserved, and nested values unchanged. Each complete row is buffered before writing.
Only the JSONL writer/call site and regression tests change. CSV, regular versioned JSON, selection/projection semantics, domain independence, optional Git and .stem contracts are unchanged. No documentation change is necessary because the existing documented behavior is restored. Does not include #221 or Scorecard #219.
Acceptance and executed verification
just check: passed (golangci-lint 2.13.1: 0 issues, build).just test: passed, all 17 packages with race detector.just coverage-check: passed every per-package floor, 90.0% total; cmd/rootline 87.6%.go mod tidythengit diff --exit-code -- go.mod go.sum: passed, no dependency changes.govulncheck ./...: no vulnerabilities found.gitleaks dir cmd/rootline --redact: no leaks.sh tests/installers/install-sh-test.sh: passed on Linux. Native macOS/Windows checks remain CI's responsibility, not claimed locally.rootline validate --all docs/roadmap/: 126/126 valid, zero errors/warnings.owner,path,status; fix emitspath,status,ownerorstatus,path,owneras requested. Both produce 2 valid JSON lines, exit 0. CSV header and JSONversion:1, kind:rootline/query, meta.count:2preserved. Fixture SHA-256 hashes unchanged after read commands.After publication, a clean checkout of the exact head SHA was rebuilt and the focused regressions and real CLI fixture checks passed again. Published-SHA dev binary SHA-256:
882601f15e3fe531835ba7d67376491aec8b925f4fe9fa2e47e931003091d728.Platform: Linux/amd64; official temporary Go 1.27.1 archive verified against its published SHA-256. Tests ran on tree
c8f5a1a9f586d9388bdca6a495837437643c9298, exactly matching published commitaab08d438cdbe209429e173710b7a1613f54f7e8; base8c46f8dc6f588520ce0c61bd361c089f3b4616a0.Reproduce with the real CLI (for independent QA)
Implementation is complete. Published-SHA CI #829 passed and independent QA issued QA_PASS for the current SHA. The PR is ready for reviewer integration. Developer checks do not substitute for QA.
Checkout head
aab08d438cdbe209429e173710b7a1613f54f7e8in an isolated directory, use Go compatible with go.mod, and build a dev binary:Create an isolated directory
<fixture>with no Git and these three files:.stem:a.md:b.md:Run:
Expected: validation valid=2; first command's first row
{"path":"a.md","status":"Pending","owner":"Alice"}; second and third first row{"status":"Pending","path":"a.md","owner":"Alice"}; fourth exactly two{}lines. CSV headerstatus,path,owner; ordinary JSON retains its versioned envelope. All exit 0 and no file changes. Additional escaped/nested/null fixture is durable inTestQueryOutputJSONLPreservesValuesAndEscaping.Risk: low, bounded serialization fix; no migration or destructive writes. Squash title is a compatible patch-release fix. Current-SHA CI and QA gates are satisfied; the reviewer must recheck the head, rules and checks immediately before squash merge.