Pulling base updates
A licensee fork isn’t a one-time grab. Every time the base (ddakit/scene-studio) adds a new skill, fixes a hook, or updates track routing or license-policy levels in AI_AUTOMATION.md, that change has to reach the fork for the license value to hold. /update-from-base is the spot that lets you receive it safely without knowing git rebase.
Auto-applicable, never touched, decided by a human. The fork between these three is the heart of it.
Owner by area
Section titled “Owner by area”base-owned — auto-updated
Section titled “base-owned — auto-updated”| Path | What |
|---|---|
.claude/skills/{base-skill-name}/ | base skills (start, the two orchestrators, license-policy, pipeline-performance, etc.) |
.claude/agents/*.md | the 8 agents |
.claude/hooks/*.sh, .claude/settings.json | base hooks and their registration |
AI_AUTOMATION.md | the domain SSOT (track routing, scene type, license-policy levels, S1–S8) |
.env.example, .gitignore | placeholder and standard |
The rule is not to edit base skill bodies directly. To add your own skill, make it in a separate directory.
user-owned — never touched
Section titled “user-owned — never touched”| Path | What |
|---|---|
_workspace/{video_slug}/, _workspace/videos.json, _workspace/channel.json | every video in progress, the channel identity, the cache |
.env | OPENAI_API_KEY, REPLICATE_API_TOKEN, etc. |
.claude/agent-memory/, .claude/state/, .claude/session-state/ | memory, runtime, session handoff |
LICENSE, COMMERCIAL-LICENSE.md | license |
Every video in progress and the channel identity are user-owned, so updates don’t touch them. It’s the spot where video work doesn’t get wiped out even when the base updates.
mixed — 3-way guidance
Section titled “mixed — 3-way guidance”CLAUDE.md, AGENTS.md, README.md — three. Because edits from both the base and the user can land in them, they aren’t auto-updated; it shows the diff and asks. README.md is the spot /start rewrites with your channel’s name and identity, so overwriting it wholesale would erase your channel identity.
One cycle
Section titled “One cycle”Calling /update-from-base or “pull base updates” goes through the following.
- Check for dirty with
git status --porcelain. If there are unsaved changes, suggestgit stash git fetch base main- Classify changed files by area with
git diff --name-status <last_synced_commit>..base/main - Summarize the base-owned changes. N new skills, M updated hooks, whether
AI_AUTOMATION.mdchanged - On a user yes, apply only the base-owned paths
- Handle mixed files one at a time, choosing among three options (overwrite wholesale, 3-way merge, defer)
- Verify after applying and suggest a commit
For one-time setup, registering the base as a git remote is guided automatically by the first call.
git remote add base https://github.com/ddakit/scene-studio.gitThe state file goes in .claude/state/base-upstream.json, and it looks only at the changes from last_synced_commit to base/main.
When license-policy is updated
Section titled “When license-policy is updated”When the base updates the Fair Use bar or the number of transformation duties in license-policy, that change comes in as an auto-update spot. After receiving it, remix videos are verified with the updated policy. Copyright carries legal responsibility, so when the base tightens the policy, it’s safer to receive it.
When there’s a trace of you editing a base skill
Section titled “When there’s a trace of you editing a base skill”If you’ve ever modified a file under .claude/skills/{base-skill}/ in a commit (detected via git log), that file is treated as mixed rather than base-owned, because auto-overwriting would erase your work. To avoid this, don’t edit the base skill directly; make a separate skill with the same trigger keywords in your own directory.
Adjacent spot
Section titled “Adjacent spot”The same procedure followed at a beginner pace is in beginner updates.