docs(qfd): retire H14 from HOWs

Module count / public-API surface is a static source-code property,
not a runtime function nor an artifact characteristic like H10 binary
or H15 build time. It was a refactor-leverage proxy for W9 — proxies
of proxies belong in the ADRs and the component matrix, not in the
HoQ. Removed from §2, §5 matrix, §4 conflict list, and the C12
overloaded-list mention; basement Σ total drops 1674 → 1557 so rel%
recomputed in quality-house.md.
This commit is contained in:
Julien Calixte
2026-05-19 11:46:07 +02:00
parent 2aa194bdb9
commit 8a223e7837
2 changed files with 35 additions and 32 deletions

View File

@@ -66,7 +66,6 @@ shows what "better" looks like (↑ higher, ↓ lower, → fixed).
| H11 | Stack budget across all tasks | ↓ | ≤ 80 KB (sum) | same |
| H12 | Wi-Fi reconnect on transient outage | ↓ | ≤ 30 s | ≤ 10 s |
| H13 | Idle / typing / push current draw | ↓ | measured only | sized for >2 days |
| H14 | Module count / public-API surface (refactor proxy) | → | ≤ 8 modules | same |
| H15 | Build time (clean, release) | ↓ | ≤ 7 min | ≤ 5 min |
---
@@ -160,7 +159,7 @@ the design are called out below.
- **H6 push success ↔ H12 Wi-Fi reconnect** (reinforcing). Both come from
the same network stack; investing in reconnect backoff helps both.
- **H10 binary ↔ H15 build time** (strong). std builds are slow. Accepted
in [ADR-001] — refactor leverage (H14) is the long-term payoff, not the
in [ADR-001] — refactor leverage is the long-term payoff, not the
per-build seconds.
- **H4 boot ↔ H10 binary** (mild). Larger binary = slower flash load.
Affordable at our size class but worth watching as features land.
@@ -169,8 +168,6 @@ the design are called out below.
parked. W14's portability outcome raises the value of that policy
from "battery hygiene" to "the thing that lets the device leave the
desk."
- **H14 modularity ↔ H15 build time** (mild). More small crates = more
link work. Boring vs valuable; we lean toward modularity.
- **W13 typography ↔ H9 heap + H10 binary** (mild, future). Achieving a
writing-tool tone needs room for glyph caches and font assets. Not
load-bearing in v0.1 (one mono font), but the v1.0 tone goal is why H9
@@ -225,7 +222,6 @@ Function-to-component matrix (9 strong / 3 medium / 1 weak):
| H11 stk | | | 9 | | | | | | 3 | | | 3 | | | | |
| H12 wifi | 3 | 9 | | | | | | | | | | | 3 | | | |
| H13 mA | 9 | | 1 | | 9 | | | | 3 | 3 | | | | | | 9 |
| H14 mod | | 3 | 3 | | | 3 | 9 | 3 | | | | 9 | | | | |
| H15 build | | 9 | | | | | | | | | | 9 | 3 | | | |
### Read across, not down
@@ -233,7 +229,7 @@ Function-to-component matrix (9 strong / 3 medium / 1 weak):
- **C5/C6/C7** (panel + graphics + widget) are the single most leveraged
cluster — they own H1, H2, H3 (the top of the priority list). [ADR-002]
and [ADR-003] are the ADRs to keep most honest as v0.x progresses.
- **C12** (`gitoxide`) is overloaded: H6, H7, H9, H10, H11, H14, H15 all
- **C12** (`gitoxide`) is overloaded: H6, H7, H9, H10, H11, H15 all
touch it. That's why [ADR-004] includes a kill-switch (fall back to
`libgit2-sys` if spike 7 fails). It's also why H9 sits in the top three
priorities — `gitoxide`'s memory profile is the unknown.
@@ -393,6 +389,21 @@ These are the live tensions we are watching, not deciding harder:
"W13 reframed, W14 removed" bullet above); the slot is now repurposed.
§6's "(b) narrow voter base" override for H8 no longer applies and
has been retired in the §6 preamble.
- **H14 retired — not a function.** §2 frames HOWs as "engineering
functions" but H14 ("Module count / public-API surface (refactor
proxy)") is a static property of source-code organisation, not a
runtime function nor an artifact characteristic like H10 binary or
H15 build time. The refactor-leverage idea survives in §5's
component structure and the ADRs that decide architectural
discipline; it does not need a HoQ matrix slot. Removed from §2,
the §5 matrix row, the C12 overloaded-list mention, and the §4
H14↔H15 conflict bullet. W9's matrix vote shrinks from
`H10 W + H11 W + H14 S + H15 M` to `H10 W + H11 W + H15 M` — an
honest reading that "codebase absorbs the planned roadmap" is
delivered by ADRs, not by a measurable function. ID "H14" left as
a gap (cross-doc HOW references survive without renumbering H15).
Total basement Σ drops 1674 → 1557, so rel% recomputed in
[`quality-house.md`](quality-house.md).
The minor variance between README's "~12 lines" and product/[ADR-003]'s
"~11 lines" of edit area is within rounding for a 14 px glyph in a 240 px

