falsiflow 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. falsiflow-0.1.2/.github/ISSUE_TEMPLATE/bug_report.yml +58 -0
  2. falsiflow-0.1.2/.github/ISSUE_TEMPLATE/claim_gate_request.yml +58 -0
  3. falsiflow-0.1.2/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. falsiflow-0.1.2/.github/ISSUE_TEMPLATE/feature_request.yml +52 -0
  5. falsiflow-0.1.2/.github/PULL_REQUEST_TEMPLATE.md +27 -0
  6. falsiflow-0.1.2/.github/dependabot.yml +17 -0
  7. falsiflow-0.1.2/.github/workflows/falsiflow-cross-platform.yml +69 -0
  8. falsiflow-0.1.2/.github/workflows/falsiflow-external-evidence.yml +269 -0
  9. falsiflow-0.1.2/.github/workflows/falsiflow-pages.yml +54 -0
  10. falsiflow-0.1.2/.github/workflows/falsiflow-publish.yml +57 -0
  11. falsiflow-0.1.2/.github/workflows/falsiflow-scorecard.yml +37 -0
  12. falsiflow-0.1.2/.github/workflows/falsiflow.yml +363 -0
  13. falsiflow-0.1.2/.github/workflows/smoke.yml +13 -0
  14. falsiflow-0.1.2/CHANGELOG.md +164 -0
  15. falsiflow-0.1.2/CITATION.cff +17 -0
  16. falsiflow-0.1.2/CODE_OF_CONDUCT.md +44 -0
  17. falsiflow-0.1.2/CONTRIBUTING.md +96 -0
  18. falsiflow-0.1.2/GOVERNANCE.md +68 -0
  19. falsiflow-0.1.2/LICENSE +21 -0
  20. falsiflow-0.1.2/MANIFEST.in +38 -0
  21. falsiflow-0.1.2/Makefile +57 -0
  22. falsiflow-0.1.2/PKG-INFO +1236 -0
  23. falsiflow-0.1.2/README.md +1174 -0
  24. falsiflow-0.1.2/RELEASE.md +256 -0
  25. falsiflow-0.1.2/RESPONSIBLE_USE.md +46 -0
  26. falsiflow-0.1.2/ROADMAP.md +70 -0
  27. falsiflow-0.1.2/SECURITY.md +72 -0
  28. falsiflow-0.1.2/SUPPORT.md +51 -0
  29. falsiflow-0.1.2/action.yml +221 -0
  30. falsiflow-0.1.2/docs/assets/falsiflow_30_second_demo.svg +61 -0
  31. falsiflow-0.1.2/docs/assets/falsiflow_proof_strip.svg +66 -0
  32. falsiflow-0.1.2/docs/falsiflow_1k_launch_plan.md +105 -0
  33. falsiflow-0.1.2/docs/falsiflow_adapter_profiles.md +94 -0
  34. falsiflow-0.1.2/docs/falsiflow_adoption_priorities.md +142 -0
  35. falsiflow-0.1.2/docs/falsiflow_architecture.md +111 -0
  36. falsiflow-0.1.2/docs/falsiflow_casebook_check.md +107 -0
  37. falsiflow-0.1.2/docs/falsiflow_cli_reference.md +1207 -0
  38. falsiflow-0.1.2/docs/falsiflow_data_contract.md +162 -0
  39. falsiflow-0.1.2/docs/falsiflow_demo_pr_playbook.md +189 -0
  40. falsiflow-0.1.2/docs/falsiflow_github_action_examples.md +260 -0
  41. falsiflow-0.1.2/docs/falsiflow_positioning.md +204 -0
  42. falsiflow-0.1.2/docs/falsiflow_public_casebook.md +246 -0
  43. falsiflow-0.1.2/docs/falsiflow_pypi_trusted_publishing.md +104 -0
  44. falsiflow-0.1.2/docs/falsiflow_rag_quality_gate_proposal.md +155 -0
  45. falsiflow-0.1.2/docs/falsiflow_security_posture.md +84 -0
  46. falsiflow-0.1.2/docs/falsiflow_template_authoring.md +132 -0
  47. falsiflow-0.1.2/docs/falsiflow_troubleshooting.md +204 -0
  48. falsiflow-0.1.2/docs/launch_articles/benchmarks_should_fail_builds.md +51 -0
  49. falsiflow-0.1.2/docs/launch_articles/evidence_gates_for_product_metrics.md +50 -0
  50. falsiflow-0.1.2/docs/launch_articles/stop_shipping_unverifiable_ai_eval_claims.md +53 -0
  51. falsiflow-0.1.2/examples/README.md +296 -0
  52. falsiflow-0.1.2/falsiflow/__init__.py +5 -0
  53. falsiflow-0.1.2/falsiflow/adapters.py +664 -0
  54. falsiflow-0.1.2/falsiflow/adoption.py +775 -0
  55. falsiflow-0.1.2/falsiflow/browser_demo.py +1228 -0
  56. falsiflow-0.1.2/falsiflow/bundle.py +806 -0
  57. falsiflow-0.1.2/falsiflow/casebook_check.py +426 -0
  58. falsiflow-0.1.2/falsiflow/claim_check.py +344 -0
  59. falsiflow-0.1.2/falsiflow/cli.py +2544 -0
  60. falsiflow-0.1.2/falsiflow/core.py +4072 -0
  61. falsiflow-0.1.2/falsiflow/demo.py +104 -0
  62. falsiflow-0.1.2/falsiflow/discovery.py +331 -0
  63. falsiflow-0.1.2/falsiflow/doctor.py +392 -0
  64. falsiflow-0.1.2/falsiflow/local_server.py +261 -0
  65. falsiflow-0.1.2/falsiflow/public_release.py +1805 -0
  66. falsiflow-0.1.2/falsiflow/quickstart.py +147 -0
  67. falsiflow-0.1.2/falsiflow/release.py +1783 -0
  68. falsiflow-0.1.2/falsiflow/scaffold.py +574 -0
  69. falsiflow-0.1.2/falsiflow/template_check.py +230 -0
  70. falsiflow-0.1.2/falsiflow/template_discovery.py +102 -0
  71. falsiflow-0.1.2/falsiflow/template_gallery.py +289 -0
  72. falsiflow-0.1.2/falsiflow/template_install.py +472 -0
  73. falsiflow-0.1.2/falsiflow/template_pack.py +544 -0
  74. falsiflow-0.1.2/falsiflow/template_provenance.py +343 -0
  75. falsiflow-0.1.2/falsiflow/template_registry.py +373 -0
  76. falsiflow-0.1.2/falsiflow/template_release.py +521 -0
  77. falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/evidence_pass_demo.csv +19 -0
  78. falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/evidence_placeholder_demo.csv +2 -0
  79. falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/project.json +222 -0
  80. falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/source_files/ai_eval_raw_export.csv +14 -0
  81. falsiflow-0.1.2/falsiflow/templates/ai_claim_evaluation/template.json +9 -0
  82. falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/evidence_pass_demo.csv +15 -0
  83. falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/evidence_placeholder_demo.csv +2 -0
  84. falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/project.json +186 -0
  85. falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/source_files/coating_raw_export.csv +15 -0
  86. falsiflow-0.1.2/falsiflow/templates/biointerface_coatings/template.json +9 -0
  87. falsiflow-0.1.2/falsiflow/templates/neural_materials/evidence_pass_demo.csv +20 -0
  88. falsiflow-0.1.2/falsiflow/templates/neural_materials/evidence_placeholder_demo.csv +3 -0
  89. falsiflow-0.1.2/falsiflow/templates/neural_materials/project.json +222 -0
  90. falsiflow-0.1.2/falsiflow/templates/neural_materials/source_files/demo_raw_export.csv +20 -0
  91. falsiflow-0.1.2/falsiflow/templates/neural_materials/template.json +9 -0
  92. falsiflow-0.1.2/falsiflow/templates/product_metric_launch/evidence_pass_demo.csv +15 -0
  93. falsiflow-0.1.2/falsiflow/templates/product_metric_launch/evidence_placeholder_demo.csv +2 -0
  94. falsiflow-0.1.2/falsiflow/templates/product_metric_launch/project.json +211 -0
  95. falsiflow-0.1.2/falsiflow/templates/product_metric_launch/source_files/product_metric_raw_export.csv +15 -0
  96. falsiflow-0.1.2/falsiflow/templates/product_metric_launch/template.json +9 -0
  97. falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/evidence_pass_demo.csv +10 -0
  98. falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/evidence_placeholder_demo.csv +2 -0
  99. falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/project.json +142 -0
  100. falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/source_files/vendor_reply_record.csv +10 -0
  101. falsiflow-0.1.2/falsiflow/templates/rfq_vendor_evidence/template.json +9 -0
  102. falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/evidence_pass_demo.csv +14 -0
  103. falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/evidence_placeholder_demo.csv +2 -0
  104. falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/project.json +171 -0
  105. falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/source_files/hardware_raw_export.csv +14 -0
  106. falsiflow-0.1.2/falsiflow/templates/wetware_support_hardware/template.json +9 -0
  107. falsiflow-0.1.2/falsiflow.egg-info/PKG-INFO +1236 -0
  108. falsiflow-0.1.2/falsiflow.egg-info/SOURCES.txt +113 -0
  109. falsiflow-0.1.2/falsiflow.egg-info/dependency_links.txt +1 -0
  110. falsiflow-0.1.2/falsiflow.egg-info/entry_points.txt +2 -0
  111. falsiflow-0.1.2/falsiflow.egg-info/top_level.txt +1 -0
  112. falsiflow-0.1.2/pyproject.toml +74 -0
  113. falsiflow-0.1.2/scripts/install_local.ps1 +110 -0
  114. falsiflow-0.1.2/scripts/install_local.sh +162 -0
  115. falsiflow-0.1.2/setup.cfg +4 -0
