panopticon-mcp 1.0.0__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.
- panopticon_mcp-1.0.0/.editorconfig +9 -0
- panopticon_mcp-1.0.0/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- panopticon_mcp-1.0.0/.github/assets/hero.svg +111 -0
- panopticon_mcp-1.0.0/.github/assets/logo.svg +70 -0
- panopticon_mcp-1.0.0/.github/assets/panopticon.png +0 -0
- panopticon_mcp-1.0.0/.github/workflows/audit.yml +13 -0
- panopticon_mcp-1.0.0/.github/workflows/ci.yml +71 -0
- panopticon_mcp-1.0.0/.github/workflows/images.yml +118 -0
- panopticon_mcp-1.0.0/.github/workflows/platform.yml +99 -0
- panopticon_mcp-1.0.0/.github/workflows/release.yml +219 -0
- panopticon_mcp-1.0.0/.gitignore +17 -0
- panopticon_mcp-1.0.0/.pre-commit-config.yaml +29 -0
- panopticon_mcp-1.0.0/.python-version +1 -0
- panopticon_mcp-1.0.0/AGENTS.md +153 -0
- panopticon_mcp-1.0.0/ARCHITECTURE.md +122 -0
- panopticon_mcp-1.0.0/CHANGELOG.md +12 -0
- panopticon_mcp-1.0.0/CLAUDE.md +1 -0
- panopticon_mcp-1.0.0/LICENSE +22 -0
- panopticon_mcp-1.0.0/Makefile +59 -0
- panopticon_mcp-1.0.0/PKG-INFO +146 -0
- panopticon_mcp-1.0.0/README.md +66 -0
- panopticon_mcp-1.0.0/ROADMAP.md +28 -0
- panopticon_mcp-1.0.0/SECURITY.md +28 -0
- panopticon_mcp-1.0.0/THIRD_PARTY_NOTICES.md +74 -0
- panopticon_mcp-1.0.0/action.yml +50 -0
- panopticon_mcp-1.0.0/docs/DECISIONS.md +104 -0
- panopticon_mcp-1.0.0/docs/PROGRESS.md +31 -0
- panopticon_mcp-1.0.0/docs/README.ko.md +19 -0
- panopticon_mcp-1.0.0/docs/contributing.md +8 -0
- panopticon_mcp-1.0.0/docs/disclosure.md +10 -0
- panopticon_mcp-1.0.0/docs/limitations.md +33 -0
- panopticon_mcp-1.0.0/docs/privacy.md +45 -0
- panopticon_mcp-1.0.0/docs/release.md +57 -0
- panopticon_mcp-1.0.0/docs/rules/CATALOG.md +51 -0
- panopticon_mcp-1.0.0/docs/rules/README.md +3 -0
- panopticon_mcp-1.0.0/docs/self-declaration.md +14 -0
- panopticon_mcp-1.0.0/panopticon-buildplan.md +911 -0
- panopticon_mcp-1.0.0/panopticon.toml +30 -0
- panopticon_mcp-1.0.0/pyproject.toml +114 -0
- panopticon_mcp-1.0.0/release-assets/.gitignore +1 -0
- panopticon_mcp-1.0.0/schemas/baseline.json +2373 -0
- panopticon_mcp-1.0.0/schemas/diff_result.json +149 -0
- panopticon_mcp-1.0.0/schemas/event.json +360 -0
- panopticon_mcp-1.0.0/schemas/finding.json +241 -0
- panopticon_mcp-1.0.0/schemas/installed_server.json +272 -0
- panopticon_mcp-1.0.0/schemas/observation.json +2028 -0
- panopticon_mcp-1.0.0/schemas/wrap_record.json +973 -0
- panopticon_mcp-1.0.0/scripts/assemble_release.py +26 -0
- panopticon_mcp-1.0.0/scripts/check_docs.py +196 -0
- panopticon_mcp-1.0.0/scripts/check_engine_loc.py +52 -0
- panopticon_mcp-1.0.0/scripts/check_i18n.py +40 -0
- panopticon_mcp-1.0.0/scripts/check_no_excuse_rules.py +61 -0
- panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_exception_paths.py +151 -0
- panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_flow.py +217 -0
- panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_flow_visitor.py +264 -0
- panopticon_mcp-1.0.0/scripts/check_no_excuse_rules_scope.py +262 -0
- panopticon_mcp-1.0.0/scripts/check_persistence_boundary.py +16 -0
- panopticon_mcp-1.0.0/scripts/check_phrases.py +32 -0
- panopticon_mcp-1.0.0/scripts/check_rules.py +163 -0
- panopticon_mcp-1.0.0/scripts/gen_rule_catalog.py +34 -0
- panopticon_mcp-1.0.0/scripts/generate_upstream_manifest.py +194 -0
- panopticon_mcp-1.0.0/scripts/manual_qa.py +221 -0
- panopticon_mcp-1.0.0/scripts/package_binary.py +23 -0
- panopticon_mcp-1.0.0/scripts/performance_gate.py +258 -0
- panopticon_mcp-1.0.0/scripts/platform_evidence.py +221 -0
- panopticon_mcp-1.0.0/scripts/platform_probe.py +146 -0
- panopticon_mcp-1.0.0/scripts/release_evidence.py +156 -0
- panopticon_mcp-1.0.0/scripts/release_gate.py +225 -0
- panopticon_mcp-1.0.0/scripts/release_preflight.py +106 -0
- panopticon_mcp-1.0.0/scripts/render_homebrew_formula.py +35 -0
- panopticon_mcp-1.0.0/scripts/run_platform_matrix.py +227 -0
- panopticon_mcp-1.0.0/scripts/run_wsl2_probe.ps1 +60 -0
- panopticon_mcp-1.0.0/scripts/validate_schemas.py +75 -0
- panopticon_mcp-1.0.0/scripts/vendor_upstream.py +144 -0
- panopticon_mcp-1.0.0/scripts/verify_official_examples.py +209 -0
- panopticon_mcp-1.0.0/scripts/verify_upstream_provenance.py +178 -0
- panopticon_mcp-1.0.0/src/panopticon/__init__.py +13 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/__init__.py +33 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/_rules_behavior.py +216 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/_rules_common.py +99 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/_rules_network.py +135 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/allow.yaml +10 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/allowlist.py +30 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/catalog.py +56 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/collectors.py +270 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/model.py +138 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/registry_rules.py +138 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/rules.py +51 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/spans.py +159 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/behavior/thresholds.py +22 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/config/__init__.py +22 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/config/catalog.py +65 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/config/entropy.py +43 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/config/model.py +77 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/config/registry_rules.py +96 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/config/rules.py +234 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/model.py +39 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/requirements.py +178 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/dependency/scan.py +84 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/history/__init__.py +31 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/history/catalog.py +38 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/history/model.py +66 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/history/registry_rules.py +83 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/history/rules.py +187 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/__init__.py +19 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/cache.py +26 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/context.py +157 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/model.py +70 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/reviewer.py +250 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/semantic/tools.py +150 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/__init__.py +3 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/ast_utils.py +149 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/catalog.py +110 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/engine.py +75 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/findings.py +55 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/model.py +134 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/__init__.py +7 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent001.py +93 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent002.py +9 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent003.py +102 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent004.py +86 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent005.py +104 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent006.py +119 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/rules/sent007.py +116 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/semgrep/sent002.yaml +37 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/semgrep/sent005.yaml +15 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/semgrep_adapter.py +197 -0
- panopticon_mcp-1.0.0/src/panopticon/analyzers/static/traversal.py +184 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/assets/NanumGothic-Regular.ttf +0 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/assets/OFL.txt +96 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/eligibility.py +25 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/font.py +40 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/from_observation.py +136 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/model.py +109 -0
- panopticon_mcp-1.0.0/src/panopticon/badge/svg.py +49 -0
- panopticon_mcp-1.0.0/src/panopticon/baseline/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/baseline/migrate.py +32 -0
- panopticon_mcp-1.0.0/src/panopticon/baseline/model.py +61 -0
- panopticon_mcp-1.0.0/src/panopticon/baseline/selection.py +30 -0
- panopticon_mcp-1.0.0/src/panopticon/baseline/service.py +109 -0
- panopticon_mcp-1.0.0/src/panopticon/checks/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/checks/persistence_boundary.py +259 -0
- panopticon_mcp-1.0.0/src/panopticon/cli/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/cli/analysis_commands.py +117 -0
- panopticon_mcp-1.0.0/src/panopticon/cli/main.py +205 -0
- panopticon_mcp-1.0.0/src/panopticon/cli/watch_command.py +106 -0
- panopticon_mcp-1.0.0/src/panopticon/declared/__init__.py +68 -0
- panopticon_mcp-1.0.0/src/panopticon/declared/authority.py +166 -0
- panopticon_mcp-1.0.0/src/panopticon/declared/extract.py +228 -0
- panopticon_mcp-1.0.0/src/panopticon/declared/model.py +120 -0
- panopticon_mcp-1.0.0/src/panopticon/declared/normalize.py +115 -0
- panopticon_mcp-1.0.0/src/panopticon/diff/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/diff/compute.py +217 -0
- panopticon_mcp-1.0.0/src/panopticon/diff/inventory.py +39 -0
- panopticon_mcp-1.0.0/src/panopticon/diff/model.py +30 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/__init__.py +83 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/_config.py +119 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/base.py +76 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/claude_code.py +113 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/claude_desktop.py +73 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/cursor.py +59 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/generic.py +43 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/vscode.py +65 -0
- panopticon_mcp-1.0.0/src/panopticon/discovery/windsurf.py +52 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/__init__.py +37 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/badge.py +21 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/baseline.py +133 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/ci.py +46 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/contracts.py +234 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/deep.py +120 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/diff.py +96 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/doctor.py +223 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/doctor_grouping.py +50 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/doctor_model.py +92 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/doctor_render.py +103 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/exit_codes.py +48 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/explain.py +62 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/fix.py +226 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/fix_select.py +133 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/foundation.py +122 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/install.py +119 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/remote.py +55 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/scan.py +291 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch.py +75 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_behavior.py +247 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_declared.py +176 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_events.py +234 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_inventory.py +219 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_leaks.py +83 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_local.py +50 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_collect.py +155 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_evidence.py +191 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_model.py +97 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_production.py +218 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_local_runtime.py +63 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_model.py +123 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_observation.py +151 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_observation_events.py +196 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote.py +48 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote_events.py +216 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote_observation.py +148 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_remote_production.py +166 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_self.py +51 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_self_metadata.py +116 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_service.py +128 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_service_targets.py +228 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_stages.py +216 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/watch_state.py +191 -0
- panopticon_mcp-1.0.0/src/panopticon/engine/wrap.py +77 -0
- panopticon_mcp-1.0.0/src/panopticon/findings/__init__.py +5 -0
- panopticon_mcp-1.0.0/src/panopticon/findings/build.py +126 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/_executor_store.py +170 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/backup.py +30 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/cli_model.py +93 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/executor.py +266 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/https.py +133 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/journal.py +76 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/model.py +124 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/plan.py +80 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/remediations.py +118 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/rules.py +107 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/service.py +128 -0
- panopticon_mcp-1.0.0/src/panopticon/fix/transaction.py +119 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/RULE_TEMPLATE.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/catalog.py +116 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-006.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-007.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-009.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-011.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/CFG-012.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/FIX-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/HIST-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-006.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-007.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-009.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/SENT-011.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-006.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-007.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-009.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-011.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-012.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-013.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/en/rules/WATCH-014.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/expected_rules.yaml +51 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/glossary.yaml +12 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-006.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-007.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-009.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-011.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/CFG-012.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/FIX-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/HIST-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-006.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-007.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-009.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/SENT-011.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-001.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-002.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-003.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-004.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-005.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-006.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-007.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-008.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-009.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-010.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-011.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-012.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-013.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/ko/rules/WATCH-014.md +19 -0
- panopticon_mcp-1.0.0/src/panopticon/i18n/loader.py +140 -0
- panopticon_mcp-1.0.0/src/panopticon/install/model.py +105 -0
- panopticon_mcp-1.0.0/src/panopticon/install/plan.py +141 -0
- panopticon_mcp-1.0.0/src/panopticon/install/service.py +163 -0
- panopticon_mcp-1.0.0/src/panopticon/inventory/__init__.py +21 -0
- panopticon_mcp-1.0.0/src/panopticon/inventory/model.py +23 -0
- panopticon_mcp-1.0.0/src/panopticon/inventory/normalize.py +122 -0
- panopticon_mcp-1.0.0/src/panopticon/inventory/parsers.py +242 -0
- panopticon_mcp-1.0.0/src/panopticon/logging.py +77 -0
- panopticon_mcp-1.0.0/src/panopticon/models/__init__.py +81 -0
- panopticon_mcp-1.0.0/src/panopticon/models/artifacts.py +79 -0
- panopticon_mcp-1.0.0/src/panopticon/models/common.py +93 -0
- panopticon_mcp-1.0.0/src/panopticon/models/event.py +90 -0
- panopticon_mcp-1.0.0/src/panopticon/models/finding.py +82 -0
- panopticon_mcp-1.0.0/src/panopticon/models/ids.py +137 -0
- panopticon_mcp-1.0.0/src/panopticon/models/inventory.py +94 -0
- panopticon_mcp-1.0.0/src/panopticon/models/observation.py +190 -0
- panopticon_mcp-1.0.0/src/panopticon/models/schema.py +82 -0
- panopticon_mcp-1.0.0/src/panopticon/models/state.py +174 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/argument_schema.py +111 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/arguments.py +252 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/client.py +130 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/driver.py +263 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/driver_tools.py +32 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/http.py +241 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/http_redirect.py +154 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/http_session.py +100 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/http_sse.py +130 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/overrides.py +25 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/pagination.py +59 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/protocol.py +141 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/remote.py +245 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/remote_events.py +91 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/remote_security.py +96 -0
- panopticon_mcp-1.0.0/src/panopticon/probe/stdio.py +231 -0
- panopticon_mcp-1.0.0/src/panopticon/py.typed +0 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/cache.py +200 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/client.py +251 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/common.py +272 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/github.py +75 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/history.py +99 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/http.py +75 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/model.py +93 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/normalize.py +58 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/npm.py +14 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/provider.py +137 -0
- panopticon_mcp-1.0.0/src/panopticon/registry/pypi.py +14 -0
- panopticon_mcp-1.0.0/src/panopticon/release/__init__.py +13 -0
- panopticon_mcp-1.0.0/src/panopticon/release/archive.py +38 -0
- panopticon_mcp-1.0.0/src/panopticon/release/homebrew.py +56 -0
- panopticon_mcp-1.0.0/src/panopticon/release/manifest.py +54 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/base.py +24 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/baseline.py +46 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/diff.py +50 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/doctor.py +65 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/escaping.py +38 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/explain.py +61 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/fix.py +34 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/foundation.py +33 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/install.py +38 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/json.py +52 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/markdown.py +90 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/model.py +81 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/persist.py +56 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/png.py +136 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/report_bundle.py +95 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/rule_metadata.py +26 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/sarif.py +119 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/scan.py +87 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/terminal.py +75 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/visual.py +69 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/watch.py +152 -0
- panopticon_mcp-1.0.0/src/panopticon/reporters/wrap.py +22 -0
- panopticon_mcp-1.0.0/src/panopticon/rules/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/rules/context.py +56 -0
- panopticon_mcp-1.0.0/src/panopticon/rules/expected_scope.yaml +34 -0
- panopticon_mcp-1.0.0/src/panopticon/rules/registry.py +108 -0
- panopticon_mcp-1.0.0/src/panopticon/rules/scope.py +160 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/__init__.py +19 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/_docker_container.py +278 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/_docker_runtime.py +166 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/archive.py +45 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/base.py +107 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/decoy.py +221 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/decoy_specs.py +103 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/docker.py +19 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/image_catalog.py +139 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/images/base.Dockerfile +18 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/images/entrypoint.sh +6 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/images/node.Dockerfile +10 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/images/python.Dockerfile +22 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/images/tinyproxy.conf +10 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/images.lock +11 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/matcher.py +186 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/netlog.py +250 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/network.py +257 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/network_collect.py +58 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/noise.py +63 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/noise.yaml +21 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/podman.py +58 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/runtime.py +24 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/snapshot.py +76 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/streams.py +49 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/trace.py +218 -0
- panopticon_mcp-1.0.0/src/panopticon/sandbox/trace_model.py +175 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/__init__.py +98 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/adapters.py +171 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/backup.py +195 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/contracts.py +309 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/crypto.py +173 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/keyring_backend.py +240 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/memory.py +183 -0
- panopticon_mcp-1.0.0/src/panopticon/secrets/provision.py +32 -0
- panopticon_mcp-1.0.0/src/panopticon/store/__init__.py +66 -0
- panopticon_mcp-1.0.0/src/panopticon/store/_atomic_result.py +38 -0
- panopticon_mcp-1.0.0/src/panopticon/store/_atomic_windows.py +172 -0
- panopticon_mcp-1.0.0/src/panopticon/store/atomic.py +272 -0
- panopticon_mcp-1.0.0/src/panopticon/store/contracts.py +165 -0
- panopticon_mcp-1.0.0/src/panopticon/store/gateway.py +86 -0
- panopticon_mcp-1.0.0/src/panopticon/store/repository.py +256 -0
- panopticon_mcp-1.0.0/src/panopticon/store/serialization.py +148 -0
- panopticon_mcp-1.0.0/src/panopticon/store/unlink.py +135 -0
- panopticon_mcp-1.0.0/src/panopticon/util/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/util/canonicalize.py +74 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/__init__.py +32 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/document.py +74 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/edit.py +203 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/parser.py +236 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/patch.py +216 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/pointer.py +81 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/tokenizer.py +152 -0
- panopticon_mcp-1.0.0/src/panopticon/util/jsonc/transaction.py +253 -0
- panopticon_mcp-1.0.0/src/panopticon/util/leak_check.py +282 -0
- panopticon_mcp-1.0.0/src/panopticon/util/paths.py +33 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/__init__.py +1 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/framing.py +100 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/model.py +78 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/persist.py +92 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/process.py +180 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/record.py +122 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/relay.py +105 -0
- panopticon_mcp-1.0.0/src/panopticon/wrap/retention.py +43 -0
- panopticon_mcp-1.0.0/tests/benchmarks/test_product_performance.py +31 -0
- panopticon_mcp-1.0.0/tests/benchmarks/test_wrap_latency.py +67 -0
- panopticon_mcp-1.0.0/tests/conftest.py +21 -0
- panopticon_mcp-1.0.0/tests/e2e/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/e2e/test_action.py +62 -0
- panopticon_mcp-1.0.0/tests/e2e/test_analysis_cli.py +17 -0
- panopticon_mcp-1.0.0/tests/e2e/test_badge.py +78 -0
- panopticon_mcp-1.0.0/tests/e2e/test_baseline.py +47 -0
- panopticon_mcp-1.0.0/tests/e2e/test_ci.py +90 -0
- panopticon_mcp-1.0.0/tests/e2e/test_doctor.py +108 -0
- panopticon_mcp-1.0.0/tests/e2e/test_explain.py +165 -0
- panopticon_mcp-1.0.0/tests/e2e/test_fix_cli.py +156 -0
- panopticon_mcp-1.0.0/tests/e2e/test_install.py +225 -0
- panopticon_mcp-1.0.0/tests/e2e/test_release_gate.py +52 -0
- panopticon_mcp-1.0.0/tests/e2e/test_scan.py +292 -0
- panopticon_mcp-1.0.0/tests/e2e/test_watch.py +289 -0
- panopticon_mcp-1.0.0/tests/e2e/test_wrap.py +275 -0
- panopticon_mcp-1.0.0/tests/fixtures/README.md +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/checker/direct_write.py +5 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/broad_fs.json +14 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/clean.json +10 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/disabled.json +30 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/duplicate.json +22 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/malformed.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/remote.json +28 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/secret.json +14 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_code/variables.json +31 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/broad_fs.json +8 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/clean.json +8 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/disabled.json +19 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/duplicate.json +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/malformed.json +13 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/remote.json +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/secret.json +15 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/claude_desktop/variables.json +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/broad_fs.json +8 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/clean.json +8 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/disabled.json +19 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/duplicate.json +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/malformed.json +13 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/remote.json +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/secret.json +15 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/cursor/variables.json +12 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/broad_fs.json +14 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/clean.json +14 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/disabled.json +26 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/duplicate.json +18 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/malformed.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/remote.json +20 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/secret.json +21 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/generic/variables.json +20 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/broad_fs.json +20 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/clean.json +20 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/disabled.json +23 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/duplicate.json +20 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/malformed.json +19 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/remote.json +16 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/secret.json +23 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/vscode/variables.json +25 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/broad_fs.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/clean.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/disabled.json +19 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/duplicate.json +14 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/malformed.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/remote.json +17 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/secret.json +13 -0
- panopticon_mcp-1.0.0/tests/fixtures/discovery/windsurf/variables.json +17 -0
- panopticon_mcp-1.0.0/tests/fixtures/fix/client_matrix.json +19 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/01_github_pat.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/02_openai.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/03_anthropic.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/04_slack.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/05_aws.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/06_home_path.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/07_real_env.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/08_jwt.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/09_gitlab.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/10_hf.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/11_linux_home.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/12_windows_home.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/13_unc_home.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/14_wsl_home.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/15_url_secret.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/16_form_secret.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/17_base64_secret.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/18_base64url_secret.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/19_chunk_secret.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/20_shell_secret.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/21_nested_render.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/leak/22_json_windows_home.txt +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/decoy_leak.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/file_read.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/host_connect.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/idle_beacon.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/clean/proc_exec.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/compatible_examples.py +146 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/decoy_leak.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/file_read.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/host_connect.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/idle_beacon.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/evil/proc_exec.py +7 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/fixture_manifest.json +31 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/node_server.mjs +90 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/official/LICENSE +216 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/official/github_fetch_mock.mjs +77 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/official/manifest.json +62 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/official/server-everything-2026.8.18.tgz +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/mcp/python_server.py +234 -0
- panopticon_mcp-1.0.0/tests/fixtures/netlog/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/reporters/mixed_report.json +56 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-001/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-001/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-002/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-002/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-003/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-003/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-004/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-004/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-005/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-005/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-006/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-006/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-007/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-007/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-008/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-008/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-009/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-009/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-010/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-010/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-011/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-011/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-012/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/CFG-012/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-001/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-001/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-002/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-002/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-003/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-003/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-004/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/HIST-004/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-001/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-001/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-002/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-002/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-003/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-003/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-004/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-004/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-005/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-005/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-006/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-006/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-007/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-007/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-008/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-008/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-009/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-009/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-010/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-010/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-011/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-011/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-012/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-012/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-013/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-013/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-014/negative_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/WATCH-014/positive_case.json +1 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/behavior/cases.json +68 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/behavior/expected_sets.json +16 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/config/cases.json +37 -0
- panopticon_mcp-1.0.0/tests/fixtures/rules/history/cases.json +16 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/baseline-0.0-dev.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/baseline.json +10 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/diff_result.json +16 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/event.json +9 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/finding.json +26 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/installed_server.json +29 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/observation.json +79 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/observation_remote.json +58 -0
- panopticon_mcp-1.0.0/tests/fixtures/schemas/wrap_record.json +22 -0
- panopticon_mcp-1.0.0/tests/fixtures/strace/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/fixtures/upstream/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/integration/.gitkeep +0 -0
- panopticon_mcp-1.0.0/tests/integration/baseline/test_diff.py +225 -0
- panopticon_mcp-1.0.0/tests/integration/baseline/test_repository.py +76 -0
- panopticon_mcp-1.0.0/tests/integration/discovery/test_claude_discovery_integration.py +88 -0
- panopticon_mcp-1.0.0/tests/integration/discovery/test_remaining_client_fixtures.py +91 -0
- panopticon_mcp-1.0.0/tests/integration/events/test_attribution.py +54 -0
- panopticon_mcp-1.0.0/tests/integration/events/test_finding_sets.py +127 -0
- panopticon_mcp-1.0.0/tests/integration/fix/test_client_matrix.py +154 -0
- panopticon_mcp-1.0.0/tests/integration/fix/test_transaction.py +167 -0
- panopticon_mcp-1.0.0/tests/integration/probe/test_call_driver.py +86 -0
- panopticon_mcp-1.0.0/tests/integration/probe/test_compatible_examples.py +86 -0
- panopticon_mcp-1.0.0/tests/integration/probe/test_official_servers.py +48 -0
- panopticon_mcp-1.0.0/tests/integration/probe/test_protocol_eras.py +122 -0
- panopticon_mcp-1.0.0/tests/integration/probe/test_remote_http.py +103 -0
- panopticon_mcp-1.0.0/tests/integration/test_docker_environment.py +54 -0
- panopticon_mcp-1.0.0/tests/integration/test_fixture_matrix.py +252 -0
- panopticon_mcp-1.0.0/tests/integration/test_network_isolation.py +141 -0
- panopticon_mcp-1.0.0/tests/integration/test_runtime_isolation.py +88 -0
- panopticon_mcp-1.0.0/tests/integration/test_watch_local_integration.py +349 -0
- panopticon_mcp-1.0.0/tests/integration/test_watch_remote_integration.py +145 -0
- panopticon_mcp-1.0.0/tests/security/test_decoy_confidentiality.py +43 -0
- panopticon_mcp-1.0.0/tests/security/test_image_lock.py +40 -0
- panopticon_mcp-1.0.0/tests/security/test_persist_leaks.py +105 -0
- panopticon_mcp-1.0.0/tests/security/test_release_matrix.py +147 -0
- panopticon_mcp-1.0.0/tests/security/test_remote_ssrf.py +128 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/behavior/test_collectors.py +138 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/behavior/test_spans.py +76 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/dependency/test_advisory_scan.py +60 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/dependency/test_requirements.py +60 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/semantic/test_disclosure.py +157 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/semantic/test_semantic_adapted.py +83 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/static/test_rules_complete.py +222 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/static/test_semgrep_adapter.py +137 -0
- panopticon_mcp-1.0.0/tests/unit/analyzers/static/test_static_adapted.py +45 -0
- panopticon_mcp-1.0.0/tests/unit/baseline/test_migrate.py +48 -0
- panopticon_mcp-1.0.0/tests/unit/baseline/test_selection.py +73 -0
- panopticon_mcp-1.0.0/tests/unit/declared/test_authority.py +210 -0
- panopticon_mcp-1.0.0/tests/unit/declared/test_labeled_corpus.py +88 -0
- panopticon_mcp-1.0.0/tests/unit/discovery/test_claude_clients.py +80 -0
- panopticon_mcp-1.0.0/tests/unit/discovery/test_contract.py +106 -0
- panopticon_mcp-1.0.0/tests/unit/discovery/test_remaining_clients.py +37 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_ci_make_contract.py +92 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_cli_architecture.py +197 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_contracts.py +233 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_deep_adapter.py +76 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_engine_loc_checker.py +124 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_exit_codes.py +164 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_logging_boundary.py +176 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_module_boundaries.py +96 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_protocol_seams.py +86 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker.py +259 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_boundaries.py +210 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_definition_time.py +125 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_paths.py +233 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_exception_scopes.py +122 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_finally.py +275 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_handler_finally.py +263 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_nested_finally.py +250 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_reachability.py +325 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_quality_checker_scope_semantics.py +287 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_rule_i18n_physical_scope.py +81 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_rule_i18n_reserved_scope.py +311 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_rule_i18n_scope.py +332 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_inventory.py +149 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_local_production.py +197 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_observation.py +319 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_remote_production.py +131 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_self.py +33 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_self_metadata.py +136 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_service.py +245 -0
- panopticon_mcp-1.0.0/tests/unit/engine/test_watch_stages_complete.py +279 -0
- panopticon_mcp-1.0.0/tests/unit/events/test_strace_parser.py +36 -0
- panopticon_mcp-1.0.0/tests/unit/findings/test_build.py +71 -0
- panopticon_mcp-1.0.0/tests/unit/fix/test_plan.py +54 -0
- panopticon_mcp-1.0.0/tests/unit/fix/test_rules.py +110 -0
- panopticon_mcp-1.0.0/tests/unit/i18n/test_manifest.py +64 -0
- panopticon_mcp-1.0.0/tests/unit/install/test_install_plan.py +129 -0
- panopticon_mcp-1.0.0/tests/unit/inventory/test_normalize.py +193 -0
- panopticon_mcp-1.0.0/tests/unit/models/test_invalid.py +141 -0
- panopticon_mcp-1.0.0/tests/unit/models/test_roundtrip.py +29 -0
- panopticon_mcp-1.0.0/tests/unit/probe/test_arguments.py +142 -0
- panopticon_mcp-1.0.0/tests/unit/probe/test_client.py +254 -0
- panopticon_mcp-1.0.0/tests/unit/probe/test_driver.py +190 -0
- panopticon_mcp-1.0.0/tests/unit/probe/test_http.py +520 -0
- panopticon_mcp-1.0.0/tests/unit/registry/test_cache.py +135 -0
- panopticon_mcp-1.0.0/tests/unit/registry/test_history.py +171 -0
- panopticon_mcp-1.0.0/tests/unit/registry/test_offline.py +70 -0
- panopticon_mcp-1.0.0/tests/unit/registry/test_provider.py +136 -0
- panopticon_mcp-1.0.0/tests/unit/registry/test_registry_client.py +139 -0
- panopticon_mcp-1.0.0/tests/unit/reporters/test_sarif_markdown.py +117 -0
- panopticon_mcp-1.0.0/tests/unit/reporters/test_terminal_json.py +105 -0
- panopticon_mcp-1.0.0/tests/unit/reporters/test_watch_reporter.py +159 -0
- panopticon_mcp-1.0.0/tests/unit/rules/behavior/test_catalog.py +184 -0
- panopticon_mcp-1.0.0/tests/unit/rules/config/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/unit/rules/config/test_catalog.py +126 -0
- panopticon_mcp-1.0.0/tests/unit/rules/history/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/unit/rules/history/test_catalog.py +150 -0
- panopticon_mcp-1.0.0/tests/unit/rules/test_registry.py +50 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_archive.py +35 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_container_complete.py +83 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_decoy.py +77 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_decoys.py +47 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_docker.py +171 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_docker_runtime_complete.py +94 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_image_catalog.py +50 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_matcher.py +83 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_netlog.py +73 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_network.py +50 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_network_complete.py +209 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_podman.py +145 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_runtime.py +15 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_sandbox_contract.py +28 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_snapshot.py +105 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_streams.py +58 -0
- panopticon_mcp-1.0.0/tests/unit/sandbox/test_trace.py +149 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/__init__.py +0 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/_support.py +328 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_atomicity.py +169 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_contracts.py +102 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_controls.py +37 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_encrypted_backup.py +263 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_keyring_api_injection.py +125 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_no_plaintext.py +277 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_platforms.py +189 -0
- panopticon_mcp-1.0.0/tests/unit/secrets/test_task5_corrections.py +268 -0
- panopticon_mcp-1.0.0/tests/unit/store/__init__.py +0 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_atomic.py +279 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_canonicalize.py +68 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_direct_write_checker.py +147 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_hashes.py +55 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_persistence.py +195 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_render_scan.py +74 -0
- panopticon_mcp-1.0.0/tests/unit/store/test_repository_complete.py +142 -0
- panopticon_mcp-1.0.0/tests/unit/test_assemble_release.py +36 -0
- panopticon_mcp-1.0.0/tests/unit/test_cli.py +24 -0
- panopticon_mcp-1.0.0/tests/unit/test_docs_contract.py +264 -0
- panopticon_mcp-1.0.0/tests/unit/test_homebrew_formula.py +42 -0
- panopticon_mcp-1.0.0/tests/unit/test_identity.py +113 -0
- panopticon_mcp-1.0.0/tests/unit/test_leak_check.py +33 -0
- panopticon_mcp-1.0.0/tests/unit/test_leak_variants.py +236 -0
- panopticon_mcp-1.0.0/tests/unit/test_package_binary.py +44 -0
- panopticon_mcp-1.0.0/tests/unit/test_release_preflight.py +77 -0
- panopticon_mcp-1.0.0/tests/unit/test_schema_generation.py +21 -0
- panopticon_mcp-1.0.0/tests/unit/test_schema_invalid.py +172 -0
- panopticon_mcp-1.0.0/tests/unit/test_schema_roundtrip.py +64 -0
- panopticon_mcp-1.0.0/tests/unit/test_state_semantics.py +76 -0
- panopticon_mcp-1.0.0/tests/unit/test_typing_marker.py +13 -0
- panopticon_mcp-1.0.0/tests/unit/test_upstream_provenance.py +156 -0
- panopticon_mcp-1.0.0/tests/unit/test_workflow_syntax.py +108 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/__init__.py +0 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/_assertions.py +50 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/_fixtures.py +63 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/_injectors.py +63 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/_loaders.py +112 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/_protocols.py +136 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/_support.py +86 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_document.py +128 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_parser.py +194 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_parser_diagnostics.py +64 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_patch.py +275 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_patch_edges.py +113 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_patch_multiple_add.py +278 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_transaction.py +255 -0
- panopticon_mcp-1.0.0/tests/unit/util/jsonc/test_transaction_race.py +45 -0
- panopticon_mcp-1.0.0/tests/unit/wrap/test_framing.py +44 -0
- panopticon_mcp-1.0.0/tests/unit/wrap/test_process_complete.py +153 -0
- panopticon_mcp-1.0.0/tests/upstream/LICENSE +21 -0
- panopticon_mcp-1.0.0/tests/upstream/action.yml +85 -0
- panopticon_mcp-1.0.0/tests/upstream/conftest.py +12 -0
- panopticon_mcp-1.0.0/tests/upstream/pytest.ini +3 -0
- panopticon_mcp-1.0.0/tests/upstream/schemas/finding.schema.json +1365 -0
- panopticon_mcp-1.0.0/tests/upstream/schemas/gpt-review.schema.json +214 -0
- panopticon_mcp-1.0.0/tests/upstream/schemas/report.schema.json +1934 -0
- panopticon_mcp-1.0.0/tests/upstream/schemas/sarif-2.1.0.schema.json +3389 -0
- panopticon_mcp-1.0.0/tests/upstream/scripts/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/scripts/capture_gpt_reviews.py +547 -0
- panopticon_mcp-1.0.0/tests/upstream/scripts/run_github_action.py +426 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/__init__.py +10 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/1d9fb0acc9cf64f746d01d57845fb73028d8c3930d3b6279ec5941880a417118.json +344 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/52e691ed64ffa15f877a2b0b5654250109324d5c2819449f657f62907b1c1f39.json +344 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/99a008e1be20cfca0897fb0791f692013f04dc910f9e3e8cae395614110721ab.json +344 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/bf1c7a0f5ef6334341ecbf14f307b44e01b8bdf5ec298a10a77aedc5dfb083ba.json +345 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/c9738662d82b105023701144342c342f8bc8fe8e68ebd816c2bc6998a96eb79b.json +344 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/_cassettes/demo/manifest.json +83 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/cli.py +359 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/config.py +708 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/catalog.py +67 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/merge.py +69 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/prober.py +527 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/dynamic/sandbox.py +527 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/errors.py +21 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/finding.py +428 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/cache.py +67 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/context.py +191 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/schema.py +72 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/semantic_reviewer.py +1243 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/llm/tools.py +311 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/orchestrator.py +485 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/owasp_mapping.py +42 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/permissions.py +94 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/console.py +215 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/json_report.py +12 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/model.py +259 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/sarif.py +276 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/validate_json.py +47 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/report/validate_sarif.py +59 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/schema.py +113 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/ast_utils.py +167 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/catalog.py +111 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/engine.py +244 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/model.py +80 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent001.py +110 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent002.py +7 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent003.py +108 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent004.py +101 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent005.py +111 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent006.py +134 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/rules/sent007.py +122 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/semgrep/sent002.yaml +37 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/semgrep/sent005.yaml +15 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/semgrep_adapter.py +203 -0
- panopticon_mcp-1.0.0/tests/upstream/src/sentinel/static/traversal.py +200 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/conftest.py +129 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/pyproject.toml +9 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.integrity.yaml +4 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.permissions.yaml +21 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.target.yaml +7 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/sentinel.toml +5 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/server.py +132 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/clean_server/tools.yaml +15 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/pyproject.toml +5 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/sentinel.permissions.yaml +22 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/sentinel.target.yaml +6 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/server.py +37 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/storage.py +3 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/gpt_review_eval/tools.yaml +34 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/pyproject.toml +9 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/sentinel.permissions.yaml +20 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/sentinel.target.yaml +7 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/server.py +104 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/fixtures/vulnerable_server/tools.yaml +15 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_cli.py +285 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_config.py +242 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_dynamic_prober.py +314 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_dynamic_sandbox.py +224 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_finding.py +141 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_github_action.py +330 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_gpt_review.py +588 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_orchestrator.py +277 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_phase3_capture.py +29 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_report.py +208 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_sarif.py +84 -0
- panopticon_mcp-1.0.0/tests/upstream/tests/test_static_engine.py +208 -0
- panopticon_mcp-1.0.0/tests/visual/__init__.py +1 -0
- panopticon_mcp-1.0.0/tests/visual/test_evidence_card.py +187 -0
- panopticon_mcp-1.0.0/uv.lock +2869 -0
- panopticon_mcp-1.0.0/vendor/mcp-sentinel-e717e955.json +1694 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
## Epic
|
|
2
|
+
E__ — <name>
|
|
3
|
+
|
|
4
|
+
## What changed
|
|
5
|
+
|
|
6
|
+
## Definition-of-done items closed
|
|
7
|
+
- [ ] ...
|
|
8
|
+
|
|
9
|
+
## Plan / schema / rule changes
|
|
10
|
+
- [ ] panopticon-buildplan.md updated (or N/A)
|
|
11
|
+
- [ ] schemas/ updated + migrator (or N/A)
|
|
12
|
+
- [ ] i18n ko+en docs added for new rules (or N/A)
|
|
13
|
+
- [ ] docs/PROGRESS.md updated
|
|
14
|
+
|
|
15
|
+
## Leak & privacy
|
|
16
|
+
- [ ] No new persist path bypasses `util.leak_check`
|
|
17
|
+
- [ ] No new network call outside `registry/` and the sandbox
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
<svg width="1200" height="420" viewBox="0 0 1200 420" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<radialGradient id="bg" cx="50%" cy="42%" r="80%">
|
|
4
|
+
<stop offset="0%" stop-color="#111931"/>
|
|
5
|
+
<stop offset="55%" stop-color="#0B101F"/>
|
|
6
|
+
<stop offset="100%" stop-color="#070A13"/>
|
|
7
|
+
</radialGradient>
|
|
8
|
+
<linearGradient id="beam" x1="0" y1="0" x2="1" y2="0">
|
|
9
|
+
<stop offset="0%" stop-color="#FF7A1A" stop-opacity="0"/>
|
|
10
|
+
<stop offset="100%" stop-color="#FF7A1A" stop-opacity="0.25"/>
|
|
11
|
+
</linearGradient>
|
|
12
|
+
<filter id="glow" x="-60%" y="-60%" width="220%" height="220%">
|
|
13
|
+
<feGaussianBlur stdDeviation="5" result="b"/>
|
|
14
|
+
<feMerge>
|
|
15
|
+
<feMergeNode in="b"/>
|
|
16
|
+
<feMergeNode in="SourceGraphic"/>
|
|
17
|
+
</feMerge>
|
|
18
|
+
</filter>
|
|
19
|
+
<filter id="dotglow" x="-140%" y="-140%" width="380%" height="380%">
|
|
20
|
+
<feGaussianBlur stdDeviation="3" result="b"/>
|
|
21
|
+
<feMerge>
|
|
22
|
+
<feMergeNode in="b"/>
|
|
23
|
+
<feMergeNode in="SourceGraphic"/>
|
|
24
|
+
</feMerge>
|
|
25
|
+
</filter>
|
|
26
|
+
<filter id="softglow" x="-60%" y="-60%" width="220%" height="220%">
|
|
27
|
+
<feGaussianBlur stdDeviation="10" result="b"/>
|
|
28
|
+
<feMerge>
|
|
29
|
+
<feMergeNode in="b"/>
|
|
30
|
+
<feMergeNode in="SourceGraphic"/>
|
|
31
|
+
</feMerge>
|
|
32
|
+
</filter>
|
|
33
|
+
</defs>
|
|
34
|
+
|
|
35
|
+
<rect width="1200" height="420" fill="url(#bg)"/>
|
|
36
|
+
|
|
37
|
+
<!-- faint panopticon floor plan spanning the banner -->
|
|
38
|
+
<g transform="translate(600 210)">
|
|
39
|
+
<circle r="320" stroke="#2E3D63" stroke-width="1" fill="none"/>
|
|
40
|
+
<circle r="250" stroke="#2E3D63" stroke-width="1" fill="none"/>
|
|
41
|
+
<circle r="185" stroke="#35486F" stroke-width="1" fill="none" stroke-dasharray="3 14"/>
|
|
42
|
+
<!-- radial spokes -->
|
|
43
|
+
<g stroke="#26345A" stroke-width="1">
|
|
44
|
+
<path d="M0 -320 L0 -185"/><path d="M0 320 L0 185"/>
|
|
45
|
+
<path d="M-320 0 L-185 0"/><path d="M320 0 L185 0"/>
|
|
46
|
+
<path d="M-226 -226 L-131 -131"/><path d="M226 -226 L131 -131"/>
|
|
47
|
+
<path d="M-226 226 L-131 131"/><path d="M226 226 L131 131"/>
|
|
48
|
+
</g>
|
|
49
|
+
<!-- outer cell ticks -->
|
|
50
|
+
<g stroke="#46588A" stroke-width="10" stroke-linecap="round">
|
|
51
|
+
<g id="tick"><path d="M-14 -285 A285 285 0 0 1 42 -282" fill="none"/></g>
|
|
52
|
+
<use href="#tick" transform="rotate(24)"/>
|
|
53
|
+
<use href="#tick" transform="rotate(72)"/>
|
|
54
|
+
<use href="#tick" transform="rotate(144)"/>
|
|
55
|
+
<use href="#tick" transform="rotate(168)"/>
|
|
56
|
+
<use href="#tick" transform="rotate(192)"/>
|
|
57
|
+
<use href="#tick" transform="rotate(216)"/>
|
|
58
|
+
<use href="#tick" transform="rotate(240)"/>
|
|
59
|
+
<use href="#tick" transform="rotate(264)"/>
|
|
60
|
+
<use href="#tick" transform="rotate(288)"/>
|
|
61
|
+
<use href="#tick" transform="rotate(336)"/>
|
|
62
|
+
</g>
|
|
63
|
+
<!-- caught cells: primary + secondary detection lights -->
|
|
64
|
+
<path d="M-14 -285 A285 285 0 0 1 42 -282" transform="rotate(96)"
|
|
65
|
+
fill="none" stroke="#FF7A1A" stroke-width="10" stroke-linecap="round" filter="url(#glow)"/>
|
|
66
|
+
<path d="M-14 -285 A285 285 0 0 1 42 -282" transform="rotate(312)"
|
|
67
|
+
fill="none" stroke="#FF7A1A" stroke-width="10" stroke-linecap="round" opacity="0.8" filter="url(#glow)"/>
|
|
68
|
+
<path d="M-14 -285 A285 285 0 0 1 42 -282" transform="rotate(48)"
|
|
69
|
+
fill="none" stroke="#FFB020" stroke-width="10" stroke-linecap="round" opacity="0.75" filter="url(#glow)"/>
|
|
70
|
+
<!-- detection dots on the rings -->
|
|
71
|
+
<g filter="url(#dotglow)">
|
|
72
|
+
<circle cx="161" cy="-191" r="4.5" fill="#FF7A1A"/>
|
|
73
|
+
<circle cx="-235" cy="-85" r="3.5" fill="#FFB020" opacity="0.85"/>
|
|
74
|
+
<circle cx="-296" cy="120" r="3" fill="#FF7A1A" opacity="0.7"/>
|
|
75
|
+
<circle cx="304" cy="98" r="3.5" fill="#FF7A1A" opacity="0.75"/>
|
|
76
|
+
<circle cx="-90" cy="-244" r="2.8" fill="#FFB020" opacity="0.6"/>
|
|
77
|
+
</g>
|
|
78
|
+
</g>
|
|
79
|
+
|
|
80
|
+
<!-- central emblem -->
|
|
81
|
+
<g transform="translate(600 148)">
|
|
82
|
+
<circle r="54" stroke="#6B7EB0" stroke-width="2" fill="none" stroke-dasharray="2 9" stroke-linecap="round"/>
|
|
83
|
+
<circle r="38" stroke="#E8EDF7" stroke-width="4" fill="#0A0E1A"/>
|
|
84
|
+
<rect x="-12" y="-18" width="24" height="36" rx="3.5" fill="#FF7A1A" filter="url(#softglow)"/>
|
|
85
|
+
</g>
|
|
86
|
+
|
|
87
|
+
<!-- wordmark -->
|
|
88
|
+
<text x="600" y="268" text-anchor="middle" fill="#E8EDF7"
|
|
89
|
+
font-family="Futura, 'Avenir Next', 'Helvetica Neue', Arial, sans-serif"
|
|
90
|
+
font-size="52" font-weight="700" letter-spacing="22">PANOPTICON</text>
|
|
91
|
+
|
|
92
|
+
<!-- tagline -->
|
|
93
|
+
<text x="600" y="316" text-anchor="middle" fill="#8B98B8"
|
|
94
|
+
font-family="SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace"
|
|
95
|
+
font-size="19" letter-spacing="1">We don't watch you. We watch your MCPs.</text>
|
|
96
|
+
|
|
97
|
+
<!-- sub line -->
|
|
98
|
+
<text x="600" y="352" text-anchor="middle" fill="#4E5C7E"
|
|
99
|
+
font-family="SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace"
|
|
100
|
+
font-size="14" letter-spacing="4">LOCAL-FIRST MCP BEHAVIOR OBSERVATORY</text>
|
|
101
|
+
|
|
102
|
+
<!-- corner terminal hints -->
|
|
103
|
+
<g font-family="SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace" font-size="13">
|
|
104
|
+
<text x="48" y="52" fill="#3E4C6E">$ pano watch github</text>
|
|
105
|
+
<text x="48" y="76" fill="#8B98B8">READ ~/.ssh/config</text>
|
|
106
|
+
<text x="238" y="76" fill="#FFB020">not declared</text>
|
|
107
|
+
<text x="48" y="100" fill="#FF6B4A">LEAK AWS_ACCESS_KEY_ID</text>
|
|
108
|
+
<text x="268" y="100" fill="#5E6C8E"><- decoy value</text>
|
|
109
|
+
<text x="1152" y="388" text-anchor="end" fill="#2E3A58">UNKNOWN stays visible - unobserved behavior stays UNKNOWN</text>
|
|
110
|
+
</g>
|
|
111
|
+
</svg>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<!-- Panopticon eye: concentric floor-plan rings, terminal-cursor pupil -->
|
|
3
|
+
<defs>
|
|
4
|
+
<radialGradient id="bgGlow" cx="50%" cy="50%" r="60%">
|
|
5
|
+
<stop offset="0%" stop-color="#131A2E"/>
|
|
6
|
+
<stop offset="100%" stop-color="#0A0E1A"/>
|
|
7
|
+
</radialGradient>
|
|
8
|
+
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
9
|
+
<feGaussianBlur stdDeviation="4" result="b"/>
|
|
10
|
+
<feMerge>
|
|
11
|
+
<feMergeNode in="b"/>
|
|
12
|
+
<feMergeNode in="SourceGraphic"/>
|
|
13
|
+
</feMerge>
|
|
14
|
+
</filter>
|
|
15
|
+
<linearGradient id="beamL" x1="118" y1="128" x2="38" y2="128" gradientUnits="userSpaceOnUse">
|
|
16
|
+
<stop offset="0%" stop-color="#FF7A1A" stop-opacity="0.02"/>
|
|
17
|
+
<stop offset="100%" stop-color="#FF7A1A" stop-opacity="0.2"/>
|
|
18
|
+
</linearGradient>
|
|
19
|
+
<filter id="dotglow" x="-120%" y="-120%" width="340%" height="340%">
|
|
20
|
+
<feGaussianBlur stdDeviation="2.5" result="b"/>
|
|
21
|
+
<feMerge>
|
|
22
|
+
<feMergeNode in="b"/>
|
|
23
|
+
<feMergeNode in="SourceGraphic"/>
|
|
24
|
+
</feMerge>
|
|
25
|
+
</filter>
|
|
26
|
+
</defs>
|
|
27
|
+
|
|
28
|
+
<rect width="256" height="256" rx="56" fill="url(#bgGlow)"/>
|
|
29
|
+
|
|
30
|
+
<!-- outer cell ring: brighter arcs -->
|
|
31
|
+
<g stroke="#4A5D8C" stroke-width="6" stroke-linecap="round">
|
|
32
|
+
<g id="cells">
|
|
33
|
+
<path d="M128 24 A104 104 0 0 1 154.9 27.5" fill="none"/>
|
|
34
|
+
</g>
|
|
35
|
+
<use href="#cells" transform="rotate(30 128 128)"/>
|
|
36
|
+
<use href="#cells" transform="rotate(60 128 128)"/>
|
|
37
|
+
<use href="#cells" transform="rotate(90 128 128)"/>
|
|
38
|
+
<use href="#cells" transform="rotate(150 128 128)"/>
|
|
39
|
+
<use href="#cells" transform="rotate(180 128 128)"/>
|
|
40
|
+
<use href="#cells" transform="rotate(240 128 128)"/>
|
|
41
|
+
<use href="#cells" transform="rotate(300 128 128)"/>
|
|
42
|
+
<use href="#cells" transform="rotate(330 128 128)"/>
|
|
43
|
+
</g>
|
|
44
|
+
<!-- caught cells: primary + secondary detection lights -->
|
|
45
|
+
<path d="M128 24 A104 104 0 0 1 154.9 27.5" transform="rotate(270 128 128)"
|
|
46
|
+
fill="none" stroke="#FF7A1A" stroke-width="6" stroke-linecap="round" filter="url(#glow)"/>
|
|
47
|
+
<path d="M128 24 A104 104 0 0 1 154.9 27.5" transform="rotate(120 128 128)"
|
|
48
|
+
fill="none" stroke="#FF7A1A" stroke-width="6" stroke-linecap="round" opacity="0.7" filter="url(#glow)"/>
|
|
49
|
+
<path d="M128 24 A104 104 0 0 1 154.9 27.5" transform="rotate(210 128 128)"
|
|
50
|
+
fill="none" stroke="#FFB020" stroke-width="6" stroke-linecap="round" opacity="0.55" filter="url(#glow)"/>
|
|
51
|
+
|
|
52
|
+
<!-- middle ring, brighter -->
|
|
53
|
+
<circle cx="128" cy="128" r="74" stroke="#6B7EB0" stroke-width="3" fill="none" stroke-dasharray="2 10" stroke-linecap="round"/>
|
|
54
|
+
|
|
55
|
+
<!-- detection dots on the middle ring -->
|
|
56
|
+
<g filter="url(#dotglow)">
|
|
57
|
+
<circle cx="182" cy="77.5" r="4" fill="#FF7A1A"/>
|
|
58
|
+
<circle cx="63" cy="171" r="3.2" fill="#FFB020" opacity="0.85"/>
|
|
59
|
+
<circle cx="128" cy="202" r="2.6" fill="#FF7A1A" opacity="0.7"/>
|
|
60
|
+
</g>
|
|
61
|
+
|
|
62
|
+
<!-- scan beam toward the caught cell (pointing left) -->
|
|
63
|
+
<path d="M118 128 L38 108 L38 148 Z" fill="url(#beamL)"/>
|
|
64
|
+
|
|
65
|
+
<!-- iris -->
|
|
66
|
+
<circle cx="128" cy="128" r="46" stroke="#E8EDF7" stroke-width="5" fill="#0A0E1A"/>
|
|
67
|
+
|
|
68
|
+
<!-- terminal cursor pupil -->
|
|
69
|
+
<rect x="113" y="106" width="30" height="44" rx="4" fill="#FF7A1A" filter="url(#glow)"/>
|
|
70
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
name: dependency-audit
|
|
2
|
+
on:
|
|
3
|
+
schedule: [{ cron: "0 3 * * 1" }]
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
permissions:
|
|
6
|
+
contents: read
|
|
7
|
+
jobs:
|
|
8
|
+
osv:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
|
|
12
|
+
- uses: google/osv-scanner-action/osv-scanner-action@6e4298ebc4db23e847df9b2e2de2939d6f066c67
|
|
13
|
+
with: { scan-args: "--lockfile=uv.lock" }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
on:
|
|
3
|
+
push: { branches: [main] }
|
|
4
|
+
pull_request:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "17 3 * * *"
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
jobs:
|
|
10
|
+
lint-type:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
14
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
15
|
+
- run: uv sync --all-extras
|
|
16
|
+
- run: uv run ruff check . && uv run ruff format --check .
|
|
17
|
+
- run: uv run mypy
|
|
18
|
+
- run: uv run mypy --strict tests/unit/engine
|
|
19
|
+
- run: uv run mypy --strict scripts/check_rules.py
|
|
20
|
+
- run: uv run mypy --strict scripts/check_engine_loc.py scripts/check_no_excuse_rules.py
|
|
21
|
+
- run: uv run python scripts/check_no_excuse_rules.py tests/unit/engine scripts/check_rules.py
|
|
22
|
+
- run: uv run python scripts/check_engine_loc.py # 250 pure LOC maximum
|
|
23
|
+
- run: uv run python scripts/validate_schemas.py
|
|
24
|
+
- run: uv run python scripts/check_i18n.py
|
|
25
|
+
- run: uv run python scripts/check_phrases.py
|
|
26
|
+
- run: uv run python scripts/check_rules.py
|
|
27
|
+
- run: uv run python scripts/check_persistence_boundary.py
|
|
28
|
+
test:
|
|
29
|
+
strategy:
|
|
30
|
+
matrix:
|
|
31
|
+
os: [ubuntu-latest, macos-latest]
|
|
32
|
+
py: ["3.11", "3.12"]
|
|
33
|
+
runs-on: ${{ matrix.os }}
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
36
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
37
|
+
with: { python-version: "${{ matrix.py }}" }
|
|
38
|
+
- run: uv sync --all-extras
|
|
39
|
+
- run: uv run pytest -m "not docker and not network" --cov --cov-report=xml
|
|
40
|
+
- uses: codecov/codecov-action@0fb7174895f61a3b6b78fc075e0cd60383518dac # v5
|
|
41
|
+
if: matrix.os == 'ubuntu-latest' && matrix.py == '3.12'
|
|
42
|
+
with: { files: coverage.xml }
|
|
43
|
+
test-docker:
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
47
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
|
|
48
|
+
- run: uv sync --all-extras
|
|
49
|
+
- run: make images images-podman
|
|
50
|
+
- run: uv run pytest -m docker
|
|
51
|
+
self-scan:
|
|
52
|
+
# E16: run our own analyze line on this repository.
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
if: github.event_name != 'pull_request'
|
|
55
|
+
permissions:
|
|
56
|
+
contents: read
|
|
57
|
+
security-events: write
|
|
58
|
+
steps:
|
|
59
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
|
|
60
|
+
- id: scan
|
|
61
|
+
uses: ./
|
|
62
|
+
with:
|
|
63
|
+
path: .
|
|
64
|
+
mode: quick
|
|
65
|
+
sarif: pano.sarif
|
|
66
|
+
fail-on: never
|
|
67
|
+
- uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
|
|
68
|
+
if: always()
|
|
69
|
+
with:
|
|
70
|
+
sarif_file: pano.sarif
|
|
71
|
+
category: panopticon-self-scan
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
name: publish-sandbox-images
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
publish:
|
|
11
|
+
runs-on: ubuntu-24.04
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
packages: write
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
|
|
17
|
+
- uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130
|
|
18
|
+
- uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f
|
|
19
|
+
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9
|
|
20
|
+
with:
|
|
21
|
+
registry: ghcr.io
|
|
22
|
+
username: ${{ github.actor }}
|
|
23
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
24
|
+
- name: Publish base image
|
|
25
|
+
id: base
|
|
26
|
+
uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
|
|
27
|
+
with:
|
|
28
|
+
context: src/panopticon/sandbox/images
|
|
29
|
+
file: src/panopticon/sandbox/images/base.Dockerfile
|
|
30
|
+
platforms: linux/amd64,linux/arm64
|
|
31
|
+
push: true
|
|
32
|
+
tags: ghcr.io/brnyxx/pano-sandbox-base:0.1
|
|
33
|
+
provenance: mode=max
|
|
34
|
+
sbom: true
|
|
35
|
+
- name: Publish Node 20 image
|
|
36
|
+
id: node20
|
|
37
|
+
uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
|
|
38
|
+
with:
|
|
39
|
+
context: src/panopticon/sandbox/images
|
|
40
|
+
file: src/panopticon/sandbox/images/node.Dockerfile
|
|
41
|
+
platforms: linux/amd64,linux/arm64
|
|
42
|
+
push: true
|
|
43
|
+
tags: ghcr.io/brnyxx/pano-sandbox-node:20
|
|
44
|
+
build-args: BASE_IMAGE=ghcr.io/brnyxx/pano-sandbox-base@${{ steps.base.outputs.digest }}
|
|
45
|
+
provenance: mode=max
|
|
46
|
+
sbom: true
|
|
47
|
+
- name: Publish Node 22 image
|
|
48
|
+
id: node22
|
|
49
|
+
uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
|
|
50
|
+
with:
|
|
51
|
+
context: src/panopticon/sandbox/images
|
|
52
|
+
file: src/panopticon/sandbox/images/node.Dockerfile
|
|
53
|
+
platforms: linux/amd64,linux/arm64
|
|
54
|
+
push: true
|
|
55
|
+
tags: ghcr.io/brnyxx/pano-sandbox-node:22
|
|
56
|
+
build-args: |
|
|
57
|
+
BASE_IMAGE=ghcr.io/brnyxx/pano-sandbox-base@${{ steps.base.outputs.digest }}
|
|
58
|
+
NODE_IMAGE=node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5
|
|
59
|
+
provenance: mode=max
|
|
60
|
+
sbom: true
|
|
61
|
+
- name: Publish Python 3.12 image
|
|
62
|
+
id: python312
|
|
63
|
+
uses: docker/build-push-action@1104d471370f9806843c095c1db02b5a90c5f8b6
|
|
64
|
+
with:
|
|
65
|
+
context: src/panopticon/sandbox/images
|
|
66
|
+
file: src/panopticon/sandbox/images/python.Dockerfile
|
|
67
|
+
platforms: linux/amd64,linux/arm64
|
|
68
|
+
push: true
|
|
69
|
+
tags: ghcr.io/brnyxx/pano-sandbox-python:3.12
|
|
70
|
+
provenance: mode=max
|
|
71
|
+
sbom: true
|
|
72
|
+
- name: Verify immutable manifests and tool versions
|
|
73
|
+
shell: bash
|
|
74
|
+
env:
|
|
75
|
+
BASE_DIGEST: ${{ steps.base.outputs.digest }}
|
|
76
|
+
NODE20_DIGEST: ${{ steps.node20.outputs.digest }}
|
|
77
|
+
NODE22_DIGEST: ${{ steps.node22.outputs.digest }}
|
|
78
|
+
PYTHON312_DIGEST: ${{ steps.python312.outputs.digest }}
|
|
79
|
+
run: |
|
|
80
|
+
set -euo pipefail
|
|
81
|
+
docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-base@$BASE_DIGEST"
|
|
82
|
+
docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-node@$NODE20_DIGEST"
|
|
83
|
+
docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-node@$NODE22_DIGEST"
|
|
84
|
+
docker buildx imagetools inspect "ghcr.io/brnyxx/pano-sandbox-python@$PYTHON312_DIGEST"
|
|
85
|
+
docker run --rm --platform linux/amd64 --entrypoint node "ghcr.io/brnyxx/pano-sandbox-node@$NODE20_DIGEST" --version
|
|
86
|
+
docker run --rm --platform linux/arm64 --entrypoint node "ghcr.io/brnyxx/pano-sandbox-node@$NODE22_DIGEST" --version
|
|
87
|
+
docker run --rm --platform linux/amd64 --entrypoint python "ghcr.io/brnyxx/pano-sandbox-python@$PYTHON312_DIGEST" --version
|
|
88
|
+
docker run --rm --platform linux/amd64 --entrypoint uv "ghcr.io/brnyxx/pano-sandbox-python@$PYTHON312_DIGEST" --version
|
|
89
|
+
- name: Record immutable publication digests
|
|
90
|
+
shell: bash
|
|
91
|
+
env:
|
|
92
|
+
BASE_DIGEST: ${{ steps.base.outputs.digest }}
|
|
93
|
+
NODE20_DIGEST: ${{ steps.node20.outputs.digest }}
|
|
94
|
+
NODE22_DIGEST: ${{ steps.node22.outputs.digest }}
|
|
95
|
+
PYTHON312_DIGEST: ${{ steps.python312.outputs.digest }}
|
|
96
|
+
PANO_COMMIT: ${{ github.sha }}
|
|
97
|
+
run: |
|
|
98
|
+
python - <<'PY'
|
|
99
|
+
import json
|
|
100
|
+
import os
|
|
101
|
+
from pathlib import Path
|
|
102
|
+
|
|
103
|
+
payload = {
|
|
104
|
+
"commit": os.environ["PANO_COMMIT"],
|
|
105
|
+
"ghcr.io/brnyxx/pano-sandbox-base:0.1": os.environ["BASE_DIGEST"],
|
|
106
|
+
"ghcr.io/brnyxx/pano-sandbox-node:20": os.environ["NODE20_DIGEST"],
|
|
107
|
+
"ghcr.io/brnyxx/pano-sandbox-node:22": os.environ["NODE22_DIGEST"],
|
|
108
|
+
"ghcr.io/brnyxx/pano-sandbox-python:3.12": os.environ["PYTHON312_DIGEST"],
|
|
109
|
+
}
|
|
110
|
+
Path("image-digests.json").write_text(
|
|
111
|
+
json.dumps(payload, sort_keys=True, separators=(",", ":")) + "\n",
|
|
112
|
+
encoding="utf-8",
|
|
113
|
+
)
|
|
114
|
+
PY
|
|
115
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
|
|
116
|
+
with:
|
|
117
|
+
name: sandbox-image-digests
|
|
118
|
+
path: image-digests.json
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
name: platform-evidence
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
probe:
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
include:
|
|
17
|
+
- label: darwin-arm64
|
|
18
|
+
runs-on: macos-14
|
|
19
|
+
- label: darwin-x86_64
|
|
20
|
+
runs-on: macos-15-intel
|
|
21
|
+
- label: linux-amd64
|
|
22
|
+
runs-on: ubuntu-24.04
|
|
23
|
+
- label: linux-arm64
|
|
24
|
+
runs-on: ubuntu-24.04-arm
|
|
25
|
+
- label: windows-x64
|
|
26
|
+
runs-on: windows-2025
|
|
27
|
+
runs-on: ${{ matrix.runs-on }}
|
|
28
|
+
name: probe-${{ matrix.label }}
|
|
29
|
+
permissions:
|
|
30
|
+
contents: read
|
|
31
|
+
id-token: write
|
|
32
|
+
attestations: write
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
|
|
35
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78
|
|
36
|
+
- name: Install test dependencies
|
|
37
|
+
run: uv sync --all-extras
|
|
38
|
+
- name: Build local sandbox image
|
|
39
|
+
if: startsWith(matrix.label, 'linux-')
|
|
40
|
+
run: make images
|
|
41
|
+
- name: Probe platform
|
|
42
|
+
shell: bash
|
|
43
|
+
env:
|
|
44
|
+
PANO_PLATFORM_LABEL: ${{ matrix.label }}
|
|
45
|
+
PANO_COMMIT: ${{ github.sha }}
|
|
46
|
+
run: uv run python scripts/platform_probe.py --label "$PANO_PLATFORM_LABEL" --commit "$PANO_COMMIT" --output "evidence/$PANO_PLATFORM_LABEL.json"
|
|
47
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
|
|
48
|
+
if: always()
|
|
49
|
+
with:
|
|
50
|
+
name: platform-${{ matrix.label }}
|
|
51
|
+
path: evidence/${{ matrix.label }}.json
|
|
52
|
+
- uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
|
|
53
|
+
with:
|
|
54
|
+
subject-path: evidence/${{ matrix.label }}.json
|
|
55
|
+
|
|
56
|
+
probe-wsl2:
|
|
57
|
+
runs-on: windows-2025
|
|
58
|
+
permissions:
|
|
59
|
+
contents: read
|
|
60
|
+
id-token: write
|
|
61
|
+
attestations: write
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
|
|
64
|
+
- name: Probe hosted WSL2
|
|
65
|
+
shell: pwsh
|
|
66
|
+
env:
|
|
67
|
+
PANO_COMMIT: ${{ github.sha }}
|
|
68
|
+
PANO_WORKSPACE: ${{ github.workspace }}
|
|
69
|
+
run: ./scripts/run_wsl2_probe.ps1 -Commit "$env:PANO_COMMIT" -Workspace "$env:PANO_WORKSPACE"
|
|
70
|
+
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
|
|
71
|
+
if: always()
|
|
72
|
+
with:
|
|
73
|
+
name: platform-wsl2-x64
|
|
74
|
+
path: evidence/wsl2-x64.json
|
|
75
|
+
- uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a
|
|
76
|
+
with:
|
|
77
|
+
subject-path: evidence/wsl2-x64.json
|
|
78
|
+
|
|
79
|
+
validate:
|
|
80
|
+
needs: [probe, probe-wsl2]
|
|
81
|
+
if: always()
|
|
82
|
+
runs-on: ubuntu-24.04
|
|
83
|
+
permissions:
|
|
84
|
+
contents: read
|
|
85
|
+
attestations: read
|
|
86
|
+
steps:
|
|
87
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803
|
|
88
|
+
- uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78
|
|
89
|
+
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
|
90
|
+
with:
|
|
91
|
+
pattern: platform-*
|
|
92
|
+
path: evidence
|
|
93
|
+
merge-multiple: true
|
|
94
|
+
- name: Validate exact platform matrix
|
|
95
|
+
env:
|
|
96
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
97
|
+
PANO_COMMIT: ${{ github.sha }}
|
|
98
|
+
PANO_REPOSITORY: ${{ github.repository }}
|
|
99
|
+
run: uv run --no-project python scripts/run_platform_matrix.py --require darwin-arm64,darwin-x86_64,linux-amd64,linux-arm64,windows-x64,wsl2-x64 --evidence-dir evidence --commit "$PANO_COMMIT" --github-repo "$PANO_REPOSITORY"
|