From bea3cf85b57e57aa4507c8a0160ef18af8f47b59 Mon Sep 17 00:00:00 2001 From: AzurLiu Date: Mon, 1 Jun 2026 13:22:18 +0800 Subject: [PATCH] Hide launch kit from public surface --- CHANGELOG.md | 5 ++ Makefile | 5 +- RELEASE.md | 17 ---- docs/falsiflow_adoption_priorities.md | 3 - docs/falsiflow_architecture.md | 4 +- docs/falsiflow_cli_reference.md | 29 +------ docs/falsiflow_launch_execution.md | 6 +- docs/falsiflow_mvp.md | 15 +--- docs/falsiflow_positioning.md | 11 +-- docs/falsiflow_public_casebook.md | 1 - docs/falsiflow_public_issue_queue.md | 5 +- falsiflow/cli.py | 45 +++++++---- falsiflow/core.py | 4 - falsiflow/release.py | 79 ++----------------- .../falsiflow_tests/regress_falsiflow_core.py | 11 +-- 15 files changed, 59 insertions(+), 181 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56c1b81..981da48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +- Hid maintainer launch-material generation from the public CLI reference and + Makefile so Falsiflow's visible surface stays focused on claim gates, + evidence import, release checks, and reusable CI workflows. +- Removed launch-kit generation from `release-check`; public launch copy, + social posts, and launch metrics are no longer release readiness gates. - Reduced public issue queue and launch execution docs so GitHub issues remain the source of truth instead of mirroring every closed seed issue. - Relaxed release-check coverage for narrative launch docs while keeping the diff --git a/Makefile b/Makefile index f96b1d5..72c24ff 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: install-local pipx-install pipx-start start start-check onboard-check static-demo demo-package publish-kit launch-kit external-evidence external-check release-proof cli-reference casebook-check test release-check clean +.PHONY: install-local pipx-install pipx-start start start-check onboard-check static-demo demo-package publish-kit external-evidence external-check release-proof cli-reference casebook-check test release-check clean PYTHON ?= python3 FALSIFLOW_OUT ?= falsiflow_start @@ -30,9 +30,6 @@ demo-package: install-local publish-kit: install-local falsiflow publish-kit --out-dir falsiflow_publish_kit --force -launch-kit: install-local - falsiflow launch-kit --out-dir falsiflow_launch_kit --force - external-evidence: install-local falsiflow external-evidence --out falsiflow_external_evidence.json --force diff --git a/RELEASE.md b/RELEASE.md index 6e5df66..59b8b03 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -87,7 +87,6 @@ python3 scripts/falsiflow.py onboard --out-dir /tmp/falsiflow_onboard_check --ch python3 scripts/falsiflow.py static-demo --out-dir /tmp/falsiflow_static_demo_check --force --json python3 scripts/falsiflow.py demo-package --out-dir /tmp/falsiflow_public_demo_check --force --json python3 scripts/falsiflow.py publish-kit --out-dir /tmp/falsiflow_publish_kit_check --force --json -python3 scripts/falsiflow.py launch-kit --out-dir /tmp/falsiflow_launch_kit_check --force --json python3 scripts/falsiflow.py external-evidence --out /tmp/falsiflow_external_evidence.json --force --json python3 scripts/falsiflow.py external-check --out-dir /tmp/falsiflow_external_check --force python3 scripts/falsiflow.py evidence import --profile local-llm-eval --input examples/local_llm_eval_import/falsiflow_local_llm_eval/source_files/local_eval_results.jsonl --manifest examples/local_llm_eval_import/falsiflow_local_llm_eval/local_model_manifest.json --out /tmp/falsiflow_local_llm_evidence.csv --summary-out /tmp/falsiflow_local_llm_import_summary.json --config examples/local_llm_eval_import/falsiflow_local_llm_eval/project.json --coverage-out /tmp/falsiflow_local_llm_import_coverage.json --source-file source_files/local_eval_results.jsonl --strict --json @@ -105,8 +104,6 @@ The final `release-check` must report: - `dist_ready` - `demo_package_ready` - `publish_kit_ready` for the generated release handoff kit -- `launch_kit_ready` for public copy, proof card, demo script, launch metrics, - and maintainer checklist - `downstream_smoke_replay_ready`, proving the maintained downstream AI eval, product metric, and RAG eval fixtures replay as placeholder `claim_check_blocked` and source-backed `claim_check_ready` with @@ -228,20 +225,6 @@ Inspect these generated files before publishing: - `data/falsiflow/release_check/publish_kit/release_rehearsal.md` for the public release rehearsal commands, expected artifacts, success signals, and strict external stop conditions -- `data/falsiflow/release_check/launch_kit/launch_summary.json` -- `data/falsiflow/release_check/launch_kit/proof_card.md` -- `data/falsiflow/release_check/launch_kit/announcement.md` -- `data/falsiflow/release_check/launch_kit/demo_script.md` -- `data/falsiflow/release_check/launch_kit/readme_proof_strip.svg` -- `data/falsiflow/release_check/launch_kit/social_preview.png` -- `data/falsiflow/release_check/launch_kit/social_preview.svg` -- `data/falsiflow/release_check/launch_kit/github_repo_profile.md` -- `data/falsiflow/release_check/launch_kit/launch_posts.md` -- `data/falsiflow/release_check/launch_kit/launch_metrics.json` -- `data/falsiflow/release_check/launch_kit/launch_metrics.md` -- `data/falsiflow/release_check/launch_kit/maintainer_checklist.md` -- `data/falsiflow/release_check/launch_kit/publish_kit/public_release_evidence.md` -- `data/falsiflow/release_check/launch_kit/publish_kit/release_rehearsal.md` - `data/falsiflow/release_check/publish_kit/external_evidence_template.json` - `data/falsiflow/release_check/external_readiness/external_readiness.json` - `data/falsiflow/release_check/external_readiness/external_readiness.md` diff --git a/docs/falsiflow_adoption_priorities.md b/docs/falsiflow_adoption_priorities.md index fe99c95..e3e5b9e 100644 --- a/docs/falsiflow_adoption_priorities.md +++ b/docs/falsiflow_adoption_priorities.md @@ -70,9 +70,6 @@ The current track is adoption readiness: - A public release rehearsal generated by `publish-kit` that records the ordered preflight commands, expected artifacts, success signals, and stop conditions before any announcement can claim external readiness. -- A `launch-kit` command that writes public copy, a demo script, proof card, - launch metrics tracker, maintainer checklist, and nested publish handoff for - pre-launch review. - A structured `external-evidence` file and `external-check --evidence` path so hosted demo, public PyPI package, PyPI JSON API response, pipx, and Windows validation are auditable instead of only environment-variable declarations. diff --git a/docs/falsiflow_architecture.md b/docs/falsiflow_architecture.md index 04fbb5b..a39ecd8 100644 --- a/docs/falsiflow_architecture.md +++ b/docs/falsiflow_architecture.md @@ -54,8 +54,8 @@ release artifacts all agree. verified installs. - `falsiflow.adoption` and `falsiflow.release`: adoption priority checks, distribution checks, package surface checks, and release report rendering. -- `falsiflow.public_release`: static demo, publish kit, launch kit, and - external evidence/readiness handoff artifacts. +- `falsiflow.public_release`: static demo, publish handoff, and external + evidence/readiness artifacts. ## Release Invariants diff --git a/docs/falsiflow_cli_reference.md b/docs/falsiflow_cli_reference.md index adf5ac6..4fcaa25 100644 --- a/docs/falsiflow_cli_reference.md +++ b/docs/falsiflow_cli_reference.md @@ -3,7 +3,7 @@ This reference is generated from the active `argparse` command tree. - Status: `cli_reference_ready` -- Commands: 58 +- Commands: 57 Regenerate it with: @@ -17,7 +17,7 @@ falsiflow cli-reference --out docs/falsiflow_cli_reference.md - Discovery and evidence import: `falsiflow discover`, `falsiflow agent`, `falsiflow agent discover`, `falsiflow mcp`, `falsiflow candidate`, `falsiflow candidate rank`, `falsiflow assay-plan`, `falsiflow evidence`, `falsiflow evidence import`, `falsiflow ingest-limina-source-values`, `falsiflow ingest-wide-csv` - First-run and browser workflows: `falsiflow start`, `falsiflow onboard`, `falsiflow try`, `falsiflow wizard`, `falsiflow serve`, `falsiflow quickstart`, `falsiflow doctor` - Project setup: `falsiflow init`, `falsiflow scaffold` -- Release and public adoption: `falsiflow static-demo`, `falsiflow demo-package`, `falsiflow publish-kit`, `falsiflow launch-kit`, `falsiflow external-evidence`, `falsiflow external-check`, `falsiflow release-proof`, `falsiflow casebook-check`, `falsiflow cli-reference`, `falsiflow schema`, `falsiflow selftest`, `falsiflow adoption-check`, `falsiflow release-check` +- Release and public adoption: `falsiflow static-demo`, `falsiflow demo-package`, `falsiflow publish-kit`, `falsiflow external-evidence`, `falsiflow external-check`, `falsiflow release-proof`, `falsiflow casebook-check`, `falsiflow cli-reference`, `falsiflow schema`, `falsiflow selftest`, `falsiflow adoption-check`, `falsiflow release-check` - Template supply chain: `falsiflow template-scaffold`, `falsiflow templates`, `falsiflow template-gallery`, `falsiflow template-check`, `falsiflow template-pack`, `falsiflow verify-template-pack`, `falsiflow template-registry`, `falsiflow template-lock`, `falsiflow template-attest`, `falsiflow verify-template-attestation`, `falsiflow template-policy`, `falsiflow verify-template-policy`, `falsiflow template-release`, `falsiflow verify-template-release`, `falsiflow template-install` ## Command Index @@ -30,7 +30,6 @@ falsiflow cli-reference --out docs/falsiflow_cli_reference.md | `falsiflow static-demo` | Export a hostable static demo site for zero-install visitors. | | `falsiflow demo-package` | Prepare a GitHub Pages/Netlify-ready static demo package. | | `falsiflow publish-kit` | Generate a local handoff kit for GitHub Pages, external readiness, and PyPI release steps. | -| `falsiflow launch-kit` | Generate public launch copy, demo script, proof card, and maintainer checklist. | | `falsiflow external-evidence` | Write a structured JSON template for hosted demo, PyPI, pipx, and Windows validation evidence. | | `falsiflow external-check` | Check public release dependencies such as hosted demo URL, repo URL, PyPI package URL, pipx, and Windows validation. | | `falsiflow release-proof` | Generate a copy-paste release proof snippet from External Evidence artifacts. | @@ -207,29 +206,6 @@ falsiflow publish-kit [-h] [--template TEMPLATE] | `--force` | `` | `no` | `False` | Allow replacing an existing publish-kit directory. | | `--json` | `` | `no` | `False` | Print machine-readable publish handoff summary. | -### `falsiflow launch-kit` - -Generate public launch copy, demo script, proof card, and maintainer checklist. - -```text -falsiflow launch-kit [-h] [--template TEMPLATE] - [--template-root TEMPLATE_ROOT] - [--out-dir OUT_DIR] [--repo-slug REPO_SLUG] - [--public-demo-url PUBLIC_DEMO_URL] [--tag TAG] - [--force] [--json] -``` - -| Argument | Value | Required | Default | Help | -| --- | --- | --- | --- | --- | -| `--template` | `TEMPLATE` | `no` | `biointerface_coatings` | Starter template to use in the nested public demo package. | -| `--template-root` | `TEMPLATE_ROOT` | `no` | `[]` | Extra template root to search before bundled templates. Repeatable. | -| `--out-dir` | `OUT_DIR` | `no` | `falsiflow_launch_kit` | Directory for public launch materials. | -| `--repo-slug` | `REPO_SLUG` | `no` | `` | Optional GitHub repo slug such as OWNER/falsiflow. | -| `--public-demo-url` | `PUBLIC_DEMO_URL` | `no` | `` | Optional hosted public demo URL. | -| `--tag` | `TAG` | `no` | `v0.1.1` | Release tag to include in launch materials. | -| `--force` | `` | `no` | `False` | Allow replacing an existing launch-kit directory. | -| `--json` | `` | `no` | `False` | Print machine-readable launch kit summary. | - ### `falsiflow external-evidence` Write a structured JSON template for hosted demo, PyPI, pipx, and Windows validation evidence. @@ -459,6 +435,7 @@ falsiflow evidence import [-h] --input INPUT --out OUT | `--instrument-id-column` | `INSTRUMENT_ID_COLUMN` | `no` | `` | | | `--notes` | `NOTES` | `no` | `` | | | `--notes-column` | `NOTES_COLUMN` | `no` | `` | | + ### `falsiflow try` Run a 30-second starter demo and write a local browser launchpad. diff --git a/docs/falsiflow_launch_execution.md b/docs/falsiflow_launch_execution.md index 8fa3cfd..f65c1ab 100644 --- a/docs/falsiflow_launch_execution.md +++ b/docs/falsiflow_launch_execution.md @@ -40,9 +40,9 @@ follow-up checks. Use it after the current public release evidence is green. - Live PR demo: - Blocked PR run: - Ready PR run: -- Social preview source: run - `falsiflow launch-kit --out-dir falsiflow_launch_kit --force`, then review - and upload `social_preview.png` in GitHub repository settings. +- Social preview source: use the checked-in proof-strip assets under + `docs/assets/`, then review and upload the chosen PNG in GitHub repository + settings. - Pre-public-post baseline recorded on 2026-06-01 05:49 CST after the upload-ready social preview release: 0 stars, 2 forks, 0 watchers, 8 total views, 1 unique view, 466 total clones, diff --git a/docs/falsiflow_mvp.md b/docs/falsiflow_mvp.md index 6bd5c0d..d6956d4 100644 --- a/docs/falsiflow_mvp.md +++ b/docs/falsiflow_mvp.md @@ -121,9 +121,6 @@ python3 scripts/falsiflow.py demo-package \ python3 scripts/falsiflow.py publish-kit \ --out-dir data/falsiflow/publish_kit \ --force -python3 scripts/falsiflow.py launch-kit \ - --out-dir data/falsiflow/launch_kit \ - --force python3 scripts/falsiflow.py external-evidence \ --out data/falsiflow/external_evidence.json \ --force @@ -141,17 +138,7 @@ and `publish_checklist.md`. `publish-kit` writes `publish_handoff.json`, package so account-bound GitHub/Pages/PyPI steps have a reviewable handoff artifact, a one-page final evidence ledger, and a public release rehearsal with ordered commands, expected artifacts, success signals, and stop conditions. -`launch-kit` adds -`launch_summary.json`, -`proof_card.md`, `announcement.md`, `demo_script.md`, -`readme_proof_strip.svg`, `social_preview.png`, `social_preview.svg`, -`github_repo_profile.md`, -`launch_posts.md`, `launch_metrics.json`, `launch_metrics.md`, and -`maintainer_checklist.md` so public launch copy, GitHub repository profile -settings, social preview imagery, proof points, and 1k-star launch tracking are -reviewed before account-bound publishing. The nested publish handoff also -includes `release_rehearsal.md` so launch reviewers can rehearse the final -public release path before announcements. `external-evidence` writes a fillable JSON +`external-evidence` writes a fillable JSON template for hosted demo, public PyPI package URL plus PyPI JSON API proof, checkout-based pipx smoke, public-package pipx smoke, and Windows/PowerShell smoke evidence. diff --git a/docs/falsiflow_positioning.md b/docs/falsiflow_positioning.md index a7b7741..d84b0ed 100644 --- a/docs/falsiflow_positioning.md +++ b/docs/falsiflow_positioning.md @@ -171,22 +171,19 @@ falsiflow release-check --out-dir data/falsiflow/release_check --force ### Public Launch -Use Falsiflow when the repository needs a public demo, launch copy, proof card, -release rehearsal, and external validation evidence before calling a release -externally ready. +Use Falsiflow when the repository needs a public demo, release rehearsal, and +external validation evidence before calling a release externally ready. Proof path: ```bash -falsiflow launch-kit --out-dir falsiflow_launch_kit --force falsiflow external-evidence --out falsiflow_external_evidence.json --force falsiflow external-check --out-dir falsiflow_external_check --evidence falsiflow_external_evidence.json --force ``` The generated `release_rehearsal.md` keeps the last-mile sequence explicit: -local regression, release-check, casebook replay, launch-kit review, external -evidence capture, `external-check --strict`, and public announcement stop -conditions. +local regression, release-check, casebook replay, external evidence capture, +`external-check --strict`, and public announcement stop conditions. ## Decision Rubric diff --git a/docs/falsiflow_public_casebook.md b/docs/falsiflow_public_casebook.md index 6b00801..3253125 100644 --- a/docs/falsiflow_public_casebook.md +++ b/docs/falsiflow_public_casebook.md @@ -242,7 +242,6 @@ falsiflow template-gallery --out data/falsiflow/template_gallery.md --json-out d falsiflow casebook-check --out-dir data/falsiflow/casebook_check --force falsiflow quickstart --template biointerface_coatings --out public_case_demo --strict falsiflow claim-check --project-dir public_case_demo --strict --force -falsiflow launch-kit --out-dir falsiflow_launch_kit --force ``` End the demo by opening the local launchpad or hosted static demo, then show diff --git a/docs/falsiflow_public_issue_queue.md b/docs/falsiflow_public_issue_queue.md index b62cee5..bac1606 100644 --- a/docs/falsiflow_public_issue_queue.md +++ b/docs/falsiflow_public_issue_queue.md @@ -45,9 +45,8 @@ one higher-context `help wanted` issue while launch feedback is still small. `docs/assets/falsiflow_live_pr_story_reel.svg`, keep `claim_check_blocked`, `claim_check_ready`, and the evidence-package readiness boundary visible, then run `python3 scripts/falsiflow.py - launch-kit --out-dir /tmp/falsiflow_launch_gif_check --force --json` and - `python3 scripts/falsiflow.py release-check --out-dir - /tmp/falsiflow_launch_gif_release_check --force --skip-dist --json`. + release-check --out-dir /tmp/falsiflow_launch_gif_release_check --force + --skip-dist --json`. ## Completed Work diff --git a/falsiflow/cli.py b/falsiflow/cli.py index 6b53a08..0ad75de 100644 --- a/falsiflow/cli.py +++ b/falsiflow/cli.py @@ -1624,7 +1624,6 @@ def run_release_check(artifact_root: Path, run_dist: bool = True) -> dict[str, o demo_package_runner=run_demo_package, external_check_runner=run_external_check, publish_kit_runner=run_publish_kit, - launch_kit_runner=run_launch_kit, quickstart_runner=run_quickstart, doctor_runner=run_doctor, default_evidence_path=default_project_evidence_path, @@ -1669,7 +1668,6 @@ def cmd_release_check(args: argparse.Namespace) -> int: print(f"Demo: {summary['demo_status']}") print(f"Demo package: {summary['demo_package_status']}") print(f"Publish kit: {summary['publish_kit_status']}") - print(f"Launch kit: {summary['launch_kit_status']}") print(f"External readiness: {summary['external_check_status']}") print(f"Schemas: {summary['schema_count']}") print(f"Template gallery: {summary['template_gallery_status']}") @@ -1942,6 +1940,8 @@ def action_value_label(action: argparse.Action) -> str: def cli_argument_record(action: argparse.Action) -> dict[str, object] | None: if action.dest in {"help", "func"} or is_subparser_action(action): return None + if action.help is argparse.SUPPRESS: + return None names = list(action.option_strings) if action.option_strings else [action.metavar or action.dest] default = getattr(action, "default", None) if default is argparse.SUPPRESS or default is None: @@ -1965,6 +1965,8 @@ def parser_command_records(parser: argparse.ArgumentParser, prefix: tuple[str, . continue for name, subparser in action.choices.items(): command = (*prefix, name) + if subparser_help(action, name) == str(argparse.SUPPRESS): + continue child_records = parser_command_records(subparser, command) options = [ record @@ -1990,7 +1992,7 @@ def cli_command_category(command: str) -> str: return "Discovery and evidence import" if root in {"template-scaffold", "templates", "template-gallery", "template-check", "template-pack", "verify-template-pack", "template-registry", "template-lock", "template-attest", "verify-template-attestation", "template-policy", "verify-template-policy", "template-release", "verify-template-release", "template-install"}: return "Template supply chain" - if root in {"static-demo", "demo-package", "publish-kit", "launch-kit", "casebook-check", "external-evidence", "external-check", "release-proof", "adoption-check", "release-check", "selftest", "schema", "cli-reference"}: + if root in {"static-demo", "demo-package", "publish-kit", "casebook-check", "external-evidence", "external-check", "release-proof", "adoption-check", "release-check", "selftest", "schema", "cli-reference"}: return "Release and public adoption" if root in {"validate", "render", "audit", "claim-check", "bundle", "verify-bundle", "next", "sources", "portfolio", "demo"}: return "Core audit and bundle operations" @@ -2089,7 +2091,7 @@ def cmd_cli_reference(args: argparse.Namespace) -> int: markdown = render_cli_reference_markdown(reference) if args.out: args.out.parent.mkdir(parents=True, exist_ok=True) - args.out.write_text(f"{markdown}\n", encoding="utf-8") + args.out.write_text(markdown.rstrip() + "\n", encoding="utf-8") if args.json_out: args.json_out.parent.mkdir(parents=True, exist_ok=True) args.json_out.write_text(json.dumps(reference, indent=2, sort_keys=True) + "\n", encoding="utf-8") @@ -2106,6 +2108,24 @@ def cmd_cli_reference(args: argparse.Namespace) -> int: return 0 +def add_launch_kit_arguments(target: argparse.ArgumentParser) -> None: + target.add_argument("--template", default="biointerface_coatings", help="Starter template to use in the nested public demo package.") + target.add_argument("--template-root", type=Path, action="append", default=[], help="Extra template root to search before bundled templates. Repeatable.") + target.add_argument("--out-dir", type=Path, default=Path("falsiflow_launch_kit"), help="Directory for public launch materials.") + target.add_argument("--repo-slug", default="", help="Optional GitHub repo slug such as OWNER/falsiflow.") + target.add_argument("--public-demo-url", default="", help="Optional hosted public demo URL.") + target.add_argument("--tag", default="v0.1.1", help="Release tag to include in launch materials.") + target.add_argument("--force", action="store_true", help="Allow replacing an existing launch-kit directory.") + target.add_argument("--json", action="store_true", help="Print machine-readable launch kit summary.") + target.set_defaults(func=cmd_launch_kit) + + +def build_launch_kit_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(prog="falsiflow launch-kit", description="Maintainer-only launch material generator.") + add_launch_kit_arguments(parser) + return parser + + def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog="falsiflow", description="Evidence-gated R&D workflow engine.") sub = parser.add_subparsers(dest="command", required=True) @@ -2169,17 +2189,6 @@ def build_parser() -> argparse.ArgumentParser: publish_kit.add_argument("--json", action="store_true", help="Print machine-readable publish handoff summary.") publish_kit.set_defaults(func=cmd_publish_kit) - launch_kit = sub.add_parser("launch-kit", help="Generate public launch copy, demo script, proof card, and maintainer checklist.") - launch_kit.add_argument("--template", default="biointerface_coatings", help="Starter template to use in the nested public demo package.") - launch_kit.add_argument("--template-root", type=Path, action="append", default=[], help="Extra template root to search before bundled templates. Repeatable.") - launch_kit.add_argument("--out-dir", type=Path, default=Path("falsiflow_launch_kit"), help="Directory for public launch materials.") - launch_kit.add_argument("--repo-slug", default="", help="Optional GitHub repo slug such as OWNER/falsiflow.") - launch_kit.add_argument("--public-demo-url", default="", help="Optional hosted public demo URL.") - launch_kit.add_argument("--tag", default="v0.1.1", help="Release tag to include in launch materials.") - launch_kit.add_argument("--force", action="store_true", help="Allow replacing an existing launch-kit directory.") - launch_kit.add_argument("--json", action="store_true", help="Print machine-readable launch kit summary.") - launch_kit.set_defaults(func=cmd_launch_kit) - external_evidence = sub.add_parser("external-evidence", help="Write a structured JSON template for hosted demo, PyPI, pipx, and Windows validation evidence.") external_evidence.add_argument("--out", type=Path, default=Path("falsiflow_external_evidence.json"), help="Path for the external evidence JSON template.") external_evidence.add_argument("--repo-url", default="", help="Optional public repository URL to prefill.") @@ -2619,8 +2628,12 @@ def build_parser() -> argparse.ArgumentParser: def main(argv: list[str] | None = None) -> int: + argv_list = list(sys.argv[1:] if argv is None else argv) + if argv_list[:1] == ["launch-kit"]: + args = build_launch_kit_parser().parse_args(argv_list[1:]) + return args.func(args) parser = build_parser() - args = parser.parse_args(argv) + args = parser.parse_args(argv_list) return args.func(args) diff --git a/falsiflow/core.py b/falsiflow/core.py index 9ba2b3d..f891dc3 100644 --- a/falsiflow/core.py +++ b/falsiflow/core.py @@ -2160,8 +2160,6 @@ def release_check_json_schema() -> dict[str, Any]: "external_check_summary", "publish_kit_status", "publish_kit_summary", - "launch_kit_status", - "launch_kit_summary", "quickstart_status", "quickstart_summary", "doctor_status", @@ -2234,8 +2232,6 @@ def release_check_json_schema() -> dict[str, Any]: "external_check_summary": {"type": "object"}, "publish_kit_status": {"type": "string"}, "publish_kit_summary": {"type": "object"}, - "launch_kit_status": {"type": "string"}, - "launch_kit_summary": {"type": "object"}, "quickstart_status": {"type": "string"}, "quickstart_summary": {"type": "object"}, "doctor_status": {"type": "string"}, diff --git a/falsiflow/release.py b/falsiflow/release.py index 92273a7..b549ea6 100644 --- a/falsiflow/release.py +++ b/falsiflow/release.py @@ -106,8 +106,6 @@ def release_review_artifact_index(summary: dict[str, object]) -> list[dict[str, claim_outputs = claim_summary.get("outputs", {}) if isinstance(claim_summary, dict) and isinstance(claim_summary.get("outputs"), dict) else {} template_release_verification = summary.get("template_release_verification_summary", {}) release_artifacts = template_release_verification if isinstance(template_release_verification, dict) else {} - launch_kit_summary = summary.get("launch_kit_summary", {}) - launch_outputs = launch_kit_summary.get("outputs", {}) if isinstance(launch_kit_summary, dict) and isinstance(launch_kit_summary.get("outputs"), dict) else {} demo_package_summary = summary.get("demo_package_summary", {}) demo_outputs = demo_package_summary.get("outputs", {}) if isinstance(demo_package_summary, dict) and isinstance(demo_package_summary.get("outputs"), dict) else {} publish_kit_summary = summary.get("publish_kit_summary", {}) @@ -168,24 +166,6 @@ def output_path(key: str, fallback: Path) -> str: "path": str(demo_outputs.get("summary", "") or artifact_root / "public_demo" / "demo_package_summary.json"), "purpose": "Hostable static demo package used for zero-install public review.", }, - { - "artifact": "Launch proof card", - "status": str(summary.get("launch_kit_status", "")), - "path": str(launch_outputs.get("proof_card_report", "") or artifact_root / "launch_kit" / "proof_card.md"), - "purpose": "Concise public proof points, try commands, verification commands, and responsible-use boundary.", - }, - { - "artifact": "Launch metrics tracker", - "status": str(launch_kit_summary.get("launch_metrics_status", "") if isinstance(launch_kit_summary, dict) else ""), - "path": str(launch_outputs.get("launch_metrics_report", "") or artifact_root / "launch_kit" / "launch_metrics.md"), - "purpose": "1k-star launch tracking for traffic, referrers, stars, demo visits, install signals, questions, and follow-up fixes.", - }, - { - "artifact": "Launch posts", - "status": str(summary.get("launch_kit_status", "")), - "path": str(launch_outputs.get("launch_posts", "") or artifact_root / "launch_kit" / "launch_posts.md"), - "purpose": "Draft public launch copy for review before account-bound publishing.", - }, { "artifact": "External readiness report", "status": str(summary.get("external_check_status", "")), @@ -251,7 +231,6 @@ def render_release_check_report(summary: dict[str, object]) -> str: f"- Verified bundles: {summary.get('bundle_verified_count', 0)}", f"- Demo package: `{summary.get('demo_package_status', '')}`", f"- Publish kit: `{summary.get('publish_kit_status', '')}`", - f"- Launch kit: `{summary.get('launch_kit_status', '')}`", f"- External readiness: `{summary.get('external_check_status', '')}`", f"- Failures: {summary.get('failure_count', 0)}", "", @@ -1144,8 +1123,8 @@ def add(check_id: str, ok: bool, message: str, path: Path | str = "") -> None: add("onboard_docs", all(token in cli_docs_text + makefile_text for token in ["falsiflow onboard", "onboard-check:"]), "CLI docs document beginner onboarding.", cli_reference_path) add("static_demo_docs", all(token in launch_docs_text + cli_reference_text + makefile_text for token in ["falsiflow static-demo", "static-demo:", "GitHub Pages"]), "CLI and launch docs document static zero-install demo export.", cli_reference_path) add("demo_package_docs", all(token in launch_docs_text + cli_reference_text for token in ["falsiflow demo-package", "demo_package_summary.json", "FALSIFLOW_PUBLIC_DEMO_URL"]), "CLI and launch docs document public demo packaging and hosted URL handoff.", cli_reference_path) - add("publish_kit_docs", all(token in launch_docs_text + cli_reference_text for token in ["falsiflow publish-kit", "publish_handoff.json", "public_release_evidence.json", "release_rehearsal.json", "Scorecard"]), "CLI and release docs document the public release handoff kit, evidence ledger, and account-bound rehearsal.", release_path) - add("launch_kit_docs", all(token in launch_docs_text + cli_reference_text for token in ["falsiflow launch-kit", "launch_summary.json", "proof_card.md", "social_preview.png", "launch_metrics.json", "public_release_evidence.md", "maintainer_checklist.md"]), "CLI and launch docs document public launch materials, proof-card generation, social preview assets, launch metrics, publish evidence, and maintainer checklist.", launch_plan_path) + add("publish_kit_docs", all(token in launch_docs_text + cli_reference_text for token in ["falsiflow publish-kit", "publish_handoff.json", "public_release_evidence.json", "release_rehearsal.json", "Scorecard"]) and "falsiflow launch-kit" not in cli_reference_text, "CLI and release docs document the public release handoff kit while generated launch materials stay out of the public CLI reference.", release_path) + add("public_cli_no_launch_kit", "falsiflow launch-kit" not in cli_reference_text + makefile_text, "Public CLI reference and Makefile no longer advertise maintainer launch-material generation as a user-facing command.", cli_reference_path) add("launch_metrics_docs", all(token in launch_docs_text for token in ["launch metrics", "GitHub traffic", "stars", "forks", "demo visits", "install/download signals", "launch_metrics.json", "launch_metrics.md", "local/private validation"]), "Launch docs, adoption priorities, and roadmap document post-launch metrics tracking and validation boundaries for the 1k-star path.", adoption_priorities_path) add( "public_issue_queue_docs", @@ -1160,7 +1139,7 @@ def add(check_id: str, ok: bool, message: str, path: Path | str = "") -> None: "issues/39", "short launch GIF", "falsiflow_live_pr_story_reel.svg", - "falsiflow_launch_gif_check", + "falsiflow_launch_gif_release_check", "help wanted", "good first issue", "claim_check_blocked", @@ -1263,7 +1242,7 @@ def add(check_id: str, ok: bool, message: str, path: Path | str = "") -> None: "Falsiflow Launch Execution", "Pre-public-post baseline", "upload-ready social preview release", - "social_preview.png", + "docs/assets/", "0 stars", "2 forks", "open issues #22 and #39", @@ -1396,7 +1375,7 @@ def add(check_id: str, ok: bool, message: str, path: Path | str = "") -> None: add("workbench_docs", all(token in docs_reference_text for token in ["workbench.html", "ready/blocked status", "review flow", "evidence lineage", "repair checklist", "source manifest", "bundle verification"]), "Docs document the browser workbench closed loop without crowding the README launch surface.", adoption_priorities_path) add("discover_docs", all(token in public_interface_docs_text + docs_reference_text for token in ["falsiflow discover", "evidence_records.json", "candidate_queue.json", "claim_ready=false"]), "CLI and architecture docs document structured discovery outputs and the non-claim boundary.", cli_reference_path) add("public_interface_docs", all(token in public_interface_docs_text for token in ["falsiflow agent discover", "falsiflow candidate rank", "falsiflow assay-plan", "falsiflow evidence import"]), "CLI docs document the structured discovery and evidence public interfaces.", cli_reference_path) - add("makefile_entrypoints", all(token in makefile_text for token in ["install-local:", "pipx-install:", "start:", "start-check:", "onboard-check:", "static-demo:", "demo-package:", "publish-kit:", "launch-kit:", "external-evidence:", "external-check:", "release-proof:", "cli-reference:", "casebook-check:", "release-check:"]), "Makefile exposes install, pipx, start, onboarding, static-demo, demo-package, publish-kit, launch-kit, external-evidence, external-check, release-proof, cli-reference, casebook-check, and release-check shortcuts.", makefile_path) + add("makefile_entrypoints", all(token in makefile_text for token in ["install-local:", "pipx-install:", "start:", "start-check:", "onboard-check:", "static-demo:", "demo-package:", "publish-kit:", "external-evidence:", "external-check:", "release-proof:", "cli-reference:", "casebook-check:", "release-check:"]), "Makefile exposes install, pipx, start, onboarding, demo, release, external-readiness, and casebook shortcuts without surfacing maintainer launch-material generation.", makefile_path) add("github_ci_workflow", all(token in github_ci_text for token in ["regress_falsiflow_core.py", "release-check", "template-pack", "template-release", "demo-package", "agent discover", "evidence import", "evidence-record", "Reusable action smoke", "Reusable action local LLM import smoke", "mode: evidence-import", "uses: ./", "ai_claim_evaluation"]), "GitHub Actions CI workflow covers regression, release-check, public interfaces, template supply-chain gates, reusable-action smoke, and local LLM evidence-import smoke.", github_ci_path) add("github_action_entrypoint", all(token in action_text for token in ["using: composite", "actions/setup-python@v6", "install-command", "GITHUB_ACTION_PATH", "mode", "claim-check", "evidence-import", "template-check", "casebook-check", "release-check", "adoption-check", "quickstart", "external-check", "summary-json", "GITHUB_OUTPUT"]), "Reusable GitHub Action exposes supported Falsiflow gates, evidence import, current Python setup action, default action-checkout install, install override, and output metadata.", action_path) add("github_action_yaml_safe", not action_description_colon_conflicts and 'description: "Gate to run:' in action_text, "Reusable GitHub Action metadata quotes colon-bearing descriptions for YAML safety.", action_path) @@ -1441,7 +1420,7 @@ def add(check_id: str, ok: bool, message: str, path: Path | str = "") -> None: add("license_mit", "MIT License" in license_text, "LICENSE declares MIT License.", license_path) add("changelog_current_version", bool(current_version) and current_version in changelog_text, "CHANGELOG includes the current version.", changelog_path) add("contributing_gates", all(token in contributing_text for token in ["release-check", "casebook-check", "claim_ready", "CHANGELOG.md", "CODE_OF_CONDUCT.md", "SUPPORT.md", "GOVERNANCE.md", "CITATION.cff", "ROADMAP.md", "falsiflow_architecture.md", "falsiflow_data_contract.md", "falsiflow_adapter_profiles.md", "falsiflow_casebook_check.md", "falsiflow_template_authoring.md", "falsiflow_troubleshooting.md"]), "CONTRIBUTING.md documents gates, tests, changelog, and community, citation, governance, architecture, data-contract, adapter-profile, casebook-check, template authoring, and troubleshooting expectations.", contributing_path) - add("release_checklist", all(token in release_text for token in ["release_ready", "package_ready", "dist_ready", "release_validation_ready", "demo_package_ready", "publish_kit_ready", "launch_kit_ready", "downstream_smoke_replay_ready", "launch_metrics.json", "launch_metrics.md", "public_release_evidence.json", "public_release_evidence.md", "release_rehearsal.json", "release_rehearsal.md", "public release rehearsal", "casebook_check_ready", "mcp --selftest --json", "mcp_selftest_ready", "external-evidence", "external_check_status", "falsiflow release-proof", "release_proof.md", "pypi_version_match=passed", "public_package_claim_check=passed", "public PyPI package URL", "PyPI JSON API", "expected_version", "published_version", "falsiflow_pypi_project.json", "falsiflow_expected_version.txt", "falsiflow_pypi_version.txt", "falsiflow_public_package_first_run_quickstart.json", "falsiflow_public_package_first_run_doctor.json", "falsiflow_public_package_claim_check.json", "falsiflow_public_package_mcp_selftest.json", "invalid-publisher", "falsiflow-publish.yml", "public-package pipx", "public-package first-run quickstart/doctor", "public-package claim-check", "public-package MCP selftest", "Falsiflow External Evidence", "falsiflow_external_evidence.json", "release-check", "casebook-check", "Release Review Artifact Index", "Review Artifact Index", "PyPI package metadata", "requires-python", "classifiers", "project URLs", "action.yml", "GitHub Action", "evidence-import", "examples/downstream_ai_eval_smoke", "examples/downstream_product_metric_smoke", "examples/downstream_rag_eval_smoke", "examples/local_llm_eval_import", "reusable-action quickstart smoke", "CODE_OF_CONDUCT.md", "SUPPORT.md", "ROADMAP.md", "CITATION.cff", "GOVERNANCE.md", "falsiflow_architecture.md", "falsiflow_data_contract.md", "falsiflow_adapter_profiles.md", "falsiflow_mcp.md", "falsiflow_casebook_check.md", "falsiflow_security_posture.md", "falsiflow_template_authoring.md", "falsiflow_troubleshooting.md", "falsiflow_1k_launch_plan.md", "Dependabot", "Falsiflow Scorecard"]), "RELEASE.md documents required release gates, MCP selftest, review artifact indexes, launch metrics, 1k launch plan, public release evidence ledger, release rehearsal, release-proof snippets, reusable GitHub Action evidence import, downstream fixture replay, local LLM fixture, public package, public-package first-run, claim-check, and MCP selftest, and PyPI JSON expected-version evidence, PyPI trusted-publisher recovery, casebook proof artifacts, external evidence workflow artifacts, package metadata checks, community trust files, citation/governance files, architecture docs, data-contract docs, adapter-profile docs, MCP docs, template authoring docs, troubleshooting docs, and security automation.", release_path) + add("release_checklist", all(token in release_text for token in ["release_ready", "package_ready", "dist_ready", "release_validation_ready", "demo_package_ready", "publish_kit_ready", "downstream_smoke_replay_ready", "public_release_evidence.json", "public_release_evidence.md", "release_rehearsal.json", "release_rehearsal.md", "public release rehearsal", "casebook_check_ready", "mcp --selftest --json", "mcp_selftest_ready", "external-evidence", "external_check_status", "falsiflow release-proof", "release_proof.md", "pypi_version_match=passed", "public_package_claim_check=passed", "public PyPI package URL", "PyPI JSON API", "expected_version", "published_version", "falsiflow_pypi_project.json", "falsiflow_expected_version.txt", "falsiflow_pypi_version.txt", "falsiflow_public_package_first_run_quickstart.json", "falsiflow_public_package_first_run_doctor.json", "falsiflow_public_package_claim_check.json", "falsiflow_public_package_mcp_selftest.json", "invalid-publisher", "falsiflow-publish.yml", "public-package pipx", "public-package first-run quickstart/doctor", "public-package claim-check", "public-package MCP selftest", "Falsiflow External Evidence", "falsiflow_external_evidence.json", "release-check", "casebook-check", "Release Review Artifact Index", "Review Artifact Index", "PyPI package metadata", "requires-python", "classifiers", "project URLs", "action.yml", "GitHub Action", "evidence-import", "examples/downstream_ai_eval_smoke", "examples/downstream_product_metric_smoke", "examples/downstream_rag_eval_smoke", "examples/local_llm_eval_import", "reusable-action quickstart smoke", "CODE_OF_CONDUCT.md", "SUPPORT.md", "ROADMAP.md", "CITATION.cff", "GOVERNANCE.md", "falsiflow_architecture.md", "falsiflow_data_contract.md", "falsiflow_adapter_profiles.md", "falsiflow_mcp.md", "falsiflow_casebook_check.md", "falsiflow_security_posture.md", "falsiflow_template_authoring.md", "falsiflow_troubleshooting.md", "falsiflow_1k_launch_plan.md", "Dependabot", "Falsiflow Scorecard"]) and "launch_kit_ready" not in release_text, "RELEASE.md documents required release gates, MCP selftest, review artifact indexes, public release evidence ledger, release rehearsal, release-proof snippets, reusable GitHub Action evidence import, downstream fixture replay, local LLM fixture, public package, public-package first-run, claim-check, and MCP selftest without making launch copy a release gate.", release_path) add("architecture_docs", all(token in architecture_text for token in ["Core Data Model", "Command Flow", "Module Map", "Release Invariants", "Extension Points", "falsiflow_data_contract.md", "claim_ready", "release-check"]), "Architecture doc explains data model, command flow, module map, release invariants, extension points, data contract, and release-check coverage.", architecture_path) add("data_contract_docs", all(token in data_contract_text for token in ["Stable Inputs", "Evidence CSV", "JSON Status Contract", "Report Artifacts", "Source Provenance", "JSON Schemas", "Integration Guidance", "claim_check_ready", "external_ready", "source_file"]), "Data contract doc explains stable inputs, evidence CSV fields, JSON status, report artifacts, source provenance, schemas, integration guidance, and ready statuses.", data_contract_path) add("adapter_profiles_docs", all(token in adapter_profiles_text for token in ["Falsiflow Adapter Profiles", "generic-wide", "vendor-measurement", "instrument-export", "plate-reader", "local-llm-eval", "rag-eval", "falsiflow_local_llm_eval.md", "falsiflow_rag_quality_gate_proposal.md", "examples/local_llm_eval_import", "examples/downstream_rag_eval_smoke", "coverage_ready", "claim_check_ready", "evidence-package readiness", "mode: evidence-import", "adapter_profile", "adapter_settings"]), "Adapter profile doc explains built-in CSV import profiles, local LLM and RAG eval proof handoffs, maintained fixtures, action import mode, summary fields, overrides, and coverage checks.", adapter_profiles_path) @@ -1829,7 +1808,6 @@ def run_release_check( demo_package_runner: Callable[..., Any], external_check_runner: Callable[..., Any], publish_kit_runner: Callable[..., Any], - launch_kit_runner: Callable[..., Any], quickstart_runner: Callable[..., Any], doctor_runner: Callable[..., Any], default_evidence_path: Callable[..., Any], @@ -1924,49 +1902,6 @@ def run_release_check( publish_kit_summary = {"status": "publish_kit_failed", "message": str(exc)} failures.append(failure_record("publish_kit", "handoff", str(exc))) - try: - launch_kit_summary = launch_kit_runner(artifact_root / "launch_kit", "biointerface_coatings", [], force=True) - if launch_kit_summary.get("status") != "launch_kit_ready": - failures.append(failure_record("launch_kit", "handoff", f"Launch kit ended as {launch_kit_summary.get('status', '')}.")) - else: - launch_kit_dir = artifact_root / "launch_kit" - launch_content_checks = { - "launch_posts": ( - launch_kit_dir / "launch_posts.md", - ["Channel Checklist", "Hacker News / Show HN", "Reddit / community threads", "LinkedIn", "Awesome lists / ecosystem repos", "responsible-use boundary", "launch_metrics.md", "Show HN", "unverifiable AI eval claims", f"AzurLiu/falsiflow@v{FALSIFLOW_VERSION}", "falsiflow-downstream-ai-eval-demo", "26711652990", "26711669112", "falsiflow-downstream-rag-eval-demo", "26721829145", "26721856616", "falsiflow-downstream-product-metric-demo", "26726360229", "26726392921", "AI eval downstream PR", "RAG eval downstream PR", "Product metric downstream PR", "Demo PR playbook", "Reply Bank", "Great Expectations", "GITHUB_ACTION_PATH", "claim_check_blocked", "claim_check_ready"], - ), - "launch_github_repo_profile": ( - launch_kit_dir / "github_repo_profile.md", - ["Upload `social_preview.png`", "social_preview.svg", "Live AI eval downstream PR proof", "AI eval blocked CI run", "AI eval ready CI run", "Live RAG eval downstream PR proof", "RAG eval blocked CI run", "RAG eval ready CI run", "Live product metric downstream PR proof", "Product metric blocked CI run", "Product metric ready CI run", "falsiflow-downstream-ai-eval-demo", "falsiflow-downstream-rag-eval-demo", "falsiflow-downstream-product-metric-demo", "26711652990", "26711669112", "26721829145", "26721856616", "26726360229", "26726392921"], - ), - "launch_announcement": ( - launch_kit_dir / "announcement.md", - ["Falsiflow is a CI gate for claims", "falsiflow_demo_pr_playbook.md", "claim_check_blocked", "claim_check_ready", "Public Release Boundary"], - ), - "launch_demo_script": ( - launch_kit_dir / "demo_script.md", - ["## 2:15 Demo PR", "evidence_placeholder_demo.csv", "evidence_pass_demo.csv", "claim_check_blocked", "claim_check_ready"], - ), - "launch_maintainer_checklist": ( - launch_kit_dir / "maintainer_checklist.md", - ["falsiflow_demo_pr_playbook.md", "claim_check_blocked", "claim_check_ready", "Launch Metrics"], - ), - "launch_metrics": ( - launch_kit_dir / "launch_metrics.md", - ["demo PR playbook", "demo PR replay", "day-14", "Falsiflow 1k-Star Launch Tracker"], - ), - } - for check_id, (path, tokens) in launch_content_checks.items(): - text = path.read_text(encoding="utf-8") if path.exists() else "" - missing_tokens = [token for token in tokens if token not in text] - if missing_tokens: - failures.append(failure_record("launch_kit_content", check_id, f"Missing launch-kit content tokens: {', '.join(missing_tokens)}")) - if check_id in {"launch_announcement", "launch_demo_script", "launch_posts"} and text.count("```") % 2: - failures.append(failure_record("launch_kit_content", check_id, "Markdown code fences are not balanced.")) - except Exception as exc: # pragma: no cover - defensive CLI boundary. - launch_kit_summary = {"status": "launch_kit_failed", "message": str(exc)} - failures.append(failure_record("launch_kit", "handoff", str(exc))) - quickstart_summary: dict[str, object] try: quickstart_summary = quickstart_runner( @@ -2444,8 +2379,6 @@ def run_release_check( "external_check_summary": external_check_summary, "publish_kit_status": publish_kit_summary.get("status", ""), "publish_kit_summary": publish_kit_summary, - "launch_kit_status": launch_kit_summary.get("status", ""), - "launch_kit_summary": launch_kit_summary, "quickstart_status": quickstart_summary.get("status", ""), "quickstart_summary": quickstart_summary, "doctor_status": doctor_summary.get("status", ""), diff --git a/scripts/falsiflow_tests/regress_falsiflow_core.py b/scripts/falsiflow_tests/regress_falsiflow_core.py index fbbfc7c..2e381ef 100644 --- a/scripts/falsiflow_tests/regress_falsiflow_core.py +++ b/scripts/falsiflow_tests/regress_falsiflow_core.py @@ -435,7 +435,6 @@ def assert_schema_contract() -> None: assert "demo_package_status" in release_schema["required"] assert "external_check_status" in release_schema["required"] assert "publish_kit_status" in release_schema["required"] - assert "launch_kit_status" in release_schema["required"] assert "template_check_ready_count" in release_schema["required"] assert "template_pack_verification_status" in release_schema["required"] assert "template_install_status" in release_schema["required"] @@ -1805,6 +1804,7 @@ def assert_cli_contract() -> None: assert cli_reference_summary["status"] == "cli_reference_ready" commands = {record["command"] for record in cli_reference_summary["commands"]} assert {"start", "cli-reference", "release-check", "release-proof", "external-evidence", "casebook-check", "evidence import", "template-release"} <= commands + assert "launch-kit" not in commands assert cli_reference_summary["command_count"] >= 50 assert cli_reference_md.exists() assert cli_reference_json.exists() @@ -3021,7 +3021,7 @@ def tamper_registry_with_matching_artifact_hash(entries: dict[str, bytes]) -> di "static_demo_docs", "demo_package_docs", "publish_kit_docs", - "launch_kit_docs", + "public_cli_no_launch_kit", "launch_metrics_docs", "launch_execution_exists", "launch_execution_docs", @@ -3159,7 +3159,7 @@ def tamper_registry_with_matching_artifact_hash(entries: dict[str, bytes]) -> di assert release_summary["template_count"] == EXPECTED_TEMPLATE_COUNT assert release_summary["bundle_verified_count"] == EXPECTED_TEMPLATE_COUNT assert release_summary["failure_count"] == 0 - assert any(artifact["artifact"] == "Launch metrics tracker" for artifact in release_summary["release_review_artifact_index"]) + assert not any("Launch" in artifact["artifact"] for artifact in release_summary["release_review_artifact_index"]) assert any(artifact["artifact"] == "Public release evidence ledger" for artifact in release_summary["release_review_artifact_index"]) assert any(artifact["artifact"] == "Public release rehearsal" for artifact in release_summary["release_review_artifact_index"]) assert (release_check_out / "release_check.json").exists() @@ -3179,9 +3179,6 @@ def tamper_registry_with_matching_artifact_hash(entries: dict[str, bytes]) -> di assert (release_check_out / "casebook_check" / "casebook_reviewer_replay.ps1").exists() assert (release_check_out / "claim_check" / "claim_check.json").exists() assert (release_check_out / "claim_check" / "claim_check.md").exists() - assert (release_check_out / "launch_kit" / "launch_summary.json").exists() - assert (release_check_out / "launch_kit" / "launch_metrics.json").exists() - assert (release_check_out / "launch_kit" / "launch_metrics.md").exists() assert (release_check_out / "publish_kit" / "public_release_evidence.json").exists() assert (release_check_out / "publish_kit" / "public_release_evidence.md").exists() assert (release_check_out / "publish_kit" / "release_rehearsal.json").exists() @@ -3190,7 +3187,6 @@ def tamper_registry_with_matching_artifact_hash(entries: dict[str, bytes]) -> di assert "Adoption Repair Checklist" in release_report assert "Release Review Artifact Index" in release_report assert "Template release verification" in release_report - assert "Launch metrics tracker" in release_report assert "Public release evidence ledger" in release_report assert "Public release rehearsal" in release_report assert "Downstream Smoke Replay" in release_report @@ -3204,7 +3200,6 @@ def tamper_registry_with_matching_artifact_hash(entries: dict[str, bytes]) -> di assert (release_check_out / "downstream_smoke_replay" / "downstream_rag_eval_smoke" / "blocked" / "claim_check.json").exists() assert (release_check_out / "downstream_smoke_replay" / "downstream_rag_eval_smoke" / "ready" / "claim_check.json").exists() assert "claim_check/claim_check.md" in release_report - assert "launch_kit/launch_metrics.md" in release_report assert "publish_kit/public_release_evidence.md" in release_report assert "publish_kit/release_rehearsal.md" in release_report assert "Release validation: `release_validation_ready`" in release_report