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

docs/_bcos-framework/architecture/wiki-zone.md

Wiki Zone Architecture

How docs/_wiki/ works in CLEAR Context OS — what it holds, how content gets in, how it stays healthy, how its vocabularies grow as the business grows, and how it stays distinct from the other zones (data points, collections, inbox, planned, archive). Designed to be AI-friendly today and graph/RAG-ready tomorrow.

For the sibling zone mechanics see collections-zone.md and content-routing.md. For the philosophical placement of zones see system-design.md. For the canonical zone registry that names wiki alongside its eleven siblings, see context-zones.md — wiki is one zone among many; the registry is what every cross-zone consumer reads.

Net summary in one line: keep pin-llm-wiki's clever mechanics (HTML-comment DSL, banner citations, three structural shapes, fetch protocols, soft-delete cascade), and replace its loose semantics (tags, related, product, version-less frontmatter, advisory-only lint) with BCOS's CLEAR ownership, frontmatter hook, propagation-based staleness, scheduled maintenance jobs, and a schema-driven governance layer so vocabularies grow with the business instead of being chiseled in stone.


Why a Wiki Zone Exists

BCOS is built around canonical, exclusively-owned data points: each fact has exactly one home, and we link instead of duplicating. That model is excellent for what is true and terrible for everything else.

The wiki is BCOS's universal long-form / cross-cutting content destination — canonical per plugin-storage-contract.md Rule 2. It holds three broad categories of content that don't fit the data-point model:

1. Operational truth (authority: canonical-process) — how the business actually runs:

  • Runbooks (rebuilding document-index.md when frontmatter is corrupt; deploying the dashboard)

  • How-tos (onboarding a new client to BCOS; running discovery calls)

  • SOPs and playbooks (sales follow-up cadence; the meeting-transcript ingestion pipeline)

  • Decision logs (why we picked Postgres over Mongo in 2025)

  • Post-mortems (the March pricing migration incident)

  • Scripts-with-context (filename-sanitization logic for the Zapier transcript ingestor, with the WHY around it)

2. Internal reference (authority: internal-reference) — derivative explainers for skimming:

  • Glossaries that define "cluster," "data point," "document"

  • FAQs reformatted from the brand-voice data point

  • Tutorials onboarding newcomers to a domain

3. Plugin cross-cutting content and external sources — content that crosses plugin boundaries or originates outside:

  • Meeting transcripts (informational, not legal evidence)

  • WhatsApp / Slack exports

  • Customer-call notes, email captures, research clippings

  • Charters tied to plugin records

  • External source summaries captured from websites, GitHub repos, YouTube talks (authority: external-reference)

