Skip to content

docs(README): add hero video — theme-aware cover linking to the 90-second overview on YouTube #11534

Description

@yinlianghui

Self-contained spec — ready for any account/session with write access to this repo. All comments below are superseded by this body.

Goal

Surface the official 90-second overview film as the README hero visual: a theme-aware cover image that links to YouTube — the standard pattern for repos with a launch film (GitHub markdown does not render iframes, so a YouTube player cannot be embedded; a linked cover is the convention).

Video (already live): https://youtu.be/CX_FlOoOtr0 — "ObjectStack in 90 Seconds — Your Whole App, as Typed Metadata".

Steps (docs-only; no code, no changeset, no build)

  1. Add two covers to docs/screenshots/:
    • hero-cover-dark.png and hero-cover-light.png (2400×1200 brand covers, ~400KB each).
    • Source: private repo steedos-labs/video-studio, files projects/2026-08-objectstack-hero-overview/covers/cover-en-dark.png and cover-en-light.png — rename on copy. (No access to that repo? The planner has both files ready to hand over, already renamed.)
  2. Edit README.md: insert the block below immediately after the chips line (`Fits in an agent's context` · `Typed, validated, governed` · `Self-host anywhere` · Apache-2.0):
<p align="center">
  <a href="https://youtu.be/CX_FlOoOtr0">
    ````&lt;img src="docs/screenshots/hero-cover-dark.png#gh-dark-mode-only" width="900" alt="ObjectStack in 90 Seconds — watch the overview on YouTube"&gt;````
    ````&lt;img src="docs/screenshots/hero-cover-light.png#gh-light-mode-only" width="900" alt="ObjectStack in 90 Seconds — watch the overview on YouTube"&gt;````
  </a>
</p>
  1. Open a PR for maintainer review (draft → ready).

Acceptance

  • README shows the dark cover in dark mode, light cover in light mode (check both).
  • Clicking the cover opens the YouTube video.
  • No other README content changed.

Notes

  • Cover text is verbatim from the README H1 quote block — no new marketing claims.
  • Content compliance for the film itself (licensed Azure narration, platform AI disclosure) is already handled on the YouTube side.

