Docs/Skills and code/Top-level code

config-old.js

Code173 lines7.5 KBTop-level code

import path from "node:path";

const root = process.cwd();

export const config = {
  projectName: "YouTube Ecosystem Intelligence",
  dbPath: path.join(root, "data", "ecosystem.db"),
  seedPath: path.join(root, "seeds", "topics.json"),
  discoverySeedPath: path.join(root, "seeds", "discovery-v2.json"),

  youtube: { resultsPerSearch: 30 },
  viewer: { port: 3000 },

  // Change this section when researching a different ecosystem.
  ecosystem: {
    name: "art",
    description: "The ecosystem of visual art, art history, artworks, artists, movements, criticism, and collections.",
    includeTerms: [
      "art history", "visual art", "fine art", "painting", "paintings",
      "sculpture", "sculptures", "artist", "artists", "art historian",
      "museum", "renaissance", "impressionism", "expressionism",
      "modern art", "contemporary art", "art criticism", "art movement",
      "art movements"
    ],
    excludeTerms: [
      "piano", "pianist", "music", "musician", "songs", "song",
      "soundtrack", "karaoke", "cover songs", "lofi", "lo-fi",
      "relaxing music", "sleep music", "meditation music", "gaming"
    ],
    adjacentTerms: [
      "architecture history", "cinema and visual storytelling",
      "mythology and visual culture", "design history", "cultural history",
      "photography history", "fashion history"
    ],
    // Optional manual references. These are review anchors, not required discovery inputs.
    referenceChannels: [
      { "handle": "GreatArtExplained", "name": "Great Art Explained" },
      { "handle": "VanGoghMuseum", "name": "Van Gogh Museum" },
      { "handle": "HorsesOnYT", "name": "HorsesOnYT" },
      { "handle": "PerspectiveArts", "name": "Perspective Arts" },
      { "handle": "mfaboston", "name": "Museum of Fine Arts, Boston" },
      { "handle": "Erinnerart", "name": "Erinnerart" },
      { "handle": "inspiraggio", "name": "Inspiraggio" },
      { "handle": "christianart", "name": "Christian Art" },
      { "handle": "freeschool", "name": "Free School" },
      { "handle": "CuriousMuse", "name": "Curious Muse" },
      { "handle": "EnglishAvenuee", "name": "English Avenuee" },
      { "handle": "ArtHistorySchool", "name": "Art History School" },
      { "handle": "professorgraemeyorston", "name": "Professor Graeme Yorston" },
      { "handle": "royalacademy", "name": "Royal Academy of Arts" },
      { "handle": "arti-facts-4u", "name": "Arti-facts" },
      { "handle": "yaleartgallery", "name": "Yale University Art Gallery" },
      { "handle": "LearnFromMasters", "name": "LearnFromMasters" },
      { "handle": "Shawn.Grenier", "name": "Shawn Grenier" },
      { "handle": "TheGaze", "name": "The Gaze" },
      { "handle": "ruzhili", "name": "Ruzhili" },
      { "handle": "ArtHistoryOnline", "name": "Art History Online" }
    ],
    discovery: {
      topicSeeds: [
        "art history explained", "painting analysis", "how to look at art",
        "art restoration explained", "iconography in painting",
        "history of sculpture", "women artists art history",
        "art patronage and politics", "museum stories",
        "religious art symbolism", "modern art movements",
        "art forgery and attribution"
      ],
      adjacentSeeds: [
        { label: "architecture history", query: "architecture history explained visual culture" },
        { label: "cinema and visual storytelling", query: "film visual storytelling composition history" },
        { label: "mythology and visual culture", query: "mythology symbolism in painting visual culture" },
        { label: "design history", query: "design history visual culture explained" },
        { label: "cultural history", query: "cultural history objects images visual culture" },
        { label: "photography history", query: "photography history visual analysis explained" },
        { label: "fashion history", query: "fashion history art visual culture explained" }
      ]
    }
  },

  qualification: {
    promptVersion: "ecosystem-qualification-v2.0",
    minimumConfidenceToQualify: 0.58,
    llm: {
      batchSize: 8,
      maxVideoTitles: 14,
      descriptionChars: 1600,
      retryMissingIndividually: true
    },
    classification: {
      labels: ["core", "adjacent", "unknown", "irrelevant"],
      core: {
        definition: "The target ecosystem is the channel's primary editorial subject, supported by recurring content.",
        includeWhen: [
          "Most or a clear plurality of recurring content directly concerns the configured ecosystem.",
          "The channel has a recognizable ecosystem-focused editorial identity, even if it also covers related subjects.",
          "Channel description and multiple representative video titles support the classification."
        ],
        doNotInferFrom: [
          "A single mention of a target term",
          "A channel name or keyword match without supporting video evidence",
          "Generic content in a neighbouring field without recurring target-ecosystem material"
        ]
      },
      adjacent: {
        definition: "The target ecosystem is a meaningful recurring component, or the channel offers directly transferable knowledge, but is not clearly the primary subject.",
        includeWhen: [
          "A broader subject regularly overlaps with the configured ecosystem.",
          "A wider educational or cultural channel has recurring substantial coverage of the ecosystem.",
          "A source has useful expertise or resources relevant to the ecosystem without being a focused creator."
        ],
        doNotInferFrom: [
          "A generic channel with no concrete evidence of overlap",
          "A one-off target-related upload in an otherwise unrelated channel"
        ]
      },
      unknown: {
        definition: "Available evidence is insufficient, contradictory, sparse, or too ambiguous for a defensible classification.",
        includeWhen: [
          "Description is missing or generic and titles do not establish recurring subject matter.",
          "Evidence is mixed or too sparse to distinguish target focus from another subject.",
          "Only a small or biased sample is available."
        ]
      },
      irrelevant: {
        definition: "The evidenced primary subject is outside the configured ecosystem and there is no meaningful recurring overlap.",
        includeWhen: [
          "Channel description and representative titles clearly point to another subject.",
          "Target-related words are incidental or have an unrelated meaning."
        ]
      }
    }
  },

  queueScoring: {
    version: "channel-queues-v6-configured-ecosystem",
    minimumCoverageForSupported: 70,
    breakout: {
      minVideosForScore: 5,
      fullSampleConfidenceVideos: 20,
      smallChannelSubscriberPrior: 1000,
      minimumAgeDaysForAgeAdjustedViews: 30
    },
    ranking: {
      coreBeforeAdjacent: true,
      minimumQualificationConfidence: 0.58,
      minimumConfidenceForSupported: 0.75,
      unknownChannelsRequireQualification: true,
      missingEvidenceIsNull: true
    }
  },

  discovery: {
    resultsPerQuery: 25,
    delayMs: 350,
    maxHypothesesPerRoute: 4,
    routes: {
      A: { label: "channel-led", maxQueries: 6 },
      B: { label: "video-led", maxQueries: 6 },
      C: { label: "topic-led", maxQueries: 8 },
      D: { label: "adjacent-ecosystem", maxQueries: 7 }
    },
    llm: { enabledByDefault: false, batchSize: 1 }
  },

  stage1_5: {
    popularVideos: 20,
    newestVideos: 20,
    maxChannelPages: 5,
    youtubeCachePath: path.join(root, "data", "youtube-cache"),
    requestDelayMs: 250
  }
};

Shown as it is in the repository at build time (2026-11-03); the home directory appears as <home>. If this page and the file differ, the file is right. Back to the catalogue.