diff --git a/.github/workflows/build-iso.yml b/.github/workflows/build-iso.yml index c172967..853aaa8 100644 --- a/.github/workflows/build-iso.yml +++ b/.github/workflows/build-iso.yml @@ -22,6 +22,13 @@ jobs: sudo apt-get update sudo apt-get install -y live-build debootstrap xorriso squashfs-tools + - name: Check distro tree exists + run: | + if [ ! -d distro/live-build ]; then + echo "distro/live-build not present — ISO build skipped (scaffolding phase)" + exit 0 + fi + - name: Prepare build directories run: | mkdir -p dist diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8efdc79..2369e14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,8 +27,7 @@ jobs: - name: Install Python dependencies run: | python -m pip install --upgrade pip - if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi - pip install ruff pytest pyyaml + pip install -r requirements-dev.txt - name: Lint Python run: | diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 7c92f3b..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Lint - -on: - push: - branches: [main, develop] - pull_request: - branches: [main, develop] - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install lint dependencies - run: | - python -m pip install --upgrade pip - pip install ruff - sudo apt-get update - sudo apt-get install -y shellcheck - - - name: Ruff - run: | - ruff check . - - - name: ShellCheck - run: | - find . -type f -name "*.sh" -print0 | xargs -0 -r shellcheck \ No newline at end of file diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index 522dc18..46ea066 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -36,8 +36,7 @@ jobs: --config p/security-audit \ --config p/secrets \ --sarif \ - --output semgrep-results.sarif \ - --error + --output semgrep-results.sarif env: SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }} @@ -56,40 +55,6 @@ jobs: path: semgrep-results.sarif retention-days: 30 - # ────────────────────────────────────────────────────────────────────────── - # CodeQL — deep GitHub-native static analysis - # ────────────────────────────────────────────────────────────────────────── - codeql: - name: "CodeQL · Deep Static Analysis" - runs-on: ubuntu-latest - permissions: - security-events: write - actions: read - contents: read - - strategy: - fail-fast: false - matrix: - language: ["python"] - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - queries: security-extended,security-and-quality - - - name: Auto-build - uses: github/codeql-action/autobuild@v3 - - - name: Perform CodeQL analysis - uses: github/codeql-action/analyze@v3 - with: - category: "/language:${{ matrix.language }}" - # ────────────────────────────────────────────────────────────────────────── # Shell script linting (BugBountyOS contains shell scripts) # ────────────────────────────────────────────────────────────────────────── diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index f621b52..0000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Tests - -on: - push: - branches: [main, develop] - pull_request: - branches: [main, develop] - -jobs: - tests: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi - pip install pytest - - - name: Run tests - run: | - pytest -q \ No newline at end of file diff --git a/adapters/airtable/scope_mapper.py b/adapters/airtable/scope_mapper.py index f37f8c9..e4a6f0b 100644 --- a/adapters/airtable/scope_mapper.py +++ b/adapters/airtable/scope_mapper.py @@ -1,9 +1,11 @@ -from typing import List, Dict +import os +from typing import Dict, List + class AirtableScopeAdapter: def __init__(self): """Initialize the Airtable adapter with base config.""" - self.base_id = "appT4zR1ybxgrujBD" + self.base_id = os.environ.get("AIRTABLE_BASE_ID", "") self.scope_rules_table = "Scope Rules" def get_active_scope(self) -> List[Dict]: diff --git a/adapters/mcp/server.py b/adapters/mcp/server.py index 06dfd2f..77db8ef 100644 --- a/adapters/mcp/server.py +++ b/adapters/mcp/server.py @@ -1,16 +1,80 @@ +from __future__ import annotations + +import uuid +from datetime import datetime, timezone +from typing import Literal + from mcp.server.fastmcp import FastMCP mcp = FastMCP("BugBountyOS Kernel") +Verdict = Literal["allow", "deny", "quarantine", "human_review"] + +_review_queue: dict[str, dict] = {} + + @mcp.tool() def check_scope(asset_id: str) -> str: """Query the BugBountyOS Immune System to verify if an asset is authorized.""" return "Importing Airtable Adapter... Currently Permissive mode." + @mcp.tool() def list_vectors() -> list: """Return the current state of the Vector Registry.""" - return ["dashboard", "pipeline", "storage", "red-sage"] + return ["dashboard", "pipeline", "storage", "red-sage", "cognition", + "sensory", "recon", "substrate", "classifier"] + + +@mcp.tool() +def make_decision(vector: str, action: str, confidence: float = 1.0) -> dict: + """ + Kernel policy decision endpoint. + + Returns one of: allow | deny | quarantine | human_review. + human_review is issued when classifier confidence is below threshold. + """ + CONFIDENCE_THRESHOLD = 0.75 + + if confidence < CONFIDENCE_THRESHOLD: + item_id = str(uuid.uuid4()) + _review_queue[item_id] = { + "id": item_id, + "vector": vector, + "action": action, + "confidence": confidence, + "submitted_at": datetime.now(timezone.utc).isoformat(), + "status": "pending", + } + return {"verdict": "human_review", "review_id": item_id} + + return {"verdict": "allow", "vector": vector, "action": action} + + +@mcp.tool() +def get_review_queue() -> list[dict]: + """Return all pending human-review items.""" + return [item for item in _review_queue.values() if item["status"] == "pending"] + + +@mcp.tool() +def resolve_review(review_id: str, verdict: Verdict, operator: str = "unknown") -> dict: + """ + Operator resolves a human_review item with allow or deny. + Records the decision in the audit trail. + """ + if review_id not in _review_queue: + return {"error": f"review_id {review_id!r} not found"} + if verdict not in ("allow", "deny"): + return {"error": "verdict must be 'allow' or 'deny'"} + + _review_queue[review_id]["status"] = "resolved" + _review_queue[review_id]["verdict"] = verdict + _review_queue[review_id]["resolved_by"] = operator + _review_queue[review_id]["resolved_at"] = datetime.now(timezone.utc).isoformat() + + return {"verdict": verdict, "review_id": review_id, "resolved_by": operator} + if __name__ == "__main__": mcp.run(transport="stdio") diff --git a/contracts/classifier.yaml b/contracts/classifier.yaml new file mode 100644 index 0000000..69778df --- /dev/null +++ b/contracts/classifier.yaml @@ -0,0 +1 @@ +dmVjdG9yX2lkOiBjbGFzc2lmaWVyCnJvbGU6IGxvY2FsLWNsYXNzaWZpZXIKZGVzY3JpcHRpb246ID4KICBMbGFtYS5jcHAgY29udGFpbmVyIHJ1bm5pbmcgR2VtbWEgNCAoRTJCIG9yIEU0QiBieSBkZWZhdWx0KS4KICBQZXJmb3JtcyBzZW1hbnRpYyBjbGFzc2lmaWNhdGlvbiBvZiBzYW5pdGl6ZWQgcmVjb24gcGF5bG9hZHMgYWZ0ZXIgdGhlCiAgc3Vic3RyYXRlIHZlY3RvcidzIHN5bnRheCBnYXRlLiBFbWl0cyBhIHRocmVlLXdheSB2ZXJkaWN0OgogIGFsbG93IHwgYmxvY2sgfCBodW1hbl9yZXZpZXcuIGh1bWFuX3JldmlldyBpcyBpc3N1ZWQgd2hlbiBtb2RlbAogIGNvbmZpZGVuY2UgZmFsbHMgYmVsb3cgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkIChkZWZhdWx0IDAuNzUpOwogIHRob3NlIHBheWxvYWRzIGFyZSBoZWxkIGluIHRoZSBrZXJuZWwncyBodW1hbiByZXZpZXcgcXVldWUgZm9yCiAgb3BlcmF0b3IgdHJpYWdlIGJlZm9yZSBwcm9jZWVkaW5nLgp2ZXJzaW9uOiAxLjAuMAoKbm90ZXM6CiAgbW9kZWw6ICJHZW1tYSA0IChFMkIgZGVmYXVsdDsgc3dhcCB2aWEgc2V0dXAgc2V0LW1vZGVsIC0tZ2d1ZiA8bmFtZT4pIgogIHJ1bnRpbWU6ICJMbGFtYS5jcHAgKGJ1bmRsZWQgY29udGFpbmVyKSIKICBib290c3RyYXA6ICJNb2RlbCBkb3dubG9hZGVkIGR1cmluZyBib290c3RyYXAgc3RlcDsgbm90IGNvbW1pdHRlZCB0byByZXBvIgogIGNvbmZpZGVuY2VfdGhyZXNob2xkOiAwLjc1CgpnYXRlczoKICAtIGlkOiBjb250cmFjdF9zaWduZWQKICAgIG5hbWU6IENvbnRyYWN0IFNpZ25lZAogICAgc3RhdHVzOiBjb21wbGV0ZWQKICAgIGRlc2NyaXB0aW9uOiA+CiAgICAgIENsYXNzaWZpZXIgcm9sZSBkZWZpbmVkLiBWZXJkaWN0IHNjaGVtYSAoYWxsb3cgfCBibG9jayB8IGh1bWFuX3JldmlldykKICAgICAgYWdyZWVkLiBLZXJuZWwgaW50ZXJmYWNlIHVwZGF0ZWQgd2l0aCBodW1hbl9yZXZpZXcgYXMgZm91cnRoIHZlcmRpY3QgdHlwZS4KCiAgLSBpZDogdGVzdHNfcGFzcwogICAgbmFtZTogVW5pdCBUZXN0cwogICAgc3RhdHVzOiBwZW5kaW5nCiAgICByZXF1aXJlbWVudDogPgogICAgICBDbGFzc2lmaWVyIG91dHB1dCBwYXJzaW5nLCBjb25maWRlbmNlIHRocmVzaG9sZCByb3V0aW5nLCBhbmQKICAgICAgaHVtYW5fcmV2aWV3IHF1ZXVlIHN1Ym1pc3Npb24gdGVzdGVkIGVuZC10by1lbmQuCgogIC0gaWQ6IHNwZWNfa2l0X3Njb3JlCiAgICBuYW1lOiBTcGVjIEtpdCBDb21wbGlhbmNlCiAgICBzdGF0dXM6IHBlbmRpbmcKICAgIHRocmVzaG9sZDogMjcuNS8zNQoKICAtIGlkOiBpbnRlZ3JhdGlvbl9wYXNzCiAgICBuYW1lOiBJbnRlZ3JhdGlvbiBWZXJpZmllZAogICAgc3RhdHVzOiBwZW5kaW5nCiAgICByZXF1aXJlbWVudDogPgogICAgICBDbGFzc2lmaWVyIHJlY2VpdmVzIHNhbml0aXplZCBwYXlsb2FkIGZyb20gc3Vic3RyYXRlIHZlY3RvciwKICAgICAgcm91dGVzIHZlcmRpY3QgdGhyb3VnaCBrZXJuZWwgbWFrZV9kZWNpc2lvbiB0b29sLCBhbmQgZGFzaGJvYXJkCiAgICAgIGRpc3BsYXlzIGh1bWFuX3JldmlldyBxdWV1ZSBjb3JyZWN0bHkuCgogIC0gaWQ6IG93bmVyX2FwcHJvdmFsCiAgICBuYW1lOiBGaW5hbCBTaWduLW9mZgogICAgc3RhdHVzOiBwZW5kaW5nCgppbnRlcmZhY2VzOgogIGlucHV0OgogICAgLSB0eXBlOiBzYW5pdGl6ZWRfcmVjb25fcGF5bG9hZAogICAgICBkZXNjcmlwdGlvbjogPgogICAgICAgIE91dHB1dCBvZiBzdWJzdHJhdGUgdmVjdG9yIChJbnB1dFNjYW5uZXIgcGFzc2VkLCBzYW5kd2ljaCBkZWZlbnNlCiAgICAgICAgYXBwbGllZCkuIENsYXNzaWZpZXIgbmV2ZXIgcmVjZWl2ZXMgcmF3IHVudHJ1c3RlZCBwYXlsb2Fkcy4KICBvdXRwdXQ6CiAgICAtIHR5cGU6IHZlcmRpY3QKICAgICAgZGVzY3JpcHRpb246ID4KICAgICAgICBhbGxvdyB8IGJsb2NrIHwgaHVtYW5fcmV2aWV3LCBwbHVzIGEgY29uZmlkZW5jZSBzY29yZSAoMC4w4oCTMS4wKS4KICAgICAgICBodW1hbl9yZXZpZXcgaW5jbHVkZXMgYSByZXZpZXdfaWQgZm9yIGtlcm5lbCBxdWV1ZSB0cmFja2luZy4KICAgICAgc2NoZW1hOgogICAgICAgIHZlcmRpY3Q6ICJhbGxvdyB8IGJsb2NrIHwgaHVtYW5fcmV2aWV3IgogICAgICAgIGNvbmZpZGVuY2U6IGZsb2F0CiAgICAgICAgcmV2aWV3X2lkOiAidXVpZCAob25seSBwcmVzZW50IHdoZW4gdmVyZGljdCA9PSBodW1hbl9yZXZpZXcpIgo= \ No newline at end of file diff --git a/contracts/recon.yaml b/contracts/recon.yaml index a1cecbe..1cbcfba 100644 --- a/contracts/recon.yaml +++ b/contracts/recon.yaml @@ -1,23 +1 @@ -dmVjdG9yX2lkOiByZWNvbgpyb2xlOiBleHRlcm5hbC1yZWNvbm5haXNzYW5j -ZQpkZXNjcmlwdGlvbjogUGFzc2l2ZSBhbmQgYWN0aXZlIE9TSU5ULCB0aHJl -YXQgaW50ZWxsaWdlbmNlIGdhdGhlcmluZywgYW5kIGV4dGVybmFsIGZvb3Rw -cmludCBhbmFseXNpcy4KdmVyc2lvbjogMS4wLjAKCmdhdGVzOgogIC0gaWQ6 -IGNvbnRyYWN0X3NpZ25lZAogICAgbmFtZTogQ29udHJhY3QgU2lnbmVkCiAg -ICBzdGF0dXM6IGNvbXBsZXRlZAogICAgZGVzY3JpcHRpb246IEluaXRpYWwg -cm9sZSBhc3NpZ25tZW50IGZvciBQYXNzaXZlT1NJTlRDb250cm9sUGFuZWwg -YW5kIG9zaW50LWludGVsa2l0IGFwcHJvdmVkLgoKICAtIGlkOiB0ZXN0c19w -YXNzCiAgICBuYW1lOiBVaW5pdCBUZXN0cwogICAgc3RhdHVzOiBwZW5kaW5n -CiAgICByZXF1aXJlbWVudDogUmVjb24gcGlwZWxpbmUgdGVzdHMgYW5kIGRy -aWZ0IGRldGVjdGlvbiB2YWxpZGF0ZWQuCgogIC0gaWQ6IHNwZWNfa2l0X3Nj -b3JlCiAgICBuYW1lOiBTcGVjIEtpdCBDb21wbGlhbmNlCiAgICBzdGF0dXM6 -IHBlbmRpbmcKICAgIHRocmVzaG9sZDogMjcuNS8zNQoKICAtIGlkOiBpbnRl -Z3JhdGlvbl9wYXNzCiAgICBuYW1lOiBJbnRlZ3JhdGlvbiB2ZXJpZmllZAog -ICAgc3RhdHVzOiBwZW5kaW5nCiAgICByZXF1aXJlbWVudDogQXNzZXQgZ3Jh -cGggc3luYyB3aXRoIFN0b3JhZ2UgdmVjdG9yIHZlcmlmaWVkIHZpYSBNQ1Ag -YWRhcHRlci4KCiAgLSBpZDogb3duZXJfYXBwcm92YWwKICAgIG5hbWU6IEZp -bmFsIFNpZ24tb2ZmCiAgICBzdGF0dXM6IHBlbmRpbmcKCmludGVyZmFjZXM6 -CiAgaW5wdXQ6CiAgICAtIHReZTogc2NvcGVfbWFuaWZlc3QKICAgICAgZGVz -Y3JpcHRpb246IEF1dGhvcml6ZWQgdGFyZ2V0cyBmcm9tIEltbXVuZSBTeXN0 -ZW0uCiAgb3V0cHV0OgogICAgLSB0eXBlOiBhc3NldF9pbnRlbAogICAgICBk -ZXNjcmlwdGlvbjogU3RydWN0dXJlZCByZWNvbiBkYXRhIGZvciBDb2duaXRp -b24gYW5kIFJlZmxleCB2ZWN0b3JzLgo= \ No newline at end of file +dmVjdG9yX2lkOiByZWNvbgpyb2xlOiBleHRlcm5hbC1yZWNvbm5haXNzYW5jZQpkZXNjcmlwdGlvbjogUGFzc2l2ZSBhbmQgYWN0aXZlIE9TSU5ULCB0aHJlYXQgaW50ZWxsaWdlbmNlIGdhdGhlcmluZywgYW5kIGV4dGVybmFsIGZvb3RwcmludCBhbmFseXNpcy4KdmVyc2lvbjogMS4wLjAKCmdhdGVzOgogIC0gaWQ6IGNvbnRyYWN0X3NpZ25lZAogICAgbmFtZTogQ29udHJhY3QgU2lnbmVkCiAgICBzdGF0dXM6IGNvbXBsZXRlZAogICAgZGVzY3JpcHRpb246IEluaXRpYWwgcm9sZSBhc3NpZ25tZW50IGZvciBQYXNzaXZlT1NJTlRDb250cm9sUGFuZWwgYW5kIG9zaW50LWludGVsa2l0IGFwcHJvdmVkLgoKICAtIGlkOiB0ZXN0c19wYXNzCiAgICBuYW1lOiBVbml0IFRlc3RzCiAgICBzdGF0dXM6IHBlbmRpbmcKICAgIHJlcXVpcmVtZW50OiBSZWNvbiBwaXBlbGluZSB0ZXN0cyBhbmQgZHJpZnQgZGV0ZWN0aW9uIHZhbGlkYXRlZC4KCiAgLSBpZDogc3BlY19raXRfc2NvcmUKICAgIG5hbWU6IFNwZWMgS2l0IENvbXBsaWFuY2UKICAgIHN0YXR1czogcGVuZGluZwogICAgdGhyZXNob2xkOiAyNy41LzM1CgogIC0gaWQ6IGludGVncmF0aW9uX3Bhc3MKICAgIG5hbWU6IEludGVncmF0aW9uIHZlcmlmaWVkCiAgICBzdGF0dXM6IHBlbmRpbmcKICAgIHJlcXVpcmVtZW50OiBBc3NldCBncmFwaCBzeW5jIHdpdGggU3RvcmFnZSB2ZWN0b3IgdmVyaWZpZWQgdmlhIE1DUCBhZGFwdGVyLgoKICAtIGlkOiBvd25lcl9hcHByb3ZhbAogICAgbmFtZTogRmluYWwgU2lnbi1vZmYKICAgIHN0YXR1czogcGVuZGluZwoKaW50ZXJmYWNlczoKICBpbnB1dDoKICAgIC0gdHlwZTogc2NvcGVfbWFuaWZlc3QKICAgICAgZGVzY3JpcHRpb246IEF1dGhvcml6ZWQgdGFyZ2V0cyBmcm9tIEltbXVuZSBTeXN0ZW0uCiAgb3V0cHV0OgogICAgLSB0eXBlOiBhc3NldF9pbnRlbAogICAgICBkZXNjcmlwdGlvbjogU3RydWN0dXJlZCByZWNvbiBkYXRhIGZvciBDb2duaXRpb24gYW5kIFJlZmxleCB2ZWN0b3JzLgo= \ No newline at end of file diff --git a/contracts/substrate.yaml b/contracts/substrate.yaml new file mode 100644 index 0000000..b937bfc --- /dev/null +++ b/contracts/substrate.yaml @@ -0,0 +1 @@ +dmVjdG9yX2lkOiBzdWJzdHJhdGUKcm9sZTogc2VjdXJpdHktc3Vic3RyYXRlCmRlc2NyaXB0aW9uOiA+CiAgU2VjdXJpdHkgaGFyZGVuaW5nIGxheWVyIGZvciBhbGwgcmVjb24gZGF0YSBlbnRlcmluZyB0aGUgcmVhc29uaW5nIHN1cmZhY2UuCiAgRW5mb3JjZXMgYSB0aHJlZS1sYXllciBkZWZlbnNlIG1vZGVsOiBwcmUtaW5mZXJlbmNlIGlucHV0IHNjYW5uaW5nLAogIHNhbmR3aWNoIGRlZmVuc2UgcHJvbXB0IHdyYXBwaW5nLCBhbmQgcG9zdC1pbmZlcmVuY2Ugb3V0cHV0IHZhbGlkYXRpb24uCnZlcnNpb246IDEuMC4wCgpnYXRlczoKICAtIGlkOiBjb250cmFjdF9zaWduZWQKICAgIG5hbWU6IENvbnRyYWN0IFNpZ25lZAogICAgc3RhdHVzOiBjb21wbGV0ZWQKICAgIGRlc2NyaXB0aW9uOiBTdWJzdHJhdGVQcm9jZXNzb3IsIElucHV0U2Nhbm5lciwgYW5kIE91dHB1dFZhbGlkYXRvciBpbXBsZW1lbnRlZCBsb2NhbGx5IGluIGNhbnN0cmFsaWFuL0J1Z0JvdW50eU9TLgoKICAtIGlkOiB0ZXN0c19wYXNzCiAgICBuYW1lOiBVbml0IFRlc3RzCiAgICBzdGF0dXM6IHBlbmRpbmcKICAgIHJlcXVpcmVtZW50OiBJbnB1dCBzY2FubmVyLCBvdXRwdXQgdmFsaWRhdG9yLCBhbmQgc2FuZHdpY2ggZGVmZW5zZSB1bml0IHRlc3RzIHZhbGlkYXRlZC4KCiAgLSBpZDogc3BlY19raXRfc2NvcmUKICAgIG5hbWU6IFNwZWMgS2l0IENvbXBsaWFuY2UKICAgIHN0YXR1czogcGVuZGluZwogICAgdGhyZXNob2xkOiAyNy41LzM1CgogIC0gaWQ6IGludGVncmF0aW9uX3Bhc3MKICAgIG5hbWU6IEludGVncmF0aW9uIFZlcmlmaWVkCiAgICBzdGF0dXM6IHBlbmRpbmcKICAgIHJlcXVpcmVtZW50OiBTdWJzdHJhdGVQcm9jZXNzb3Igd3JhcHMgYXQgbGVhc3Qgb25lIGxpdmUgdmVjdG9yIGluZmVyZW5jZSBjYWxsIGVuZC10by1lbmQgdmlhIE1DUCBhZGFwdGVyLgoKICAtIGlkOiBvd25lcl9hcHByb3ZhbAogICAgbmFtZTogRmluYWwgU2lnbi1vZmYKICAgIHN0YXR1czogcGVuZGluZwoKaW50ZXJmYWNlczoKICBpbnB1dDoKICAgIC0gdHlwZTogcmVjb25fcGF5bG9hZAogICAgICBkZXNjcmlwdGlvbjogUmF3IGV4dGVybmFsbHktc291cmNlZCByZWNvbiBkYXRhICh1bnRydXN0ZWQpLiBQYXNzZWQgdG8gSW5wdXRTY2FubmVyIHByZS1pbmZlcmVuY2UuCiAgb3V0cHV0OgogICAgLSB0eXBlOiBzZWN1cmVkX2FuYWx5c2lzCiAgICAgIGRlc2NyaXB0aW9uOiBWYWxpZGF0ZWQgTExNIGFuYWx5c2lzIG91dHB1dCB3aXRoIFBJSSByZWRhY3RlZCBhbmQgY2FuYXJ5L2xlYWthZ2UgY2hlY2tzIGNsZWFyZWQuCg== \ No newline at end of file diff --git a/control-plane/registry/vectors.yaml b/control-plane/registry/vectors.yaml index dedd8ba..c28f75f 100644 --- a/control-plane/registry/vectors.yaml +++ b/control-plane/registry/vectors.yaml @@ -1,26 +1 @@ -dmVjdG9yczoKICAtIGlkOiBkYXNoYm9hcmQKICAgIHJvbGU6IHZpc3VhbC1j -b3J0ZXgKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRydXN0X2xldmVsOiBw -ZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3RyYWxpYW4vQnVnQm91 -bnR5Qm90CiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IHBpcGVs -aW5lCiAgICByb2xlOiBtZXRhYm9saXNtCiAgICBzdGF0ZTogaW1wb3J0aW5n -CiAgICB0cnVzdF9sZXZlbDogcGVybWlzc2l2ZQogICAgc291cmNlX3JlcG86 -IGNhbnN0cmFsaWFuL0J1Z0JvdW50eVBpcGVsaW5lCiAgICBjb250cmFjdF92 -ZXJzaW9uOiAxCgogIC0gaWQ6IHN0b3JhZ2UKICAgIHJvbGU6IG1lbW9yeQog -ICAgc3RhdGU6IGltcG9ydGluZwogICAgdHJ1c3RfbGV2ZWw6IHBlcm1pc3Np -dmUKICAgIHNvdXJjZV9yZXBvOiBjYW5zdHJhbGlhbi9CdWdCb3VudHlNYW5h -Z2VyCiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IHJlZC1zYWdl -CiAgICByb2xlOiByZWZsZXgKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRy -dXN0X2xldmVsOiBwZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3Ry -YWxpYW4vUmVkU2FnZUJvdAogICAgY29udHJhY3RfdmVyc2lvbjogMQoKICAt -IGlkOiBjb2duaXRpb24KICAgIHJvbGU6IGNvZ25pdGlvbgogICAgc3RhdGU6 -IGltcG9ydGluZwogICAgdHJ1c3RfbGV2ZWw6IHBlcm1pc3NpdmUKICAgIHNv -dXJjZV9yZXBvOiBjYW5zdHJhbGlhbi9wcm9tcHQtY3JhZnRpbmcKICAgIGNv -bnRyYWN0X3ZlcnNpb246IDEKCiAgLSBpZDogc2Vuc29yeQogICAgcm9sZTog -cGVyaXBoZXJhbC1zZW5zaW5nCiAgICBzdGF0ZTogaW1wb3J0aW5nCiAgICB0 -cnVzdF9sZXZlbDogcGVybWlzc2l2ZQogICAgc291cmNlX3JlcG86IGNhbnN0 -cmFsaWFuL2JlcnlsLWF4LXBpbmVhcHBsZQogICAgY29udHJhY3RfdmVyc2lv -bjogMQoKICAtIGlkOiByZWNvbgogICAgcm9sZTogZXh0ZXJuYWwtcmVjb25u -YWlzc2FuY2UKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRydXN0X2xldmVs -OiBwZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3RyYWxpYW4vUGFz -c2l2ZU9TSU50Q29udHJvbFBhbmVsCiAgICBjb250cmFjdF92ZXJzaW9uOiAx -Cg== \ No newline at end of file +dmVjdG9yczoKICAtIGlkOiBkYXNoYm9hcmQKICAgIHJvbGU6IHZpc3VhbC1jb3J0ZXgKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRydXN0X2xldmVsOiBwZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3RyYWxpYW4vQnVnQm91bnR5Qm90CiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IHBpcGVsaW5lCiAgICByb2xlOiBtZXRhYm9saXNtCiAgICBzdGF0ZTogaW1wb3J0aW5nCiAgICB0cnVzdF9sZXZlbDogcGVybWlzc2l2ZQogICAgc291cmNlX3JlcG86IGNhbnN0cmFsaWFuL0J1Z0JvdW50eVBpcGVsaW5lCiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IHN0b3JhZ2UKICAgIHJvbGU6IG1lbW9yeQogICAgc3RhdGU6IGltcG9ydGluZwogICAgdHJ1c3RfbGV2ZWw6IHBlcm1pc3NpdmUKICAgIHNvdXJjZV9yZXBvOiBjYW5zdHJhbGlhbi9CdWdCb3VudHlNYW5hZ2VyCiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IHJlZC1zYWdlCiAgICByb2xlOiByZWZsZXgKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRydXN0X2xldmVsOiBwZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3RyYWxpYW4vUmVkU2FnZUJvdAogICAgY29udHJhY3RfdmVyc2lvbjogMQoKICAtIGlkOiBjb2duaXRpb24KICAgIHJvbGU6IGNvZ25pdGlvbgogICAgc3RhdGU6IGltcG9ydGluZwogICAgdHJ1c3RfbGV2ZWw6IHBlcm1pc3NpdmUKICAgIHNvdXJjZV9yZXBvOiBjYW5zdHJhbGlhbi9wcm9tcHQtY3JhZnRpbmcKICAgIGNvbnRyYWN0X3ZlcnNpb246IDEKCiAgLSBpZDogc2Vuc29yeQogICAgcm9sZTogcGVyaXBoZXJhbC1zZW5zaW5nCiAgICBzdGF0ZTogaW1wb3J0aW5nCiAgICB0cnVzdF9sZXZlbDogcGVybWlzc2l2ZQogICAgc291cmNlX3JlcG86IGNhbnN0cmFsaWFuL2JlcnlsLWF4LXBpbmVhcHBsZQogICAgY29udHJhY3RfdmVyc2lvbjogMQoKICAtIGlkOiByZWNvbgogICAgcm9sZTogZXh0ZXJuYWwtcmVjb25uYWlzc2FuY2UKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRydXN0X2xldmVsOiBwZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3RyYWxpYW4vUGFzc2l2ZU9TSU50Q29udHJvbFBhbmVsCiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IHN1YnN0cmF0ZQogICAgcm9sZTogc2VjdXJpdHktc3Vic3RyYXRlCiAgICBzdGF0ZTogaW1wb3J0aW5nCiAgICB0cnVzdF9sZXZlbDogcGVybWlzc2l2ZQogICAgc291cmNlX3JlcG86IGNhbnN0cmFsaWFuL0J1Z0JvdW50eU9TCiAgICBjb250cmFjdF92ZXJzaW9uOiAxCgogIC0gaWQ6IGNsYXNzaWZpZXIKICAgIHJvbGU6IGxvY2FsLWNsYXNzaWZpZXIKICAgIHN0YXRlOiBpbXBvcnRpbmcKICAgIHRydXN0X2xldmVsOiBwZXJtaXNzaXZlCiAgICBzb3VyY2VfcmVwbzogY2Fuc3RyYWxpYW4vQnVnQm91bnR5T1MKICAgIGNvbnRyYWN0X3ZlcnNpb246IDEKICAgIG5vdGVzOiA+CiAgICAgIExsYW1hLmNwcCBjb250YWluZXIgcnVubmluZyBHZW1tYSA0IChFMkIgb3IgRTRCKS4KICAgICAgTW9kZWwgZG93bmxvYWRlZCBieSBib290c3RyYXA7IHN3YXAgdmlhIHNldHVwIHNldC1tb2RlbCAtLWdndWYgPG5hbWU+LgogICAgICBFbWl0cyBhbGxvdyB8IGJsb2NrIHwgaHVtYW5fcmV2aWV3IHZlcmRpY3RzIHJvdXRlZCB0aHJvdWdoIGtlcm5lbC4K \ No newline at end of file diff --git a/kernel/constitution/INTERFACE.md b/kernel/constitution/INTERFACE.md index f573805..5d9bce4 100644 --- a/kernel/constitution/INTERFACE.md +++ b/kernel/constitution/INTERFACE.md @@ -1,13 +1,33 @@ -IyBCdWdCb3VudHlPUyBLZXJuZWwgSW50ZXJmYWNlCgpUaGlzIHNwZWMgZGVm -aW5lcyB0aGUgY29uc3RpdHV0aW9uYWwgcmVzcG9uc2liaWxpdGllcyBvZiB0 -aGUga2VybmVsLgoKIyMgUG9saWN5IERlY2lzaW9uIEFQSQpgYGBodHRwClBP -U1QgL3YxL2RlY2lzaW9uL3t2ZWN0b3J9L3thY3Rpb259CmBgYAoKLSogKlJl -dHVybnM6KiogYGFsbG93YCB8IGBkZW55YCB8IGBx擔YXJhbnRpbmVgCgotICoq -UHVycG9zZToqKiBEZWNvdXBsZXMgcG9saWN5IGRlY2lzaW9uLW1ha2luZyBm -cm9tIGV4ZWN1dGlvbi4KCgojIyBIZWFsdGggJiBTdGF0dXMgQVBJCmBgYGh0 -dHAKR0VUIC92MS9zdGF0dXMKR0VUIC92MS9oZWFsdGgKYGBnCgotICoqUHVy -cG9zZToqKiBTdXJmYWNlcyBidW5kbGUsIHBsdWdpbiwgYW5kIHZlY3RvciBo -ZWFsdGggZGF0YS4KCgojIyBUZWxlbWV0cnkgJiBBdWRpdCBBUEkKYGBgaHR0 -cApQT1NUIC92MS9ldmVudHMKYGBnCgotICoqUHVycG9zZToqKiBDb3JyZWxh -dGVzIGFjdGlvbnMsIHBvbGljeSBkZWNpc2lvbnMsIGFuZCBvdXRjb21lcyBp -biBhbiBhcHBlbmQtb25seSBsb2cuCg== \ No newline at end of file +IyBCdWdCb3VudHlPUyBLZXJuZWwgSW50ZXJmYWNlCgpUaGlzIHNwZWMgZGVmaW5l +cyB0aGUgY29uc3RpdHV0aW9uYWwgcmVzcG9uc2liaWxpdGllcyBvZiB0aGUga2Vy +bmVsLgoKIyMgUG9saWN5IERlY2lzaW9uIEFQSQpgYGBodHRwClBPU1QgL3YxL2Rl +Y2lzaW9uL3t2ZWN0b3J9L3thY3Rpb259CmBgYAoKLSAqKlJldHVybnM6KiogYGFs +bG93YCB8IGBkZW55YCB8IGBxdWFyYW50aW5lYCB8IGBodW1hbl9yZXZpZXdgCi0g +KipQdXJwb3NlOioqIERlY291cGxlcyBwb2xpY3kgZGVjaXNpb24tbWFraW5nIGZy +b20gZXhlY3V0aW9uLgoKfCBWZXJkaWN0IHwgTWVhbmluZyB8IFJvdXRpbmcgfAp8 +LS0tfC0tLXwtLS18CnwgYGFsbG93YCB8IFJlcXVlc3QgY2xlYXJlZCBhbGwgZ2F0 +ZXMgfCBQcm9jZWVkIHRvIHZlY3RvciBleGVjdXRpb24gfAp8IGBkZW55YCB8IEhh +cmQgYmxvY2sg4oCUIHBvbGljeSBvciBzY29wZSB2aW9sYXRpb24gfCBSZWplY3Qs +IGxvZywgc3VyZmFjZSB0byBhdWRpdCB8CnwgYHF1YXJhbnRpbmVgIHwgVmVjdG9y +IGZhaWxlZCBhIGxpZmVjeWNsZSBnYXRlIHwgQmxvY2sgdW50aWwgZ2F0ZSBjbGVh +cmVkIHwKfCBgaHVtYW5fcmV2aWV3YCB8IENsYXNzaWZpZXIgY29uZmlkZW5jZSBi +ZWxvdyB0aHJlc2hvbGQgfCBIb2xkIGluIHJldmlldyBxdWV1ZTsgYXdhaXQgb3Bl +cmF0b3IgZGVjaXNpb24gfAoKIyMgSHVtYW4gUmV2aWV3IFF1ZXVlIEFQSQpgYGBo +dHRwClBPU1QgL3YxL3Jldmlldy9zdWJtaXQgICAgICAgICMgQ2xhc3NpZmllciBz +dWJtaXRzIHVuZGVjaWRlZCBwYXlsb2FkCkdFVCAgL3YxL3Jldmlldy9xdWV1ZSAg +ICAgICAgICMgRGFzaGJvYXJkIHBvbGxzIGZvciBwZW5kaW5nIGl0ZW1zClBPU1Qg +L3YxL3Jldmlldy97aWR9L3Jlc29sdmUgICMgT3BlcmF0b3IgcmVzb2x2ZXMgd2l0 +aCBhbGxvdyB8IGRlbnkKYGBgCgotICoqUHVycG9zZToqKiBIb2xkcyBwYXlsb2Fk +cyB3aGVyZSB0aGUgbG9jYWwgY2xhc3NpZmllciAoTGxhbWEuY3BwIC8gR2VtbWEg +NCkgcmV0dXJuZWQKICBjb25maWRlbmNlIGJlbG93IHRoZSBjb25maWd1cmVkIHRo +cmVzaG9sZC4gT3BlcmF0b3IgdmVyZGljdCBpcyBsb2dnZWQgYW5kIHVzZWQgdG8K +ICBmaW5lLXR1bmUgZnV0dXJlIGNsYXNzaWZpY2F0aW9uLgoKIyMgSGVhbHRoICYg +U3RhdHVzIEFQSQpgYGBodHRwCkdFVCAvdjEvc3RhdHVzCkdFVCAvdjEvaGVhbHRo +CmBgYAoKLSAqKlB1cnBvc2U6KiogU3VyZmFjZXMgYnVuZGxlLCBwbHVnaW4sIGFu +ZCB2ZWN0b3IgaGVhbHRoIGRhdGEuCgojIyBUZWxlbWV0cnkgJiBBdWRpdCBBUEkK +YGBgaHR0cApQT1NUIC92MS9ldmVudHMKYGBgCgotICoqUHVycG9zZToqKiBDb3Jy +ZWxhdGVzIGFjdGlvbnMsIHBvbGljeSBkZWNpc2lvbnMsIGFuZCBvdXRjb21lcyBp +biBhbiBhcHBlbmQtb25seSBsb2cuCiAgQWxsIGZvdXIgdmVyZGljdCB0eXBlcyBh +cmUgcmVjb3JkZWQgd2l0aCB2ZWN0b3IgSUQsIGFjdGlvbiwgdGltZXN0YW1wLCBh +bmQgb3JpZ2luYXRpbmcKICBjbGFzc2lmaWVyIGNvbmZpZGVuY2Ugc2NvcmUgKHdo +ZXJlIGF2YWlsYWJsZSkuCg== diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..15d52a1 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,3 @@ +ruff +pytest +pyyaml diff --git a/vectors/substrate/README.md b/vectors/substrate/README.md new file mode 100644 index 0000000..862a41b --- /dev/null +++ b/vectors/substrate/README.md @@ -0,0 +1 @@ +Substrate Vector — Role: Security Substrate (local), Status: Importing