docs(phase-31): S77 FINAL checkpoint — 21 banked, self_decl_tu closed, the permuter yield curve, eight instrument defects

This commit is contained in:
Drew T
2026-09-03 19:51:02 -06:00
parent be966bf095
commit 9d15598b5a
5 changed files with 115 additions and 29 deletions
+1
View File
@@ -58,3 +58,4 @@
{"ts": "2026-09-03 00:08:28", "addr": "0x80181294", "name": "func_80181294", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 27, "where_stuck": "residual: 27 mismatch", "best_draft": ".run/backlog_drafts/func_80181294.c", "binary": "ov_SC05_018", "source": "s75-redraft", "residual": [[1, "00052c00 sll\ta1,a1,0x10", "24021000 addiu $v0, $zero, 0x1000"], [2, "00052c03 sra\ta1,a1,0x10", "00451023 subu $v0, $v0, $a1"], [3, "24021000 li\tv0,4096", "00c20018 mult $a2, $v0"], [4, "00451023 subu\tv0,v0,a1", "3084ffff andi $a0, $a0, 0xFFFF"], [5, "00c20018 mult\ta2,v0", "00002812 mflo $a1"], [6, "3084ffff andi\ta0,a0,0xffff", "00041942 srl $v1, $a0, 5"], [7, "00002812 mflo\ta1", "3063001f andi $v1, $v1, 0x1F"], [8, "00041942 srl\tv1,a0,0x5", "00620018 mult $v1, $v0"], [9, "3063001f andi\tv1,v1,0x1f", "00001812 mflo $v1"], [10, "00620018 mult\tv1,v0", "00042282 srl $a0, $a0, 10"], [11, "00001812 mflo\tv1", "3084001f andi $a0, $a0, 0x1F"], [12, "00042282 srl\ta0,a0,0xa", "00820018 mult $a0, $v0"], [13, "3084001f andi\ta0,a0,0x1f", "00051303 sra $v0, $a1, 12"], [14, "00820018 mult\ta0,v0", "3046001f andi $a2, $v0, 0x1F"], [15, "00051303 sra\tv0,a1,0xc", "000319c3 sra $v1, $v1, 7"], [16, "3046001f andi\ta2,v0,0x1f", "306203e0 andi $v0, $v1, 0x3E0"], [17, "000311c3 sra\tv0,v1,0x7", "24038000 addiu $v1, $zero, -0x8000"], [18, "304203e0 andi\tv0,v0,0x3e0", "00431025 or $v0, $v0, $v1"], [19, "24038000 li\tv1,-32768", "00c21025 or $v0, $a2, $v0"], [20, "00431025 or\tv0,v0,v1", "00004012 mflo $t0"], [21, "00c21025 or\tv0,a2,v0", "00082083 sra $a0, $t0, 2"], [22, "00004012 mflo\tt0", "30837c00 andi $v1, $a0, 0x7C00"], [23, "00082083 sra\ta0,t0,0x2", "00431025 or $v0, $v0, $v1"], [24, "30847c00 andi\ta0,a0,0x7c00", "03e00008 jr $ra"]], "passes_tried": null}
{"ts": "2026-09-03 00:10:12", "addr": "0x8017db98", "name": "func_8017DB98", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 120, "where_stuck": "residual: 120 mismatch", "best_draft": ".run/backlog_drafts/func_8017DB98.c", "binary": "ov_SC06_025", "source": "s75-redraft", "residual": [[0, "27bdffd0 addiu\tsp,sp,-48", "27bdffc8 addiu $sp, $sp, -0x38"], [1, "afb10024 sw\ts1,36(sp)", "afb20028 sw $s2, 0x28($sp)"], [2, "00808821 move\ts1,a0", "00809021 addu $s2, $a0, $zero"], [3, "afb20028 sw\ts2,40(sp)", "afb40030 sw $s4, 0x30($sp)"], [4, "00a09021 move\ts2,a1", "00a0a021 addu $s4, $a1, $zero"], [5, "afbf002c sw\tra,44(sp)", "afb3002c sw $s3, 0x2C($sp)"], [6, "afb00020 sw\ts0,32(sp)", "afbf0034 sw $ra, 0x34($sp)"], [7, "96250000 lhu\ta1,0(s1)", "afb10024 sw $s1, 0x24($sp)"], [8, "240200ff li\tv0,255", "afb00020 sw $s0, 0x20($sp)"], [9, "30a3ffff andi\tv1,a1,0xffff", "96450000 lhu $a1, 0x0($s2)"], [10, "10620061 beq\tv1,v0,1b0 <func_8017DB98+0x1b0>", "240200ff addiu $v0, $zero, 0xFF"], [11, "24900008 addiu\ts0,a0,8", "30a3ffff andi $v1, $a1, 0xFFFF"], [12, "30a3ffff andi\tv1,a1,0xffff", "10620063 beq $v1, $v0, .L8017DD58"], [13, "24020009 li\tv0,9", "00009821 addu $s3, $zero, $zero"], [14, "14620057 bne\tv1,v0,198 <func_8017DB98+0x198>", "24900008 addiu $s0, $a0, 0x8"], [15, "00000000 nop", "30a3ffff andi $v1, $a1, 0xFFFF"], [16, "9602fffc lhu\tv0,-4(s0)", "24020009 addiu $v0, $zero, 0x9"], [17, "00000000 nop", "14620058 bne $v1, $v0, .L8017DD40"], [18, "a7a20010 sh\tv0,16(sp)", "00000000 nop"], [19, "9602fffe lhu\tv0,-2(s0)", "9602fffc lhu $v0, -0x4($s0)"], [21, "a7a20012 sh\tv0,18(sp)", "a7a20010 sh $v0, 0x10($sp)"], [22, "96020000 lhu\tv0,0(s0)", "9602fffe lhu $v0, -0x2($s0)"], [24, "a7a20014 sh\tv0,20(sp)", "a7a20012 sh $v0, 0x12($sp)"], [25, "96020002 lhu\tv0,2(s0)", "96020000 lhu $v0, 0x0($s0)"]], "passes_tried": null}
{"ts": "2026-09-03 19:09:54", "addr": "0x800cb17c", "name": "func_800CB17C", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_800CB17C.c", "binary": "md_MAIN_020", "source": "worker", "residual": null, "passes_tried": null}
{"ts": "2026-09-03 19:42:37", "addr": "0x80181e04", "name": "func_80181E04", "reach": null, "klass": null, "nins": null, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": ".run/backlog_drafts/func_80181E04.c", "binary": "ov_SC01_001", "source": "worker", "residual": null, "passes_tried": null}
+8 -15
View File
@@ -2,24 +2,17 @@
> Generated by `tools/backlog.py render` from `.run/backlog.jsonl`. These are functions the Phase-21 automation got **close** on but did NOT byte-match. The whole-binary byte-gate is the sole arbiter (G3/P9): **byte-matches bank and are NOT listed here** — only genuine near-misses/blockers are. Ranked by hand-session priority: **reach** (×N propagation leverage) → **closeness** (match_one mismatch count, lower = closer) → **size**. Each row's `best_draft` is the closest C the machine reached — resume from there.
**Open near-misses:** 17 · by status {'near': 9, 'failed': 8} · by class {None: 17}
**Open near-misses:** 10 · by status {'near': 6, 'failed': 4} · by class {None: 10}
| # | addr | reach | class | nins | status | closeness | where it stuck | best draft |
|--:|------|------:|-------|-----:|--------|----------:|----------------|------------|
| 1 | func_80181804 | None | | None | near | 0 | match_one MATCH but the whole-binary gate rejected — CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual. | `.run/backlog_drafts/func_80181804.c` |
| 2 | func_80181CB8 | None | | None | near | 0 | match_one MATCH but the whole-binary gate rejected — CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual. | `.run/backlog_drafts/func_80181CB8.c` |
| 3 | func_800CB17C | None | | None | near | 0 | match_one MATCH but the whole-binary gate rejected — CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual. | `.run/backlog_drafts/func_800CB17C.c` |
| 4 | func_80182CBC | None | | 28 | near | 7 | resolver DIFF (real-TU rtu_match, 20260825-233820): mine=28 target=28 | `.run/backlog_drafts/func_80182CBC.c` |
| 5 | func_80181294 | None | | None | near | 19 | residual: 19 mismatch | `.run/backlog_drafts/func_80181294.c` |
| 6 | func_80181344 | None | | None | near | 48 | residual: 48 mismatch | `.run/backlog_drafts/func_80181344.c` |
| 7 | func_80180B3C | None | | 297 | near | 125 | resolver DIFF (real-TU rtu_match, 20260825-233820): mine=296 target=297 | `.run/wave_eo/shard478/func_80180B3C.c` |
| 8 | func_800CB00C | None | | 123 | near | 168 | resolver DIFF (real-TU rtu_match, 20260826-053145): mine=174 target=123 | `.run/wave_g0c/shard30/func_800CB00C.c` |
| 9 | func_80180B3C | None | | 21 | near | 287 | resolver DIFF (real-TU rtu_match, 20260826-022235): mine=287 target=21 | `.run/wave_eq/shard63/func_80180B3C.c` |
| 10 | func_800D06E8 | None | | None | failed | | resolver CC1 (real-TU rtu_match, 20260825-233820): .run/resolver/work/resident__func_800D06E8/c0/rtu/func_800D06E8/t.c:1770: conflicting types for `Struct80078E78' | `.run/wave_ch/shard62/func_800D06E8.c` |
| 11 | func_8017FBCC | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017FBCC.c` |
| 12 | func_801832F8 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801832F8.c` |
| 13 | func_8017F018 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8017F018.c` |
| 14 | func_8018095C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8018095C.c` |
| 15 | func_80181720 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181720.c` |
| 16 | func_80062144 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | |
| 17 | func_80180B3C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180B3C.c` |
| 4 | func_80180B3C | None | | 297 | near | 125 | resolver DIFF (real-TU rtu_match, 20260825-233820): mine=296 target=297 | `.run/wave_eo/shard478/func_80180B3C.c` |
| 5 | func_800CB00C | None | | 123 | near | 168 | resolver DIFF (real-TU rtu_match, 20260826-053145): mine=174 target=123 | `.run/wave_g0c/shard30/func_800CB00C.c` |
| 6 | func_80180B3C | None | | 21 | near | 287 | resolver DIFF (real-TU rtu_match, 20260826-022235): mine=287 target=21 | `.run/wave_eq/shard63/func_80180B3C.c` |
| 7 | func_800D06E8 | None | | None | failed | | resolver CC1 (real-TU rtu_match, 20260825-233820): .run/resolver/work/resident__func_800D06E8/c0/rtu/func_800D06E8/t.c:1770: conflicting types for `Struct80078E78' | `.run/wave_ch/shard62/func_800D06E8.c` |
| 8 | func_80062144 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | |
| 9 | func_80180B3C | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80180B3C.c` |
| 10 | func_80181E04 | None | | None | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80181E04.c` |
+9 -9
View File
@@ -4,21 +4,21 @@
# cross-binary collapsible-byte leverage: docs/duplicates.cross.md.
# THREE progress metrics (all matter — see the labels):
FLEET fn-count byte-ident: 363086 / 363151 = 99.98% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
FLEET instr-weighted : 13486077 / 13523865 = 99.7% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number)
FLEET distinct-code(uniq): 5814323 / 5851972 = 99.4% (90908/90929 unique fns; the DISTINCT-RE number)
MAIN game-code weighted : 45548 / 79510 = 57.3% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-08-05; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift)
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 13440529 / 13444355 = 100.0%)
FLEET fn-count byte-ident: 363090 / 363151 = 99.98% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
FLEET instr-weighted : 13486764 / 13523865 = 99.7% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number)
FLEET distinct-code(uniq): 5815010 / 5851972 = 99.4% (90909/90929 unique fns; the DISTINCT-RE number)
MAIN game-code weighted : 46028 / 79510 = 57.9% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-08-05; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift)
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 13440736 / 13444355 = 100.0%)
FLEET REAL substantive : 360767 (of which dedup-shared 255632 via 2220 groups / 255708 instances)
FLEET REAL substantive : 360771 (of which dedup-shared 255632 via 2220 groups / 255708 instances)
FLEET LINKED PsyQ objs : 959
FLEET NON_MATCHING : 0 (0 in any default build — G4)
FLEET INCLUDE_ASM stubs : 65
FLEET INCLUDE_ASM stubs : 61
FLEET matchable : 363151
| binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % |
|---|---:|---:|---:|---:|---:|---:|
| main | 899 | 2 | 959 | 2043 | 2085 | 98.0% |
| main | 902 | 2 | 959 | 2046 | 2085 | 98.1% |
| resident | 141 | 0 | 0 | 143 | 145 | 98.6% |
| md_MAIN_001 | 11 | 0 | 0 | 11 | 11 | 100.0% |
| md_MAIN_003 | 53 | 0 | 0 | 59 | 64 | 92.2% |
@@ -101,7 +101,7 @@ FLEET matchable : 363151
| ov_SC01_074 | 2424 | 1808 | 0 | 2426 | 2426 | 100.0% |
| ov_SC01_077 | 2584 | 1769 | 0 | 2586 | 2586 | 100.0% |
| ov_SC01_080 | 2512 | 1813 | 0 | 2512 | 2512 | 100.0% |
| ov_SC01_084 | 2573 | 1824 | 0 | 2578 | 2579 | 100.0% |
| ov_SC01_084 | 2574 | 1824 | 0 | 2579 | 2579 | 100.0% |
| ov_SC02_000 | 2683 | 1902 | 0 | 2683 | 2683 | 100.0% |
| ov_SC02_003 | 2683 | 1902 | 0 | 2683 | 2683 | 100.0% |
| ov_SC02_004 | 2401 | 1813 | 0 | 2401 | 2401 | 100.0% |
+5 -5
View File
File diff suppressed because one or more lines are too long
+92
View File
@@ -7276,3 +7276,95 @@ disagreed with the new code about how a function was spelled, and once a tool fi
automatically, twelve of twelve went in at once in about two minutes. The rest of the session was
spent catching six cases where one of our own measuring tools was quietly lying to us — including one
that had ranked six pieces of copied assembly as the most promising work available.
## 🛑 SESSION CHECKPOINT — S77 FINAL (2026-09-03). SUPERSEDES the S77 block above. Phase 31 T10 CONTINUES.
**Verified at close, clean rebuild:** `make check-all` **213/213 passed, 0 failed** (run three times
this session — a green baseline BEFORE any overlay bank, once after the plumbing banks, once at
close). `src/`, `config/`, `tools/`, `docs/` CLEAN. Drew pushes (R6).
main REAL **902** (was 895) · LINKED 959 · VERBATIM 142 · **stubs 39** (was 46) · NON_MATCHING 0 ·
`143dbb89f34491258bbc27810d0a12ec8b43a8dd` byte-identical.
**MAIN game-code weighted 57.1% → 57.9%** · fleet distinct-code 99.3% → **99.4%** ·
**fleet stubs 82 → 61**.
```
BANKED THIS SESSION : 21, every one confirmed from the SOURCE, not from a gate report
§378 self-decl chain (16 drafts routed, 16 banked):
main : func_80013154 (was a §265 verbatim body) · func_8005EAC8 · func_8005E3AC · func_8005E79C
overlays: ov_SC01_005 · ov_SC01_006 · ov_SC02_041 · ov_SC03_105 · ov_SC03_111 · ov_SC03_124
ov_SC04_002 · ov_SC04_005 · ov_SC04_007 · ov_SC04_011 · ov_SC05_003 · ov_SC05_018
ov_SC01_084:func_80182A00 (207 ins — found only after §480)
in-tree gate : ov_SC06_032:func_8017D810
permuter ILS : main func_80021174 · func_80040DE8 · func_80024054
```
# T14 — WORKED, NOT FINISHED. Read §479 before spending anything here.
**Banked 3.** The permuter is a ONE-SHOT at ≤4 mismatched (3/3, each inside one 150 s cycle) and
**plateaus above ~10 no matter how long it runs** — one candidate went 37 → 1 and then bought nothing
across 8 cycles × 240 s. Give ≤4 one cycle; give anything else 4 cycles ONCE; never run a plateau
longer.
**Still open, with measured state (do not re-derive):**
* `func_8002AC98` — **1 mismatched**, `addu $s2,$v0,$v1` vs `$v1,$v0`. Permuter plateaued at 1.
Two hand levers REFUTED by bytes: source operand order (`b+r`→`r+b`, all 3 sites) changes nothing
because gcc canonicalises commutative operands by PSEUDO REGNO; a fresh later pseudo
(`{s32 rr=r; val=b+rr;}`) is folded by cse. It is `REGALLOC-PERM` — the lever must move the
ALLOCATION, not the expression. Waypoint: `.run/permuter/func_8002AC98/output-1-1/source.c`.
* Plateaued seeds for a Fable/agent tier: `func_80039B20` (10), `func_80020DA4` (14),
`func_8001BC6C` (25). `func_80038698` never beat base.
* Untouched larger residuals: `func_8002FDE8` 39 · `func_8001EA14` 89 · `func_8001EFE0` 89 ·
`func_80023BF0` 129 · `func_80039308` 154 · `func_8002C410` 261 · `func_800391D4` 60.
* **`main:func_80011380` is §474's PROVED floor — never draw it.**
* Overlay near-misses `ov_SC06_022:func_8017DF28` (2 of 119) and `ov_SC03_105:func_801834A4` (6 of
106) LOOK like the best targets in the fleet and are NOT: each draft header carries ~10
byte-measured refuted levers, one with an arithmetic proof of unreachability. **Read a draft's own
header before aiming anything at it** — that, not the mismatch count, predicted every outcome here.
# EIGHT INSTRUMENT DEFECTS (all fixed and committed)
| # | tool | it asserted | what was true |
|---|---|---|---|
| 1 | `cast_self_callers` (3 consumers) | `return func_X(a0);` is a declaration | a CALL — it would have DELETED a wrapper's `return`. 524 lines / 482 files; 56 journals audited, nothing damaged |
| 2 | `cast_self_callers --sync-decls` | the draft's parameter spelling is legal in the TU | `Obj_80015760` is draft-local, `Ctx` is typedef'd 75 lines BELOW — two parse errors that broke the committed baseline |
| 3 | `sync_tu_decls.tu_decl` | "no `extern` line to copy" | the symbol was a function the TU DEFINES; that header is the authoritative spelling |
| 4 | `sync_tu_decls` round loop | "no declaration conflict named" | the GATE HAD REFUSED TO RUN (dirty tree) — a harness refusal reported as a verdict on the body (R40) |
| 5 | `blocker_probe` | 13 drafts MATCH, nothing blocking | **6 were §265 VERBATIM**, not decompiles. 4th consumer with this blindness; the one that SCOPES work (§478) |
| 6 | `blocker_probe` Oracle A | 3 drafts blocked by `local_type` | a PHANTOM — the real gate strips those typedefs first. True classes: DIFF, DIFF, and a §378 step-2 that BANKED 207 ins (§480) |
| 7 | my aggregation script | binary names | a bad `basename` slice mangled every one; caught only by checking a row the S76 checkpoint already recorded |
| 8 | my first hand lever | "hoisting the shift is semantics-preserving, so it should reorder" | true and USELESS — 23 mismatched at 67/68 ins; it lets gcc fold an instruction away |
# OPEN, UNEXPLAINED — DO NOT GUESS
`parallel_gate` reported `banked 0` for `ov_SC06_032` in a 106 s worker run; the identical draft
banked in-tree and then survived two full clean-fleets. The other 12 binaries in that run agreed
exactly between worktree and in-tree, and a later in-tree `gate_stage` on `ov_SC01_001` also agreed.
**One data point — reproduce before theorising.**
# STILL OPEN FROM THE 34-DRAFT OVERLAY POOL
13 banked · **6 VERBATIM = undecompiled work needing a REDRAFT** (`md_MAIN_003:func_800D0100`,
`func_800D0174`, `func_800D1D14`, `md_MAIN_020:func_800CB17C`, `ov_SC05_005:func_80181828`,
`ov_SC06_010:func_801809E4`) · body DIFFs (`ov_SC02_027:func_80180B3C`, `md_MAIN_003:func_800CF3E8`,
`ov_SC01_001:func_80181E04` — all three reclassified from "plumbing" to DIFF by an actual gate) ·
`ov_SC02_017:func_80186C64` CARVE-REFUSED (jtbl plumbing, NOT codegen) ·
`ov_SC04_018:func_80181CB8` conflicting types for built-in `memcpy` · `ov_SC04_018:func_80181804`
and `ov_SC05_010:func_8017FFA8` CC1-FAIL cascading from a DIFFERENT TU ·
`resident:func_800D128C` parse error before `cdFileLocTable` · `resident:func_800D06E8` DIFF ·
`md_MAIN_003:func_800D06BC` **697 ins against a 33-ins target — aimed at the wrong function.**
# IDIOMS BANKED IN-SESSION — §477, §478, §479, §480
Each verified present in the committed file one at a time (the S76 lesson that §462/§463 vanished
silently after their commit).
# PLAIN ENGLISH
Twenty-one more of the game's functions are now real C instead of raw assembly, and all 213 binaries
still rebuild byte-for-byte identical to the original disc. Most of it came from one realisation: a
whole group of "hard" functions were never hard — our own C files simply disagreed with the new code
about how a name was spelled, and once a tool fixed that, sixteen out of sixteen went straight in.
The rest of the session was spent catching eight cases where one of our own measuring tools was
quietly telling us something false — including one that had ranked six pieces of copied assembly as
the most promising work available, and one that invented a problem the real build already solves.