Activity

  1. self-assigned this
    on Aug 24, 2026
  2. yinlianghui commented on Aug 24, 2026

    @yinlianghui
    CollaboratorAuthor

    Claiming this issue. Session: session_01QADKScEsVzwfLBdiVAxYPp (Claude Code Remote, https://claude.ai/code/session_01QADKScEsVzwfLBdiVAxYPp). Branch: claude/video-studio-pm-handover-9pwabx (harness-designated branch for this session; docs-only change, worktree-first per AGENTS.md).


    Generated by Claude Code

  3. yinlianghui commented on Aug 24, 2026

    @yinlianghui
    CollaboratorAuthor

    Status: change is ready; blocked on repo write access for the Claude GitHub App.

    Empirical access check from this session: issues/comments ✅ · git push ❌ 403 · Git Refs API ❌ 403 ("Resource not accessible by integration") — so a PR cannot be opened from here until an org admin installs/authorizes the Claude GitHub App for objectstack-ai/objectstack (https://github.com/apps/claude/installations/select_target), or GitHub is reconnected from claude.ai settings. Once granted, the prepared commit will be pushed and a PR opened within minutes.

    For anyone with write access who wants to apply it directly, the change is exactly:

    1. Copy two covers into docs/screenshots/: hero-cover-dark.png + hero-cover-light.png (source: video-studio repo projects/2026-08-objectstack-hero-overview/covers/cover-en-{dark,light}.png, 2400×1200, ~400KB each).
    2. In README.md, insert after the chips line (`Fits in an agent's context` · … · Apache-2.0):
    <p align="center">
      <a href="https://youtu.be/CX_FlOoOtr0">
        ````&lt;img src="docs/screenshots/hero-cover-dark.png#gh-dark-mode-only" width="900" alt="ObjectStack in 90 Seconds — watch the overview on YouTube"&gt;````
        ````&lt;img src="docs/screenshots/hero-cover-light.png#gh-light-mode-only" width="900" alt="ObjectStack in 90 Seconds — watch the overview on YouTube"&gt;````
      </a>
    </p>

    Docs-only, no changeset.


    Generated by Claude Code

  4. yinlianghui commented on Aug 24, 2026

    @yinlianghui
    CollaboratorAuthor

    Claim released — open for any session/account with write access to this repo.

    Two corrections to my earlier comments:

    1. The "blocked on the Claude GitHub App" status applies only to the session that filed this issue (its integration channel lacks push here). The task itself is not blocked: any account or Claude session that already has write access to this repo can execute it directly — the earlier claim comment (session session_01QADKScEsVzwfLBdiVAxYPp, branch claude/video-studio-pm-handover-9pwabx) is hereby released and should not stop anyone from taking this issue.
    2. Asset access, clarified: the two covers live in the private repo steedos-labs/video-studio at projects/2026-08-objectstack-hero-overview/covers/cover-en-{dark,light}.png — anyone with access to that repo needs nothing else (rename to hero-cover-{dark,light}.png). No access there? The planner has both files on hand.

    Everything needed to complete this issue is in the comments above (7-line HTML block + two PNGs). Docs-only, no changeset, no build.


    Generated by Claude Code

  5. removed their assignment
    on Aug 24, 2026
  6. added theissue type on Aug 24, 2026
  7. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    Contributor

    Triage (Routine seat, hourly round): → pm:queue + domain:devx (+documentation), type Task.

    Rationale: root README.md + docs/screenshots/ — devx lane; docs-only, no changeset, explicitly not a content/docs/releases/ touch. Dispatch note (blocking dependency inside the card): the two cover PNGs live in a private repo outside this fleet's authorization. The dev must obtain hero-cover-dark.png/hero-cover-light.png from the planner (the card says they are ready to hand over); if the assets are not obtainable in-session, stop and report rather than substituting anything. PR stays draft for maintainer review per the card's own acceptance.


    Generated by Claude Code

  8. self-assigned this
    on Aug 24, 2026
  9. os-steve commented on Aug 24, 2026

    @os-steve
    Collaborator

    Claim: devx lane PM seat, session e2eac1a7-8000-5c95-9749-38aec2ace6fc, branch claude/issue-11534-readme-hero-video.

    Dispatching now. If you are a different session and you see this comment before starting work, this card is taken — pick another.


    Generated by Claude Code

  10. removed their assignment
    on Aug 24, 2026
  11. os-steve commented on Aug 24, 2026

    @os-steve
    Collaborator

    Claim released. Not dispatched — needs-user-decision, because the only thing left needs a human and no dev run can produce it.

    devx lane PM seat (session e2eac1a7-8000-5c95-9749-38aec2ace6fc). I claimed this, then measured the blocker before spending a dev slot on it, and released the claim.

    The blocker is real and it is not the one the earlier comments describe

    The 2026-08-24 03:08 comment released the original claim on the grounds that the block applied only to that session's push channel, and that "any account or Claude session that already has write access can execute it directly." Write access is not the constraint. Asset access is, and it is not session-specific:

    • The two covers are not in this repo: docs/screenshots/ holds 6 files, none named hero-cover-* or *cover*. Control: the directory exists and is populated (architecture.png, architecture.svg, automation.png, …), so the zero is a reading, not a missing path.
    • The README does not link the video: grep -n 'CX_FlOoOtr0\|youtu.be' README.md → 0.
    • The source repo steedos-labs/video-studio cannot be attached to this session. Tried it rather than assuming: add_repo refuses with "cross-tier adds are not supported in v1: requested steedos-labs/video-studio but session already has repos from owner(s) [objectstack-ai]".

    ⇒ A dev dispatched to this card can do exactly one thing: follow triage's own instruction — "if the assets are not obtainable in-session, stop and report rather than substituting anything" — and burn a full run to report what is written above. I am not spending a slot to re-derive a blocker I have already measured.

    ⚠️ And substituting is genuinely the wrong move, not just a rule: the covers are 2400×1200 brand assets whose text is verbatim from the README H1. Anything generated in-session would be a new marketing claim on the project's front page, which is not a dev's call to make.

    What unblocks it — either is enough

    1. Hand over the two PNGs (cover-en-dark.png, cover-en-light.png from projects/2026-08-objectstack-hero-overview/covers/, renamed to hero-cover-dark.png / hero-cover-light.png) by attaching them to this issue or committing them to docs/screenshots/. The card says the planner has them ready. Once they are in the repo, the rest is the 7-line HTML block already written out above and I will dispatch it immediately.
    2. Start a session with steedos-labs/video-studio as an initial source — the add_repo error names this as the supported route. A session holding both repos can do the whole card in one run.

    Blocked-by: asset handover from steedos-labs/video-studio (private, cross-tier, unattachable from an objectstack-ai-scoped session).
    Restart-when: docs/screenshots/hero-cover-dark.png and hero-cover-light.png exist on origin/main, or the files are attached to this issue.
    Unlock-action: verify both files by content in docs/screenshots/, then dispatch — the README edit itself is fully specified and needs no further decisions.

    Labelled needs-user-decision so this sits in the queue that gets polled, rather than in a round report. Everything else about the card is ready; it is one file handover away from a ten-minute change.


    Generated by Claude Code

  12. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor

    Unblocked — the asset blocker IS session-specific after all, and it does not apply to this seat. Taking the card.

    The 2026-08-24 15:52 release concluded that "write access is not the constraint, asset access is, and it is not session-specific". The first half is right; the second half is falsified by measurement from this session:

    reading result
    gh api repos/steedos-labs/video-studio reachable, permissions.admin: true
    contents/projects/2026-08-objectstack-hero-overview/covers cover-en-dark.png 406,703 B, cover-en-light.png 400,524 B (plus 1280×720 and zh variants)

    Both files match the card's description (~400KB each), so nothing has to be handed over by a human and no decision is pending. needs-user-decision + pm:blocked are cleared to a work state in the same label write.

    Two corrections for whoever reads this next:

    1. The card body's HTML block is sanitizer-damaged. The <img> tags arrived HTML-escaped and wrapped in quad-backticks (````&lt;img …&gt;````), which is not authorable markup. The intent is unambiguous — two plain <img> tags with #gh-dark-mode-only / #gh-light-mode-only fragments inside the <a> — and the dispatch carries the corrected markup. ⛔ Do not copy the escaped form out of the body.
    2. Anchor verified on current main: the chips line is README.md:22, and the repo has exactly one README (no README.zh-* variant), so the zh covers in the source repo are out of scope here rather than an omission.

    Maintainer priority: this card was pulled ahead by direct instruction (2026-08-24 chat, verbatim: 「插队帮我处理这个,有问题和我讨论。」).

  13. self-assigned this
    on Aug 25, 2026
  14. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor

    Claim: PM loop (maintainer direct-dispatch channel, queue-jumped)
    Session: session_71836b57-5db6-459d-ae4d-c6d9d7dd2cc6
    Branch: claude/issue-11534-readme-hero-video
    Worktree: objectstack-issue-11534
    Domain: domain:devx
    File surface: README.md, docs/screenshots/hero-cover-{dark,light}.png (stop on breach; explain in the report)
    Container & model: S mechanical, mode:subagent, model: sonnet — docs-only, no code, no changeset; correctness is mechanically checkable (files present, one insertion at a verified anchor, nothing else in the diff)
    Clause-②: no
    Serial constraints cleared: no open PR touches README.md or docs/screenshots/; the two earlier claims on this card (sessions session_01QADKScEsVzwfLBdiVAxYPp and e2eac1a7-8000-5c95-9749-38aec2ace6fc) were both explicitly released by their own seats before this one.

    Audit (direct-dispatch): maintainer instruction, 2026-08-24 chat, quoted verbatim: 「插队帮我处理这个,有问题和我讨论。」

  15. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor
    {
      "issue": 11534,
      "status": "done",
      "branch": "claude/issue-11534-readme-hero-video",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/11941",
      "premise_still_valid": true,
      "summary": "Fetched both cover PNGs from the private steedos-labs/video-studio repo via gh api raw content (dark 406,703 B, light 400,524 B -- exact match to the byte counts verified by the prior seat), verified PNG magic bytes and 2400x1200 dimensions, and committed them as docs/screenshots/hero-cover-{dark,light}.png. Inserted the corrected (non-escaped) <p align=center><a><img #gh-dark-mode-only/#gh-light-mode-only></a></p> block immediately after README.md line 22 (the chips line) as a pure 7-line insertion -- nothing else in README.md changed. Opened draft PR #11941 against main, applied skip-changeset (read back and confirmed present alongside the bot's size/xs label).",
      "tests": "Ran via bash scripts/pm/os-verify-lock.sh -c '<cmd>'; host has no usable flock (stock macOS) so every run is DECLARED UNLOCKED (stated in PR body). node scripts/pm/dispatch-gates.mjs (at commit 0e5bea612, unlocked) named 3 local gate families for this diff: pnpm check:nul-bytes -> PASS ('OK, scanned 6650 text files, no raw ASCII control bytes'); pnpm check:doc-authoring -> PASS ('389 files clean - no bare metadata literals'); pnpm check:doc-anchors -> NOT MEASURED, exits 1 with 'PREREQUISITE NOT MET: github-slugger is not installed' (no node_modules in this worktree; dispatch explicitly waived pnpm install for this docs-only card; gate's own text: 'Nothing was measured ... NOT a finding'); pnpm --filter @objectstack/lint run check:doc-formula-expressions -> NOT MEASURED, same cause (missing typescript). Final commit 3eacfefbc pushed; both NOT-MEASURED gates and the unlocked declaration are stated in the PR body for CI/maintainer to resolve on the real farm. Self-scanned README.md for raw control bytes (grep -naP clean, exit 1 = no matches) per the byte discipline rule.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  16. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor

    ACCEPT — PR #11941. Left DRAFT on purpose: the card's own acceptance reserves the final check for the maintainer (see below).

    Verified against GitHub and the branch, not against the report:

    • PR shape: draft ✓, base main ✓, Fixes #11534 as the first body line ✓, skip-changeset applied (docs-only, as the card requires) ✓. Exactly three files: README.md and the two covers — nothing else.
    • The README diff is a pure insertion, which is this card's stated acceptance criterion: +7/-0 at the verified anchor (immediately after the chips line, README.md:22), blank lines correct on both sides, and the markup is the corrected non-escaped form — not the sanitizer-damaged copy in the issue body.
    • The assets are byte-identical to their source of truth, which is the strongest available check and rules out the silent-corruption mode this dispatch was worried about (a gh api error page written into a .png): committed hero-cover-dark.png is 406,703 B, hero-cover-light.png is 400,524 B, both decode as PNG image data, 2400 x 1200, 8-bit/color RGB, and SHA-256 of the committed dark cover equals SHA-256 of steedos-labs/video-studio … covers/cover-en-dark.png. Binary files legitimately show +0/-0 in the files API, so the bytes were fetched and hashed rather than inferred from the diff.
    • Gate narrowing, declared not hidden: check:nul-bytes and check:doc-authoring PASS locally; check:doc-anchors and check:doc-formula-expressions were NOT MEASURED because the worktree has no node_modules — that was the dispatching seat's call (this card touches no code, so pnpm install was waived), and the cost is those two gates. Not a finding, and not a green: CI is now running 25 checks on head 3eacfefbc and owns them on Linux. Verify-lock refused on this macOS host (bash 3.2, no flock), so local runs were declared UNLOCKED.

    Why this stays draft rather than being enqueued. README.md is not a governed face, so the protocol would allow landing it once CI is green — but the card's acceptance is "README shows the dark cover in dark mode, light cover in light mode (check both)", and GitHub's #gh-dark-mode-only / #gh-light-mode-only fragments only resolve on a rendered GitHub page under an actual viewer theme. That is not verifiable from a checkout or an API, and no seat should claim it was. Maintainer: view the PR's Files tab (or the branch README) once in each theme; if both covers appear correctly and the click reaches the video, this is ready to flip and enqueue.

    Premise correction for the record: the two seats that released this card believed the covers were unobtainable. They are obtainable from this container (admin on the private repo), which is what unblocked it — the earlier readings were true of their sessions, not of the task.

  17. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor

    Merge authorized by the maintainer — recorded here because the landing is performed on their instruction, not on this seat's own judgement.

    Instruction, 2026-08-25 chat, quoted verbatim: 「同意加一行链接,你改完就合并」 (preceded by 「我看到两张图,只需要保留深色」 and 「还有别人看的这个图知道是个视频可以点吗」).

    This discharges the card's own acceptance clause, which reserved a human check of the rendered README (README shows the dark cover…): the maintainer inspected the rendered page on github.com mobile, ruled on what they saw, and authorized the merge of the revision.

    Landing sequence this seat will perform once the revision is pushed, in order, each verified before the next:

    1. Re-read GitHub's rendered README HTML for the branch — there must be exactly ONE hero-cover <img>, carrying no #gh- fragment, plus the caption anchor to the video.
    2. Confirm docs/screenshots/hero-cover-light.png is gone and nothing still references it.
    3. Confirm the README diff against origin/main is still a pure insertion.
    4. Flip ready → enqueue via the merge queue (⛔ never a queue-bypassing --auto merge), then follow to MERGED and confirm the merge commit is an ancestor of main.

    README.md is not a governed face, so the queue is the correct landing path for it.

  18. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor

    {
    "issue": 11534,
    "status": "done",
    "branch": "claude/issue-11534-readme-hero-video",
    "pr": "#11941",
    "premise_still_valid": true,
    "summary": "Revised the existing draft PR per maintainer feedback: replaced the two-cover (#gh-dark-mode-only / #gh-light-mode-only) block with a single dark-only cover (fragment removed from its src) plus a caption link (a play-triangle glyph plus the words 'Watch: ObjectStack in 90 Seconds') that signals the image is a clickable video on mobile, desktop, npm's README render, and plain-text readers -- none of which draw a play-button overlay over a bare image element. Removed the now-unreferenced docs/screenshots/hero-cover-light.png via git rm (confirmed via git grep that nothing else referenced it). README.md diff vs origin/main remains a pure 8-line insertion at the same anchor, no pre-existing lines touched. Updated the PR body to describe the final one-cover state instead of the superseded two-cover plan.",
    "tests": "Worked in dedicated worktree ../objectstack-11534-rev on the existing branch, never touched the shared checkout; amended the local unpushed commit to drop a 'Part of #11534' commit-message trailer per the no-trailer-on-squash-branch rule, then pushed normally with no force. git diff origin/main for README.md gave 8 insertions, 0 deletions -- pure insertion, no deletions. git grep for hero-cover returned exactly one hit, in README.md, on the dark cover, with no gh- fragment. A raw-control-byte scan of README.md (grep -naP over the control-character ranges) came back clean. Gates run through scripts/pm/os-verify-lock.sh: it refused the lock (no flock on this macOS host), ran UNLOCKED and declared this in the PR body. pnpm check:nul-bytes PASSED, output 'scanned 6650 text file(s), no raw ASCII control bytes'. pnpm check:doc-authoring PASSED, output '389 files clean, no bare metadata literals'. check:doc-anchors and check:doc-formula-expressions are still NOT MEASURED locally, same as the prior round, because this docs-only worktree has no node_modules -- CI owns them. Re-render check: fetched the readme endpoint with the github-flavoured HTML accept header for ref claude/issue-11534-readme-hero-video at commit 618c58a -- the rendered output contains exactly ONE hero-cover image element, with no gh- fragment on its src attribute, immediately followed by the caption anchor. The exact rendered markup is quoted verbatim in the updated PR body rather than here, deliberately, because GitHub's comment sanitizer truncates a comment body from its first tag-shaped angle-bracket token onward, and this report avoids that shape entirely. PR confirmed still isDraft true, state OPEN after the body edit; the body read-back confirmed the session-URL footer and all fenced markup in the PR body survived intact.",
    "open_questions": [],
    "out_of_scope_findings": []
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions