Skip to content

Commit b451937

Browse files
committed
Reconstruct core curs_color (pairs + cell colour) -- 50%, honest gaps
Extend the cell attribute word with colour-pair bits and add a pair registry. - window.rs: color_pair(n)=n<<8, pair_number(attr), A_COLOR mask, Window::color_set (replaces the active colour), and attron now replaces colour bits (ncurses semantics) while OR-ing the rest. - color.rs: Palette with init_pair/pair_content (pair 0 = default 7,0). - terminfo: has_colors (colors>0) and can_change_color (ccc), derived from the court-matched tigetnum/tigetflag. Courts: NCURSES.WINDOW.ATTR gains colour scripts (color_set + attron(COLOR_PAIR) read back via winch colour bits); NCURSES.COLOR.PAIR compares init_pair/ pair_content + COLOR_PAIR/PAIR_NUMBER to ncurses. Both admitted_match. Parity (compass caught and fixed a stale start_color counterpart vs new classification): curs_color 20/40 (50%) -- core reconstructed (partial), the colour config (start_color/use_default_colors/...) n/a, and the rgb palette (init_color/color_content), extended 32-bit colour, and dynamic pair allocation left as honest gaps (not faked). Overall 284/481 (59.0%): 183 reconstructed (32 full, 126 partial, 21 scaffold, 4 divergent) + 101 classified (28 deferred, 73 n/a). 52 tests; gate green.
1 parent 21d9d8a commit b451937

14 files changed

Lines changed: 379 additions & 76 deletions

File tree

README.md

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,24 @@ clang C inventory joined with the `syn`-extracted Rust inventory and a curated,
3636
validated counterpart map). `cargo xtask check` is the freshness gate -- it
3737
re-renders in memory and fails if a doc drifted, a counterpart points at a
3838
missing Rust symbol, or a cited court has no receipt. CI and the optional
39-
`.githooks/pre-commit` run it on every change. Measured coverage today: **268 /
40-
481 functions (55.7%)** resolved. Read that honestly as two parts:
39+
`.githooks/pre-commit` run it on every change. Measured coverage today: **284 /
40+
481 functions (59.0%)** resolved. Read that honestly as two parts:
4141

