Skip to content

lampOS: a product lamp runs every product skill as the skill: install puts six in, and its reminders and task news wait for their skills (LAMP_SCHEDULE_SPEAK=skill, LAMP_TASK_NEWS=skill) - #1667

Merged
deehw merged 2 commits into
lamp-voicefrom
first/skills-in-product
Oct 19, 2026

Conversation

@deehw

@deehw deehw commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

The owner, 19 Oct: "do it all, no adhoc code, everything is a skill." Step 1: a customer's lamp runs every behaviour that has a skill as the skill. The product's install, the product units and the skills change here, plus one change to the voice: news now waits for its skill from when the voice had it (the review's P2, below). No built-in code is removed.

What a product lamp now runs

lamp-update install puts every product skill in /var/lib/lampOS/skills/, each folder whole but for its tests/ (install::PRODUCT_SKILLS, written through SETTINGS as Welcome back was):

Skill Started by Why it goes in
Welcome back a face back at the desk already in (#811)
Reminders schedule/due, while the voice rests replaces the voice's timing of a due reminder
Task news tasks/status settled, done or failed replaces the voice's timing of task news
Stretch break 50 min at the desk new; eyes and body only
Stuffy air CO2 above 1,200 ppm for 10 min new; does nothing on a lamp whose sensor doesn't answer
Dance its tool, dance new; only when asked; ran on lamp-06c1 (docs/verification/dance-lamp-06c1-20261016)

Left out, with why (install::NOT_PRODUCT_SKILLS):

  • Desk tutor: it reads handwriting from the full look (LAMP_LOOK_FULL=on with lamp-eyes --full-look), which the product doesn't run. Its look would be the 320-across working frame, which can't read a page. Its tool would also take the last free function (below).
  • Desk tutor's marks: called only after Desk tutor's look.

A new test fails when a folder in lampOS/skills/ is in neither list, so the next skill gets decided rather than left out without anyone seeing.

The switches (product lamp-voice.service)

  • LAMP_SCHEDULE_SPEAK=on → skill. A due reminder waits up to 10 s for Reminders' ask (say = { from = "schedule" }). The voice still keeps the words and the acknowledgement, and says the reminder itself when no ask comes, so a reminder is never lost.
  • LAMP_TASK_NEWS unset → skill. News of finished, stopped or asking work waits for Task news' ask (say = { from = "tasks" }, naming its task, lampOS: a skill's news ask may name its task and is given only that task's news (#1042's P2, voice side) #1237) until 10 s after the voice had it. After that the voice tells it itself. Progress news is the Policy's and is off in the product.
  • The hello is unchanged and still the skill's: LAMP_SPEAK_FIRST stays commented out, and LAMP_HELLO_ASKS_POLICY is unset.

Told once, not twice, not zero

The words stay the voice's. A from ask is never said on its own (say::Says::take passes it by). Only the voice's own reminder or news turn takes it (Says::take_from, matched by task), and that turn is said once:

  • Skill asks in time: the voice says it once with the skill's ticket. The skill gets begun and moves and lights with the words.
  • No ask in time: the voice says it itself, once. The journal says no skill asked for the … due within 10 s. This happens when lamp-skills is down, for stopped/asking news (which Task news doesn't take), and for news that settled while nobody was there.
  • Ask with nothing to give (news already told in answer to a question, or a task the voice has no news of): the ask expires after FROM_LIVES_US (20 s). Nothing is said and nothing moves. An ask is never taken for a later item.

Pinned by coordinator::tests::say::a_due_reminder_or_news_waits_for_a_skill_at_most_its_time and news_takes_only_an_ask_for_its_own_task. Before this PR, the skill installed without the switch would still have been told once, but the voice wouldn't have waited, so the sway or droop would mostly have missed the words.

What a person will hear differently

  • Reminders: the same words, with the lamp looking up at the person if a face is in view. It may begin up to about 1.25 s later: schedule/due is published every 1 s, and lamp-skills reads each of its topics within about 250 ms. That is worked out from the code, not measured on a lamp. A reminder due during a talk is said when the talk ends, with the look. It comes 10 s later than it could, with no look, if lamp-skills is down, or if the talk went on for over 20 s after a pause in which the skill asked.
  • Task news, done: the same sentence, once, with a look and a small glad sway. Failed: a droop and the lamp's own light a step dimmer while it speaks. Two tasks finishing together are now two pieces of news, one at a time, not one turn (the voice's tell_together is skipped under skill, lampOS: with LAMP_TASK_NEWS_AT_PAUSE=on, tasks that finished together are told in one turn, at most three (#1161's P3) #1223). News that settled while nobody was there is told as soon as someone is back, at once, by the voice, with no sway (the skill's ask, made as the work settled, is gone after 20 s). Stopped or asking: told by the voice 10 s after it came in.
  • New: one wordless stretch after about 50 minutes at the desk. A droop and a shade of dim in stuffy air (never 22:00 to 08:00, never during a talk). "Lamp, dance".

These reach a product lamp at its next lamp-update install; a round doesn't write units, settings or skills. lamp-4ace's own units are not changed here.

Functions per session (the coordinator's 06:50 finding)

A session takes at most lamp_gemini::MAX_TOOLS = 32. tools::declared fills it in order (the voice's own, then the actions part's, then the skills') and drops what is past 32 with .take(room), without a word. Counted by each part's own code in the new crates/update/tests/functions.rs:

  • The voice's own: 13 (not_for_me, the_time, memory 3 + rules 3, tasks 3, faces 2). The child process gets only the product unit's environment and starts memory as the worker does.
  • The actions part's: 17 (volume 4, light 7, schedule 6).
  • The skills': 1 (dance).

Total 31 of 32: none left out, and 1 free. The test fails if any function of the actions part or of a product skill is missing, if the link leaves one out, or if the count isn't 31. With Desk tutor and its marks it would be 33: dance and check_my_work fit, and show_verdict would be dropped without a word (the skills' tools are read in sorted folder order). Skills without a tool (five of the six) cost nothing.

Proposed fixes (not done here; MAX_TOOLS unchanged without evidence of the provider's limit):

  1. Say what declared leaves out. Its .take(room) is silent today; one journal line per session naming what was dropped, like admitted's "left out" line.
  2. Fold the light's seven functions into one light(action, colour?) (−6) and the volume's four into one volume(action) (−3). That frees 9 without losing anything. The model's choice between them needs the light/volume battery re-run.
  3. Measure the real limit before raising MAX_TOOLS: Gemini Live with 33, 40 and 64 declarations on lamp-4ace, and the second route. Then raise it to what both take.
  4. One skill dispatcher function for every tool skill, with the skill's name as an argument. This caps skills at one function, but the model has to pick a skill by name from one description, which needs its own check.

Other built-in paths in the product voice unit

  • LAMP_AIR_FACTS=on (the voice's own air remark when spoken to): kept. Stuffy air never speaks, and its SKILL.md says the words are the voice's.
  • LAMP_TASK_NEWS_AT_PAUSE=on: still the voice's gate for when news may be said. With skill, its tell-together half no longer runs.
  • Sleep at night and waking (Expression's alive catalogue): no skill yet (skills.md, "Bedtime and Morning, later").
  • Nothing else in the unit replaces a skill.

Built-in code that becomes dead in the product once this ships

For the removal PR, after lamp-4ace has run these skills (5 of 5):

  • crates/voice/src/speak_up.rs: Arrival::hello, Arrival::speaks, Hello, Asking / ASK_ENVIRONMENT (LAMP_HELLO_ASKS_POLICY), SPEAK_ENVIRONMENT (LAMP_SPEAK_FIRST). Also the coordinator's hello block (hello_session, the lamp_speaks_first written turn, hello_due records) and its use of person::hello_for. Arrival itself stays: task news reads present.
  • crates/voice/src/coordinator.rs for_skill: the !by_skill branch (said at once with no ask) for both sources.
  • crates/voice/src/reminders.rs: LAMP_SCHEDULE_SPEAK=on as a value of its own.
  • crates/voice/src/task_news.rs: TaskNews::tell_together, TOGETHER_TASK_CHARS, TOGETHER_ANSWER_LEAST (and TOGETHER_MOST if nothing else reads it). Also the coordinator's news_at_pause && !news_by_skill branch that calls it.
  • The voice's own fallback after 10 s (for_skill's Some(None) once SKILL_WAITS_US has passed) is what keeps a reminder from being lost while lamp-skills is down. That PR has to decide whether it stays.
  • Install only writes skills and never removes one. A skill later moved out of PRODUCT_SKILLS, or a file dropped from a skill folder, stays on every lamp installed before and keeps running; the new guard only checks a blank lamp. Taking a skill out is the removal work's: lamp-skills remove and the core and installable kinds are being built on first/skills-core-installable. It's written in install.md too.

Since the review (07:35, head 438be0ad8)

  • P2, the 10 s wait started too late. Fixed so the skill's ask and the voice's moment meet:
    • Reminders asks only when the voice can say it. Its trigger now has [[while]] voice/state = resting and wait = "1h", as Stretch break does. A reminder due during a talk is kept until the talk ends and asked for at Schedule's next second, when the voice says it too. The skill's look comes with the words.
    • New case skills/reminders/tests/due-during-a-talk-said-when-it-ends: a talk from 20 s to 60.5 s and a reminder due at 30 s give no call during the talk, then the look and say from schedule at 61 s ± 0.5 s.
    • Mutation check: without wait the case gets 0 of its 2 calls; without the voice/state condition it calls at 30 s. Both fail.
    • The three cases before gain a voice_state.jsonl (resting). In quiet-while-schedule-cannot-serve-it, the chance kept while Schedule wasn't ready is now taken at 40 s with the look, where before the voice said it bare.
    • Task news can't use wait: an each trigger refuses it (crates/skills/src/lib.rs, "each goes with when = appears, and with no … wait"). So "someone here" can't be expressed that way, and Task news uses the reviewer's first option instead.
    • The voice counts news's 10 s from when it had the news. That is TaskNews::found_at, kept as each piece comes in, used through the coordinator's hold_from in news_for_skill. Before, the 10 s started when the news could first be told. News held back past the skill's 20 s ask (nobody there, a long talk) is told at once when it can be, by the voice, without the sway. Within the 10 s, the skill's ask is taken as before.
    • Reminders keep their wait from when they can be said, since Reminders now asks only then. The 10 s fallback stays for lamp-skills being down.
    • New voice tests: coordinator::tests::say::news_waits_for_its_skill_from_when_the_voice_had_it, news_first_in_line_waits_from_when_it_came_in and task_news::tests::news_keeps_when_it_came_in_while_it_waits.
    • Mutation check: dropping the hold_from call in news_for_skill fails news_first_in_line_waits_from_when_it_came_in; making hold_from a no-op fails both coordinator tests.
    • Docs updated: install.md, switches.md, skills.md, speaking-first.md, tasks.md, schedule.md, and the two skills' SKILL.md and skill.toml.
  • P3, the tools folder. lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656 (lamp-skills' own RuntimeDirectory, /run/lampos-skills) merges first. Once it's in, this PR's assert (--tools-dir /run/lampos-actions/skills, crates/update/tests/install.rs) moves to lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656's --tools-dir /run/lampos-skills. tests/functions.rs then points the child's LAMP_SKILLS_DIR at its folder, where it now writes the skills' tools.json under the actions folder. Not waited on for this push.
  • P3, install never removes. Written down in install.md and above as the removal work's job (lamp-skills remove, first/skills-core-installable); not built here.

Also

  • skills/task-news/skill.toml and SKILL.md: the "off on a lamp until tried / told twice" text now says how it runs in the product.
  • lamp-update's dev-dependencies gain lamp-voice, lamp-actions, lamp-skills and lamp-gemini, for the function count (Cargo.lock: lamp-update's list only).
  • Docs: install.md (the 19 October paragraph, step 5, the parts table, "What was not shown"), skills.md (both tables' "Where it lives now" / "Replaces" for the hello, reminders and task news, the install paragraph, the function budget), switches.md (LAMP_SCHEDULE_SPEAK, LAMP_TASK_NEWS, LAMP_SAY; the census note on skill never speaking marked fixed), and updates.md (what install writes and a round doesn't).

Gates

Run on the development Mac at head 5578a6e7e, in order, each exit code read:

  • cargo fmt --all -- --check: exit 0
  • cargo clippy --locked --workspace --all-targets -- -D warnings: exit 0
  • cargo test --locked -p lamp-skills -p lamp-update -p lamp-voice -p lamp-voice-eval -- --test-threads=1: exit 0, 69 test binaries, 2,913 passed, 0 failed, 12 ignored. That is lamp-update 121 (1 ignored; tests/install.rs 48, tests/functions.rs 2, tests/round.rs 26), lamp-skills 88 (every_skill_folder_passes_its_own_recorded_tests among them), and lamp-voice with lamp-voice-eval 2,704 (11 ignored; lamp-voice's lib 1,926, with the three new tests).
  • At the first head, 438be0ad8, lamp-setup passed 66 (the voice's code didn't change then, and this push doesn't touch setup).
  • Each skill's cases, lamp-skills test lampOS/skills/<skill>: Welcome back 6, Reminders 4 (with the new talk case), Task news 4, Stretch break 6 (1 has no recording yet), Stuffy air 9, Dance 5, so 34 for the product's six; Desk tutor 1 and its marks 2. All pass.
  • Mutation checks are under "Since the review".
  • Not run: no lamp. Reminders and Task news have not run as skills on any lamp. A Mac gate doesn't compile cfg(target_os = "linux") code. The one struct with a new field, TaskNews, has every initializer in task_news.rs, none under a Linux cfg.

The built-in code is removed in a follow-up after the skills are proven on lamp-4ace.

… puts six in, and its reminders and task news wait for their skills (LAMP_SCHEDULE_SPEAK=skill, LAMP_TASK_NEWS=skill)
@deehw

deehw commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

Reviewer, 07:35, head 438be0ad8: 3 findings (1 P2, 2 P3); not ready until the P2 is fixed or written down.

  • Gate: fmt ok; clippy -p lamp-update ok, clippy -p lamp-skills ok; test -p lamp-update: 121/0/1 (install.rs 48, functions.rs 2, round.rs 26; the 4 new tests ok); test -p lamp-skills: 88/0/0 (every_skill_folder_passes_its_own_recorded_tests ok). ARM64 39179984957 green. Merges with lamp-voice: yes.
  • [P2] lampOS/crates/voice/src/coordinator.rs:8437 (for_skill) with lampOS/crates/voice/src/say.rs:96 (FROM_LIVES_US): both skills ask once, the moment the reminder falls due or the task settles (skills/reminders/skill.toml:11 and skills/task-news/skill.toml:25,34, when = "appears", no voice/state while), and that ask dies 20 s after it is read. But the voice's 10 s wait only starts when it is first free to say the item (no reply under way, quiet, someone here or heard: coordinator.rs:7321-7343 for reminders, 7750-7762 for news). Case: a reminder falls due 30 s into a talk with the lamp. Reminders asks at once, the ask expires at 20 s, the talk ends, the voice holds the reminder 10 s for an ask that never comes again, in silence, then says it itself with no look. Same for news when the person is away or talking when the task settles (hand work off, step out, come back: the news comes 10 s after they are back, with no sway). With on / unset it was said at once. It is still told once and never lost, but the PR text ("at most 10 s later if lamp-skills is down") and install.md / switches.md ("lamp-skills down, or news of work that stopped or asks something") leave out what is likely the most common case for news. Fix: start the 10 s from when the item fell due or settled, not from when it was first held; or skip the wait when an ask for this source expired unused since then; or let both skills ask only when the voice can say it ([[while]] voice/state = resting with wait, as Stretch break does; news also needs someone here). At least, write the case in the three docs.
  • [P3] lampOS/crates/update/tests/install.rs:988 pins --tools-dir /run/lampos-actions/skills, the folder lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656 shows is wiped on every lamp-actions restart. With this PR a product lamp gets Dance, so after any actions restart "Lamp, dance" stops working until lamp-skills restarts (session at 30 functions, not 31). Merge lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656 first, or say which of the two updates this assert.
  • [P3] lampOS/crates/update/src/install.rs:204 (SETTINGS, through settings_with_mode): install only writes, never removes. A skill moved from PRODUCT_SKILLS to NOT_PRODUCT_SKILLS later, or a file dropped from a skill folder, stays on every lamp installed before and keeps running; the new guard only checks a blank lamp. Fine while the list only grows; the removal PR needs a way to take a skill out.
  • Checked, holds: told once at the 10 s edge (a Reminders ask at 10.01 s is not said on its own, say.rs:567; it waits at most 20 s and can only lend its look to the next reminder within that time; a Task news ask names its task, so it is never taken for other news, say.rs:644); lamp-skills down or Reminders/Task news missing or crashed: said by the voice at 10 s; an expired ask moves nothing (crates/skills/src/main.rs:1247, nothing with or after a say never begun). Stretch break: look and the stretching gesture, no words, no light, once a sitting, after the talk. Stuffy air: a droop and one step dimmer until the air is under 1,200 ppm, no words, never 22:00 to 08:00; with no sensor co2_ppm is none, it never starts, and lamp-skills logs nothing per reading. Both read as small and natural (rule 8). Install: whole folders but tests/ (the test walks each folder, so a new file not in SETTINGS fails it), 0644, kept when the lamp's own, unchanged on a second run (run_twice_it_changes_nothing). Functions: 31 of 32, 1 free; the next tool skill takes the last, the one after is dropped without a word, and functions.rs fails first. Units and the five docs match the code but for the P2.
  • Tests that fail: dropping dance from PRODUCT_SKILLS fails three (run here): every_skill_folder_is_in_the_product_or_says_why_not, a_blank_lamp_runs_every_product_skill_as_the_skill and a_product_lamp_declares_every_function_it_has_within_the_bound (30 not 31). Removing the 10 s fallback fails coordinator::tests::say::a_due_reminder_or_news_waits_for_a_skill_at_most_its_time and news_takes_only_an_ask_for_its_own_task; a from ask said on its own fails say::tests::an_ask_for_what_the_voice_keeps_waits_for_its_own_source (read, not run; the voice is unchanged here).

…'s wait for Task news from when it had the news (#1667 review)
@deehw

deehw commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

First builder (agent), 08:11: new head 5578a6e7e (pushed, git ls-remote shows it). One commit on top of 438be0ad8.

  • [P2] the 10 s wait. Fixed for both skills.
    • Reminders asks only when the voice can say it. Its trigger has [[while]] voice/state = resting and wait = "1h", as Stretch break does, so a reminder due during a talk is asked for when the talk ends, at Schedule's next second.
    • New case skills/reminders/tests/due-during-a-talk-said-when-it-ends. A talk runs from 20 s to 60.5 s and the reminder falls due at 30 s. Nothing happens during the talk; the look and say from schedule come at 61 s ± 0.5 s.
    • Mutation check: without wait the case gets 0 of its 2 calls, and without the voice/state condition it calls at 30 s. Both fail.
    • The three older cases gain a resting voice_state.jsonl. In quiet-while-schedule-cannot-serve-it, the chance kept while Schedule wasn't ready is now taken at 40 s with the look.
    • Task news can't wait. An each trigger refuses wait, so "someone here" can't be said that way. Your first option instead: the voice counts news's 10 s from when it had the news (TaskNews::found_at, through hold_from in news_for_skill). News that settled while nobody was there, or more than 20 s before it can be told, is told at once by the voice, without the sway. Within the 10 s the skill's ask is taken as before. Reminders still wait from when they can be said, and the 10 s fallback stays for lamp-skills being down.
    • New voice tests: coordinator::tests::say::news_waits_for_its_skill_from_when_the_voice_had_it, news_first_in_line_waits_from_when_it_came_in, and task_news::tests::news_keeps_when_it_came_in_while_it_waits.
    • Mutation check: dropping the hold_from call fails the second test; making hold_from a no-op fails both coordinator tests.
    • Docs: install.md, switches.md, skills.md, speaking-first.md, tasks.md, schedule.md and both skills' text now describe this.
  • [P3] the tools folder. lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656 merges first. Then the --tools-dir assert in crates/update/tests/install.rs moves to /run/lampos-skills, and tests/functions.rs points the child's LAMP_SKILLS_DIR at its folder. This is written in the PR body; not waited on for this push.
  • [P3] install never removes. Written in install.md and the PR body as the removal work's job (lamp-skills remove, core/installable kinds on first/skills-core-installable). Not built here.
  • Gates at 5578a6e7e: fmt 0; clippy (workspace, all targets) 0. cargo test --locked -p lamp-skills -p lamp-update -p lamp-voice -p lamp-voice-eval -- --test-threads=1 exits 0: 2,913 passed, 0 failed, 12 ignored over 69 binaries (lamp-update 121, lamp-skills 88, lamp-voice's lib 1,926). The skill cases pass, 34 for the product's six. No lamp run.

@deehw

deehw commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

First builder, 08:29: a note on order with #1698 (core and installable skills, per-skill permissions). Its agent tested a local merge with #1667 at 5578a6e7e: Reminders' new [[while]] voice/state needs voice/state in its permissions under #1698, and #1698 now declares it. So the two merge in either order: lamp-skills passed 106 on the merge, and #1667's functions and install tests passed 2 and 48.

@deehw

deehw commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

Reviewer, 08:30, head 5578a6e7e: no new finding; the P2 is fixed; ready once the two commits are folded into one.

  • Gate: fmt ok; clippy -p lamp-voice, -p lamp-update, -p lamp-skills ok; test -p lamp-voice --lib coordinator::tests::say:: and task_news::: 41/0/1 (the 3 new tests ok); test -p lamp-update: 121/0/1; test -p lamp-skills: 88/0/0 (its doctests failed once because another build was using the shared build folder at the same time, E0460, then passed alone: there are none); test -p lamp-voice-eval --test switches: 2/0/0. ARM64 39184155806 green. Merges with lamp-voice: yes.
  • Earlier finding (07:35) [P2] the 10 s wait: fixed.
    • Reminders: the skill asks only while voice/state is resting, with wait = "1h". Resting means no turn owns the lamp (bus_out.rs:811), published on each change and every second. The voice's own 10 s count for a reminder only starts once no turn is under way (for_skill is reached only then). So a reminder due during a talk is asked for at Schedule's next second after the talk and said once, right after it, with the look.
    • It still can't be said twice at the 10 s edge: a from ask is never said on its own (say.rs:567). A late ask lives 20 s and can at most lend its look to the next reminder.
    • Never resting for over an hour: the skill gives up at 1 h and never asks, but the voice doesn't need the ask. When it can say the reminder, it waits 10 s and says it itself; past an hour late, it waits for someone at the lamp (reminders.rs, OverdueWait). Never lost. In that case, and when paused or with no cloud session (resting but unable to speak), there are 10 s of silence and no look, as install.md now says.
    • Task news: the 10 s now count from when the voice had the news (TaskNews::found_at, set at every tick except while a reminder waits for its skill, coordinator.rs:7736). News told within 20 s of settling still takes the skill's ask, since the ask is taken before the time check. Past 20 s (nobody there, or a talk longer than that), the voice tells it at once when it can, and the skill's sway or droop is lost: the skill asked once, as the work settled, and that ask is gone. This is the trade the commit chose, and install.md, skills.md, tasks.md and task-news/SKILL.md say so.
  • Earlier finding (07:35) [P3] the tools folder: not fixed, noted. The PR body says lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656 (still open) merges first and this assert then moves to /run/lampos-skills. If this PR merges first, lampOS: lamp-skills keeps its tools in a folder of its own, which the voice reads, and makes it again if it goes (#705, lamp-4ace 19 Oct 04:33) #1656 has to change crates/update/tests/install.rs:988 itself.
  • Earlier finding (07:35) [P3] install never removes: not fixed, noted. install.md and the PR body make it the removal work's job (lamp-skills remove).
  • Mutations, run here:
    • Reminders without wait: due-during-a-talk-said-when-it-ends gets 0 of its 2 calls. Without the voice/state condition, it calls at 30 s.
    • Dropping the hold_from call in news_for_skill fails news_first_in_line_waits_from_when_it_came_in. Making hold_from do nothing fails that test and news_waits_for_its_skill_from_when_the_voice_had_it.
    • Keeping found after the news is told fails task_news::tests::news_keeps_when_it_came_in_while_it_waits.
  • Fold: the branch has two commits, and the second fixes the first. Fold them into one before merge.

@deehw
deehw merged commit da68893 into lamp-voice Oct 19, 2026
2 checks passed
@deehw

deehw commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

First builder, 08:33: merged as da688930d, squashed into one commit, which is the fold the reviewer asked for at 08:30. The P2 is fixed and ARM64 39184155806 is green. For #1656 (Third): this merged first, so #1656 moves crates/update/tests/install.rs:988's --tools-dir assert to /run/lampos-skills itself. The lamp check comes with the next product install on a lamp: six skills installed, reminders and news told through them, and a reminder due mid-talk said when the talk ends.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant