Berichtigt: Die Leitung sieht wieder alle 68 -- gezaehlt wird das Zugetragene

Filipe: "falsch, dogfather und die rechte hand sollen immer noch die 68
sachen sehen wie vorher und der button soll einfach perfektioniert
werden damit wir beide sie den jeweiligen als aufgabe geben koennen.
und die modis sollen nicht sehen. aber unsere sicht von dogfather und
rechte hand soll sich nicht aendern."

MEIN FEHLER WAR EINE VERWECHSLUNG von zwei Dingen, die gleich aussehen
und verschieden sind:

  EINGRENZEN  -- die Liste wird je Person kuerzer. Das habe ich gebaut.
  ZUTRAGEN    -- aus der vollen Liste bekommt jemand etwas als AUFGABE.
                 Das war gemeint.

Der Unterschied zaehlt: Die 68 sind das, woran ihr euch entlanghangelt,
wenn ihr jemanden anseht. Eine Liste, die sich je Person verkuerzt,
waere bei jedem Menschen eine andere -- und dann faellt kein Vergleich
mehr auf.

DIE KARTE ZEIGT WIEDER ALLES, und an jedem Punkt steht, ob er diesem
Menschen als Aufgabe zugetragen ist: eine Kante links und das WORT
"Aufgabe". Nicht nur die Farbe -- wer Farben schlecht unterscheidet,
saehe sonst nur einen etwas anderen Kasten.

GEZAEHLT WIRD TROTZDEM DAS ZUGETRAGENE. Filipe: "es sollen nur die
menge angezeigt werden die wir zutragen und erledigte dan auch nur die
die erledigt wurden von den zugetragenen." Aus "0 von 68 angesehen"
wird "3 von 12 erledigt".

BEIDE HAELFTEN MUSSTEN MITZIEHEN, und das ist die Stelle, an der es
leicht schiefgeht: Die Kachel nahm links die Zahl ALLER
Einschaetzungen. Waere nur das Ganze nachgezogen worden, stuende dort
"13 von 3" -- eine Zahl, die groesser ist als ihr Ganzes, und die
niemand mehr erklaeren kann. Der Verbund mit der Zuteilung steht
deshalb schon in der Abfrage, an drei Stellen: Karte, Uebersicht und
Ring.

NULL ZUGETRAGEN IST KEINE NULL, SONDERN EIN SATZ. "0 von 0 erledigt"
liest sich wie ein Versaeumnis; "noch nichts zugetragen" sagt, was zu
tun ist. Der Knopf heisst jetzt auch, was er tut: "Aufgaben zutragen".

Der leere Kasten, der im ersten Anlauf die ganze Karte ersetzte, ist
weg -- genau der hatte die Sicht der Leitung veraendert.

