The franchise file

A franchise is the films and series of one story, in the order the story plays. A set is smaller: the chain of sequels a film’s sidecar names, in release order. A franchise is the long storyline those chains sit inside, with the series that run between the films and the prequels that play first. No metadata provider holds that order. TMDB collections hold films only, in release order, and no source agrees on where a series sits between two films. So a person or an agent writes the order into a file, and the file is the truth.

A Library of kind franchises names a claim under spec.storage.claim that holds the checkout, one directory per franchise, and a second claim under spec.franchises.art.claim that the scan writes the art into. Each directory holds franchise.yaml and an AGENTS.md that says how the author built the order. The repository holds no image: an art block in the file links to the art. The scanner reads the YAML file and ignores the rest. An agent that edits the directory reads AGENTS.md first, as its context for the work.

Every scan walks the whole checkout, because the files are a few hundred kilobytes on a mounted claim. Before it reads the rows, it downloads the art the files link to into the art claim, so a row draws the file it just wrote. A link the last scan already read is not read again. A file the scan did not write is the owner’s, and it is kept. A link that fails is logged and asked again on the next scan, and it never fails the walk. spec.refresh sets the period, as it does for the other kinds.

How the checkout arrives on the claim is the cluster owner’s choice, and any volume that holds one directory per franchise serves. The git CSI driver serves a repository as a read-only claim that follows its ref, and its read-only guide shows the PersistentVolume and claim.

The first files live at tangled.org/guid.foo/fiction-franchises. A fork is a second Library over another checkout, and two libraries that both define one franchise are two rows on the screen.

The file validates against franchise.schema.json. Put this line at the top of the file, and an editor with YAML support checks it as you type:

# yaml-language-server: $schema=https://library.liken.sh/franchise.schema.json

The parts

name: Star Wars

sources:
  - https://www.starwars.com/news/star-wars-movies-and-series-guide

calendar:
  unit: years
  zero: the Battle of Yavin
  before: BBY
  after: ABY

universe: Prime

eras:
  - name: Age of Rebellion
    from: -5
    to: 4

order:
  - movie: tmdb:1893
    title: "Star Wars: Episode I - The Phantom Menace"
    released: 1999-05-19
    time: { from: -32, to: -32 }
  - series: tvdb:83268
    title: "Star Wars: The Clone Wars"
    released: 2008-10-03
    seasons:
      - season: 1
        time: { from: -22, to: -22 }
      - season: 3
        episodes: [S03E01, S03E03-S03E22]
        note: Lucasfilm's order plays S03E02 before S02E16.

name and order are required. Everything else is optional.

Part What it is
name The name the page shows.
sources The pages the author read for the order and the times. The next author reads them first.
calendar The franchise’s own clock. Without it, the file holds an order and the page draws only the wall.
universe The franchise’s own home universe, one name. An entry that names no universes is in this one.
eras Named stretches of the timeline, each with a span. Needs a calendar. Spans may overlap.
order The story order, first to last.
art Links to the franchise’s own art, under Kodi’s names: poster, fanart, landscape, logo, and banner, each optional and each an https URL. The scan downloads each one into the art claim under the name the same art kind takes for a film, and a file already there wins over the link. The poster is what the screen draws first.

Entries

An entry is one film or one series. A film is movie with a provider id. A series is series with a provider id and, when only part of it plays here, a seasons list.

A provider id is scheme:id. Films use tmdb and series use tvdb, because those are the ids the movies and series libraries write into the catalog. Another scheme is legal and resolves only if some sidecar carries it.

A series with no seasons means the whole show. A season with no episodes means the whole season, in aired order. An episodes list holds codes like S03E01 or ranges like S03E03-S03E22, in the order they play. Specials are season 0. The same show may appear again further down for the seasons that play after a film, and the same season may appear again inside one show when the story order cuts it into runs.

An episode code names the provider’s numbering, and the provider does not always number a season the way it aired. TheTVDB numbers Firefly in aired order, so its pilot is S01E11, and a file that plays the pilot first lists S01E11 first. A library whose sidecars came from a provider with a different numbering needs a different list, so a franchise file names one provider’s codes and the directory’s AGENTS.md says which.

The scanner writes one member row per entry of the order, counted from 1. A series with seasons is one member row, with one run row per season or episode it names. A season with no episodes is one run row for the whole season, and a range such as S03E03-S03E22 expands to one run row per episode. A series with no seasons is one member row and no runs, and the page counts every episode the catalog holds today, so a show that is still airing fills in with no edit to the file.

A film or a series entry may carry these:

Field What it is
title The name the page draws when no library holds the member. It carries no year.
released The real-world date as an ISO 8601 string, as much of it as is known: 1999, 1999-05, or 1999-05-19. On a film it is the first public release, and on a series the day the first episode aired. It is never the story’s calendar, which time carries. A file that still names release_year is refused, the way any key the schema does not name is refused.
universes Every universe whose story this entry continues or joins, when that is more than the franchise’s own. Several names mean the entry belongs to all of them at once.
time The span of the entry, as { from, to }. Needs a calendar.
note Free text for the next author. It never reaches the page.

A season may carry time and note alone.

universes follows the story, not the camera. Spider-Man: No Way Home never leaves the main universe, and it names three, because it brings two other Spider-Man stories into the main one. An entry that names no universes is in the franchise’s own universe. An entry that names one other universe belongs to that one.

Times

A calendar needs a unit, either years or days. Without zero, before, and after, the times are plain calendar years, which is what the Marvel films count in. With zero, the times count from the named event, as Star Wars counts from the Battle of Yavin, and the page prints the zero once as the caption of the time column: “Years from the Battle of Yavin”. before and after are short marks of at most six characters, printed after the magnitude of a time, so -233 with before: BBY reads “233 BBY”. Leave them out where the franchise has no short marks: a days calendar without them reads “Day 1141”, and a years calendar without them keeps the minus sign on the times before the zero.

A time is from and to in the calendar’s unit, and they are equal for a story that stays in one year. A time on a show covers every season under it, and a time on a season overrides it. A flashback inside one film does not widen its span; the span is the film’s main setting. An entry with no time draws in its row and joins no era on the rail.

Members no library holds

A member need not be in any library. The page draws it as a gap with its title, and the gap fills when the title arrives in any library of the namespace. A gap whose released date is after today draws as coming, and any other gap draws as missing, so the wall is also the list of what to go find.

Authors

The first files are written from research. Later, an agent writes the same file on a schedule and pushes it to the repository. Both follow one rule: never remove a member. Add and reorder, so a bad edit leaves a wrong order and never a lost film.

Verify every provider id by fetching its page and reading the title. Provider slugs mislead, so an id from memory is the one error that survives every other check. Write the pages you used into sources, and write the judgment calls into the directory’s AGENTS.md.