dudhya - News

Version 2.2.0 (2026-09-05)
============================
* Fixed: ./bootstrap no longer produces spurious automake portability
  warnings (this project already requires GNU Make explicitly).
* Adapted to packpay's real, independently-evolved distribution
  (tested against the actual archive, not the frozen extraction-time
  snapshot): retired build_pixel3a_breadboard.py (the hand-placed
  breadboard reference generator), since packpay removed the drawing
  primitives it depended on as unused dead code and this tool's own
  reference purpose was already served.
* Fixed: a real, latent bug in build_pixel3a_breadboard_autolayout.py
  that could crash instead of failing cleanly on a real layout
  violation.
* Fixed: this project's own breadboard-style diagram now fits
  packpay's real, measured board geometry. Root cause: a generic
  resistor/diode footprint category was using a real THT part's own
  factory HORIZONTAL lead spacing as VERTICAL breadboard row span;
  the same real component is routinely mounted standing up with bent
  leads when board space is tight, and KiCad's own footprint library
  already has this exact variant. Overridden from this project's own
  code, with no packpay source file touched.
* Verified: the complete `make breadboard-verify` command run
  repeatedly from a clean slate, 0 failures every time; the full
  Makefile target sequence clean against the real packpay archive;
  the result rendered and visually confirmed.

Version 2.1.1 (2026-09-05)
============================
* Documentation audit: user-facing documentation (Concept.org,
  Dudhya.org, README, Index.org) is now free of narrative references
  to the author and of dates that don't serve the reader directly --
  that history belongs in ResearchJournal.org.
* FutureResearch.org now holds only genuinely open items: removed a
  stale completeness-assessment section, a fully-completed TODO item,
  and heavy dated/completed narrative that had accumulated inside
  several still-open items. One new, previously untracked gap added:
  dudhya-wifi-mode was never wired into OpenRC's own boot sequence.
* Concept.org expanded with a new section explaining how each real
  project deliverable attains the project's stated goal.
* Fixed: two genuine, pre-existing factual inconsistencies found
  during the audit in Dudhya.org (not just style issues) -- one
  section claimed dudhya-sensord was untested on the physical unit
  when a later section already confirmed it; another claimed the
  Provisioning scripts' radio mode was never exercised, when it had
  actually been run and found to stall under sustained load.
* DevelopmentStandard.org now states explicitly which documents are
  for users and which are for development, as a written rule.
* Verified: full documentation rebuild clean for all six documents;
  the complete KiCad/breadboard Makefile target sequence clean.

Version 2.1.0 (2026-09-01)
============================
* Filesystem flattened: every real file now lives at the project
  root, no subdirectories at all (matching packpay's own established
  convention). A minor bump, not major: the public Makefile interface
  (target names, PACKPAY_DIR) is unchanged, only internal file layout
  moved.
* New, binding rule: creating any future subdirectory requires asking
  first and stating the reason, explicit approval before creating it
  -- recorded in DevelopmentStandard.org.
* Fixed: a real, previously-hidden naming collision the flattening
  exposed (the compiled dudhya-sensord binary and the OpenRC init
  script of the same name, previously safe only in separate
  directories). Resolved by renaming the source-tree copy of the
  init script to dudhya-sensord.openrc; the deployed name is
  unchanged.
* Makefile.am genuinely simplified, not just path-substituted: every
  `cd Power/...` prefix removed entirely.
* Verified: full rebuild from a freshly reconfigured tree (the sandbox
  environment had reset completely and was rebuilt from scratch,
  including catching and fixing a recurring ulem.sty gap the same
  documented way); the complete KiCad/breadboard Makefile target
  sequence (seven targets) clean through the actual make interface;
  full documentation rebuild clean for all six documents.