Geprueft: pruef-entwicklung 61 -> 63 Punkte. Die neuen halten
ausdruecklich fest, was ich falsch gemacht hatte: Die Leitung sieht den
GANZEN Katalog (68), und die Liste bleibt auch nach dem Zutragen
vollstaendig -- nur die Marke wandert. Ohne diese zwei Zeilen waere
dieselbe Eingrenzung beim naechsten Umbau wieder eine Zeile Arbeit und
niemandem aufgefallen. Dazu pruef-css-klassen und pruef-tippziele.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-25 04:04:29 +02:00
co-authored by Claude Opus 5
parent 7099d53da0
commit 4b48aa46f6
45 changed files with 813 additions and 687 deletions
+26 -7
View File
@@ -405,10 +405,25 @@ console.log("\n=== Punkte je Person aussuchen ===");
`/workspace/api/entwicklung/person/${idModi}`, { host: CREW, keks })).daten;
const vorher = await karte(dogi.keks);
const allePunkte = (b) => (b?.bloecke || []).flatMap((x) => x.punkte);
/* DIE SICHT DER LEITUNG AENDERT SICH NICHT (berichtigt 25.09.2026).
Der erste Anlauf hat die Karte auf das Zugetragene eingegrenzt.
Filipe: „falsch, dogfather und die rechte hand sollen immer noch
die 68 sachen sehen wie vorher … aber unsere sicht von dogfather
und rechte hand soll sich nicht aendern."
Die Pruefung haelt das jetzt ausdruecklich fest -- sonst waere die
naechste Eingrenzung wieder eine Zeile Arbeit und niemandem
aufgefallen. */
ok(allePunkte(vorher).length === vorher?.gesamt_katalog
&& (vorher?.gesamt_katalog || 0) >= 60,
`die Leitung sieht den ganzen Katalog (${allePunkte(vorher).length} Punkte)`);
ok(vorher && vorher.gesamt === 0,
`ohne Zuteilung steht auf der Karte nichts (${vorher?.gesamt} Punkte)`);
ok((vorher?.gesamt_katalog || 0) >= 60,
`der Katalog hat trotzdem alle Punkte (${vorher?.gesamt_katalog})`);
`ohne Zutragung zaehlt die Karte trotzdem nichts (${vorher?.gesamt})`);
ok(allePunkte(vorher).every((pt) => pt.zugetragen === false),
`und kein Punkt ist als Aufgabe markiert `
+ `(${allePunkte(vorher).filter((pt) => pt.zugetragen).length})`);
/* DIE LISTE ZUM AUSSUCHEN zeigt ALLES, mit einem Haken an dem, was
gilt. Zeigte sie nur das Zugeteilte, koennte man nie etwas
@@ -430,10 +445,14 @@ console.log("\n=== Punkte je Person aussuchen ===");
`DogFather sucht zwoelf aus (HTTP ${gesetzt.status}, ${gesetzt.daten?.zugeteilt})`);
const nachher = await karte(dogi.keks);
const drin = (nachher?.bloecke || []).flatMap((b) => b.punkte).map((x) => x.schluessel);
ok(nachher?.gesamt === 12 && drin.length === 12,
`und danach stehen genau die zwoelf auf der Karte (${nachher?.gesamt})`);
ok(zwoelf.every((s) => drin.includes(s)),
const markiert = allePunkte(nachher).filter((pt) => pt.zugetragen).map((x) => x.schluessel);
/* DIE LISTE BLEIBT VOLL, die Marke wandert. Das ist der ganze
Unterschied zwischen „eingrenzen" und „zutragen". */
ok(allePunkte(nachher).length === vorher?.gesamt_katalog,
`die Liste bleibt vollstaendig (${allePunkte(nachher).length})`);
ok(nachher?.gesamt === 12 && markiert.length === 12,
`und genau zwoelf sind als Aufgabe markiert (${markiert.length})`);
ok(zwoelf.every((s) => markiert.includes(s)),
" und zwar dieselben, nicht irgendwelche zwoelf");
/* DIE RECHTE HAND SIEHT DASSELBE -- sie beurteilt denselben
+63 -18
View File
@@ -607,8 +607,18 @@ entwicklungRouter.get("/workspace/api/entwicklung/lage", (req, res) => {
davon verblasst sind, und wie viele wir beide verschieden sehen.
Die Abweichung ist das Ergebnis -- deshalb steht sie schon in
der Uebersicht und nicht erst in der Karte. */
/* NUR, WAS ZUGETRAGEN IST (25.09.2026). Der Verbund mit der
Zuteilung ist der ganze Unterschied: Ohne ihn zaehlt die
Uebersicht Einschaetzungen zu Punkten mit, die dieser Mensch nie
bekommen hat -- und in der Karte daneben stuende eine kleinere
Zahl. Zwei Zahlen fuer dieselbe Sache, und die Uebersicht ist
die, die man zuerst sieht. */
const gesetzt = db().prepare(
"SELECT person_id, COUNT(*) AS n FROM entwicklung_stand WHERE von_id = ? GROUP BY person_id")
`SELECT s.person_id, COUNT(*) AS n
FROM entwicklung_stand s
JOIN entwicklung_zuteilung z
ON z.person_id = s.person_id AND z.schluessel = s.schluessel
WHERE s.von_id = ? GROUP BY s.person_id`)
.all(req.person.id);
const meineZahl = new Map(gesetzt.map((z) => [z.person_id, z.n]));
@@ -641,6 +651,9 @@ entwicklungRouter.get("/workspace/api/entwicklung/lage", (req, res) => {
stufen: ENTWICKLUNG_STUFEN,
erwartung: ENTWICKLUNG_ERWARTUNG,
verblasst_nach: VERBLASST_NACH_TAGEN,
/* Wie viele es im Katalog GIBT -- fuer die Auswahl, nicht fuer
die Zaehlung an der Kachel. Die steht seit heute auf dem, was
zugetragen ist (`zugeteilt` je Person). */
gesamt_fremd: ENTWICKLUNG_FREMD.length,
personen: personen.map((p) => ({
id: p.id, name: p.name,
@@ -657,9 +670,13 @@ entwicklungRouter.get("/workspace/api/entwicklung/lage", (req, res) => {
gesetzt: meineZahl.get(p.id) || 0,
veraltet: alteZahl.get(p.id) || 0,
abweichungen: andersZahl.get(p.id) || 0,
/* Wie viele Punkte fuer sie ausgesucht sind. `0` heisst
ausdruecklich „noch keine" und nicht „keine Angabe" -- die
Oberflaeche sagt dann „Punkte auswaehlen", nicht „0 von 68". */
/* WIE VIELE PUNKTE IHM ZUGETRAGEN SIND (25.09.2026).
Filipe: „es sollen nur die menge angezeigt werden die wir
zutragen." Diese Zahl ist ab jetzt das GANZE der Kachel --
„3 von 12", nicht „3 von 68". `0` heisst ausdruecklich „noch
nichts zugetragen" und nicht „keine Angabe"; die Oberflaeche
sagt dann einen Satz statt einer Null. */
zugeteilt: zuteilZahl.get(p.id) || 0,
})),
/* Die eigene Karte -- fuer jeden, der im Team ist. */
@@ -693,9 +710,28 @@ entwicklungRouter.get("/workspace/api/entwicklung/person/:id", nurLeitung, (req,
const grenze = Date.now() - VERBLASST_NACH_TAGEN * TAG;
const schritte = schritteVon(p.id);
/* NUR, WAS FUER IHN GILT (25.09.2026). Vorher stand hier
`katalogFuer` -- alle 68 fuer jeden. */
const bloecke = katalogFuerPerson(req.person, id, false).map((b) => ({
/* ==== KORRIGIERT NOCH AM SELBEN TAG (25.09.2026) ==============
Der erste Anlauf hat die Karte auf das Zugetragene eingegrenzt.
Filipe: „falsch, dogfather und die rechte hand sollen immer noch
die 68 sachen sehen wie vorher … aber unsere sicht von dogfather
und rechte hand soll sich nicht aendern."
ER HAT RECHT, und der Unterschied ist wichtig: Die 68 sind das,
woran IHR euch entlanghangelt, wenn ihr jemanden anseht -- eine
Liste, die sich je Person verkuerzt, waere eine andere Liste bei
jedem Menschen, und dann faellt kein Vergleich mehr auf.
ZUGETRAGEN WIRD ETWAS ANDERES: eine AUFGABE fuer diesen
Menschen. Das ist eine Auswahl AUS der Liste, nicht eine
Beschneidung der Liste. Deshalb steht hier wieder der ganze
Katalog -- und an jedem Punkt, ob er zugetragen ist.
GEZAEHLT WIRD TROTZDEM DAS ZUGETRAGENE (siehe unten bei
`gesetzt`/`gesamt`): „0 von 68" war die Zahl, die ihn gestoert
hat, und sie sagt bei jemandem mit drei Aufgaben nichts. */
const zugeteilt = zugeteiltFuer(id);
const bloecke = katalogFuer(req.person, false).map((b) => ({
...b,
punkte: b.punkte.map((pt) => {
const m = meine.get(pt.schluessel) || null;
@@ -717,6 +753,10 @@ entwicklungRouter.get("/workspace/api/entwicklung/person/:id", nurLeitung, (req,
nicht auf einer eigenen Liste: Wer die Beobachtung sieht,
soll im selben Blick sehen, ob daraus etwas geworden ist. */
schritt: schritte.get(pt.schluessel) || null,
/* IST ER DIESEM MENSCHEN ZUGETRAGEN? (25.09.2026) Der Punkt
bleibt sichtbar -- die Marke sagt, dass er ihm als Aufgabe
gegeben wurde. */
zugetragen: zugeteilt.has(pt.schluessel),
};
}),
}));
@@ -781,20 +821,25 @@ entwicklungRouter.get("/workspace/api/entwicklung/person/:id", nurLeitung, (req,
erwartung: ENTWICKLUNG_ERWARTUNG,
bloecke,
abweichungen,
/* „X VON Y" ZAEHLT AB HEUTE DAS ZUGETEILTE (25.09.2026).
/* „X VON Y" ZAEHLT DAS ZUGETRAGENE (25.09.2026).
`ENTWICKLUNG_FREMD.length` sind alle 68 -- die Zahl war damit
fuer jeden gleich, egal wie viele Punkte ihn ueberhaupt
betreffen. „0 von 68" bei jemandem, fuer den zwoelf gelten,
ist keine Auskunft, sondern eine Entmutigung.
Filipe: „es sollen nur die menge angezeigt werden die wir
zutragen und erledigte dan auch nur die die erledigt wurden
von den zugetragenen."
`meine.size` musste ebenfalls nachgezogen werden: Wer frueher
zu einem Punkt gesetzt hat, der ihm inzwischen nicht mehr
zugeteilt ist, haette sonst „13 von 12" bekommen. Gezaehlt
wird deshalb nur, was auch in der Liste steht. */
Vorher stand hier `ENTWICKLUNG_FREMD.length` -- alle 68, fuer
jeden dieselbe Zahl, egal wie viel ihm ueberhaupt aufgetragen
wurde. „0 von 68" sagt bei jemandem mit drei Aufgaben nichts
und entmutigt bei jedem.
UND DIE LINKE ZAHL EBENSO: Gezaehlt wird, was von den
ZUGETRAGENEN erledigt ist. Wer frueher zu einem Punkt gesetzt
hat, der ihm nie zugetragen wurde, haette sonst „13 von 3"
bekommen -- eine Zahl, die groesser ist als ihr Ganzes, und
die niemand mehr erklaeren kann. */
gesetzt: bloecke.reduce((n, b) => n
+ b.punkte.filter((pt) => pt.meins).length, 0),
gesamt: bloecke.reduce((n, b) => n + b.punkte.length, 0),
+ b.punkte.filter((pt) => pt.zugetragen && pt.meins).length, 0),
gesamt: zugeteilt.size,
/* Wie viele es insgesamt GAEBE -- die Oberflaeche sagt damit
„12 von 68 ausgewaehlt", ohne die Liste selbst zu kennen. */
gesamt_katalog: ENTWICKLUNG_FREMD.length,