42-
- **175 reconstructed** (32 full, 116 partial, 23 scaffold, 4 divergent) -- actual
43-
Rust that emits/derives bytes or reconstructs window state/geometry/attributes,
44-
court-backed.
45-
- **93 classified non-output** (28 deferred = proven to emit nothing, 65 n/a = no
42+
- **183 reconstructed** (32 full, 126 partial, 21 scaffold, 4 divergent) -- actual
43+
Rust that emits/derives bytes or reconstructs window state/geometry/attributes/
44+
colour, court-backed.
45+
- **101 classified non-output** (28 deferred = proven to emit nothing, 73 n/a = no
4646
terminal-output contract: pure queries, tty/termios state, library config,
4747
printer, window-free, or global `cur_term` management).
4848

49-
So ~36% of the API is *reconstructed* and the rest of the "resolved" total is
49+
So ~38% of the API is *reconstructed* and the rest of the "resolved" total is
5050
honest accounting of functions a byte-output reconstruction has nothing to emit
51-
for. **Nineteen groups are fully resolved (100%)** -- the ones with real
52-
reconstruction:
51+
for. **Nineteen groups are fully resolved (100%)**; **Color** (`curs_color`) is
52+
half reconstructed (the core: `init_pair`/`pair_content`, `color_set`,
53+
`COLOR_PAIR`/`PAIR_NUMBER`, `has_colors`/`can_change_color`, and colour pairs on
54+
the cell grid via `winch`) -- the rgb palette (`init_color`/`color_content`),
55+
extended 32-bit colour, and dynamic pair allocation remain honest gaps. The
56+
fully-resolved groups:
5357

5458
- **Terminfo & termcap** (`curs_terminfo`/termcap, 33/33) -- the substrate: the
5559
runtime `tigetflag`/`tigetnum`/`tigetstr` (lookup), `tparm` (parameterized

docs-src/models/parity.model.json

Lines changed: 120 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,38 @@
495495
"wgetparent": {
496496
"status": "n_a",
497497
"note": "Returns the parent window pointer; a pointer query with no terminal-output contract."
498+
},
499+
"start_color": {
500+
"status": "n_a",
501+
"note": "Initializes the colour subsystem; no immediate terminal output."
502+
},
503+
"start_color_sp": {
504+
"status": "n_a",
505+
"note": "Initializes the colour subsystem; no immediate terminal output."
506+
},
507+
"use_default_colors": {
508+
"status": "n_a",
509+
"note": "Configures default (-1) colours; library state with no immediate terminal output."
510+
},
511+
"use_default_colors_sp": {
512+
"status": "n_a",
513+
"note": "Configures default (-1) colours; library state with no immediate terminal output."
514+
},
515+
"assume_default_colors": {
516+
"status": "n_a",
517+
"note": "Configures default (-1) colours; library state with no immediate terminal output."
518+
},
519+
"assume_default_colors_sp": {
520+
"status": "n_a",
521+
"note": "Configures default (-1) colours; library state with no immediate terminal output."
522+
},
523+
"reset_color_pairs": {
524+
"status": "n_a",
525+
"note": "Resets the colour-pair table; library state with no terminal output."
526+
},
527+
"reset_color_pairs_sp": {
528+
"status": "n_a",
529+
"note": "Resets the colour-pair table; library state with no terminal output."
498530
}
499531
},
500532
"groups": [
@@ -2478,22 +2510,20 @@
24782510
"note": "Same ed bytes; no WINDOW model."
24792511
},
24802512
"color_set": {
2481-
"rust": "color::sgr_fg",
2513+
"rust": "window::Window::color_set",
24822514
"status": "partial",
24832515
"courts": [
2484-
"NCURSES.CAP.SETAF.2",
2485-
"NCURSES.CAP.SETAB.4"
2516+
"NCURSES.WINDOW.ATTR"
24862517
],
2487-
"note": "fg/bg byte producers are pinned to setaf/setab; pair allocation state is not modeled."
2518+
"note": "Sets the active colour pair on the cell grid; matched to ncurses via winch colour bits."
24882519
},
24892520
"wcolor_set": {
2490-
"rust": "color::sgr_fg",
2521+
"rust": "window::Window::color_set",
24912522
"status": "partial",
24922523
"courts": [
2493-
"NCURSES.CAP.SETAF.2",
2494-
"NCURSES.CAP.SETAB.4"
2524+
"NCURSES.WINDOW.ATTR"
24952525
],
2496-
"note": "Same setaf/setab bytes; no WINDOW model."
2526+
"note": "Sets the active colour pair on the cell grid; matched to ncurses via winch colour bits."
24972527
},
24982528
"initscr": {
24992529
"rust": "term::INIT_PROLOGUE",
@@ -2511,15 +2541,13 @@
25112541
],
25122542
"note": "Teardown epilogue constant; same divergence as initscr against the in-repo oracle."
25132543
},
2514-
"start_color": {
2515-
"rust": "color::sgr_fg",
2516-
"status": "scaffold",
2517-
"note": "No color-pair allocation table; only the per-color SGR byte producers exist."
2518-
},
25192544
"init_pair": {
2520-
"rust": "color::sgr_fg",
2521-
"status": "scaffold",
2522-
"note": "No pair table; the fg/bg SGR bytes a pair would activate are produced directly."
2545+
"rust": "color::Palette::init_pair",
2546+
"status": "partial",
2547+
"courts": [
2548+
"NCURSES.COLOR.PAIR"
2549+
],
2550+
"note": "Registers a colour pair; pair_content matched to ncurses."
25232551
},
25242552
"attron": {
25252553
"rust": "window::Window::attron",
@@ -3649,6 +3677,82 @@
36493677
"status": "scaffold",
36503678
"courts": [],
36513679
"note": "Emits the terminfo set_attributes byte sequence for an attribute; a byte stand-in, not separately courted."
3680+
},
3681+
"COLOR_PAIR": {
3682+
"rust": "window::color_pair",
3683+
"status": "partial",
3684+
"courts": [
3685+
"NCURSES.COLOR.PAIR"
3686+
],
3687+
"note": "COLOR_PAIR(n) = n<<8; matched to ncurses."
3688+
},
3689+
"PAIR_NUMBER": {
3690+
"rust": "window::pair_number",
3691+
"status": "partial",
3692+
"courts": [
3693+
"NCURSES.COLOR.PAIR"
3694+
],
3695+
"note": "PAIR_NUMBER(attr) = (attr & A_COLOR) >> 8; matched to ncurses."
3696+
},
3697+
"init_pair_sp": {
3698+
"rust": "color::Palette::init_pair",
3699+
"status": "partial",
3700+
"courts": [
3701+
"NCURSES.COLOR.PAIR"
3702+
],
3703+
"note": "Registers a colour pair; pair_content matched to ncurses."
3704+
},
3705+
"pair_content": {
3706+
"rust": "color::Palette::pair_content",
3707+
"status": "partial",
3708+
"courts": [
3709+
"NCURSES.COLOR.PAIR"
3710+
],
3711+
"note": "Returns a pair's (fg,bg); matched to ncurses (incl. default pair 0 = 7,0)."
3712+
},
3713+
"pair_content_sp": {
3714+
"rust": "color::Palette::pair_content",
3715+
"status": "partial",
3716+
"courts": [
3717+
"NCURSES.COLOR.PAIR"
3718+
],
3719+
"note": "Returns a pair's (fg,bg); matched to ncurses (incl. default pair 0 = 7,0)."
3720+
},
3721+
"has_colors": {
3722+
"rust": "terminfo::Terminfo::has_colors",
3723+
"status": "partial",
3724+
"courts": [
3725+
"NCURSES.TERMINFO.LOOKUP",
3726+
"NCURSES.TERMINFO.ECOLOGY"
3727+
],
3728+
"note": "colors>0, derived from terminfo (tigetnum colors, court-matched)."
3729+
},
3730+
"has_colors_sp": {
3731+
"rust": "terminfo::Terminfo::has_colors",
3732+
"status": "partial",
3733+
"courts": [
3734+
"NCURSES.TERMINFO.LOOKUP",
3735+
"NCURSES.TERMINFO.ECOLOGY"
3736+
],
3737+
"note": "colors>0, derived from terminfo (tigetnum colors, court-matched)."
3738+
},
3739+
"can_change_color": {
3740+
"rust": "terminfo::Terminfo::can_change_color",
3741+
"status": "partial",
3742+
"courts": [
3743+
"NCURSES.TERMINFO.LOOKUP",
3744+
"NCURSES.TERMINFO.ECOLOGY"
3745+
],
3746+
"note": "the ccc capability, derived from terminfo (tigetflag, court-matched)."
3747+
},
3748+
"can_change_color_sp": {
3749+
"rust": "terminfo::Terminfo::can_change_color",
3750+
"status": "partial",
3751+
"courts": [
3752+
"NCURSES.TERMINFO.LOOKUP",
3753+
"NCURSES.TERMINFO.ECOLOGY"
3754+
],
3755+
"note": "the ccc capability, derived from terminfo (tigetflag, court-matched)."
36523756
}
36533757
}
36543758
}

