content-pipeline archive: Delivery log 2026-09-17 to 2026-09-27¶
Archived from content-pipeline (the whole Delivery log section, 2026-09-17 to 2026-09-27); moved verbatim, nothing summarised. Return to content-pipeline.
Delivery log¶
-
2026-09-24 artwork generation, and why Claude cannot do it: Claude has no image generation — not the main session, not a subagent, not the Design artifact type, which renders HTML/CSS/SVG and would produce exactly the flat vector look Angel rejected on 09-22 and the reviewer rejected on 09-23 ("flat generic dark circuit art"). Local generation is not viable either: this box has Intel HD 630 integrated graphics, 15 GB RAM with ~4 GB free, and the emulator alone wants 4.8 GB. Gemini "nano banana" was the right idea and is currently blocked by quota, not by code. With Angel's AI Studio key the model list returns 200 and shows
gemini-2.5-flash-image,gemini-3.1-flash-image,gemini-3-pro-imageand others, but every image model returns429 RESOURCE_EXHAUSTEDwithQuota exceeded for metric: generate_content_free_tier_input_token_count, limit: **0**. Limit zero is "this project has no image entitlement", not "today's allowance is spent". The same key's text model answered separately (503, transient load), so the key is valid. Third-party blogs claiming 500 free images/day were wrong for this account, and Google's own rate-limit page does not publish free-tier image limits at all — it says to read them in AI Studio, so this needs Angel's console (https://aistudio.google.com/rate-limit). Likely a per-project entitlement or a billing-enabled prerequisite; a key from a different AI Studio project may behave differently.~/.local/bin/artwork-generateis written and ready: it sends the owner-approved USB-C image as a style reference with the prompt shape recorded inasset-library/prompts.md, requests 9:16 or 1:1, validates the returned PNG's dimensions and aspect against the Story tolerance (±0.005, width ≥720), and stages the result without touching the library — an image still has to be looked at. On no quota it exits with the rate-limit URL rather than a stack trace.--dry-runprints the prompt and calls nothing. Standing fallback: Codex returns 2026-09-28 and its built-in image generation produced the existing four in the approved style. -
2026-09-23 measured what actually drives reach, and acted on it. Instagram: 23 followers, reach per post 10/9/67/9/15/20. The 67 had one share; every other post had zero. One share produced 5.4x the median reach — at this follower count a share outweighs any posting time, so the posting schedule was left alone. Facebook page: 28 followers but 42 "talking about", i.e. more people engage than follow; inviting engagers to like the Page is the highest-yield legitimate action available. Site traffic (Cloudflare Web Analytics, already enabled 13 days — the beacon is edge-injected, so it does not appear in the site source): ~120 visits in 7 days on the public site, top pages
/54,usb-c-power-delivery…17,/notes/9, everything else 4–7. Referrers: Facebook 41, Google 26 — social currently beats search, and search has not started because the notes are young. The zone-wide "290 uniques/day" figure is misleading: 86,911 of 8 days' requests areadmin.embeddedera.com, our own polling. Conclusion recorded so it is not re-derived: timing is not the lever at this size (17 visits/day gives 2–3 per time bucket — unmeasurable); shares, saves and follower growth are. Revisit timing when a single note clears ~100 visits/week. - 2026-09-23 caption share ask:
content.add_share_ctainserts "Save this for the next board, or send it to whoever owns the problem." above the closing CTA, becausedaily_reviewchecks that Instagram ends on the bio CTA and Facebook carries the exact article URL. Newcontent.instagram_captionis now the single resolver used by bothdaily_bundle(what gets approved) anddaily_runtime(which compares delivered against approved) — they previously read the caption independently, and any divergence would have failed every Instagram delivery verification for a reason nobody would find quickly; a test asserts both call it. Sandbox8315027, cherry-picked to main69007c6, 685 tests pass, assistant restarted and healthy. Gotcha for this repo: promote by cherry-pick, not merge.mainandsandboxcarry the same content under different SHAs (verified:4cedc46≡3dc18b2,1e06abf≡793881c).git merge sandboxwould replay ~20 duplicate commits — the same shape that wedgedembeddedera-site-applethis morning. -
2026-09-23
~/.local/bin/social-insightsrecords reach/shares/saves/likes per post to~/.local/state/social-insights/history.jsonl, daily at 07:45 throughcron-run. It keeps the latest snapshot per post because reach keeps growing after publication, and--reportranks posts against the median so an outlier is visible. Read-only; reusesmeta_observer's credential path. Declined and why: no automated follow/unfollow. It breaches Instagram's Terms of Use and Meta's Platform Terms, risks the account that is currently the best-converting channel (41 referrals vs Google's 26), and follow-back audiences do not buy PCB design. -
2026-09-23: the daily approval chain was built and never connected.
daily_review(9 checks, verifies material claims against primary sources it actually fetches, inspects the artwork) →daily_bundle(records the review, callsnote_queue.approve) →daily_prepare(keeps tomorrow..+6 filled) all existed with passing tests, and nothing scheduled any of it.pcb-layout-mistakes-that-only-show-up-at-assemblyhad already been auto-approved at 12:13Z byassistant:claude-fable-5-1:independent-reviewand sat at statequeued; the other three pending notes had no package, so were never reviewed. Wired it up:~/.config/content-review.confpins the two owner-preferred reference images (the reviewer requires exactly two and the choice is editorial — USB-C and "No schematic"),~/.local/bin/content-daily-prepareruns the controller with a kill switch at~/.config/content-review.disabled, and cron runs it hourly at:37throughcron-run. It never publishes. Verified the reviewer is not a rubber stamp, twice. On the PCB-layout package: 9/9 checks, 7 claims verified against 15 fetched sources, pixel-measured the Story safe area, and it correctly classified the article's 404 as expected for an unpublished package. On the BLE package it held: all 9 checks passed butvalidate()rejected the decision because a listed claim lacked a fetched source — the model cannot claim verification it did not perform. - 2026-09-23 artwork library: the matcher (
daily_library.choose) scores literal word overlap between the slug and each asset's keywords, soproductdoes not matchproductionand a battery topic scored zero against all four images. Widened the keyword vocabulary to what note titles actually use (rechargeable, lithium, cell, charging, bootloader, errata, panel, stencil, esp32…), deliberately avoiding generic tokens like product/design/board that would match everything and leave the reviewer as the only guard. Images and their visual reviews are untouched — hashes re-verified — andkeywords_widened_by/atrecords the change. All five current topics now resolve to a sensible image. The real fix is more artwork: the library holds four images generated with Codex's built-in image generation (prompts inasset-library/prompts.md); Claude has no image-generation tool, so about eight more covering power/battery, connectors, test, RF and sensors should be generated when Codex returns 2026-09-28, or the same four will repeat across every post. Gotcha: three failed preparations put a slug into a 24-hour cooldown (.local/state/content-daily/attempts.json). The lithium slug hit it purely from a misconfigured--librarypath during setup; the counter was cleared, the guard left in place. -
2026-09-23 still gated:
note_queuerefuses to release approved notes unlessCONTENT_DAILY_RELEASE_ENABLED=1, deliberately off "until the full daily-package executor and Android handoff are connected and accepted". All five adapters incapabilities.jsonreadaccepted: false. Approval now happens automatically; publication still does not. That switch is Angel's decision. -
2026-09-23: the hourly "Content buffer needs attention" alerts were one wedged draft. At 07:14 the researcher wrote
when-a-chip-revision-changes-but-the-part-number-doesn-tand it failed thestandards-claimgate. The rejection path left the file in the worktree, andweekly-research's first guard refuses to start on a dirty worktree — so every hourly refill from 07:14 to 14:07 died in two seconds, alerted, and changed nothing. Eight alerts, and the feed buffer fell from covered to missing 2026-09-27 through 09-30 (deficit 4,run_cap3). Two guards, each sensible alone, deadlocked: "keep failed runs" plus "never start dirty" equals "one bad draft stops research forever". Fixed: the rejection path now moves the draft to~/.claude/routines/rejected-drafts/<timestamp>-<slug>.mdinstead of leaving it in place, and says so in the alert. Research is preserved and unblocked. The 07:14 draft was quarantined there by hand; the worktree is clean and the next hourly refill runs normally. Still open — a false positive. The gate isgrep -qi 'IPC-A-610\|J-STD\|ISO 9001\|UL listed', meant to stop the site claiming a certification EmbeddedEra does not hold. The rejected draft only cited JEDEC J-STD-046 as the standard governing part-change notices — a referenced fact about how vendors behave, not a claim about us. The gate cannot tell a citation from a claim, so any note about standards is unpublishable. Narrowing it (fail only when a standard token appears with first-person claim words) needs Angel's call, since it loosens a claims-risk guard. The draft is kept at the path above. -
2026-09-23:
list-syncreportedR2 list failed: timeout (curl=28 HTTP=000)at 11:31 — a single transient. It is now wrapped bycron-run, so a repeat pages with the log tail rather than one line. -
2026-09-22 22:05 Eastern: Owner instructed cancel this pipeline's Stories, schedule feed posts, and continuously maintain seven days of research supply; Stories move to another chat. Deployed assistant main
a250ec1(sandbox6366ca2), then citation/Fable routing follow-up44044fa/ Fable quota gateb59cf33. Active destinations are now Facebook/Instagram feeds; new feed approvals need no Story assets/attestation; legacy hashes/history retained. Future reserved dates use actual feed observations, freeing the old September 23 Story-only slot. Home exposes research supply separately from scheduled feed days, and the daily audit looks through seven future dates. - Canceled exactly eight queued legacy Story IDs, after checking each Postiz group contained only that Story. Supported DELETE API read-back showed deleted records, all eight Temporal workflows were TERMINATED, and every original feed record was unchanged. Backup/authorization evidence: private
~/.local/state/feed-only-buffer/cancelled-story-backup.json; local delivery statuses nowcancelled, so old retries cannot recreate them. Published Stories were not deleted. - Under the owner's current explicit instruction, approved the displayed refreshed WebUSB feed image/captions for September 23, with truthful actor
codex:owner-chat-instruction-2026-09-22and feed-only scope. Fresh provider observations confirm Facebookcmudgm5m0000jp27xxdynaz9eat 09:00 Eastern and Instagramcmudgm4v7000ip27xel0h7semat 18:00. September 24 BLE, September 25 sleep-current, September 26 capacitor feed pairs stayed unchanged. No repeat feeds were created for the historical September 22 Facebook gap. - Hourly user cron at :07 now runs bounded
content-buffer-fillinstead of the old 06:00 research command. Refill counts future paired feed dates plus distinct unused published/pending committed notes. Initial supply: four scheduled days, deficit three notes. Fresh capacity/model-window gates, one writer lock, max three notes/run, 45-minute run / 20-minute worker bounds, no automatic editorial approval. Research tools are only WebSearch/WebFetch; structured output is saved by the wrapper. 166 isolated backend checks plus nine phone/desktop browser checks passed; main pushed, both app health endpoints healthy. -
First live Sonnet research draft failed the newly added inline-source-link gate and was not committed/deployed/counted. The rejected DFM draft and full model result are retained privately under feed-only-buffer. Tightened explicit article-level citation and quantitative-claim instructions, added per-run handoff archives, and routed the next bounded research pass to Fable. Initial corrective refill is running; do not claim seven ready days until its actual result is checked.
-
2026-09-22 13:04 Eastern: Owner again observed a Story without its feed and requires both formats on both platforms daily. Fresh Postiz observation at 12:53 confirms USB-C Facebook Story published, Instagram feed/Story queued for 18:00, but no Facebook feed job: its older publication correctly triggered the duplicate guard. The existing 3-day daily audit still reports September 22 Facebook feed and September 23 both feeds missing; its exit 1 is attention for real gaps, not a runtime crash.
- Deployed assistant main
b0653d8/ sandboxf04a379: new approvals must cover all four destinations; partial packages are disabled and reserve no preview date. New approval policy blocks orphan Story creation after feed scheduling failure/uncertainty. Existing approved completion/retry paths remain compatible. Also preflight stale retry times before any sends, recheck exact approval under the transaction, and check publication evidence under the delivery-intent lock. Passed 158 isolated backend regressions and eight browser scenarios at 375/1440 px; both health endpoints healthy, production pushed, monitoring timers active. - Pending explicit recovery choice sent to owner: repeat approved USB-C Facebook feed September 22 at 18:00, and approved schematic Facebook/Instagram feeds September 23 at 09:00/18:00, versus fresh content. No answer yet; no provider scheduling/publication writes performed in this turn. Do not treat the question or elapsed time as approval, or silently move other approved jobs. Existing histories remain intact.
- Owner artwork preference: USB-C and “No schematic. Still a path forward.” are positive references; dim flat WebUSB art is rejected. Saved shared memory + mirror, assistant style brief and brighter dimensional SVG prompt. Built-in imagegen produced vivid teal/copper hardware raster replacements for WebUSB feed and Story; both visually inspected, installed under the artwork/approval DB lock, unreviewed manifest reset, old assets backed up at
artwork-backups/20260922T170250738645Z. New package hash7bd259d8604e9e96197d7b3fd8e7b93a8dd4fcc699f5344d5dccdeb287fbb445; no social approval. Review: https://home.embeddedera.com/home/content . The website note is now published (owner action since prior log), and the social package remains pending. Local template/SVG generation remains a draft route, not photorealistic raster generation. -
SOP-018 v5.9 documents complete daily packages and visual direction. External platforms may still fail independently; delivery monitoring and explicit recovery remain necessary.
-
2026-09-22 12:35 Eastern: After Angel restored Claude login, verified authenticated Max subscription, refreshed capacity (inactive five-hour 0%, weekly 2%), confirmed no competing research run or pending draft, and reran the existing research routine with a 20-minute bound. It completed at 12:28:14, creating
browser-based-firmware-flashing-without-an-installer(1cd9e8d). Primary review corrected stale Firefox/Android support, driver and permission claims, removed an unsupported customer statistic, and added primary source links (4699c62). Corrected preview deploymentac52d425succeeded; built HTML contains the corrected facts, while an unauthenticated HTTP check receives 403 from the protected preview. The note is pending at https://home.embeddedera.com/home/note/browser-based-firmware-flashing-without-an-installer and absent from production. No website or social approval was issued. - Found and fixed a handoff defect:
publish-note approvecherry-picked the creation commit and silently omitted later review edits. Assistant main31c61f5/ sandboxb111052now copies only the current committed note from a pinned revision, refusing unsaved draft edits, dirty production, non-main production and symlinks. Four isolated real-Git fixture tests passed, including edited-note promotion, unrelated-file exclusion, repeat approval, dirty-input refusal and dry run; shell syntax passed. Installed the verified script without invoking production publication. SOP-018 v5.8 documents it. - Research CLI reported
claude-sonnet-5andclaude-haiku-4-5-20251001, 399.6 seconds and $1.1710 list-price estimate (not a subscription charge). The legacy wrapper allowed an unrequested nested Agent call for word counting despite the shell already counting words; its tool inventory needs tightening before treating it as a scoped worker under SOP-025. Research output cited Mozilla's current announcement but still described Firefox as Nightly-only, so successful execution did not establish factual quality. Review corrections and isolated script tests were performed locally. -
Capacity:
claude-cli-usageobservation at 16:20:50 UTC reported inactive session 0% and weekly 2%; refresh at 16:33:46 UTC reported five-hour 5% (reset 21:20 UTC) and weekly 2% (reset September 28 17:00 UTC). Native readings may be cached and include other subscription activity; these are not a per-job usage attribution. -
2026-09-22 07:00 Eastern: Investigated the missing morning review note. The daily cron started at 06:00:02, passed the cadence gate, and exited at 06:00:07 because Claude reported
OAuth session expired and could not be refreshed. No new draft exists; the last successful research record is September 21's capacitor article. A same-turnclaude auth status --jsoncheck reportedloggedIn=false,authMethod=none. Reauthentication is required before rerunning~/.local/bin/weekly-research. The wrapper attempts an ntfy failure notice, but suppresses send errors, so notification delivery was not verified. No content or schedule was changed during diagnosis. -
2026-09-21: Fixed the capacitor package's repeated
schedule changed; reload and review the proposed timerejection. Root cause: the preview reserved only approvals matching each package's current hash, while final validation correctly reserved every approval in the ledger; an older-version USB-C approval already owned September 22.assistantmain0f13e8dnow derives preview occupancy directly from all ledger approvals. 118 isolated content tests passed. Production now proposed and validated September 26. Angel's prior button press authorized the exact reviewed package; recorded approval asadiaz@embeddedera.comand scheduled all four destinations successfully with remote IDs: Facebook feed/Story at 09:00 Eastern and Instagram feed/Story at 18:00 Eastern on 2026-09-26. Service remained healthy. -
2026-09-21: Fixed the first live Regenerate image failure for
ceramic-capacitor-long-lead-time-substitution. The model emitted harmless SVG comments, which the initial validator grouped with dangerous constructs.assistantmain3d71d75now strips comments while continuing to reject DTDs, entities, CDATA, processing instructions, scripts and external content, and retries one structurally invalid generation once. Visual review of the successful retry caught an electrolytic-style result, so main8c58299now supplies the note title as non-user generation context. Reran the saved description successfully; new feed and Story previews are present, hash-bound and unreviewed. No approval, delivery, publication or provider scheduling record was created. Two recoverable prior-artwork backups remain. Validation: 117 content tests and six 375/1440 browser scenarios passed under network isolation; final focused suite 67 passed. -
2026-09-21: Deployed description-driven Regenerate image on Content approvals (
assistantmain3ac6d26, sandbox9101928). Unapproved, unscheduled packages accept a 2,000-character illustration brief; a tool-free Sonnet turn produces validated SVG, reused by the existing branded feed/Story renderers. Persistent progress/errors, retained descriptions, old-artwork backups, hash checks, fresh Story review and approval/generation locking are covered. Already approved, scheduled, uncertain and published packages remain locked. The capacitor-substitution warning was verified as four missing local coverage records, with no approvals/deliveries/publication evidence; its previews already existed. Regeneration does not clear coverage or authorize posting. SOP-018 v5.6 owns the user procedure. - Verification: 115 focused Python tests passed under kernel IPv4/IPv6 socket denial and isolated provider configuration; 65 artwork tests rerun after final model options. Six browser scenarios (reject/error/success at 375/1440 px), 11 existing guidance assertions, existing guidance browser checks and real offline 1080x1080/1080x1920 rendering passed. Production health and mounted routes verified after restart; production/sandbox services active. No real model generation, scheduling, posting or edits to live package artwork were performed. AI response quality/availability awaits the first user regeneration.
-
Delegation: read-only Claude Haiku scout (
claude-haiku-4-5-20251001), CLI list-price estimate $0.352486, not a subscription charge. Implementation CLI requested--model sonnet, observedclaude-sonnet-5; process exited 143 after writing implementation and tests, with no final JSON/cost report. Primary reviewed and corrected safeguards/tests, independently ran validation and deployed only this commit, preserving unrelated sandbox work. Raw artifacts and screenshots:~/.local/state/social-regenerate/. Fresh pre-run Claude native observation: session 4%, shared week 84%; Codex week 93%, so no Codex worker used. Post-run native observation (2026-09-21 11:26 UTC): session 9%, shared week 84%, sourceclaude-cli-usage(may be cached). No credits redeemed or paid overflow enabled. SOP-018 v5.6 published successfully; both code worktrees and the vault were clean. -
2026-09-20: The 06:00 daily note did not run.
git pull -q --rebasein~/.local/bin/weekly-researchtried to replay the 18 commits that the localmain→apple-stylemerge of 2026-09-19 12:10 brought in (unpushed), conflicted insrc/pages/services.astroon the old99d8e67, and left the~/embeddedera-site-appleworktree stuck mid-rebase. It exited before any model call, and that exit path sent no ntfy, so the failure was silent. Fixed: rebase aborted, the merge fast-forward pushed (9f60320..eb2f060, only new content was the bilingual Shop entry), and the routine re-run at 08:03 →sleep-current-higher-than-datasheet(1498 words) on the dev preview, awaiting approval. Hardened: the sync step is nowgit pull --ff-onlyso a cron run can never wedge the worktree, and it alerts ntfy plus writesstatus=error-syncwhen it fails. Gotcha: never mergemainintoapple-stylelocally without pushing — prod and dev carry the same content under different SHAs, so a rebase replays the whole duplicated line. -
2026-09-18: Final follow-up
703def9preserves recorded timing in the portal after authorized image changes for fully occupied packages. New regression passed with all 23 approval tests; previous 40-test combined suite passed. Both branches pushed and both services healthy. -
2026-09-18: Follow-on deployment main
00c773dadds automatic read-only provider observations every 15 minutes, separate from the scheduling ledger and stale after 45 minutes. First complete report: 2 published / 15 scheduled. Authorized update refreshed 9 queued Story images in place with brand/title/CTA/destination; IDs and times retained, published Facebook Story untouched. Originals and before/after evidence retained underembeddedera-content/docs/story-refresh-2026-09-18-attempt2/. Package previews corrected, clean backgrounds kept for future renders. 40 tests and 375/1440 browser checks passed. SOP-018 v5.0; see embeddedera-workflows. -
2026-09-18: First EmbeddedEra content workflow deployed (
assistantmain6c04fc5, sandbox479b708). New approvals with remaining Stories require a SHA256-bound visual review of headline, brand, CTA and visible destination. Existing approvals/schedules preserved. Added standalone read-only Postiz audit separating local acceptance from provider publication, stale/unknown evidence and overdue queues; no automated retries or ledger writes. HTML/CSS draft renderer prepares separate Story artwork. 31 focused tests passed independently; 375/1440 px browser checks and both service health checks passed. Sonnet review findings corrected inbe7dea4; model/cost evidence and sample artwork live in embeddedera-workflows. SOP-018 v4.0 documents operation. Background reconciliation remains unimplemented. -
2026-09-17: Deployed
https://home.embeddedera.com/home/contentfromEmbeddedEra/assistantmain merge2f19279(sandbox implementation4c82dc6). Existing website approvals retained; compact Home link plus company social previews/approval. Five published notes prepared locally with feed images and separate vertical Stories; zero approvals/deliveries at rollout. Cadence JSON is shared with deterministic research guard. Tracked scripts inassistant/scripts/installed to~/.local/bin/; backups in~/.local/state/content-approvals/install-backup/. Production assistant drop-incontent.confenables Postiz scheduling only after explicit UI approval; sandbox remains disabled. SOP-018 v2.1 describes operating procedure and limitations. - Validation: 29 focused tests + 4 subtests, JS syntax, 375/1440px browser fixture checks (no errors/overflow), sandbox and production health, existing surfaces-check passed. Real Postiz scheduling/publication deliberately awaits package approval. Hub records submission status; inspect Postiz calendar for actual platform outcome. Follow-up: automatic remote delivery reconciliation and first approved end-to-end publishing cycle. Personal sharing remains deferred.
- Delegation: Codex gpt-5.6-sol implementation worker, reviewed by primary. Claude CLI Haiku audit was permission-blocked; returned usage included Sonnet despite requested Haiku, CLI list-price estimate $0.6975332 (not subscription charge/allowance). Worker-started Sonnet CLI was interrupted before changes; no reported cost. Do not infer credit consumption from these estimates.
Representative social artwork and duplicate guard — 2026-09-17¶
Deployed assistant main 26927fb (worker 3ea1763). Five current note packages now have
real generated engineering illustrations in feed and Story formats (ten images), saved under
/home/angel/embeddedera-content/<slug>/. Prompt manifest: docs/generated-illustrations-2026-09-18.json.
Verified live: pogo-pin Facebook and Instagram feeds, USB-C Facebook feed. Imported evidence
into production; these destinations are excluded from approval scheduling across artwork changes.
Postiz and Facebook scheduled queues were empty: no remote posts were deleted. Expired Story
history is unknown. Future packages block approval until both illustrations exist.
Focused independent tests: 15 passed. Browser: five cards at 375/1440 pixels, no JS errors or
overflow. All five production packages report artwork ready. Personal sharing remains deferred.
Instagram links — 2026-09-17¶
Postiz documents no Story link-sticker support. Approval UI now clearly warns Stories are media-only; tappable links require native Instagram creation before publishing. Future Instagram caption template uses a bio CTA; Facebook keeps the article URL. Two pending URL-based captions corrected; existing live posts untouched.
Feed reconciliation and timing — 2026-09-17¶
Fresh full Graph feed pagination: Facebook five records (two matched engineering notes),
Instagram two records (one matched note). USB-C is Facebook-only; pogo-pin is on both.
Other three prepared notes are on neither feed. Postiz queue empty. Sanitized snapshots:
/home/angel/embeddedera-content/docs/feed-audit-2026-09-18.json and queue counterpart.
Instagram online_followers insight returned empty data (15 followers); no account-specific
optimal hour is established. Recommended starting experiment: Facebook 09:00, Instagram
18:00 America/New_York, favor midweek for strongest notes; evaluate after four weeks.
Sources: https://buffer.com/resources/best-time-to-post-on-facebook/ and
https://buffer.com/resources/when-is-the-best-time-to-post-on-instagram/ .
Current scheduler still uses 06:00; these recommended destination-specific hours are not deployed.
USB-C Instagram completion requires package approval; no posts were sent during this audit.
Deployed duplicate/UI hardening main 93de714, worker 5bde8ba (gpt-5.6-sol; no cost reported). All-version scheduled/in-flight/uncertain delivery records also exclude destinations; zero-target approval is disabled. Feed mismatch is visible. Independent tests:17 passed; browser375/1440, five cards, no errors/overflow.
Approved platform timing and review reminder — 2026-09-18¶
Supersedes prior 06:00 timing limitation. Deployed main a985a6a, worker 2764b17
(gpt-5.6-sol, no cost reported). New approvals snapshot Facebook09:00 and Instagram18:00
America/New_York, including feeds and Stories. Shared interval/anchor retained; each
destination time is previewed, passed to Postiz, and preserved on retries. Past times block
sending; legacy approvals keep original times. No social posts approved or scheduled here.
Independent validation:24 focused tests; 375/1440 browser, no errors or overflow.
Review reminder: task264, Sales, assigned to Angel,
due2026-10-18. Existing active07:30 morning digest includes due-soon/due-today tasks; no
new recurring AI job or separate notification system. Review actual counts, reach, engagement,
saves, visits and inquiries, with sample-size limits; extend if too few posts were approved.
Recurring analytics review setup — 2026-09-18 (#218)¶
Task #264 now repeats monthly on closure, based on the previous due date; first due date October 18 and owner Angel are preserved. Read-back verified pending recurrence, close trigger, factor 1, months, due-date base, and active task with no successor yet. Installed Kanboard constants confirm these settings. An overdue review stays open, not silently replaced; completing it creates the next task. Existing kanboard-cron and tasks-digest timers are active. No new timer, AI job, publication or schedule change was introduced.
Decision: monthly rather than weekly performance review because approved-post history is sparse. Meta Business Suite Insights is the recommended first-party tool; Postiz remains the delivery-status tool. SOP-018 v5.2 owns the procedure, evidence checklist and limitations. Reminders are automatic; analytics collection is not. No future review was falsely closed to test recurrence, and account-specific metric availability remains unverified.
Facebook website links — 2026-09-19¶
Angel requires a clickable EmbeddedEra website URL in every Facebook feed post; Instagram keeps its bio CTA. Confirmed today’s 09:00 Eastern KiCad post inherited Instagram text because the legacy package lacked a Facebook caption. Corrected the existing Facebook post through Graph API and read back the exact message (post 254051434466101_122239248590282964). Corrected tomorrow’s microcontroller EOL queued Facebook job in place (cmu6fztai0009k07j3uvz8ctn), preserving ID/time/artwork/settings. Before/after evidence: embeddedera-content/docs/facebook-link-fix-2026-09-19/. SOP-018 v5.3 records the mandatory link rule. Media-only Stories still cannot carry clickable links through this publishing route.
Preventive fix deployed as assistant main 8c281ac (sandbox 8afa586): preview and scheduling share a validated Facebook website CTA; Instagram unchanged. Corrected seven prepared Facebook captions, with originals retained beside correction evidence. Existing queued jobs remain in place. Primary independently reproduced all 31 focused regression tests with network connections denied; sandbox health passed. Worker: Codex inherited model, no CLI-reported cost. SOP preview and production publication succeeded.
Missed Instagram release and scheduler recovery — 2026-09-19¶
The 18:00 KiCad autorouter Instagram feed and Story did not release because the 11:44 Docker
daemon restart restored Postiz's frontend/backend but its orchestrator stalled before registering
Temporal pollers. The prior container health check tested only the web process and remained green.
At 19:26 the orchestrator was restarted in place; the original feed and Story jobs published as
17948751063280005 and 18121590623482991, with no replacement jobs or duplicates. The current
feed URL is https://www.instagram.com/p/DdfMJfCkRXT/. The publication checker read both back as
published; tomorrow's existing Instagram jobs remain queued.
Prevention is deployed as assistant main 41fc058 / sandbox a8a2c4b and torrentvpn 9ecc505.
The five-minute postiz-scheduler-watchdog.timer checks the actual worker, gives startup a
three-minute grace period, restarts only the orchestrator after two failed probes, verifies recovery,
and sends ntfy on recovery or failure. Postiz container health now requires both web and scheduler
endpoints. Three isolated regression tests passed, the live healthy path made no restart, a controlled
Postiz recreation returned healthy with Temporal main/Instagram pollers, and the delivery report
confirmed both recovered publications. SOP-018 v5.4 owns the procedure.
Published-note coverage reconciliation — 2026-09-20¶
Reconciled all eight production notes against package files, the destination ledger, and fresh Postiz observations. Reverse engineering, BLE provisioning, and sleep current had packages but no protected schedule. Created and visually reviewed the missing BLE and sleep feed/Story art, then scheduled the three notes in publication order for September 23–25. Facebook feed/Story run at 09:00 Eastern; Instagram feed/Story run at 18:00 Eastern. Fresh provider observations show 19 queued and 10 published destination records, with no unknown/failed records and no duplicate slug/destination occupancy. The September 20 18:00 Instagram feed and Story remain queued.
Added content-schedule-audit.timer, an hourly read-only reconciliation of every production note,
social package, and the four duplicate-protected destination records. It alerts only when the issue
set changes and once on recovery. The first live run covered all eight notes with zero issues.
Automatic social review handoff — 2026-09-20¶
Website publication now triggers social image preparation asynchronously, and a persistent 18:30 Eastern timer catches anything missed after the last daily post. Missing branded feed and Story artwork is generated locally from the note package; a clickable ntfy notice opens Home Content approval. The reminder is limited to once per day for an unchanged pending set. The service is quiet when there is no work and never schedules or publishes.
Home now uses one explicit Review, approve and schedule confirmation. That press binds the publisher identity and timestamp to the exact displayed Story hash, approves both captions and images, and schedules only destinations still empty in the duplicate-protected ledger. Withholding approval leaves the package pending and causes the next day's reminder. First production run found zero pending packages and made no provider writes; the timer and publication trigger are active.
Empty daily feed slots and same-ID recovery — 2026-09-21¶
Today's pogo-pin Facebook and Instagram Stories published at 09:00/18:00 Eastern. No new feeds had been scheduled: verified pogo-pin feeds from September 16 correctly occupied both duplicate-protected destinations, but the whole package still reserved September 21. The coverage audit measured lifetime article coverage rather than per-day feed/Story coverage, so it reported no issue. September 22's USB-C package has the same Facebook feed gap.
Angel explicitly approved moving only the two already-approved reverse-engineering feeds
from September 23 to tonight. The Postiz public create/update API retained IDs
cmua6m6gg0002p27x0y6fht46 (Facebook) and cmua6m5tb0000p27x9xk0hrz8 (Instagram), retained
the exact captions/images/settings, and replaced their Temporal runs for 18:28 Eastern.
Both published: Facebook
and Instagram. Fresh 18:29 delivery observations
confirmed publication and that both September 23 Stories remained scheduled. No replacement
IDs were created; the immutable original approval remains in the ledger. Recovery evidence
is private at ~/.local/state/social-sep21-recovery.json.
Replacement content is still required for September 22 Facebook feed and September 23 both feeds. Do not fill these by duplicating previously published posts or moving more approved jobs without an explicit schedule decision.
Deployed assistant main ef18cf9 (sandbox 9ca5b4e): extended the existing audit with daily
destination coverage, fresh provider times, unknown/stale evidence handling, Eastern date and
DST rules, advance warnings and six-hour unresolved reminders. Home Content shows the daily
calendar, warns on partial approvals, omits skipped-target times, and reflects verified moved
job times while retaining original approvals. Already-covered packages no longer consume an
extra proposed slot. The audit runs at :02/:17/:32/:47 after the existing delivery fetch; no extra
provider polling or automatic posting/retry was added. SOP-018 v5.7 owns the procedure.
Validation: 149 isolated backend tests passed (148 regression tests plus the timing-plan parity test); IPv4/IPv6 denied by seccomp, provider credentials removed and CLI stubs active. Daily calendar checks and all six regeneration scenarios passed at 375/1440 px, with no overflow or JavaScript errors. Unit syntax passed, both app health endpoints are healthy, and the live audit at 18:37 showed today's four publications plus exactly the three upcoming missing feed slots. The notification state confirms a successful advance warning; audit exit 1 means attention required for these real gaps, not a failed read. Next audit timer was verified for 18:47.
Implementation worker: installed Claude CLI 2.1.278, explicit Sonnet alias resolved to
claude-sonnet-5; one worker at a time, Read/Edit/Write only, no tests or provider access.
CLI-reported list-price cost estimates were $1.7636 for the first result and $3.0538 for the
resumed result (not a subscription allowance measurement). Primary reviewed changes, corrected
legacy-approval display regressions, ran isolated tests and verified recovery/deployment.
Capacity source was claude-cli-usage: at 22:19 UTC it reported five-hour 0% and weekly 0%;
the post-work refresh at 22:38:47 UTC reported five-hour 5% and weekly 1%, resetting at
September 22 01:00 UTC and September 28 17:00 UTC respectively. The collector warns that
native CLI readings may be cached; these are observed percentages, not cost-derived estimates.
Android linked Stories — phased execution, 2026-09-21¶
Angel authorized local implementation with public release later. Plan and evidence now live in story-publisher. Local sandbox repository /home/angel/story-publisher contains a host doctor and tested offline ledger (12 tests). KVM works; limited available RAM blocks starting an emulator under the project headroom policy. Android app control and real clickable-link inspection remain unproven. Existing production posting and editorial approval remain unchanged.
-
2026-09-22 22:23: Primary source review corrected the first two Fable buffer notes on the protected draft branch (309f2a8). Removed unsafe generic flash footprint advice and unsourced market/turnaround claims; retained source-linked practical review steps. Second worker committed before an interrupted preview deployment; the final refill will deploy all pending notes together. Research prompt now supplies the established tag vocabulary and the wrapper rejects unsupported tags before writing (assistant main0dc675e; regression7ae2742). Five buffer plus four wrapper tests pass under kernel network denial. The third draft is running with corrected instructions.
-
2026-09-22 22:29: Refill complete: fresh buffer report status ready, research_ready_days7,scheduled_feed_days4,deficit0,run_cap0. Three drafts await owner approval: PCB assembly quote, SPI flash second sourcing, and Firmware recovery/rollback. Primary corrected the last draft's absolute title, unsupported ecosystem generalizations, version-specific guarantees and shop-process promises (9d9d6b6); the original slug is retained to preserve its sent review link. Source references checked against official KiCad/Ucamco/PCBWay/Linux/Zephyr/Espressif/MCUboot docs. Feed-image briefs remain ungenerated/unapproved. SOP-018v6.0 preview99ef28b0,productionc312a22d published; Access gate returns302, generated artifact verified. Hourly refill and delivery checks remain active; no new notes were published to the public site or scheduled without approval.
-
2026-09-22 22:31: Corrected three-note preview deployed as fbec55d9; remote article HTML independently contains the revised recovery title and copy. Source worktrees and Notes clean after commits. The Home review routes use existing Access; the Pages deployment URL served draft HTML directly from Plex, so do not assume the preview URL itself is access-restricted. Production website branch remains unchanged by this refill.
-
2026-09-23: Owner approved all three pending website notes; publish-note log confirms production publication at06:14–06:16Eastern. No corresponding feed approvals are yet recorded. Owner delegated future routine note/feed approvals to the assistant, superseding personal-tap requirements. Reviewed the assembly-quote feed artwork: still the plain dark circuit template, not the preferred vivid hardware style; do not approve it merely to clear the queue. Its stored Facebook caption also lacks an explicit https scheme, so ensure the actual outgoing caption carries the exact clickable article URL. Remaining feed packages need substantive artwork/caption review before approval and scheduling. No unattended approval worker was installed by this authorization update.
-
2026-09-23 06:49: Corrected daily workflow after owner clarified the intended sequence. Deployed assistant793881c (sandbox1e06abf): reviewed-source/date-bound note queue, held/re-reviewed edits and missed-date recovery history, one-claim release foundation, no blind retry/catch-up, shared date reservations, website-first guard for queued-note feeds, explicit full-package readiness unknown, research reserve counts only unpublished notes. Existing published notes/jobs unchanged. 160 isolated backend tests and four375/1440px browser scenarios pass; sandbox health good before production promotion. Actual automatic release remains disabled pending the documented five-stage executor and Story acceptance; no new timer installed.
-
2026-09-23 06:53: SOP-018v6.2 previewdacb1b4a and production23b04bee deployed; generated policy/queue/revision artifact checked. Production assistant healthOK, both source worktrees clean. Live website queue is empty; corrected reserve report0/7unpublished notes,deficit7,run_cap3,complete-package statusunverified. Started one bounded existing-controller refill; hourly:07 continues deficit-based drafting. No immediate article publication, Story submission or changes to approved Postiz dates occurred during this correction.
-
2026-09-23 06:53: Confirmed refill execution through transient user service
content-buffer-refill-manual-20260923(RuntimeMaxSec45m, cgroup cleanup, no new timer or boot enable). The detached shell launch had not persisted; it did not generate content. Existing controller flock prevents overlap with the hourly trigger. -
2026-09-23: Owner clarified fully hands-off operation: no routine queue checks or approval requests. Recorded the integration plan above and shared preference; the disabled daily-release gate remains unchanged until technical acceptance.
-
2026-09-23: Expanded autonomous implementation specification with an independent tool-free Fable design review. Defined consecutive-date buffer arithmetic, versioned Story handoff, artwork automation acceptance, uncertain-submit reconciliation and seven-run controlled acceptance. Plan: content-autonomy-implementation. No production schedule changed.
-
2026-09-27: Daily package now runs unattended (assistant PR #4, merge
413629a; owner: "fully automate this forever… another AI reviewing it"). Croncontent-daily-releaseevery 5 min 07:00–19:55 runsdaily_runtime --execute: website 07:00 → feeds scheduled 07:05 (FB 09:00 with article URL, IG 18:00) → Stories posted by nativestory-publish-dueand adopted by the engine with their real Story IDs (tracking window 90 min). Pages once per failed/uncertain attempt or window closed without an attempt; off switch~/.config/content-release.disabled.story-handoffmoved to 06:50 and now versioned in assistantscripts/. All five adapters accepted with evidence in~/.local/state/content-autonomy-build/capabilities.json(backup.pre-accept-20260927). Code reviewed by an independent Fable agent in two passes (3 blockers found and fixed; "safe to merge"). - 2026-09-27 failures found and fixed on the way: (1) Postiz had zero Temporal workers after the 25 Sep reboots — 26 Sep FB/IG posts never published while the watchdog stayed green; cause:
pm2 restart orchestratororphans the real node worker, which holds :3002. Watchdog now checks pollers on main/facebook/instagram and repairs withdocker restart postiz; 1-hour hold-off after a failed repair. Missed posts published 07:13. (2) Delivery check now pages once per overdue post. (3) A 23 Sep caption change (share line) silently invalidated every queued feed review;daily_preparenow re-reviews on caption/fingerprint drift. (4)instagram_biowas imported but missing; it now checks the notes index lists the article (SOP-018). Today's package was run by hand: note released 07:00, feeds approved asassistant:claude-opus-5-5:delegated-review. - 2026-09-27: OpenRouter image generation available.
openrouter-delegate(Angel's kit) installed user-space from~/tools/openrouter-delegateviauv tool install, pinnedmcp<2(kit breaks on mcp 2.x). Its installer was NOT run: it rewrites~/.claude/CLAUDE.md, which here is a symlink into the vault. Key:~/.config/openrouter/env+key(0600;~/.openrouter-delegate/keysymlinks to it); key credit limit $100, account credit $10, tool budget $2/day.imagealias =google/gemini-3.1-flash-image. First test (Altium/Eagle→KiCad, refs = the two preferred images) on-style, 1024², $0.068. No free image models on OpenRouter (checked live catalog, 458 models). Next: generate per-note feed/Story art indaily_preparewhen the library has no match, reviewed by the Fable reviewer before use. Open: add the key to Vaultwarden (owner). - 2026-09-27: OpenRouter artwork live in the daily pipeline (assistant PR #5, merge
1f803f4). On a library missdaily_assetsgenerates a 9:16 background (scripts/openrouter-image.pyunder the openrouter-delegate tool Python: cheap model writes the hardware subject from title + first 1500 chars;gemini-3.1-flash-imagerenders with the two preferred references,image_config.aspect_ratio 9:16, ~$0.07), composes feed/Story, and the Fable review still gates. Rejected art is regenerated with the reviewer's problems (≤3 attempts). Passing art is filed in the library withmin_score: 2. Spent budget = CapacityUnavailable (no attempt consumed). Independent Fable review: pass 1 found 2 high (tick crash on timeout; budget burning attempts) + 3 lower, all fixed; pass 2 "safe to merge". Residual (low):attempts()bumps before capacity errors; a failed library-art review cached before a budget stop can block a note until the draft changes. OpenRouter key credit limit $10/month (owner).