lean-path: Angefangenes liegt auf dem Pfad (SPEC §9, D61)

Eine Zugabe (`+`) fällt aus dem günstigsten Pfad — außer sie ist
realisiert und noch nicht erledigt (`[~]`/`[/]`). Angefangene Arbeit ist
die offene Front, und seit D46 zeigt der Pfad genau die; bisher führte
der Von-Station-zu-Station-Knopf nie dorthin, wo gearbeitet wird.
Erledigte Zugaben bleiben draußen: dort ist nichts mehr zu tun, und was
darunter offen blieb, ist mit ihnen zusammen entbehrlich (§3).

Dabei die fehlende Hälfte von D46 gefunden: SPEC §9 sagt seit jeher
„eine bereits realisierte Alternative gewinnt", umgesetzt war das aber
nur über die Kosten — und die sind allein bei `[x]`/`[^]` null. Ein
`[~]`-Zweig verlor damit gegen eine unangetastete billigere, obwohl die
XOR-Regel gerade ihn als die realisierte Alternative ausweist.
`chosenPool()` schränkt die Wahlmenge auf die realisierten ein; unter
mehreren entscheiden wieder die Kosten. Nebengewinn: eine entschiedene
Gruppe ist keine freie Variable mehr und verkleinert die Suche (D42).

10 neue Tests; Gegenprobe geführt (jede Regel einzeln herausgenommen
lässt genau die nach ihr benannten Zusicherungen fallen). Der
mitgelieferte Plan ändert sich nicht — er hat keine angefangene Zugabe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 14:11:38 +02:00
co-authored by Claude Opus 5
parent 3018db9f61
commit 36b78efa53
8 changed files with 232 additions and 25 deletions
+7 -5
View File
@@ -63,7 +63,8 @@ One node per line. Everything except the label is optional.
`[~]`, `[/]`, `[x]` or `[^]`); each additional realized one warns
(`xorConflict`).
- Optionality (`+`) is orthogonal to status: an optional node can be long
`[^]`. Optional nodes never count toward the cheapest path.
`[^]`. An optional node counts toward the cheapest path **only while it is
being worked on** — `[~]` or `[/]`; untouched and finished ones stay out.
### Fold mark (immediately before the label, i.e. after the status box)
@@ -96,10 +97,11 @@ One node per line. Everything except the label is optional.
- **`[x]` and `[^]` cost nothing any more.** The cheapest path prices the
work that is *left*, so a done node adds zero regardless of its size and
carries no station on the path line; started work (`[~]`, `[/]`) still
counts in full. A realized alternative therefore wins its `|`/`=` group
even when a cheaper unstarted one sits next to it. The *intrinsic* status
decides — dependencies may hold a node back effectively, but the work on
it is paid for.
counts in full. **A realized alternative wins its `|`/`=` group** even when
a cheaper unstarted one sits next to it — the choice has been made; among
several realized ones cost decides again. The *intrinsic* status decides —
dependencies may hold a node back effectively, but the work on it is paid
for.
### Size (effort)