feat(robot): enable guided hotspot binding by default

This commit is contained in:
2026-08-16 17:52:54 +08:00
parent 971865c256
commit b78fc07dba
3 changed files with 161 additions and 3 deletions

View File

@@ -0,0 +1,112 @@
# Task: Enable Guided Hotspot Binding by default
## Identity
- Task ID: 20260816-enable-guided-hotspot-4e91c2
- Mode: Feature
- Branch: codex/20260816-enable-guided-hotspot-4e91c2-enable-guided-hotspot
- Worktree: D:\Datas\OthersProjects\makelore-enable-guided-hotspot-4e91c2
- Base commit: 971865c256c2ddfe1f8ab4f8f4731a1f608599c0
- Owner: codex-root
- Status: Ready for Integration
## Scope
- Make the existing Robot Guided Hotspot Binding capability enabled when the Electron Main environment variable is absent.
- Preserve an explicit local rollback by treating `NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING=0` as disabled.
- Update focused Main route tests for the default-enabled and explicit-disabled behaviors.
- Do not change the Renderer journey, Host API shapes, cloud Binding contract, portal address, or firmware.
## Intent And Constraints
- The user explicitly confirmed that the guided provisioning journey must be enabled by default after observing the current direct six-digit-code fallback.
- Preserve `Renderer -> Host API -> Electron Main`; only Main owns the capability and the fixed `http://192.168.4.1/` system-browser action.
- Preserve the safe capability-read fallback in Renderer: a failed local capability request still falls back to the direct six-digit flow.
- Makelore must not scan nearby devices, accept arbitrary portal URLs, or collect/log/persist Wi-Fi credentials. Binding success remains separate from online readiness.
- Keep firmware changes at zero.
- This feature task may update only its own task record; the accepted default-on policy must be promoted into ADR-002 and canonical project memory during Integration Gate.
## Project Context Loaded
Task context:
- Task ID: `20260816-enable-guided-hotspot-4e91c2`
- Mode: Feature
- Branch: `codex/20260816-enable-guided-hotspot-4e91c2-enable-guided-hotspot`
- Worktree: `D:\Datas\OthersProjects\makelore-enable-guided-hotspot-4e91c2`
- Base commit: `971865c256c2ddfe1f8ab4f8f4731a1f608599c0`
- Other active local tasks: task registry reviewed; the Robot installer provenance task shares product context but owns no Robot logic changes, while older Robot design/implementation tasks are ready for integration or superseded by integrated ADR-002.
- Overlap or semantic-conflict assessment: ADR-002 and canonical memory currently require default-off. This is an intentional policy change explicitly confirmed by the user; feature work remains isolated and canonical reconciliation is deferred to Integration Gate. The placeholder `20260816-assess-design-delta-a4d91c` record has unknown scope but no declared files or intent and cannot override the current human decision.
Read:
- `.project-docs/05-agent-entry/read-before-planning.md`
- `.project-docs/05-agent-entry/memory-index.md`
- `.project-docs/05-agent-entry/concurrent-task-gate.md`
- `.project-docs/05-agent-entry/planning-gate.md`
- `.project-docs/05-agent-entry/read-before-coding.md`
- `.project-docs/00-brief/project-positioning.md`
- `.project-docs/00-brief/success-criteria.md`
- `.project-docs/30-worklog/current-state.md`
- `.project-docs/10-decisions/decision-index.md`
- `.project-docs/10-decisions/adr-002-robot-guided-hotspot-binding-v1.md`
- `.project-docs/20-architecture/system-overview.md`
- `.project-docs/20-architecture/module-map.md`
- `.project-docs/20-architecture/data-flow.md`
- `.project-docs/40-domain/business-rules.md`
- `.project-docs/80-commitments/commitments.md`
- `.project-docs/90-maintenance/stale-items.md`
- Every other registered owner's task record: `Scope`, `Intent And Constraints`, and `Promotion Candidates` sections only.
Relevant understanding:
- Project goal: keep Robot onboarding inside the existing Makelore Robot experience with Main-owned security boundaries and no firmware change.
- Current integrated focus: Guided Hotspot Binding is implemented but Main currently reports the capability false unless an environment variable is exactly `1`.
- Active task scope: reverse only that default and its regression expectations.
- Active constraints: no Renderer/firmware/cloud-contract changes; fixed portal only; no Wi-Fi credential handling; preserve explicit rollback and direct-code fallback on capability-read failure.
- Decisions affecting this task: ADR-002's default-off release policy is deliberately superseded by the user's default-on decision; all other ADR-002 security/recovery rules remain in force.
- Evidence, reflections, or commitments affecting this task: physical-device and exact shipped-firmware validation remain unverified release risks even though the product default is being changed.
- Files or modules likely involved: `electron/api/routes/ai-hardware.ts`, `tests/unit/ai-hardware-routes.test.ts`.
- Unknowns, stale docs, or conflicts: exact physical-device smoke and deployed activation issuer semantics remain unverified; canonical docs are stale for the new decision until integration.
Gate result:
- Passed. Ownership is isolated, the explicit human decision resolves the only semantic conflict, and the plan preserves all non-default security boundaries.
## Implementation Plan
1. Change the Main-owned environment default to enabled, with exact `0` as the opt-out.
2. Change the capability regression to expect enabled by default and make the disabled portal test inject `guidedHotspotBinding: false` explicitly.
3. Run focused Robot tests, typecheck, scoped lint, Vite build, and any broader verification required by the changed Main/Renderer seam.
4. Obtain independent final review, complete this task record, and hand the reviewed commit to Integration Gate for canonical documentation reconciliation.
## Outcome
- Changed the Main-owned default to `process.env.NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING !== '0'`.
- Ordinary launches now report `guided_hotspot_binding: true`, so the existing Binding dialog opens at the guided/direct path chooser instead of jumping directly to six-digit entry.
- Exact environment value `0` remains the binary-free rollback; explicit dependency injection `guidedHotspotBinding: false` is covered and continues to disable both capability reporting and portal opening.
- No Renderer, Host API wire shape, Works Square contract, portal URL, firmware file, or Wi-Fi credential boundary changed.
- The implementation diff is limited to one Main constant and focused route expectations.
## Verification
- `pnpm vitest run tests/unit/ai-hardware-routes.test.ts`: PASS, 37/37 tests, including a fresh module load with exact environment value `0`.
- `pnpm vitest run tests/unit/ai-hardware-routes.test.ts tests/unit/ai-hardware-api.test.ts tests/unit/ai-hardware-page.test.tsx`: PASS, 94/94 tests.
- `pnpm run typecheck`: PASS.
- `pnpm exec eslint electron/api/routes/ai-hardware.ts tests/unit/ai-hardware-routes.test.ts`: PASS.
- `pnpm test`: PASS before the final environment-regression test, 156 files and 1757/1757 tests. Two later default-parallel reruns each passed 1757/1758 but timed out the same unrelated OpenCode port-release test at its 10-second limit; that full test file then passed 40/40 in isolation.
- `pnpm vitest run --maxWorkers=4`: PASS after the final test addition, 156 files and 1758/1758 tests. The bounded concurrency removes the confirmed suite-level resource contention without changing test behavior.
- `pnpm run build:vite`: PASS for Renderer, Electron Main, and Preload; only pre-existing chunk-size/dynamic-import warnings were emitted.
- `git diff --check`: PASS.
- Initial sandboxed parallel pnpm typecheck/lint launch failed before running checks with `EPERM lstat C:\Users\7brot`; both commands were rerun outside that filesystem restriction and passed.
- Independent final Sol review: PASS, no P0-P3 findings. The reviewer independently reran 37/37 route tests and confirmed default-on, exact environment opt-out, dependency-injection opt-out, fixed portal ownership, local-before-Works-token behavior, error redaction, unchanged Binding contract, and zero firmware changes.
## Follow-ups
- Canonical ADR/project memory must be changed from default-off to default-on in Integration Gate; historical source task records remain unchanged.
- A real installed Electron path-choice/native-opener smoke and a physical-device end-to-end smoke remain unverified. The user's explicit default-on decision accepts changing the product default but does not turn these missing checks into completed evidence.
## Promotion Candidates
- Target: ADR-002, decision index, success criteria, Robot business rules/module map/data flow/current state, README where applicable, and release guidance.
- Proposal: Guided Hotspot Binding is enabled by default; `NIANCODE_AI_HARDWARE_GUIDED_HOTSPOT_BINDING=0` is the explicit rollback. Preserve direct six-digit fallback when the local capability request fails, the fixed Main-owned portal, zero firmware change, and all existing security/recovery limitations.
- Evidence: user confirmation in this task, Main route implementation, and focused regression verification.
- Future impact: ordinary installed builds enter the path chooser before six-digit Binding; release/support can disable the journey without changing binaries.
- Semantic conflicts: supersedes ADR-002's default-off/public-disabled policy, but not its firmware, credential, identity, online-readiness, or physical-validation caveats.
- Human confirmation required: no further confirmation; the user explicitly requested default-on.