View File

@@ -1,6 +1,6 @@
# Quality House
The 14 WHATs × 15 HOWs House of Quality. The roof carries function-vs-
The 14 WHATs × 14 HOWs House of Quality. The roof carries function-vs-
function correlations; the basement carries v0.1 targets (mirrored from
[`qfd.md`](qfd.md) §2) plus the weighted-vote sums
(`Σ = Σ(W weight × cell strength)`) and rounded relative weights. The
@@ -247,7 +247,7 @@ market"), not as a fair head-to-head buyer's guide.
% --- Dimensions tuned for the typewriter QFD (14 W x 15 H) ---
\def\qfdNW{14}
\def\qfdNH{15}
\def\qfdNH{14}
\def\qfdWhatW{4.6}
\def\qfdImpW{0.7}
\def\qfdHdrH{5.0}
@@ -338,8 +338,7 @@ market"), not as a fair head-to-head buyer's guide.
11/{H11 Total stack budget},
12/{H12 Wi-Fi reconnect time},
13/{H13 Idle / typing / push current},
14/{H14 Module / API surface count},
15/{H15 Clean release build time}%
14/{H15 Clean release build time}%
}
\node[rotate=90, anchor=west, font=\scriptsize]
at ({\c - 0.5}, 0.15) {\t};
@@ -362,10 +361,9 @@ market"), not as a fair head-to-head buyer's guide.
% W3 row 3: H8S
\node[qfdrel/S] at ({8 - 0.5}, {-3 + 0.5}) {};
% W4 row 4: H6M H12M H14W
% W4 row 4: H6M H12M
\node[qfdrel/M] at ({6 - 0.5}, {-4 + 0.5}) {};
\node[qfdrel/M] at ({12 - 0.5}, {-4 + 0.5}) {};
\node[qfdrel/W] at ({14 - 0.5}, {-4 + 0.5}) {};
% W5 row 5: H4S H10M
\node[qfdrel/S] at ({4 - 0.5}, {-5 + 0.5}) {};
@@ -381,37 +379,33 @@ market"), not as a fair head-to-head buyer's guide.
\node[qfdrel/M] at ({11 - 0.5}, {-6 + 0.5}) {};
\node[qfdrel/M] at ({12 - 0.5}, {-6 + 0.5}) {};
% W7 row 7: H1M H2M H3M H13M H14W
% W7 row 7: H1M H2M H3M H13M
\node[qfdrel/M] at ({1 - 0.5}, {-7 + 0.5}) {};
\node[qfdrel/M] at ({2 - 0.5}, {-7 + 0.5}) {};
\node[qfdrel/M] at ({3 - 0.5}, {-7 + 0.5}) {};
\node[qfdrel/M] at ({13 - 0.5}, {-7 + 0.5}) {};
\node[qfdrel/W] at ({14 - 0.5}, {-7 + 0.5}) {};
% W8 row 8: H1W H2S H3S
\node[qfdrel/W] at ({1 - 0.5}, {-8 + 0.5}) {};
\node[qfdrel/S] at ({2 - 0.5}, {-8 + 0.5}) {};
\node[qfdrel/S] at ({3 - 0.5}, {-8 + 0.5}) {};
% W9 row 9: H10W H11W H14S H15M
% W9 row 9: H10W H11W H15M
\node[qfdrel/W] at ({10 - 0.5}, {-9 + 0.5}) {};
\node[qfdrel/W] at ({11 - 0.5}, {-9 + 0.5}) {};
\node[qfdrel/S] at ({14 - 0.5}, {-9 + 0.5}) {};
\node[qfdrel/M] at ({15 - 0.5}, {-9 + 0.5}) {};
\node[qfdrel/M] at ({14 - 0.5}, {-9 + 0.5}) {};
% W10 row 10: H10M H13W H14M H15W
% W10 row 10: H10M H13W H15W
\node[qfdrel/M] at ({10 - 0.5}, {-10 + 0.5}) {};
\node[qfdrel/W] at ({13 - 0.5}, {-10 + 0.5}) {};
\node[qfdrel/M] at ({14 - 0.5}, {-10 + 0.5}) {};
\node[qfdrel/W] at ({15 - 0.5}, {-10 + 0.5}) {};
\node[qfdrel/W] at ({14 - 0.5}, {-10 + 0.5}) {};
% W11 row 11: H13S
\node[qfdrel/S] at ({13 - 0.5}, {-11 + 0.5}) {};
% W12 row 12: H6W H8M H14M
% W12 row 12: H6W H8M
\node[qfdrel/W] at ({6 - 0.5}, {-12 + 0.5}) {};
\node[qfdrel/M] at ({8 - 0.5}, {-12 + 0.5}) {};
\node[qfdrel/M] at ({14 - 0.5}, {-12 + 0.5}) {};
% W13 row 13: H9M
\node[qfdrel/M] at ({9 - 0.5}, {-13 + 0.5}) {};
@@ -442,25 +436,23 @@ market"), not as a fair head-to-head buyer's guide.
\node[font=\scriptsize] at (C-9-10) {$-\!-$}; % H9-H10 heap vs binary
\node[font=\scriptsize] at (C-10-15) {$-\!-$}; % H10-H15 binary vs build
\node[font=\scriptsize] at (C-11-13) {$-$}; % H11-H13
\node[font=\scriptsize] at (C-14-15) {$-$}; % H14-H15 modularity vs build
% ---------- Basement: target / abs weight / rel weight % ----------
\foreach \c/\tgt/\abs/\rel in {%
1/{$\leq$200\,ms}/148/9,
1/{$\leq$200\,ms}/148/10,
2/{$\leq$1 line}/177/11,
3/{1 : 20}/144/9,
4/{$\leq$5\,s}/62/4,
5/{$\geq$1\,h}/111/7,
6/{$\geq$95\,\%}/134/8,
6/{$\geq$95\,\%}/134/9,
7/{$\leq$30\,s}/27/2,
8/{100\,\%}/156/9,
8/{100\,\%}/156/10,
9/{$\geq$1\,MB}/193/12,
10/{$\leq$2\,MB}/41/2,
10/{$\leq$2\,MB}/41/3,
11/{$\leq$80\,KB}/45/3,
12/{$\leq$30\,s}/153/9,
13/{obs.}/137/8,
14/{$\leq$8}/117/7,
15/{$\leq$7\,min}/29/2%
12/{$\leq$30\,s}/153/10,
13/{obs.}/137/9,
14/{$\leq$7\,min}/29/2%
} {
\node[font=\scriptsize] at ({\c - 0.5}, {-\qfdNW - 0.5}) {\tgt};
\node[font=\scriptsize] at ({\c - 0.5}, {-\qfdNW - 1.5}) {\abs};
@@ -648,7 +640,7 @@ picture.
`++` strong reinforcement (`◎`), `+` mild reinforcement (`○`), `` mild
conflict (`×`), `` strong conflict (`⊗`).
- **Basement rows** are: v0.1 target → §3 column sum (`Σ` of
`weight × strength`) → relative weight as integer % of total (1674).
`weight × strength`) → relative weight as integer % of total (1557).
Relative weights round to 100.
- **H7, H10, H15** (push time, binary size, build time) sit at the bottom
of the basement — knowingly-paid costs per `qfd.md` §7, not signals to