docs/generated/claim-index.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,20 @@ join, and `cargo xtask check` fails if any cited receipt is missing.
2323
| `NCURSES.CAP.EL` | admitted_match | `clrtoeol`, `wclrtoeol` |
2424
| `NCURSES.CAP.FLASH` | admitted_match | `flash`, `flash_sp` |
2525
| `NCURSES.CAP.HOME` | admitted_match | `mvcur` |
26-
| `NCURSES.CAP.SETAB.4` | admitted_match | `color_set`, `wcolor_set` |
27-
| `NCURSES.CAP.SETAF.2` | admitted_match | `color_set`, `wcolor_set` |
26+
| `NCURSES.COLOR.PAIR` | admitted_match | `COLOR_PAIR`, `PAIR_NUMBER`, `init_pair`, `init_pair_sp`, `pair_content`, `pair_content_sp` |
2827
| `NCURSES.CURS_SET` | admitted_match | `curs_set`, `curs_set_sp` |
2928
| `NCURSES.ERASE.NOOUTPUT` | admitted_match | `clearok` |
3029
| `NCURSES.OVERLAY.NOOUTPUT` | admitted_match | `copywin`, `overlay`, `overwrite` |
3130
| `NCURSES.REFRESH.NOOUTPUT` | admitted_match | `redrawwin`, `wredrawln` |
3231
| `NCURSES.SCROLL.NOOUTPUT` | admitted_match | `idcok`, `idlok`, `immedok`, `leaveok`, `scrl`, `scroll`, `scrollok`, `setscrreg`, `wscrl`, `wsetscrreg` |
3332
| `NCURSES.TERMATTRS` | admitted_match | `has_ic`, `has_ic_sp`, `has_il`, `has_il_sp`, `longname`, `longname_sp`, `termname`, `termname_sp` |
3433
| `NCURSES.TERMCAP` | admitted_divergence | `tgetent`, `tgetent_sp`, `tgetflag`, `tgetflag_sp`, `tgetnum`, `tgetnum_sp`, `tgetstr`, `tgetstr_sp`, `tgoto`, `tgoto_sp` |
35-
| `NCURSES.TERMINFO.ECOLOGY` | admitted_match | `restartterm`, `restartterm_sp`, `setupterm`, `tigetflag`, `tigetflag_sp`, `tigetnum`, `tigetnum_sp`, `tigetstr`, `tigetstr_sp` |
36-
| `NCURSES.TERMINFO.LOOKUP` | admitted_match | `tigetflag`, `tigetflag_sp`, `tigetnum`, `tigetnum_sp`, `tigetstr`, `tigetstr_sp` |
34+
| `NCURSES.TERMINFO.ECOLOGY` | admitted_match | `can_change_color`, `can_change_color_sp`, `has_colors`, `has_colors_sp`, `restartterm`, `restartterm_sp`, `setupterm`, `tigetflag`, `tigetflag_sp`, `tigetnum`, `tigetnum_sp`, `tigetstr`, `tigetstr_sp` |
35+
| `NCURSES.TERMINFO.LOOKUP` | admitted_match | `can_change_color`, `can_change_color_sp`, `has_colors`, `has_colors_sp`, `tigetflag`, `tigetflag_sp`, `tigetnum`, `tigetnum_sp`, `tigetstr`, `tigetstr_sp` |
3736
| `NCURSES.TOUCH.NOOUTPUT` | admitted_match | `syncok`, `touchline`, `touchwin`, `untouchwin`, `wcursyncup`, `wsyncdown`, `wsyncup`, `wtouchln` |
3837
| `NCURSES.TPARM` | admitted_match | `tiparm`, `tiparm_s`, `tparm`, `tparm_sp` |
3938
| `NCURSES.TPUTS` | admitted_match | `putp`, `putp_sp`, `tputs`, `tputs_sp` |
40-
| `NCURSES.WINDOW.ATTR` | admitted_match | `attr_get`, `attr_off`, `attr_on`, `attr_set`, `attroff`, `attron`, `attrset`, `chgat`, `getattrs`, `mvchgat`, `mvwchgat`, `standend`, `standout`, `wattr_get`, `wattr_off`, `wattr_on`, `wattr_set`, `wattroff`, `wattron`, `wattrset`, `wchgat`, `wstandend`, `wstandout` |
39+
| `NCURSES.WINDOW.ATTR` | admitted_match | `attr_get`, `attr_off`, `attr_on`, `attr_set`, `attroff`, `attron`, `attrset`, `chgat`, `color_set`, `getattrs`, `mvchgat`, `mvwchgat`, `standend`, `standout`, `wattr_get`, `wattr_off`, `wattr_on`, `wattr_set`, `wattroff`, `wattron`, `wattrset`, `wchgat`, `wcolor_set`, `wstandend`, `wstandout` |
4140
| `NCURSES.WINDOW.GEOMETRY` | admitted_match | `derwin`, `dupwin`, `getbegx`, `getbegy`, `getcurx`, `getcury`, `getmaxx`, `getmaxy`, `getparx`, `getpary`, `is_subwin`, `mvderwin`, `mvwin`, `newwin`, `newwin_sp`, `subwin`, `wresize` |
4241
| `NCURSES.WINDOW.STATE` | admitted_match | `addch`, `addnstr`, `addstr`, `border`, `box`, `delch`, `deleteln`, `echochar`, `erase`, `hline`, `inch`, `inchnstr`, `inchstr`, `innstr`, `insch`, `insdelln`, `insertln`, `insnstr`, `insstr`, `instr`, `move`, `mvaddch`, `mvaddnstr`, `mvaddstr`, `mvdelch`, `mvhline`, `mvinch`, `mvinchnstr`, `mvinchstr`, `mvinnstr`, `mvinsch`, `mvinsnstr`, `mvinsstr`, `mvinstr`, `mvvline`, `mvwaddch`, `mvwaddnstr`, `mvwaddstr`, `mvwdelch`, `mvwhline`, `mvwinch`, `mvwinchnstr`, `mvwinchstr`, `mvwinnstr`, `mvwinsch`, `mvwinsnstr`, `mvwinsstr`, `mvwinstr`, `mvwvline`, `vline`, `waddch`, `waddnstr`, `waddstr`, `wborder`, `wdelch`, `wdeleteln`, `wechochar`, `werase`, `whline`, `winch`, `winchnstr`, `winchstr`, `winnstr`, `winsch`, `winsdelln`, `winsertln`, `winsnstr`, `winsstr`, `winstr`, `wmove`, `wvline` |
4342

