# Ecosystem clusters (2026-10) — prime: who travels together
#>ecosystem_clusters_2026_10
#:cache #!clusters #!synergy #!information_architecture #!season
#:operation #!prime
#:fixity #!experimental
#:layer #!pragmatics

expression = cluster[skillset]{social.academic.professional}<synergy>

summary = #[
  `Six clusters of skills, each with a business shape and a door.`,
  `Four hand-offs make a loop; a year is about four turns.`,
  `Each horizon names what compounds and the signal to read.`,
  `Libraries, ecosystems and performance share one spine.`,
][reg=set]

contents = #[
  ~"./ecosystem-clusters-2026-10.spw#clusters",
  ~"./ecosystem-clusters-2026-10.spw#loop",
  ~"./ecosystem-clusters-2026-10.spw#horizons",
  ~"./ecosystem-clusters-2026-10.spw#information_architecture",
  ~"./ecosystem-clusters-2026-10.spw#spine",
][reg=set]

^"clusters"{
  ~#note: "Skills that already trade in pairs, and the shape each suits."
  ~#doors: "The site's three audiences are the doors (@product_lines)."
  studio = .{
    expression = cluster[studio]{illustration.painting.narration.acting.music}<label>
    who = `illustrators, painters, narrators, actors, musicians`
    shape = `a label: roster, development not employment, editions, credits`
    brings = `A&R and a release cadence; consent and usage as fields first`
    door = @folio_request
    feeds = ~"./ecosystem-clusters-2026-10.spw#press"
  }[reg=facet]
  press = .{
    expression = cluster[press]{catalog.review.curriculum}<kit>
    who = `librarians, teachers, school staff, counselors, homeschoolers`
    shape = `a curriculum press with a review board`
    brings = `the folios, and reviewers who have read them since 2024`
    door = @folio_soil
    feeds = ~"./ecosystem-clusters-2026-10.spw#lab"
  }[reg=facet]
  bench = .{
    expression = cluster[bench]{engineering.product.mentoring}<guild>
    who = `software engineers, product managers, career changers`
    shape = `a guild: apprenticeship, a QA desk, consulting`
    brings = `sixteen years of engineering and a codebase to teach from`
    door = @services
    feeds = ~"./ecosystem-clusters-2026-10.spw#studio"
  }[reg=facet]
  kitchen_garden = .{
    expression = cluster[kitchen_garden]{growing.cooking.fermenting}<season>
    who = `gardeners, cooks, fermenters`
    shape = `a seasonal kit, shaped like a farm-share subscription`
    brings = `the recipe pages; a later box needs the earlier box's leftover`
    door = @recipes
    feeds = ~"./ecosystem-clusters-2026-10.spw#press"
  }[reg=facet]
  desk = .{
    expression = cluster[desk]{vertical.brand.periodical}<desk>
    who = `people who own a vertical or a brand`
    shape = `a periodical first, then a desk: feedback, product, A&R`
    brings = `wap.mom as the slow-trust channel, the feedback card as intake`
    door = @wap_mom
    feeds = ~"./ecosystem-clusters-2026-10.spw#bench"
  }[reg=facet]
  lab = .{
    expression = cluster[lab]{learning_science.materials.andragogy}<receipt>
    who = `learning-science, education and materials researchers`
    shape = `a research practice that publishes its receipts`
    brings = `attention contours from screen to print to folio (@tangibility_contours)`
    door = @tangibility_contours
    feeds = ~"./ecosystem-clusters-2026-10.spw#bench"
  }[reg=facet]
  bridges = .{
    expression = cluster[bridge]{two.clusters.one.person}<broker>
    claim = `the most valuable members hold two clusters at once`
    example = `a librarian who draws; an engineer who gardens`
    reading = `the offer under every cluster is brokerage, so A&R, not agency`
  }[reg=facet]
}

^"loop"{
  ~#note: "One cluster's byproduct is another's input."
  ~#turns: "A hand-off takes about a season: more turns, not more members."
  studio_to_press = `cluster[studio]{art.scans} ^ cluster[press]{kits.curricula}`
  press_to_lab = `cluster[press]{learners} ^ cluster[lab]{studies}`
  lab_to_bench = `cluster[lab]{findings} ^ cluster[bench]{tools.methods}`
  bench_to_studio = `cluster[bench]{tools} ^ cluster[studio]{capture.release.feedback}`
  turns = `the four hand-offs above, once a season`
}

