QualityHub: det nye private repo faar sit eget navn

Michaels beslutning: det private repo hedder Curabis/QualityHub.
Fordele: ingen omdoebnings-dans med den gamle fork (frisk repo, frisk
navn), og QualityHub er brandbart som CURABIS-produkt - det er ikke
laengere bare en BCQuality-fork, det er hjemstedet for hele
kvalitetsapparatet (regler + agenter + setup + governance).

Navneskel: repoet og kanal-klonen hedder QualityHub
(%USERPROFILE%\.claude\QualityHub); STANDARDEN indeni hedder fortsat
BCQuality (Microsofts tre-lags koncept, som 40+ regelfiler og alle
agenter refererer). Kun infrastruktur-referencer er skiftet:
git-URL'er og klon-stier i sync, onboarding, setup v19, maskin-
CLAUDE.md, CONSUMPTION, agent-fallbacks og Francis' felt-routing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Michael Dieringer 2026-07-03 17:59:33 +02:00
parent 3ce08fe91e
commit 68a3f6dffa
10 changed files with 34 additions and 34 deletions

View file

@ -41,7 +41,7 @@ future CI/PR-review integration:
## Access model: PRIVATE repo, git-based consumption ## Access model: PRIVATE repo, git-based consumption
BCQuality is a **private** repository. All consumption is git-based through BCQuality is a **private** repository. All consumption is git-based through
the **channel clone** at `%USERPROFILE%\.claude\BCQuality`, pinned to the the **channel clone** at `%USERPROFILE%\.claude\QualityHub`, pinned to the
`stable` branch. Authentication is Git Credential Manager — the developer's `stable` branch. Authentication is Git Credential Manager — the developer's
existing GitHub login; the first git contact opens a browser login, and that existing GitHub login; the first git contact opens a browser login, and that
is the entire token story. `raw.githubusercontent.com` and unauthenticated is the entire token story. `raw.githubusercontent.com` and unauthenticated
@ -51,8 +51,8 @@ GitHub-API calls are dead and must not appear in any consumer.
Two lines (idempotent — safe to re-run; the clone prompts the GCM login): Two lines (idempotent — safe to re-run; the clone prompts the GCM login):
git clone --branch stable --single-branch https://github.com/Curabis/BCQuality.git "$env:USERPROFILE\.claude\BCQuality" git clone --branch stable --single-branch https://github.com/Curabis/QualityHub.git "$env:USERPROFILE\.claude\QualityHub"
powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\BCQuality\custom\setup\machine\Install-CurabisMachine.ps1" powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\QualityHub\custom\setup\machine\Install-CurabisMachine.ps1"
It installs the global CLAUDE.md (identity substituted from git config), It installs the global CLAUDE.md (identity substituted from git config),
bc-mcp-bridge.js, the bc-mcp config template (the developer inserts their bc-mcp-bridge.js, the bc-mcp config template (the developer inserts their

View file

@ -78,7 +78,7 @@ reviews what happened. He asks one question about every significant event:
He compares against the full BCQuality knowledge base — the machine-local He compares against the full BCQuality knowledge base — the machine-local
mirror at `%USERPROFILE%\.claude\bcquality-knowledge\custom\` (fallback: the mirror at `%USERPROFILE%\.claude\bcquality-knowledge\custom\` (fallback: the
channel clone `%USERPROFILE%\.claude\BCQuality\custom\knowledge\`). channel clone `%USERPROFILE%\.claude\QualityHub\custom\knowledge\`).
Domains: `architecture/`, `testing/`, `mcp/` Domains: `architecture/`, `testing/`, `mcp/`
## The Two Proposal Types ## The Two Proposal Types
@ -161,7 +161,7 @@ delivery channel depends on where Francis fires:
1. **Michael's machine (mid):** the full pipeline runs locally — Immanuel 1. **Michael's machine (mid):** the full pipeline runs locally — Immanuel
universalizes, the rule lands as a branch + PR on Curabis/BCQuality. universalizes, the rule lands as a branch + PR on Curabis/BCQuality.
2. **Any other machine (field):** file the proposal as a **GitHub Issue** on 2. **Any other machine (field):** file the proposal as a **GitHub Issue** on
`Curabis/BCQuality` with the complete Ferencz-format brief (Observation, `Curabis/QualityHub` with the complete Ferencz-format brief (Observation,
Evidence with citations, Suggested rule/filename, Context). The issue IS Evidence with citations, Suggested rule/filename, Context). The issue IS
the docket entry; universalization and the PR happen on the governance the docket entry; universalization and the PR happen on the governance
side. If `gh` is unavailable, hand the finished brief to the developer side. If `gh` is unavailable, hand the finished brief to the developer

View file

@ -179,7 +179,7 @@ POST https://api.github.com/repos/Curabis/BCQuality/pulls
### Step 5 — Report PR URL to user ### Step 5 — Report PR URL to user
``` ```
PR åben: https://github.com/Curabis/BCQuality/pull/<number> PR åben: https://github.com/Curabis/QualityHub/pull/<number>
Afventer Michaels godkendelse via GitHub-merge. Afventer Michaels godkendelse via GitHub-merge.
``` ```

View file

@ -30,7 +30,7 @@ param(
# LEGACY: repoet er privat - raw-URLs virker ikke laengere. Brug altid en # LEGACY: repoet er privat - raw-URLs virker ikke laengere. Brug altid en
# lokal klon; kanal-klonen findes paa alle onboardede maskiner: # lokal klon; kanal-klonen findes paa alle onboardede maskiner:
# -BCQualityHome "$env:USERPROFILE\.claude\BCQuality" # -BCQualityHome "$env:USERPROFILE\.claude\QualityHub"
[string]$RawBase = '', [string]$RawBase = '',
[switch]$Quiet [switch]$Quiet

View file

@ -37,24 +37,24 @@ Detect which mode based on the trigger phrase and proceed accordingly.
## Source: the channel clone (BCQuality is PRIVATE — no raw URLs) ## Source: the channel clone (BCQuality is PRIVATE — no raw URLs)
All artifacts come from the machine's **channel clone** — a git clone of All artifacts come from the machine's **channel clone** — a git clone of
`Curabis/BCQuality` pinned to the `stable` branch. Authentication is Git `Curabis/QualityHub` pinned to the `stable` branch. Authentication is Git
Credential Manager (the developer's existing GitHub login); there are NO Credential Manager (the developer's existing GitHub login); there are NO
tokenless raw.githubusercontent fetches anywhere — the repo is private. tokenless raw.githubusercontent fetches anywhere — the repo is private.
``` ```
SRC = %USERPROFILE%\.claude\BCQuality (kanal-klonen, stable) SRC = %USERPROFILE%\.claude\QualityHub (kanal-klonen, stable)
BASE = {SRC}\custom\setup BASE = {SRC}\custom\setup
AGENTS_BASE = {SRC}\custom\agents AGENTS_BASE = {SRC}\custom\agents
``` ```
**Before ANY Mode A/B work, ensure the channel clone is fresh:** **Before ANY Mode A/B work, ensure the channel clone is fresh:**
git -C "$env:USERPROFILE\.claude\BCQuality" fetch origin stable --quiet git -C "$env:USERPROFILE\.claude\QualityHub" fetch origin stable --quiet
git -C "$env:USERPROFILE\.claude\BCQuality" checkout -B stable origin/stable --quiet git -C "$env:USERPROFILE\.claude\QualityHub" checkout -B stable origin/stable --quiet
If the clone is missing entirely: If the clone is missing entirely:
git clone --branch stable --single-branch https://github.com/Curabis/BCQuality.git "$env:USERPROFILE\.claude\BCQuality" git clone --branch stable --single-branch https://github.com/Curabis/QualityHub.git "$env:USERPROFILE\.claude\QualityHub"
**Vocabulary:** wherever this document says "fetch", it means **copy the file **Vocabulary:** wherever this document says "fetch", it means **copy the file
from SRC** — a filesystem copy, which preserves raw bytes by definition (the from SRC** — a filesystem copy, which preserves raw bytes by definition (the
@ -210,10 +210,10 @@ onboarded — `~/.claude/CLAUDE.md` or `~/.claude/bc-mcp-bridge.js` is missing
run the full onboarding NOW (idempotent; identity taken from git config; the run the full onboarding NOW (idempotent; identity taken from git config; the
first git contact may open a browser login — that IS the authentication): first git contact may open a browser login — that IS the authentication):
git clone --branch stable --single-branch https://github.com/Curabis/BCQuality.git "$env:USERPROFILE\.claude\BCQuality" git clone --branch stable --single-branch https://github.com/Curabis/QualityHub.git "$env:USERPROFILE\.claude\QualityHub"
powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\BCQuality\custom\setup\machine\Install-CurabisMachine.ps1" powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\QualityHub\custom\setup\machine\Install-CurabisMachine.ps1"
(Skip the clone line if `%USERPROFILE%\.claude\BCQuality` already exists.) (Skip the clone line if `%USERPROFILE%\.claude\QualityHub` already exists.)
Then report the manual leftovers it lists (personal client secret; the AL Then report the manual leftovers it lists (personal client secret; the AL
Language extension if VS Code lacks it) and ask the developer to restart Language extension if VS Code lacks it) and ask the developer to restart
Claude Code. Claude Code.
@ -224,7 +224,7 @@ self-heal suffices:
powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\sync-bcquality-knowledge.ps1" powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\sync-bcquality-knowledge.ps1"
(If that sync script itself is missing, copy it from the channel clone: (If that sync script itself is missing, copy it from the channel clone:
`%USERPROFILE%\.claude\BCQuality\custom\setup\sync-bcquality-knowledge.ps1` — `%USERPROFILE%\.claude\QualityHub\custom\setup\sync-bcquality-knowledge.ps1` —
or run the full onboarding above.) or run the full onboarding above.)
These rules are always active. These rules are always active.
@ -545,7 +545,7 @@ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Triggered by: "Opdater CURABIS Standard fra BCQuality" Triggered by: "Opdater CURABIS Standard fra BCQuality"
**Step 0 — freshen the channel clone** (see Source section): fetch + checkout **Step 0 — freshen the channel clone** (see Source section): fetch + checkout
`origin/stable` in `%USERPROFILE%\.claude\BCQuality`; create the clone if `origin/stable` in `%USERPROFILE%\.claude\QualityHub`; create the clone if
missing. Every copy below reads from that clone. missing. Every copy below reads from that clone.
Updates only the files that come directly from BCQuality. Updates only the files that come directly from BCQuality.
@ -778,7 +778,7 @@ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
## Invocation note ## Invocation note
This agent is read on demand from the machine's channel clone This agent is read on demand from the machine's channel clone
(`%USERPROFILE%\.claude\BCQuality\custom\setup\curabis-standard.agent.md`, (`%USERPROFILE%\.claude\QualityHub\custom\setup\curabis-standard.agent.md`,
after freshening — see Source section). Both commands work in any project — after freshening — see Source section). Both commands work in any project —
including one not yet configured — because the machine's `~/.claude/CLAUDE.md` including one not yet configured — because the machine's `~/.claude/CLAUDE.md`
(installed by onboarding) knows the clone location. On a machine without the (installed by onboarding) knows the clone location. On a machine without the

View file

@ -3,7 +3,7 @@
These instructions apply to every Claude Code session, regardless of project. These instructions apply to every Claude Code session, regardless of project.
BCQuality is a PRIVATE repo: all access is git-based via the channel clone at BCQuality is a PRIVATE repo: all access is git-based via the channel clone at
`%USERPROFILE%\.claude\BCQuality` (pinned to `stable`; auth = Git Credential `%USERPROFILE%\.claude\QualityHub` (pinned to `stable`; auth = Git Credential
Manager). No raw.githubusercontent URLs — they do not work and must not be used. Manager). No raw.githubusercontent URLs — they do not work and must not be used.
## Auto-update BCQuality (runs at every session start) ## Auto-update BCQuality (runs at every session start)
@ -11,15 +11,15 @@ Manager). No raw.githubusercontent URLs — they do not work and must not be use
If the current project has `.github/.agents/bcquality.agent.md`: If the current project has `.github/.agents/bcquality.agent.md`:
1. Freshen the channel clone and read its SHA: 1. Freshen the channel clone and read its SHA:
`git -C "$env:USERPROFILE\.claude\BCQuality" fetch origin stable --quiet` `git -C "$env:USERPROFILE\.claude\QualityHub" fetch origin stable --quiet`
`git -C "$env:USERPROFILE\.claude\BCQuality" rev-parse origin/stable` `git -C "$env:USERPROFILE\.claude\QualityHub" rev-parse origin/stable`
(If the clone is missing: run the machine self-heal from the project (If the clone is missing: run the machine self-heal from the project
CLAUDE.md — two lines: git clone + Install-CurabisMachine.ps1.) CLAUDE.md — two lines: git clone + Install-CurabisMachine.ps1.)
2. Read stored SHA from `~/.claude/.bcquality-version` (may not exist yet) 2. Read stored SHA from `~/.claude/.bcquality-version` (may not exist yet)
3. If SHA is different (or file missing): 3. If SHA is different (or file missing):
a. `git -C "$env:USERPROFILE\.claude\BCQuality" checkout -B stable origin/stable --quiet` a. `git -C "$env:USERPROFILE\.claude\QualityHub" checkout -B stable origin/stable --quiet`
b. Execute Mode B from the clone: b. Execute Mode B from the clone:
`%USERPROFILE%\.claude\BCQuality\custom\setup\curabis-standard.agent.md` `%USERPROFILE%\.claude\QualityHub\custom\setup\curabis-standard.agent.md`
c. Refresh the local knowledge mirror: c. Refresh the local knowledge mirror:
`powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\sync-bcquality-knowledge.ps1"` `powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\sync-bcquality-knowledge.ps1"`
(git-based; also writes the new SHA to the version marker) (git-based; also writes the new SHA to the version marker)
@ -49,7 +49,7 @@ When the user says either of these commands, freshen the channel clone (see
Auto-update step 1) and follow the setup agent read from: Auto-update step 1) and follow the setup agent read from:
``` ```
%USERPROFILE%\.claude\BCQuality\custom\setup\curabis-standard.agent.md %USERPROFILE%\.claude\QualityHub\custom\setup\curabis-standard.agent.md
``` ```
- **"Konfigurer dette projekt til CURABIS Standard"** → fuld setup af nyt repo - **"Konfigurer dette projekt til CURABIS Standard"** → fuld setup af nyt repo

View file

@ -4,8 +4,8 @@
# Onboarding paa en ny maskine er TO linjer (GCM-login i browseren ved # Onboarding paa en ny maskine er TO linjer (GCM-login i browseren ved
# foerste git-kontakt ER autentificeringen): # foerste git-kontakt ER autentificeringen):
# #
# git clone --branch stable --single-branch https://github.com/Curabis/BCQuality.git "$env:USERPROFILE\.claude\BCQuality" # git clone --branch stable --single-branch https://github.com/Curabis/QualityHub.git "$env:USERPROFILE\.claude\QualityHub"
# powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\BCQuality\custom\setup\machine\Install-CurabisMachine.ps1" # powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.claude\QualityHub\custom\setup\machine\Install-CurabisMachine.ps1"
# #
# Alt kopieres fra kanal-klonen (filsystem-kopi = raa bytes; ingen raw-URLs). # Alt kopieres fra kanal-klonen (filsystem-kopi = raa bytes; ingen raw-URLs).
# #
@ -19,7 +19,7 @@ param(
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
$claude = Join-Path $env:USERPROFILE '.claude' $claude = Join-Path $env:USERPROFILE '.claude'
$clone = Join-Path $env:USERPROFILE '.claude\BCQuality' $clone = Join-Path $env:USERPROFILE '.claude\QualityHub'
New-Item -ItemType Directory -Force $claude | Out-Null New-Item -ItemType Directory -Force $claude | Out-Null
# Kilde: scriptet ligger i <klon>\custom\setup\machine → klonrod tre niveauer op # Kilde: scriptet ligger i <klon>\custom\setup\machine → klonrod tre niveauer op
@ -28,7 +28,7 @@ $src = (Resolve-Path (Join-Path $PSScriptRoot '..\..\..')).Path
# Sikr kanal-klonen paa den kanoniske placering (scriptet KAN vaere koert fra en anden klon) # Sikr kanal-klonen paa den kanoniske placering (scriptet KAN vaere koert fra en anden klon)
if (-not (Test-Path (Join-Path $clone '.git'))) { if (-not (Test-Path (Join-Path $clone '.git'))) {
if ($src -ne $clone) { if ($src -ne $clone) {
git clone --branch stable --single-branch 'https://github.com/Curabis/BCQuality.git' $clone git clone --branch stable --single-branch 'https://github.com/Curabis/QualityHub.git' $clone
if ($LASTEXITCODE -ne 0) { throw 'git clone af kanal-klonen fejlede - tjek adgang/GCM.' } if ($LASTEXITCODE -ne 0) { throw 'git clone af kanal-klonen fejlede - tjek adgang/GCM.' }
} }
} }

View file

@ -1,7 +1,7 @@
# Refresh the MACHINE-LOCAL mirror of the Curabis BCQuality knowledge base. # Refresh the MACHINE-LOCAL mirror of the Curabis BCQuality knowledge base.
# #
# v2 - GIT-BASED (privat repo): al konsumtion sker via en kanal-klon i # v2 - GIT-BASED (privat repo): al konsumtion sker via en kanal-klon i
# %USERPROFILE%\.claude\BCQuality (pinned til stable-branchen) # %USERPROFILE%\.claude\QualityHub (pinned til stable-branchen)
# Autentificering haandteres af Git Credential Manager - ingen raw-URLs, # Autentificering haandteres af Git Credential Manager - ingen raw-URLs,
# ingen GitHub API, ingen CDN-cache. Foerste koersel udloeser evt. et # ingen GitHub API, ingen CDN-cache. Foerste koersel udloeser evt. et
# GCM-login i browseren; det ER onboarding-autentificeringen. # GCM-login i browseren; det ER onboarding-autentificeringen.
@ -18,8 +18,8 @@
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
$repoUrl = 'https://github.com/Curabis/BCQuality.git' $repoUrl = 'https://github.com/Curabis/QualityHub.git'
$clone = Join-Path $env:USERPROFILE '.claude\BCQuality' $clone = Join-Path $env:USERPROFILE '.claude\QualityHub'
$dest = Join-Path $env:USERPROFILE '.claude\bcquality-knowledge' $dest = Join-Path $env:USERPROFILE '.claude\bcquality-knowledge'
$marker = Join-Path $env:USERPROFILE '.claude\.bcquality-version' $marker = Join-Path $env:USERPROFILE '.claude\.bcquality-version'
$staging = "$dest.tmp" $staging = "$dest.tmp"

View file

@ -59,7 +59,7 @@ Layer 1 - Microsoft BCQuality: https://github.com/microsoft/BCQuality
Layer 2 - CURABIS custom knowledge: read from the machine-local mirror — Layer 2 - CURABIS custom knowledge: read from the machine-local mirror —
`%USERPROFILE%\.claude\bcquality-knowledge\custom\` (always complete; never a `%USERPROFILE%\.claude\bcquality-knowledge\custom\` (always complete; never a
hardcoded file list — the rulebook grows). Fallback without a mirror: the hardcoded file list — the rulebook grows). Fallback without a mirror: the
channel clone at `%USERPROFILE%\.claude\BCQuality\custom\knowledge\`. The channel clone at `%USERPROFILE%\.claude\QualityHub\custom\knowledge\`. The
repo is PRIVATE — raw URLs do not exist. repo is PRIVATE — raw URLs do not exist.
If a source is unreachable, **degrade gracefully**: fall back to the triage protocol If a source is unreachable, **degrade gracefully**: fall back to the triage protocol

View file

@ -55,8 +55,8 @@ Resolve the current rule set at review time, in this order:
`%USERPROFILE%\.claude\bcquality-knowledge\custom\`). The mirror is synced `%USERPROFILE%\.claude\bcquality-knowledge\custom\`). The mirror is synced
from the `stable` release channel and is always the complete custom layer. from the `stable` release channel and is always the complete custom layer.
2. **Fallback (no mirror):** read directly from the machine's channel clone — 2. **Fallback (no mirror):** read directly from the machine's channel clone —
`%USERPROFILE%\.claude\BCQuality\custom\knowledge\**\*.md` (freshen with `%USERPROFILE%\.claude\QualityHub\custom\knowledge\**\*.md` (freshen with
`git -C "$env:USERPROFILE\.claude\BCQuality" pull` if stale). The repo is `git -C "$env:USERPROFILE\.claude\QualityHub" pull` if stale). The repo is
PRIVATE: tree-API/raw-URL fallbacks no longer exist. Consumers without PRIVATE: tree-API/raw-URL fallbacks no longer exist. Consumers without
filesystem access outside the workspace (e.g. Copilot) rely on the filesystem access outside the workspace (e.g. Copilot) rely on the
repo-committed agent files alone — deep custom-layer lookups happen in repo-committed agent files alone — deep custom-layer lookups happen in