From 3bb008b8ec04056e826b3c67a51b2aecb629b4f1 Mon Sep 17 00:00:00 2001 From: Timothy Wayne Gregg Date: Fri, 30 Oct 2026 04:04:45 -0400 Subject: [PATCH 01/79] docs: document the global --allow-t3 Document the global --allow-t3 flag (before the command) in SKILL.md (synopsis, Command Reference, co-owner sign-off paragraph and the refusal sentence), the Unreleased CHANGELOG, and the org and projects references. The flag applies to every repository command, generator, doctor, lint and the org and project groups. It lifts only the T3 refusal for one invocation; excluded and HOLD owners stay refused. Add tests/test_allow_t3_docs.py to check the synopsis, the refusal text, the CHANGELOG entry and the --help output. No behaviour change; scripts, the shared package validator and its contract test are untouched. Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 1 + SKILL.md | 6 +++-- references/org.md | 2 +- references/projects.md | 2 +- tests/test_allow_t3_docs.py | 49 +++++++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 tests/test_allow_t3_docs.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 46719ce..4fc64a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ All notable changes to `github-showcase-skill` are recorded here. Versions follo - `content social` renders the personal-profile capstone and backup repositories wherever R10 and the `adopt` upload job include them; it previously exempted them, so the planned upload had no image. Where R10 leaves them out (the archive org, an archived capture) they stay exempt. - Label job plans include a per-repository `labels:OWNER/REPO` group for writer reconciliation. Explicit orchestrator groups are preserved. - `adopt` withholds jobs and change records for an archived capture, with instructions to re-capture inside the approved unarchive/polish/re-archive cycle. Security jobs are emitted only for active eligible repositories. +- Global `--allow-t3` (before the command) signs off a T3 co-owned repository for one invocation across every repository command, generator, `doctor`, `lint` and the `org` and `project` groups, not only `meta`. The default still refuses T3 owners (exit 2, `t3-signoff`); excluded and HOLD owners stay refused. Pick Your AI also gets its own palette, mark and attribution (PR #20). ## 1.0.0 — 2026-10-26 diff --git a/SKILL.md b/SKILL.md index e76ae1c..a2a196c 100644 --- a/SKILL.md +++ b/SKILL.md @@ -55,7 +55,7 @@ Every surface uses one **dark** design on both GitHub themes (decision 21): navy | A set must be reviewed the way GitHub shows it | `contact-sheet` | | Coverage must be reported or a repository verified as done | `lint all`, then `doctor` | -Do not use it for accounts outside the estate. Excluded owners (BunsDev, GoZippy, h-mascot, lmvdz, GalaxyRuler, and per decisions 1 and 2 MetatronAngelAgent and PrompDev) and T3 owners before co-owner sign-off (Pick-Your-AI, Jevelopers-neatHack-2026) are refused with exit 2. +Do not use it for accounts outside the estate. Excluded owners (BunsDev, GoZippy, h-mascot, lmvdz, GalaxyRuler, and per decisions 1 and 2 MetatronAngelAgent and PrompDev) are refused with exit 2, and T3 owners before co-owner sign-off (Pick-Your-AI, Jevelopers-neatHack-2026) are refused with exit 2 unless the global `--allow-t3` is passed for that run. ## Boundaries @@ -111,6 +111,8 @@ python3 $S --meta /tmp/meta.json doctor --header Checks (`describe`, `topics`, `labels`, `readme`, `footer`, `meta`, `fingerprint`, `config`) print one JSON object with `command`, `owner`, `repo`, `result` and `logs[]`; `lint` prints one JSON line per file; `org`, `project`, `enterprise` and `content` print one JSON object with `action` (`org doctor --doctor-format tsv|md` prints a row). Generators (`banner`, `card`, `org-banner`, `org-tile`, `intro`, `contact-sheet`) print a short text summary by default; pass the global `--format json` (before the command) for the same JSON object. `doctor` prints a TSV row (`--format json|md` after `doctor`). In text mode a refusal goes to stderr. Log codes are the standard's: `needs-input:`, `art-fail`, `topics-short`, `label-conflict`, `label-referenced`, `label-rewrite-first`, `needs-input:label-references` (a rename held because §6.4 rule 0 needs a checkout: re-plan with `--repo-dir`), `readme-shrink`, `dead-link`, `exempt`, `hold`, `t3-signoff`, `archived`, plus `needs-input:metadata` (a failed metadata capture, exit 4), `needs-input:file-tree` (no checkout and no tree in the metadata, so the type is provisional), `needs-input:visibility`, `needs-input:banner-chips` (fewer than two chips), `needs-input:key-chip` (no gold chip: the type category would repeat the eyebrow), `needs-input:subtitle` (no one-line subtitle: add `subtitle:`), `type-override:`, `type-config:` (from `.github/showcase.yml`) and `bootstrap:edited`. +**Co-owner sign-off (`--allow-t3`).** `--allow-t3` is a global option placed before the command (`python3 $S --allow-t3 --meta meta.json banner`). It applies to every repository command, generator, `doctor`, `lint` and the `org` and `project` groups, not only `meta`; `meta`, `org` and `project` also accept it after the command name. Pass it only for one explicitly approved invocation, after an approved `t3-metadata` or `t3-signoff` row. Without it a T3 owner (Pick-Your-AI, Jevelopers-neatHack-2026) is refused: exit 2, result `refused`, log `t3-signoff`. With it, excluded owners (log `exempt`) and HOLD owners (log `hold`) are still refused; the flag lifts only the T3 refusal. It holds for that one invocation only and is off again afterwards; it is never read from a config file or environment. + ## Orgs, Projects, the Enterprise and Content CLI stdout and stderr use UTF-8, including redirected Windows output, raw footer markup, @@ -163,7 +165,7 @@ python3 $S --meta meta.json content links --base-ref origin/main --diff # in ## Command Reference ```text -python3 /scripts/showcase.py [--config PATH] [--repo-dir DIR | --no-repo-dir] [--meta FILE] [--type TYPE] [--format json|text] [--quiet] [--version] [options] +python3 /scripts/showcase.py [--config PATH] [--repo-dir DIR | --no-repo-dir] [--meta FILE] [--type TYPE] [--format json|text] [--quiet] [--allow-t3] [--version] [options] meta --from-gh OWNER/REPO [--out FILE] [--allow-t3] fingerprint [--out-dir docs/images] [--github-output] diff --git a/references/org.md b/references/org.md index 99f0a98..78e2371 100644 --- a/references/org.md +++ b/references/org.md @@ -14,7 +14,7 @@ python3 $S org health ORG [--dot-github CHECKOUT] # O4: §8.1 python3 $S org doctor ORG --snapshot org-snapshot.json [--dot-github CHECKOUT] [--avatar avatar.png] [--doctor-format tsv|json|md] [--header] ``` -Every action takes `ORG` (any former login resolves, see below), `--registry`, `--meta-dir`, `--decisions`, `--approved`, `--approved-yaml`, `--actions`, `--allow-t3` and `--jobs FILE` (append the writer jobs as JSON lines). +Every action takes `ORG` (any former login resolves, see below), `--registry`, `--meta-dir`, `--decisions`, `--approved`, `--approved-yaml`, `--actions`, `--allow-t3` and `--jobs FILE` (append the writer jobs as JSON lines). The global `--allow-t3` (before the command) is equivalent. | Action | Reads | Emits | Writes | |---|---|---|---| diff --git a/references/projects.md b/references/projects.md index 32dc731..55bbedc 100644 --- a/references/projects.md +++ b/references/projects.md @@ -36,7 +36,7 @@ python3 $S project estate-plan [--copied after-copy.json] [--user-id ID] [--jobs | `readme` | Fills the §13.7 README template for a copied board (view numbers from the post-copy capture). The same privacy gate as `copy-plan`: a board that is public (as captured) or may go public (an org board with an approved visibility item) gets no repository in its Links line, from `--repos` or the capture (`readme-links:repositories-omitted (the board may go public)`). The Fields table and the Workflow line document the board's own options (a kept scale such as P0/P1/P2, its workstreams, its Status flow), and in `copy-plan` the options the plan's jobs leave; emoji in option text are dropped from the README (`readme-emoji-stripped:/