These pages explain, operate on, reference, or summarize for skimming the canonical truths in docs/*.md — or capture the surrounding context plugins and consumers need. They are derivative by design: they cite upstream data points via builds-on:, never replace them. That's what docs/_wiki/ is for.

What does NOT belong in the wiki:

  • Canonical data points — those live in docs/*.md. If a wiki page tries to own canonical content, the duplication-vs-data-point lint catches it.

  • Plugin-private structured data (initiative records, task JSON, SQLite) — those live in docs/_<plugin>/ per Rule 1.

  • Legal-weight evidence (signed contracts, regulatory filings, audited reports) — those live in _collections/ per Rule 3. Informational artifacts (a meeting transcript, an email export) → wiki. Legal artifacts → collections.


Where Wiki Sits Among the Zones

Each underscore-prefixed zone in BCOS carries a different truth-mode. The wiki zone slots in alongside the others without overlap.

ZoneTruth-modeFormAuthoringMutability"If I edit this, am I making it…"
docs/*.mdCanonical — source of truthData point with ownership specWe write + maintainDrifts; CLEAR-audited…more correct (refining canonical truth)
docs/_wiki/Derivative — explains canonicalPage with builds-on: upstream linksWe writeStale-prone; review-cycled…more clear (refining explanation)
docs/_collections/Evidence — verbatim artifactFile as-received (PDF, .docx, transcript)Uploaded, not editedAppend-only…more wrong (corrupting evidence)
docs/_planned/Hypothetical — not real yetRelaxed-schema docWe writeStable until promoted/dropped…more real (premature; should stay tentative)
docs/_archive/Historical — was real onceFrozen as-wasDon't editImmutable…revisionist (corrupting history)
docs/_inbox/Unclassified — pending triageRaw text dumpCapturedTemporary…a sign it should be triaged out

The four tightest distinctions:

  1. Wiki vs. data point. Data point: "Our target audience is small fintech teams in EU." Wiki: "How we run discovery calls to validate audience assumptions."

  2. Wiki vs. collection. Collection: the signed Acme contract PDF. Wiki: a how-to titled "Reading Our Acme Contract."

  3. Wiki vs. _planned/. _planned/ = future business state. Wiki = current operational knowledge.

  4. Wiki vs. _inbox/. _inbox/ = temporary triage. Wiki = permanent with review cycle.


Folder Layout

Pages flat under _wiki/pages/. Page-type is the only discriminator (frontmatter, not folder). External URL captures keep their own subdirectory because they have a distinct lifecycle (URL-fetched, structural shapes, refresh-must-rediscover applies).

docs/_wiki/
├── .config.yml                   # Wiki-zone runtime config (detail level, cadence, source types)
├── .schema.yml                   # Vocabulary registry (page-types, statuses, detail-levels — see "Schema and Governance")
├── README.md                     # Zone overview + decision tree (auto-maintained)
├── index.md                      # Page table — DERIVED ARTIFACT (regenerated by refresh_wiki_index.py; never hand-edited)
├── overview.md                   # Cross-page synthesis with [[wikilinks]]
├── log.md                        # Append-only ingest/refresh log
├── queue.md                      # Pending URLs (Path A) — renamed from pin-llm-wiki's inbox.md to disambiguate from docs/_inbox/
│
├── pages/                        # All internally-authored pages (flat; page-type discriminator in frontmatter)
│   ├── onboarding-flow.md        # page-type: how-to
│   ├── data-point-glossary.md    # page-type: glossary
│   ├── q1-pricing-incident.md    # page-type: post-mortem
│   └── …
│
├── source-summary/               # External URL captures (Path A only); has umbrella/sub/unified shape rules
│   ├── langchain-com.md
│   ├── langchain-com-langgraph.md
│   └── …
│
├── raw/
│   ├── web/<slug>.md             # Pin-llm-wiki native: web captures
│   ├── github/<slug>.md          # Pin-llm-wiki native: GitHub repo captures
│   ├── youtube/<slug>.md         # Pin-llm-wiki native: YouTube transcripts
│   ├── local/<slug>.md           # BCOS extension: from Path B (inbox-promoted or user-provided)
│   └── <type>/_manifest.md       # Per-type manifest (fetch date, source URL/path, hash) — same pattern as _collections/<type>/_manifest.md
│
└── .archive/                     # Soft-deleted pages with dangling-reference scan history
    └── <archived-slug>.md
Schema fragments overlay (.schema.d/)

The wiki schema is layered. _wiki/.schema.yml is the base, owned by BCOS and refreshable per install. BCOS-enabled plugins (initiatives-os, executions-os, future siblings) extend the vocabulary via fragments dropped at:

docs/_wiki/
├── .schema.yml                       # base — user-owned, BCOS-template-seeded
└── .schema.d/                        # overlay — plugin-owned
    ├── initiatives-os.yml            # one file per plugin; shipped via plugin install_here.py
    ├── executions-os.yml
    └── <future-plugin>.yml

Wiki tooling (frontmatter validation hook, /wiki schema list, future lint passes) calls into .claude/scripts/_wiki_schema_merge.py which reads base + every .schema.d/*.yml and returns a merged registry. The base remains plugin-agnostic. update.py never touches .schema.d/ — fragments survive every framework update.

What a fragment may declare. Two extensible registries: cross-references: (plugin-defined frontmatter ref fields like initiative-refs, task-refs, stakeholder-refs) and raw-source-types: (plugin-defined raw subtypes like meeting, whatsapp, email). Fragment must also declare plugin: and plugin-version: for diagnostics.

What a fragment must NOT declare. Anything base-owned: page-types, statuses, detail-levels, authority-values, lint-checks, auto-fixes, clusters, thresholds, schema-version, migrations. The merger emits a fragment error if a base-owned key appears.

Conflict resolution. Two fragments declaring the same cross-reference field with identical attribute maps is a no-op (allowed — useful when plugins overlap on shared fields like stakeholder-refs). Two fragments declaring the same field with differing attributes is a hard merge error surfaced via /wiki schema list and the hook's _fragment-errors diagnostic.

Anti-patterns.

  • Plugin's install_here.py hand-edits _wiki/.schema.yml directly. Causes plugin↔plugin collision (last-writer-wins on the shared file) and breaks clean uninstall. Use .schema.d/<plugin>.yml instead.

  • Plugin-specific fields are added to upstream _wiki.schema.yml.tmpl. Pollutes BCOS core with vocabulary that is dead weight in non-plugin repos. Stays in plugin's fragment file.

  • Fragments stored in any folder other than _wiki/.schema.d/. The merger only reads that one location; orphaned fragments elsewhere are invisible.

An example fragment is shipped at ../templates/_wiki.schema.d.example.yml.tmpl.

Why no per-page-type sub-folders. BCOS's standard is "flat in docs/ root with cluster: frontmatter for grouping, not subdirectories." Per-page-type folders (how-to/, runbook/, etc.) would duplicate the page-type: discriminator and force five places to touch when adding a new page-type: (1) frontmatter enum, (2) folder, (3) lint rules, (4) schema docs, (5) README. Flat keeps page-type: as the single source of truth — adding a new page-type is one schema edit. Folder is convenience; frontmatter is authority.

Why source-summary/ keeps its own folder. Source-summary pages are the only ones that have umbrella/sub/unified topology, are produced by a different ingest path, follow a different review cadence, and aligns with pin-llm-wiki's upstream layout. Co-locating them with internal pages would hide that asymmetry.

Why queue.md not inbox.md. Pin-llm-wiki's inbox.md is a single-file URL queue; BCOS's _inbox/ is a folder for triage. Different concepts, distinguishable names.

Why raw/ is nested inside _wiki/. Raw captures exist because of wiki ingest. _collections/ is for user-uploaded evidence with value independent of any wiki page. Co-location keeps the wiki ecosystem self-contained.

index.md is a derived artifact, not authored truth. It is a registry of pages — title, page-type, builds-on, last-reviewed — regenerated from frontmatter by refresh_wiki_index.py (shipped with the framework, wired into job-index-health.md). Hand-editing is wrong; if index.md looks stale, the fix is to run the refresh script, not to edit the file. This follows the same derived-artifact pattern as .claude/quality/ecosystem/state.json (lesson L-INIT-20260404-009: "State files record what discovery found, not the definition itself."). overview.md and log.md are NOT derived — they are authored by ingest (cross-source synthesis + append-only history).


Frontmatter Schema

BCOS's required fields, plus wiki-only discriminators. All fields kebab-case.

---
# ─── BCOS-required (same bar as data points) ────────────────────────────
version: 1.0.0
created: 2026-04-30                # immutable
last-updated: 2026-04-30           # bumped on every change
cluster: brand-identity            # primary cluster — must match an entry in cluster vocabulary (see Schema)
owner: gunti
status: active                     # value must come from .schema.yml `statuses:` list

# ─── BCOS ownership spec (Level 1 minimum) ──────────────────────────────
domain: "How to apply our brand voice on LinkedIn"
exclusively-owns:
  - LinkedIn-specific tone adjustments
  - LinkedIn formatting conventions
strictly-avoids:
  - The brand voice itself (lives in brand-voice.md)
  - Audience definitions (live in target-audience.md)

# ─── BCOS relationships (replaces pin-llm-wiki's `related:` and `tags:`) ─
# See "Reference format rule" — slugs intra-zone, paths cross-zone.
builds-on:                         # cross-zone (data points): relative paths with .md
  - ../brand-voice.md
  - ../target-audience.md
references:                        # intra-zone (other wiki pages): bare slugs, no .md
  - linkedin-best-practices
provides: []                       # rare for wiki — usually consumers, not producers

# ─── Wiki-specific ──────────────────────────────────────────────────────
page-type: how-to                  # value must come from .schema.yml `page-types:` registry
last-reviewed: 2026-04-30          # separate from last-updated; resets on human review

# ─── Provenance (NEW — for Path B local content; mirrors queue.md DSL for URLs) ──
provenance:
  kind: inbox-promotion            # url-fetch | inbox-promotion | local-document
  source-path: docs/_inbox/2026-04-15_acme-onboarding-notes.md  # original location
  captured-on: 2026-04-30
  promoted-by: gunti
  notes: ""                         # optional

# ─── Pin-llm-wiki shape discriminators (mutually exclusive — see "Three Structural Shapes") ──
# These are populated ONLY for page-type: source-summary
source-url: https://...
companion-urls: []
raw-files: []
subpages: []
parent-slug: null
detail-level: standard             # value must come from .schema.yml `detail-levels:` list
last-fetched: 2026-04-30
---

Page-type-specific frontmatter rules are defined in _wiki/.schema.yml (next-section). The frontmatter validation hook (PostToolUse on Edit/Write) reads the schema at validation time, so adding a new page-type is one schema edit — no code change.


Authority Semantics (schema 1.2)

Every wiki page declares an authority: value (or has one mechanically derived by the 1.1 -> 1.2 migration). Authority answers exactly one question:

How much trust does this page deserve when its claims conflict with canonical docs/*.md or with another wiki page?

Four values, ordered by trust-tier:

ValueWhat it isExampleTriage behavior on conflict
canonical-processInternal SOP / runbook / decision-log we live bypages/deploy-runbook.md (page-type: how-to)Other-page conflict: Class C (true contradiction) — interrupt user. External-page conflict: external loses by default.
internal-referenceUser-curated derivative; high trust but not the truth itselfpages/data-point-glossary.md (page-type: glossary)If overlaps with canonical, prefer canonical; surface as INFO.
external-referenceCaptured external source — informational, not authoritativesource-summary/openai-rate-limits.mdConflict with canonical: Class A (authority asymmetry) — auto-annotate the wiki page; suggest canonical-side review via morning digest.
external-evidenceVerbatim immutable extract; rare; explicit-onlyA regulatory-filing extract preserved as-isTreat as factual artifact; conflicts surface as INFO; never auto-edit.
Mechanical default mapping

The 1.1 -> 1.2 migration writes authority for every existing page using path + page-type + provenance.kind:

PathPage-typeDefault authority
_wiki/source-summary/(any)external-reference
_wiki/pages/how-to, runbook, decision-log, post-mortemcanonical-process
_wiki/pages/glossary, faqinternal-reference
_wiki/pages/(other / unknown)internal-reference (cautious fallback)

external-evidence is never assigned mechanically. It must be declared explicitly. Most evidence belongs in _collections/, not _wiki/ — this value exists for the rare case where a wiki page IS the evidence (e.g., regulatory filings where paraphrasing risks compliance).

Override rule

The migration is non-clobbering: if a page already declares authority:, the migration leaves it alone. When a user-declared value disagrees with the mechanical default — for example, a source-summary/ page tagged authority: canonical-process — /wiki lint emits authority-default-questionable (INFO). The lint asks "is this intentional?" but doesn't block.

The full audit trail (every per-page derivation) is appended to .claude/quality/migration-log.jsonl, so reverse migration can reconstruct original frontmatter.

Anti-patterns
  • Do not add a universal "always check the wiki first" rule. The wiki is layered; _wiki/source-summary/ is reference, not source-of-truth. The wake-up-context surfaces the authority hierarchy explicitly so consumers (LLM agents, builders, lint passes) read context with the right priority.

  • Do not treat external-evidence as a synonym for "I'm pasting verbatim text." Most paste-verbatim content is external-reference. Evidence implies legal/regulatory weight where the file IS the artifact.


Temporal Semantics (schema 1.2)

Most apparent contradictions between sources are not contradictions — they are temporal supersession. 2024 OpenAI pricing vs 2025 vs 2026 are each correct as of their time. Schema 1.2 introduces three optional fields on source-summary to encode this:

FieldShapeWhat it means
source-publishedYYYY-MM-DDWhen the source itself was published (distinct from last-fetched — when we grabbed it)
supersedeslist of bare slugs (intra-zone, D-04)Pages this one replaces — newer in time
superseded-bysingle bare slugThe page that replaces this one — used by chain-tail pages to point forward

A page can be a chain head (declares supersedes:) OR a chain tail (declares superseded-by:), not both. Lint enforces this via both-supersedes-and-superseded-by (ERROR).

Bidirectional rule

When ingest writes supersedes: [<predecessor-slug>] on page Y, it must also write superseded-by: <Y-slug> on the predecessor page. This mirrors the existing references: bidirectional rule in ingest.md Step 2a — a one-way link is a smell.

Cycle detection

A -> supersedes B -> supersedes A is rejected as supersession-cycle (ERROR). Cycles can only form via concurrent ingest of two pages that each claim the other as predecessor.

Class B triage uses these fields

When a new ingest enters a cluster where another source-summary already covers the same source-url with a different source-published, the triage detector classifies as Class B (temporal supersession candidate) and auto-writes the supersedes link with confidence >= 0.85. No callout, no interrupt — the wiki encodes the timeline cleanly.

Class D ("stale-canonical") complements this

When a newly ingested external source contains a fact that diverges from a canonical doc whose last-updated is older than the threshold, the daily wiki-canonical-drift job emits a wiki-canonical-drift-suggestion finding into the morning digest. The job NEVER edits canonical docs — it only suggests review.


Citation Rules

Adopt pin-llm-wiki's banner; combine with BCOS's link-don't-duplicate discipline.

Banner citation (top of every wiki page, immediately after H1 if any):

  • For page-type: source-summary:

    All claims below are sourced from ../raw/<type>/<slug>.md unless otherwise noted.

  • For all other page types:

    Canonical knowledge: brand-voice | target-audience — see those for the source of truth.

Per-paragraph inline citation only when a paragraph deviates from the banner sources.

Wikilink discipline:

  • [[wiki-slug]] — references to other wiki pages (zone-internal graph)

  • Markdown links [text](../brand-voice.md) — references to data points (cross-zone)

  • Both are graph edges. Lint can reverse-build a citation graph from these.

Reference format rule (normative — enforced by the frontmatter validator and lint):

WhereFormatExample
Intra-zone references in frontmatter (references:, subpages:, parent-slug:)Bare slug, no .mdlinkedin-best-practices
Intra-zone references in bodySlug wikilink [[...]][[brand-voice]]
Cross-zone references in frontmatter (builds-on: to data points)Relative path with .md../brand-voice.md
Cross-zone references in bodyMarkdown link with relative path[brand voice](../brand-voice.md)
Raw-file references (raw-files:)Relative path with .md../raw/web/example-com.md

Slugs survive renames within the zone (refactor-safe via /wiki schema rename); paths are necessary cross-zone because data points live in docs/, not _wiki/. Mixing the two — e.g., putting .md on intra-zone references — is a lint error (reference-format-mismatch).

Hard rule: a wiki page that restates a fact owned by a data point is a lint error (duplication-vs-data-point). Replace the restatement with a wikilink/markdown-link.


Three Structural Shapes (source-summary only)

Pin-llm-wiki's clean topology for external sources, kept verbatim. Discriminators are mutually exclusive — lint enforces this.

ShapeDiscriminator(s)WhenExample
Standalonenone of the belowSingle source, single pageYouTube talk; one-product website
Unified (web+github)companion-urls: + raw-files: (multiple)One product across a website and its companion repolangchain.com + github.com/langchain-ai/langchain
Umbrella + subumbrella has subpages: [...]; subs have parent-slug:One domain, multiple productslangchain.com → langgraph, langsmith

Lint check frontmatter-shape:

  • A page MUST be exactly one shape.

  • Subs must point to an existing umbrella (parent-slug resolves).

  • Umbrellas must not declare companion-urls: or raw-files:.

  • Unified pages must not declare subpages: or parent-slug:.

  • These rules apply only when page-type: source-summary.


Two Ingest Paths

There are two real paths through the wiki ingest pipeline, distinguished by where the content originates from. Both converge on the same page format, the same lint, the same log.md entry.

Path A — URL via queue (pin-llm-wiki native)

Trigger: "Add this URL to the wiki" / a URL appears in docs/_wiki/queue.md.

Flow: queue.md accumulates URLs → /wiki run (batch) or /wiki run <url> (single) → source-type detection (web/github/youtube) → fetch via gh, yt-dlp, or WebFetch → write verbatim capture to _wiki/raw/<type>/<slug>.md → ingest into _wiki/source-summary/<slug>.md → update overview.md and log.md → run refresh_wiki_index.py (regenerates index.md from frontmatter) → mark queue line <!-- ingested YYYY-MM-DD -->.

Use it for: external knowledge. The truth lives somewhere else and we want a citable, durable copy plus a wiki page.

Path B — Local content (covers _inbox/ promotions AND direct uploads)

Trigger: any local content the user wants in the wiki — pasted text, drag-dropped PDF/.docx, or a previously-captured file in docs/_inbox/.

Flow: /wiki create from <path-or-paste> → if path starts with docs/_inbox/, treat as inbox-promotion; if path is anywhere else (or content is pasted), treat as local-document; if file is binary (PDF, .docx, .zip), the binary lands at _wiki/raw/local/<slug>.<ext> AND a markdown extraction lands at _wiki/raw/local/<slug>.md; if pasted text or text file, it goes straight to _wiki/raw/local/<slug>.md → page authored at _wiki/pages/<slug>.md with full BCOS frontmatter including provenance: block recording the origin → standard finalization → if origin was _inbox/, the original _inbox/ file is deleted (its content now lives immutably in raw/local/).

Wiki ingest never writes to _collections/. _collections/ is the user's evidence zone — files-as-received with value independent of any wiki page. If the user explicitly wants the binary to also live in _collections/ as standalone evidence (e.g., a signed contract that's also the source for a wiki how-to), that's a separate /collections add operation. The wiki page can then builds-on: the _collections/ path. Implicit cross-zone writes blur the boundary; explicit ones don't.

Why one path, not two. The earlier draft split inbox-promotion and local-document into separate paths. They share 95% of the pipeline; the only real difference is the trigger. Collapsing to one path with provenance.kind: distinguishing the trigger is simpler. The triage signal coming into Path B can vary; the path itself doesn't.

Triage signals during context-ingest that suggest Path B (wiki-bound):

  • Content describes a how, process, or steps rather than a fact

  • Content is a post-incident narrative

  • Content is a glossary-shaped definition list

  • Content is a decision narrative (the why behind a choice)

Path Comparison
Path A (URL via queue)Path B (local content)
Source of contentExternal webLocal file, paste, or _inbox/
Verbatim copy lives in_wiki/raw/<type>/_wiki/raw/local/<slug>.md (text) and _wiki/raw/local/<slug>.<ext> (binary, if any)
Wiki page lives in_wiki/source-summary/_wiki/pages/
Provenance carrierHTML-comment DSL on queue.md lineprovenance: frontmatter block on the page
Three structural shapesYes (umbrella/sub/unified)No
Auto-discovery (companion repo, llms.txt)YesNo
Triggered by/wiki run or queue.md editcontext-ingest triage → /wiki create from

The HTML-Comment DSL on queue.md (Path A lifecycle)

Pin-llm-wiki's best mechanic: encode the entire lifecycle of a URL on one Markdown line, git-diffable.

## Pending
- [ ] https://blog.langchain.dev/state-of-ai-agents/         <!-- detail:deep -->
- [ ] https://github.com/langchain-ai/langchain              <!-- detail:standard branch:main clone -->
- [ ] https://youtube.com/watch?v=zjkBMFhNj_g                <!-- detail:standard -->
- [ ] https://example.com/docs                               <!-- companion:github.com/example/repo -->
- [ ] https://broken.example.com                             <!-- skip note:404 last checked 2026-04-15 -->

## Completed
- [x] https://anthropic.com/news/claude-3-7                  <!-- ingested 2026-04-22 -->
- [x] https://github.com/karpathy/llm-os                     <!-- ingested 2026-04-18 refresh -->
- [x] https://example.com/old-docs                           <!-- ingested 2026-03-30 -->

Tag vocabulary:

TagWhat it does
<!-- detail:brief|standard|deep -->Per-source detail-level override
<!-- branch:NAME -->GitHub: override default branch
<!-- clone -->GitHub deep mode: full git clone to raw/github/<slug>/
<!-- companion:URL -->Web: override companion-repo discovery
<!-- no-companion -->Web: suppress companion fetch
<!-- skip -->Mark line to skip on every run until removed
<!-- refresh -->Re-fetch on next run
<!-- note: ... -->User freeform comment
<!-- fetch-failed:REASON -->Auto-added on failure
<!-- ingested YYYY-MM-DD -->Auto-added when moved to Completed

The queue is the state machine. Git history shows every transition without a separate registry file.


Provenance for Path B (local content)

Path B has no equivalent of the queue.md state machine because there's no queue — the content arrives via direct command. Instead, every Path B page carries a provenance: frontmatter block that records the origin in a git-diffable way:

provenance:
  kind: inbox-promotion            # url-fetch | inbox-promotion | local-document
  source-path: docs/_inbox/2026-04-15_acme-onboarding-notes.md
  captured-on: 2026-04-30
  promoted-by: gunti
  notes: "From discovery call with Acme on 2026-04-15"

Refresh logic for Path B content:

  • kind: inbox-promotion: source has been deleted from _inbox/ after promotion. Refresh = N/A; the raw capture in _wiki/raw/local/ IS the durable copy. To "refresh," user provides new content via /wiki create from <path> and existing page is updated, with last-updated bumped and an entry in log.md.

  • kind: local-document (file still on disk somewhere accessible): refresh re-reads the source file, hash-compares against the raw capture, and updates the wiki page if changed. If the file is no longer accessible, lint reports provenance-source-missing (INFO).

  • kind: url-fetch: see "Refresh-Must-Rediscover" below; this kind only appears on _wiki/source-summary/ pages.

The provenance: block makes Path B's lifecycle just as auditable as Path A's queue.md.


Detail Level as Cost Knob

Three levels with explicit cost expectations — forces honest tradeoffs at queue time. Values come from _wiki/.schema.yml detail-levels: list (default [brief, standard, deep]).

LevelWebGitHubYouTubeApprox tokensApprox cost (Sonnet)
briefLanding page onlyREADME onlyMetadata + chapters; no transcript5–15k<$0.05
standardLanding + 4–10 docs pagesREADME + key docs filesMetadata + chapters + transcript30–80k$0.10–0.30
deepFull docs crawl + companion repo discovery + multi-product splitREADME + docs/ tree + (optional) full cloneStandard + deep transcript scrub100–500k+$0.50–3.00

Token guard at 200k: any single fetch that would cross 200k tokens halts and asks the user to confirm or downgrade detail level. Generalized to BCOS bulk operations (context-mine on long transcripts, context-audit on 100+ doc bases).


Operational Discipline — Sub-Agent Isolation

Big-body wiki work happens in .claude/agents/wiki-fetch/AGENT.md, not in the main thread. The principle: expensive reads should produce small returns. A 100k-token URL fetched into main saturates the context window before a single page lands; the same is true for deep PDFs, .docx exports, and full-tier source-summary refreshes.

Every Path-A and Path-B body fetch dispatches via the Task tool with the wiki-fetch sub-agent. The sub-agent does the read + extract + suggest, writes the raw body to disk under _wiki/raw/<type>/, and returns a structured ≤4000-token summary (title, h2-outline, key-sentences, suggested-page-type, suggested-cluster, raw-file-pointer, citation-banner-fields). Main never holds the full body.

PathOperationSub-agent kindWhat main thread receives
Path A — /wiki runURL fetch (web/github/youtube)web / github / youtubeStructured summary; raw at _wiki/raw/<type>/<slug>.md
Path A — /wiki refresh full-tierRe-fetch source-summarymatches existing source-typeStructured summary + delta; main compares against stored frontmatter
Path B — /wiki promote (binary)PDF/.docx extractionpdf / docxStructured summary; raw at _wiki/raw/local/<slug>.md (binary preserved at <slug>.<ext>)
Path B — /wiki create from <path>Local file extractionpdf / docx / localStructured summary; raw at _wiki/raw/local/<slug>.md

Cumulative budget guard. Across N parallel sub-agent invocations in /wiki run batch mode, the calling skill consults _wiki_budget.decide_dispatch_strategy() before dispatching. The rule: cumulative projected return tokens (N × 4000) must stay ≤ 80% of main-context limit. Above that, sub-agents serialize — the next batch waits for the previous batch's results to free up budget.

Result validation. Every sub-agent return passes through _wiki_fetch_contract.validate_result() before the calling skill writes anything. Malformed outputs (missing required fields, oversized payload, type mismatches) are rejected with a clear error rather than producing a malformed wiki page.

The anti-inline-fetch rule. run.md Step 4 contains an explicit "do not fetch inline" directive. If a future edit brings inline-fetching back, test_wiki_fetch.py::WikiFetchSkillDispatchWiringTests fails — the wiring discipline is mechanically enforced.

The 15-test regression at test_wiki_fetch.py covers: agent contract shape, dispatch wiring across run/refresh/promote/create, cumulative budget math, and result-schema validation across canonical / error / malformed / oversized variants.


Refresh-Must-Rediscover (Path A only)

When a source-summary page is fully refreshed, the fetch protocol must re-run discovery from scratch — not assume the prior topology is still valid:

  • A site that was single-product may have launched a second product → must re-detect multi-product split

  • A site that was unified may have moved docs to a separate repo → must re-detect

  • A landing page may now link to an llms.txt it didn't have before → must re-check

This is an anti-shortcut rule. Without it, refresh becomes "re-fetch the URLs we already had," and the wiki silently drifts from the source's actual structure. If topology changed, the prior wiki page is superseded (status: archived; new page(s) created).

Two-tier cadence (token-cost optimization). Full rediscover is expensive. To bound cost on large wikis, the wiki-source-refresh job runs in two tiers:

  1. Quick-check tier (default cadence: stale_threshold_days / 4, e.g. 7 days when the default is 28). Issue an HTTP HEAD against the umbrella URL via _wiki_http.head_check. Compare the returned etag / last-modified against the values stored in the source-summary page's frontmatter via head_signals_unchanged(). If unchanged, bump last-fetched and skip. If validators differ or are missing, escalate to full rediscover immediately, regardless of where we are in the default tier. The stored content-hash (schema 1.1) is NOT consulted at this tier — a body hash is a full-tier validator, not a HEAD-response signal.

  2. Default tier (stale_threshold_days, e.g. 28 days). Full refresh-must-rediscover. After wiki-fetch returns the body, the main thread calls _wiki_http.body_content_unchanged() against the stored content-hash — this catches the "ETag drifted but bytes identical" case. Runs whether or not the quick-check has fired in the interim.

The HEAD-check is a freshness signal, not a substitute for rediscover. Topology changes (new sub-products, llms.txt added, companion repo split) often happen without ETag/Last-Modified moving — so the default tier catches them. Weak ETags (W/"...") are normalized for comparison; servers that omit ETag fall back to Last-Modified; missing both validators escalate to full rediscover (the helper never auto-decides "unchanged" without evidence).

Layered validators (schema 1.1): etag + last-modified are HEAD-tier (cheap, no body); content-hash is full-tier (computed once a body is fetched). They live in the same source-summary frontmatter but answer different questions and run at different cadences.

A manual <!-- refresh --> queue tag always triggers the default tier (skips quick-check).


Maintenance Pipeline

Audit of pin-llm-wiki's 12 lint checks
pin-llm-wiki checkVerdictWhy
#1 Citation coverageKeep + extendBanner cites must include builds-on data points for derivative pages
#2 Contradictions (deferred)ReplaceUse BCOS's existing 5-path contradiction handling from context-ingest
#3 OrphansKeepPage with zero inbound [[wikilinks]] and no edits in 12 months → archive candidate
#4 Missing wikilinksKeep + extendAlso flag missing markdown-links to data points
#5 Stale sourcesReplaceUse propagation-based: builds-on.last-updated > self.last-reviewed
#6 Terminology collisionsReplaceUse BCOS strictly-avoids enforcement
#7 Frontmatter shapeKeep + mergeMove into PostToolUse hook so it runs on every save
#8 Citation path formatKeepRelative paths must resolve from current page location
#9 Inbox consistencyKeep + extendApply to BCOS's _inbox/ too (Path B left no orphans)
#10 Adapter syncDropBCOS has one CLAUDE.md; no adapter problem
#11 Split-productReplaceUse BCOS's "merge data points when…" guidance
#12 Parent-child consistencyKeepUmbrella ↔ sub frontmatter must be consistent
New BCOS-specific checks
CheckWhat it doesSeverity
duplication-vs-data-pointWiki page restates content found in a builds-on data pointWARN
coverage-gapActive data point with no wiki explainer + frequent mention in _inbox/ capturesINFO
source-summary-upstream-changedlast-fetched > stale_threshold_days AND HEAD check confirms upstream changedINFO
cluster-mismatchWiki page's cluster: doesn't match its builds-on data points' cluster:WARN
forbidden-builds-on-targetbuilds-on includes a path under _planned/, _inbox/, or _archive/ (configurable in .schema.yml)ERROR
provenance-source-missingPath B kind: local-document page references a source-path that no longer exists on diskINFO
schema-violationFrontmatter value not in .schema.yml enum (e.g., page-type: foo when foo not registered)ERROR
Auto-fixes (whitelisted in schedule-config.json)
  • Run refresh_wiki_index.py to regenerate _wiki/index.md from frontmatter (replaces the obsolete "insert overview/log link" auto-fix — the regenerator always includes those links)

  • Rewrite citation paths when data points are renamed (when redirect map provided)

  • Mark queue lines <!-- ingested YYYY-MM-DD --> after successful Path A run

  • Move expired post-mortems to status: archived when auto-archive-after-days (per-page-type schema setting) elapses


Scheduled Jobs

Four jobs added to .claude/quality/schedule-config.json (and template). All wire into schedule-dispatcher.

{
  "jobs": {
    "wiki-stale-propagation": {
      "enabled": true,
      "schedule": "daily",
      "_about": "When a data point's last-updated advances, flag every wiki page whose builds-on includes that data point as needs-review (until human resets last-reviewed)."
    },
    "wiki-source-refresh": {
      "enabled": true,
      "schedule": "weekly",
      "_about": "Two-tier refresh on source-summary pages. (1) Quick-check tier (default cadence: stale_threshold_days/4): HEAD-check upstream; if hash unchanged, bump last-fetched and skip. (2) Default tier (stale_threshold_days): full refresh-must-rediscover regardless of HEAD result — re-runs source-type detection, product-discovery, companion-repo discovery from scratch. HEAD-check is a freshness signal, not a substitute for rediscover."
    },
    "wiki-graveyard": {
      "enabled": true,
      "schedule": "monthly",
      "_about": "Pages with last-reviewed > 12 months AND no recent inbound traffic → AskUserQuestion about archive."
    },
    "wiki-coverage-audit": {
      "enabled": true,
      "schedule": "quarterly",
      "_about": "Daydream-adjacent. Two outputs: (1) which active data points lack a wiki explainer? (2) Vocabulary suggestions: any frequently-used `<!-- note: -->` keywords or recurring page tags that should be promoted to a registered page-type in .schema.yml?"
    }
  },
  "auto_fix": {
    "whitelist": [
      "wiki-index-refresh",
      "wiki-mark-queue-ingested",
      "wiki-archive-expired-post-mortem",
      "wiki-rewrite-citations-on-rename"
    ]
  }
}

Cadence rationale:

  • Daily for wiki-stale-propagation — propagation events are the highest-value signal; cheap to compute (read frontmatter only, no fetches).

  • Weekly for wiki-source-refresh — fetch cost is non-trivial; daily is overkill, monthly is too slow. HEAD-check skips unchanged sources to keep the cost bounded.

  • Monthly for wiki-graveyard — slow-moving by nature; running daily would generate noise.

  • Quarterly for wiki-coverage-audit — daydream-territory, expensive synthesis; the vocabulary-suggestion sub-check needs accumulated usage data.

All cadences and thresholds (graveyard age, stale-day count, coverage-audit lookback) are tunable per repo via _wiki/.schema.yml and _wiki/.config.yml. The schedule-tune skill is the user-facing surface for changing them.


/wiki Command Surface

Two ingest entry points + management + schema governance.

# Ingest
/wiki run                          # Batch process all "Pending" entries in queue.md (Path A)
/wiki run <url>                    # Single-URL ingest, ad-hoc (Path A)
/wiki create from <path-or-paste>  # Path B — auto-detects if origin is _inbox/ and adjusts provenance

# Management
/wiki review <page>                # Bump last-reviewed; optionally re-pull builds-on data points to verify
/wiki archive <page>               # Soft-delete to _wiki/.archive/ with dangling-reference scan
/wiki refresh <page>               # Re-fetch a source-summary page (refresh-must-rediscover applies)
/wiki lint                         # Run wiki-specific checks on demand (also runs via schedule)

# Schema governance (see "Schema and Governance" section)
/wiki schema list                  # Show current vocabulary
/wiki schema add page-type <name>  # Add new page-type via AskUserQuestion-driven prompts
/wiki schema rename page-type <from> <to>     # Migrate frontmatter on all pages; record in log.md
/wiki schema retire page-type <name>          # Mark deprecated; lint existing pages with migration hint
/wiki schema validate              # Walk every page; verify against current schema
/wiki schema migrate <from-version> <to-version>  # Versioned migration with dry-run diff

All decision points use AskUserQuestion per BCOS's decision-point UX rule.


Inbox Reconciliation

Two inboxes is the wrong answer. The reconciliation:

  • docs/_inbox/ stays the unified BCOS triage zone for anything unclassified

  • docs/_wiki/queue.md is an intentional URL queue (Path A only)

  • context-ingest gets Path 7 in its triage tree: when classifying an _inbox/ item as wiki-bound, it hands off to /wiki create from <_inbox/path> (Path B with kind: inbox-promotion provenance), or extracts URLs from the capture and routes them into _wiki/queue.md

This preserves the single-entry-point principle while letting the wiki own its specialized URL pipeline.


What We Drop from pin-llm-wiki

  • AGENTS.md and the cross-tool adapter pattern. BCOS has one CLAUDE.md.

  • The tags: [] and related: [] fields. Replaced by directional builds-on, references, provides and categorical cluster.

  • The product: field. Replaced by cluster: (BCOS native).

  • Pin-llm-wiki's interview-style init flow. Replaced by AskUserQuestion-driven config.

  • Versionless frontmatter. Replaced by BCOS's version: + last-updated: discipline.

  • Per-page-type sub-folder structure. Page-type lives in frontmatter; folder layout is flat (pages/).


What We Adopt as-is from pin-llm-wiki

  • HTML-comment DSL on queue.md (Path A lifecycle) — git-diffable state machine

  • Banner citation pattern — extended to BCOS's builds-on model

  • Three structural shapes (standalone / unified / umbrella+sub) for source-summary

  • Detail-level cost knob with token + dollar estimates and 200k token guard

  • Refresh-must-rediscover anti-shortcut rule

  • Source-type fetch protocols — gh, yt-dlp, web crawler with companion + llms.txt discovery

  • Soft-delete with dangling-reference scan

  • Append-only wiki/log.md


Boundary with lessons.json

BCOS's lessons.json (maintained by lessons-consolidate) and the wiki's post-mortem and decision-log page-types overlap in domain (institutional knowledge). The boundary:

Lives in lessons.jsonLives in _wiki/pages/
FormAtomic, structured: one principle + tags + provenanceLong-form narrative: multi-paragraph story
LengthOne to three linesPage-length
Question it answers"What rule should I follow?""What happened? What did we decide and why?"
Plural?Many small entriesOne narrative per incident/decision
Example"Always check Stripe webhook signatures before processing — see q1-pricing-incident"The full q1-pricing-incident.md post-mortem

The flow: a post-mortem (wiki page) is a narrative source. Reading the post-mortem produces zero or more atomic lessons that lessons-consolidate extracts into lessons.json. The lesson cites the post-mortem in its provenance; the post-mortem links back via wikilink/reference.

daydream and wiki-coverage-audit cross-reference both: a wiki post-mortem with no extracted lessons is a candidate for lessons-consolidate; a recurring lesson that points to no post-mortem is a candidate for new wiki-page authoring.


Schema and Governance

Vocabularies in BCOS should grow with the business, not be chiseled in stone. The wiki zone exposes its vocabulary via a single registry file, _wiki/.schema.yml, that drives validation, lint, and tooling. Every type, category, and constraint lives in one place. Schema-versioned. Migrating between versions is a defined operation.

_wiki/.schema.yml registry
schema-version: 1
last-updated: 2026-04-30
last-migrated: null                  # set by `/wiki schema migrate`

page-types:
  how-to:
    description: "Procedural — steps for accomplishing a task"
    required-fields: [builds-on]
    review-cadence-days: 180
  glossary:
    description: "Term definitions for newcomers"
    required-fields: []
    review-cadence-days: 365
  source-summary:
    description: "External source captured via Path A (URL via queue)"
    required-fields: [source-url, last-fetched, detail-level]
    structural-shapes: [standalone, unified, umbrella-sub]
    review-cadence-days: 90
  # add page-types as you discover them; suggested next:
  # runbook, post-mortem, decision-log, faq, playbook, tutorial, meeting-notes

statuses: [active, under-review, archived]
detail-levels: [brief, standard, deep]
provenance-kinds: [url-fetch, inbox-promotion, local-document]

# Cluster vocabulary inherits from BCOS (single source of truth)
cluster-source: docs/document-index.md
allow-cluster-not-in-index: false    # strict; or true to permit wiki-only clusters

# Lint: forbid building on non-canonical sources
forbid-builds-on-paths:
  - _planned/
  - _inbox/
  - _archive/

# What `bcos init` should scaffold in a new repo
bootstrap-defaults:
  page-types: [how-to, glossary, source-summary]
  note: "Start small. Add page-types as you discover real categories you keep wanting."
Governance operations
CommandWhat it does
/wiki schema listShow current vocabulary (read-only inspection)
/wiki schema add page-type <name>Edit .schema.yml; AskUserQuestion-driven prompts for required-fields, description, cadence; lint validates; record in log.md
/wiki schema rename page-type <from> <to>Migrate page-type: frontmatter on all matching pages; offer related rewrites; record migration in log.md
/wiki schema retire page-type <name>Mark deprecated in schema; lint existing pages of that type with migration hint; doesn't delete
/wiki schema validateWalk every page; verify against current schema; report violations
/wiki schema migrate <from> <to>Versioned migration with dry-run diff before applying
Migration safety net (dry-run diff)
$ /wiki schema rename page-type how-to procedure

Migration plan:
  Update frontmatter:   12 pages       (page-type: how-to → page-type: procedure)
  Update schema:        .schema.yml    (page-types.how-to → page-types.procedure)
  Update lint config:   1 reference
  Update README:        2 mentions
  Log entry:            _wiki/log.md   (migration: schema 1 → 2)

Proceed? [Yes / Show diff / No]    ← AskUserQuestion

The log entry records the inverse migration so it's reversible.

Bootstrap behavior on bcos init in a new repo
  • .schema.yml is scaffolded with sensible defaults — initially just how-to, glossary, source-summary (the three universal categories)

  • Header comment: "Review this. Add page-types as you discover real categories you keep wanting."

  • The wiki-coverage-audit quarterly job gains a sub-check: vocabulary suggestion — "You keep tagging pages with <!-- note:meeting-notes -->. Add meeting-notes as a registered page-type?" Real-usage drives schema growth, not upfront speculation.

Same pattern, other registries

For consistency across BCOS, the schema-driven approach applies beyond the wiki:

  • _collections/.schema.yml — collection sub-types, manifest-schema column requirements, naming conventions, archive policy. See collections-zone.md.

  • .claude/quality/lint-checks.json — registry of lint check IDs, severity, scope. New checks register here without code changes to the dispatcher.

  • .claude/quality/schedule-config.json — already exists; we add a required _about field so the catalog is self-documenting.

The principle: adding a category should be one edit, not five.


Retrieval — Today and Tomorrow

The wiki zone is now a read store, not just a write store. Mechanical cross-zone search shipped in P2 of the wiki-missing-layers plan (2026-05-04). The graph/embeddings layers below are still future-looking and ship behind P6 (conditional on real precision needs).

What's shipped — mechanical cross-zone search (P2)

/context search "<query>" and the wiki-scoped sugar /wiki search "<query>" both run mechanical BM25-style ranking over .claude/quality/context-index.json — the canonical corpus that context_index.py builds from docs/. The engine lives at context_search.py; the skill surface lives at context-routing/SKILL.md and bcos-wiki/search.md.

Three rules are load-bearing:

  1. Mechanical-first (D-10 strict). The default path is pure Python, deterministic, ms-latency. The engine never decides on its own to call the LLM. The only LLM-touching path is --semantic, which the user opts into explicitly. There is no auto-trigger on 0-hit, no fallback, no hidden cost.

  2. Stable citation-ids. Every hit returns citation-id: zone:slug (e.g., wiki:linkedin-tone, active:pricing, planned:wiki-missing-layers). Path-derived; survives whitespace edits; cited back by other agents and by P5 bundle output.

  3. Empty zones are graceful. When _wiki/ is not initialized in a fresh repo, search returns [] for the wiki zone and surfaces it under zones-skipped-not-present. Not a hard failure.

The 15-test regression at test_context_search.py covers the shared schema, ranking, zone filter, top-K cap, citation stability, the D-10 escalation rules, the empty-corpus path, and CLI smoke tests.

Graph readiness

The frontmatter is already a typed-edge graph specification:

FieldEdge typeDirection
builds-onDERIVES_FROMwiki → data-point or wiki → wiki
referencesCITESwiki → wiki (peer)
providesSUPPLIES_TOwiki → consumer (rare)
raw-filesCAPTURED_FROMwiki → raw artifact
companion-urlsUNIFIED_WITHsource-summary → URL
subpagesUMBRELLA_OFsource-summary → source-summary
parent-slugSUB_OFsource-summary → source-summary
provenance.source-pathPROMOTED_FROM or EXTRACTED_FROMwiki page → original artifact path
[[wikilink]] in bodyMENTIONSwiki → wiki (with surrounding-text context)

A graph generator can walk _wiki/ + docs/*.md + _collections/ and emit nodes (with frontmatter as attributes) + edges (with provenance). The Context Atlas (.claude/scripts/bcos-dashboard/atlas_collectors.py) already does this for data points; extending to wiki + collections is mechanical.

Chunking readiness
  • Consistent H2 structure, no horizontal rules between sections → each ## H2 is a chunk candidate

  • Banner citation at top → every chunk inherits provenance via the page-level banner

  • Frontmatter is page-level metadata → each chunk carries cluster, page-type, builds-on, last-updated for filtering

  • Stable kebab-case slugs → chunk IDs don't change when content edits happen

  • No H1 inside body (filename = title) → no ambiguity about which heading is the page title

Embedding-update logic

Same trigger logic as wiki-stale-propagation:

  • A data point's last-updated advances → re-embed every wiki page that builds-on it (chunk-granular)

  • A raw file is overwritten → re-embed every wiki page whose raw-files: includes it

  • Pages older than last-reviewed > 12 months flagged for re-embed regardless

The lint pipeline that flags review candidates IS the re-embedding queue.

Provenance-grounded retrieval

A retrieval that returns a wiki chunk can cite, in order: (1) the chunk's section heading; (2) the page-level banner (builds-on: data points); (3) the page-level raw-files: (verbatim source); (4) the page-level last-reviewed (freshness). No chunk is orphaned from its provenance chain.

What's deliberately NOT pre-built

We don't add explicit chunk-boundary markers, pre-computed embeddings, or a graph-store schema now. The data is already shaped so when those layers land, they slot in without re-formatting the existing wiki.


Boundary with Strict Ownership

Wiki pages still declare domain + exclusively-owns (within the wiki's universe of explanation). A how-to owns "LinkedIn-specific tone adjustments" exclusively — no other how-to should claim that. But a wiki page's exclusively-owns is about explanation, not canonical truth. Two pages can explain the same data point from different angles (e.g., linkedin-tone.md and customer-success-emails.md both build on brand-voice.md) — they own different applications of the canonical truth.

The duplication-vs-data-point lint catches the failure mode where a wiki page accidentally tries to own canonical content (which already lives in a data point).


Adoption Plan

The pin-llm-wiki repo at https://github.com/ndjordjevic/pin-llm-wiki provides Path A end-to-end. Adoption steps:

1. Skill scaffolding (code-free — pin-llm-wiki is pure markdown instructions):

  • Copy skills/pin-llm-wiki/ → .claude/skills/wiki-manage/

  • Patch templates: inbox.md → queue.md; wiki/sources/ → _wiki/source-summary/; raw/ → _wiki/raw/; raw/<type>/README.md → raw/<type>/_manifest.md (cross-zone consistency with _collections/)

  • Replace per-page-type folder writes with flat _wiki/pages/<slug>.md

  • Rename config: .pin-llm-wiki.yml → _wiki/.config.yml

  • Add _wiki/.schema.yml scaffold with bootstrap-defaults

  • Add Path B as new sub-flow (referencing Path A's ingest pipeline as the shared transformation, with provenance: frontmatter populated from origin detection)

  • Drop AGENTS.md template; merge instructions into wiki-manage/SKILL.md

  • Replace prose-style init with AskUserQuestion-driven config

2. Frontmatter migration:

  • Replace pin-llm-wiki's loose schema with the BCOS-aligned schema above

  • Extend the existing PostToolUse hook to read _wiki/.schema.yml and enforce schema-defined rules

  • Add provenance: block validation for Path B pages

3. Lint migration:

  • Implement the keep/replace/drop matrix

  • Add the seven new BCOS-specific checks (including forbidden-builds-on-target, provenance-source-missing, schema-violation)

  • Wire into .claude/quality/schedule-config.json

4. context-ingest extension:

  • Add Path 7 to the triage tree (content-routing.md): wiki promotion

  • Wire _inbox/ items classified as wiki-bound to /wiki create from <_inbox/path> (Path B with inbox-promotion provenance)

5. Schema governance:

  • Implement /wiki schema command surface

  • Wire schema-driven validation into the PostToolUse hook

  • Add quarterly vocabulary suggestion sub-check to wiki-coverage-audit

6. Documentation updates:

  • ✅ Add _wiki/ row to CLAUDE.md Folder Trust Levels — done

  • ✅ Add _wiki/ row to folder-conventions.md — done

  • Add Path 7 (wiki promotion) to content-routing.md triage tree

  • Update metadata-system.md with page-type enum + wiki-specific frontmatter fields (or, better: point to _wiki/.schema.yml as the source of truth)

7. Bootstrap defaults for new repos:

  • bcos init scaffolds _wiki/.schema.yml with [how-to, glossary, source-summary] only

  • Header comment instructs the user to grow the vocabulary as real categories emerge

  • Quarterly wiki-coverage-audit surfaces vocabulary suggestions from real usage

8. License / attribution:

  • pin-llm-wiki is Apache 2.0

  • Attribution preserved in adapted skill's SKILL.md header

Out of scope for v1:

  • Atlas / galaxy node-type extension to render wiki pages distinctly

  • Pre-computed graph export to a vector/graph store

  • Cross-tool adapter (AGENTS.md) — revisit only if BCOS-wide need emerges


See Also

  • collections-zone.md — Sibling zone for verbatim evidence. Wiki ingest (Path B) does NOT write to _collections/ — that's reserved for explicit user /collections add actions. _wiki/raw/<type>/ uses the same _manifest.md pattern as _collections/<type>/_manifest.md (cross-zone consistency); both zones use .schema.yml registries.

  • content-routing.md — How content flows into the data-point zone (docs/*.md)

  • metadata-system.md — Canonical frontmatter field reference (the wiki adds wiki to the type enum and a wiki-only fields section)

  • system-design.md — Why zones exist; the philosophical underpinning

  • ../guides/folder-conventions.md — Folder-level rules across all zones

  • ../methodology/document-standards.md — Frontmatter + ownership-spec authoritative reference

  • ../templates/_wiki.schema.yml.tmpl — Wiki vocabulary registry template

  • pin-llm-wiki upstream — https://github.com/ndjordjevic/pin-llm-wiki


Status: v3 design — schema-governance layer added; canonical (parallel draft-a retired 2026-05-01); ready for skill scaffolding. Created: 2026-04-30 Last Updated: 2026-05-13 Version: 3.2.0

v3.2.0 — 2026-05-13: Reframed the "Why Wiki Zone Exists" opening to explicitly anchor the wiki as BCOS's universal long-form / cross-cutting content destination per plugin-storage-contract.md Rule 2. Three content categories surfaced (operational truth, internal reference, plugin cross-cutting + external sources) instead of a single "operational/explanatory" framing. Added explicit "what does NOT belong" callouts (canonical data points, plugin-private structured records, legal-weight evidence). Diagnosed via a downstream session where an agent inferred "wiki = URLs only" from the prior framing and dumped a runbook into docs/operations/. See .claude/quality/sessions/20260513_103523_wiki-reframe-autoinit/ for the full plan.

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