^"horizons"{
  ~#note: "Counted from 2026-10-27. Each horizon leans on one way (@ways)."
  ~#fixity: "The pairing of horizon and way is proposed, not settled."
  month_3 = .{
    expression = horizon[3mo]{cadence.offers.intake}<threshold>
    when = `late January 2027`
    compounds = `the season closes at the New Year; every cluster has shipped`
    build = `one priced offer per cluster, intake through the feedback card`
    signal = `who comes back after the New Year threshold`
    way = ~"./ways-2026-10.spw#keep_time"
    near = #[@season_rhythm, @offer_rhythm, @newyear][reg=set]
  }[reg=facet]
  month_6 = .{
    expression = horizon[6mo]{catalog.kit.pilot}<library>
    when = `late April 2027`
    compounds = `enough releases to cross-reference: the catalog becomes a library`
    build = `a Press kit from Studio work, a Lab trial using it, Bench cases`
    signal = `whether institutions ask; schools budget in spring for the fall`
    way = ~"./ways-2026-10.spw#gather"
    near = #[@folio_archive, @tangibility_contours][reg=set]
  }[reg=facet]
  month_9 = .{
    expression = horizon[9mo]{film.workshops.apprentices}<tentpole>
    when = `late July 2027`
    compounds = `the film as the centerpiece; the first apprentices teach`
    build = `backer and credit cards, summer workshops, apprentices up a rung`
    signal = `whether the guild holds without the host in every room`
    way = ~"./ways-2026-10.spw#give"
    near = #[@cards, @services][reg=set]
  }[reg=facet]
  month_12 = .{
    expression = horizon[12mo]{editions.renewals.back_catalog}<tradition>
    when = `late October 2027`
    compounds = `the second season starts, and the practice becomes a tradition`
    build = `annual editions, renewals, a year of receipts to price on`
    signal = `who returns year over year`
    way = ~"./ways-2026-10.spw#remember"
    near = #[@holidays, @production_seeds][reg=set]
  }[reg=facet]
  risks = #[
    `promising reach the team would have to manufacture`,
    `institutional sales cycles slower than the cadence`,
    `brokering friends' work for pay without written terms`,
    `structures that assume a fixed membership`,
  ][reg=set]
  $%[return.after_threshold, institution.ask, guild.without_host, return.year_over_year]
}

^"information_architecture"{
  media_library = .{
    expression = library[lrm]{work.expression.manifestation.item}<holding>
    levels = `IFLA LRM: a folio design, its scan, the print, the held copy`
    on_the_tree = `@folio_archive keeps source, release and series; item is missing`
    provenance = `who made it, who appears in it, consent and usage scope`
    facets = `Ranganathan's five facets may line up with Spw's slots; a probe`
    curation = `catalog (everything), shelves (curated), trails (one path)`
    addresses = `stable to the section; derivation links read as lineage`
    near = #[@folio_archive, @herbarium, @specimens][reg=set]
  }[reg=facet]
  software_ecosystem = .{
    expression = library[ecosystem]{kernel.adapter.extension}<peer>
    travels = `a written list of what may leave home (@peer_kit)`
    manifests = `capability files a host publishes (@feedback_manifest)`
    releases = `dated, pinned, carrying what built them (@parser_releases)`
    contracts = `sensors, and every output naming its reader`
    forks = `starter and fork paths, so the codebase teaches`
    near = #[@emit_names_its_reader, @ecosystem_architecture][reg=set]
  }[reg=facet]
  performance_runtime = .{
    expression = library[runtime]{budget.critical_path.attribution}<arrival>
    holds = `budgets, critical path, attribution, precompute or request time`
    receipt = `specimens read at carry time: a cold render 520 ms to about 2 ms`
    near = #[@bootstrap_performance, @core_css_spend, @carry_specimens][reg=set]
  }[reg=facet]
  performance_live = .{
    expression = library[stage]{cue.set.take}<show>
    holds = `run-of-show, cues, set lists, takes, rehearsal, capture`
    near = #[@season_rhythm, @daily_kernel][reg=set]
  }[reg=facet]
  rehearsal_is_precompute = .{
    expression = `library[runtime]{precompute} ~ library[stage]{rehearsal}`
    claim = `prepare before the audience arrives; budget what is improvised`
  }[reg=facet]
}

^"spine"{
  ~#note: "Four objects every cluster needs, built once and shared."
  record = .{
    expression = spine[record]{entry.provenance}<catalog>
    exists = @folio_archive
  }[reg=facet]
  release = .{
    expression = spine[release]{dated.versioned}<edition>
    exists = #[@parser_releases, @season_rhythm][reg=set]
  }[reg=facet]
  relay = .{
    expression = spine[relay]{card.seed.referral}<reader>
    exists = #[@feedback_worker, @folio_request, @cards][reg=set]
  }[reg=facet]
  receipt = .{
    expression = spine[receipt]{commit.still.sensor}<proof>
    exists = `episode commits, phone stills, the automated checks`
  }[reg=facet]
  pattern = .{
    expression = spine[shelf]{carry.read.shelve.search.compare}<corpus>
    claim = `the specimens shelf fits any corpus: folios, recipes, stills`
    exists = #[@carry_specimens, @specimens, @expression_query][reg=set]
  }[reg=facet]
}

#>wonder_ecosystem_clusters_label
?["Is label the word for the Studio cluster, or does the practice name itself first?"]{
  #:depth #!pragmatics ~#lens(projection)
  ~#with: @product_lines
  ~#taste: "The creator's call; brand comes from the work, not before it."
  ~#tension: "A&R reads as a label; the network reads as a loose practice."
  !probe{ "rg -n -i 'label|roster' services/index.html about/index.html" }
  $%[name.label, name.practice]
}

