security-knowledge-os 0.1.0__tar.gz → 0.2.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.
- security_knowledge_os-0.2.0/.github/workflows/ci.yml +41 -0
- security_knowledge_os-0.2.0/.github/workflows/publish.yml +52 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/PKG-INFO +23 -2
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/PUBLICATION_MANIFEST.md +39 -13
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/README.md +21 -1
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/__init__.py +1 -1
- security_knowledge_os-0.2.0/app/adapters/__init__.py +1 -0
- security_knowledge_os-0.2.0/app/adapters/mcp_config.py +528 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/cli.py +103 -2
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/assessment.py +38 -1
- security_knowledge_os-0.2.0/app/models/pack.py +69 -0
- security_knowledge_os-0.2.0/app/pack_cli.py +215 -0
- security_knowledge_os-0.2.0/app/packs/__init__.py +1 -0
- security_knowledge_os-0.2.0/app/packs/archive.py +104 -0
- security_knowledge_os-0.2.0/app/packs/build.py +163 -0
- security_knowledge_os-0.2.0/app/packs/diff.py +85 -0
- security_knowledge_os-0.2.0/app/packs/license.py +96 -0
- security_knowledge_os-0.2.0/app/packs/loader.py +99 -0
- security_knowledge_os-0.2.0/app/packs/manifest.py +129 -0
- security_knowledge_os-0.2.0/app/packs/signing.py +98 -0
- security_knowledge_os-0.2.0/app/packs/store.py +650 -0
- security_knowledge_os-0.2.0/app/packs/trusted_keys.py +25 -0
- security_knowledge_os-0.2.0/app/packs/verify.py +242 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/assess.py +50 -1
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/clause_eval.py +17 -5
- security_knowledge_os-0.2.0/app/reviewer/extensions.py +100 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/questions.py +8 -25
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/report.py +27 -2
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/rule_engine.py +8 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/rule_loader.py +40 -11
- security_knowledge_os-0.2.0/app/reviewer/vocabulary.py +192 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/constraints.txt +3 -0
- security_knowledge_os-0.2.0/docs/pack-schema.md +269 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/pyproject.toml +4 -1
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/sbom.json +61 -1
- security_knowledge_os-0.2.0/scripts/issue_license.py +60 -0
- security_knowledge_os-0.2.0/tests/unit/test_mcp_scan.py +325 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_no_code_execution.py +26 -0
- security_knowledge_os-0.2.0/tests/unit/test_packs.py +1075 -0
- security_knowledge_os-0.2.0/tests/unit/test_packs_cli.py +137 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/.env.example +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/.gitignore +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/LICENSE +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/NOTICE +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/REVIEW_CHECKLIST.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/REVIEW_PACKAGE.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/config.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/eval/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/eval/metrics.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/ingestion/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/ingestion/chunker.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/ingestion/loader.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/ingestion/parser.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/ingestion/snapshot.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/ingestion/validator.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/llm/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/llm/anthropic_client.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/llm/base.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/llm/factory.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/llm/mock.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/main.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/_credential_shapes.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/answer.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/context.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/knowledge.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/llm_io.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/policy_outcome.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/report.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/retrieval.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/reviewer_output.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/risk.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/models/rule_clause.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/policy/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/policy/classification.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/policy/human_gate.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/policy/knowledge_guard.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/policy/safe_test.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/retrieval/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/retrieval/base.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/retrieval/bm25.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/retrieval/hybrid.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/retrieval/index.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/answers.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/attack_surface.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/evidence.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/facts.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/llm_review.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/normalize.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/reviewer/rollup.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/safe_errors.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/storage/__init__.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/storage/db.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/storage/integrity.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/app/storage/repository.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/acceptance-criteria.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/architecture.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/attribution.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/history-rewrite-map.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/knowledge-corpus.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/knowledge-schema.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/rule-schema.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/safe-test-schema.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/safety-boundaries.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/docs/threat-model.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/private/README.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/private/confidential/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/private/internal/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/agent-security/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/agent-security/KU-0004-excessive-agency-least-privilege.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/agent-security/KU-0005-human-approval-gates.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/agent-security/KU-0006-outbound-channels-allowlist.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/credential-security/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/credential-security/KU-0008-secrets-not-reachable-by-model.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/credential-security/KU-0009-credential-broker-pattern.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/governance/KU-0012-human-oversight.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/incidents/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/incidents/KU-0014-llm-payload-identifier-leak.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/memory-security/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/memory-security/KU-0007-persistent-memory-poisoning.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/methodology/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/methodology/KU-0011-improper-output-handling.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/methodology/KU-0013-assume-compromise-ja.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/prompt-security/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/prompt-security/KU-0001-direct-prompt-injection.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/prompt-security/KU-0010-system-prompt-leakage.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/rag-security/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/rag-security/KU-0002-indirect-prompt-injection.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/knowledge/public/rag-security/KU-0003-untrusted-content-isolation.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/agent/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/agent/OUT-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/agent/TOOL-000.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/agent/TOOL-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/credential/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/credential/CRED-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/governance/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/governance/GOV-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/memory/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/memory/MEM-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/prompt/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/rag/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/rules/rag/PI-003.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/safe_tests/ST-CRED-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/safe_tests/ST-IPI-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/safe_tests/ST-MEM-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/safe_tests/ST-TOOL-001.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/_scheduled_cross_review.sh +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/assess.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/build_index.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/evaluate.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/generate_sbom.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/ingest.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/preflight.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/run_cross_review.sh +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/secret_scan.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/validate_knowledge.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/validate_rules.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/scripts/validate_safe_tests.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/conftest.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/safe/S-001-prompt-only.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/safe/S-002-rag-trusted-no-actions.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/safe/S-003-readonly-tool-with-approval.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/safe/S-004-credential-proxy.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/unknown/U-001-tool-permissions-missing.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/unknown/U-002-memory-persistence-unspecified.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/unknown/U-003-outbound-destination-unspecified.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/unknown/U-004-credential-handling-unspecified.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/unknown/U-005-tool-permission-unrecognized.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/vulnerable/V-001-indirect-injection-auto-email.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/vulnerable/V-002-rag-delete-tool-no-approval.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/vulnerable/V-003-persistent-memory-untrusted.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/vulnerable/V-004-env-secret-readable.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/assessments/vulnerable/V-005-unlisted-rag-source-untrusted-memory.yaml +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus/private/confidential/KU-1020-confidential-tool-matrix.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus/private/internal/KU-1010-internal-memory-heuristic.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus/public/credential-security/KU-1003-env-secret-exposure.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus/public/prompt-security/KU-1001-instruction-data-boundary.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus/public/rag-security/KU-1002-indirect-injection-external-document.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus/secret/KU-1099-secret-must-not-index.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/corpus_alt/public/methodology/KU-2001-alt-corpus-marker.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/invalid/KU-0010-mislabeled.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/invalid/bad-classification.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/invalid/bad-id.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/invalid/missing-fields.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/invalid/no-front-matter.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/private/internal/KU-0002-internal-note.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/public/methodology/KU-0003-sparse.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/public/prompt-security/KU-0001-instruction-hierarchy.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/fixtures/knowledge/secret/KU-0009-secret.md +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/integration/.gitkeep +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_answers.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_anthropic_client.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_api.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_assess.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_assess_m4.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_assess_m5.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_assess_script.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_assessment_input.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_build_index_script.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_classification_gate.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_classification_leakage.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_clause_eval.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_cli.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_config.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_cross_review_script.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_db.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_eval.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_evaluate_script.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_evidence.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_fail_closed.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_finding_boundary.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_generate_sbom.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_human_gate.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_ingest_script.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_ja_retrieval.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_knowledge_corpus.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_knowledge_guard.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_knowledge_root_config.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_knowledge_schema.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_llm_adapter.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_llm_boundary.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_llm_output_schema.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_llm_review.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_loader.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_no_secret_echo.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_normalize.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_parser.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_policy_outcome.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_preflight_manifest.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_questions.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_reindex.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_report.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_repository.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_retrieval.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_rollup.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_rule_engine.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_rule_loader.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_safe_test.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_secret_scan.py +0 -0
- {security_knowledge_os-0.1.0 → security_knowledge_os-0.2.0}/tests/unit/test_snapshot.py +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
# TODO: pin these actions to a full commit SHA for supply-chain safety.
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
persist-credentials: false
|
|
19
|
+
fetch-depth: 0 # full history (the manifest-ancestor check needs it)
|
|
20
|
+
- uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.12"
|
|
23
|
+
- name: Install (pinned)
|
|
24
|
+
run: pip install -e ".[api,llm,dev]" -c constraints.txt
|
|
25
|
+
# Mirrors the project's own gate (scripts/preflight.py runs `ruff check`,
|
|
26
|
+
# not `ruff format --check`), so CI enforces exactly what the repo commits
|
|
27
|
+
# to. (`ruff format --check` is not run repo-wide yet - a separate cleanup.)
|
|
28
|
+
- name: Ruff (lint)
|
|
29
|
+
run: ruff check .
|
|
30
|
+
- name: Mypy (strict)
|
|
31
|
+
run: mypy
|
|
32
|
+
# Two tests assert the tracked sbom.json matches the *exact* installed
|
|
33
|
+
# dependency closure of the maintainer's environment (e.g. build-time
|
|
34
|
+
# packages like trove-classifiers); they cannot pass in an arbitrary CI
|
|
35
|
+
# runner and are verified locally via scripts/preflight.py before a
|
|
36
|
+
# release. Everything else - including the manifest-ancestor check - runs.
|
|
37
|
+
- name: Tests
|
|
38
|
+
run: >
|
|
39
|
+
pytest -q
|
|
40
|
+
--deselect tests/unit/test_generate_sbom.py::test_no_unknown_licences_for_a_real_specific_osi_classifier
|
|
41
|
+
--deselect tests/unit/test_preflight_manifest.py::test_real_tracked_sbom_matches_the_current_environment
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# Publishes on a version tag (e.g. `v0.1.1`). Uses PyPI Trusted Publishing
|
|
4
|
+
# (OIDC) - NO API token / secret is stored in the repo. One-time setup on
|
|
5
|
+
# PyPI: project -> Publishing -> add a GitHub trusted publisher for
|
|
6
|
+
# repo `kagioneko/security-knowledge-os`, workflow `publish.yml`,
|
|
7
|
+
# environment `pypi`. Until that is configured the publish JOB simply FAILS
|
|
8
|
+
# (it is not skipped) and nothing is uploaded - a failed release, never a
|
|
9
|
+
# silent or partial one.
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
tags: ["v*"]
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
# TODO: pin these actions to a full commit SHA for supply-chain safety.
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
persist-credentials: false
|
|
25
|
+
- uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
- name: Verify the tag matches the packaged version
|
|
29
|
+
run: |
|
|
30
|
+
pip install build
|
|
31
|
+
python -m build
|
|
32
|
+
tag="${GITHUB_REF_NAME#v}"
|
|
33
|
+
pkg=$(ls dist/*.whl | sed -E 's/.*-([0-9]+\.[0-9]+\.[0-9]+)-.*/\1/')
|
|
34
|
+
echo "tag=$tag packaged=$pkg"
|
|
35
|
+
test "$tag" = "$pkg"
|
|
36
|
+
- uses: actions/upload-artifact@v4
|
|
37
|
+
with:
|
|
38
|
+
name: dist
|
|
39
|
+
path: dist/
|
|
40
|
+
|
|
41
|
+
publish:
|
|
42
|
+
needs: build
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
environment: pypi
|
|
45
|
+
permissions:
|
|
46
|
+
id-token: write # OIDC token for PyPI Trusted Publishing
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/download-artifact@v4
|
|
49
|
+
with:
|
|
50
|
+
name: dist
|
|
51
|
+
path: dist/
|
|
52
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: security-knowledge-os
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Deterministic security assessment engine + knowledge retrieval + optional LLM assistance
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
7
7
|
License-File: NOTICE
|
|
8
8
|
Requires-Python: >=3.12
|
|
9
|
+
Requires-Dist: cryptography>=50.0
|
|
9
10
|
Requires-Dist: pydantic>=2.6
|
|
10
11
|
Requires-Dist: pyyaml>=6.0
|
|
11
12
|
Provides-Extra: api
|
|
@@ -25,6 +26,15 @@ Description-Content-Type: text/markdown
|
|
|
25
26
|
|
|
26
27
|
# Security Knowledge OS
|
|
27
28
|
|
|
29
|
+
[](https://pypi.org/project/security-knowledge-os/)
|
|
30
|
+
[](https://pypi.org/project/security-knowledge-os/)
|
|
31
|
+
[](LICENSE)
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install security-knowledge-os
|
|
35
|
+
skos assess your-agent.yaml # deterministic, offline by default; bundled rules/knowledge
|
|
36
|
+
```
|
|
37
|
+
|
|
28
38
|
> **Language note / 言語について**: This repository (code, docs, commit history) is
|
|
29
39
|
> **English-first by design** — it is written to be consumed by AI coding agents and
|
|
30
40
|
> cites international standards (OWASP, MITRE ATLAS, NIST) directly. The section
|
|
@@ -138,7 +148,18 @@ treated as data, never as a control instruction. Details in
|
|
|
138
148
|
| **M7 — Fixtures + Evaluation + starter KUs** | done | `knowledge/public/**` (14 KUs), `tests/fixtures/assessments/{safe,vulnerable,unknown}/`, `app/eval/metrics.py`, `scripts/evaluate.py`, JA retrieval (trigram) |
|
|
139
149
|
| **M8 — Docs + hardening** | done | Security disclaimer (AC-15–18), KU `provenance` schema, `docs/{attribution,threat-model,architecture}.md`, `sbom.json`, `scripts/{secret_scan,generate_sbom,preflight}.py` |
|
|
140
150
|
|
|
141
|
-
##
|
|
151
|
+
## Install
|
|
152
|
+
|
|
153
|
+
Requires **Python 3.12+**. From PyPI (ships the default rules / knowledge /
|
|
154
|
+
safe-test data, so `skos assess` works with no checkout):
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
pip install security-knowledge-os # engine + CLI
|
|
158
|
+
pip install "security-knowledge-os[api]" # + the local FastAPI app
|
|
159
|
+
skos assess your-agent.yaml # your-agent.yaml is an input you write
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Quickstart (M1, from a source checkout)
|
|
142
163
|
|
|
143
164
|
```bash
|
|
144
165
|
python3.12 -m venv .venv
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
# Publication Manifest — Security Knowledge OS v0.
|
|
1
|
+
# Publication Manifest — Security Knowledge OS v0.2.0
|
|
2
2
|
|
|
3
3
|
Snapshot of what the first public push contains. Generated for the pre-publication
|
|
4
4
|
review; regenerate with `git ls-files` after any change.
|
|
5
5
|
|
|
6
|
-
- Commit: `
|
|
6
|
+
- Commit: `316e8c6` (v0.2.0: Update Packs + `skos scan mcp`; PyPI 0.1.0 was `a7f463d`)
|
|
7
7
|
- History: rewritten once on 2026-09-20, before first publication, to normalise author/committer identity to the
|
|
8
8
|
GitHub no-reply address (one commit message also scrubbed of a local account name). Every commit's tree is
|
|
9
9
|
identical before and after, so the reviewed content is the published content; commit hashes cited in the
|
|
10
10
|
review records below are the **pre-rewrite** ones - see `docs/history-rewrite-map.md` for old -> new.
|
|
11
11
|
- Licence: **Apache-2.0** (`LICENSE`, `NOTICE`, `pyproject.toml`)
|
|
12
|
-
- Tracked files: **
|
|
13
|
-
- Tests: **
|
|
12
|
+
- Tracked files: **242**
|
|
13
|
+
- Tests: **943** items (942 pass, 1 skip = JA-R02)
|
|
14
14
|
- `scripts/preflight.py`: **PASS** (now also verifies the documented
|
|
15
15
|
quickstart `pip install -e` command installs every declared extra,
|
|
16
16
|
pins `constraints.txt`, AND passes `--build-constraint constraints.txt`
|
|
@@ -19,7 +19,7 @@ review; regenerate with `git ls-files` after any change.
|
|
|
19
19
|
environment, ignoring only its timestamp, without preflight itself
|
|
20
20
|
rewriting that tracked file to check it, round 11 Codex#12)
|
|
21
21
|
- Cross-AI review: Codex (code audit) + Antigravity (adversarial design
|
|
22
|
-
audit), **thirty-
|
|
22
|
+
audit), **thirty-nine rounds** (through round-39), 2026-09-11 -- 2026-09-26. Rounds 1-2
|
|
23
23
|
(2026-09-11): CHANGES-REQUIRED both times, 19 then 13 findings, all
|
|
24
24
|
fixed — see `REVIEW_CHECKLIST.md` sign-off tables. Rounds 3-6
|
|
25
25
|
(2026-09-12): CHANGES-REQUIRED each time, independent findings each
|
|
@@ -774,6 +774,30 @@ review; regenerate with `git ls-files` after any change.
|
|
|
774
774
|
pytest test run by the release gate) fixed in `4c004ab` (comment only). This is
|
|
775
775
|
the packaging change's cross-review PASS for the PyPI release.
|
|
776
776
|
|
|
777
|
+
**Round 39** (2026-09-26, post-publication: reviewed the README PyPI
|
|
778
|
+
badges/install additions and the new test CI workflow before pushing them):
|
|
779
|
+
Codex **PASS-with-nits** - no secrets, no dangerous CI settings (contents:
|
|
780
|
+
read, no pull_request_target, no secret use on untrusted PRs). Nits applied:
|
|
781
|
+
`persist-credentials: false` on checkout (+ a SHA-pin TODO), and README notes
|
|
782
|
+
Python 3.12+ and that the assessed YAML is a user-provided input.
|
|
783
|
+
|
|
784
|
+
**v0.2.0 Update Packs review** (2026-09-28, scoped to the change set
|
|
785
|
+
`master..488e0f6`: `app/packs/`, `app/pack_cli.py`, `app/adapters/mcp_config.py`,
|
|
786
|
+
`app/reviewer/{vocabulary,extensions}.py`, `docs/pack-schema.md`, plus the
|
|
787
|
+
separate data-only pack source `skos-pack-mcp`). Codex, four rounds, each
|
|
788
|
+
CHANGES-REQUIRED and fully or partly fixed: round 1 (`c14bc7f`) 16 findings
|
|
789
|
+
(4 HIGH), round 2 (`30840b5`) 8 new (3 HIGH), round 3 (`6cb990e`) 4 new
|
|
790
|
+
(1 HIGH), round 4 (`771d870`) 2 new (MEDIUM F29, LOW F30) plus a residual HIGH
|
|
791
|
+
(F25: a lost `installed.json` made a weakening update look like a first
|
|
792
|
+
install). F25/F29/F30 fixed in `2e0e99c`; that commit reviewed by
|
|
793
|
+
Antigravity: **PASS-with-nits**, the one documentation nit fixed in
|
|
794
|
+
`488e0f6`. Accepted as known limitations (recorded, not fixed): F08
|
|
795
|
+
(`npm exec` trailing options / `npm_config_registry` still inherit a known
|
|
796
|
+
package profile in `skos scan mcp`), F26 (same-version replacement drops the
|
|
797
|
+
displaced copy before the registry commit), F28 (a credential reference or
|
|
798
|
+
empty value in a URL, or a flag with no value, is reported as a literal
|
|
799
|
+
secret - a false positive).
|
|
800
|
+
|
|
777
801
|
## Tracked files by area
|
|
778
802
|
|
|
779
803
|
Per-area counts below were last verified at round 2 (commit `bcd9519`) and
|
|
@@ -783,20 +807,20 @@ check enforces (total tracked files, total tests) are kept current above.
|
|
|
783
807
|
|
|
784
808
|
| area | files | notes |
|
|
785
809
|
| --- | --- | --- |
|
|
786
|
-
| `app/` |
|
|
787
|
-
| `tests/` |
|
|
810
|
+
| `app/` | 76 (.py) | engine, models, policy, retrieval, reviewer, llm, storage, eval, cli, main, packs (Update Pack manager), adapters (MCP config scan) |
|
|
811
|
+
| `tests/` | 86 | 55 test modules + fixtures |
|
|
788
812
|
| `knowledge/` | 24 | 14 public KUs + `private/` skeleton (README + 2 `.gitkeep`) + category `.gitkeep`s |
|
|
789
813
|
| `rules/` | 13 | 7 rule YAMLs + category `.gitkeep`s |
|
|
790
814
|
| `safe_tests/` | 4 | 4 vetted templates |
|
|
791
|
-
| `scripts/` |
|
|
792
|
-
| `docs/` |
|
|
815
|
+
| `scripts/` | 13 | validators, ingest/build_index, assess, evaluate, sbom, secret_scan, preflight, cross-review runner, issue_license |
|
|
816
|
+
| `docs/` | 11 | see below |
|
|
793
817
|
| `reviews/` | 2 | `.gitignore` + `README.md` only — cross-review output `.md`/`.log` files are gitignored, never tracked |
|
|
794
818
|
| root | 11 | `README.md`, `LICENSE`, `NOTICE`, `pyproject.toml`, `.gitignore`, `.env.example`, `constraints.txt`, `sbom.json` |
|
|
795
819
|
| review docs | 3 | `REVIEW_PACKAGE.md`, `REVIEW_CHECKLIST.md`, `PUBLICATION_MANIFEST.md` |
|
|
796
820
|
|
|
797
821
|
Docs: `architecture`, `threat-model`, `safety-boundaries`, `knowledge-schema`,
|
|
798
822
|
`rule-schema`, `safe-test-schema`, `knowledge-corpus`, `attribution`,
|
|
799
|
-
`acceptance-criteria`.
|
|
823
|
+
`acceptance-criteria`, `history-rewrite-map`, `pack-schema`.
|
|
800
824
|
|
|
801
825
|
## Explicitly excluded (in `.gitignore`)
|
|
802
826
|
|
|
@@ -868,7 +892,7 @@ Safe-test templates (4): `ST-IPI-001`, `ST-MEM-001`, `ST-TOOL-001`, `ST-CRED-001
|
|
|
868
892
|
|
|
869
893
|
## Dependencies (`sbom.json`)
|
|
870
894
|
|
|
871
|
-
|
|
895
|
+
66 components — the project's actual dependency closure (Codex#9, round 7:
|
|
872
896
|
walked outward from every declared root rather than listing every
|
|
873
897
|
installed distribution, which also included `pip` and unrelated
|
|
874
898
|
environment packages; Codex#9, round 8: a package reachable only
|
|
@@ -880,7 +904,9 @@ one that is itself a *direct* pyproject.toml entry; Codex#6, round 14:
|
|
|
880
904
|
requirement, round 9's own fix, had discarded which extras a PARENT
|
|
881
905
|
requirement actually activated on its dependency, hiding this one).
|
|
882
906
|
Core install =
|
|
883
|
-
`pydantic` + `pyyaml
|
|
907
|
+
`pydantic` + `pyyaml` + (v0.2.0, Update Pack signatures) `cryptography`
|
|
908
|
+
(Apache-2.0 OR BSD-3-Clause) with its dependencies `cffi` (MIT-0) and
|
|
909
|
+
`pycparser` (BSD-3-Clause); the rest are `[api]`/`[llm]` extras or dev/test-only.
|
|
884
910
|
Zero `UNKNOWN` licences. Licences present: MIT, BSD (2/3-Clause), Apache-2.0,
|
|
885
911
|
PSF-2.0 — permissive — plus **`pathspec` and `certifi`, both under MPL-2.0**
|
|
886
912
|
(Codex finding #10, round 2, 2026-09-11, corrected round 3, 2026-09-12: an
|
|
@@ -897,7 +923,7 @@ which use Python's native `truststore` instead of `certifi`); `pathspec`
|
|
|
897
923
|
is a transitive dependency of `mypy` (**not** `ruff`, which declares no
|
|
898
924
|
dependencies of its own per installed-environment metadata) — both
|
|
899
925
|
dev/test-only or extras, never imported by, bundled with, or distributed
|
|
900
|
-
as part of `app/`'s core install. None of the
|
|
926
|
+
as part of `app/`'s core install. None of the 66 components conflict with
|
|
901
927
|
Apache-2.0 distribution of this project. Full list in `sbom.json`.
|
|
902
928
|
|
|
903
929
|
## §24 evaluation (internal fixtures — not real-world performance)
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Security Knowledge OS
|
|
2
2
|
|
|
3
|
+
[](https://pypi.org/project/security-knowledge-os/)
|
|
4
|
+
[](https://pypi.org/project/security-knowledge-os/)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install security-knowledge-os
|
|
9
|
+
skos assess your-agent.yaml # deterministic, offline by default; bundled rules/knowledge
|
|
10
|
+
```
|
|
11
|
+
|
|
3
12
|
> **Language note / 言語について**: This repository (code, docs, commit history) is
|
|
4
13
|
> **English-first by design** — it is written to be consumed by AI coding agents and
|
|
5
14
|
> cites international standards (OWASP, MITRE ATLAS, NIST) directly. The section
|
|
@@ -113,7 +122,18 @@ treated as data, never as a control instruction. Details in
|
|
|
113
122
|
| **M7 — Fixtures + Evaluation + starter KUs** | done | `knowledge/public/**` (14 KUs), `tests/fixtures/assessments/{safe,vulnerable,unknown}/`, `app/eval/metrics.py`, `scripts/evaluate.py`, JA retrieval (trigram) |
|
|
114
123
|
| **M8 — Docs + hardening** | done | Security disclaimer (AC-15–18), KU `provenance` schema, `docs/{attribution,threat-model,architecture}.md`, `sbom.json`, `scripts/{secret_scan,generate_sbom,preflight}.py` |
|
|
115
124
|
|
|
116
|
-
##
|
|
125
|
+
## Install
|
|
126
|
+
|
|
127
|
+
Requires **Python 3.12+**. From PyPI (ships the default rules / knowledge /
|
|
128
|
+
safe-test data, so `skos assess` works with no checkout):
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
pip install security-knowledge-os # engine + CLI
|
|
132
|
+
pip install "security-knowledge-os[api]" # + the local FastAPI app
|
|
133
|
+
skos assess your-agent.yaml # your-agent.yaml is an input you write
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Quickstart (M1, from a source checkout)
|
|
117
137
|
|
|
118
138
|
```bash
|
|
119
139
|
python3.12 -m venv .venv
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Adapters: derive assessment inputs from real-world configuration."""
|