Skip to content

The photo host service: photocraft behind photo.* (ADR 0013) [skip ci] - #379

Merged
ymote merged 1 commit into
mainfrom
feat/photo-engine-service
Oct 8, 2026
Merged

ymote merged 1 commit into
mainfrom
feat/photo-engine-service

Conversation

@ymote

@ymote ymote commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Third in the ADR 0013 stack (#377 → #378 → this; retarget before deleting base branches). Phase 1, engine #2.

apps/photo/host-service (octosense-photo-service, family photo): photocraft's own headless automation layer as a host service — info / convert / run / commands / render, every call a fresh stateless session. Containment is the engine's own: photocraft's capability-rooted AuthorizedWorkspace bound to the caller's host dir refuses separators, .. and escapes before any I/O. Engine pinned to ymote/photocraft @ eec4af65. System apps only; ≤64 commands per run; previews ≤4096 px.

Verified: 3 tests — a real PNG (embedded fixture) through info (12×8) → PNG→WebP → Gaussian blur saved back → preview render, plus the 500+-command catalog check; engine-side path refusal; caller gate. native_apps.py --check, setup.py --check --cargo pass. (Maturity context: photocraft's own suite is 1,203 tests green — see ADR 0013's measurements.)

🤖 Generated with Claude Code

@ymote
ymote force-pushed the feat/sheet-fill-kernel branch from fe78cd9 to f8668d9 Compare October 8, 2026 08:41
@ymote
ymote force-pushed the feat/photo-engine-service branch from 2462395 to c466e1e Compare October 8, 2026 08:41
@ymote
ymote force-pushed the feat/sheet-fill-kernel branch from f8668d9 to 470ed7e Compare October 8, 2026 09:27
@ymote
ymote force-pushed the feat/photo-engine-service branch from c466e1e to 6abd3d1 Compare October 8, 2026 09:27
@ymote
ymote force-pushed the feat/sheet-fill-kernel branch from 470ed7e to bf650ce Compare October 8, 2026 09:31
@ymote
ymote force-pushed the feat/photo-engine-service branch from 6abd3d1 to 405c21f Compare October 8, 2026 09:31
@ymote
ymote force-pushed the feat/sheet-fill-kernel branch from bf650ce to 47bcca4 Compare October 8, 2026 09:52
@ymote
ymote force-pushed the feat/photo-engine-service branch from 405c21f to 90e44c5 Compare October 8, 2026 09:52
@ymote
ymote force-pushed the feat/sheet-fill-kernel branch from 47bcca4 to b1c7cbb Compare October 8, 2026 10:08
@ymote
ymote force-pushed the feat/photo-engine-service branch from 90e44c5 to 0426e0e Compare October 8, 2026 10:08
@ymote
ymote changed the base branch from feat/sheet-fill-kernel to main October 8, 2026 10:25
apps/photo/host-service (octosense-photo-service): photocraft's own
headless automation layer as a host service -- info, convert, run (the
engine's command catalog: crops, adjustments, filters), commands and
render, every call a fresh stateless session. File access is bound to the
caller's host directory by photocraft's capability-rooted
AuthorizedWorkspace, so the engine itself refuses separators, .., and
escapes before any I/O. System apps only; at most 64 commands per run
call; previews capped at 4096 px.

The engine is pinned to the ymote/photocraft fork at eec4af65 (ADR 0013
family discipline); the shell registers the service on desktop beside the
sheet service, with the dep in native-apps.json's App Hub implies.

cargo test -p octosense-photo-service: 3 tests -- a real PNG through
info (12x8), PNG->WebP, a Gaussian blur saved back, and a preview render,
against an embedded fixture; the engine's workspace refusing escape
paths; the caller gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ymote
ymote force-pushed the feat/photo-engine-service branch from 0426e0e to d64b009 Compare October 8, 2026 10:25
@ymote

ymote commented Oct 8, 2026

Copy link
Copy Markdown
Contributor Author

Local CI passed on d64b009 (tools/ci-local.sh --only apps,desktop,phone --linux-host --offload, 19m08s, Darwin arm64; the ubuntu jobs and the macOS jobs' portable steps (their macOS steps ran here) on the Linux build host, Linux x86_64).

GitHub would run for this PR: desktop.yml, phone.yml, apps.yml. Merged on this local pass (macOS runner queue); GitHub CI runs on the merge commit on main.

Job Step Result Time
ci-local / drift The local mapping fits the workflows PASS -
desktop.yml / desktop Prepare the pinned framework sources PASS 0s
desktop.yml / desktop Compile the desktop with the shared runtime PASS 2m40s
desktop.yml / desktop Desktop tools and scripts PASS 14s
desktop.yml / desktop (linux) Prepare the pinned framework sources PASS 0s
desktop.yml / desktop (linux) One copy of every shell source PASS -
desktop.yml / desktop (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 4s
desktop.yml / desktop (linux) The native apps' generated places match native-apps.json PASS 0s
desktop.yml / native-host-api Prepare the pinned framework sources PASS 0s
desktop.yml / native-host-api Build the native acceptance host and pinned Hub CLI PASS 2m44s
desktop.yml / native-host-api Signed app tool calls a real OS permission API PASS 2s
phone.yml / home Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home Validate launcher icons and Apple asset catalogs PASS 3s
phone.yml / home Compile Home and its bundled modules PASS 2m01s
phone.yml / home (linux) Prepare pinned sources and the reviewed runtime patch PASS 0s
phone.yml / home (linux) Verify the single runtime graph PASS 1s
phone.yml / home (linux) The native apps' generated places match native-apps.json PASS 0s
phone.yml / home (linux) The pinned octos revision PASS -
phone.yml / home (linux) Build octos (unless cached) PASS -
phone.yml / home (linux) Build Home, App Hub admission and runtime policy tests PASS 4m27s
phone.yml / home (linux) Test Home, App Hub admission and runtime policy PASS 13m56s
phone.yml / home (linux) Two-lane scenario (real kernel, scripted model) PASS 26s
apps.yml / services (linux) python3 tools/setup.py PASS 0s
apps.yml / services (linux) Shared system app interface PASS 0s
apps.yml / services (linux) Kernel service PASS 16s
apps.yml / services (linux) App peers PASS 28s
apps.yml / services (linux) AI providers config PASS 4s
apps.yml / services (linux) Connected provider protocols and Linux host adapter PASS 47s
apps.yml / services (linux) L0 in-card chat (sys.chat, host side) PASS 10s
apps.yml / services (linux) System toolbox (workflow templates) PASS 1m30s
apps.yml / kernel-security (linux) python3 tools/setup.py PASS 0s
apps.yml / kernel-security (linux) The pinned octos revision PASS -
apps.yml / kernel-security (linux) Build octos (unless cached) PASS -
apps.yml / kernel-security (linux) Real-kernel tests PASS 37s
apps.yml / apps (linux) python3 tools/setup.py PASS 0s
apps.yml / apps (linux) Host services (Mail, AI providers, News) PASS 2m01s
apps.yml / apps (linux) Connected accounts and Rinx editor PASS 1m32s
apps.yml / apps (linux) Shell AI services (crates/ai-host) PASS 2m49s
apps.yml / apps (linux) AppCard runtime setup safeguards PASS 0s
apps.yml / apps (linux) AppCard clippy (own crates; shared runtime compiles) PASS 26s
apps.yml / apps (linux) AppCard transport and store PASS 7s
apps.yml / apps (linux) One Makepad, App Hub, octos and Rinx in the locked graph PASS 2s
linux-host / sandbox (linux) python3 tools/setup.py PASS 0s
linux-host / sandbox (linux) Process sandbox on Linux (Landlock, seccomp) PASS 1m39s

Notes:

  • GitHub runs Python 3.12; this run used Python 3.9.6
  • GitHub runs Python 3.12; the Linux host used Python 3.14.4

Native GitHub acceptance passed on the same head: embedded-browser.yml.

@ymote
ymote merged commit 7a56ee5 into main Oct 8, 2026
6 of 8 checks passed
@ymote
ymote deleted the feat/photo-engine-service branch October 8, 2026 10:45
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