SourceHarbor has multiple truth layers on purpose.
Think of them like different ledgers in the same business:
If you mix those layers together, you start saying things that sound confident but are actually wrong.
| Layer | What it is for | What it is not |
|---|---|---|
| Postgres | business truth for subscriptions, videos, jobs, ingest runs, knowledge cards, notification deliveries | not the step-by-step execution trace |
| SQLite | runtime trace truth for step runs, retries, and local step-level execution details | not the source of business-facing job identity |
| Artifacts | human-readable result truth: digest, transcript, outline, knowledge cards, and related files | not the authoritative queue or delivery state |
For local operation, the most important runtime truth file is:
.runtime-cache/run/full-stack/resolved.env
That file tells you:
DATABASE_URL the managed stack resolved toUse it like a boarding pass, not like a comment in old code. If your terminal, docs, and running services disagree, the resolved runtime snapshot wins for local route truth.
Current cache/state contract:
.runtime-cache/SOURCE_HARBOR_CACHE_ROOT.sourceharbor/ root is now only a migration input, not the canonical runtime targetSOURCE_HARBOR_CHROME_USER_DATA_DIR~/.cache/uv and ~/Library/Caches/ms-playwright are separate shared-layer objects, not repo-exclusive state| Layer | Safe claim |
|---|---|
| Docs truth | "This is how the repo is intended to be run and interpreted." |
| Local runtime truth | "This is what the current machine and current stack actually resolved to." |
| Remote proof truth | "This is what current main, current releases, and live GitHub/distribution surfaces can prove externally." |
Do not swap these claims:
mainThe clean local first-run path is:
./bin/doctor./bin/bootstrap-full-stack./bin/full-stack upsource .runtime-cache/run/full-stack/resolved.env./bin/full-stack status./bin/smoke-full-stack --offline-fallback 0The long smoke command is stricter than the base first-run path.
It intentionally steps into provider-backed lanes after the local supervisor
path is already up. Treat it like an extended flight check, not like the same
thing as doctor + up + status.
One important split now stays explicit:
./bin/bootstrap-full-stack now keeps those two ledgers separate. It can use a
repo-owned local fallback for the core stack when Docker is unavailable but the
local postgres / initdb / pg_ctl / temporal binaries exist. The reader
stack still stays an explicit Docker-only optional lane, so it should not be
treated as a first-run blocker unless you intentionally enabled
--with-reader-stack 1.
./bin/full-stack up now also has one repo-owned self-heal step:
TEMPORAL_TARGET_HOST unreachable, it first tries
the repo-owned core_services.sh up path before declaring the stack blockedWhat ./bin/doctor is for:
What ./bin/doctor is not for:
Current video-first local truth:
mode=full YouTube job can now complete againgemini-3-flash-preview)PROCESSING.webm media does not
stall the primary video lane foreverWhat local browser login state is for:
What it is not for:
Wave 2 keeps five capabilities honest:
| Capability | Honest status rule |
|---|---|
| Retrieval | implemented, but quality is not proven until the current DB has non-empty corpus and artifact bindings |
| Notifications / Reports | implemented, but live send is still blocked until sender configuration is complete; RESEND_API_KEY alone is not enough without RESEND_FROM_EMAIL and a verified sender/domain |
| UI audit | base audit can run with valid job_id or artifact_root; Gemini review now has a recent maintainer-local proof pass, but other environments still need Gemini access if they want that extra layer |
| Computer use | implemented contract exists and a recent maintainer-local proof pass can reach the provider, but real runs still depend on Gemini access plus a valid screenshot/input contract |
| Long live smoke | the strict smoke lane is real, the short repo-managed smoke path now passes again, and YouTube provider validation removed the stale-key 403 story as the main blocker; the remaining end-to-end stop is reopening the lane with operator-managed API access plus complete sender configuration |
These are safe:
resolved.envThese need stronger proof:
main may line up again for a while, but
docs/governance closeout commits can still move main ahead before the next
tag is cut