Generated banner for business-context-os
Generated logo for business-context-os

business-context-os

LLM wiki kit

First committed by walm00

Published in walm00/business-context-os. Publisher page

22 GitHub stars

What it is

CLEAR Context OS is the maintenance layer your second brain never had: ownership boundaries enforced mechanically, staleness surfaced on a schedule, drift propagated across linked docs, a dispatcher that learns from your clicks. One source of truth per topic. Searchable. Task-aware.
— the description by walm00

AutoGineer overview, from the brain’s own files

CLEAR Context OS is a framework designed to solve the problem of silent context degradation in AI agents. By implementing a structured methodology called CLEAR (Contextual Ownership, Linking, Elimination, Alignment, Refinement), it provides a maintenance layer that manages knowledge through automated scheduling, ownership enforcement, and drift detection. It organizes information into specific zones—such as canonical data, wiki-based derivatives, and verbatim evidence—ensuring that agents always operate on the most accurate, source-of-truth-ranked information. The system includes a dispatcher for scheduled maintenance, a local dashboard for monitoring, and integration with Claude Code to facilitate onboarding and task-aware context retrieval.

How it works

Memory model: LLM wiki

AutoGineer overview, from the brain’s own files

The system organizes information into a folder hierarchy where the path itself acts as a trust signal for the LLM. It uses a dispatcher to run scheduled maintenance jobs that check for staleness, propagate updates across linked documents, and audit content health. New information is ingested through a routing process that places content into specific zones: canonical data for facts, wiki pages for operational knowledge, and collections for legal evidence. The system learns from user interactions to suggest fixes and uses frontmatter metadata to allow agents to filter and retrieve information efficiently without full-text scanning.

Folders
FolderRoleFiles
.claudeagent-config193
.githubagent-config6
docsdocs68

The agent reads

The agent writes

Requirements

Works with: Claude Code, OpenCode

Set it up

  1. This brain runs code automatically: 5 hooks (claude-code), 1 script. Review .claude/settings.json, install.sh before opening the folder in Claude Code. No step below turns a hook on for you.

    • .claude/settings.json: bash "$CLAUDE_PROJECT_DIR/.claude/hooks/auto_save_session.sh"
    • .claude/settings.json: bash "$CLAUDE_PROJECT_DIR/.claude/hooks/precompact_save.sh"
    • .claude/settings.json: "$CLAUDE_PROJECT_DIR/.claude/bin/python3" "$CLAUDE_PROJECT_DIR/.claude/hooks/post_edit_frontmatter_check.py"
    • .claude/settings.json: "$CLAUDE_PROJECT_DIR/.claude/bin/python3" "$CLAUDE_PROJECT_DIR/.claude/hooks/post_edit_frontmatter_check.py"
    • .claude/settings.json: "$CLAUDE_PROJECT_DIR/.claude/bin/python3" "$CLAUDE_PROJECT_DIR/.claude/hooks/post_commit_context_check.py"
    • install.sh: sh install.sh
  2. Clone the repository at the commit AutoGineer scanned:

    git clone https://github.com/walm00/business-context-os.git && cd business-context-os && git checkout 463568372f31f24fa6c01121c38f989845ca7c84
  3. Claude Code reads CLAUDE.md from this folder automatically.

  4. cd business-context-os && claude

  5. AutoGineer scanned these files at commit 4635683.

  6. First committed by walm00. Published in walm00/business-context-os. Licence: MIT License.

Usage

AutoGineer overview, from the brain’s own files

  • Automating the maintenance of project documentation and SOPs.
  • Providing AI agents with a reliable, freshness-aware knowledge base.
  • Managing ownership boundaries across large, multi-topic documentation sets.
  • Syncing and auditing context across linked documents to prevent drift.
  • Generating daily digests of system health and pending maintenance tasks.
“Install BCOS from https://github.com/walm00/business-context-os and walk me through onboarding.”
Claude clones the repository, sets up the environment, and guides the user through an interactive onboarding process to configure the context architecture.
“/context bundle market-report:write”
The agent retrieves a curated, freshness-aware package of context specifically relevant to writing a market report.
“Run the audit twice a week.”
The dispatcher updates the maintenance schedule to perform an audit of the knowledge base on a bi-weekly cadence.
“/wiki run https://stripe.com/docs/api”
The system fetches the URL, summarizes the content, and creates a cited wiki entry within the knowledge base.

Documentation by walm00

<p align="center"> <h1 align="center">CLEAR Context OS</h1> <p align="center"> <strong>Knowledge that maintains itself —</strong><br> so your AI doesn't act on what was true last month. </p> <p align="center"> <a href="#install">Install</a> &nbsp;·&nbsp; <a href="#what-it-does">What it does</a> &nbsp;·&nbsp; <a href="#the-wiki-zone">Wiki zone</a> &nbsp;·&nbsp; <a href="#what-ships">What ships</a> &nbsp;·&nbsp; <a href="docs/_bcos-framework/guides/getting-started.md">Getting Started</a> </p> <p align="center"> <img src="https://img.shields.io/badge/claude_code-ready-blueviolet" alt="Claude Code"> <img src="https://img.shields.io/badge/methodology-CLEAR-green" alt="CLEAR Methodology"> <img src="https://img.shields.io/badge/install-one_command-success" alt="One-command install"> <img src="https://img.shields.io/badge/skills-17-blue" alt="17 skills"> <img src="https://img.shields.io/badge/maintenance_jobs-12-orange" alt="12 maintenance jobs"> <img src="https://img.shields.io/badge/license-MIT-lightgrey" alt="MIT"> </p> </p>


Your AI had perfect context — two weeks ago. Then your strategy shifted, three meetings redefined priorities, and the docs you wrote on Monday are wrong by Friday. CLEAR Context OS is the maintenance layer your second brain never had: ownership boundaries enforced mechanically, staleness surfaced on a schedule, drift propagated across linked docs, a dispatcher that learns from your clicks. One source of truth per topic. Searchable. Task-aware. Never silently stale.


Install

Easiest — let Claude do it. Open Claude Code in any directory and paste:

"Install BCOS from https://github.com/walm00/business-context-os and walk me through onboarding."

Claude clones the repo, picks the right install path for your platform (Windows/macOS/Linux), runs setup, and steps straight into onboarding. No prereq checks to debug — if something's missing, Claude resolves it interactively.

Or manually, two commands:

curl -fsSL https://raw.githubusercontent.com/walm00/business-context-os/main/install.sh -o /tmp/bcos-install.sh
bash /tmp/bcos-install.sh

(Requires bash, curl, and tar on PATH — fine on macOS/Linux and on Windows under WSL or Git Bash. Two steps instead of a single bash <(curl …) pipe so Claude Code's permission gate auto-approves both commands — you don't need to drop out to a terminal.)

Drop anything you already have — SOPs, brand docs, meeting notes, exports — into docs/_inbox/ (skip if you're starting fresh). Then open Claude Code in that repo and say:

"Launch BCOS onboarding."

That's the only prompt you need. Onboarding inspects your inbox, scans the rest of the repo, asks one Q&A round, and proposes the architecture for review. Works the same whether the repo is fresh or already full of context.


From zero to running

  INSTALL  →  DISCOVER  →  ALIGN  →  SCHEDULE  →  RUNNING
#StepWhat happens
1InstallOne bash line drops the framework into any repo
2DiscoverClaude scans your repo + any MCP you've connected (Drive, Notion, Slack, Gmail, your CRM — whatever's wired in) for existing context, plus anything you've dropped into docs/_inbox/
3AlignOne Q&A round — project type, key sources, ownership boundaries. Architecture drafted for your review
4SchedulePick maintenance cadence in plain English: "audit twice a week", "dispatcher at 08:30", "deep daydream off"
5RunningDaily digest. Local dashboard. /context bundle <task> ready. Context compounds from here — the system maintains itself.

Simple, guided, automatic. Claude walks you through each step — you review, you decide. Nothing deleted along the way — originals preserved or archived, never silently overwritten.


What it does

Stops context rot in three ways:

What it does
OrganizeEvery doc declares what it owns. CLEAR boundaries prevent the same fact living in 5 places.
MaintainScheduled jobs check freshness, surface stale docs, propagate updates across linked content.
Use/context search and /context bundle <task> give Claude curated, freshness-aware, source-of-truth-ranked context for the job at hand.

