The web lesson editor records which rule a lesson is an instance of (milestone 440, #4658) #192

Merged
bvandeusen merged 1 commits from dev into main 2026-10-01 16:54:35 -04:00
Owner

Milestone 440 "Lessons point at rules — a rule is found through the situations that keep proving it".

#4658 "The web lesson editor records the answer" (cf42064). The lesson editor gains three answers:

  • an instance of a rule, ticked from the rules it resembles;
  • "No rule fits", with a required reason;
  • leave it open.

How the pieces work:

  • A new GET /api/lessons/rule-candidates searches before the save. It returns null, not [], when the search could not run.
  • An edit sends the answer only when it changed.
  • Going from linked to open sends rule_ids: [].
  • A convergence reply shows as a toast.

CI run 717 is green on cf42064.

🤖 Generated with Claude Code

Milestone 440 "Lessons point at rules — a rule is found through the situations that keep proving it". **#4658 "The web lesson editor records the answer"** (cf42064). The lesson editor gains three answers: - an instance of a rule, ticked from the rules it resembles; - "No rule fits", with a required reason; - leave it open. How the pieces work: - A new `GET /api/lessons/rule-candidates` searches before the save. It returns null, not `[]`, when the search could not run. - An edit sends the answer only when it changed. - Going from linked to open sends `rule_ids: []`. - A convergence reply shows as a toast. CI run 717 is green on cf42064. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 1 commit 2026-10-01 16:54:31 -04:00
feat(lessons): the web editor records which rule a lesson is an instance of (milestone 440, #4658)
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 13s
CI & Build / TypeScript typecheck (push) Successful in 55s
CI & Build / integration (push) Successful in 59s
CI & Build / Python tests (push) Successful in 1m55s
CI & Build / Build & push image (push) Successful in 37s
cf4206469b
The lesson editor now asks the question the create tool asks, while the
writer still has the situation in mind. It offers three answers:
- an instance of a rule, ticked from the rules the lesson resembles;
- "No rule fits", with a required reason;
- leave it open.

The rules are fetched before the save from a new GET
/api/lessons/rule-candidates. It runs the same rule_candidates search the
create door replies with, and passes "search unavailable" through as null,
apart from "nothing resembles it".

An edit sends an answer only when it changed. Re-sending the same rules
would re-stamp their judgments. Worse, a shared editor who cannot see the
owner's rule would reject it by sending a list without it. Leaving a linked
lesson open sends rule_ids=[], which is what clears the links.

"Leave it open" is not offered once "no rule fits" is on file: the server
has no way to take that answer back except by naming a rule. When "no rule
fits" completes a convergence group, the editor says so in a toast, since
the page it goes to does not recompute it.

Guards check that the payload uses the names both routes read, that the
three answers are offered, that the candidates route sits above the id route
and keeps null apart from [], and that the editor reuses .rule-chip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bvandeusen merged commit f94ff9e8fc into main 2026-10-01 16:54:35 -04:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledScribe#192