Off-repo diagnosis (Pi 400, no RTC hardware, healthy crystal at -7.39 ppm): the box's clock sat ~43 h behind and systemd-timesyncd's first contact after the Oct 12 restart was 42.9 h later, so Pi-hole ran as a DNSSEC validator with a wrong clock -> 1.69M+0.84M dnssec=3 (BOGUS) rows on 10-11/10-12 hitting the PSN endpoints = the PS5's DNS errors. KSK-rollover theory retracted (both root anchors present; root DNSKEY still returns ad). Pending creator decision: tighten timesyncd polling and/or add a DS3231 RTC. MyMistakes: the reply marker string (recovered verbatim, with the search recipe), and the no-RTC/no-cron/timesyncd facts so the premise is not re-derived a third time.
11 KiB
11 KiB
HANDOFF — 2026-10-17 (PLANNING ONLY session; nothing pushed — push at the next milestone)
At a glance
- Branch main, tracking
origin/main. origin/main =931ab46; HEAD = the tip commit "HANDOFF: vv webcam plan, and drop the stale vertical-preview landmine" — 5 ahead, 0 behind (nothing pushed; per the commit/push policy, push only when the creator says so). This file cannot record its own commit's hash, so the tip is named by subject.- The five local-only commits:
3cb29ea(previous session's HANDOFF refresh),a3a4681(per-element composite timing + scene dump),84cbec2(FramePumpTests thread-safe log sink),cdf82f6(read the first instrumented take), the tip. Always checkgit log origin/main..HEAD— never trust a handoff's own "0 ahead" claim.
- The five local-only commits:
- Working tree clean after the tip commit.
- This session produced NO code, NO build, NO test run. It specified the creator's vv
(vertical 9:16) webcam feature end to end; implementation has not started. The locked rules are
below — they are the deliverable, and they must land in
TASKS.mdwhen work is queued. The session's later half moved off-repo to the officerFriendly/Pi-hole/PS5 "DNS errors" diagnosis — findings and the pending creator decision are inOpen (operational)below.
vv webcam feature — locked rules (creator, 2026-10-17)
| mode | shape | size | position |
|---|---|---|---|
| 16:9 | as today | as today | as today |
| vv · Live | circle OR rect, creator's choice | small tile | one of six spots: top/bottom × L/C/R |
| vv · Chat | rect only — no circle option | normal, or enlarged to fill one area (607×540) | enlarged → top or bottom |
| Starting / BRB / Ending | unchanged | unchanged | unchanged |
- Placement is set by tap/click-drag with snap, exactly like the socials today, plus manual entry in properties. Creator's explicit precedent, not an inferred one.
- vv keeps its own camera position, size and shape per scene — creator-confirmed: switching back to 16:9 restores the desktop layout exactly as it was.
- No explicit borderless/no-background mode is needed: round + border/bg options already let the creator strip both (creator's ruling — this deletes that item from the original request).
- Creator's "square" means the rectangular view (the camera's own aspect), not a literal 1:1 box.
What the code already gives us (established this session — do not re-hunt)
- vv = the active tier's centred band crop. 1080p60-vertical: master band x 656.25–1263.75
(607.5 wide), full height, upscaled to 1080×1920 (
MainViewModel.Streaming.csApplyStreamQuality→OutputRect*). The band splits into two 607×540 areas (top/bottom) — the creator's "two mini 16:9 views", each exactly 50% of the frame. - The Live webcam sits at x≈1425 → entirely outside the band. That is the whole motivation: in vv the camera is not misplaced, it is invisible.
- Geometry only — no render-path change. Preview (
Controls/PreviewPane.xaml144–230) and compositor (Services/Compositor/SceneCompositor.cs389–397,DrawBorder) both read the element's ownX/Y/W/H+ClipShape, so parking the camera needs no compositor or preview work. The two-tile look falls out of the camera covering half the band — the capture element, chat box and blit path stay untouched. - Round / border / background are independent:
ClipShape.Round;HasBorder= width > 0 AND a valid 6-hex colour;BackgroundEffect= None/Remove/Blur. - Per-scene camera size policy already exists:
MaxWebcamWidthFor/HeightFor(Chat 1358×764, others 960×540) +ClampWebcamToBounds. A 607×540 tile sits inside both → the clamp needs no change. - Storage:
WebcamSceneConfigtable; new columns go inMigrateWebcamConfigTable()as idempotentALTER TABLE … ADD COLUMNguarded onPRAGMA table_info— the established "additive, no version bump" idiom (RectWidth/RectHeight, TASK 51'sBackgroundEffectlanded this way) — plusLayoutStore.Save.csINSERT andLayoutStore.Load.csSELECT. - Existing per-element precedent for remembered geometry:
RectWidth/RectHeight+ToggleClipShape(Models/SceneElement.cs124–152) — the pattern for keeping the 16:9 layout while vv owns its own.
Units (each: ONE Good Dog integration test, own commit, memory in the same commit)
- vv camera layout — stored separately per scene, resolved when the tier changes. Live: small tile (circle or rect) snapped to one of six spots; drag like the socials + properties entry. Test: with the vertical tier active, dragging the Live camera to top-right places it top-right inside the band; switching back to 16:9 restores the original layout.
- vv · Chat — rect enforced with the circle option unavailable, plus enlarge-to-one-area (607×540) snapping top or bottom. Test: in Chat under the vertical tier, enlarge sets the full top area and the circle option is not offered.
Corrections made this session
- Withdrawn landmine (creator-confirmed): the old line "Vertical-format regression (STALE, not fixed): 1080p60-vertical selection no longer shrinks the capture border in the preview" was never verified, and it cost this session a pointless question. The creator confirms vv does dim the two bands astride the centre band and that this is expected/best practice. If the original symptom was something else (the capture element's own border?), it is unexplained, not known-broken — do not re-raise it as a dependency.
- The prev-session content (first instrumented take: judder did not reproduce, no element slow; probe
- recipe; the four local commits) is unchanged and lives in
ai.md→ "✅ What the first instrumented take said".
- recipe; the four local commits) is unchanged and lives in
Next step
- Implement Unit 1 on the creator's go-ahead. Nothing is queued in
TASKS.md— the creator queues work, and this plan lives here until then. Queue it inTASKS.mdas part of the first Unit 1 commit.
Open (operational)
- verify.sh's known-failure whitelist is too loose (confirmed twice on 2026-10-16): it passes when
ANY known failure appears, so a new failure rides along unnoticed — and when the ONLY failure is a
known flake (
LayerReorderPersistenceTests.RealMouseDrag_OnTheLayerList_PersistsTheReorder, which passes in isolation) it reports "NOT the known pre-existing pair". Follow-up: require EVERY failure line to be whitelisted, and addMasterLimiter_CapsTheLiveMix_OnThePipe+RealMouseDrag_OnTheLayerList_PersistsTheReorderto the list. - A pre-existing stash is still sitting there:
stash@{0}= "WIP on main:0464593Compositor: fast-path opaque 1:1 when source fills canvas" (NOT this session's; do not drop it blindly). - The judder reproduction take in the FAILING geometry (vertical 1080p60 first) is still outstanding —
no fix until a take names the stage (see
ai.md; thepartsline decides the latch hypothesis). - ⛔ Sudo password rotation pending (user; then update both
CREDENTIALS.mdpassword lines). - TASK 56 secret scan before
gramps/LlamaCastygoes public. - TASK 55 disk hygiene (
startup.loguncapped — 23MB and the new lines add to it every 5s).
Tests
- Last full run: 428/428 passed, 0 warnings (2026-10-16, the gate run for
84cbec2). No run this session (planning only). - Known flaky-by-environment (all pass in isolation):
AudioPipelineTests.Mix_HonorsProviderGains…,MasterLimiter_CapsTheLiveMix_OnThePipe,LayerReorderPersistenceTests.RealMouseDrag…,Round_Clip_Corner…. Read verify.sh's output — it can pass with an unlisted failure present, or fail on a known flake (see above).
Secrets / paths (do not re-hunt)
- Layout DB:
%APPDATA%\ytLlive\ytLlive.db(SQLite, full-rewrite per save). Auth:%APPDATA%\ytLlive\ytLlive.auth(DPAPI). Startup log:%APPDATA%\ytLlive\startup.log(23MB). - Recordings land in
C:\Users\gramp\Downloads\recordings\(ty-<date>-<time>-<ms>-<seq>.mp4; a duplicate name gets a-2suffix — the log's path and the file on disk can differ that way). - Conversation history (how to recover what was actually said):
~/.local/share/opencode/opencode.db, tablesession_message— creator turns aretype='user'with the text indata.text; my turns aretype='assistant'with reasoning AND the rendered reply concatenated intocontent[0].text(so my own reasoning quotes the creator's phrases — apartordata.texthit may be my echo, not a real message). The reply marker's verbatim string is recorded inMyMistakes.md(it was lost once and cost a session to re-derive). - LAN credentials:
CREDENTIALS.md(gitignored). Google Cloud OAuth project number198374416003, owned byllamachile.shop@gmail.com— verify athttps://console.cloud.google.com/apis/credentials?project=198374416003.
Open (operational) — officerFriendly / PS5 "DNS errors" (2026-10-17, off-repo work)
- Root cause found: a ~43 h-wrong system clock on officerFriendly ×
dnssec = true. The box is a Pi 400 with no RTC hardware at all (no/dev/rtc*,hwclockcannot open one, noi2c-rtcoverlay) and a healthy oscillator (adjtimexfreq = −7.39 ppm = −0.64 s/day), so there is no "dead RTC battery" — time comes fromfake-hwclock's saved file +systemd-timesyncd. The journal shows the clock stepping forward +54 min, +7 h, then +42.9 h (last step Oct 14 13:56:44, the first successful time-server contact after the Oct 12 19:01:43 restart). A validating resolver with a wrong clock returns BOGUS, andpihole-FTL.dbshows exactly that: 1,688,396dnssec=3rows on 10-11 and 839,276 on 10-12 vs ≤23 every other day, hittingps5.np.playstation.netand the other PSN endpoints = the PS5's "DNS errors". The KSK-rollover theory is retracted: both root anchors (20326+38696) were already in place, anddig @127.0.0.1 . DNSKEYstill returnsad. - Pending creator decision (do not apply unilaterally): tighten
/etc/systemd/timesyncd.conf.d/lan.conf(currently IP-literal NTP servers = Cloudflare + Google, but stock poll settings) toPollIntervalMinSec=16/PollIntervalMaxSec=64/ConnectionRetrySec=8/SaveIntervalSec=30, and/or give the Pi a DS3231 RTC on i2c (i2c-toolsis already installed). - LAN DNS routing vs creator intent: DHCP still hands out
dhcp_dns1_x = 192.168.50.26+dhcp_dns2_x = 192.168.50.1(clients query Pi-hole directly — 37 distinct LAN nodes in 24 h, 41 including the router), whereas the creator wants everything to point at.1with BBR forwarding to Pi-hole (wan_dns = 192.168.50.26already works:.1made 3811 queries). Alsodnssec = trueon Pi-hole duplicates dnscrypt-proxy'srequire_dnssec = true. Both are offered-for-veto, not yet done.