fix(udgaver): porten dækkede 29 ruter og skulle dække 63 — og fladen ringede stadig på dørene
Prøven, der skal holde udgaverne adskilt, stod grøn gennem to merges, mens
34 opgaveruter blev betjent af noter-udgaven. Den fejlede ikke: den
sammenligner routeren med en nedskreven liste, og listen var skrevet ud
fra de ruter, nogen havde tænkt på. Den er en DRIFT-kontrol, og den kan
ikke være en fuldstændighedskontrol. Det står nu i prøven selv.
Lukket: CalDAV-træet (8 ruter, alle læser eller skriver en VTODO),
.well-known/caldav (en påstand om at der er en CalDAV-server), ICS-feedet
og de to ruter til dets token, de fire opgave-eksporter, Todoist- og
CSV-importen, skabelonerne, sektionerne, de seks AI-opgaveruter og
indbakke-krogen. Plus fem af ni MCP-værktøjer — endepunktet er der
stadig, værktøjslisten er kortere.
Tre blev afgjort ved at læse frem for ved navnet: en skabelon laver
opgaver (CreateProjectFromTemplate), `section_id` står på `tasks` og
findes ikke på `notes`, og add_comment hænger på en opgave.
Men den dyre halvdel var fladen. En vandring gennem hver side, der kan
nås i noter-udgaven, med konsollen og svarene aflæst, fandt SYV brud —
fire af dem fra den første port:
sidebjælken GET /filters 404 ved hver navigation, ædt af .catch()
sidebjælken GET /labels 404 ved hver navigation, ædt af .catch()
notifikationer GET /ai/plan 404, stille
notesbogens side GET /tasks kastede → status = 'failed'
notesbogens side GET /sections kastede → samme fejlskærm
indstillinger GET /templates toast med fejlbesked på skærmen
integrationer GET /feed 404, stille
Den fjerde er den, der har kostet noget: /projekt/{id} er notesbogens
side, og kaldene samles i et Promise.all, så én 404 tog hele siden med.
Den har vist en fejlskærm frem for noter siden porten blev sat. Ingen
prøve åbnede en notesbog i den udgave, og .catch(() => {}) sørgede for,
at resten ikke sagde noget. "Fladen følger udgaven" var sandt om menuen
og falsk om hentningerne.
Vagten for opgaver står i butikken frem for ved kaldestederne: der var
tre, og den fjerde blev glemt — hvilket er præcis sådan, den slap
igennem.
Og rettelsen lavede selv en fejl, som vandringen fangede: da opgavekaldet
holdt op med at fejle, kom en uendelig effekt-løkke frem, som 404'eren
havde holdt låg på. En ubetinget tilskrivning til app.tasks får
projektsidens effekt til at kalde tilbage. 404'eren var låget på en
løkke, ikke bare støj.
Også: -timeout 20m i begge CI-workflows. internal/httpapi tog 664s her og
498s i CI på #95, mod Go's standardgrænse på 600 — og når den krydses, er
beskeden "panic: test timed out after 10m0s" plus et goroutine-dump, som
læser som en deadlock i koden frem for som en suite, der blev for stor.
watchForTrouble udskilt til web/e2e/trouble.js, så udgave-suiten kan bruge
den samme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
c6c7979d1a
commit
8c3aa33f13
@@ -73,6 +73,11 @@
|
||||
// through the connector.
|
||||
$effect(() => {
|
||||
app.labelsChanged;
|
||||
// Ikke i noter-udgaven: begge ruter findes slet ikke der, så de to kald var
|
||||
// to 404'ere ved hver navigation — opslugt af .catch() og derfor usynlige.
|
||||
// Fundet af vandringen i edition.spec.js, efter at porten havde været i
|
||||
// drift i to merges.
|
||||
if (app.notesOnly) return;
|
||||
api.listFilters().then((r) => (filters = r.filters)).catch(() => {});
|
||||
api.listLabels().then((r) => (labels = r.labels)).catch(() => {});
|
||||
});
|
||||
|
||||
@@ -343,6 +343,21 @@ class AppState {
|
||||
* `completed: 'exclude'`.
|
||||
*/
|
||||
async loadTasks(params) {
|
||||
// Noter-udgaven har ingen opgaveruter, så den her ville kaste en 404 — og
|
||||
// kalderne samler den i et Promise.all, hvor én fejl tager hele siden med.
|
||||
// Vagten står HER frem for ved de tre kaldesteder, fordi butikken er det
|
||||
// ene sted, der kender udgaven: en vagt pr. kalder er tre steder at glemme
|
||||
// den fjerde, og det var præcis sådan den her slap igennem.
|
||||
if (this.notesOnly) {
|
||||
// Skrevet kun hvis der ER noget at rydde. En ubetinget tilskrivning
|
||||
// looper: projektsiden har en effekt, der læser app.tasks og kalder
|
||||
// herind, så et skriv ved hvert kald er en uendelig runde —
|
||||
// effect_update_depth_exceeded, ikke en 404. Før vagten kastede kaldet
|
||||
// på 404'eren og nåede aldrig at skrive, så løkken var skjult bag en
|
||||
// fejl.
|
||||
if (this.tasks.length) this.tasks = [];
|
||||
return this.tasks;
|
||||
}
|
||||
const { tasks } = await api.listTasks({
|
||||
completed: completedView.shown ? 'include' : undefined,
|
||||
...params
|
||||
|
||||
@@ -141,6 +141,13 @@
|
||||
let startDate = $state('');
|
||||
|
||||
$effect(() => {
|
||||
// Skabeloner er projekt plus sektioner plus opgaver, så ruten findes ikke i
|
||||
// noter-udgaven — og den her fangede fejlen i en toast, altså en synlig
|
||||
// fejlbesked på indstillingssiden frem for en tom liste.
|
||||
if (app.notesOnly) {
|
||||
loadingTemplates = false;
|
||||
return;
|
||||
}
|
||||
api
|
||||
.listTemplates()
|
||||
.then((r) => (templates = r.templates))
|
||||
|
||||
@@ -296,7 +296,11 @@
|
||||
let mailConfigured = $state(null);
|
||||
|
||||
$effect(() => {
|
||||
api.feed().then((r) => (feedURL = r.url)).catch(() => {});
|
||||
// Feedet er en kalender af opgaver, så adressen findes ikke i
|
||||
// noter-udgaven.
|
||||
if (!app.notesOnly) {
|
||||
api.feed().then((r) => (feedURL = r.url)).catch(() => {});
|
||||
}
|
||||
api
|
||||
.getMailAddress()
|
||||
.then((r) => {
|
||||
|
||||
@@ -92,6 +92,8 @@
|
||||
let planBusy = $state(false);
|
||||
|
||||
$effect(() => {
|
||||
// Dagens plan er dagens opgaver.
|
||||
if (app.notesOnly) return;
|
||||
api
|
||||
.planSettings()
|
||||
.then((p) => (plan = p))
|
||||
|
||||
@@ -88,9 +88,14 @@
|
||||
if (!projectId) return;
|
||||
status = 'loading';
|
||||
try {
|
||||
// Sektioner findes ikke i noter-udgaven, hvor et projekt er en notesbog
|
||||
// — og det er ikke bare støj: Promise.all kaster på den første, der
|
||||
// fejler, så en 404 herfra satte status = 'failed', og siden viste en
|
||||
// fejlskærm frem for notesbogens noter. `loadTasks` vogter sig selv i
|
||||
// butikken, fordi den har tre kaldesteder her.
|
||||
const [p, s] = await Promise.all([
|
||||
api.getProject(projectId),
|
||||
api.listSections(projectId),
|
||||
app.notesOnly ? Promise.resolve({ sections: [] }) : api.listSections(projectId),
|
||||
app.loadTasks({ project_id: projectId })
|
||||
]);
|
||||
project = p;
|
||||
|
||||
Reference in New Issue
Block a user