Register: ms-ai-architect removed from locales (org-ops D35 — the entry, not the prose, was the wrong side); ktg-plugin-marketplace v7.7.2 accepted as lightweight history (catalog's measured counter: monorepo-era tag, zero consumers). README: the two stale prose counts made count-free. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MzGk2pnq1N7J9H7xj2XAH1
270 lines
14 KiB
JSON
270 lines
14 KiB
JSON
{
|
|
"$comment": [
|
|
"Taxonomy register for the `open/` organisation (D4: central, one file).",
|
|
"The class is READ OFF the catalog and the remotes — it is structural, not a judgement.",
|
|
"Refresh the `repos` name set against ground truth with:",
|
|
" node scripts/repo-standard-check.mjs --refresh",
|
|
"which enumerates /api/v1/orgs/open/repos (ONE call — the listing carries",
|
|
"description and topics too; per-repo fetching trips the rate limiter).",
|
|
"Enumerate, never glob: 12 of these sit at depth 2 locally, one has a",
|
|
"basename that differs from its repo name, and `.profile` is hidden."
|
|
],
|
|
"org": "open",
|
|
"forge": "https://git.fromaitochitta.com",
|
|
"marketplace": {
|
|
"name": "ktg-plugin-marketplace",
|
|
"url": "https://git.fromaitochitta.com/open/ktg-plugin-marketplace.git"
|
|
},
|
|
"repos": {
|
|
"llm-security": "plugin",
|
|
"config-audit": "plugin",
|
|
"voyage": "plugin",
|
|
"linkedin-studio": "plugin",
|
|
"graceful-handoff": "plugin",
|
|
"ai-psychosis": "plugin",
|
|
"ms-ai-architect": "plugin",
|
|
"okr": "plugin",
|
|
"human-friendly-style": "plugin",
|
|
"claude-design": "plugin",
|
|
"repo-mailbox": "plugin",
|
|
"repo-standard": "plugin",
|
|
"ktg-plugin-marketplace": "catalog",
|
|
"playground-design-system": "shared-asset",
|
|
"portfolio-optimiser-commons": "shared-asset",
|
|
"llm-security-commons": "shared-asset",
|
|
".profile": "org-profile",
|
|
"portfolio-optimiser": "standalone",
|
|
"portfolio-optimiser-claude": "standalone",
|
|
"llm-ingestion-pipeline-security": "standalone",
|
|
"llm-ingestion-okf": "standalone",
|
|
"app-creator": "standalone"
|
|
},
|
|
|
|
"$comment_non_repos": [
|
|
"Names that LOOK like repo names and are not. These exist so that",
|
|
"'no match' and 'match on something that is not a repo' are DIFFERENT",
|
|
"outcomes — if they share an outcome, the loss goes silent, which is the",
|
|
"defect class this whole standard exists to catch.",
|
|
"Each entry is a measured false positive, not a guess."
|
|
],
|
|
"non_repos": {
|
|
"coord": "Retired repo name, deliberately still alive in prose: the CLI (coord-send), the mailbox root (~/.claude/coord/) and CLAUDE_COORD_DIR kept it — they are the transport protocol, not the product. The repo has been `repo-mailbox` since v0.3.0.",
|
|
"_broadcast": "Reserved engine namespace in the coord mailbox (`~/.claude/coord/_broadcast/`). Occupies a repo-shaped PATH position; `_` prefixed names are refused as repo identities.",
|
|
"llm-ingestion-guard": "Package name published by `llm-ingestion-pipeline-security`. A package, not a repo.",
|
|
"claude-code-llm-security": "Pre-split name of `llm-security`. This one IS dead — the org's only rename produced every dead reference we found. Listed so the finding names the successor instead of just failing."
|
|
},
|
|
|
|
"$comment_classes": [
|
|
"Per class: required files, required README headings, and the install form.",
|
|
"A flat standard across all classes would demand a ROADMAP from a 5-line",
|
|
"profile. ROADMAP is deliberately absent everywhere: it is 0/18 today and is",
|
|
"drafted from STATE by a human. A gate that fails every repo teaches people",
|
|
"to switch the gate off.",
|
|
"",
|
|
"CONTRIBUTING.md, CODE_OF_CONDUCT.md and MAINTAINERS.md are deliberately NOT",
|
|
"required anywhere. The maintainer works alone and the catalog's published",
|
|
"stance already says so — 'solo-maintained, fork-and-own; issues welcome as",
|
|
"signals, pull requests not accepted'. Contributor-facing documentation for a",
|
|
"project that accepts no contributors is theatre, and a CODE_OF_CONDUCT with",
|
|
"an unattended placeholder address is worse than none: it is a visible",
|
|
"unfinished template. This is NOT a rule against having them — files already",
|
|
"present are a separate cleanup decision, not a gate finding.",
|
|
"",
|
|
"Consumer-facing documentation is unaffected by working alone, and that is",
|
|
"the whole distinction: SECURITY.md, LICENSE, CHANGELOG, non-goals and honest",
|
|
"limitations exist for the reader, not for a contributor.",
|
|
"",
|
|
"`readme_desc_match: false` turns OFF the README-opening == forge-description",
|
|
"equality for a class. Default is on, and it is right for an ordinary repo:",
|
|
"both texts describe the SAME subject there. `org-profile` is the one class",
|
|
"where they do not — its README is the ORGANISATION's landing page and the",
|
|
"forge text describes the REPO. Both are correct about their own subject, so",
|
|
"it is the equality that does not apply, not either text. A landing page's",
|
|
"opening line also carries a markdown link, and the description field renders",
|
|
"as PLAIN TEXT: passing the check would mean putting raw markdown on a real",
|
|
"surface — trading a census ERROR for a visible defect. One member, so the",
|
|
"exemption removes coverage nowhere else."
|
|
],
|
|
"classes": {
|
|
"plugin": {
|
|
"required_files": ["README.md", "LICENSE", "CHANGELOG.md", ".claude-plugin/plugin.json"],
|
|
"required_headings": ["## Install", "## Non-goals", "## Changelog"],
|
|
"install": "plugin"
|
|
},
|
|
"catalog": {
|
|
"required_files": ["README.md", "LICENSE", "GOVERNANCE.md", "CONVENTIONS.md", ".claude-plugin/marketplace.json"],
|
|
"required_headings": ["## Install", "## Non-goals"],
|
|
"install": "catalog"
|
|
},
|
|
"shared-asset": {
|
|
"required_files": ["README.md", "LICENSE"],
|
|
"required_headings": ["## Non-goals"],
|
|
"install": "vendor"
|
|
},
|
|
"org-profile": {
|
|
"required_files": ["README.md"],
|
|
"required_headings": [],
|
|
"install": "none",
|
|
"readme_desc_match": false
|
|
},
|
|
"standalone": {
|
|
"required_files": ["README.md", "LICENSE"],
|
|
"required_headings": ["## Install", "## Non-goals"],
|
|
"install": "package"
|
|
}
|
|
},
|
|
|
|
"$comment_titles": [
|
|
"Where a decided YES about a README H1 gets written down. A human title is a",
|
|
"valid choice — `docs/rds-v1.md` prescribes `1. # Title` for every class, not",
|
|
"`# repo-name` — but until this map existed the decision had nowhere to live,",
|
|
"so census 05, 06 and 07 would have reported the same 6 WARNs forever.",
|
|
"",
|
|
"Set: the H1 is compared against it and a match is OK. Unset: WARN, exactly as",
|
|
"before. That makes 'we decided this is correct' and 'nobody has looked at it'",
|
|
"two different outcomes instead of one.",
|
|
"",
|
|
"PROPOSED BY THE OPERATOR, NOT MEASURED — like `traits` and `locales`, this is",
|
|
"a judgement. The five below are not one phenomenon: `.profile` CANNOT be",
|
|
"`# .profile` (the name is Forgejo's mechanism name for the org-profile repo),",
|
|
"`llm-ingestion-guard` is not a title at all but the published package name",
|
|
"(it is in `non_repos` above for the same reason), and the three plugins are",
|
|
"one consistent product convention. Each H1 was read from the repo, not",
|
|
"copied from a census.",
|
|
"",
|
|
"`ai-psychosis` (`# Interaction Awareness`) is DELIBERATELY ABSENT: it is the",
|
|
"one where a reader cannot connect the title to the repo. Leaving it standing",
|
|
"alone is the wanted effect of registering the others."
|
|
],
|
|
"titles": {
|
|
".profile": "fromaitochitta / open",
|
|
"llm-ingestion-pipeline-security": "llm-ingestion-guard",
|
|
"linkedin-studio": "LinkedIn Studio Plugin for Claude Code",
|
|
"llm-security": "LLM Security Plugin for Claude Code",
|
|
"ms-ai-architect": "AI Architect Plugin for Claude Code"
|
|
},
|
|
|
|
"$comment_traits": [
|
|
"A SECOND axis, orthogonal to class. Class is structural (read off the",
|
|
"catalog and the remotes); a trait is about what the code DOES, which no",
|
|
"remote can tell you. `security` attaches the obligations a tool acquires by",
|
|
"handling untrusted input: a real disclosure channel, and limitations stated",
|
|
"with their mechanism.",
|
|
"",
|
|
"PROPOSED BY THE GATE'S AUTHOR, NOT MEASURED — the operator owns this list.",
|
|
"Marking a repo `security` decides that it owes a SECURITY.md, so adding or",
|
|
"removing a name here is a judgement, not a reading. These two were picked",
|
|
"because both process untrusted input as their stated purpose."
|
|
],
|
|
"traits": {
|
|
"llm-security": ["security"],
|
|
"llm-ingestion-pipeline-security": ["security"]
|
|
},
|
|
"trait_requirements": {
|
|
"security": {
|
|
"required_files": ["SECURITY.md"],
|
|
"required_headings": ["## Known limitations"]
|
|
}
|
|
},
|
|
|
|
"$comment_locales": [
|
|
"A THIRD axis, orthogonal to both class and trait. Class is structural, a",
|
|
"trait is what the code DOES — this is who the code is FOR, which is the",
|
|
"standard's own stated principle: who the reader is decides what is",
|
|
"required. English is the default and is not listed. A repo aimed ONLY at a",
|
|
"Norwegian readership is `nb`, and is then WRONG in English, not right.",
|
|
"",
|
|
"PROPOSED BY THE OPERATOR, NOT MEASURED — like `traits`, this list is a",
|
|
"judgement and no remote can report it. Both original entries were named by",
|
|
"the operator on 2026-08-04 as Norway-only in their audience.",
|
|
"",
|
|
"`ms-ai-architect` was REMOVED 2026-08-14 (org-ops coord, their D35): its",
|
|
"published README disavows the exclusivity this axis requires — line 17,",
|
|
"'while remaining useful for any enterprise context' — verified against the",
|
|
"forge before removal. Its 24 Norway markers are TRAITS (what the code",
|
|
"does: Digdir, NSM, DPIA), which is the axis confusion this comment warns",
|
|
"about two paragraphs up. The register was the wrong side, not the prose.",
|
|
"`okr` stands: its README IS Norwegian, rewritten to close census 05.",
|
|
"",
|
|
"Detection is a stopword-frequency comparison over prose with code stripped.",
|
|
"It answers WHICH language dominates, never whether the prose is any good."
|
|
],
|
|
"locales": {
|
|
"okr": "nb"
|
|
},
|
|
|
|
"$comment_tags_lightweight_accepted": [
|
|
"Where a decided YES about lightweight tag HISTORY gets written down — the",
|
|
"same job `titles` does for a README H1, one axis over. A lightweight tag is",
|
|
"movable without a trace and the catalog pins plugins by tag, so it is a",
|
|
"supply-chain property; but the only remedy for a PUBLISHED one is force-",
|
|
"moving it, which is the act the check warns about. Without this list the",
|
|
"WARN can never be cleared, and the gate says the same thing forever.",
|
|
"",
|
|
"Keyed on tag NAME, never on a count. A count stays satisfied the moment one",
|
|
"tag is re-cut and a different, unaccepted one takes its place.",
|
|
"",
|
|
"MEASURED 2026-08-12 from the LOCAL clones, not from the forge — which is",
|
|
"the very gap REMOTE-SYNC exists to name, so these are claims about three",
|
|
"OTHER repos and were sent to them by coord so a wrong name can be disputed.",
|
|
"",
|
|
"`ktg-plugin-marketplace v7.7.2` was DELIBERATELY ABSENT until 2026-08-14:",
|
|
"as the newest tag it had the one safe remedy (`git tag -a -f`), and",
|
|
"pre-accepting it would have let cutting v7.8.0 skip the cheap fix",
|
|
"unrecorded. ACCEPTED 2026-08-14 on the catalog's measured counter (their",
|
|
"coord, catalog HEAD d0d5d70): v7.7.2 is a monorepo-era llm-security tag",
|
|
"(2026-05-19, pre-split), not a catalog release; their README install block",
|
|
"pins no ref and all 12 marketplace.json refs are plugin-repo tags, so zero",
|
|
"install paths consume it — 'newest tag' here sorts last without being the",
|
|
"newest RELEASE, which is the premise the safe-remedy rule rests on.",
|
|
"Force-pushing a published ref for zero consumers costs more than the",
|
|
"finding. The catalog committed to annotating every future tag; the check",
|
|
"itself enforces that, since a new lightweight newest tag is not on this",
|
|
"list and fires ERROR.",
|
|
"",
|
|
"The two slash-named `config-audit/v*` tags on that forge are OUT OF SCOPE",
|
|
"by construction, not omitted by a fetch gap: the engine reads",
|
|
"`refs/tags/v*` — the repo's own version line — and a namespaced",
|
|
"monorepo-era tag is not part of it."
|
|
],
|
|
"tags_lightweight_accepted": {
|
|
"ktg-plugin-marketplace": ["v3.4.1", "v5.0.0", "v5.0.1", "v5.0.2", "v5.0.3", "v7.7.0", "v7.7.1", "v7.7.2"],
|
|
"llm-ingestion-okf": ["v0.2.0", "v0.3.0", "v0.3.1", "v0.3.2", "v0.4.0"],
|
|
"llm-ingestion-pipeline-security": ["v0.3.0"]
|
|
},
|
|
|
|
"$comment_tags_signed_from": [
|
|
"The date the org's tag-signing policy takes effect. Operator decision",
|
|
"2026-08-13, on the rule that decides these: would a public AAA+ repository",
|
|
"do this? Yes — a signed tag ties a released ref to a signer rather than to",
|
|
"whoever could write to the forge, and the catalog pins plugins by tag.",
|
|
"",
|
|
"It lives HERE and not in the engine for the reason the org-profile",
|
|
"exemption is a flag rather than `if (klass === 'org-profile')`: the engine",
|
|
"holds no org decision of its own. Remove the key and TAG-SIGNED goes back",
|
|
"to a notRun SKIP — the gate never assumes a policy nobody recorded.",
|
|
"",
|
|
"A DATE, not a boolean, and that is the whole reason the check is shippable.",
|
|
"MEASURED across 20 clones 2026-08-13: 158 `v*` tags, 144 annotated, 14",
|
|
"lightweight, 0 signed, and NOT ONE tag dated after 2026-08-12. A boolean",
|
|
"would have failed 20 correct repositories the day it landed — the mechanism",
|
|
"that gets gates switched off — and its only remedy would have been force-",
|
|
"moving 144 published refs. The date fires nothing today and acquires teeth",
|
|
"at each repo's next release, which is how signing is adopted in public.",
|
|
"",
|
|
"Do NOT backdate this to 'catch up' history. Every tag below it was correct",
|
|
"when it was cut, and the check says so out loud (TAG-SIGNED-PREPOLICY, OK)",
|
|
"rather than going silent about it."
|
|
],
|
|
"tags_signed_from": "2026-08-13",
|
|
|
|
"description_max_codepoints": 180,
|
|
"$comment_length": [
|
|
"180 codepoints, not bytes and not UTF-16 units. The same string measures 248",
|
|
"/ 249 / 253 across the three yardsticks (graceful-handoff: `👉` is astral).",
|
|
"An em-dash costs 3 bytes but 1 codepoint AND 1 UTF-16 unit, so it exposes",
|
|
"only the outer layer and hides the inner one. JS-based tooling reads one",
|
|
"higher per astral character. Upper bound: 207 nearly filled the card's text",
|
|
"field; 220 is untested and may overflow."
|
|
]
|
|
}
|