{
  "schema": "varexis-public-evidence-record/0.3",
  "generated_at_utc": "2026-10-16T07:59:18.009Z",
  "record_id": "VXI-EXT-PROCUREMENT-GITHUB-KEYS-01-v1",
  "record_kind": "external_reference",
  "title": "GitHub App keys: Rotation requires retiring the old signer",
  "system": "GitHub Apps",
  "evidence_family": "vendor_evidence_review",
  "index_status": "PUBLIC_SAFE_SOURCE_REVIEW",
  "evidence_state": "PRIMARY_DOCUMENTATION_REVIEW_ONLY",
  "canonical_question": "Does generating a new GitHub App private key automatically retire the old one?",
  "near_questions": [
    "Can a GitHub App have multiple valid private keys?",
    "Do private keys expire automatically?",
    "Does adding a key revoke the old one?",
    "Which consumers have switched signers?",
    "Can the last key be deleted without a replacement?",
    "What evidence identifies a key without exposing it?",
    "Who can manage app keys?",
    "Is private-key retirement the same as installation-token expiry?",
    "Where is the old signer still configured?",
    "What confirms the revoked key is no longer used?",
    "When should an agent leave rotation incomplete?",
    "Can I save the key-lifecycle review?"
  ],
  "supported_claims": [
    {
      "claim": "The guide supports multiple concurrent private keys for rotation and states that keys do not expire automatically. A new key therefore does not establish that the old signer is revoked. Inventory, consumer handoff and explicit old-key removal need evidence separate from successful generation.",
      "reliance": "DOCUMENTED_CAPABILITY_ONLY"
    }
  ],
  "not_demonstrated_claims": [
    "Verified buyer configuration or effective access rights",
    "Independent execution, completeness or security testing",
    "Vendor certification, legal compliance or guaranteed suitability"
  ],
  "public_summary": "The guide supports multiple concurrent private keys for rotation and states that keys do not expire automatically. A new key therefore does not establish that the old signer is revoked. Inventory, consumer handoff and explicit old-key removal need evidence separate from successful generation.",
  "related_record_ids": [],
  "source_review": {
    "source_type": "official_external_documentation",
    "source_title": "GitHub App private-key management",
    "source_url": "https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps",
    "checked_on": "2026-10-16",
    "candidate_record_id": "VXI-EXT-PROCUREMENT-GITHUB-KEYS-01-v1",
    "candidate_record_sha256": "465f33a13626e68fffc0fcaf138650ba95f09abd80955b437876c304620ee64e",
    "method": "Primary documentation reviewed for the published bounded statement.",
    "deployment_tested_by_varexis": false,
    "revalidation": "The delivered snapshot preserves the review date shown. Recheck current primary documentation and deployment context before relying on present applicability; payment does not trigger fresh research."
  },
  "answer_policy": {
    "classification": "DOCUMENTED_WITH_DEPLOYMENT_BOUNDARY",
    "bounded_answer": "The guide supports multiple concurrent private keys for rotation and states that keys do not expire automatically. A new key therefore does not establish that the old signer is revoked. Inventory, consumer handoff and explicit old-key removal need evidence separate from successful generation.",
    "required_buyer_context": "Key inventory, consumers, storage and explicit retirement. Effective buyer configuration and dated operational evidence are required.",
    "missing_evidence": "A broader claim needs evidence matching the intended use. Payment does not upgrade the evidence state."
  },
  "private_boundary": "Raw logs, thresholds, private paths, source code, protected mechanisms and reconstruction-level details are excluded from public and paid delivery.",
  "decision_profile": {
    "schema": "varexis-vendor-evidence-review/1",
    "review_status": "documentation_review_only",
    "checked_on": "2026-10-16",
    "claim_to_check": "Generating a replacement key completes key retirement.",
    "documented_statement": {
      "status": "documented",
      "statement": "The guide supports multiple concurrent private keys for rotation and states that keys do not expire automatically. A new key therefore does not establish that the old signer is revoked. Inventory, consumer handoff and explicit old-key removal need evidence separate from successful generation.",
      "source_ids": [
        "github-privatekeys"
      ]
    },
    "buyer_evidence_required": [
      "Current key inventory without secret values.",
      "Consumer migration evidence.",
      "Old-key deletion/revocation record."
    ],
    "review_condition": {
      "status": "varexis_review_policy",
      "statement": "Require retirement evidence before declaring rotation complete."
    },
    "unknowns": "The buyer configuration, contract, effective entitlement and operational evidence have not been inspected. Missing evidence does not establish absence or failure of the feature.",
    "evidence_sources": [
      {
        "source_id": "github-privatekeys",
        "url": "https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps",
        "final_url": "https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps",
        "title": "GitHub App private-key management",
        "checked_on": "2026-10-16",
        "sha256": "7080848d7a62011d806d1365604185cc34a6026835653d5aefa12005fdf175bf",
        "bytes": 205082
      }
    ],
    "observed_deployment": false,
    "commercial_reliance_boundary": "Procurement evidence support only; no supplier clearance, legal conclusion, configuration audit or verification of the buyer's claim is supplied.",
    "paid_value": {
      "decision_context": "Preserve the migration and retirement evidence for application signing credentials.",
      "free": "Complete review, practical questions, sources and limitations; may be saved locally.",
      "single_request": "Existing server-saved version-bound route snapshot for later authenticated retrieval.",
      "evidence_receipt": "The same snapshot plus the existing unsigned delivery receipt.",
      "excluded": [
        "Fresh vendor research",
        "Continuous monitoring or change alerts",
        "Testing the buyer configuration",
        "Private evidence or vendor certification"
      ],
      "integrity": "Hashes identify content versions; they do not prove truth or provide a signature."
    },
    "revalidation": {
      "trigger": "A saved purchase does not recheck the source or buyer configuration.",
      "specific_watch": "Key inventory, consumers, storage and explicit retirement"
    }
  },
  "paid_access_note": "The full published answer and boundaries are free. Paid access saves the selected route and source versions, with an unsigned receipt when purchased. Preview coverage before paying. Fresh research, bespoke assessment and protected evidence are excluded.",
  "service_route": {
    "request_guide": "/varexis-index/request.html",
    "request_workflow": "/varexis-index/request-workflow.json",
    "service_id": "single_request",
    "service_routes_url": "/varexis-index/service-routes.json",
    "payment_required": true,
    "availability_endpoint": "/api/index/capabilities",
    "operational_status": "AUTOMATIC_SERVICE_CAPABILITIES_GATED",
    "checkout_url": "/index-access"
  },
  "authority_boundary": "VAREXIS-INDEX informs evidence reliance. It does not provide advice, certification, deployment authority, security assurance, production approval, or guarantee.",
  "human_page": "/varexis-index/catalog.html#github-app-private-key-rotation-lifecycle",
  "machine_readable_record": "/varexis-index/records/github-app-private-key-rotation-lifecycle.json"
}