@@ -0,0 +1,58 @@
1
+ name: Bug report
2
+ description: Report a reproducible Falsiflow failure or regression.
3
+ title: "[Bug]: "
4
+ labels: ["bug", "needs-triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for reporting a concrete failure. Please include commands and generated artifacts when you can.
10
+ - type: textarea
11
+ id: command
12
+ attributes:
13
+ label: Command or workflow
14
+ description: Paste the exact command, Make target, CI job, or browser workflow that failed.
15
+ placeholder: falsiflow release-check --out-dir data/falsiflow/release_check --force
16
+ validations:
17
+ required: true
18
+ - type: textarea
19
+ id: expected
20
+ attributes:
21
+ label: Expected result
22
+ description: What status, artifact, report, or behavior did you expect?
23
+ placeholder: release_ready with package_ready, dist_ready, and release_validation_ready.
24
+ validations:
25
+ required: true
26
+ - type: textarea
27
+ id: actual
28
+ attributes:
29
+ label: Actual result
30
+ description: Include the first failing status, traceback, report excerpt, or CI link.
31
+ placeholder: release_blocked because sdist_required_files failed.
32
+ validations:
33
+ required: true
34
+ - type: textarea
35
+ id: environment
36
+ attributes:
37
+ label: Environment
38
+ description: Include OS, Python version, install method, and whether this was local, pipx, or CI.
39
+ placeholder: macOS 15, Python 3.12, editable install with python3 -m pip install -e .
40
+ validations:
41
+ required: true
42
+ - type: textarea
43
+ id: artifacts
44
+ attributes:
45
+ label: Relevant artifacts
46
+ description: Link or paste paths for release_check.json, adoption_check.json, claim_check.json, bundle verification, or template verification reports.
47
+ placeholder: data/falsiflow/release_check/release_check.json
48
+ validations:
49
+ required: false
50
+ - type: checkboxes
51
+ id: boundaries
52
+ attributes:
53
+ label: Checks before filing
54
+ options:
55
+ - label: I checked that this is not a claim that Falsiflow should treat as scientific proof, safety proof, regulatory approval, or clinical validation.
56
+ required: true
57
+ - label: I removed secrets, private raw data, and credentials from shared logs or artifacts.
58
+ required: true
@@ -0,0 +1,58 @@
1
+ name: Claim gate or template request
2
+ description: Request a new evidence-gated workflow, starter template, or template review.
3
+ title: "[Claim gate]: "
4
+ labels: ["template", "evidence-gate", "needs-triage"]
5
+ body:
6
+ - type: textarea
7
+ id: decision
8
+ attributes:
9
+ label: Decision to gate
10
+ description: What claim, handoff, or project decision should Falsiflow block until evidence is ready?
11
+ placeholder: Advance a coating candidate only when adhesion, cytotoxicity, impedance drift, and source provenance pass configured thresholds.
12
+ validations:
13
+ required: true
14
+ - type: textarea
15
+ id: evidence
16
+ attributes:
17
+ label: Required evidence
18
+ description: List the evidence rows, metadata, source files, and derived metrics this gate needs.
19
+ placeholder: adhesion_mpa with raw test export, cytotoxicity_percent with lab report source, impedance_drift_percent derived from day 0 and day 30 measurements.
20
+ validations:
21
+ required: true
22
+ - type: textarea
23
+ id: thresholds
24
+ attributes:
25
+ label: Acceptance rules
26
+ description: Describe the thresholds or review rules that should control claim_ready.
27
+ placeholder: adhesion_mpa >= 2.0, cytotoxicity_percent <= 10, impedance_drift_percent <= 15, every required source file present.
28
+ validations:
29
+ required: true
30
+ - type: dropdown
31
+ id: stage
32
+ attributes:
33
+ label: Current stage
34
+ options:
35
+ - Idea only
36
+ - Draft project.json exists
37
+ - Template files exist
38
+ - Template pack exists
39
+ - Template release bundle exists
40
+ validations:
41
+ required: true
42
+ - type: textarea
43
+ id: artifacts
44
+ attributes:
45
+ label: Existing artifacts
46
+ description: Link or describe any project.json, evidence CSV, raw source file, template pack, lockfile, attestation, policy, release bundle, or verification report.
47
+ placeholder: examples/falsiflow/my_template/project.json and evidence_pass_demo.csv
48
+ validations:
49
+ required: false
50
+ - type: checkboxes
51
+ id: boundaries
52
+ attributes:
53
+ label: Responsible-use boundary
54
+ options:
55
+ - label: I understand `claim_ready` means supplied evidence passed configured gates, not that the underlying scientific or commercial claim is independently true.
56
+ required: true
57
+ - label: I can provide non-sensitive sample evidence or sanitized fixtures for tests.
58
+ required: false
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Responsible-use boundary
4
+ url: https://github.com/AzurLiu/falsiflow/blob/main/RESPONSIBLE_USE.md
5
+ about: Read how to interpret Falsiflow readiness before relying on a claim.
6
+ - name: Security and integrity reports
7
+ url: https://github.com/AzurLiu/falsiflow/blob/main/SECURITY.md
8
+ about: Report provenance, bundle verification, path handling, or supply-chain issues privately.
@@ -0,0 +1,52 @@
1
+ name: Feature request
2
+ description: Propose a CLI, template, documentation, or workflow improvement.
3
+ title: "[Feature]: "
4
+ labels: ["enhancement", "needs-triage"]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: Problem
10
+ description: What adoption, review, template-authoring, or evidence-gate problem should this solve?
11
+ placeholder: New users can run the quickstart, but template authors need a clearer install verification path.
12
+ validations:
13
+ required: true
14
+ - type: textarea
15
+ id: proposal
16
+ attributes:
17
+ label: Proposed change
18
+ description: Describe the command, report, template, documentation, or CI behavior you want.
19
+ placeholder: Add a command that verifies a template release bundle and writes a Markdown review card.
20
+ validations:
21
+ required: true
22
+ - type: dropdown
23
+ id: area
24
+ attributes:
25
+ label: Area
26
+ options:
27
+ - First-run experience
28
+ - Audit reports
29
+ - Starter templates
30
+ - Release and packaging
31
+ - Local browser app
32
+ - Documentation
33
+ - Security or provenance
34
+ validations:
35
+ required: true
36
+ - type: textarea
37
+ id: success
38
+ attributes:
39
+ label: Success criteria
40
+ description: What command, artifact, status, or documentation would show the feature is complete?
41
+ placeholder: adoption-check reports adoption_ready and release-check still reports release_ready.
42
+ validations:
43
+ required: true
44
+ - type: checkboxes
45
+ id: contribution
46
+ attributes:
47
+ label: Contribution path
48
+ options:
49
+ - label: I can help test this with `falsiflow quickstart`, `falsiflow doctor`, `falsiflow adoption-check`, or `falsiflow release-check`.
50
+ required: false
51
+ - label: I can open a pull request using `.github/PULL_REQUEST_TEMPLATE.md`.
52
+ required: false
@@ -0,0 +1,27 @@
1
+ ## What Changed
2
+
3
+ Describe the user-visible behavior, command, report, template, packaging, or documentation change.
4
+
5
+ ## Verification
6
+
7
+ Paste the commands you ran and the final status:
8
+
9
+ ```bash
10
+ python3 -m py_compile falsiflow/core.py falsiflow/cli.py falsiflow/adapters.py falsiflow/casebook_check.py scripts/falsiflow.py scripts/falsiflow_tests/regress_falsiflow_core.py
11
+ python3 scripts/falsiflow_tests/regress_falsiflow_core.py
12
+ falsiflow adoption-check --out-dir data/falsiflow/adoption_check --force
13
+ falsiflow release-check --out-dir data/falsiflow/release_check --force
14
+ ```
15
+
16
+ ## Evidence Boundary
17
+
18
+ - [ ] This change does not make `claim_ready` bypass missing provenance, placeholder evidence, malformed configuration, or failed gates.
19
+ - [ ] New public commands or JSON fields are documented and covered by tests or release-check expectations.
20
+ - [ ] Template distribution changes were checked with `template-check`, `template-pack`, `verify-template-pack`, `template-release`, `verify-template-release`, and `template-install` where applicable.
21
+ - [ ] Security-sensitive changes preserve bundle verification, SHA-256 integrity, path handling, and source-file provenance.
22
+ - [ ] Responsible use remains clear: Falsiflow readiness is not proof of safety, efficacy, regulatory compliance, or experimental truth.
23
+
24
+ ## Release Impact
25
+
26
+ - [ ] `CHANGELOG.md`, `README.md`, `RELEASE.md`, `SECURITY.md`, or `RESPONSIBLE_USE.md` were updated when relevant.
27
+ - [ ] `adoption-check` and `release-check` pass, or this PR explains why they cannot run in the current environment.
@@ -0,0 +1,17 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "github-actions"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ labels:
8
+ - "dependencies"
9
+ - "github-actions"
10
+
11
+ - package-ecosystem: "pip"
12
+ directory: "/"
13
+ schedule:
14
+ interval: "weekly"
15
+ labels:
16
+ - "dependencies"
17
+ - "python"
@@ -0,0 +1,69 @@
1
+ name: Falsiflow Cross Platform
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - main
8
+ - master
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ smoke:
16
+ name: ${{ matrix.os }}
17
+ runs-on: ${{ matrix.os }}
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os:
22
+ - ubuntu-latest
23
+ - macos-latest
24
+ - windows-latest
25
+
26
+ steps:
27
+ - name: Checkout public repository
28
+ shell: bash
29
+ run: |
30
+ git init .
31
+ git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
32
+ git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
33
+ git checkout --detach "${GITHUB_SHA}"
34
+ - uses: actions/setup-python@v6
35
+ with:
36
+ python-version: "3.11"
37
+ - name: Compile
38
+ run: |
39
+ python -m py_compile falsiflow/core.py falsiflow/cli.py falsiflow/adapters.py falsiflow/release.py falsiflow/adoption.py falsiflow/casebook_check.py falsiflow/bundle.py falsiflow/browser_demo.py falsiflow/demo.py falsiflow/discovery.py falsiflow/local_server.py falsiflow/public_release.py falsiflow/claim_check.py falsiflow/doctor.py falsiflow/quickstart.py falsiflow/scaffold.py falsiflow/template_discovery.py falsiflow/template_gallery.py falsiflow/template_check.py falsiflow/template_pack.py falsiflow/template_registry.py falsiflow/template_provenance.py falsiflow/template_release.py falsiflow/template_install.py scripts/falsiflow.py scripts/falsiflow_tests/regress_falsiflow_core.py
40
+ - name: Local installer smoke (Unix)
41
+ if: runner.os != 'Windows'
42
+ shell: bash
43
+ run: |
44
+ scripts/install_local.sh --from-local . --prefix "$RUNNER_TEMP/falsiflow_install" --check
45
+ - name: Local installer smoke (Windows)
46
+ if: runner.os == 'Windows'
47
+ shell: pwsh
48
+ run: |
49
+ ./scripts/install_local.ps1 -FromLocal . -Prefix "$env:RUNNER_TEMP/falsiflow_install" -Check
50
+ - name: pipx smoke
51
+ shell: bash
52
+ run: |
53
+ python -m pip install --user pipx
54
+ python -m pipx install --force .
55
+ python -m pipx run --spec . falsiflow selftest --json > "$RUNNER_TEMP/falsiflow_pipx_selftest.json"
56
+ - name: Browser entry smoke
57
+ shell: bash
58
+ run: |
59
+ python scripts/falsiflow.py start --out-dir "$RUNNER_TEMP/falsiflow_start" --check --json
60
+ python scripts/falsiflow.py demo-package --out-dir "$RUNNER_TEMP/falsiflow_public_demo" --force --json
61
+ - name: External readiness smoke
62
+ shell: bash
63
+ env:
64
+ FALSIFLOW_REPO_URL: https://github.com/${{ github.repository }}
65
+ FALSIFLOW_PUBLIC_DEMO_URL: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}/
66
+ FALSIFLOW_PIPX_VALIDATED: "1"
67
+ FALSIFLOW_WINDOWS_VALIDATED: ${{ runner.os == 'Windows' && '1' || '0' }}
68
+ run: |
69
+ python scripts/falsiflow.py external-check --out-dir "$RUNNER_TEMP/falsiflow_external_check" --force --json
@@ -0,0 +1,269 @@
1
+ name: Falsiflow External Evidence
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ public_demo_url:
7
+ description: "Hosted public demo URL to verify, for example https://OWNER.github.io/falsiflow/"
8
+ required: true
9
+ type: string
10
+ repo_url:
11
+ description: "Public repository URL. Defaults to the current GitHub repository."
12
+ required: false
13
+ type: string
14
+ pypi_package_url:
15
+ description: "Published PyPI project URL, for example https://pypi.org/project/falsiflow/"
16
+ required: true
17
+ type: string
18
+ expected_version:
19
+ description: "Expected PyPI package version, for example 0.1.2. Defaults to pyproject.toml."
20
+ required: false
21
+ type: string
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ pipx-smoke:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - name: Checkout public repository
31
+ shell: bash
32
+ run: |
33
+ git init .
34
+ git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
35
+ git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
36
+ git checkout --detach "${GITHUB_SHA}"
37
+ - uses: actions/setup-python@v6
38
+ with:
39
+ python-version: "3.11"
40
+ - name: pipx install and browser-entry smoke
41
+ shell: bash
42
+ run: |
43
+ python -m pip install --user pipx
44
+ python -m pipx install --force .
45
+ python -m pipx run --spec . falsiflow start --out-dir "$RUNNER_TEMP/falsiflow_start" --check --json > "$RUNNER_TEMP/falsiflow_pipx_start.json"
46
+ - name: Upload pipx smoke artifact
47
+ uses: actions/upload-artifact@v7
48
+ with:
49
+ name: falsiflow-pipx-smoke
50
+ path: ${{ runner.temp }}/falsiflow_pipx_start.json
51
+
52
+ pipx-public-package:
53
+ runs-on: ubuntu-latest
54
+ steps:
55
+ - uses: actions/setup-python@v6
56
+ with:
57
+ python-version: "3.11"
58
+ - name: pipx public package smoke
59
+ shell: bash
60
+ run: |
61
+ python -m pip install --user pipx
62
+ python -m pipx run --spec falsiflow falsiflow start --out-dir "$RUNNER_TEMP/falsiflow_public_package_start" --check --json > "$RUNNER_TEMP/falsiflow_public_package_start.json"
63
+ - name: Upload public package pipx smoke artifact
64
+ uses: actions/upload-artifact@v7
65
+ with:
66
+ name: falsiflow-pipx-public-package-smoke
67
+ path: ${{ runner.temp }}/falsiflow_public_package_start.json
68
+
69
+ windows-powershell:
70
+ runs-on: windows-latest
71
+ steps:
72
+ - name: Checkout public repository
73
+ shell: bash
74
+ run: |
75
+ git init .
76
+ git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
77
+ git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
78
+ git checkout --detach "${GITHUB_SHA}"
79
+ - uses: actions/setup-python@v6
80
+ with:
81
+ python-version: "3.11"
82
+ - name: PowerShell installer smoke
83
+ shell: pwsh
84
+ run: |
85
+ ./scripts/install_local.ps1 -FromLocal . -Prefix "$env:RUNNER_TEMP/falsiflow_install" -Check
86
+
87
+ evidence-summary:
88
+ needs:
89
+ - pipx-smoke
90
+ - pipx-public-package
91
+ - windows-powershell
92
+ runs-on: ubuntu-latest
93
+ steps:
94
+ - name: Checkout public repository
95
+ shell: bash
96
+ run: |
97
+ git init .
98
+ git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
99
+ git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
100
+ git checkout --detach "${GITHUB_SHA}"
101
+ - uses: actions/setup-python@v6
102
+ with:
103
+ python-version: "3.11"
104
+ - name: Verify hosted demo URL
105
+ shell: bash
106
+ env:
107
+ FALSIFLOW_PUBLIC_DEMO_URL: ${{ inputs.public_demo_url }}
108
+ run: |
109
+ test -n "$FALSIFLOW_PUBLIC_DEMO_URL"
110
+ curl -fsSL "$FALSIFLOW_PUBLIC_DEMO_URL" -o "$RUNNER_TEMP/falsiflow_public_demo_index.html"
111
+ grep -E "Falsiflow|Launchpad|Try" "$RUNNER_TEMP/falsiflow_public_demo_index.html"
112
+ - name: Verify PyPI project URL
113
+ shell: bash
114
+ env:
115
+ FALSIFLOW_PYPI_PACKAGE_URL: ${{ inputs.pypi_package_url }}
116
+ FALSIFLOW_EXPECTED_VERSION: ${{ inputs.expected_version }}
117
+ run: |
118
+ test -n "$FALSIFLOW_PYPI_PACKAGE_URL"
119
+ python - <<'PY'
120
+ import os
121
+ from urllib.parse import urlparse
122
+
123
+ url = os.environ["FALSIFLOW_PYPI_PACKAGE_URL"].strip()
124
+ parsed = urlparse(url)
125
+ expected_path = "/project/falsiflow/"
126
+ if parsed.scheme != "https" or parsed.netloc != "pypi.org" or parsed.path.rstrip("/") + "/" != expected_path:
127
+ raise SystemExit(f"Expected https://pypi.org/project/falsiflow/, got {url}")
128
+ PY
129
+ curl -fsSL "https://pypi.org/pypi/falsiflow/json" -o "$RUNNER_TEMP/falsiflow_pypi_project.json"
130
+ python - <<'PY'
131
+ import json
132
+ import os
133
+ import pathlib
134
+ import tomllib
135
+
136
+ root = pathlib.Path.cwd()
137
+ expected_version = os.environ.get("FALSIFLOW_EXPECTED_VERSION", "").strip()
138
+ if not expected_version:
139
+ with (root / "pyproject.toml").open("rb") as handle:
140
+ expected_version = str(tomllib.load(handle).get("project", {}).get("version", "")).strip()
141
+ if not expected_version:
142
+ raise SystemExit("Expected PyPI package version was empty")
143
+
144
+ runner_temp = pathlib.Path(os.environ["RUNNER_TEMP"])
145
+ payload = json.loads((runner_temp / "falsiflow_pypi_project.json").read_text(encoding="utf-8"))
146
+ info = payload.get("info", {})
147
+ if str(info.get("name", "")).lower() != "falsiflow":
148
+ raise SystemExit("PyPI JSON did not describe the falsiflow package")
149
+ published_version = str(info.get("version", "")).strip()
150
+ if not published_version:
151
+ raise SystemExit("PyPI JSON did not include a released version")
152
+ if published_version != expected_version:
153
+ raise SystemExit(f"Expected PyPI version {expected_version}, got {published_version}")
154
+ (runner_temp / "falsiflow_expected_version.txt").write_text(expected_version, encoding="utf-8")
155
+ (runner_temp / "falsiflow_pypi_version.txt").write_text(published_version, encoding="utf-8")
156
+ PY
157
+ - name: Write structured external evidence
158
+ shell: bash
159
+ env:
160
+ FALSIFLOW_REPO_URL_INPUT: ${{ inputs.repo_url }}
161
+ FALSIFLOW_PUBLIC_DEMO_URL: ${{ inputs.public_demo_url }}
162
+ FALSIFLOW_PYPI_PACKAGE_URL: ${{ inputs.pypi_package_url }}
163
+ FALSIFLOW_EXPECTED_VERSION: ${{ inputs.expected_version }}
164
+ FALSIFLOW_WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
165
+ FALSIFLOW_REPOSITORY: ${{ github.repository }}
166
+ run: |
167
+ python - <<'PY'
168
+ import json
169
+ import os
170
+ import pathlib
171
+ import tomllib
172
+
173
+ runner_temp = pathlib.Path(os.environ["RUNNER_TEMP"])
174
+
175
+ def text_file_or_empty(name: str) -> str:
176
+ path = runner_temp / name
177
+ return path.read_text(encoding="utf-8").strip() if path.exists() else ""
178
+
179
+ expected_version = text_file_or_empty("falsiflow_expected_version.txt") or os.environ.get("FALSIFLOW_EXPECTED_VERSION", "").strip()
180
+ if not expected_version:
181
+ with pathlib.Path("pyproject.toml").open("rb") as handle:
182
+ expected_version = str(tomllib.load(handle).get("project", {}).get("version", "")).strip()
183
+ published_version = text_file_or_empty("falsiflow_pypi_version.txt")
184
+ if not published_version:
185
+ payload = json.loads((runner_temp / "falsiflow_pypi_project.json").read_text(encoding="utf-8"))
186
+ published_version = str(payload.get("info", {}).get("version", "")).strip()
187
+
188
+ repo_url = os.environ.get("FALSIFLOW_REPO_URL_INPUT") or f"https://github.com/{os.environ['FALSIFLOW_REPOSITORY']}"
189
+ demo_url = os.environ["FALSIFLOW_PUBLIC_DEMO_URL"]
190
+ pypi_url = os.environ["FALSIFLOW_PYPI_PACKAGE_URL"]
191
+ workflow_url = os.environ["FALSIFLOW_WORKFLOW_URL"]
192
+ evidence = {
193
+ "status": "external_evidence_ready",
194
+ "version": 1,
195
+ "instructions": "Generated by the Falsiflow External Evidence workflow after public demo, PyPI package, checkout pipx, public-package pipx, and Windows smoke checks passed.",
196
+ "checks": {
197
+ "public_repo_url": {
198
+ "status": "passed",
199
+ "url": repo_url,
200
+ "evidence_url": workflow_url,
201
+ "notes": "Workflow ran from the public GitHub repository.",
202
+ },
203
+ "public_demo_url": {
204
+ "status": "passed",
205
+ "url": demo_url,
206
+ "evidence_url": workflow_url,
207
+ "artifact": "falsiflow_public_demo_index.html",
208
+ "notes": "curl fetched the hosted static demo and found Falsiflow launch text.",
209
+ },
210
+ "pypi_package_url": {
211
+ "status": "passed",
212
+ "url": pypi_url,
213
+ "evidence_url": workflow_url,
214
+ "artifact": "falsiflow_pypi_project.json",
215
+ "verification_url": "https://pypi.org/pypi/falsiflow/json",
216
+ "expected_version": expected_version,
217
+ "published_version": published_version,
218
+ "notes": "curl fetched the PyPI JSON API and confirmed the published package name and version matched the expected release.",
219
+ },
220
+ "pipx_smoke": {
221
+ "status": "passed",
222
+ "command": "python -m pipx install --force . && python -m pipx run --spec . falsiflow start --check --json",
223
+ "workflow_url": workflow_url,
224
+ "artifact": "falsiflow_pipx_start.json",
225
+ "notes": "Ubuntu checkout-based pipx install and browser-entry smoke passed.",
226
+ },
227
+ "pipx_public_package": {
228
+ "status": "passed",
229
+ "command": "python -m pipx run --spec falsiflow falsiflow start --check --json",
230
+ "workflow_url": workflow_url,
231
+ "artifact": "falsiflow_public_package_start.json",
232
+ "notes": "Ubuntu pipx run from the published package passed.",
233
+ },
234
+ "windows_powershell": {
235
+ "status": "passed",
236
+ "command": ".\\scripts\\install_local.ps1 -FromLocal . -Check",
237
+ "workflow_url": workflow_url,
238
+ "notes": "Windows PowerShell installer smoke passed.",
239
+ },
240
+ },
241
+ }
242
+ pathlib.Path("falsiflow_external_evidence.json").write_text(json.dumps(evidence, indent=2, sort_keys=True), encoding="utf-8")
243
+ PY
244
+ - name: Verify external readiness with structured evidence
245
+ shell: bash
246
+ env:
247
+ FALSIFLOW_REPO_URL: ${{ inputs.repo_url || format('https://github.com/{0}', github.repository) }}
248
+ FALSIFLOW_PUBLIC_DEMO_URL: ${{ inputs.public_demo_url }}
249
+ FALSIFLOW_PYPI_PACKAGE_URL: ${{ inputs.pypi_package_url }}
250
+ run: |
251
+ python scripts/falsiflow.py external-check \
252
+ --out-dir falsiflow_external_check \
253
+ --evidence falsiflow_external_evidence.json \
254
+ --force \
255
+ --strict \
256
+ --json > falsiflow_external_readiness.stdout.json
257
+ - name: Upload external evidence artifact
258
+ uses: actions/upload-artifact@v7
259
+ with:
260
+ name: falsiflow-external-evidence
261
+ path: |
262
+ falsiflow_external_evidence.json
263
+ falsiflow_external_readiness.stdout.json
264
+ falsiflow_external_check/external_readiness.json
265
+ falsiflow_external_check/external_readiness.md
266
+ ${{ runner.temp }}/falsiflow_public_demo_index.html
267
+ ${{ runner.temp }}/falsiflow_pypi_project.json
268
+ ${{ runner.temp }}/falsiflow_expected_version.txt
269
+ ${{ runner.temp }}/falsiflow_pypi_version.txt
@@ -0,0 +1,54 @@
1
+ name: Falsiflow Pages Demo
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ permissions:
7
+ contents: read
8
+ pages: write
9
+ id-token: write
10
+
11
+ concurrency:
12
+ group: pages
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ build:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: Checkout public repository
20
+ shell: bash
21
+ run: |
22
+ git init .
23
+ git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
24
+ git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
25
+ git checkout --detach "${GITHUB_SHA}"
26
+ - uses: actions/setup-python@v6
27
+ with:
28
+ python-version: "3.11"
29
+ - name: Configure Pages
30
+ uses: actions/configure-pages@v6
31
+ with:
32
+ enablement: true
33
+ - name: Build public demo package
34
+ run: |
35
+ python scripts/falsiflow.py demo-package \
36
+ --out-dir public_demo \
37
+ --force \
38
+ --json > /tmp/falsiflow_demo_package.json
39
+ cp /tmp/falsiflow_demo_package.json public_demo/demo_package_summary.stdout.json
40
+ - name: Upload Pages artifact
41
+ uses: actions/upload-pages-artifact@v5
42
+ with:
43
+ path: public_demo
44
+
45
+ deploy:
46
+ needs: build
47
+ runs-on: ubuntu-latest
48
+ environment:
49
+ name: github-pages
50
+ url: ${{ steps.deployment.outputs.page_url }}
51
+ steps:
52
+ - name: Deploy to GitHub Pages
53
+ id: deployment
54
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,57 @@
1
+ name: Falsiflow Publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types:
7
+ - published
8
+
9
+ permissions:
10
+ contents: read
11
+ id-token: write
12
+
13
+ jobs:
14
+ build-dist:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout public repository
18
+ shell: bash
19
+ run: |
20
+ git init .
21
+ git remote add origin "https://github.com/${GITHUB_REPOSITORY}.git"
22
+ git fetch --no-tags --depth=1 origin "+${GITHUB_REF}:${GITHUB_REF}"
23
+ git checkout --detach "${GITHUB_SHA}"
24
+ - uses: actions/setup-python@v6
25
+ with:
26
+ python-version: "3.11"
27
+ - name: Build and check distributions
28
+ run: |
29
+ python -m pip install --upgrade build twine
30
+ python -m build
31
+ python -m twine check dist/*
32
+ - name: Release check
33
+ run: |
34
+ python scripts/falsiflow.py release-check \
35
+ --out-dir /tmp/falsiflow_release_check \
36
+ --json > /tmp/falsiflow_release_check.json
37
+ - name: Upload distribution artifact
38
+ uses: actions/upload-artifact@v7
39
+ with:
40
+ name: falsiflow-dist
41
+ path: dist/*
42
+
43
+ publish-pypi:
44
+ if: github.event_name == 'release'
45
+ needs: build-dist
46
+ runs-on: ubuntu-latest
47
+ environment:
48
+ name: pypi
49
+ url: https://pypi.org/project/falsiflow/
50
+ steps:
51
+ - name: Download distribution artifact
52
+ uses: actions/download-artifact@v8
53
+ with:
54
+ name: falsiflow-dist
55
+ path: dist
56
+ - name: Publish to PyPI
57
+ uses: pypa/gh-action-pypi-publish@release/v1