#>wonder_ecosystem_clusters_lead
?["Which cluster leads the public copy, if any does?"]{
  #:depth #!pragmatics ~#lens(comparison)
  ~#with: @product_lines
  ~#hypothesis: "None leads; every page keeps a door for every audience."
  ~#tension: "Offers need a reader to address; copy addresses intents."
  !probe{ "rg -n 'simultaneous_legibility' .spw/surfaces/product-lines.spw" }
  $%[lead.cluster, lead.none]
}

#>wonder_ecosystem_clusters_facets
?["Do Ranganathan's five facets line up with Spw's slots well enough to read the specimen search as a faceted catalog?"]{
  #:depth #!computational ~#lens(comparison)
  ~#with: @specimens
  ~#hypothesis: "Personality, matter, energy, space, time: subject, body, mark, scene, postfix."
  ~#tension: "Projection has no facet; it may be a destination, not a property."
  !probe{ "count the specimens that fill each slot, and ask a librarian to file the same lines by facet" }
  $%[facet.subject, facet.body, facet.mark, facet.scene, facet.postfix]
}

#>wonder_ecosystem_clusters_public
?["Does any of this timeline become public, and where?"]{
  #:depth #!pragmatics ~#lens(projection)
  ~#with: @production_seeds
  ~#taste: "The creator's call; seasons stay out of public copy unless asked."
  !probe{ "rg -n 'production-seeds' about/plans/index.html" }
  $%[public.none, public.plans, public.now]
}

validation = #[
  `npm run spw:integrity  # every citation in this file resolves`,
  `npm run wonder  # the four wonders above are harvested`,
][reg=set]
do_not_promote_until = "The label and lead wonders are answered, and one signal is read."

^"stream"{
 >>[2026-10-27 10:30] cache — Written from the morning's conversation: six clusters, the loop, four horizons with one way each, libraries, ecosystems and performance, and a four-object spine. Four wonders hand back the taste calls.
 >>[2026-10-27 11:06] align — Reordered to read first-screen first: expression, summary and contents lead, substance follows, and the handles sit last, grouped by role. Anchors are unchanged. Citations stay relative: the extension installed on 2026-10-13 cannot follow root-relative ones yet.
}

# About this file
operation = "prime"
fixity = "experimental"
keeps = "No private figures, counts or names. Group copy assumes members come and go."
source = "creator, 2026-10-27: business shapes for clusters of social, academic and professional skills; synergies at 3, 6, 9 and 12 months; information architecture for media libraries, software ecosystems and performance"

# Handles, by role. Declared last; each one links wherever the text names it.
# Neighbors in caches/
@folio_soil: ~"./folio-soil-ecosystem-2026-09.spw"
@feedback_product: ~"./feedback-product-2026-09.spw"
@offer_rhythm: ~"./offer-rhythm-2026-10.spw#offer_rhythm_2026_10"
@tangibility_contours: ~"./tangibility-contours-2026-10.spw#tangibility_contours_2026_10"
@ways: ~"./ways-2026-10.spw#ways_2026_10"
@holidays: ~"./holiday-infrastructure-2026-09.spw"
@caches_index: ~"./index.spw"
# Surfaces and conventions
@product_lines: ~"../../.spw/surfaces/product-lines.spw#audience_register"
@folio_archive: ~"../../.spw/surfaces/folio-archive.spw#folio_archive"
@season_rhythm: ~"../../.spw/slices/production-season-rhythm/index.spw"
@daily_kernel: ~"../../.spw/conventions/daily-kernel.spw"
@herbarium: ~"../../.spw/language/expressions/index.spw"
@emit_names_its_reader: ~"../../.spw/reviews/upstream-workbench-recommendations/plugins-and-tooling.spw#emit_names_its_reader"
# Plans
@ecosystem_architecture: ~"../../.agents/plans/ecosystem-architecture/PLAN.md"
@spw_quest: ~"../../.agents/plans/spw-quest/PLAN.md"
@bootstrap_performance: ~"../../.agents/plans/runtime-bootstrap-performance/PLAN.md"
@core_css_spend: ~"../../.agents/plans/core-css-spend-cut/PLAN.md"
# Code and workers
@expression_query: ~"../../public/js/semantic/expression-query.js"
@specimens: ~"../../workers/spw-quest/src/specimens.js"
@carry_specimens: ~"../../workers/spw-quest/carry-specimens.mjs"
@parser_releases: ~"../../workers/spw-quest/src/parser-releases.js"
@peer_kit: ~"../../scripts/build-peer-kit.mjs"
@feedback_worker: ~"../../workers/autonomous-feedback/src/index.js"
@feedback_manifest: ~"../../.well-known/autonomous-feedback.json"
@wap_mom: ~"../../workers/wap-mom/src/index.js"
# Pages
@folio_request: ~"../../design/folios/index.html#folio-request"
@production_seeds: ~"../../about/plans/index.html#production-seeds"
@services: ~"../../services/index.html"
@recipes: ~"../../recipes/index.html"
@cards: ~"../../cards/index.html"
@newyear: ~"../../newyear/index.html"
