Fixed markdown download failing for repos with no main capability
specs (e.g. espectacular)
Root cause: download handler guarded on
currentSpecs.length > 0, which only tracked
openspec/specs/*/spec.md files — repos with only
changes/project docs had empty list
Fix: store OpenSpecIndex from workspace load, use
workspaceFiles to fetch all markdown under
openspec/, reuse pre-fetched spec content via lookup
map
Renamed download output from *-specs.md to
*-workspace.md to reflect broader content
Tested on both espectacular (0 specs) and
atril (37 files) — both download correctly
Committed as
cb7b947 fix: download all workspace markdown files, not just main specs
and pushed to deploy via GitHub Pages
Sessions 17:41 (miblioteca
— 2 sessions)
Reworked ghost overlay orientation tracking from
stillness-suppressed deltas to an absolute-orientation filter with
deadband, smoothing, and dt-based rate limiting; rewired
GhostMotionPipeline, ghostOverlayCanvas,
CaptureView to consume live deviceorientation
while gyro stays for motion-gate/stillness only
Added 3 sensitivity knobs (gyroSensitivity,
translationSensitivity, workingDistanceCm) and
promoted 5 hardcoded constants (STILLNESS_GATE_THRESHOLD,
TILT_MAX_DEG_RAW/SUBTRACTED, GYRO_SENSITIVITY,
TRANSLATION_SENSITIVITY, WORKING_DISTANCE_*)
to named exports
Fixed latent bug in
GhostCalibrationPage.onPipelineFrame: was discarding
translation shift in recording and freezing the rectangle
in IDLE — now applies computeTranslationShiftPx/Py and
updates rectangle in IDLE for live preview
Wired 4 new debug events into the ring buffer:
tuning:loaded, tuning:change,
tuning:section-reset, tuning:reset; mounted
DebugPanel on /ghost?debug for export
Validated end-to-end with Playwright on /ghost?debug:
disabled Gyroscope API to force
DeviceMotionGyroAdapter fallback, dispatched synthetic
devicemotion events, confirmed linear scaling of
gyroSensitivity (0.5×/1×/2× → 52/104/206 px) and
hFovDeg focal-length scaling; verified all 4 event types
fire with correct payloads
Commits: 6143c5e, 6f008d0,
cb6f059, 2c13826, 7e582fc,
3d519c9, 51e99fd — all pushed to
origin/main; 827 tests passing
Arc: went from "orientation filter ships but feels
unresponsive on-device" → diagnosing missing sensitivity gains and
motion-gate hiding → exposing every relevant constant in a live tuning
panel with audit-trail logging and Playwright-verified wiring
Next: on-device Pixel 7a validation to close
mibilioteca-nrv7 and the 2 remaining HITL tasks in
add-ghost-tuning-panel (35/37) and
add-ghost-calibration (26/27); or pick a 0% openspec
proposal (add-capture-metrics,
add-distance-config, add-ghost-overlay,
add-tracer-bullet,
add-translation-tracking)
Sessions 17:43 (miblioteca
— 2 sessions)
Finished the ghost tuning pass in
charly-vibes/miblioteca: tuning panel now exposes
sensitivity/runtime constants, persists to localStorage,
and writes tuning:loaded / tuning:change /
reset events into the debug ring buffer
Fixed /ghost live-preview behavior so rectangle motion
updates in IDLE and includes translation shift; confirmed end-to-end
tuning wiring with Playwright synthetic motion tests on
/ghost?debug
Closed and pushed the related validation/code/docs work
(cb6f059, 4549aa5, 2c13826,
7e582fc, 3d519c9, 51e99fd);
automated validation is green at npm run check +
npm test (827 tests)
Arc: moved from “tuning feels ineffective” to a
fully inspectable, logged, and browser-verified ghost-calibration path
with only device-specific HITL left
Next: manual Pixel 7a validation for
mibilioteca-nrv7 / remaining HITL tasks, or start one of
the 0% ghost/capture OpenSpec proposals
Tasks created
Decisions
Download should include all workspace markdown files, not just main
specs — broader content is more useful