The folder tells the LLM what to trust. Claude reads the path before the content: docs/*.md = canonical, _planned/ = not yet real, _archive/ = history, _inbox/ = unprocessed, _collections/ = verbatim evidence, _wiki/ = explanatory. The hierarchy is the trust signal — fewer tokens spent re-deciding, no chance of treating an archived draft as today's truth.

docs/
├── *.md                  ← canonical data points (one source of truth per topic)
├── document-index.md     ← auto-generated TOC
├── current-state.md      ← what's true right now + what changed recently
├── table-of-context.md   ← high-level cluster map for orientation
├── _inbox/               ← drop zone — Claude triages on demand
├── _planned/             ← polished ideas, not yet real
├── _archive/             ← superseded — kept, not deleted
├── _collections/         ← verbatim evidence (invoices, contracts, transcripts)
│   └── <type>/_manifest.md   (each collection has a manifest)
├── _wiki/                ← derivative knowledge (how-tos, source summaries)
│   ├── pages/            ← user-authored explainers
│   ├── source-summary/   ← external captures with citation banners
│   ├── raw/              ← original artifacts (PDFs, HTML)
│   └── queue.md          ← URLs awaiting fetch
└── _bcos-framework/      ← framework docs — never user content
    ├── architecture/     ← 12 zone + system architecture docs
    ├── methodology/      ← 5 CLEAR + ownership + standards docs
    ├── patterns/         ← 8 project-type starting templates
    └── templates/        ← 15 frontmatter / schema / starter files

The wiki zone

Inspired by Karpathy's LLM Wiki approach — give the LLM a wiki of your knowledge, the way you'd brief a smart new hire.

Save anything to the wiki, from anywhere:

/wiki run https://stripe.com/docs/api          ← fetch a URL, summarize, cite
/wiki create from /Users/me/Downloads/spec.pdf ← extract a PDF, link to the binary
/wiki promote docs/_inbox/meeting-notes.md     ← turn an inbox capture into a wiki page

The wiki holds how-tos, runbooks, glossaries, source summaries, post-mortems, decision logs — derivative knowledge that explains and supports your canonical data points. Every page cites what it builds on. Stale pages surface automatically when their sources advance.

Wiki content is searchable alongside the rest of your context:

/context search "stripe billing"       ← cross-zone search, ranked by source-of-truth
/context bundle market-report:write    ← curated bundle for a specific task

The dashboard

A local cockpit at http://127.0.0.1:8091 that shows your system at a glance — no third-party services, no telemetry, no logins.

Image: BCOS dashboard cockpit — knowledge system status, things waiting on you, maintenance routine

python .claude/scripts/bcos-dashboard/run.py
SurfaceWhat you see
CockpitOne-line status (healthy / N waiting / heads-up). Per-job dot strip for every maintenance job (core BCOS + wiki zone).
Update"Run full sync" button → update.py + CLAUDE.md drift review + auto-commit + push, with a live log drawer.
Schedules (/settings/schedules)Per-job preset buttons (daily, mon_wed_fri, weekly_mon, off) + the global auto-commit toggle + auto-fix whitelist. Saves directly to schedule-config.json.
Run history (/settings/runs)Last 20 dispatcher runs with filter chips (job / verdict / trigger).
File health (/settings/files)Frontmatter / cross-reference / staleness findings with one-click fixes.

The dashboard is read-mostly: data flows from the dispatcher's diary, the schedule config, and the canonical context index. Writes (mark-done, schedule preset, auto-commit toggle, file fix) go through dedicated POST endpoints.


Requirements

  • Claude Code (desktop app, CLI, or web)

  • Python 3.8+ on PATH

  • bash (default macOS bash 3.2 is fine)


Updating

python .claude/scripts/update.py

Refreshes framework files only — skills, hooks, scripts, templates. Your docs/ and .private/ are never touched.


Maintenance

One scheduled task per repo. The dispatcher reads schedule-config.json, runs the jobs due today, writes one consolidated digest at docs/_inbox/daily-digest.md, and surfaces findings as one-click cards in the dashboard.

Image: BCOS maintenance schedule dispatcher — daily, weekly, monthly jobs flowing into the daily digest and dashboard cards

You can tune any of it in plain English:

"Run the audit twice a week." · "Move dispatcher to 08:30." · "Turn off deep daydream."

The system learns from your clicks. After three consistent uses of the same fix, the dashboard pre-selects it as a "✨ suggested" action — you accept or reject. Reversals trigger an automatic safety brake.


CLEAR — the methodology

Five principles, one rule each:

  • C — Contextual Ownership · one document owns each topic. No duplicates.

  • L — Linking · reference sources; don't copy them.

  • E — Elimination · consolidate; don't keep two versions.

  • A — Alignment · context that doesn't support decisions doesn't belong.

  • R — Refinement · structured maintenance, not ad-hoc fixes.

The whole framework is the mechanical implementation of these five rules.


What ships

Everything below installs as one repo drop-in. No third-party services, no logins, no telemetry — all state lives in your .claude/ and docs/ folders.

LayerCountExamples
Skills (chat-invokable via slash command)17clear-planner · bcos-wiki · context-routing · context-audit · context-ingest · daydream · learning · schedule-tune · lessons-consolidate · ecosystem-manager
Sub-agents (delegated bounded tasks)3wiki-fetch · explore · plus one optional
Scripts (mechanical Python)46lifecycle_sweep · run_wiki_* (5) · cmd_wiki_* (7) · auto_fix_audit · bcos_inventory · digest_sidecar · record_resolution
Hooks (auto-validation on edit)4post-edit frontmatter check · post-commit context check · pre-compact save · auto-save session
Maintenance jobs (scheduled, one dispatcher)12index-health · audit-inbox · daydream-lessons · daydream-deep · architecture-review · auto-fix-audit · lifecycle-sweep · wiki-stale-propagation · wiki-source-refresh · wiki-graveyard · wiki-coverage-audit · wiki-canonical-drift
Auto-fix IDs (silent dispatcher fixes)12missing-last-updated · eof-newline · frontmatter-field-order · wiki-mark-queue-ingested · wiki-archive-expired-post-mortem
Architecture docs12wiki-zone.md · lifecycle-routing.md · typed-events.md · context-zones.md · content-routing.md · wiki-headless-scripts.md
Methodology docs5CLEAR principles · context architecture · decision framework · document standards · ownership specification
Project patterns (starting templates by project type)8client-project · gtm · marketing · operational · product-development · product-service · internal-tool-app · internal-tool-automation
Templates (frontmatter, schema, starters)15data-point · cluster · current-state · table-of-context · wiki-schema · wiki-config · session-diary-starter

Every script and skill is documented at the source. Every job has a reference doc under .claude/skills/schedule-dispatcher/references/job-*.md. Every typed-event finding maps to a renderer in the dashboard cockpit. Adding a new check means dropping a cmd_*.py or run_*.py, registering it in one map, and the dashboard picks it up.


Contributing

Contributions welcome — open an issue or submit a PR targeting the dev branch. CI runs frontmatter, reference, and ecosystem-integration checks on every PR.

The fastest contribution path is lessons learned. As you use the system it captures insights; if you find one universal, contribute it back.


Origin

Built by Guntis Coders after two years of operating context systems in production. The CLEAR methodology emerged from a practical problem: AI context degrades silently, and no amount of one-time documentation prevents it. The solution required a system — ownership boundaries, automated maintenance, self-learning, and structured reflection.

Background: What is the Table of Contexts and why does it matter.


License

MIT

.claude/skills/context-onboarding/SKILL.md


name: context-onboarding description: | First-run onboarding skill. Gets a new user from zero to a working context system. Claude asks one direct question upfront to pick the right scaffolding, then works from what the user shares — no long assessment ceremony beyond that. Creates a checklist that tracks setup progress across sessions and self-removes when done.

WHEN TO USE:

  • "I want to set up my business context"

  • "Here's my website / pitch deck / LinkedIn"

  • "Scan my repo and show me what context exists"

  • "What do I do next?" (after install)

  • "Help me get started"

  • First time adopting CLEAR Context OS in any project


Context Onboarding

Goal

Working context system, user-approved, in under 30 minutes.

Claude does the drafting. The user reviews and corrects. No questionnaires, no choices to make.


How It Works

Claude asks ONE direct question upfront — "what kind of project is this?" — and uses the answer to pick the right template + pattern doc. After that, Claude figures out the rest from what the user says and what's in the repo. No long path-chooser; just one gate that routes scaffolding correctly.

Signals → What to do
What you seeWhat you do
User shares a URL, pitch deck, or describes their businessGather from those sources, ask 2-3 follow-ups if needed
Repo already has docs/, README, markdown files with business contentScan the repo, map what exists
User drops files in docs/_inbox/Read those files — but STILL ask if there's more before proceeding
User has MCP connectors (Google Drive, Notion, etc.)Ask what to look at — don't fetch everything
User just says "help me get started" or "what do I do next?"Quick-check repo, check for MCP connectors, then ask where their knowledge lives
Mix of the aboveCombine all available sources

Step 0: Identify Project Type + Discover Sources

Two short AskUserQuestion gates, in order: what kind of project this is (0a), then where the knowledge lives (0b). Pre-fill both from what you can see before asking — the user confirms or overrides.

0-pre. CLAUDE.md self-heal (silent)

Before anything else, run once per onboarding session to make sure the BCOS-managed instructions are present in CLAUDE.md. This catches the git clone-without-install.sh case: if CLAUDE.md exists but lacks the <!-- BCOS:CORE:START --> / <!-- BCOS:CORE:END --> markers, the framework section is missing or unstructured. The helper below splices it in.

"$CLAUDE_PROJECT_DIR/.claude/bin/python3" .claude/scripts/_claude_md.py \
  --target CLAUDE.md \
  --source .claude/bcos-claude-reference.md \
  --recovery .claude/bcos-claude-reference.md

If .claude/bcos-claude-reference.md doesn't exist yet (fresh clone), point --source at the upstream template available in this repo's tree (the same file install.sh would have copied). If neither is available, skip — update.py will fix it on the next refresh.

Action handling (silent unless something happened):

  • unchanged — say nothing, continue.

  • created — mention in one line that CLAUDE.md was created.

  • spliced — mention in one line: "Added the BCOS instructions block to your CLAUDE.md (your existing content is preserved)."

  • replaced — mention in one line: "Refreshed the BCOS instructions block; previous version saved to .claude/bcos-claude-reference.md."

Do not block onboarding on this step. If the helper errors, log a one-line warning and continue.

0a. Project type

Before anything else, ask what kind of project this is. The answer picks the template + pattern doc Claude uses for the rest of onboarding. This is the one question that isn't inferred silently — one direct question is the ceremony.

Pre-fill suggestion first: glance at any URLs the user shared, files they dropped, README contents, repo structure (frontend code? Dockerfile + cron? marketing copy? client names? spec docs + ADRs? runbooks and on-call docs? pricing / enablement / battlecards?). Use that to pick the most likely answer as the suggested option, but still ask.

Two levels, only ask the follow-up when needed.

Level 1 — always ask. Use the AskUserQuestion tool:

  • Question: "What's this repo primarily about? (This picks the scaffolding — you can change it later.)"

  • Options:

    • Product (external product, service, or company context)

    • Product development (R&D, specs, architecture, engineering roadmap)

    • Internal tool (dashboards, scripts, internal apps, developer tools)

    • Marketing (marketing site, campaigns, content strategy)

    • GTM / sales (pricing, positioning, sales enablement, partnerships)

    • Operations (ops runbooks, processes, infrastructure docs)

    • Client work (agency engagement scoped to one client)

    • Team playbook / personal (team practices, ops runbook, personal projects)

Level 2 — only when the Level 1 answer is ambiguous. Skip if repo signals already disambiguate.

  • If the user picked "Product" (and the repo doesn't obviously lean one way — e.g. marketing site + pricing page → external product; spec docs + ADRs + architecture → R&D), ask:

    • Question: "External-facing product/service, or product development (R&D)?"

    • Options:

      • External product / service (the product as sold — brand, positioning, customers)

      • Product development (how the product is built — specs, architecture, roadmap)

  • If the user picked "Internal tool" (and the repo doesn't make the sub-shape obvious — e.g. a React frontend → app; cron config + Dockerfile with no UI → automation), ask:

    • Question: "Is it more of an app or an automation?"

    • Options:

      • App with UI + internal users (web dashboard, internal admin tool, back-office app)

      • Automation / CLI / pipeline / service (no UI — scripts, ETL, cron jobs, backend services)

Claude should silently pre-fill the Level 1 option based on inference, and skip Level 2 entirely when pre-fill confidence is high on the sub-shape. Carry the resolved profile through to Step 1 (profile → template + pattern mapping) and Step 2 (cluster naming).

0b. Source discovery

Now find out where the knowledge lives.

ALWAYS use the AskUserQuestion tool — even if files already exist in _inbox/:

If files are already in _inbox/, acknowledge them first ("I can see X files in your inbox"), then ask:

  • Question: "I found [N] files in your inbox. Anything else to include before I start? Website URL, Google Drive docs, other materials?"

  • Options:

    • That's everything (proceed with what's in the inbox)

    • Here's more (I'll share URLs, drop more files, or point you to a connected system)

    • Check my connected systems too (Google Drive, Notion, Confluence via MCP)

If NO files in _inbox/, ask:

  • Question: "Where does your business knowledge live right now?"

  • Options:

    • I have files to share (drop them in docs/_inbox/ or point me to them)

    • Connected system (Google Drive, Notion, Confluence — I can browse via MCP)

    • Both (local files + connected systems)

    • Starting from scratch (no existing docs — let's create from conversation)

Based on the answer:

Source typeWhat to do
Local filesAsk user to drop them in docs/_inbox/, or point to their location
MCP-connected system (Google Drive, Notion, Confluence)Ask what folders/docs to look at — browse selectively, don't fetch everything
External system, not connectedNote it — create an external reference data point later (Step 2)
Starting from scratchSkip to Step 1, use website/conversation to gather info

First-run routing principle: onboarding is allowed to identify all BCOS zones, but it should only create active data points after the user approves the architecture. Route material by what it is, not by file type alone:

MaterialFirst-run handling
Canonical facts, current decisions, project/task/business realityDraft active data points in docs/*.md
Raw notes, unsorted snippets, uncertain materialKeep in docs/_inbox/ until triaged
Future ideas, plans, or maybesPark in docs/_planned/
Legal-weight evidence only — signed contracts, NDAs, regulatory filings, audited reports (the file IS the legal artifact)Route to docs/_collections/<type>/ with manifest discipline, or map externally if too large
Operational & explanatory long-form content — runbooks, SOPs, how-tos, decision logs, post-mortems, playbooks, scripts-with-context, glossaries, FAQs, AND informational transcripts / exports / research / customer-call notes / source summariesRoute through bcos-wiki: /wiki create, /wiki promote, or /wiki queue add. The wiki is the universal long-form / cross-cutting content destination per plugin-storage-contract.md Rule 2 — not just URLs and source-summaries.

For connected external systems:

  • Ask what kind of docs to look for — adapt the prompt to the project type from Step 0a:

    • External product / service: "Company info, processes, brand guidelines?"

    • Product development: "PRDs, RFCs / ADRs, architecture diagrams, spec docs?"

    • Internal tool: "Architecture docs, runbooks, ADRs, ops guides?"

    • Marketing: "Campaign briefs, content calendars, editorial guidelines, performance reports?"

    • GTM / sales: "Sales plays, battlecards, pricing docs, enablement materials, partner agreements?"

    • Operations: "Runbooks, on-call playbooks, incident post-mortems, SLI / SLO docs?"

    • Client work: "Client briefs, SOWs, design files, meeting notes?"

    • Team playbook / personal: "SOPs, team docs, notes, references?"

  • Fetch only what's relevant for context — NOT bulk collections (invoices, call logs, etc.)

  • For large collections (100+ similar files): don't copy — map where they are (see handling modes in Step 2a)

Non-breaking guarantee:

  • Never modify files outside docs/ and .claude/

  • Never rename source files — originals keep their name

  • Never delete anything — archive only, after user approval

  • Create alongside, not instead of — new data points coexist with originals

  • NEVER create folders not defined in the architecture. Valid folders are: docs/ (active), _inbox/, _planned/, _archive/, _collections/, _collections/[type]/, _wiki/ If content doesn't fit these, ask the user — don't invent new folders


Step 1: Gather Information + Identify Profile

Read everything available from the sources discovered in Step 0. The knowledge categories you extract depend on the project type from Step 0a:

The knowledge categories to extract come from the resolved profile's pattern doc in docs/_bcos-framework/patterns/. Open the matching pattern doc, read its "Data Point Map" section, and use those clusters as the extraction targets. A short per-profile pointer:

  • External product / service → see docs/_bcos-framework/patterns/product-service-pattern.md. The generic "business identity → operations → strategy" shape below also works as a fallback.

  • Product development → see docs/_bcos-framework/patterns/product-development-pattern.md. Categories lean toward product scope, architecture, features & specs, technical decisions, team & roadmap.

  • Internal tool → app → see docs/_bcos-framework/patterns/internal-tool-app-pattern.md and table-of-context.internal-tool.md. Categories: what the tool is, what it does, who uses it, how it works, upstream/downstream, operational model, current state.

  • Internal tool → automation → see docs/_bcos-framework/patterns/internal-tool-automation-pattern.md. Shared template with app — different cluster emphasis (pipeline identity, behavior & ownership, architecture & operations).

  • Marketing → see docs/_bcos-framework/patterns/marketing-pattern.md. Brand adjacency, campaigns & content, channels & performance, editorial voice.

  • GTM / sales → see docs/_bcos-framework/patterns/gtm-pattern.md. Target ICP, positioning & messaging, pricing & packaging, sales motion & enablement, partner & channel.

  • Operations → see docs/_bcos-framework/patterns/operational-pattern.md. System map, runbooks & procedures, on-call & escalation, SLIs & incidents, change management.

  • Client work → see docs/_bcos-framework/patterns/client-project-pattern.md and table-of-context.client-project.md. Engagement context, scope & delivery, architecture & handoff.

  • Team playbook / personal → no dedicated pattern doc yet. Use the generic shape below and pick cluster names from what the content actually is.

Generic fallback categories — use these when the profile is "Team playbook / personal" or when a pattern-doc-specific map doesn't yet exist:

Business identity: (product/service only — skip for internal-tool, client-project, operational, gtm, marketing, product-development)

  1. Who they are — identity, mission, founding story

  2. What they do — core offering, product/service

  3. Who they serve — target audience, customer segments

  4. What makes them different — positioning, differentiators

  5. What phase they're in — startup, growth, mature, pivoting

Operations & processes: (applies across most project types) 6. How they work — workflows, SOPs, approval chains, team processes 7. What rules they follow — brand guidelines, pricing rules, decision frameworks, policies 8. What they reference — glossaries, tool inventories, org charts, tech stacks, contact lists

Strategy & playbooks: (product/service and playbook profiles) 9. How they respond — crisis comms, competitive response, launch playbooks, market entry plans 10. What they've learned — past decisions, post-mortems, strategic pivots

Sources to read (use whatever's available):

  • Website URL → use WebFetch

  • LinkedIn company page → use WebFetch

  • Pitch deck / one-pager in docs/_inbox/ → read the file

  • Existing repo docs → scan with Glob + Read

  • Connected systems (Google Drive, Notion) → browse selectively via MCP tools

  • What the user tells you directly

If something is unclear: ask 2-3 focused follow-up questions. Not a questionnaire — just the gaps that matter most.

If scanning the repo: also flag these:

  • Same topic in multiple files (contradiction risk)

  • Important topics with no docs at all (gaps)

  • Content that looks significantly outdated

Profile → template + pattern mapping

The Step 0a answer already decided the profile. This table maps each resolved answer to the template variant and pattern doc Claude uses for drafting. Pattern docs live in docs/_bcos-framework/patterns/ and describe the data-point map, relationships, and voice for each profile — read the matching pattern doc before drafting.

Resolved profile (from Step 0a)TemplatePattern docNotes
External product / servicedocs/_bcos-framework/templates/table-of-context.md + current-state.mddocs/_bcos-framework/patterns/product-service-pattern.mdDefault. Brand + business identity + GTM overview.
Product developmenttable-of-context.md + current-state.md (fallback)docs/_bcos-framework/patterns/product-development-pattern.mdTODO: dedicated template variant not yet built. Pattern doc notes this — reuse product/service scaffolding and lean on the pattern's cluster map.
Internal tool → appdocs/_bcos-framework/templates/table-of-context.internal-tool.md + current-state.internal-tool.mddocs/_bcos-framework/patterns/internal-tool-app-pattern.mdApp shape: UI + internal users + persistence.
Internal tool → automationdocs/_bcos-framework/templates/table-of-context.internal-tool.md + current-state.internal-tool.mddocs/_bcos-framework/patterns/internal-tool-automation-pattern.mdNo UI: scripts, CLIs, pipelines, services. Shared template, different cluster emphasis.
Marketingtable-of-context.md + current-state.md (fallback)docs/_bcos-framework/patterns/marketing-pattern.mdTODO: dedicated template variant not yet built. Pattern doc notes this — reuse product/service scaffolding. Expect brand inheritance from a sibling product-service repo.
GTM / salestable-of-context.md + current-state.md (fallback)docs/_bcos-framework/patterns/gtm-pattern.mdTODO: dedicated template variant not yet built. Pattern doc notes this — reuse product/service scaffolding. Expect positioning inheritance from a sibling product-service repo.
Operationstable-of-context.internal-tool.md + current-state.internal-tool.md (fallback)docs/_bcos-framework/patterns/operational-pattern.mdTODO: dedicated template variant not yet built. Pattern doc notes this — reuse internal-tool templates and treat scope as the team's operational layer across many systems.
Client workdocs/_bcos-framework/templates/table-of-context.client-project.md + current-state.client-project.mddocs/_bcos-framework/patterns/client-project-pattern.mdExternal deliverable scoped to one client. One client, one engagement.
Team playbook / personaltable-of-context.md + current-state.md (fallback)No dedicated pattern yet (fallback: product-service-pattern.md for shape only)TODO: dedicated pattern + template not yet built. Reuse product/service scaffolding, lean heavily on the content the user shares, adapt clusters to what the content actually is.

Pick sensible cluster names based on the profile — don't present a formal "profile assessment" to the user, just use the right cluster names in your drafted data points. Cluster hints (these mirror the "Data Point Map" in each pattern doc):

Resolved profileLikely clusters
External product / serviceBusiness Identity, Offerings & Positioning, Market & Customers, Brand & Voice, GTM Overview
Product developmentProduct Scope & Vision, Architecture, Features & Specs, Technical Decisions, Team & Roadmap
Internal tool → appTool Identity, Users & Capabilities, Architecture & Operations
Internal tool → automationPipeline Identity, Behavior & Ownership, Architecture & Operations
MarketingBrand Adjacency, Campaigns & Content, Channels & Performance, Editorial Voice
GTM / salesTarget ICP, Positioning & Messaging, Pricing & Packaging, Sales Motion & Enablement, Partner & Channel
OperationsSystem Map, Runbooks & Procedures, On-Call & Escalation, SLIs & Incidents, Change Management
Client workEngagement Context, Scope & Delivery, Architecture & Handoff
Team playbook / personalPick 2-4 clusters from the content the user shares (TODO: refine when variant is built)

Use as many clusters as the content demands. Don't limit arbitrarily — if the user has content spanning 6 areas, use 6 clusters. Don't present a cluster taxonomy to the user — just use the right cluster names in your drafted data points.


Step 2: Plan the Data Point Architecture

Don't limit to 3 data points. Analyze ALL the content and plan however many data points are needed to capture everything properly. Nothing gets lost — only duplications and conflicts get resolved.

2a. Content inventory + classification

List every piece of content you found. For each item:

  • Source — where it came from (file, URL, user input, MCP system)

  • Topics covered — what knowledge it contains

  • Document type — classify using the type guide below

  • Handling mode — how to process it (see handling guide below)

  • Overlaps — does it duplicate or contradict another source?

  • Quality — is it current, outdated, or a fragment?

Type classification guide:

If content...TypeSignal
Describes what something IS (identity, market, audience, positioning)contextAnswers "what is" questions
Describes how to DO something (steps, workflows, SOPs, checklists)processAnswers "how to" questions
Defines rules, standards, or constraints (brand rules, pricing policy, approval criteria)policyAnswers "must / must not" questions
Is lookup/reference data (glossary, org chart, tool list, tech stack, contacts)referenceAnswers "what's the..." factual lookups
Is a situational response guide (crisis plan, launch playbook, competitive response)playbookAnswers "what do we do when..." questions

Handling mode guide:

ModeWhen to useWhat Claude doesContent preserved?
SynthesizeRaw info from multiple sources (website, pitch, brain dump, conversation)Combine into new data points with CLEAR structureNo — Claude writes new content from sources
WrapExisting structured doc (SOP, process doc, policy, brand rules)Add CLEAR frontmatter + ownership spec around existing contentYes — preserve original text exactly
CatalogReference material (templates, checklists, glossaries, inventories)Add minimal frontmatter, keep content completely as-isYes — preserve as-is
MapExternal bulk collections too large to copy (call transcripts, invoices, reports in Drive/Notion)Create a reference data point describing where and how to find themN/A — nothing is copied locally
WikiExplainers, how-tos, source summaries, decision narratives, post-mortems, or material the user asks to make into a wiki pageRoute through bcos-wiki (/wiki create, /wiki promote, /wiki queue add) so schema, index, queue, and log stay alignedYes for source captures; page body is derivative explanation

Stable-vs-volatile rule (applies to synthesize and wrap modes): A data point is for durable truth. When deciding what to bake into a synthesized data point:

  • Extract: stable concepts (mission, positioning, audience definition, pricing model, decision frameworks, methodology, glossary), critical rules (brand guidelines, policies), and historical facts that won't change (founding date, signed agreements, past pivots).

  • Don't extract — reference instead: volatile numbers (current MRR, headcount, this-quarter KPIs), time-series data (monthly metrics, invoice ledgers), and operational state with its own system of record (CRM pipeline, accounting books). For these, create a reference data point in map mode pointing at the source, or note where the live number lives — don't copy a snapshot that will rot.

Rule of thumb: if a fact will be wrong within 90 days, point at the source. If it reflects a decision or definition, extract it. A good data point should still read as true a year from now even when every number in the business has moved.

CRITICAL for wrap and catalog modes: Never rewrite, shorten, rephrase, or "improve" the original content. SOPs and processes especially — changing a step could break a real workflow. Add CLEAR structure (frontmatter, ownership spec) AROUND the content but leave the content itself untouched. Flag contradictions or outdated items for the user to decide, but don't fix them yourself.

Wiki mode boundary: Do not use wiki pages as canonical reality. Wiki pages explain, summarize, narrate, or teach; they cite data points through builds-on:. Path B binaries captured for wiki stay under docs/_wiki/raw/local/. Do not write them to _collections/ unless the user explicitly asks for a collection/evidence operation.

Edge cases:

  • Brand guidelines with rules → policy, mode: wrap (preserve the rules exactly)

  • Brand identity describing who we are → context, mode: synthesize (combine from multiple sources)

  • Onboarding doc with steps → process, mode: wrap (preserve the exact steps)

  • Onboarding overview describing the team → context, mode: synthesize

  • Templates that define a standard → reference, mode: catalog (don't modify at all)

  • If one source mixes types → split into separate data points, each with its own mode

  • 200 call transcripts in Google Drive → mode: map (create external reference, don't copy)

  • Bulk local files (reports, invoices) the user wants to keep → route to docs/_collections/[type]/, no frontmatter required

  • "Make this a wiki page" / "turn this into an explainer" / URL to summarize later → mode: wiki (/wiki create, /wiki promote, or /wiki queue add)

2b. Plan the data points

Group the content inventory into logical data points. Each data point should:

  • Own one clear topic (no overlap with other data points)

  • Contain all the knowledge about that topic from all sources

  • Consolidate duplicates — pick the best version, merge the rest

  • Resolve contradictions — flag them for the user to decide

Present the plan to the user, then STOP and use the AskUserQuestion tool before creating any files.

Show the plan:

Based on what I found, here's the data point structure I recommend:

[Cluster Name]
  1. [Data Point Name] (context, synthesize) — [what it covers] (sources: file1.md, website)
  2. [Data Point Name] (process, wrap) — [what it covers, content preserved as-is] (source: sop-doc.md)

[Cluster Name]
  3. [Data Point Name] (policy, wrap) — [what it covers, content preserved] (source: brand-guidelines.pdf)
  4. [Data Point Name] (reference, catalog) — [what it covers] (source: tech-stack.md)

External references (not copied):
  5. Sales Call Transcripts (reference, map) — ~200 files in Google Drive > Sales > Calls

Conflicts found:
  - [Topic]: file1.md says X, file2.md says Y — which is current?

Nothing is lost. [N] sources → [M] data points + [E] external references.

MANDATORY — use AskUserQuestion tool immediately after showing the plan. Do NOT type the options as text:

  • Question: "Does this structure look right?"

  • Options: Proceed (create the data points) / Adjust (tell me what to change)

Wait for the user's response before creating any files.

2c. Create the data points

After the user approves the plan, create each data point in docs/. The approach depends on the handling mode:

For SYNTHESIZE mode (raw info → new data point):

---
name: "[Data Point Name]"
type: "[classified type]"          # context | process | policy | reference | playbook
cluster: "[Cluster]"
version: "1.0.0"
status: draft
created: "[today]"
last-updated: "[today]"
---

# [Data Point Name]

## Ownership Specification

**DOMAIN:** [One sentence — what this covers]

**EXCLUSIVELY_OWNS:**
- [Item 1]
- [Item 2]
- [Item 3]

**STRICTLY_AVOIDS:**
- [Topic that belongs elsewhere] (see: [other-data-point])

## Content

[Real content synthesized from sources. Not placeholders.]

## Context

[Why this matters. How to use it. Strategic implications.]

For WRAP mode (existing structured doc → add CLEAR structure around it):

Add frontmatter + ownership spec at the top. Keep the original content below exactly as-is:

---
name: "[Original Doc Title]"
type: process                      # or policy, playbook — whatever fits
cluster: "[Cluster]"
version: "1.0.0"
status: draft
created: "[today]"
last-updated: "[today]"
---

# [Original Doc Title]

## Ownership Specification

**DOMAIN:** [What this document covers]

**EXCLUSIVELY_OWNS:**
- [Items this doc is the authority on]

**STRICTLY_AVOIDS:**
- [Topics that belong elsewhere]

## Content

[ORIGINAL CONTENT PRESERVED EXACTLY AS-IS — do not rewrite, shorten, or rephrase]

For CATALOG mode (reference material → minimal metadata):

Same as wrap but even lighter — just frontmatter, no ownership spec needed if the content is self-explanatory:

---
name: "[Title]"
type: reference
cluster: "[Cluster]"
version: "1.0.0"
status: active
created: "[today]"
last-updated: "[today]"
---

[ORIGINAL CONTENT PRESERVED AS-IS]

For MAP mode (external collection → reference data point):

Create a reference data point that describes WHERE to find content, not the content itself:

---
name: "[Collection Name]"
type: reference
cluster: "[Cluster]"
version: "1.0.0"
status: active
created: "[today]"
last-updated: "[today]"
---

# [Collection Name]

## Ownership Specification

**DOMAIN:** Location and access instructions for [what this collection contains].

**EXCLUSIVELY_OWNS:**
- Access instructions for this external collection
- Summary of what's available and how to search it

## External Source

- **System:** [Google Drive / Notion / Confluence / etc.]
- **Path:** [Folder path or workspace location]
- **Format:** [File types, naming patterns if any]
- **Volume:** [Approximate count, growth rate]
- **Access:** [MCP tool name, or manual export instructions]
- **How to find specific files:** [Search tips — by date, keyword, entity name]

## When to Fetch

- [Scenario 1 when you'd want to pull from this collection]
- [Scenario 2]
- [Scenario 3]

General rules for all modes:

  • Default to flat in docs/ root — use cluster frontmatter for grouping, not folders. Example: docs/brand-identity.md not docs/brand-identity/brand-identity.md. If the user explicitly requests subdirectories for organization, that's fine — but don't create them unprompted

  • Do NOT move, rename, or reorganize original source files

  • Create new CLEAR data points alongside originals — user decides when to archive

  • Pre-fill everything — user edits, they don't write from scratch

  • Add useful tags in frontmatter for every managed data point/wiki page. Tags are warning-only during adoption, but they power search, dashboard filters, Galaxy, and mechanical retrieval.

  • Use last-updated only when content/metadata changes. Use last-reviewed when a doc is checked and confirmed without changing content, especially when review-cycle is present. Folder-derived facets such as zone, folder, and path-tags are generated by .claude/scripts/context_index.py; do not duplicate them in YAML.


Step 3: Verify — Quality Check

Before showing the user, verify the work yourself:

  1. Nothing lost check — for every source item in your content inventory, confirm it appears in at least one data point. List any gaps.

  2. Ownership check — every data point has a clear DOMAIN and EXCLUSIVELY_OWNS. No two data points claim the same topic.

  3. Cross-reference check — STRICTLY_AVOIDS entries point to real data points. Links resolve.

  4. Content quality — no placeholder text, no empty sections, no "TBD" entries. If you can't fill a section from sources, cut it.

  5. Metadata — all required YAML frontmatter fields present and correct; tags present where possible; last-reviewed used when review happened without content mutation.

Then present the results:

Here are [N] data points based on [what you shared / what I found]:

[Cluster Name]
  1. [Name] — [one-line summary]
  2. [Name] — [one-line summary]

[Cluster Name]
  3. [Name] — [one-line summary]
  ...

Coverage: [X] sources → [Y] data points. No content dropped.

MANDATORY — use AskUserQuestion tool immediately after showing results. Do NOT type the options as text:

  • Question: "Everything look right? Ready to activate these data points?"

  • Options: Activate (set all to active, run index + wake-up) / Adjust (tell me what to fix)

After the user approves (with any corrections applied):

  • Set status to active on approved data points

  • Create docs/_inbox/, docs/_planned/, docs/_archive/ if they don't exist

  • Run python .claude/scripts/build_document_index.py to generate the Document Index with DOMAIN one-liners

  • Run python .claude/scripts/generate_wakeup_context.py to generate the Wake-Up Context for instant session orientation


Step 4: Archive Originals

Only after the user approves the new data points. Never archive before approval.

If there were existing source files in the repo (old docs, scattered markdown, inbox files):

  1. Show the user which original files are now fully captured in the new data points

  2. Use the AskUserQuestion tool:

    • Question: "These originals are now covered by the new data points. What should I do with them?"

    • Options: Archive them (move to _archive/ with a note) / Keep alongside (leave in place for now)

  3. If archive — move each file to docs/_archive/ with a note explaining what replaced it

  4. If keep — leave them in place

Never delete source files. Archive only. The originals stay available for reference.


Step 5: Update the Onboarding Checklist

The checklist ships with install at docs/.onboarding-checklist.md. After data points are approved:

  1. Check off "Initial data points created and approved"

  2. Tell the user what's left:

Data points are live. Your onboarding checklist (docs/.onboarding-checklist.md)
tracks what's left to set up — I'll remind you once per session until it's done.

Want to keep going or pick it up next time?

After the user is set up, let them know about ongoing tools:

  • New content in the future: use context-ingest to add, classify, and route new material

  • First quality check: recommend running context-audit to verify the fresh architecture

  • Architecture reference: the content routing logic is defined in docs/_bcos-framework/architecture/content-routing.md (6 routing paths)


Step 6: Set Up Scheduled Maintenance

After data points and the document index are in place, the next checklist item is scheduled maintenance. In v1.2 this is ONE task per repo — the bcos-{project} dispatcher. It runs daily, reads .claude/quality/schedule-config.json, and decides which maintenance jobs are due today.

Before creating anything, resolve two variables:

  1. {REPO_PATH} — the absolute path to this repo's root directory (the current working directory)

  2. {PROJECT} — a short slug derived from the repo folder name. Lowercase, hyphens only, no spaces. Examples: acme-corp, my-product, client-portal.

6a. Seed the config file

Copy .claude/quality/schedule-config.template.json → .claude/quality/schedule-config.json. Keep all the _comment and _about fields — users will read them.

If the file already exists, don't overwrite. Skip to 6b.

6b. Ensure the diary directory exists

The diary lives at .claude/hook_state/schedule-diary.jsonl (gitignored). Ensure the .claude/hook_state/ directory exists (it usually does from install.sh — check and create if missing). Don't create the JSONL file itself; the dispatcher will create it on first run.

6b-pre. Permissions preflight (CRITICAL — prevents stuck dispatcher runs)

Scheduled dispatcher runs spawn fresh Claude Code sessions with no human watching. Every permission prompt that fires in those sessions becomes a stuck task — an early adopter reported "almost none of the scheduled tasks fired, just one, and it stuck." This step prevents that by running the same drift check CI runs.

Run the catalog drift guard:

python .claude/scripts/validate_permissions_catalog.py

This is the same script CI runs on every commit (validate-permissions-catalog job). It performs a bidirectional check between permissions-catalog.md (the SoT) and .claude/settings.json:

  • Forward: every entry catalogued must exist in permissions.allow.

  • Reverse: every permissions.allow entry must have a catalog row OR be on the small structural-infra allowlist.

Exit code 0 → preflight passed; proceed. Exit code 1 → drift detected. The script's stdout names the specific missing entries. Resolve drift by running:

python .claude/scripts/update.py

The update script's merge_settings_json is additive — it adds missing entries from the shipped settings.json without touching user customisations, AND ensure_python_shim creates the Python shim (.claude/bin/python3 / .claude/bin/python3.cmd) if absent. Re-run the validator to confirm clean.

Why call the validator instead of hand-rolling a marker list here: drift between this skill and CI used to be a maintenance hazard — every new dispatcher entry meant editing two places. Both now consume the same catalog SoT. Adding a permission means editing one row in permissions-catalog.md and one entry in settings.json; the validator catches any future drift automatically.

If the user has a non-default .claude/settings.local.json that REJECTS catalog entries (via a deny rule or stale allowlist), surface the conflict and ask the user to resolve before proceeding — do not silently work around it.

6b-cross. Cross-repo workflow check

Ask whether scheduled workflows will span multiple repos (umbrella + sub-repos, portfolio mode, sibling-repo writes). If yes, recommend mirroring the project allowlist to user-level settings so cross-repo writes don't prompt:

Use AskUserQuestion:

  • Question: "Will scheduled workflows touch other repos on this machine (umbrella → sub-repos, sibling repos, portfolio mode)?"

  • Options:

    • No, single repo only — project-level perms are enough; skip mirroring

    • Yes, multi-repo — mirror the allowlist to ~/.claude/settings.json so cross-repo runs don't stall

    • Not sure — explain trade-offs and let the user decide

If the answer is "Yes, multi-repo" (or the user confirms after explanation), run:

python .claude/scripts/install_global_permissions.py

Confirm output shows entries merged. The script is idempotent and additive — it never removes or reorders existing user-level rules. Trust-model notes live in docs/_bcos-framework/architecture/permissions-catalog.md under "Cross-repo workflows".

6b-mcp. MCP scheduled-tasks permission (one-time prompt — encourage "Always allow")

The next step (6d) calls mcp__scheduled-tasks__create_scheduled_task to create the OS-level cron task. On first invocation, Claude Code will prompt the user to approve the MCP tool. Tell the user this is coming, and that "Always allow" is the right choice:

I'm about to create the daily dispatcher task. Claude Code will prompt you to allow the mcp__scheduled-tasks__create_scheduled_task tool — pick "Always allow" so future scheduled runs don't get stuck on permission prompts. (You can revoke it later in ~/.claude/settings.json if needed.)

This is the only MCP permission BCOS needs the user to grant interactively. Everything else is shipped in the project-level allowlist.

6c. Ask about the dispatcher time

Default is 09:00 local. Use AskUserQuestion:

  • Question: "When should the morning dispatcher run?"

  • Options:

    • 09:00 (default) — runs at 9am local

    • Earlier (7:00-8:30) — pick a specific time

    • Later (10:00-12:00) — pick a specific time

If user picks "earlier" or "later", follow up with a specific-time question. Resolve to a concrete HH:MM.

6d. Create the single dispatcher task

Use mcp__scheduled-tasks__create_scheduled_task with:

  • taskId: bcos-{project} (e.g. bcos-leverage)

  • cronExpression: derive from the user's chosen time. 09:00 → "0 9 * * *", 08:30 → "30 8 * * *".

  • description: BCOS daily maintenance dispatcher for {project}

  • prompt (literal, with {REPO_PATH} substituted):

Working directory: {REPO_PATH}

IMPORTANT: First ensure the working directory is {REPO_PATH}. If the session is running elsewhere, cd there before starting.

Run the schedule-dispatcher skill to execute today's scheduled CLEAR maintenance. It will:
1. Read .claude/quality/schedule-config.json
2. Determine which jobs are scheduled for today based on day-of-week / day-of-month
3. Execute each job in sequence, appending one diary entry per job
4. Write a consolidated digest to docs/_inbox/daily-digest.md
5. Report a one-line summary

Keep output focused. If everything is green with no action items, say so in one line.
6e. Verify the task actually exists AND its working directory is correct

Before declaring success, confirm the task is set up properly:

  1. Existence check. Use mcp__scheduled-tasks__list_scheduled_tasks and confirm bcos-{project} appears with the correct cron expression. If it's missing, surface the error and stop — don't claim success on a half-failed setup.

  2. Working-directory check. From the list response, find the entry's path field (points at the task's SKILL.md). Use Read on that path and scan for a Working directory: <value> line. The <value> MUST exactly match {REPO_PATH} (the absolute path to this repo). On mismatch:

    • Emit a typed scheduled-task-cwd-mismatch finding (category: "bcos-framework", verdict amber, emitted_by: "context-onboarding"). The shape is shared with bcos-umbrella's audit_scheduled_task_cwd.py so the dashboard deduplicates registration-time + audit-time emissions:

      {
        "finding_type": "scheduled-task-cwd-mismatch",
        "category": "bcos-framework",
        "verdict": "amber",
        "emitted_by": "context-onboarding",
        "suggested_actions": ["acknowledge"],
        "finding_attrs": {
          "sibling_id": "{project}",
          "expected_cwd": "{REPO_PATH}",
          "actual_cwd": "<value from Working directory line>",
          "task_name": "bcos-{project}",
          "platform": "{win32|darwin|linux}"
        }
      }
    • Append the finding to this repo's .claude/hook_state/bcos-framework-issues.jsonl (create the file if needed). The portfolio aggregator picks it up on the next dispatcher run.

    • Surface to the user via AskUserQuestion:

      • Question: "Your scheduled task bcos-{project} has working directory <actual_cwd> but this repo lives at {REPO_PATH}. The dispatcher will run in the wrong directory and writes meant for this repo's docs/_inbox/ will be blocked. How do you want to fix?"

      • Options:

        • Recreate the task — delete + create with correct path (recommended)

        • Leave as-is — acknowledge the finding; revisit later via umbrella-schedule-tune or manual edit

    • If "Recreate", call mcp__scheduled-tasks__delete_event (or the equivalent delete tool) on the bad task, then re-run Step 6d.

  3. Why this matters. A 2026-05-13 incident in a sibling repo: the sibling's scheduled task had its working-directory pointing at the umbrella host instead of the sibling itself. The dispatcher ran daily, but every attempt to write docs/_inbox/daily-digest.md was blocked with "Path is outside allowed working directories" — a silent failure with no obvious trail. The check above catches this at registration time so the user never lives with a broken-but-superficially-OK schedule.

6f. Offer cadence tuning (optional)

The template ships with every job set to daily. That's intentional — fresh setups should over-monitor for the first 1-2 weeks until the auto-tuner suggests reductions after green-run streaks. But power users sometimes want to tune up front.

Use AskUserQuestion:

  • Question: "Default is daily for everything (recommended). Want to adjust any cadences now?"

  • Options:

    • Keep defaults — runs daily for now; auto-tuner will suggest reductions after ~5 green runs

    • Adjust now — invoke the schedule-tune skill so the user can describe changes in plain English

If user picks "Adjust now", invoke schedule-tune. If "Keep defaults", continue.

6g. Confirm and close out

Check off "Dispatcher task created" in the onboarding checklist. Tell the user:

Maintenance is live. One task, bcos-{project}, runs every morning at {time}. It produces docs/_inbox/daily-digest.md and a one-line summary. You can change frequencies anytime by telling me things like "run audit twice a week" or "turn off deep daydream" — I'll handle the config edit via the schedule-tune skill.

Want to test it now with "run today's maintenance now"?

Don't auto-run. Let the user invoke the first run on their terms.

Why this shape

Scheduled tasks live in ~/.claude/scheduled-tasks/ — user-global, not per-repo. One task per repo keeps the user-global task list short and unambiguous, and eliminates the time-collision problem that 5 separate per-repo tasks used to cause.

Don't skip this step. Users who don't set up the dispatcher will hit context rot within weeks. The default config is aggressive (daily index-health, weekly everything else) — the dispatcher will suggest reductions once it sees green runs stacking up.

Never mention migration during onboarding. Migration is a separate path triggered only when update.py finds pre-existing v1.x tasks. A fresh install has nothing to migrate and should never see the word.


Checklist: Session-Start Behavior

This section is for Claude, not the user.

CLAUDE.md tells Claude to read docs/.onboarding-checklist.md at session start. When reading it:

  1. Find the first unchecked item

  2. Mention it once: "Your onboarding checklist has [item] next. Want to do that now?"

  3. If the user says yes, do it. If no, move on.

  4. After completing any item, check the box in the file.

Don't nag. One mention per session.

Self-Removal

When ALL items are checked:

  1. Delete docs/.onboarding-checklist.md

  2. Remove the onboarding checklist line from CLAUDE.md (line 1 under "Session Start: Read These First")

  3. Tell the user: "Onboarding complete — checklist removed."


Tips

  • Capture everything, don't limit arbitrarily. Create as many data points as the content demands. Better to have proper coverage than to lose information. A complex business with a deep doc pile may legitimately need 15-25+ data points across all main domains — that's the right answer, not a problem to minimize.

  • Cover all main domains before refining any one of them. A complete-but-rough architecture beats a polished-but-partial one. Gaps stay invisible until something breaks; rough boundaries can be sharpened later.

  • Stable in, volatile out. Bake stable concepts and historical facts into data points. For numbers that change often (revenue, headcount, KPIs, pipeline, books), use map mode and point at the source — don't snapshot a number that will be wrong next month.

  • Draft real content, not placeholders. If you can't fill a section, cut it — don't leave it empty.

  • Ask focused questions, not questionnaires. 2-3 max.

  • Keep it conversational. This is their first experience. Helpful, not bureaucratic.

  • No jargon on first contact. Say "data point" only after you've shown them one. Before that, say "a doc about your [topic]."

  • Project type is one direct question, not an assessment. Step 0a is the only gate. Pre-fill the suggested answer from signals in the repo/sources, but still ask. Don't wrap it in a formal "project profile assessment" or a long questionnaire — one question, then move on.

278 files · 9 not served here

Advantages

Limitations

  • Requires adherence to a specific folder structure and frontmatter schema to function correctly. evidence: README.md
  • Maintenance jobs and dispatcher functionality rely on Python and bash being available on the host system. evidence: README.md

Security

Risk level: Medium risk

This brain runs

Agent instructions that run or fetch something (170)

  • .claude/agents/wiki-fetch/AGENT.md: A 100k-token URL fetched into the main thread by `/wiki run` saturates the context window before a single page lands.
  • .claude/agents/wiki-fetch/AGENT.md: | Calling skill | Subcommand | Trigger | |---|---|---| | `bcos-wiki` | `run` Pass 1 | Each URL in the queue → one `wiki-fetch` invocation | | `bcos-wiki` | `refresh` full-tier | Source-summary past `stale_threshold_days` and HEAD signals changed | | `bcos-wiki` | `promote` (Path B) | S …[+132 chars] · uses the network
  • .claude/agents/wiki-fetch/AGENT.md: The cumulative budget guard ([`_wiki_budget.decide_dispatch_strategy`](../../scripts/_wiki_budget.py)) decides whether N sub-agents run in parallel or serial — `parallel` when projected cumulative tokens stay ≤ 80% of the main context limit;
  • .claude/agents/wiki-fetch/AGENT.md: queue an explicit retry tag for next run | | `error.kind: fetch-error` | 4xx/5xx from upstream | Surface to user;
  • .claude/agents/wiki-fetch/AGENT.md: `python .claude/scripts/test_wiki_fetch.py` — asserts this AGENT.md declares the documented input kinds and output fields, that the 4000-token cap is stated, that calling-skill docs reference both `wiki-fetch` and the Task tool, and that the result-schema validator + cumulative budget g …[+47 chars]
  • .claude/skills/bcos-wiki/SKILL.md: **`/wiki`** with subcommands: `init`, `init --defaults`, `run`, `queue`, `promote`, `create`, `review`, `archive`, `refresh`, `lint`, `remove`, `schema`, `search`
  • .claude/skills/bcos-wiki/SKILL.md: "Run the wiki refresh"
  • .claude/skills/bcos-wiki/SKILL.md: | | `run [<url>]` | implemented | P3 | Path A: batch (no arg) processes all `## Pending` queue items;
  • .claude/skills/bcos-wiki/SKILL.md: single (with URL) auto-queues + ingests | | `queue <url> [tags]` | implemented | P3 | Append URL to `## Pending` of `queue.md` without fetching | | `ingest` | shared protocol | P3 | Internal — called by `run`/`promote`/`create`;
  • .claude/skills/bcos-wiki/SKILL.md: optionally re-pull `builds-on` data points to verify | | `archive <slug>` | implemented | P3 | Soft-delete to `_wiki/.archive/` with dangling-reference scan | | `refresh <slug>` | implemented | P3 | Path A: re-fetch a `source-summary` page (refresh-must-rediscover applies, D-05 two-tie …[+470 chars]
  • .claude/skills/bcos-wiki/SKILL.md: `run` → `run.md`
  • .claude/skills/bcos-wiki/SKILL.md: Run `/wiki init` first."* and exit.
  • .claude/skills/bcos-wiki/SKILL.md: | Choice | Behavior | |---|---| | Init with defaults + proceed | Run `.claude/scripts/cmd_wiki_init.py` (or equivalent `ensure_wiki_zone.py` call).
  • .claude/skills/bcos-wiki/SKILL.md: Then resume the original subcommand (`create from`, `promote`, `run`, etc.) as if the Guard had passed.
  • .claude/skills/bcos-wiki/SKILL.md: | | Full interview + proceed | Read `init.md` and run the 6-question interactive scaffold.
  • .claude/skills/bcos-wiki/SKILL.md: The dispatched subcommand files (`create.md`, `promote.md`, `run.md`, `refresh.md`, `lint.md`, `archive.md`, `review.md`, `remove.md`, `schema.md`, `search.md`, `bundle.md`, `queue.md`) all reference *"the `.config.yml` Guard defined in `SKILL.md`"* — they inherit this AskUserQuestion p …[+46 chars]
  • .claude/skills/bcos-wiki/SKILL.md: The human reviews diffs and runs `git commit` / `git push` when ready. · uses the network
  • .claude/skills/bcos-wiki/SKILL.md: This applies to `run`, `refresh`, and `create` (when source content is large).
  • .claude/skills/bcos-wiki/SKILL.md: Users who want a binary in collections-as-evidence must run `/collections add` explicitly.
  • .claude/skills/bcos-wiki/SKILL.md: ├── run.md ← /wiki run [<url>]
  • .claude/skills/bcos-wiki/SKILL.md: ├── ingest.md ← shared ingest pipeline (called by run/promote/create/refresh)
  • .claude/skills/clear-planner/SKILL.md: Step 2: Run Discovery
  • .claude/skills/clear-planner/SKILL.md: { "step": 2, "name": "Run Discovery", "status": "in_progress" }
  • .claude/skills/clear-planner/SKILL.md: **Run all three discovery scripts:**
  • .claude/skills/clear-planner/SKILL.md: bash .claude/agents/agent-discovery/find_agents.sh
  • .claude/skills/clear-planner/SKILL.md: bash .claude/skills/skill-discovery/find_skills.sh
  • .claude/skills/clear-planner/SKILL.md: python .claude/scripts/find_lessons.py --tags "#{scenarioType}"
  • .claude/skills/clear-planner/SKILL.md: Run discovery scripts (Step 2 results)
  • .claude/skills/clear-planner/SKILL.md: | | ------------------- | ------------------------------------ | --------------------------------------------------------- | ------------------- | | Integration Audit | Detect stale references in ecosystem | `python .claude/scripts/analyze_integration.py --staged` + AI review | **YES …[+455 chars]
  • .claude/skills/clear-planner/SKILL.md: | Scenario | Key Requirement | | ----------------- | ------------------------------------------------------------------ | | **AGENTING** | Check for ecosystem overlaps + run integration audit before commit | | **DOCUMENTAT …[+76 chars]
  • .claude/skills/context-audit/SKILL.md: Run all five audit categories against the scoped files.
  • .claude/skills/context-audit/SKILL.md: python .claude/scripts/build_document_index.py
  • .claude/skills/context-ingest/SKILL.md: | Input shape | Dispatch to | Why | |-------------|-------------|-----| | HTTP/HTTPS URL (article, GitHub, YouTube) | `/wiki run <url>` (the `bcos-wiki` skill, Path A) | Wiki owns external-source ingest, banner citations, schema validation, refresh tier | | Path inside `docs/_inbox/` a …[+508 chars]
  • .claude/skills/context-ingest/SKILL.md: If the input is mixed (e.g. Slack export *and* a URL), do mine first, then handle the URL via `/wiki run` separately, then return to ingest for whatever's left.
  • .claude/skills/context-ingest/SKILL.md: Run `python .claude/scripts/build_document_index.py` after material changes
  • .claude/skills/context-ingest/SKILL.md: **→ Rebuild Document Index** — Always: `python .claude/scripts/build_document_index.py`
  • .claude/skills/context-ingest/SKILL.md: **→ context-audit** — If a new data point was created: "Want me to run a quick CLEAR audit on the new doc?"
  • .claude/skills/context-mine/SKILL.md: Recommend: "Run context-ingest to classify and route these items"
  • .claude/skills/context-onboarding/SKILL.md: | What you see | What you do | |---|---| | User shares a URL, pitch deck, or describes their business | Gather from those sources, ask 2-3 follow-ups if needed | | Repo already has docs/, README, markdown files with business content | Scan the repo, map what exists | | User drops files …[+394 chars] · uses the network
  • .claude/skills/context-onboarding/SKILL.md: Before anything else, run **once** per onboarding session to make sure the BCOS-managed instructions are present in `CLAUDE.md`.
  • .claude/skills/context-onboarding/SKILL.md: This catches the `git clone`-without-`install.sh` case: if `CLAUDE.md` exists but lacks the `<!-- BCOS:CORE:START -->` / `<!-- BCOS:CORE:END -->` markers, the framework section is missing or unstructured. · uses the network
  • .claude/skills/context-onboarding/SKILL.md: If `.claude/bcos-claude-reference.md` doesn't exist yet (fresh clone), point `--source` at the upstream template available in this repo's tree (the same file install.sh would have copied).
  • .claude/skills/context-onboarding/SKILL.md: **First-run routing principle:** onboarding is allowed to identify all BCOS zones, but it should only create active data points after the user approves the architecture.
  • .claude/skills/context-onboarding/SKILL.md: | Material | First-run handling | |---|---| | Canonical facts, current decisions, project/task/business reality | Draft active data points in `docs/*.md` | | Raw notes, unsorted snippets, uncertain material | Keep in `docs/_inbox/` until triaged | | Future ideas, plans, or maybes | Par …[+578 chars]
  • .claude/skills/context-onboarding/SKILL.md: Options: **Activate** (set all to active, run index + wake-up) / **Adjust** (tell me what to fix)
  • .claude/skills/context-onboarding/SKILL.md: Run `python .claude/scripts/build_document_index.py` to generate the Document Index with DOMAIN one-liners
  • .claude/skills/context-onboarding/SKILL.md: Run `python .claude/scripts/generate_wakeup_context.py` to generate the Wake-Up Context for instant session orientation
  • .claude/skills/context-onboarding/SKILL.md: The checklist ships with install at `docs/.onboarding-checklist.md`.
  • .claude/skills/context-onboarding/SKILL.md: Ensure the `.claude/hook_state/` directory exists (it usually does from install.sh — check and create if missing).
  • .claude/skills/context-onboarding/SKILL.md: the dispatcher will create it on first run.
  • .claude/skills/context-onboarding/SKILL.md: **Run the catalog drift guard:**
  • .claude/skills/context-onboarding/SKILL.md: python .claude/scripts/validate_permissions_catalog.py
  • .claude/skills/context-onboarding/SKILL.md: python .claude/scripts/update.py
  • .claude/skills/context-onboarding/SKILL.md: Re-run the validator to confirm clean.
  • .claude/skills/context-onboarding/SKILL.md: If the answer is "Yes, multi-repo" (or the user confirms after explanation), run:
  • .claude/skills/context-onboarding/SKILL.md: python .claude/scripts/install_global_permissions.py
  • .claude/skills/context-onboarding/SKILL.md: Question: "When should the morning dispatcher run?"
  • .claude/skills/context-onboarding/SKILL.md: Run the schedule-dispatcher skill to execute today's scheduled CLEAR maintenance. It will:
  • .claude/skills/context-onboarding/SKILL.md: 3. Execute each job in sequence, appending one diary entry per job
  • .claude/skills/context-onboarding/SKILL.md: The portfolio aggregator picks it up on the next dispatcher run.
  • .claude/skills/context-onboarding/SKILL.md: The dispatcher will run in the wrong directory and writes meant for this repo's `docs/_inbox/` will be blocked.
  • .claude/skills/context-onboarding/SKILL.md: If "Recreate", call `mcp__scheduled-tasks__delete_event` (or the equivalent delete tool) on the bad task, then re-run Step 6d.
  • .claude/skills/context-onboarding/SKILL.md: That's intentional — fresh setups should over-monitor for the first 1-2 weeks until the auto-tuner suggests reductions after green-run streaks.
  • .claude/skills/context-onboarding/SKILL.md: Let the user invoke the first run on their terms.
  • .claude/skills/context-onboarding/SKILL.md: A fresh install has nothing to migrate and should never see the word.
  • .claude/skills/core-discipline/SKILL.md: **Significant change** (restructure a cluster, create new skills) → use clear-planner, run the full workflow
  • .claude/skills/core-discipline/SKILL.md: | Task Type | Action | | ------------------------- | ---------------------- | | Questions, commands | Respond directly | | Single-file fixes | Just do it | | Small changes (1-3 files) | Think briefly, execute |
  • .claude/skills/core-discipline/SKILL.md: A scheduled dispatcher run finishes clean green with zero findings (one-line summary keeps the dashboard "Ready" status meaningful)
  • .claude/skills/core-discipline/SKILL.md: **Special case — wrapping scripts with built-in prompts** (like `update.py`'s `[y/N]` prompt): invoke the script with `--dry-run` first, parse the output, surface the summary via `AskUserQuestion`, then re-invoke with `--yes` based on the user's choice.
  • .claude/skills/daydream/SKILL.md: If the file doesn't exist, this is the first run — use 2 weeks ago as the baseline.
  • .claude/skills/daydream/SKILL.md: # Read last run timestamp (or default to 2 weeks ago)
  • .claude/skills/daydream/SKILL.md: cat .claude/quality/last-daydream.txt 2>/dev/null || echo "no previous run"
  • .claude/skills/daydream/SKILL.md: git log --since="{last_daydream_date}" --name-only --pretty=format:"%h %s (%ar)" -- docs/ ':!docs/_bcos-framework/methodology/' ':!docs/_bcos-framework/guides/' ':!docs/_bcos-framework/templates/'
  • .claude/skills/daydream/SKILL.md: Report "No document changes since last run" and skip to Phase 3 (Imagine) for forward-looking reflection only.
  • .claude/skills/daydream/SKILL.md: git diff {last_daydream_commit}..HEAD -- docs/path/to/changed-file.md
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/build_document_index.py --dry-run
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/generate_wakeup_context.py
  • .claude/skills/daydream/SKILL.md: **Step 5b: Run maintenance scripts**
  • .claude/skills/daydream/SKILL.md: Daydream is the natural time to run periodic maintenance:
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/prune_sessions.py
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/prune_diary.py
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/generate_wakeup_context.py
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/analyze_crossrefs.py
  • .claude/skills/daydream/SKILL.md: **Step 6: Record this run**
  • .claude/skills/daydream/SKILL.md: python .claude/scripts/record_daydream.py
  • .claude/skills/daydream/SKILL.md: **Document Index** — Run `python .claude/scripts/build_document_index.py` if files changed
  • .claude/skills/doc-lint/SKILL.md: If `.md`: Run markdown quality checks and cross-reference validation
  • .claude/skills/doc-lint/SKILL.md: If `.json`: Run JSON structure validation
  • .claude/skills/doc-lint/SKILL.md: Px_001: Run markdown quality check -> doc-lint (markdown category)
  • .claude/skills/doc-lint/SKILL.md: Px_002: Run example code validation -> doc-lint (cross_reference category)
  • .claude/skills/doc-lint/SKILL.md: Px_001: Run JSON structure validation -> doc-lint (json_structure category)
  • .claude/skills/doc-lint/SKILL.md: Px_002: Run markdown quality check -> doc-lint (markdown category)
  • .claude/skills/ecosystem-manager/SKILL.md: Run discovery to see what exists:
  • .claude/skills/ecosystem-manager/SKILL.md: bash .claude/agents/agent-discovery/find_agents.sh
  • .claude/skills/ecosystem-manager/SKILL.md: bash .claude/skills/skill-discovery/find_skills.sh
  • .claude/skills/ecosystem-manager/SKILL.md: Run it before committing.
  • .claude/skills/ecosystem-manager/SKILL.md: python .claude/scripts/analyze_integration.py --uncommitted
  • .claude/skills/ecosystem-manager/SKILL.md: Coverage gaps in install.sh, settings.json, state.json, .gitignore
  • .claude/skills/ecosystem-manager/SKILL.md: Add fix tasks to the plan and execute them before committing.
  • .claude/skills/ecosystem-manager/SKILL.md: [ ] **install.sh installs new files**
  • .claude/skills/ecosystem-manager/SKILL.md: Run after major development sessions or as part of monthly architecture review.
  • .claude/skills/ecosystem-manager/SKILL.md: Run `python .claude/scripts/wiki_schema.py list` to inspect page-types, lint-checks, and auto-fixes from `_wiki/.schema.yml` or the framework fallback.
  • .claude/skills/ecosystem-manager/SKILL.md: Run all 4 CI checks locally:
  • .claude/skills/ecosystem-manager/SKILL.md: python .github/scripts/validate_frontmatter.py # YAML metadata on all managed markdown
  • .claude/skills/ecosystem-manager/SKILL.md: python .github/scripts/validate_references.py # All registry paths resolve + state.json accuracy
  • .claude/skills/ecosystem-manager/SKILL.md: python .claude/scripts/analyze_integration.py --ci # Ecosystem wiring (install.sh, settings.json coverage)
  • .claude/skills/learning/SKILL.md: **Mechanism:** `python .claude/scripts/promote_resolutions.py` (the module's `__main__` calls `regenerate()`).
  • .claude/skills/learning/SKILL.md: Run the matching subcommand directly.
  • .claude/skills/lessons-consolidate/SKILL.md: python .claude/scripts/consolidate_lessons.py
  • .claude/skills/schedule-dispatcher/SKILL.md: Run `python .claude/scripts/update.py` first."
  • .claude/skills/schedule-dispatcher/SKILL.md: Report to the user: "schedule-config.json is malformed — fix before the dispatcher can run.
  • .claude/skills/schedule-dispatcher/SKILL.md: For each entry in `jobs`, decide if it should run today.
  • .claude/skills/schedule-dispatcher/SKILL.md: | `schedule` value | Runs when | |--------------------|----------------------------------------------------| | `"daily"` | Every day | | `"mon"`..`"sun"` | Only on that weekday …[+549 chars]
  • .claude/skills/schedule-dispatcher/SKILL.md: **For on-demand dispatch** (user said "run the audit-inbox job"): skip this step, run only the named job.
  • .claude/skills/schedule-dispatcher/SKILL.md: Build an ordered list of jobs to run.
  • .claude/skills/schedule-dispatcher/SKILL.md: python .claude/scripts/context_index.py --write
  • .claude/skills/schedule-dispatcher/SKILL.md: The cache TTL is 10 min (longer than a full dispatcher cycle), so all jobs in this run hit the same in-memory snapshot.
  • .claude/skills/schedule-dispatcher/SKILL.md: Last run timestamp per job?
  • .claude/skills/schedule-dispatcher/SKILL.md: Use the helper script — it creates `.claude/hook_state/` on first run and matches the allowlisted command prefix so it never prompts:
  • .claude/skills/schedule-dispatcher/SKILL.md: python .claude/scripts/append_diary.py '{"ts":"2026-04-15T09:04:12","job":"index-health","verdict":"green","findings_count":0,"auto_fixed":[],"actions_needed":[],"duration_s":4}'
  • .claude/skills/schedule-dispatcher/SKILL.md: **Fallback:** when `.bcos-umbrella.json` is absent (standalone BCOS install with no umbrella), preflight reduces to the `../` + absolute-path scans — no sibling-name list to check against.
  • .claude/skills/schedule-dispatcher/SKILL.md: After Step 4 completes (last job returned), verify that **every job listed in Step 2's run-list produced exactly one diary entry in this dispatcher tick**.
  • .claude/skills/schedule-dispatcher/SKILL.md: Read back the diary entries appended during this tick (use the dispatcher's in-memory record, or the tail of `.claude/hook_state/schedule-diary.jsonl` filtered to the current run's `ts` prefix if you're running on-demand).
  • .claude/skills/schedule-dispatcher/SKILL.md: **Added in schema 1.1.0.** Before applying auto-fixes (Step 5) or rendering the digest (Step 7), enrich each finding emitted in Step 4 with three computed fields and produce the run's headline string.
  • .claude/skills/schedule-dispatcher/SKILL.md: **Match against prior tick.** Scan diary entries from the **immediately-prior dispatcher tick** (the most-recent run before today, identified by the latest `ts` < today's run window).
  • .claude/skills/schedule-dispatcher/SKILL.md: | Run shape | Headline template | |---|---| | Green clean (0 findings, 0 framework) | "{Nth consecutive green run.}{recovery callout if any job verdict flipped error→green this tick.}" | | Green with frequency suggestions only | "All {N} jobs green.
  • .claude/skills/schedule-dispatcher/SKILL.md: And the run has a `headline` string ready for Step 7.
  • .claude/skills/schedule-dispatcher/SKILL.md: For each job run today, check recent diary:
  • .claude/skills/schedule-dispatcher/SKILL.md: **Last run was `error`** → suggest investigating, not frequency change
  • .claude/skills/schedule-dispatcher/SKILL.md: Both are overwritten each run.
  • .claude/skills/schedule-dispatcher/SKILL.md: Conditional sections render ONLY when their counts are non-zero — a green clean run is ~5 lines, an amber run with 5 findings is ~40 lines.
  • .claude/skills/schedule-dispatcher/SKILL.md: | 1 | `{emitted_by}` | `{primary_attr}` | {one-line meaning} | {`🔁 Nth run` if consecutive_runs ≥ 3, else blank} |
  • .claude/skills/schedule-dispatcher/SKILL.md: Run at {ISO timestamp} · `.claude/hook_state/schedule-diary.jsonl`
  • .claude/skills/schedule-dispatcher/SKILL.md: verdict emoji + finding count + inline status markers in Note column | | `💡 Suggestions` | `≥1` `frequency-suggestion` finding | Bullet list | | Footer | Always | Run timestamp, diary path, auto-commit status |
  • .claude/skills/schedule-dispatcher/SKILL.md: | Scenario | Verdict bar example | Top line | Action hint | |---|---|---|---| | Green clean | `**🟢 BCOS green** · 1 ran · 0 findings · 0 fixed · 4s` | `Headline string from Step 4c, e.g. "10th consecutive green run."` | `→ Nothing to act on.
  • .claude/skills/schedule-dispatcher/SKILL.md: Run `git rev-parse --abbrev-ref HEAD` to get the current branch.
  • .claude/skills/schedule-dispatcher/SKILL.md: This is the per-tick safety property: a stray hand-edit to a "generated" file on a day its owning job did not run still blocks auto-commit.
  • .claude/skills/schedule-dispatcher/SKILL.md: Globs are resolved against `git status --porcelain` paths (same surface the clean-tree rule already inspects).
  • .claude/skills/schedule-dispatcher/SKILL.md: **Emit the `job-missing-outputs-declaration` framework-finding only when** the job's run would have changed at least one path *outside* `GLOBAL_ALLOWED` (i.e. a path that *could* have been auto-committable had it been declared).
  • .claude/skills/schedule-dispatcher/SKILL.md: Run `git status --porcelain`.
  • .claude/skills/schedule-dispatcher/SKILL.md: `git commit -m "bcos: daily maintenance {YYYY-MM-DD}"` — no push, ever.
  • .claude/skills/schedule-dispatcher/SKILL.md: A BCOS install with no umbrella still writes the log — it just sits locally until somebody (or the dashboard) reads it.
  • .claude/skills/schedule-dispatcher/SKILL.md: The last thing the dispatcher does depends on whether the run produced anything that needs user judgement.
  • .claude/skills/schedule-dispatcher/SKILL.md: Otherwise — clean green run, zero findings, zero suggestions — output a short summary and stop.
  • .claude/skills/schedule-dispatcher/SKILL.md: **Why this rule:** if every run always asked a question, every scheduled run would show as "Awaiting input" in the dashboard even on clean days.
  • .claude/skills/schedule-dispatcher/SKILL.md: Or even shorter when the user is watching an on-demand run:
  • .claude/skills/schedule-dispatcher/SKILL.md: ("Do you want architecture review to run weekly?" is too abstract — `schedule-tune` handles that)
  • .claude/skills/schedule-dispatcher/SKILL.md: **Retry the failed job(s)** → re-run only the errored jobs (on-demand mode), then ask again with the new result
  • .claude/skills/schedule-dispatcher/SKILL.md: If the user says "run the {job-name} job now" or "run today's maintenance now":
  • .claude/skills/schedule-dispatcher/SKILL.md: Skip the schedule predicate — run only the named job(s)
  • .claude/skills/schedule-dispatcher/SKILL.md: ## On-demand run — {HH:MM} ({job-name})
  • .claude/skills/schedule-dispatcher/SKILL.md: If `daily-digest.md` does not yet exist (no scheduled run happened today), create it with a minimal header before appending the on-demand section.
  • .claude/skills/schedule-dispatcher/SKILL.md: DO append a diary entry per job with `"trigger":"on-demand"` so the run is tracked in history
  • .claude/skills/schedule-dispatcher/SKILL.md: Run another job
  • .claude/skills/schedule-dispatcher/SKILL.md: The morning scheduled run always OVERWRITES `daily-digest.md` fresh — so yesterday's on-demand sections are not preserved in the digest (diary retains them).
  • .claude/skills/schedule-dispatcher/SKILL.md: Every dispatcher run produces either a digest OR a user-facing error message.
  • .claude/skills/schedule-dispatcher/SKILL.md: `schedule-tune` — user-facing skill for changing config ("run audit twice a week")
  • .claude/skills/schedule-dispatcher/SKILL.md: If a run was wrong, add a corrective entry, don't mutate history.
  • .claude/skills/schedule-tune/SKILL.md: If you haven't set up BCOS scheduling yet, run `context-onboarding` Step 6.
  • .claude/skills/schedule-tune/SKILL.md: **Utterances:** *"run audit twice a week"*, *"change daydream to every 3 days"*, *"switch architecture review to quarterly"*, *"run index-health on weekdays only"*, *"audit on Tuesdays and Fridays"*
  • .claude/skills/schedule-tune/SKILL.md: **Utterances:** *"run the dispatcher at 08:30"*, *"move morning maintenance to 07:00"*
  • .claude/skills/schedule-tune/SKILL.md: Update the actual scheduled task's cron via `mcp__scheduled-tasks__update_scheduled_task` — that's what actually moves the run
  • .claude/skills/schedule-tune/SKILL.md: **Utterances:** *"what's my maintenance schedule?"*, *"when does audit run?"*, *"is architecture-review enabled?"*
  • .claude/skills/schedule-tune/SKILL.md: If the user proposes a cron that would run more than once per day, refuse: *"Dispatcher is designed to run once daily.
  • .claude/skills/schedule-tune/SKILL.md: | User says | Config edit | |----------------------------------------|----------------------------------------------------------------| | "run audit on Tuesday instead of Friday" | `jobs.audit-inbox.schedu …[+1012 chars]
  • .claude/skills/todo-utilities/SKILL.md: **Sequential Agent Invocation** — Tasks run one after another
  • CLAUDE.md: **Small changes (1-3 files)** — think briefly, execute.
  • CLAUDE.md: Auto-generated by `python .claude/scripts/generate_wakeup_context.py`.
  • CLAUDE.md: When unsure, run `context-ingest` and let it propose the route.
  • CLAUDE.md: **Post-work handoffs:** After integrating new content, offer to (a) rebuild the document index, (b) update related data points, (c) run an audit if architecture shifted.

Hooks (5)

  • .claude/settings.json (Stop): bash "$CLAUDE_PROJECT_DIR/.claude/hooks/auto_save_session.sh"
  • .claude/settings.json (PreCompact): bash "$CLAUDE_PROJECT_DIR/.claude/hooks/precompact_save.sh"
  • .claude/settings.json (PostToolUse): "$CLAUDE_PROJECT_DIR/.claude/bin/python3" "$CLAUDE_PROJECT_DIR/.claude/hooks/post_edit_frontmatter_check.py"
  • .claude/settings.json (PostToolUse): "$CLAUDE_PROJECT_DIR/.claude/bin/python3" "$CLAUDE_PROJECT_DIR/.claude/hooks/post_edit_frontmatter_check.py"
  • .claude/settings.json (PostToolUse): "$CLAUDE_PROJECT_DIR/.claude/bin/python3" "$CLAUDE_PROJECT_DIR/.claude/hooks/post_commit_context_check.py"

Install scripts (1)

  • install.sh: sh install.sh
  • Medium risk: runs-instruction-instruction-network (.claude/agents/wiki-fetch/AGENT.md:93)
  • Medium risk: runs-instruction-instruction-network (.claude/skills/bcos-wiki/SKILL.md:150)
  • Medium risk: runs-instruction-instruction-network (.claude/skills/context-onboarding/SKILL.md:33)
  • Medium risk: runs-instruction-instruction-network (.claude/skills/context-onboarding/SKILL.md:50)
  • Low risk: scripts-present (.claude/agents/agent-discovery/find_agents.sh)
  • Low risk: scripts-present (.claude/bin/python3)
  • Low risk: scripts-present (.claude/hooks/auto_save_session.sh)
  • Low risk: scripts-present (.claude/hooks/post_commit_context_check.py)
  • Low risk: scripts-present (.claude/hooks/post_edit_frontmatter_check.py)
  • Low risk: scripts-present (.claude/hooks/precompact_save.sh)
  • Low risk: scripts-present (.claude/scripts/analyze_crossrefs.py)
  • Low risk: scripts-present (.claude/scripts/analyze_integration.py)
  • Low risk: scripts-present (.claude/scripts/append_diary.py)
  • Low risk: scripts-present (.claude/scripts/audit_node_configs.py)
  • Low risk: scripts-present (.claude/scripts/auto_fix_audit.py)
  • Low risk: scripts-present (.claude/scripts/bcos_inventory.py)
  • Low risk: scripts-present (.claude/scripts/build_document_index.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_archive.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_init.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_lint.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_queue_add.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_remove.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_review.py)
  • Low risk: scripts-present (.claude/scripts/cmd_wiki_search.py)
  • Low risk: scripts-present (.claude/scripts/consolidate_lessons.py)
  • Low risk: scripts-present (.claude/scripts/context_bundle.py)
  • Low risk: scripts-present (.claude/scripts/context_index.py)
  • Low risk: scripts-present (.claude/scripts/context_search.py)
  • Low risk: scripts-present (.claude/scripts/digest_sidecar.py)
  • Low risk: scripts-present (.claude/scripts/find_lessons.py)
  • Low risk: scripts-present (.claude/scripts/generate_wakeup_context.py)
  • Low risk: scripts-present (.claude/scripts/install_global_permissions.py)
  • Low risk: scripts-present (.claude/scripts/lifecycle_sweep.py)
  • Low risk: scripts-present (.claude/scripts/load_task_profiles.py)
  • Low risk: scripts-present (.claude/scripts/load_zone_registry.py)
  • Low risk: scripts-present (.claude/scripts/promote_resolutions.py)
  • Low risk: scripts-present (.claude/scripts/prune_diary.py)
  • Low risk: scripts-present (.claude/scripts/prune_sessions.py)
  • Low risk: scripts-present (.claude/scripts/record_daydream.py)
  • Low risk: scripts-present (.claude/scripts/record_resolution.py)
  • Low risk: scripts-present (.claude/scripts/refresh_ecosystem_state.py)
  • Low risk: scripts-present (.claude/scripts/refresh_wiki_index.py)
  • Low risk: scripts-present (.claude/scripts/run_wiki_canonical_drift.py)
  • Low risk: scripts-present (.claude/scripts/run_wiki_coverage_audit.py)
  • Low risk: scripts-present (.claude/scripts/run_wiki_graveyard.py)
  • Low risk: scripts-present (.claude/scripts/run_wiki_source_refresh.py)
  • Low risk: scripts-present (.claude/scripts/run_wiki_stale_propagation.py)
  • Low risk: scripts-present (.claude/scripts/scan_docs_structure.py)
  • Low risk: scripts-present (.claude/scripts/set_profile.sh)
  • Low risk: scripts-present (.claude/scripts/update.py)

Attribution and licence

First committed by
GitHub avatar of walm00walm00
Publisher
Guntis Coders (Community)
Source
walm00/business-context-os · commit 4635683
Licence
MIT License (files served here)
  • ATTRIBUTION.md (written by AutoGineer)
Synced
Contributors
walm00

AutoGineer is not affiliated with or endorsed by walm00.

Install from source

9 of its files are not served here, so there is no ZIP. walm00/business-context-os at 4635683