Version 2.0.1 (2026-08-17)
============================
* Fixed: KicadGen.org (the kicad_gen.py scripting-language reference)
  was left behind by the 2026-08-14 extraction, which moved every
  generic module but missed this one document. Removed from this
  project; genuinely dudhya-specific content (a corrected, current
  description of this project's own real generation pipeline)
  dispatched to DevelopmentStandard.org instead of being lost.
* A fully adapted version for packpay was produced and independently
  verified (not shipped in this archive -- delivered separately for
  integration into packpay itself).
* Also fixed: the 2.0.0 packpay extraction itself was never logged in
  SessionHandoff.org -- added retroactively for continuity.
* Verified: full documentation rebuild clean, no broken links; the
  complete KiCad/breadboard Makefile target sequence re-run to
  confirm this documentation-only change didn't disturb anything
  real.

Version 2.0.0 (2026-08-14)
============================
* BREAKING: the generic auto-layout/schematic engine (netlist.py,
  kicad_gen.py, auto_layout.py, kicad_layout.py, footprint.py,
  render.py, breadboard_lib.py, and friends) has been surgically
  extracted into its own project, packpay. Every real KiCad/
  breadboard generation target now requires PACKPAY_DIR (an
  environment variable pointing at a real packpay checkout) --
  a genuine, new build-time dependency this project did not have
  before.
* This project's own real deliverables are unaffected in substance:
  the real Pixel 3a battery-free power circuit, its own real BOM and
  footprints, and this project's own thin, circuit-specific
  generator scripts all remain here and continue to work correctly
  against packpay.
* Assessed directly whether the extraction was premature before doing
  any work: not found premature (the engine had, by this point, been
  tested against three genuinely different circuits with real,
  automated verification at every step).
* README rewritten (was stale since 1.0.0); DevelopmentStandard.org
  and FutureResearch.org trimmed of now-superseded engine-development
  content, with clear pointers to packpay's own copies.
* Verified: real circuit 0 ERC errors, netlist equivalence intact,
  all four breadboard checks clean, the complete Makefile target
  sequence re-run end to end with the new external dependency.

Version 1.53.0 (2026-08-14)
============================
* New: real footprint/adapter mapping for U1, U2, J1, Q1 (three of
  four confirmed via real research and direct measurement; U1
  honestly left unmapped, no confirmed product found) -- and a real,
  previously-latent bug fixed along the way (unmatched anchors were
  silently defaulting to a nonsensical "resistor" footprint).
* New: real, confirmed BOM footprints for all 16 components in
  build_pixel3a_power.py's own real circuit.
* Promoted: the KiCad auto-layout candidate is now this project's own
  primary generator, the same pattern the breadboard side's own
  promotion used. The previous, hand-placed generator is preserved as
  a real reference and as the promoted generator's own netlist
  source. A careful dependency audit and two more stale hardcoded
  paths (found and fixed) kept this a clean, non-circular change.
* New: real, symbol-geometry-derived north/south pin grouping for
  anchors, replacing a purely positional split.
* New: a third, differently-shaped synthetic test circuit -- which
  found and led to fixing a real, previously-undiscovered bug (a net
  that's both a direct-wire candidate and needs a PWR_FLAG left the
  flag's own label isolated).
* Fixed: #+OPTIONS: ^:{} applied to every document, so literal
  underscores in identifiers render correctly instead of being read
  as org-mode subscript markers.
* Fixed: a real duplication bug in SessionHandoff.org, and a
  pre-existing packaging gap (breadboard-handplaced.svg was never
  excluded from the delivery archive).
* Verified: real circuit unchanged (0 ERC errors, netlist
  equivalence, visually identical); both synthetic test circuits 0
  ERC errors; breadboard side's full four-check verification and the
  complete eleven-target sequence all re-run clean.

Version 1.52.0 (2026-08-13)
============================
* New: generate_schematic_auto() -- both circuits now find their own
  working placement parameters automatically, via a bounded retry
  ladder, rather than requiring a person to read an error and pick a
  new number by hand. Closes the first of two generalization gaps
  named in 1.51.0.
* Fixed: a real, previously-unknown bug in footprint.py -- courtyard
  parsing never handled the fp_rect node type, so FOUR of this
  project's own six real, mapped footprint categories were silently
  falling back to a heuristic despite being documented as using real
  geometry. Only found once KiCad's own footprint libraries were
  actually installed and tested against for the first time.
* Fixed: RV1 (a real anchor with an already-mapped real footprint)
  now gets genuine physical clearance from its own real body in the
  breadboard diagram, not just pin count.
* New: value_text_reach() -- a component's own real rendered Value
  text width, measured by direct SVG measurement (the same method
  label_reach() used). Closes the second generalization gap: a
  PWR_FLAG label overlapping a neighboring component's own text,
  left as a documented residual in 1.51.0, is now confirmed
  genuinely resolved.
* New: a dated tooling-completeness assessment (FutureResearch.org)
  and a full workflow description (KicadGen.org) covering the whole
  pipeline from the authoritative schematic through netlist
  extraction to both generated views.
* Verified: real circuit unchanged (0 ERC errors, netlist
  equivalence, visually identical to 1.51.0's own output); test
  circuit 0 ERC errors with the previously-documented overlap
  confirmed gone; breadboard side's full four-check verification
  re-run clean.

Version 1.51.0 (2026-08-13)
============================
* New: the KiCad auto-layout algorithm is now a real, reusable shared
  module (Power/auto-layout/kicad_layout.py), extracted from one
  circuit's own script -- the same generic-library/thin-caller split
  the breadboard side already had. Confirmed a pure extraction
  (byte-identical output) before anything else was built on it.
* Generalized: PWR_FLAG gap positions, sheet/title-block geometry, and
  which nets need a PWR_FLAG are now all derived from real data (anchor
  positions, paper size, pin electrical types) instead of hardcoded,
  circuit-specific constants.
* New: a second, structurally different test circuit
  (build_test_circuit_autolayout.py, `make kicad-test-circuit`) --
  Step 3 of the generalization plan, substantially done. Found and
  fixed four genuine, previously-latent bugs: a chain-depth mechanism
  that didn't generalize past two levels, a missing
  component-vs-component overlap check, an overlap caused by
  compressing spacing to fit a fixed sheet, and PWR_FLAG labels
  overlapping other components' own text. Full account in
  ResearchJournal.org.
* Verified: real circuit 0 ERC errors, 25/25 nets identical,
  byte-identical to the 1.50.0 delivered output; test circuit 0 ERC
  errors, all bounds checks passing; breadboard side and the formal
  netlist test suite re-confirmed clean.
* Two remaining, precisely-scoped generalization gaps documented
  (not left vague) in FutureResearch.org's own new TODO item.

Version 1.50.0 (2026-08-12)
============================
* Fixed: the three KiCad-candidate overlaps diagnosed the previous
  session (#FLG3/D1, L1's own north-edge overflow, C4/D2), all
  traced to the same missing mechanism -- nothing measured a
  label's own real rendered reach. New label_reach(), derived by
  direct SVG measurement, fixes this at the source.
* New: two permanent, automatic checks (labels vs. sheet bounds,
  components vs. the title block) -- this whole class of bug had
  previously only ever been caught by manual visual review.
* Two real regressions were introduced and caught before delivery
  while fixing the above -- both by direct comparison against the
  pristine, unmodified generator's own output, not by the new
  checks alone. Full account in ResearchJournal.org.
* Verified: 0 ERC errors (warning profile confirmed identical to
  the working generator, not just the count), 25/25 nets identical,
  full-sheet visual sweep, breadboard side re-confirmed clean.

Version 1.49.1 (2026-08-12)
============================
* Documentation-only release, no code changes. Saves this session's
  diagnostic work ahead of a forced conversation boundary: three
  newly-found (not yet fixed) schematic overlaps, each with a
  precise root cause; and a direct, honest assessment of how much of
  the recent placement-logic work is genuinely generic versus
  hand-tuned to this one circuit specifically (mostly the latter so
  far -- a real, open finding, detailed in ResearchJournal.org).
* SessionHandoff.org substantially condensed and given a clear,
  explicit environment-rebuild pointer for a fresh session.

Version 1.49.0 (2026-08-12)
============================
* Fixed: four specific label/component overlaps in the KiCad-side
  candidate (two power-flag markers crowded with nearby components,
  a label overlapping a passive, and a real bug where two components
  were landing at identical coordinates). Each verified individually
  against KiCad ERC and a direct netlist comparison to the original
  schematic -- no electrical regression introduced this time, unlike
  two earlier attempts at this same class of issue.

Version 1.48.0 (2026-08-11)
============================
* Fixed: a distinct left-edge overflow in the KiCad-side candidate
  (separate from the earlier right-edge one), resolved by widening
  the anchor row's own starting margin. Verified against KiCad ERC
  and a direct netlist comparison.
* New: real, drawn wires for short, local connections (a passive
  directly attached to its own anchor) instead of separate labels,
  matching standard schematic practice -- implemented narrowly and
  with a checked distance cap, not an open-ended search.
* Note: the remaining label-overlap issue (particularly around one
  densely-pinned IC) is not yet fixed; see ResearchJournal.org for
  the full account of why this is being deferred deliberately.

Version 1.47.0 (2026-08-11)
============================
* Fixed: the KiCad-side candidate's own title now fits the page
  (matches the existing generator's own working title); out-of-bounds
  elements resolved (anchor spacing reduced to fit A4 with room for
  real, long value text). Both verified against KiCad ERC and a
  direct netlist comparison to the original schematic.
* Note: a collision-avoidance system for the remaining label-overlap
  issues was built and found to have a critical bug (unbounded wire
  growth merging real nets together) -- caught before delivery via
  this project's own netlist-equivalence check, and reverted. The
  remaining overlaps are not yet fixed; see DevelopmentStandard.org
  for the full account and the lesson drawn from it.

Version 1.46.0 (2026-08-11)
============================
* New: the first fully netlist-driven KiCad schematic generator
  (`make kicad-autolayout`) -- placement and rotation decided
  algorithmically from the real, loaded netlist, rather than
  hand-typed coordinates. Delivered as a candidate for review, not a
  replacement: the existing, hand-placed generator is untouched and
  remains the project's own primary KiCad generator for now.
  Verified electrically identical to the existing schematic (same
  15 nets, identical pin membership) and confirmed 0 KiCad ERC
  errors with an identical warning profile to the existing generator.
* New: netlist.py now also captures each component's own KiCad
  library/symbol identity and each pin's own real name, needed to
  reconstruct symbol placement directly from the netlist.

Version 1.45.0 (2026-08-10)
============================
* Changed: the netlist-driven breadboard generator is now this
  project's own primary breadboard tool (`make breadboard-verify`),
  confirmed by direct visual comparison against the previous output.
  Every component's position and every wire now comes directly from
  the real netlist -- no hand-placement anywhere in this path.
* Kept: the previous, hand-placed generator (fifteen-plus rounds of
  direct review) remains available, unchanged, for reference and
  comparison (`make breadboard-handplaced-verify`), writing to its
  own separately-named output file.

Version 1.44.0 (2026-08-10)
============================
* New: the first fully netlist-driven breadboard generator
  (Power/auto-layout/build_pixel3a_breadboard_autolayout.py, `make
  breadboard-autolayout`) -- every component's position and every
  wire derived directly from the real netlist, zero hand-placement.
  Delivered as a candidate for review, not a replacement: the
  existing, hand-placed generator is untouched and remains the
  project's own primary breadboard tool for now.
* New: render()'s own extra_notes parameter, for the one real
  connection (chassis ground) that has no representation in any
  netlist at all, since it's a physical requirement outside the
  schematic's own electrical graph.

Version 1.43.0 (2026-08-10)
============================
* New: explicit cross-rail jumpers, drawn only when a power rail is
  genuinely used on both halves of the board -- the canonical way
  to represent a real, needed connection, checked per-net rather
  than assumed or omitted by default.
* Improved: decluttering rewritten as a single, explicit recursive
  sweep, replacing a pass-based loop with an arbitrary repeat cap.
  Confirmed via direct instrumentation that this matches the actual
  resolution the old code was already performing, just less clearly.

Version 1.42.0 (2026-08-10)
============================
* Fixed: the auto-layout breadboard chrome (shared with the real
  generator) drew a decorative bracket at the board's own edge that,
  at full board height, was visually indistinguishable from a
  continuous connection between the top and bottom power rails --
  misleading, since real hardware does not guarantee that link
  without an explicit jumper. Removed.
* Fixed: decluttering could leave components more cramped than
  necessary, because a later placement pass (push-aside) could
  create new overlaps that the earlier declutter pass never got a
  chance to check. Declutter now runs again afterward.
* New: a third safeguard (alongside the existing electrical and
  physical-collision checks) verifying every assigned row stays
  within the real, parametric board-row limit, run automatically on
  every generation.

Version 1.41.0 (2026-08-07)
============================
* Fixed: the hole-collision safeguard added last round had its own
  real gap -- it checked leg endpoints but never the connecting wire
  segment between them, missing a genuine collision. Now checks the
  full path.
* Fixed: placement decisions never knew a component's own real,
  footprint-derived size, only rendering did -- so a component's
  true occupied space could be under-reserved, causing wires to
  land inside another component's real body. Size now informs
  placement directly, not just drawing.
* New: components in a genuinely overcrowded column are now
  relocated sideways to a free column and bridged with an explicit
  wire, rather than pushed further and further from the trench.
* Verified: an actual inventory confirms all eleven real passive
  components use genuine THT footprints, as claimed.

Version 1.40.0 (2026-08-07)
============================
* Fixed: a real gap in leg placement -- the far-leg column choice
  compared relative clearance between two directions but never
  verified the fixed offset it used was itself a genuinely clear
  position. Now searches for a verified-clear candidate directly.
* New: a permanent safeguard checking that no two component leads
  land in the same physical breadboard hole -- a different
  constraint from electrical connectivity, distinct from the check
  added last round. Found and fixed a real instance immediately
  (two components landing on the identical point due to draw-order
  dependence in the far-leg search).
* Clarified: leg LENGTH (how far a component extends from the
  trench) is genuinely footprint-derived; the column offset between
  a component's own near and far leg is not, and never has been --
  a fixed, conventional choice.

Version 1.39.0 (2026-08-07)
============================
* Fixed: wires in the auto-layout prototype could visibly cross
  through an unrelated component's own body while arcing between
  two other points, not just land on a component at their own
  endpoints -- a genuinely different problem from the previous
  round's endpoint fix. jumper() now checks its own path and
  automatically routes around anything in the way.
* Improved: component decluttering generalized -- catches crowding
  more broadly and iterates until settled, capped to avoid an
  unbounded cascade pushing a component too far.

Version 1.38.0 (2026-08-07)
============================
* Fixed: a real electrical bug in the auto-layout prototype -- the
  previous round's own decluttering fix assumed a breadboard's
  central trench carries electrical continuity across both halves.
  It does not; that assumption silently disconnected at least one
  component (D2) from its real net. Corrected, and confirmed against
  this project's own most-verified reference.
* Fixed: a component bridging two different real nets across its
  own two pins (L1) could have a wire drawn from the wrong position
  entirely -- likely the cause of a separately reported symptom
  (wires appearing to land on unrelated components).
* New: verify_connectivity(), checking every real net's own
  connectivity against the layout's own data, run automatically on
  every generation. Verified against a deliberately reintroduced
  instance of the original bug, not just that it runs clean.

Version 1.37.0 (2026-08-06)
============================
* Improved: auto-layout component labels are now ref-only -- no
  value text on the diagram at all, short or long. Full values
  live exclusively in the legend.
* Fixed: wires now land on the next free hole in their own column,
  never directly on a component's own pin -- discretization,
  previously applied to component placement, now applies to wire
  endpoints too.
* Fixed: components landing too close together on the same half
  (e.g. C1/C2) now get split across halves automatically.
* Fixed: a real bug exposed by that last fix -- the wiring logic
  was treating the same breadboard column, split across both
  halves, as two different connection points, generating an
  unnecessary wire between two points already connected.

Version 1.36.0 (2026-08-06)
============================
* Fixed: discretization (a component sharing an anchor's own column
  instead of a separate wire) had been lost in the auto-layout
  prototype -- restored, and confirmed directly against every
  example raised in review.
* Fixed: J1 was not connected to anything, and no anchor's own
  power/ground was ever drawn -- both traced to their exact
  mechanism and fixed generally, not patched around.
* Improved: long descriptive component values now go in a legend
  instead of colliding with each other on the diagram.
* Improved: anchors ordered by shared connectivity instead of
  alphabetically, meaningfully reducing wire crossings.
* Improved: the auto-layout render now uses the real breadboard
  chrome (numbered columns, lettered rows, rail holes grouped in
  fours), shared code with the working generator, not a simplified
  stand-in.
* Noted: sizing this circuit's own anchors (U1, U2, Q1, J1) against
  real footprint geometry is deliberately deferred, tracked as its
  own open item rather than decided unilaterally.

Version 1.35.0 (2026-08-06)
============================
* Improved: the auto-layout prototype now sizes every passive from
  real KiCad footprint courtyard geometry, not a value-string guess.
  THT footprints used throughout, per Péter's own stated principle:
  a breadboard accepts THT parts directly; an SMD-only part would
  need an adapter board, whose own pins (not the bare chip's pitch)
  are the right size reference; with neither, a part cannot be
  breadboarded as drawn.

Version 1.34.0 (2026-08-06)
============================
* Investigated: whether component footprints could give the
  auto-layout prototype realistic pin spacing. Checked directly --
  this project's own real netlist has no footprints assigned
  anywhere. Recorded as a new item needing a real decision on
  physical parts, with an explicitly-provisional size heuristic
  standing in for now.
* Fixed: three more shared-library bugs (a missing rows parameter on
  diode(), a fixed jumper arc height regardless of distance, and a
  real regression where wider components rendered outside the
  canvas) -- each verified byte-identical against the real
  generator's own output before being considered done.
* Improved: the auto-layout render now uses size-aware component
  spacing and distance-scaled jumper routing, visibly closer to the
  hand-tuned circuit's own quality.

Version 1.33.0 (2026-08-06)
============================
* New: Power/auto-layout/ -- a first automatic-layout research
  prototype, testing whether a simple, greedy, pin-adjacent placement
  heuristic is a viable starting point. Tested against this project's
  own real circuit: zero column collisions, zero label overlaps,
  passive clustering that matches in spirit what fifteen rounds of
  hand-placement converged on. Deliberately isolated from both
  working generators; not a production tool.
* New: Power/breadboard-gen/breadboard_lib.py -- the generic drawing
  primitives extracted from build_pixel3a_breadboard.py so the
  prototype above could reuse them. Verified byte-identical against
  the working generator's own output before and after.
* Fixed: a real, latent bug in ic()'s own label placement, present
  for fifteen review rounds without ever being visible (hand-tuned
  anchors were always spaced far enough apart) -- found the moment
  the new prototype placed anchors more tightly. Fixed in the shared
  library; the real generator re-verified afterward and confirmed
  unaffected in substance (zero failures, small and fully explained
  output diff).

Version 1.32.0 (2026-08-05)
============================
* Fixed: the breadboard tool's shipped verification (make
  breadboard-verify) was a weaker external reimplementation of its
  real internal check -- blind to wires and component bodies, only
  comparing labels to each other. Now built into the tool itself and
  run on every generation; immediately caught and fixed two real
  label/wire overlaps the old check had been missing.
* New: Power/netlist/ -- a shared netlist loader reading directly
  from KiCad's own `kicad-cli sch export netlist` output, verified
  against this project's own real circuit and covered by a permanent
  test (make netlist-verify).
* Fixed: the breadboard generator now asserts every electrical claim
  it makes (42 checks) against this real, loaded netlist at
  generation time, rather than trusting its own hand-transcribed
  wiring -- the actual fix for netlist transcription drift between
  the two generators. A systematic coverage check then found ten
  real pins with no assertion covering them at all; closed. The
  physical layout itself is unchanged, still placed by hand.

Version 1.30.0 (2026-08-05)
============================
* New: the breadboard-style companion diagram generator
  (Power/breadboard-gen/) is now a proper project source file --
  make breadboard-regen, make breadboard-verify -- rather than only
  ever existing as one-off deliveries across fifteen prior review
  rounds.
* Documented: ResearchJournal.org synthesis of those fifteen rounds
  by theme, including a systemic electrical-safety bug (a
  component's own two connection points sharing one breadboard
  column, silently shorting its own two different nets) found and
  fixed by construction; DevelopmentStandard.org's new "Breadboard-
  style diagrams" section for the reusable rules.
* Planned: two FutureResearch.org items -- a netlist source shared
  between the KiCad and breadboard generators (confirmed feasible
  via kicad-cli's own netlist export), and automatic layout.

Version 1.29.0 (2026-08-03)
===========================
* New: KicadGen.org, a practical reference for the small scripting
  language used to build the project's own KiCad schematics
  (Power/kicad-gen/), so changes can be made directly without
  needing the full history behind each rule.
* Research started: scriptable Fritzing usage and KiCad<->Fritzing
  netlist transfer, for accessible circuit prototyping.

Version 1.28.0 (2026-08-03)
===========================
* Fixed: R1/C1/C2 repositioned north of the STUSB4500, pin-adjacent
  to the specific pins they wire to (were south, requiring wires to
  cross the IC's own body). L1 reverted to horizontal. C4 and an
  annotation moved clear of RV1. A real component-body overlap (two
  capacitors 2.5mm apart) found and fixed with a new verification
  check. A page-overflow bug fixed. Zero ERC errors maintained.
* New: a documented position/movement vocabulary (top/bottom/left/
  right = north/south/west/east) for this project's own iterative
  schematic review process.

Version 1.27.0 (2026-08-03)
===========================
* Fixed: Q_PMOS_GSD moved to a different library file (Transistor_FET,
  not Device) between KiCad versions, causing "make kicad-regen" to
  fail on a real machine with KiCad 10.0.5. Every other symbol
  checked against both versions; only this one was affected.
* New: SYM_DIR is now overridable via a KICAD_SYM_DIR environment
  variable, for a machine with more than one KiCad version installed.

Version 1.26.0 (2026-08-03)
===========================
* Fixed: a real "make kicad-regen" failure on a different machine
  (bare "substring not found"). Symbol lookup is now robust to
  whitespace variation, and a genuine lookup failure raises a
  specific, actionable error instead of a raw traceback.
* New: configure.ac checks for kicad-cli and the kicad-symbols
  package, warning (not failing) if either is missing.

Version 1.25.0 (2026-08-03)
===========================
* Fixed: the real cause of labels not appearing at the end of their
  wire stubs (a wrong justify setting per direction, found by
  measuring rendered SVG geometry). Fixed for three of four
  directions; "up" remains unresolved and documented as such.
* Fixed: a wire-routing bug where a straight wire could pass through
  unrelated pins sharing its column. A4 page fit with proper margin;
  L1 rotated vertical; RV1 and C1/C2 layout corrected. Zero ERC
  errors maintained throughout.
* Changed: the generated schematic/project files are no longer
  shipped in the archive; run "make kicad-regen" after extraction.
  The schematic's own revision now tracks the real project version
  automatically.
* New: FutureResearch.org item updated with a specific Fritzing
  conversion tool lead.
* Fixed: a real, reproducible bug in make-archive itself (writing
  the output archive into the directory being tarred could abort
  the build); now writes elsewhere first, then moves into place.

Version 1.24.0 (2026-08-03)
===========================
* Fixed: the battery-free power schematic had a real wiring bug
  (four components with labeled pins pointing at each other,
  bridging unrelated nets) found and fixed while resolving a visual
  clutter complaint. Zero ERC errors confirmed, project-wide.
* New: make kicad-regen and make kicad-erc Makefile targets to
  rebuild and verify the schematic as part of the normal build.
* New: FutureResearch.org item for breadboard/Fritzing-style circuit
  visualization.

Version 1.23.0 (2026-08-03)
===========================
* New: Power/kicad-gen/ (kicad_gen.py, build_pixel3a_power.py), a
  reusable Python library and build script for generating KiCad
  schematics, replacing throwaway scratch scripts.
* New: DevelopmentStandard.org gains an "Electronics" section
  documenting KiCad/AppImage usage and this project's own scripting
  approach, for reuse on future projects.
* Fixed: ChangeLog and NEWS entries from 1.17.1-1.22.0 had drifted
  into narrative mode; rewritten to the already-documented terse
  style.
* Fixed: the battery-free power schematic is now A4 (was A2), with
  tighter, calibrated component spacing, and a corrected USB-C label
  direction. Zero ERC errors maintained.

Version 1.22.0 (2026-08-03)
===========================
* Fixed: the KiCad battery-free power schematic (Power/) is now
  genuinely ERC-clean under KiCad 10 (zero errors, was 79). Fixed
  pin-position calculation bugs; wider component spacing.
* Dudhya.org, FutureResearch.org, SessionHandoff.org updated to
  match the now-verified status.

Version 1.21.0 (2026-08-02)
===========================
* Corrected: the KiCad schematic is documented as an unreliable
  draft --- re-checking its netlist found additional wiring errors
  beyond the single anomaly first reported.
* New: Power/dudhya-pixel3a-battery-free-power.kicad_pro project
  file. New "Complete wiring specification" in Dudhya.org, and a
  reverse-current diode (D2) added to the design. ST citation links
  added for both ICs used (STUSB4500, STL6P3LLH6).

Version 1.20.0 (2026-08-02)
===========================
* New: Power/dudhya-pixel3a-battery-free-power.kicad_sch, a
  discrete-component schematic (STUSB4500 + XL4015) for running the
  Pixel 3a without its battery.
* Confirmed: the uploaded Instructables source is an exact device
  match for the Pixel 3a. BOM checked and confirmed coherent.
  Dudhya.org's Power management subsection rewritten accordingly.
* FutureResearch.org, SessionHandoff.org updated.

Version 1.19.0 (2026-08-02)
===========================
* New: Dudhya.org gains "Google Pixel 3a (google-sargo)", the first
  hands-on-work section for the second device. Pulls the
  already-sourced research findings into an actionable procedure
  (known caveats, sensor-inventory checklist) and starts the
  battery-free power work.
* Battery-free work: one corroborating technical source found and
  cited; three of the user's own sources could not yet be fetched.

Version 1.18.1 (2026-08-02)
===========================
* DevelopmentStandard.org's research-tool rule renamed "Critical:
  Research Tool Workflow" and extended to cover launch timing
  (present the research button immediately once discussion closes)
  and integration timing (proceed same-turn unless the findings need
  the user's decision).

Version 1.18.0 (2026-08-02)
===========================
* New: Dudhya.org gains a third annex, "Operating system choice
  re-evaluation", comparing genuine mainline-Linux OSes against
  Halium-based alternatives and Sailfish. postmarketOS confirmed
  correct on every criterion.
* FutureResearch.org's second-device item amended with a
  reinforcing GPS finding. SessionHandoff.org condensed and updated.

Version 1.17.1 (2026-08-02)
===========================
* Fixed: extended annex sections had sources named in prose without
  an actual link. Added the real primary source for every claim.

Version 1.17.0 (2026-08-01)
===========================
* New project rule: DevelopmentStandard.org gains "Critical: Research
  Integration" --- when the Research tool is used for this project,
  findings must be added or amended into the main document
  (Dudhya.org), not left as a standalone chat artifact. Scoped to
  substantial Research-tool investigations, not routine incidental
  searches.
* Applied immediately: Dudhya.org's "Annex: Second-device selection
  research" extended with three new sections (physical dimensions/
  weight, battery-free operation feasibility, cybersecurity/binary-
  blob posture) plus amendments to the summary and caveats. The Poco
  F1 recommendation still holds; new finding: the OnePlus 6/6T are
  the only candidates with a documented batteryless-boot method,
  worth acquiring as a dedicated R&D unit for the separate
  battery-power work. New tables kept deliberately narrow, learning
  from the prior table-width incident; re-verified via the LaTeX log
  directly, not just "did it build."
* FutureResearch.org, SessionHandoff.org updated accordingly. Also
  fixed a real markdown-vs-Org-mode bold-syntax bug in
  SessionHandoff.org (**bold** instead of *bold*) found while
  reviewing it.

Version 1.16.0 (2026-08-01)
===========================
* New: Dudhya.org gains "Annex: Second-device selection research", a
  sourced comparison across postmarketOS community-tier devices
  against GPS/sensor completeness, port maturity, and price. This
  supersedes the earlier default plan of the Nexus 7 2013 as second
  device (dropped: its GPS was very likely tied to the LTE-cellular
  variant, not the WiFi-only asus-flo this project had targeted).
  Recommendation: Xiaomi Poco F1 (xiaomi-beryllium), with OnePlus 6
  and Google Pixel 3a as ranked alternates. Nothing acquired or
  hands-on verified yet --- research only.
* A real LaTeX table-width defect (347pt overfull hbox) was caught
  by checking the build log directly, not just "did it build," and
  fixed by redesigning the table rather than a font-size hack; final
  overflow (33.5pt) matches the magnitude of several other
  pre-existing, long-tolerated minor overflows elsewhere in the
  document.
* FutureResearch.org, SessionHandoff.org updated to reflect the new
  second-device decision.

Version 1.15.0 (2026-08-01)
===========================
* CONFIRMED: the AP power-save mitigation resolved the idle-link
  instability (packet loss, re-authentication failures).
* New, accepted limitation (not pursued as a fix, matching the
  poweroff precedent): sustained heavy traffic (e.g. package
  downloads) stalls the whole system while AP mode is active,
  confirmed via Provisioning failing identically in both cable and
  radio mode under AP mode --- a different, driver-level mechanism
  (command-queue overload under sustained load) from the earlier
  power-save issue, matched against real documented brcmfmac CPU/
  driver-stall reports. Practical guidance: prefer cable mode for
  heavy transfers.
* Fixed: dudhya-host-connect's interface-collision safety check
  (previously only in radio mode) extended to cable mode too, after
  a real host reboot was observed assigning the wired ethernet and
  USB gadget interfaces the same name.

Version 1.14.0 (2026-08-01)
===========================
* CONFIRMED: the dudhya-wifi-mode restart-sequence fix was the actual
  cause of the AP authentication issue (passphrase itself never
  contained problem characters). AP mode client authentication now
  works.
* New issue found once AP mode connects: periodic packet loss (80%+,
  worse phone-to-client) leading to eventual re-authentication
  failure during idle periods, confirmed not a distance/signal issue.
  Matched against a real historical linux-wireless report on the same
  Broadcom chip family (BCM43438, close relative of this device's
  BCM4339) acting as an AP, tracing an identical symptom to the
  client's own WiFi power-saving mode. Mitigation: dudhya-host-connect
  radio now disables power-save on the host's WiFi interface
  automatically (iw dev <iface> set power_save off). Not yet
  independently confirmed to resolve this specific case.
* Confirmed the Provisioning scripts' own interface-detection logic
  works correctly even when the underlying WiFi link is flaky (the
  apk DNS failures were a downstream symptom, not a script bug).

Version 1.13.0 (2026-08-01)
===========================
* CONFIRMED on real hardware: WiFi station mode. Clean association,
  DHCP lease, connectivity confirmed on first attempt.
* WiFi AP mode: hostapd/dnsmasq start correctly and the SSID
  broadcasts, but client authentication was failing ("incorrect
  password") from two different tested devices. Diagnosed and fixed
  both plausible mechanisms: (1) IMPORTANT FIX to dudhya-wifi-mode
  itself, which did not force a service restart on re-invocation if
  already in the target mode, meaning an edited passphrase might
  never actually get reloaded (hostapd would keep authenticating
  against a stale, previously-loaded value) --- now unconditionally
  restarts every relevant service on every invocation; (2)
  hostapd.conf.example and wpa_supplicant.conf.example rewritten with
  explicit CHANGE THIS markers and the specific syntax gotchas for
  each file stated inline (hostapd.conf uses no quotes and treats "#"
  as a comment marker; wpa_supplicant.conf requires quotes). Neither
  mechanism independently confirmed as the actual cause; next step is
  simply retrying AP mode.
* Dudhya.org's "Switching" section corrected to show the WiFi/ path
  prefix actually needed when running from the extracted source tree.

Version 1.12.1 (2026-08-01)
===========================
* CONFIRMED on real hardware: Provisioning scripts, cable mode. Both
  dudhya-host-connect and dudhya-device-update ran successfully
  against the actual physical unit (interface auto-detection, a real
  apk upgrade, a real apk add with an explicit package list). radio
  mode still unconfirmed.
* New, researched finding: a USB gadget cold-boot quirk --- the
  device isn't detected if the cable is connected after boot rather
  than before. Matches a known category of boot-time USB-gadget
  binding issue on mainline phone ports generally (a real N900 kernel
  patch, a real postmarketOS issue on another device), though no
  hammerhead-specific report found. Practical workaround (cable
  before power-on) documented as sufficient.
* Clarified: cable and radio connections are not hardware-exclusive
  (separate interfaces); only exclusive for which one carries the
  device's own outbound default route, a consequence of the
  Provisioning scripts' own ip route replace usage.

Version 1.12.0 (2026-08-01)
===========================
* New: Provisioning scripts (Provisioning/dudhya-host-connect,
  Provisioning/dudhya-device-update) automating package installation/
  upgrade connectivity for both cable and radio connections, as a
  matched host/device pair. Requested while AP-mode hardware testing
  was still in progress, to have tooling ready for whatever comes
  next. A real set -e bug (a failed detection function in a bare
  command-substitution assignment aborts the script before its own
  intended error message can run) was caught by directly testing the
  shell semantics, not just reading the code back, and fixed at every
  affected call site in both scripts. dmesg and dnsmasq-lease parsing
  logic tested against realistic fake input. Not yet run against real
  networking commands or hardware --- this development environment
  has no ip/iptables tools at all.

Version 1.11.0 (2026-07-31)
===========================
* New: WiFi station/AP mode switching. hostapd+dnsmasq for AP mode,
  wpa_supplicant+udhcpc for station mode, both OpenRC-managed; a new
  WiFi/dudhya-wifi-mode script switches between them (switching, not
  concurrent operation, per project decision). Three example config
  files (WiFi/*.conf.example). AP subnet 192.168.4.0/24. Package
  names and config formats checked against real Alpine documentation.
  Not yet run against the physical unit --- verification so far is
  build-system/static-analysis only (shellcheck, archive-content
  checks); WiFi hardware interaction can't be simulated the way IIO
  sysfs could be for dudhya-sensord.
* Fixed two real bugs found while implementing the above: make-archive
  had carried a stale, unactioned note about checking executable bits
  since 1.6.0 without ever implementing the check; implementing it
  properly immediately caught OpenRC/dudhya-sensord having actually
  lost its executable bit (also fixed). Both make-archive and
  OpenRC/dudhya-sensord were also missing the project's own required
  $Id/copyright header convention for shell scripts (also fixed).

Version 1.10.0 (2026-07-31)
===========================
* New: dudhya/<device>/status topic (retained, published at startup)
  reporting version, start timestamp, PID, and which sensors were
  found. Paired dudhya/<device>/status/get request topic: any message
  received there triggers an immediate re-publish with a fresh
  timestamp, giving both an on-demand refresh and a genuine liveness
  check (a retained message alone can't distinguish "still running"
  from "crashed after its one retained publish"). Verified end-to-end
  against a real broker and subscriber.

Version 1.9.1 (2026-07-31)
===========================
* Fixed: --calibrate-accel needs sudo to write /etc/dudhya/sensord.conf
  (was not documented). Corrected in Dudhya.org, sensord.conf.example,
  and the source's own usage comments.
* Static calibration re-confirmed on-device with a second real sample
  set (accel ~0.7% off gravity, gyro essentially exact zero, magn
  squarely in Earth's expected range). A first informal dynamic test
  (free-hand movement) was chaotic as expected at 1Hz on uncontrolled
  motion --- not a real dynamic verification yet; tracked as its own
  item in FutureResearch.org.
* Explained: a one-off OpenRC "swap is the name of a real and virtual
  service" message is a known, pre-existing system quirk, unrelated
  to dudhya-sensord's own service script.

Version 1.9.0 (2026-07-31)
===========================
* MILESTONE: dudhya-sensord running on the physical Nexus 5,
  publishing real sensor telemetry over MQTT for the first time.
* First real data revealed accelerometer/gyroscope/magnetometer
  calibration problems; all three diagnosed and fixed:
  - Accelerometer: traced in_accel_*_calibbias to the actual
    inv_mpu6050 kernel driver source (a live hardware register, not a
    software-side value to add). New --calibrate-accel mode (device
    lying flat, screen up), persisting the result to the config file.
  - Gyroscope: automatic zero-rate calibration at every startup.
  - Magnetometer: an empirically-derived x10 correction factor.
  All three verified against the actual compiled binary with fake
  sensor data reproducing the real device's readings. Not yet tested
  under dynamic/moving conditions --- verification so far is static.
* sensord.conf.example documents the new accel_bias_x/y/z keys.

Version 1.8.3 (2026-07-31)
===========================
* Resolved: the mosquitto_sub "Bad file descriptor" error was simply
  the broker not yet started (documented as a recognized pattern in
  Dudhya.org: this environment's tooling reports "not running/
  configured yet" conditions as confusing low-level errors, same as
  the earlier "DNS: transient error" that was really a missing NAT
  rule). Broker connectivity (mosquitto_sub/mosquitto_pub) now
  confirmed working on the physical Nexus 5.

Version 1.8.2 (2026-07-31)
===========================
* Fixed make dist: bootstrap and Constitution.org were never listed
  in any distributed-file variable, so both were silently missing
  from any make-dist-produced tarball (found by auditing every
  project file against what make dist actually packages, not just
  patching the one reported symptom). Both now ship correctly.
* Fixed a missing step in Dudhya.org's dudhya-sensord deploy
  instructions: /etc/dudhya was never created before copying the
  example config into it.

Version 1.8.1 (2026-07-31)
===========================
* Clarified in Dudhya.org: the host-side NAT/forwarding setup does
  not survive a host reboot, and a broken forwarding path can show up
  misleadingly as a "DNS: transient error" from apk rather than an
  obviously network-related message. Added a quick check to run
  before assuming DNS itself is the problem.

Version 1.8.0 (2026-07-31)
===========================
* IMPORTANT FIX: OpenRC/dudhya-sensord (the service script) was
  silently missing from every archive since 1.6.0 due to an
  unanchored .tar-exclude pattern also matching this file's basename.
  If you deployed from 1.6.0 or 1.7.0, re-fetch this version and
  re-copy the file --- it was never actually there. make dist is
  fixed as a result (it was failing looking for this missing file).
* Clarified: the PM8941 PMIC ADC channels found during sensor
  discovery are read-only telemetry, not a power-control mechanism.
* Dudhya.org documents how the source actually gets onto the device
  (make dist + scp + expand), previously missing entirely.
* New research item: powering candidate devices without their
  battery, for external power management (applies to any device, not
  just the Nexus 5).

Version 1.7.0 (2026-07-31)
===========================
* Poweroff/restart investigated to a conclusion: most likely never
  implemented for this device's mainline kernel port at all, rather
  than a bug (confirmed via cross-referencing masneyb/nexus-5-upstream's
  own exhaustive component-by-component patch list, which contains
  zero mentions of poweroff/restart anywhere; watchdog and lk2nd-
  timeout explanations both ruled out directly). Not being pursued as
  a fix; the physical bootloader-menu method remains the practical
  workaround. Documented in Dudhya.org.
* Two related documentation fixes: the host's USB network interface
  name changes per phone reboot (not just per host machine), and a
  missing "assign an IP manually" fallback step for getting SSH
  working at all was added to Dudhya.org.

Version 1.6.0 (2026-07-30)
===========================
* dudhya-sensord: the project's first compiled component. Publishes
  the Nexus 5's six confirmed-working sensors (light, proximity,
  accelerometer, gyroscope, barometer, magnetometer) as JSON to a
  local mosquitto broker, under a dudhya/<device>/... topic tree
  designed to scale to multiple devices. Verified end-to-end in the
  development sandbox; on-device deployment not yet done. Build and
  deployment instructions (including on-device apk package names)
  are in Dudhya.org and README.
* configure.ac gains AC_PROG_CC and an optional libmosquitto check,
  following the project's existing warn-don't-fail convention for
  optional dependencies.

Version 1.5.0 (2026-07-30)
===========================
* Sensor inventory complete for the Nexus 5: six sensors confirmed
  working with real physical-test evidence (light, proximity,
  accelerometer, gyroscope, barometer, magnetometer). GPS and camera
  confirmed not working, each with a specific documented reason (GPS:
  the modem subsystem is non-functional, a known upstream issue;
  camera: the ISP is not implemented in this port). Full detail in
  ResearchJournal.org and a reference summary in Dudhya.org.

Version 1.4.0 (2026-07-30)
===========================
* Post-milestone architecture decided: the phone hosts its own MQTT
  broker and acts as the network hub (WiFi access point) for
  in-vehicle deployment. AP mode confirmed technically feasible
  (iw list shows AP support on this device's WiFi hardware/driver).
* Dudhya.org documents internet access setup over the USB link (host
  NAT + phone route) and Alpine apk package management, including
  two corrected assumptions: the host's internet-facing interface
  name is host-specific, and this unit uses sudo, not the doas
  postmarketOS now defaults to.

Version 1.3.0 (2026-07-30)
===========================
* MILESTONE: the Nexus 5 (lg-hammerhead) boots postmarketOS
  end-to-end and is reachable over SSH, confirmed on the actual unit.
  Unlock, OpenRC-based install, and flashing all confirmed working;
  the earlier "stuck at logo" boot blocker is resolved. Dudhya.org's
  Nexus 5 procedure is now a confirmed, working procedure through
  first boot and SSH login, not a research-stage draft.
* Next phase: sensor/telemetry verification (GPS, accelerometer,
  gyroscope), the project's actual goal for this device.

Version 1.2.4 (2026-07-30)
===========================
* Corrected Dudhya.org's Nexus 5 procedure: current pmbootstrap has
  no --no-fde flag (no full-disk encryption is now the default,
  --fde is the opt-in alternative). Found when restarting the
  hands-on process on a new system.

Version 1.2.3 (2026-07-30)
===========================
* Fixed the 1.2.1 Devanagari fix itself: the font-switching command
  wasn't properly scoped, so every character after the Sanskrit
  phrase (not just the phrase itself) was rendered as tofu in the
  Devanagari font. Now correctly scoped with \DeclareTextFontCommand.

Version 1.2.2 (2026-07-30)
===========================
* SessionHandoff.org now explicitly notes that the 1.2.1 session was
  documentation/tooling-only and confirms the Nexus 5 hands-on state
  is unchanged, rather than silently leaving the document untouched
  (which broke this project's own "rewritten each iteration" rule and
  left it ambiguous whether that was intentional).

Version 1.2.1 (2026-07-30)
===========================
* Fixed a PDF build warning ("Missing character(s)... fontspec") from
  the Devanagari phrase in Concept.org: added proper Devanagari font
  support rather than the character-substitution approach used for
  other symbols.
* ResearchJournal.org's bibliographical references are now followable
  links, not bare URLs.

Version 1.2.0 (2026-07-29)
===========================
* Nexus 5 (lg-hammerhead): bootloader unlock, pmbootstrap install,
  and flashing (lk2nd/rootfs/kernel) confirmed working against the
  actual unit. First boot currently blocked (stuck at logo, no
  network); host-side USB/cable and kernel configuration ruled out
  as causes. Leading hypothesis is a systemd/USB-gadget interaction
  on this mainline-kernel device; next step is retrying with OpenRC.

Version 1.1.0 (2026-07-28)
===========================
* Scope decision recorded: first target device is the Google Nexus 5
  (lg-hammerhead), second is the Google Nexus 7 2013 (asus-flo);
  target operating system is postmarketOS.
* Dudhya.org gains an initial Nexus 5 resuscitation procedure
  (research-stage, not yet physically verified on the actual unit).

Version 1.0.0 (2026-07-28)
===========================
* Initial release: project concept and constitution, development
  standard, and the autotools/Org-mode documentation toolchain
  (PDF via LuaLaTeX, HTML export, both driven by ./configure && make).
* No compiled program or manual pages yet; this delivery is the
  project's documentation and build-system scaffold.
