While tracing one learned habit through the product, we found a particularly bad kind of silence. The system had written the habit into a rule and marked it enabled. But if it could not interpret the target value, the habit simply vanished. No error, no card, no sign that seenzus had learned anything at all.
Fixing the silence was not enough. A second path reached the right time and then said, in effect, “Time to turn on the light.” It knew the device and the action, yet handed the job straight back to the resident. One step further and the questions got harder. If someone turns on a child’s bedroom light at roughly the same time for several nights, when can an agent start doing it for them? Should a generic “comfortable” range reject 29°C when that is what one home’s central air conditioning actually needs? If bedtime drifts from 10:00 to 10:40, should the system cling to the old schedule or ask permission every time life moves?
Our answer is simple to state: a learned habit is not permission to act. In seenzus, a habit moves through observation, ask at the relevant time, and automatic care. Evidence gets it through the first two stages. The last stage also requires a hard safety check for the exact action, a run of real successful approvals, and one explicit grant from the resident. Once granted, timing may keep adapting. The device, action, and parameters may not drift with it.
This is a product decision we are implementing, not a claim about a feature already in people’s homes. We are writing about it now because it changed what “proactive” means to us. The hard part is not predicting the next action. It is knowing when the agent has earned the right to ask, when it may act, and when it must stop.
Learning a behavior only proves that it happened
Operation History can tell seenzus that the child’s bedroom light has often turned on around ten. The Learning Agent can turn those scattered events into a stable habit. What it has learned is a claim about the space: this tends to happen.
It has not answered a different question: who may do it next time.
The easy way to collapse those questions is to give every habit a confidence score and automate once the score crosses a threshold. We rejected that. High confidence says the agent believes its observation. It says nothing about whether a resident handed over control. The events may also have come from a wall switch, an existing home automation, or an earlier action by seenzus itself. Count them all as desire and the system soon learns to cite its own behavior as proof that it was right.
A new habit therefore stops at “ask at the relevant time” by default. If the resident opens Home near the usual time, they may see one short card: “You usually turn on the child’s bedroom light around now. Want me to do it?” The main choices are “Run” and “Skip.” If the current Source is read only, the habit still appears, labeled “Observation only · current connection is read only,” with a path back to the Source.
Visibility matters here. If an agent only shows learning when it can act, a resident cannot tell whether it learned nothing, lacks control, or failed quietly in the background. Observation is not a lesser result. It is the first part of the trust path.
Risk belongs to an action, not a device label
Our first instinct was to classify devices. Lights, climate, and fans looked low risk; locks and security looked high risk. The model broke almost immediately.
Locking and unlocking the same door are not equivalent. Turning off an air conditioner, setting it to cool at 29°C, and restoring its previous mode do not have the same certainty either. The hardest category is a plain switch. A Source may only tell us that it is a switch, while the wire behind it could lead to a lamp, a water heater, an electric blanket, or something else entirely. Assigning one weight to “switch” is a way of pretending uncertainty has gone away.
We moved the safety decision to the combination of device capability, exact action, and parameters. The Source reports what can be read or controlled and whether it can confirm the outcome. Deterministic policy then decides whether that exact action is eligible for automatic care, must remain ask-only, or is prohibited from proactive execution. The Learning Agent cannot change this policy. Neither can the resident force an excluded action into the safe category.
The first release admits lights and climate controls only, and only with explicit target states. On, off, and 40 percent brightness remain the same if delivered twice. Toggle, “a little warmer,” and “restore the last setting” do not. Climate permission is tied to one device, one mode, and one temperature rather than a range the agent may explore.
This is why a generic 18 to 28°C comfort band would be the wrong guardrail. In our living room, 29°C can be the right setting for the central air conditioning. If the device supports it, the pattern is real, and the resident grants permission for “this unit, this mode, 29°C,” seenzus can do exactly that. It cannot infer that 28°C must also be fine, much less optimize the setting down to 26°C.
Three approvals earn an invitation, not an upgrade
Asking solves the permission problem but does little for long-term friction. If someone presses “Run” every night, an agent that always asks is not much better than a reminder.
We added a narrow way forward. After the resident chooses Run for the same habit three times in a row, and the device confirms all three executions, the third result asks one more question: “Should I take care of this automatically?” The choices are “Automatic care” and “Keep asking.” A skip, a correction, a failed execution, or an unknown result breaks the streak.
The streak does not grant permission. It only decides when the invitation is appropriate. The resident’s final choice changes the authorization. We also do not keep selling the feature. If they choose Keep asking, seenzus does not raise the invitation again. They can still enable it later from the habit details.
The authorization is deliberately small. It binds the rule, control, action, parameters, current capability version, and time context. Permission to turn on one bedroom light does not reach other lights. Permission for living-room cooling at 29°C does not become freedom to pick from a range. Replacing the device, changing the Source mapping, or changing the available actions invalidates the old grant.
This takes more words than “trust the agent,” and considerably more state. In return, the resident grants something they can actually name.
Automatic care has to know when not to act
Sending the command is the easy part of unattended execution. Most of the safety work is deciding not to send it.
If the light is already on, seenzus records “Already at the target” and sends nothing. It does not count that as work completed. If the resident made a conflicting change on the same control during the preceding 30 minutes, current intent wins and this occurrence is skipped. If the service or Source comes back within 15 minutes of the schedule, the action may still run. Later than that, the occurrence is missed. A light or air conditioner should not suddenly move long after its moment has passed.
Failure does not trigger an enthusiastic retry loop. The current occurrence stops. The next ordinary occurrence may try again, but two failures in a row pause automatic care and return the habit to ask-only. Three consecutive skips caused by recent resident actions do the same thing, because the old habit may no longer fit.
A loss of control capability has an even simpler result: pause immediately and fall back to observation. If capability returns, the habit comes back as ask-only rather than silently reviving old permission. Undo is short lived too. It lasts 30 minutes and only appears if the pre-action state is trustworthy, no later operation has superseded it, and restoration still passes the safety policy. “Undo” several hours later is just another control action that may overwrite newer intent.
These rules will suppress some actions that would probably have been fine. We prefer that miss to a cleaner success rate built out of retries and resurrected authorization.
Timing may adapt; the permission boundary may not
Our first version of the design froze the authorized time. Approve 10:00 p.m., then ask again when the habit moves to 10:40. It was safe and painfully close to the rule engines we were trying to leave behind. Every shift in daily life became configuration work.
A time shift is different from a temperature change. Time is the rhythm of the same habit. The control, action, and parameters define what permission was granted. We decided that timing may move silently when the evidence is strong enough.
The evidence cannot include actions performed by seenzus. Only independent resident operations count. We require at least three, clustered within 30 minutes, and move the schedule to their median time. A new time within two hours of the existing schedule can be applied quietly, with a note in the habit details: “Adjusted from 10:00 to 10:40 based on your recent routine.” A larger move may be a different habit and needs a new decision.
Weekdays and weekends learn separately. A household may turn on the light at ten on work nights and at 11:30 on weekends. Averaging those into 10:45 gives a schedule that fits neither routine. They remain two time contexts inside one habit, each with its own evidence.
The first release stops there. Weather, presence, and the state of other devices may explain changes in routine, but they bring new ways to be wrong. We are not letting them rewrite unattended execution yet. Adding more context is only useful when each condition has a clear source of evidence and a clear way out.
A smarter experience needs a heavier state machine
The resident-facing path is short: I learned this. Want me to do it? Should I take care of it next time? Behind it, the system has to remember whether the rule is observation-only, ask-only, automatic, or paused. It has to retain the capability at the moment of authorization, distinguish failure from recent-intent conflict and a missed window, and tell resident operations apart from seenzus actions and other home automation.
We accept that cost because removing any one of those states hands the complexity back to the resident. Without a read-only state, they see silence. Without action-level policy, they have to judge technical risk themselves. Without a downgrade path, their choices become fully automatic or fully off. Without timing adaptation, they become the rule maintainer again.
Several numbers here are still provisional. Three approvals may be too slow. The 30-minute conflict window may be too wide. A two-hour drift boundary may fit one household and fail another. A wall-switch event may not tell us which resident changed their mind, especially around shared devices. That is why the initial allowlist stops at lights and climate. Range hoods, curtains, lifting devices, water heaters, and locks remain ask-only until their actions have their own evidence and safety rules.
Back to the central air conditioning at 29°C. We do not want a timer frozen at ten, and we do not want an agent that takes over the home after spotting the pattern a few times. It should notice the real habit, ask at a useful moment, then request one narrow permission after a few reliable collaborations. If the household’s timing shifts, it may follow. If the temperature, mode, or device changes, it asks again.
That is what automatic care means for us now. It is not one fewer tap. It is permission that can grow gradually and retreat when the world changes.
我们沿着一条 learned habit 的链路往下查时,碰到了一种很糟的安静:系统已经把习惯写进规则,也把它设成启用,但只要目标值没被正确解释,这条习惯就再也不会出现。没有报错,没有卡片,用户甚至不知道 seenzus 学到过它。
修掉静默还不够。另一条能正常到点的链路,最后只会说「到时间了,记得开灯」。它明明知道设备,也知道动作,却把事情原样交还给用户。再往前一步,问题马上变难:连续几天都在晚上打开儿童房灯,够不够让 Agent 以后直接开?客厅中央空调常设 29°C,通用的“舒适温度”该不该拦住它?如果作息从十点慢慢移到十点四十,系统是继续守着旧时间,还是每次都来问?
我们的答案是:习惯本身不是权限。 seenzus 会把一条习惯依次放进仅观察、到点询问和自动照看。前两步来自证据,最后一步还要经过具体动作的安全门禁、多次真实采纳和一次明确授权。获得授权以后,时间可以继续适应,设备、动作和参数不能跟着漂。
这仍是一项正在实现的产品决定,不是已经上线的承诺。写下它,是因为它改变了我们对“主动”的理解:真正难的不是让 Agent 猜中下一步,而是让它知道自己什么时候只有资格问,什么时候可以做,以及什么时候必须停手。
学到行为,只证明它发生过
Operation History 能告诉 seenzus,儿童房的灯最近常在十点左右打开。Learning Agent 可以把散乱事件整理成一条稳定习惯。这里得到的是一个关于空间的判断:这件事经常发生。
它没有回答另一个问题:以后谁可以替你做。
把两个问题混在一起,最省事的做法是给习惯一个置信分数,分数过线就自动执行。我们没有选它。再高的把握度也只说明 Agent 相信自己的观察,不说明用户交出了设备权限。何况同一条观察可能来自墙壁开关、家庭里原有的自动化,或者 seenzus 自己之前执行的动作。把这些记录全算成“用户想要”,系统很快就会学会证明自己是对的。
所以一条新习惯默认只到「到点询问」。用户打开 Home,而且正好处在习惯时间附近,才会看到一句很短的话:「你通常这时会打开儿童房灯。需要我帮你吗?」主操作只有「执行」和「跳过」。当前接入只读时,习惯仍然露面,但会写明「仅观察 · 当前接入只读」,也能回到对应的数据源看接入方式。
看得见很重要。一个 Agent 如果只在能出手时才展示学习结果,用户无法分清它是没学会、不能控制,还是在后台悄悄失败。观察不是次等结果,它是信任路径的第一层。
风险不属于设备,而属于具体动作
讨论自动照看时,我们最先想到的是给设备分类:灯、空调和风扇风险低,门锁和安防风险高。这个办法很快就坏了。
同一台门锁的上锁和解锁不是同一种风险;同一台空调的关机、设为制冷 29°C、恢复上次模式,也不是同一种确定性。最麻烦的是普通开关。数据源只说它是一个 switch,后面可能接灯,也可能接热水器、电热毯或完全不同的东西。给 switch 一个统一权重,只是在不知道的时候假装知道。
我们最后把安全判断放在「设备能力 + 具体动作 + 参数」上。数据源负责说明现在能读什么、能控制什么、能否确认结果;确定性的策略负责判断这个动作允许自动照看、只能每次询问,还是禁止主动执行。Learning Agent 不参与这道门禁,用户也不能强行把一个被禁止的动作改成安全。
第一版只开放灯和空调,而且只接受明确的目标状态。打开、关闭、亮度 40%,这些动作重复执行两次,结果仍然相同;toggle、调高一点、恢复上次设置则不行。空调授权绑定具体设备、模式和温度,不是一个任意范围。
这也是为什么 29°C 不该被一个通用的 18–28°C 舒适区间拦住。对我们家的客厅中央空调来说,29°C 有时刚好。只要设备支持,行为反复出现,用户授权的是「这台空调、这个模式、29°C」,seenzus 就可以照做。它不能从这里推出 28°C 也行,更不能自作主张优化成 26°C。
三次点头只换来一次邀请
到点询问解决了权限问题,却没有减少长期摩擦。如果用户每晚都点「执行」,一个永远只会问的 Agent 和定时提醒没有太大区别。
我们给它加了一条窄的升级路径。同一习惯连续三次由用户选择执行,而且三次都得到设备成功确认,第三次结果才会多一个问题:「以后要自动照看吗?」用户可以选「自动照看」或「继续询问」。任何一次跳过、否定、执行失败或结果未确认,都会打断这段连续记录。
三次不是授权,只是提出邀请的时机。真正改变权限的是用户最后那一下明确选择。我们也不把邀请做成推销:选了「继续询问」,seenzus 不再主动提这件事;以后想开,仍可去规则详情里自己打开。
授权范围很小。它锁定具体设备、动作、参数、当前能力版本和时间条件。允许晚上打开儿童房灯,不等于允许控制别的灯;允许客厅空调制冷 29°C,不等于允许它在一段温度里自行选择。设备被替换、接入方式变化或可用动作改变,旧授权就失效。
这套做法比“信任 Agent”多很多字,也多很多状态。好处是,用户交出的不是一个抽象信任票,而是一件能说清楚的事。
自动照看必须先学会停手
无人值守执行最容易被忽略的部分,不是怎么发出命令,而是什么情况下不该发。
如果灯已经亮着,seenzus 记录「无需操作」,不再发一次命令,也不把它包装成自己的功劳。如果用户在计划时间前半小时刚做过相反操作,当前意图优先,这次自动照看跳过。系统或数据源晚恢复十五分钟以内,可以补上;再晚就算错过,不让一盏灯或一台空调在意料之外的时间突然动作。
失败也不靠积极重试来掩盖。当次失败立即停下,不在后台再试。下一次正常发生时间可以重新尝试;连续两次失败,自动照看暂停并退回到点询问。连续三次因为用户近期操作而跳过,说明旧习惯可能已经变了,同样暂停,让 Learning Agent 重新看。
控制能力丢失时,处理更直接:立即暂停,变成仅观察。能力后来恢复,也只回到到点询问,不静默复活旧权限。短时撤销只在执行后三十分钟内有效,而且要求设备没有被再次操作、执行前状态可靠、恢复动作仍然安全。几个小时后的「撤销」不是撤销,它是在覆盖后来发生的事情。
这些规则会让系统少做一些本来可能没问题的动作。我们宁愿先承受这种漏做,也不靠自动重试和权限复活换取一张更好看的成功率。
时间可以适应,权限边界不能漂
最初我们想把授权时间锁死。用户批准晚上十点开灯,习惯后来变成十点四十,就再问一次。这个方案安全,也很像旧式规则引擎:生活每挪一步,用户就要维护一次配置。
时间漂移和温度变化并不是同一件事。时间是同一习惯的节奏,设备、动作和参数才是它的权限边界。我们因此允许时间在证据充分时无感调整。
调整不能拿 seenzus 自己的执行来作证。只有独立的居民操作算数;至少三次,时间彼此集中在半小时内,系统取中位时间。新时间落在原计划前后两小时内,可以静默更新,并在规则详情留一句「根据最近习惯,已从 22:00 调整为 22:40」。超过两小时,可能已经是另一件事,要重新确认。
工作日和周末分别学习。同一个家庭可能工作日十点开灯,周末十一点半才开。取一个十点四十五的平均值,两边都不对。它们应当是同一习惯里的两个时间情境,各自积累证据。
第一版到这里就停。天气、在不在家、其他设备状态都可能解释习惯变化,但它们也会带来新的误判。我们暂时不让这些情境改写无人值守执行。聪明不在于一次加入多少条件,而在于每个条件有没有足够清楚的证据和退出方式。
更聪明的代价,是一套更重的状态机
从产品表面看,这条路径很短:我学到了,需要我做吗,以后自动照看吗。系统内部却要记住规则处于仅观察、到点询问、自动照看还是暂停;要保存授权时的设备能力;要区分执行失败、近期意图冲突、错过时间和已经满足;还要知道一次操作来自居民、seenzus,还是别的家庭自动化。
我们接受这份复杂度,因为删掉任何一层,复杂度都会转嫁给用户。没有只读状态,用户只看到沉默;没有动作级门禁,用户要自己给设备判断风险;没有降级路径,用户只能在“全自动”和“完全关闭”之间选;没有时间适应,用户又成了规则维护员。
仍有几件事没有答案。连续三次会不会太慢,半小时的冲突窗会不会太宽,两小时的漂移边界是否适合不同家庭,都需要真实使用来改。多人共同使用一台设备时,墙壁开关记录也未必能说明是谁改变了主意。第一版只做灯和空调,油烟机、窗帘、晾衣架、热水器和门锁继续每次询问,不假装一个“低风险设备”标签已经解决了它们。
回到那台 29°C 的中央空调。我们想要的不是一条永远固定在十点的定时规则,也不是一个见过几次就接管全屋的 Agent。它应该先看见真实习惯,在合适的时候问,经过几次可靠合作后再请求一项很窄的权限。以后作息慢慢变化,它可以跟上;温度、模式或设备变了,它重新开口。
这就是我们现在对自动照看的定义:不是少一次点击,而是让信任可以逐步长出来,也可以在现实改变时退回去。