llm-wiki public/private routing
The firewall between client-attributed and abstracted content. Routes
converted wiki pages to the correct repository surface and enforces the
project-name abstraction rule with its public-availability exception.
This skill is invoked by llm-wiki-page-shape-contract Rule 8 before any
public-wiki commit. It is NOT optional — every page bound for public
llm-wiki clears this gate first.
The two surfaces
| Surface |
Purpose |
License |
Content posture |
vamseeachanta/llm-wiki (public) |
Trunk for code, client work, chatbots; improvable via public + legally-sanitized private sources |
MIT (code) + CC-BY-4.0 (content) |
Sanitized, abstracted, defensible-public |
vamseeachanta/llm-wiki-<client> (private, per #2746) |
Exact client + project + raw numbers retained for project work |
proprietary |
Full fidelity, no abstraction needed |
Both surfaces follow the same page-shape contract (Skill A). They differ
only in routing rules.
The routing rule (verbatim from 2026-05-20 user directive)
"Exact client results will go into llm-wiki-<client> private repo;
project name, client name abstracted results will go into llm-wiki
public repo."
"Only client project names are to be abstracted. If project name is
available public, can be used in the llm-wiki public repo provided all
key data is publicly available."
Decoded routing matrix
| Content type |
Public llm-wiki |
Private llm-wiki-<client> |
| Industry-standard reference (OCIMF MEG, DNV, API, ISO) |
YES — cite section + edition |
YES — same |
| Public methodology, generic algorithm |
YES |
YES — usually duplicative; prefer linking from private to public |
| Anonymized worked example |
YES |
YES |
| Client-attributed calc results (specific project, specific operator) |
NO |
YES |
| Project name (default) |
abstracted (e.g., "Project Alpha") |
actual name |
| Project name (public-availability exception applies) |
actual name OK |
actual name |
| Client name |
governed by .legal-deny-list.yaml — typically abstracted to "the operator" / "the contractor" / unspecified |
actual name |
| Raw numerical results (specific tensions, specific frequencies, specific dimensions) |
sanitized to ranges or removed |
actual values |
| Methodology + abstracted illustrative numbers (e.g., "typical deepwater mooring tensions cluster around 60–80% MBL") |
YES |
YES — link to private exact-value page |
The abstraction surface (public-bound content)
By default, abstract client project names in public-wiki content.
Examples:
B1528 proj-a → Project Alpha (or a deepwater FSO project)
mkt-a/<specific project> → a marine engineering project
- specific platform name → generic platform-class descriptor
What is NOT in the abstraction surface
- Industry-standard names (DNV-OS-E301, API RP 2SK, OCIMF MEG, ISO 19901): never abstracted
- Standard editions / revisions: never abstracted (defensibility requires explicit edition)
- Public operators in public roles (e.g., regulatory filing data — operator named in the filing): not abstracted per the exception below
- Generic methodology: no abstraction needed (no client tie)
- Open-source code / library references: not abstracted
What IS in the abstraction surface
- Client project names (engineering project identifiers, internal codenames)
- Project-specific numerical results (only the specific values, not the methodology)
- Project-specific dimensions / configurations when they would identify the asset
Client identity (the operator company) is governed by
.legal-deny-list.yaml and .claude/rules/legal-compliance.md — this
skill does not relax those rules.
The public-availability exception
A project name can be used as-is in public llm-wiki when both of
the following hold:
Project name is in the public domain, evidenced by at least one of:
- SEC filing (10-K, 10-Q, 8-K, S-1) naming the project
- Operator press release naming the project
- Conference paper (OTC, SPE, OMAE, ISOPE) naming the project
- Regulator record (BSEE, BOEM, NOPSEMA, PSA, NSTA) naming the project
- Public reservoir / pipeline database entry (e.g., BSEE production records)
- Project's own public-facing website
All key data being cited is also publicly available, evidenced by:
- The data appears in the same public source as the project name, OR
- The data appears in a separate public source (conference paper, regulator filing) that can be cited alongside
- "Key data" means: any numerical result, dimensional spec, or
operational parameter the wiki page presents as derived from the
project
Both conditions, or the project name gets abstracted. Name-only
public availability without data backing fails the exception. Data-only
without project-name backing has nothing to exception away — abstract the
name as usual.
Worked examples of the exception
| Scenario |
Verdict |
| Project "Vito" named in Shell 2023 press release + OTC 2023 conference paper with field data → reference these to discuss tieback methodology |
EXCEPTION APPLIES — use "Vito" as-is, cite both sources |
| Project named in Shell press release; numerical results from internal calc → derive methodology page |
EXCEPTION DOES NOT APPLY — name in public, data is not → abstract the name |
| Internal client codename + conference paper with sanitized data from the same project |
EXCEPTION DOES NOT APPLY — codename not in conference paper, abstract |
| OCIMF MEG3 sign-convention discussion, no project tie |
NO ABSTRACTION NEEDED — pure methodology, no client surface |
Pre-promotion decision tree
For each page bound for public llm-wiki:
page bound for public llm-wiki
│
├── Page references a client project name?
│ │
│ ├── NO ──────────────────────────────► commit to public (no abstraction needed)
│ │
│ └── YES
│ │
│ ├── Is the project name publicly available?
│ │ (SEC / press release / conference paper / regulator filing / public DB)
│ │ │
│ │ ├── NO ──────────────────► ABSTRACT project name → commit
│ │ │
│ │ └── YES
│ │ │
│ │ ├── Is ALL key data also publicly available?
│ │ │ │
│ │ │ ├── NO ──────► ABSTRACT project name → commit
│ │ │ │
│ │ │ └── YES ─────► EXCEPTION APPLIES → use actual name, cite public source(s)
│
└── Page also references client identity (operator, contractor)?
│
├── Refer to `.legal-deny-list.yaml` and `.claude/rules/legal-compliance.md`
└── Not governed by this skill
When in doubt: abstract. The exception is opt-in with evidence, not
opt-out.
Pre-promotion checklist (public-bound page)
Promotion from private to public
If a private-wiki page should also exist in public form:
- Copy, don't move — the private page stays as the canonical
client-attributed record
- Create a new public page (different slug, abstracted content)
- Run the full pre-promotion checklist
- Cross-link: private page can wikilink to its public counterpart for
"see also the abstracted version"; public page MUST NOT link back to
the private page (the private repo is invisible to public readers)
- Commit message on the public-wiki side:
abstraction: applied; source private llm-wiki-<client> page-id <id> — the source reference stays in the commit message only, never in page body
Anti-pattern: replace-with-abstraction
Do NOT delete the private page after promoting an abstracted copy. The
private page is the audit-trail; the public copy is the share-out.
Anti-patterns
- Name-substitution without data-substitution — replacing "B1528 proj-a" with "Project Alpha" while keeping a specific tension envelope from B1528. The number identifies the asset.
- "Public domain" by hand-wave — "I think it's been mentioned somewhere" doesn't qualify. Cite the source.
- Per-page abstraction without checklist — judgment calls drift across pages. Use the decision tree.
- Abstracted page in private wiki — abstraction has no purpose in the private surface; just write the actual name. (Private→public copies are the exception.)
- Exact-name page in public wiki without exception verification — the abstraction gate must clear; either abstract or document the exception.
- Promotion via
git mv — never. Copy the file with a new slug to public; private original stays.
- Self-approving the exception — when the exception is borderline, route through audit per Skill B and defer to user.
Hand-off back to research/llm-wiki-page-shape-contract
Once routing is decided and the abstraction gate cleared:
# Public commit:
git -C /mnt/local-analysis/llm-wiki commit -m "wiki(<domain>): <slug> — <one-line>
abstraction: applied | not-needed-exception-met | not-applicable-public-standard-only
Refs: <upstream issue>
" -- wikis/<domain>/<page>.md wikis/<domain>/index.md wikis/<domain>/log/YYYYMMDD.md
# Private commit (per-client repo):
git -C /mnt/local-analysis/llm-wiki-<client> commit -m "wiki: <slug> — <one-line>
source: <upstream issue> | <upstream artifact path>
" -- wikis/<domain>/<page>.md wikis/<domain>/index.md wikis/<domain>/log/YYYYMMDD.md
Pathspec form per feedback_multi_agent_commit_serialization.
What this skill is NOT
- Not a replacement for
.legal-deny-list.yaml — that enforces client
identity rules; this skill adds the project-name layer above
- Not a replacement for
coordination/client-llm-wiki-factory — that
skill creates the private-wiki repo infrastructure; this skill governs
routing decisions within the infrastructure
- Not a replacement for the data-layer boundary (#2727) — that defines what content is wiki-eligible at all; this skill decides which wiki
- Not for
.gitignore / .git firewall mechanics — those are repo
configuration, governed by feedback_per_repo_metadata_is_firewall
Related must-fire rules
feedback_service_provider_data_routing — 6-row matrix; vendor brochures → off-repo; SEC / conference / regulator → public
feedback_per_repo_metadata_is_firewall — license + .gitignore + per-repo .claude + .git are the file-system firewall
feedback_credential_issuer_copy_paste_leak — never commit raw "save this token" output; same hygiene applies to client identifiers
feedback_external_permission_email_hygiene — when a rights-holder approval email is supplied, record the minimum permission/citation conclusion needed for traceability; do not persist personal contact details, and do not inflate “citation looks appropriate” into unlimited bulk-copy permission
feedback_never_offer_to_self_label_plan_approved — borderline exception cases route through user, not self-approval
feedback_offrepo_intel_routing — for published repos, side-channel notes go to /mnt/ace/<repo-name>/docs/, not in-repo
1---2name: llm-wiki-public-private-routing3description: Firewall between the public llm-wiki repo (vamseeachanta/llm-wiki, MIT + CC-BY-4.0) and per-client private wikis (vamseeachanta/llm-wiki-<client>, e.g. llm-wiki-mkt-a per #2746). Use when (1) deciding whether a converted wiki page lands in public or private surface, (2) applying the project-name abstraction rule to public-bound content, (3) evaluating the public- availability exception that lets actual project names pass through unmodified, (4) promoting content from private to public after sanitization. Encodes the 2026-05-20 user routing directive verbatim: exact client results → private; abstracted (project-name only) → public; project name + all key data publicly available → exception applies. Companion to research/llm-wiki-page-shape-contract (which calls this skill at Rule 8) and research/llm-wiki-source-extraction-coverage (which produces the source pages this skill decides where to send).4---56# llm-wiki public/private routing78The firewall between client-attributed and abstracted content. Routes9converted wiki pages to the correct repository surface and enforces the10project-name abstraction rule with its public-availability exception.1112This skill is invoked by `llm-wiki-page-shape-contract` Rule 8 before any13public-wiki commit. It is NOT optional — every page bound for public14`llm-wiki` clears this gate first.1516---1718## The two surfaces1920| Surface | Purpose | License | Content posture |21|---|---|---|---|22| `vamseeachanta/llm-wiki` (public) | Trunk for code, client work, chatbots; improvable via public + legally-sanitized private sources | MIT (code) + CC-BY-4.0 (content) | Sanitized, abstracted, defensible-public |23| `vamseeachanta/llm-wiki-<client>` (private, per [#2746](https://github.com/vamseeachanta/workspace-hub/issues/2746)) | Exact client + project + raw numbers retained for project work | proprietary | Full fidelity, no abstraction needed |2425Both surfaces follow the same page-shape contract (Skill A). They differ26only in routing rules.2728---2930## The routing rule (verbatim from 2026-05-20 user directive)3132> "Exact client results will go into llm-wiki-`<client>` private repo;33> project name, client name abstracted results will go into llm-wiki34> public repo."35>36> "Only client project names are to be abstracted. If project name is37> available public, can be used in the llm-wiki public repo provided all38> key data is publicly available."3940### Decoded routing matrix4142| Content type | Public llm-wiki | Private llm-wiki-`<client>` |43|---|---|---|44| Industry-standard reference (OCIMF MEG, DNV, API, ISO) | YES — cite section + edition | YES — same |45| Public methodology, generic algorithm | YES | YES — usually duplicative; prefer linking from private to public |46| Anonymized worked example | YES | YES |47| Client-attributed calc results (specific project, specific operator) | NO | YES |48| Project name (default) | abstracted (e.g., "Project Alpha") | actual name |49| Project name (public-availability exception applies) | actual name OK | actual name |50| Client name | governed by `.legal-deny-list.yaml` — typically abstracted to "the operator" / "the contractor" / unspecified | actual name |51| Raw numerical results (specific tensions, specific frequencies, specific dimensions) | sanitized to ranges or removed | actual values |52| Methodology + abstracted illustrative numbers (e.g., "typical deepwater mooring tensions cluster around 60–80% MBL") | YES | YES — link to private exact-value page |5354---5556## The abstraction surface (public-bound content)5758**By default, abstract client project names** in public-wiki content.5960Examples:61- `B1528 proj-a` → `Project Alpha` (or `a deepwater FSO project`)62- `mkt-a/<specific project>` → `a marine engineering project`63- specific platform name → generic platform-class descriptor6465### What is NOT in the abstraction surface6667- **Industry-standard names** (DNV-OS-E301, API RP 2SK, OCIMF MEG, ISO 19901): never abstracted68- **Standard editions / revisions**: never abstracted (defensibility requires explicit edition)69- **Public operators in public roles** (e.g., regulatory filing data — operator named in the filing): not abstracted per the exception below70- **Generic methodology**: no abstraction needed (no client tie)71- **Open-source code / library references**: not abstracted7273### What IS in the abstraction surface7475- **Client project names** (engineering project identifiers, internal codenames)76- **Project-specific numerical results** (only the specific values, not the methodology)77- **Project-specific dimensions / configurations** when they would identify the asset7879Client *identity* (the operator company) is governed by80`.legal-deny-list.yaml` and `.claude/rules/legal-compliance.md` — this81skill does not relax those rules.8283---8485## The public-availability exception8687A project name can be used **as-is** in public llm-wiki when **both** of88the following hold:89901. **Project name is in the public domain**, evidenced by at least one of:91 - SEC filing (10-K, 10-Q, 8-K, S-1) naming the project92 - Operator press release naming the project93 - Conference paper (OTC, SPE, OMAE, ISOPE) naming the project94 - Regulator record (BSEE, BOEM, NOPSEMA, PSA, NSTA) naming the project95 - Public reservoir / pipeline database entry (e.g., BSEE production records)96 - Project's own public-facing website97982. **All key data being cited is also publicly available**, evidenced by:99 - The data appears in the same public source as the project name, OR100 - The data appears in a separate public source (conference paper, regulator filing) that can be cited alongside101 - "Key data" means: any numerical result, dimensional spec, or102 operational parameter the wiki page presents as derived from the103 project104105**Both conditions, or the project name gets abstracted.** Name-only106public availability without data backing fails the exception. Data-only107without project-name backing has nothing to exception away — abstract the108name as usual.109110### Worked examples of the exception111112| Scenario | Verdict |113|---|---|114| Project "Vito" named in Shell 2023 press release + OTC 2023 conference paper with field data → reference these to discuss tieback methodology | EXCEPTION APPLIES — use "Vito" as-is, cite both sources |115| Project named in Shell press release; numerical results from internal calc → derive methodology page | EXCEPTION DOES NOT APPLY — name in public, data is not → abstract the name |116| Internal client codename + conference paper with sanitized data from the same project | EXCEPTION DOES NOT APPLY — codename not in conference paper, abstract |117| OCIMF MEG3 sign-convention discussion, no project tie | NO ABSTRACTION NEEDED — pure methodology, no client surface |118119---120121## Pre-promotion decision tree122123For each page bound for public llm-wiki:124125```126page bound for public llm-wiki127 │128 ├── Page references a client project name?129 │ │130 │ ├── NO ──────────────────────────────► commit to public (no abstraction needed)131 │ │132 │ └── YES133 │ │134 │ ├── Is the project name publicly available?135 │ │ (SEC / press release / conference paper / regulator filing / public DB)136 │ │ │137 │ │ ├── NO ──────────────────► ABSTRACT project name → commit138 │ │ │139 │ │ └── YES140 │ │ │141 │ │ ├── Is ALL key data also publicly available?142 │ │ │ │143 │ │ │ ├── NO ──────► ABSTRACT project name → commit144 │ │ │ │145 │ │ │ └── YES ─────► EXCEPTION APPLIES → use actual name, cite public source(s)146 │147 └── Page also references client identity (operator, contractor)?148 │149 ├── Refer to `.legal-deny-list.yaml` and `.claude/rules/legal-compliance.md`150 └── Not governed by this skill151```152153When in doubt: **abstract**. The exception is opt-in with evidence, not154opt-out.155156---157158## Pre-promotion checklist (public-bound page)159160- [ ] Page references a client project name? (yes / no)161- [ ] If yes: is project name in public domain? (cite sources, otherwise abstract)162- [ ] If public domain: is all key data publicly available? (cite sources, otherwise abstract)163- [ ] If exception applies: public sources cited explicitly in the page's `## Sources` section164- [ ] No raw numerical results that would identify a specific asset (sanitize to ranges or remove)165- [ ] No filenames / paths referencing client-private directories (`mkt-a/`, `<client>-projects/`)166- [ ] Client identity (operator company) check passes `.legal-deny-list.yaml`167- [ ] `bash scripts/legal/legal-sanity-scan.sh --diff-only` returns PASS168- [ ] Page's commit message records abstraction verdict: `abstraction: applied | not-needed-exception-met | not-applicable-public-standard-only`169170---171172## Promotion from private to public173174If a private-wiki page should also exist in public form:1751761. **Copy, don't move** — the private page stays as the canonical177 client-attributed record1782. Create a new public page (different slug, abstracted content)1793. Run the full pre-promotion checklist1804. Cross-link: private page can wikilink to its public counterpart for181 "see also the abstracted version"; public page MUST NOT link back to182 the private page (the private repo is invisible to public readers)1835. Commit message on the public-wiki side: `abstraction: applied; source private llm-wiki-<client> page-id <id>` — the source reference stays in the commit message only, never in page body184185### Anti-pattern: replace-with-abstraction186187Do NOT delete the private page after promoting an abstracted copy. The188private page is the audit-trail; the public copy is the share-out.189190---191192## Anti-patterns193194- **Name-substitution without data-substitution** — replacing "B1528 proj-a" with "Project Alpha" while keeping a specific tension envelope from B1528. The number identifies the asset.195- **"Public domain" by hand-wave** — "I think it's been mentioned somewhere" doesn't qualify. Cite the source.196- **Per-page abstraction without checklist** — judgment calls drift across pages. Use the decision tree.197- **Abstracted page in private wiki** — abstraction has no purpose in the private surface; just write the actual name. (Private→public copies are the exception.)198- **Exact-name page in public wiki without exception verification** — the abstraction gate must clear; either abstract or document the exception.199- **Promotion via `git mv`** — never. Copy the file with a new slug to public; private original stays.200- **Self-approving the exception** — when the exception is borderline, route through audit per Skill B and defer to user.201202---203204## Hand-off back to `research/llm-wiki-page-shape-contract`205206Once routing is decided and the abstraction gate cleared:207208```bash209# Public commit:210git -C /mnt/local-analysis/llm-wiki commit -m "wiki(<domain>): <slug> — <one-line>211212abstraction: applied | not-needed-exception-met | not-applicable-public-standard-only213214Refs: <upstream issue>215" -- wikis/<domain>/<page>.md wikis/<domain>/index.md wikis/<domain>/log/YYYYMMDD.md216217# Private commit (per-client repo):218git -C /mnt/local-analysis/llm-wiki-<client> commit -m "wiki: <slug> — <one-line>219220source: <upstream issue> | <upstream artifact path>221" -- wikis/<domain>/<page>.md wikis/<domain>/index.md wikis/<domain>/log/YYYYMMDD.md222```223224Pathspec form per `feedback_multi_agent_commit_serialization`.225226---227228## What this skill is NOT229230- Not a replacement for `.legal-deny-list.yaml` — that enforces client231 identity rules; this skill adds the project-name layer above232- Not a replacement for `coordination/client-llm-wiki-factory` — that233 skill creates the private-wiki repo infrastructure; this skill governs234 routing decisions within the infrastructure235- Not a replacement for the data-layer boundary ([#2727](https://github.com/vamseeachanta/workspace-hub/issues/2727)) — that defines what content is wiki-eligible at all; this skill decides which wiki236- Not for `.gitignore` / `.git` firewall mechanics — those are repo237 configuration, governed by `feedback_per_repo_metadata_is_firewall`238239## Related must-fire rules240241- `feedback_service_provider_data_routing` — 6-row matrix; vendor brochures → off-repo; SEC / conference / regulator → public242- `feedback_per_repo_metadata_is_firewall` — license + .gitignore + per-repo .claude + .git are the file-system firewall243- `feedback_credential_issuer_copy_paste_leak` — never commit raw "save this token" output; same hygiene applies to client identifiers244- `feedback_external_permission_email_hygiene` — when a rights-holder approval email is supplied, record the minimum permission/citation conclusion needed for traceability; do not persist personal contact details, and do not inflate “citation looks appropriate” into unlimited bulk-copy permission245- `feedback_never_offer_to_self_label_plan_approved` — borderline exception cases route through user, not self-approval246- `feedback_offrepo_intel_routing` — for published repos, side-channel notes go to `/mnt/ace/<repo-name>/docs/`, not in-repo