docs/generated/port-parity-functions.md

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ C function's signature, return values, or window semantics -- ncurses-native is
1919
byte-output reconstruction, not a C API. Credit is withheld from every function
2020
that is neither reconstructed nor classified with evidence.
2121

22-
**Overall: 268 / 481 C functions are resolved (55.7%). The other 213 are gaps.**
22+
**Overall: 284 / 481 C functions are resolved (59.0%). The other 197 are gaps.**
2323

2424
Legend: `*` full = every function in the group reconstructed and admitted by a court · `~` partial = some behavior reconstructed with an executable court (byte/terminfo oracle) · `o` scaffold = a byte-producing stand-in exists, not yet pinned by its own court · `!` divergent = a counterpart exists but a court records a measured divergence from the in-repo oracle · `>` deferred = no immediate terminal output; the function's effect is realized later by refresh/doupdate, proven by an empty-output court · `n` n_a = no terminal-output contract (pure query or state); nothing for a byte-output reconstruction to emit · `.` none = no counterpart.
2525

@@ -46,8 +46,8 @@ Legend: `*` full = every function in the group reconstructed and admitted by a c
4646
| Terminfo & termcap (curs_terminfo / termcap) | 33 | 33 | 0 | 100.0 |
4747
| Touch & sync (curs_touch) | 11 | 11 | 0 | 100.0 |
4848
| Window create & manage (curs_window) | 19 | 19 | 0 | 100.0 |
49+
| Color (curs_color) | 40 | 20 | 20 | 50.0 |
4950
| Screen init & teardown (curs_initscr) | 11 | 2 | 9 | 18.2 |
50-
| Color (curs_color) | 40 | 4 | 36 | 10.0 |
5151
| Add chstr (curs_addchstr) | 8 | 0 | 8 | 0.0 |
5252
| Input options & key handling (curs_inopts / util) | 56 | 0 | 56 | 0.0 |
5353
| Input: characters & strings (curs_getch / getstr / scanw) | 22 | 0 | 22 | 0.0 |
@@ -384,33 +384,19 @@ for their totals).
384384
- `n` `wgetparent` (n_a) — Returns the parent window pointer; a pointer query with no terminal-output contract.
385385
- `~` `wresize` (partial) → `window::Window::wresize` [NCURSES.WINDOW.GEOMETRY] — Resizes the window (preserving top-left content); geometry matched by the court.
386386

387-
### Screen init & teardown (curs_initscr) — 2/11 (18.2%)
388-
389-
- `.` `delscreen` (gap)
390-
- `!` `endwin` (divergent) → `term::TEARDOWN_EPILOGUE` [NCURSES.BYTE.FRAME.FULL] — Teardown epilogue constant; same divergence as initscr against the in-repo oracle.
391-
- `.` `endwin_sp` (gap)
392-
- `.` `exit_curses` (gap)
393-
- `!` `initscr` (divergent) → `term::INIT_PROLOGUE` [NCURSES.BYTE.FRAME.FULL] — The init prologue constant was captured from a different ncurses build; against the in-repo ncurses 6.4 pty oracle it diverges in emission order and feature extras (recorded, not matched).
394-
- `.` `isendwin` (gap)
395-
- `.` `isendwin_sp` (gap)
396-
- `.` `new_prescr` (gap)
397-
- `.` `newterm` (gap)
398-
- `.` `newterm_sp` (gap)
399-
- `.` `set_term` (gap)
400-
401-
### Color (curs_color) — 4/40 (10.0%)
387+
### Color (curs_color) — 20/40 (50.0%)
402388

403-
- `.` `COLOR_PAIR` (gap)
404-
- `.` `PAIR_NUMBER` (gap)
389+
- `~` `COLOR_PAIR` (partial) → `window::color_pair` [NCURSES.COLOR.PAIR] — COLOR_PAIR(n) = n<<8; matched to ncurses.
390+
- `~` `PAIR_NUMBER` (partial) → `window::pair_number` [NCURSES.COLOR.PAIR] — PAIR_NUMBER(attr) = (attr & A_COLOR) >> 8; matched to ncurses.
405391
- `.` `alloc_pair` (gap)
406392
- `.` `alloc_pair_sp` (gap)
407-
- `.` `assume_default_colors` (gap)
408-
- `.` `assume_default_colors_sp` (gap)
409-
- `.` `can_change_color` (gap)
410-
- `.` `can_change_color_sp` (gap)
393+
- `n` `assume_default_colors` (n_a) — Configures default (-1) colours; library state with no immediate terminal output.
394+
- `n` `assume_default_colors_sp` (n_a) — Configures default (-1) colours; library state with no immediate terminal output.
395+
- `~` `can_change_color` (partial) → `terminfo::Terminfo::can_change_color` [NCURSES.TERMINFO.LOOKUP, NCURSES.TERMINFO.ECOLOGY] — the ccc capability, derived from terminfo (tigetflag, court-matched).
396+
- `~` `can_change_color_sp` (partial) → `terminfo::Terminfo::can_change_color` [NCURSES.TERMINFO.LOOKUP, NCURSES.TERMINFO.ECOLOGY] — the ccc capability, derived from terminfo (tigetflag, court-matched).
411397
- `.` `color_content` (gap)
412398
- `.` `color_content_sp` (gap)
413-
- `~` `color_set` (partial) → `color::sgr_fg` [NCURSES.CAP.SETAF.2, NCURSES.CAP.SETAB.4]fg/bg byte producers are pinned to setaf/setab; pair allocation state is not modeled.
399+
- `~` `color_set` (partial) → `window::Window::color_set` [NCURSES.WINDOW.ATTR]Sets the active colour pair on the cell grid; matched to ncurses via winch colour bits.
414400
- `.` `extended_color_content` (gap)
415401
- `.` `extended_color_content_sp` (gap)
416402
- `.` `extended_pair_content` (gap)
@@ -421,23 +407,37 @@ for their totals).
421407
- `.` `find_pair_sp` (gap)
422408
- `.` `free_pair` (gap)
423409
- `.` `free_pair_sp` (gap)
424-
- `.` `has_colors` (gap)
425-
- `.` `has_colors_sp` (gap)
410+
- `~` `has_colors` (partial) → `terminfo::Terminfo::has_colors` [NCURSES.TERMINFO.LOOKUP, NCURSES.TERMINFO.ECOLOGY] — colors>0, derived from terminfo (tigetnum colors, court-matched).
411+
- `~` `has_colors_sp` (partial) → `terminfo::Terminfo::has_colors` [NCURSES.TERMINFO.LOOKUP, NCURSES.TERMINFO.ECOLOGY] — colors>0, derived from terminfo (tigetnum colors, court-matched).
426412
- `.` `init_color` (gap)
427413
- `.` `init_color_sp` (gap)
428414
- `.` `init_extended_color` (gap)
429415
- `.` `init_extended_color_sp` (gap)
430416
- `.` `init_extended_pair` (gap)
431417
- `.` `init_extended_pair_sp` (gap)
432-
- `o` `init_pair` (scaffold) → `color::sgr_fg` — No pair table; the fg/bg SGR bytes a pair would activate are produced directly.
433-
- `.` `init_pair_sp` (gap)
434-
- `.` `pair_content` (gap)
435-
- `.` `pair_content_sp` (gap)
436-
- `.` `reset_color_pairs` (gap)
437-
- `.` `reset_color_pairs_sp` (gap)
438-
- `o` `start_color` (scaffold) → `color::sgr_fg` — No color-pair allocation table; only the per-color SGR byte producers exist.
439-
- `.` `start_color_sp` (gap)
440-
- `.` `use_default_colors` (gap)
441-
- `.` `use_default_colors_sp` (gap)
442-
- `~` `wcolor_set` (partial) → `color::sgr_fg` [NCURSES.CAP.SETAF.2, NCURSES.CAP.SETAB.4] — Same setaf/setab bytes; no WINDOW model.
418+
- `~` `init_pair` (partial) → `color::Palette::init_pair` [NCURSES.COLOR.PAIR] — Registers a colour pair; pair_content matched to ncurses.
419+
- `~` `init_pair_sp` (partial) → `color::Palette::init_pair` [NCURSES.COLOR.PAIR] — Registers a colour pair; pair_content matched to ncurses.
420+
- `~` `pair_content` (partial) → `color::Palette::pair_content` [NCURSES.COLOR.PAIR] — Returns a pair's (fg,bg); matched to ncurses (incl. default pair 0 = 7,0).
421+
- `~` `pair_content_sp` (partial) → `color::Palette::pair_content` [NCURSES.COLOR.PAIR] — Returns a pair's (fg,bg); matched to ncurses (incl. default pair 0 = 7,0).
422+
- `n` `reset_color_pairs` (n_a) — Resets the colour-pair table; library state with no terminal output.
423+
- `n` `reset_color_pairs_sp` (n_a) — Resets the colour-pair table; library state with no terminal output.
424+
- `n` `start_color` (n_a) — Initializes the colour subsystem; no immediate terminal output.
425+
- `n` `start_color_sp` (n_a) — Initializes the colour subsystem; no immediate terminal output.
426+
- `n` `use_default_colors` (n_a) — Configures default (-1) colours; library state with no immediate terminal output.
427+
- `n` `use_default_colors_sp` (n_a) — Configures default (-1) colours; library state with no immediate terminal output.
428+
- `~` `wcolor_set` (partial) → `window::Window::color_set` [NCURSES.WINDOW.ATTR] — Sets the active colour pair on the cell grid; matched to ncurses via winch colour bits.
429+
430+
### Screen init & teardown (curs_initscr) — 2/11 (18.2%)
431+
432+
- `.` `delscreen` (gap)
433+
- `!` `endwin` (divergent) → `term::TEARDOWN_EPILOGUE` [NCURSES.BYTE.FRAME.FULL] — Teardown epilogue constant; same divergence as initscr against the in-repo oracle.
434+
- `.` `endwin_sp` (gap)
435+
- `.` `exit_curses` (gap)
436+
- `!` `initscr` (divergent) → `term::INIT_PROLOGUE` [NCURSES.BYTE.FRAME.FULL] — The init prologue constant was captured from a different ncurses build; against the in-repo ncurses 6.4 pty oracle it diverges in emission order and feature extras (recorded, not matched).
437+
- `.` `isendwin` (gap)
438+
- `.` `isendwin_sp` (gap)
439+
- `.` `new_prescr` (gap)
440+
- `.` `newterm` (gap)
441+
- `.` `newterm_sp` (gap)
442+
- `.` `set_term` (gap)
443443

0 commit comments

Comments
 (0)