diff --git a/runtime/history/SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN.json b/runtime/history/SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN.json new file mode 100644 index 00000000..2caf0726 --- /dev/null +++ b/runtime/history/SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "signalbot-cr0116-seal-generation-rca", + "started_at_utc": "2026-09-08T07:40:38Z", + "finished_at_utc": "2026-09-08T07:40:40Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "b8040335cd6ee0ee0382570ca5ecd189293d21953c5509bd1711312a80a2d622", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 0, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c", + "sanitized_output_sha256": "099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "ERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nSB043G_PRESTATE={\"active_env\":{\"APP_IMAGE\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"CODE_IDENTITY\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"COLLECTION_START_AT\":\"2026-09-07T00:00:00+00:00\",\"EXPERIMENT_ID\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"RUNTIME_MANIFEST_ID\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"new_image_id\":\"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99\",\"services\":[{\"container_id\":\"a546a70c3e8c263d9b590cd78ee206bcda0cfcdb6662327e8415ca0e29ad1501\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":14,\"running\":true,\"service\":\"collector\",\"started_at\":\"2026-09-08T07:38:09.79483772Z\"},{\"container_id\":\"d8023f4cbf91f9382e39eec0436c9cebc7665535b42b950e95408c03ff9bf30d\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":0,\"running\":true,\"service\":\"relay\",\"started_at\":\"2026-09-06T18:48:20.603414848Z\"},{\"container_id\":\"1feeca2d9428cd5a277c026bef34534db307657dcdcd63aff98ea66e44f8b9c5\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":0,\"running\":true,\"service\":\"shadow\",\"started_at\":\"2026-09-06T18:48:20.768190553Z\"},{\"container_id\":\"889be41d2cee9d327811da78388f834ba6eafe4c0eeae456867ed0df76832d01\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":0,\"running\":true,\"service\":\"worker\",\"started_at\":\"2026-09-06T18:48:20.586788319Z\"}],\"stage_result\":{\"active_env_unchanged\":true,\"build_context\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5\",\"collector_source_sha256\":\"193dd0c7f9890fdb4026c24dbc5add825f1641d92097e881806705ca452812d5\",\"copy_source\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/demonov_forward_map\",\"decision\":\"DEPLOY_STAGE_READY\",\"dockerfile\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/Dockerfile\",\"helper_candidates\":{\"demonov_forward_map.live_prospective\":[{\"name\":\"_hash\",\"pure_candidate\":true,\"signature\":\"(value: 'object') -> 'str'\"}],\"demonov_forward_map.runtime_integrity\":[{\"name\":\"canonical_hash\",\"pure_candidate\":true,\"signature\":\"(payload: 'Any') -> 'str'\"},{\"name\":\"verify_experiment_seal_receipt\",\"pure_candidate\":true,\"signature\":\"(*, bundle: 'FinalProspectiveSealBundle', receipt: 'ExperimentSealReceipt', collection_start_at: 'datetime', receipt_verifier: 'Callable[[ExperimentSealReceipt], bool]') -> 'None'\"},{\"name\":\"required_retained_hashes\",\"pure_candidate\":true,\"signature\":\"(*, runtime_registry: 'RuntimeRegistry', model_registry: 'FinalModelRegistry', state_snapshots: 'Sequence[StateSnapshotManifest]' = (), predictor_runtime: 'PredictorRuntimeManifest | None' = None) -> 'Mapping[str, RetainedArtifactKind]'\"}],\"demonov_forward_map.runtime_manifest\":[{\"name\":\"canonical_hash\",\"pure_candidate\":true,\"signature\":\"(payload: 'Any') -> 'str'\"},{\"name\":\"verify_runtime_manifest\",\"pure_candidate\":true,\"signature\":\"(manifest: 'RuntimeDeploymentManifestV1', *, expected_code_identity: 'str', actual_image_id: 'str', actual_package_identity: 'str') -> 'None'\"}]},\"new_image\":\"8020-demonov-shadow:76e1f58baa544a0e208bba317f0150e5b6d74dbd\",\"new_image_id\":\"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99\",\"policy\":{\"close_timeout\":5,\"open_timeout\":10,\"ping_interval\":20,\"ping_timeout\":60},\"runtime_activated\":false,\"service_identity_unchanged\":true,\"stage_path\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5\",\"websockets_version\":\"15.0.1\"}}\nSB043G_MANIFEST_CLASS_CONTRACT={\"class\":\"RuntimeDeploymentManifestV1\",\"decorators\":[\"dataclass(frozen=True)\"],\"fields\":[\"runtime_manifest_id\",\"code_identity\",\"package_identity\",\"application_image_id\",\"base_image_digest\",\"compose_hash\",\"finality_policy_id\"],\"identity_methods\":[{\"args\":[\"self\"],\"decorators\":[\"property\"],\"kwonly\":[],\"name\":\"content_hash\",\"source\":\"def content_hash(self) -> str:\\n return canonical_hash(\\n {\\n \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\\n \\\"compose_hash\\\": self.compose_hash,\\n \\\"finality_policy_id\\\": self.finality_policy_id,\\n }\\n )\",\"source_sha256\":\"5ca3618001bfac422d4ff365e429f2f057196f3b78d67cd666458d4db2011e4b\"},{\"args\":[\"self\"],\"decorators\":[],\"kwonly\":[],\"name\":\"__post_init__\",\"source\":\"def __post_init__(self) -> None:\\n _sha256_hex(self.runtime_manifest_id, \\\"runtime manifest id\\\")\\n _required(self.code_identity, \\\"code identity\\\")\\n if _GIT_ID_RE.fullmatch(self.code_identity) is None:\\n raise DemonovError(\\n \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\\n _sha256_hex(self.compose_hash, \\\"compose hash\\\")\\n _required(self.finality_policy_id, \\\"finality policy id\\\")\\n if self.runtime_manifest_id != self.content_hash:\\n raise DemonovError(\\n \\\"runtime manifest id must be content-addressed\\\"\\n )\",\"source_sha256\":\"bb8a8ccd8a52d6d3ac094e6e8abecdc4aeb6edaf8094d2c6477a0cd0d26fa868\"},{\"args\":[\"cls\"],\"decorators\":[\"classmethod\"],\"kwonly\":[\"code_identity\",\"package_identity\",\"application_image_id\",\"base_image_digest\",\"compose_hash\",\"finality_policy_id\"],\"name\":\"build\",\"source\":\"def build(\\n cls,\\n *,\\n code_identity: str,\\n package_identity: str,\\n application_image_id: str,\\n base_image_digest: str,\\n compose_hash: str,\\n finality_policy_id: str,\\n ) -> \\\"RuntimeDeploymentManifestV1\\\":\\n payload = {\\n \\\"code_identity\\\": code_identity,\\n \\\"package_identity\\\": package_identity,\\n \\\"application_image_id\\\": application_image_id,\\n \\\"base_image_digest\\\": base_image_digest,\\n \\\"compose_hash\\\": compose_hash,\\n \\\"finality_policy_id\\\": finality_policy_id,\\n }\\n runtime_manifest_id = canonical_hash(\\n {\\n \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n **payload,\\n }\\n )\\n return cls(\\n runtime_manifest_id=runtime_manifest_id,\\n **payload,\\n )\",\"source_sha256\":\"1b6e558b28eb2a46959d4761d391e7e755188743919bddb6f19365278d731655\"}]}\nSB043G_EXPERIMENT_CLASS_CONTRACT={\"class\":\"ExperimentProvenance\",\"decorators\":[\"dataclass(frozen=True)\"],\"fields\":[\"experiment_id\",\"collection_start_at\",\"code_identity\",\"policy_registry_id\",\"market_bundle_id\",\"geometry_policy_id\",\"demonov_branch_policy_id\",\"notification_policy_id\",\"outcome_policy_id\",\"experiment_version\",\"finality_policy_id\",\"runtime_manifest_id\"],\"identity_methods\":[{\"args\":[\"self\"],\"decorators\":[],\"kwonly\":[],\"name\":\"_base_hash_payload\",\"source\":\"def _base_hash_payload(self) -> dict:\\n return {\\n \\\"collection_start_at\\\": self.collection_start_at.isoformat(),\\n \\\"code_identity\\\": self.code_identity,\\n \\\"policy_registry_id\\\": self.policy_registry_id,\\n \\\"market_bundle_id\\\": self.market_bundle_id,\\n \\\"geometry_policy_id\\\": self.geometry_policy_id,\\n \\\"demonov_branch_policy_id\\\": self.demonov_branch_policy_id,\\n \\\"notification_policy_id\\\": self.notification_policy_id,\\n \\\"outcome_policy_id\\\": self.outcome_policy_id,\\n }\",\"source_sha256\":\"5c0856d58b2198065cead5610b07495683872df3c1102c76275626ef39077bbe\"},{\"args\":[\"self\"],\"decorators\":[\"property\"],\"kwonly\":[],\"name\":\"content_hash\",\"source\":\"def content_hash(self) -> str:\\n payload = self._base_hash_payload()\\n if self.experiment_version == \\\"LIVE_PROSPECTIVE_V1\\\":\\n return _hash(payload)\\n if self.experiment_version == \\\"LIVE_PROSPECTIVE_V2\\\":\\n payload.update({\\n \\\"experiment_version\\\": self.experiment_version,\\n \\\"finality_policy_id\\\": self.finality_policy_id,\\n \\\"runtime_manifest_id\\\": self.runtime_manifest_id,\\n })\\n return _hash(payload)\\n raise DemonovError(\\\"experiment provenance version invalid\\\")\",\"source_sha256\":\"6c1f33004948b1a62c9ae567c7556ab6d3ccb414d8fdd0ea641ad24e2577914a\"},{\"args\":[\"self\"],\"decorators\":[],\"kwonly\":[],\"name\":\"__post_init__\",\"source\":\"def __post_init__(self) -> None:\\n if (\\n self.collection_start_at.tzinfo is None\\n or self.collection_start_at.utcoffset() is None\\n ):\\n raise DemonovError(\\n \\\"experiment collection start must be timezone-aware\\\"\\n )\\n if self.experiment_version == \\\"LIVE_PROSPECTIVE_V1\\\":\\n if self.finality_policy_id or self.runtime_manifest_id:\\n raise DemonovError(\\n \\\"V1 experiment provenance cannot bind V2 finality/runtime identity\\\"\\n )\\n elif self.experiment_version == \\\"LIVE_PROSPECTIVE_V2\\\":\\n if not isinstance(self.finality_policy_id, str) or not self.finality_policy_id:\\n raise DemonovError(\\n \\\"V2 experiment finality policy id is required\\\"\\n )\\n if (\\n not isinstance(self.runtime_manifest_id, str)\\n or len(self.runtime_manifest_id) != 64\\n or any(\\n c not in \\\"0123456789abcdef\\\"\\n for c in self.runtime_manifest_id\\n )\\n ):\\n raise DemonovError(\\n \\\"V2 experiment runtime manifest id must be lowercase sha256 hex\\\"\\n )\\n else:\\n raise DemonovError(\\\"experiment provenance version invalid\\\")\\n if self.experiment_id != self.content_hash:\\n raise DemonovError(\\n \\\"experiment provenance id must be content-addressed\\\"\\n )\",\"source_sha256\":\"0451d874842317d2aaad4a3f285d8e8c9531610fe507c7a6c51cb7541410a8cb\"},{\"args\":[\"cls\"],\"decorators\":[\"classmethod\"],\"kwonly\":[],\"name\":\"build\",\"source\":\"def build(cls, **kwargs) -> \\\"ExperimentProvenance\\\":\\n payload = dict(kwargs)\\n version = payload.get(\\n \\\"experiment_version\\\",\\n \\\"LIVE_PROSPECTIVE_V1\\\",\\n )\\n payload[\\\"experiment_version\\\"] = version\\n payload.setdefault(\\\"finality_policy_id\\\", \\\"\\\")\\n payload.setdefault(\\\"runtime_manifest_id\\\", \\\"\\\")\\n base = {\\n \\\"collection_start_at\\\": payload[\\\"collection_start_at\\\"].isoformat(),\\n \\\"code_identity\\\": payload[\\\"code_identity\\\"],\\n \\\"policy_registry_id\\\": payload[\\\"policy_registry_id\\\"],\\n \\\"market_bundle_id\\\": payload[\\\"market_bundle_id\\\"],\\n \\\"geometry_policy_id\\\": payload[\\\"geometry_policy_id\\\"],\\n \\\"demonov_branch_policy_id\\\": payload[\\\"demonov_branch_policy_id\\\"],\\n \\\"notification_policy_id\\\": payload[\\\"notification_policy_id\\\"],\\n \\\"outcome_policy_id\\\": payload[\\\"outcome_policy_id\\\"],\\n }\\n if version == \\\"LIVE_PROSPECTIVE_V1\\\":\\n eid = _hash(base)\\n elif version == \\\"LIVE_PROSPECTIVE_V2\\\":\\n eid = _hash({\\n **base,\\n \\\"experiment_version\\\": version,\\n \\\"finality_policy_id\\\": payload[\\\"finality_policy_id\\\"],\\n \\\"runtime_manifest_id\\\": payload[\\\"runtime_manifest_id\\\"],\\n })\\n else:\\n raise DemonovError(\\\"experiment provenance version invalid\\\")\\n return cls(experiment_id=eid, **payload)\",\"source_sha256\":\"baff34f1b0f70ebba9ab9f354e9e91523e3cfa85fcd4ec747c1d7d62d37642c6\"},{\"args\":[\"cls\",\"data\"],\"decorators\":[\"classmethod\"],\"kwonly\":[],\"name\":\"from_json\",\"source\":\"def from_json(cls, data: dict) -> \\\"ExperimentProvenance\\\":\\n payload = dict(data)\\n payload[\\\"collection_start_at\\\"] = datetime.fromisoformat(\\n payload[\\\"collection_start_at\\\"]\\n )\\n payload.setdefault(\\n \\\"experiment_version\\\",\\n \\\"LIVE_PROSPECTIVE_V1\\\",\\n )\\n payload.setdefault(\\\"finality_policy_id\\\", \\\"\\\")\\n payload.setdefault(\\\"runtime_manifest_id\\\", \\\"\\\")\\n return cls(**payload)\",\"source_sha256\":\"4b526e7094fb03b02d5e63439627dc0340040cebc9b77f557b107e475e9c4f9f\"}]}\nSB043G_PACKAGE_REFERENCES=[{\"lineno\":29,\"name\":\"PackageCodeIdentityV1844\",\"node\":\"ClassDef\",\"path\":\"code_identity.py\",\"source\":\"class PackageCodeIdentityV1844:\\n package_name: str\\n modules: Tuple[ModuleCodeIdentityV1844, ...]\\n\\n @property\\n def package_manifest_id(self) -> str:\\n return canonical_hash({\\n \\\"package_name\\\": self.package_name,\\n \\\"modules\\\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\\n })\",\"source_sha256\":\"d4faf873bec896466fdfcd7514cd453a8646994d5f998aa3bc0b84716c3118f5\"},{\"lineno\":80,\"name\":\"package_code_identity\",\"node\":\"FunctionDef\",\"path\":\"code_identity.py\",\"source\":\"def package_code_identity(package_dir: str | Path) -> PackageCodeIdentityV1844:\\n root = Path(package_dir)\\n modules = tuple(module_code_identity(p, root=root) for p in sorted(root.rglob('*.py')))\\n if not modules:\\n raise DemonovError('package contains no Python modules')\\n return PackageCodeIdentityV1844(root.name, modules)\",\"source_sha256\":\"a45a4817fabf86fb8f47df513d780c6dfe1d3cc159fb428a36a5180f2020a607\"},{\"lineno\":34,\"name\":\"package_manifest_id\",\"node\":\"FunctionDef\",\"path\":\"code_identity.py\",\"source\":\"def package_manifest_id(self) -> str:\\n return canonical_hash({\\n \\\"package_name\\\": self.package_name,\\n \\\"modules\\\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\\n })\",\"source_sha256\":\"7d15a9e82d5388664fa96a527ed60716f32dadb1561284ae2f7d1024ed5edb2b\"},{\"lineno\":40,\"name\":null,\"node\":\"AnnAssign\",\"path\":\"runtime_manifest.py\",\"source\":\" runtime_manifest_id: str\\n code_identity: str\\n package_identity: str\\n application_image_id: str\\n base_image_digest: str\",\"source_sha256\":\"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926\"},{\"lineno\":122,\"name\":null,\"node\":\"If\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":40,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" runtime_manifest_id: str\\n code_identity: str\\n package_identity: str\\n application_image_id: str\\n base_image_digest: str\",\"source_sha256\":\"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926\"},{\"lineno\":67,\"name\":null,\"node\":\"Expr\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":113,\"name\":null,\"node\":\"arg\",\"path\":\"runtime_manifest.py\",\"source\":\" expected_code_identity: str,\\n actual_image_id: str,\\n actual_package_identity: str,\\n) -> None:\\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\",\"source_sha256\":\"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d\"},{\"lineno\":122,\"name\":null,\"node\":\"Compare\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":67,\"name\":null,\"node\":\"Call\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":82,\"name\":null,\"node\":\"arg\",\"path\":\"runtime_manifest.py\",\"source\":\" *,\\n code_identity: str,\\n package_identity: str,\\n application_image_id: str,\\n base_image_digest: str,\",\"source_sha256\":\"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6\"},{\"lineno\":113,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" expected_code_identity: str,\\n actual_image_id: str,\\n actual_package_identity: str,\\n) -> None:\\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\",\"source_sha256\":\"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d\"},{\"lineno\":122,\"name\":null,\"node\":\"Attribute\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":122,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":67,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":67,\"name\":null,\"node\":\"Attribute\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":67,\"name\":null,\"node\":\"Constant\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":82,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" *,\\n code_identity: str,\\n package_identity: str,\\n application_image_id: str,\\n base_image_digest: str,\",\"source_sha256\":\"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6\"},{\"lineno\":90,\"name\":null,\"node\":\"Constant\",\"path\":\"runtime_manifest.py\",\"source\":\" payload = {\\n \\\"code_identity\\\": code_identity,\\n \\\"package_identity\\\": package_identity,\\n \\\"application_image_id\\\": application_image_id,\\n \\\"base_image_digest\\\": base_image_digest,\",\"source_sha256\":\"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157\"},{\"lineno\":90,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" payload = {\\n \\\"code_identity\\\": code_identity,\\n \\\"package_identity\\\": package_identity,\\n \\\"application_image_id\\\": application_image_id,\\n \\\"base_image_digest\\\": base_image_digest,\",\"source_sha256\":\"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157\"},{\"lineno\":52,\"name\":null,\"node\":\"Constant\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\",\"source_sha256\":\"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61\"},{\"lineno\":52,\"name\":null,\"node\":\"Attribute\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\",\"source_sha256\":\"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61\"},{\"lineno\":52,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\",\"source_sha256\":\"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61\"}]\nSB043G_OLD_PACKAGE_DIRECT={\"compressed_sha256\":\"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32\",\"new_dir_file_count\":57,\"old_dir_file_count\":57,\"old_package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"tar_exists\":true,\"tar_sha256\":\"431ddf9e8938d5e583553f05f9e3d019aff0b439c83b0b23c81808073b7d61a8\"}\nSB043G_PACKAGE_CANDIDATE_MATCHES=[]\nSB043G_DERIVED_NEW_PACKAGE_CANDIDATES=[]\nSB043G_OLD_MANIFEST_OBJECT={\"application_image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"base_image_digest\":\"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"compose_hash\":\"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}\nSB043G_OLD_EXPERIMENT_OBJECT={\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"collection_start_at\":\"2026-09-07T00:00:00+00:00\",\"demonov_branch_policy_id\":\"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1\",\"experiment_id\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"experiment_version\":\"LIVE_PROSPECTIVE_V2\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"geometry_policy_id\":\"RESEARCH_RECONSTRUCTION_8020_V1\",\"market_bundle_id\":\"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae\",\"notification_policy_id\":\"SIGNIFICANT_STATE_CHANGE_EMAIL_V1\",\"outcome_policy_id\":\"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1\",\"policy_registry_id\":\"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}\nSB043G_HOLDS=[]\nSB043G_DECISION=SEAL_GENERATION_EVIDENCE_READY\nSB043G_MUTATION_SCOPE=NONE_READ_ONLY\nSIGNALBOT043G_HOLDS=[]\nSIGNALBOT043G_DECISION=SEAL_GENERATION_EVIDENCE_READY\nSIGNALBOT043G_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION\n" +} diff --git a/runtime/history/SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN.txt b/runtime/history/SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN.txt new file mode 100644 index 00000000..3a0fe75b --- /dev/null +++ b/runtime/history/SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN.txt @@ -0,0 +1,50 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=signalbot-cr0116-seal-generation-rca +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=b8040335cd6ee0ee0382570ca5ecd189293d21953c5509bd1711312a80a2d622 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGE_DECLARED=false +RESULT_CONTRACT_VALID=true +RESULT_CONTRACT_STATUS=NOT_APPLICABLE +RESULT_CONTRACT_ERROR=NONE +COMMAND_RC=0 +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c +SANITIZED_OUTPUT_SHA256=099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c +OUTPUT_BEGIN +ERROR_REGISTER_CHECK=OK +REFERENCE_CHECK=OK +AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED +SB043G_PRESTATE={"active_env":{"APP_IMAGE":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","CODE_IDENTITY":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","COLLECTION_START_AT":"2026-09-07T00:00:00+00:00","EXPERIMENT_ID":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","RUNTIME_MANIFEST_ID":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"new_image_id":"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99","services":[{"container_id":"a546a70c3e8c263d9b590cd78ee206bcda0cfcdb6662327e8415ca0e29ad1501","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":14,"running":true,"service":"collector","started_at":"2026-09-08T07:38:09.79483772Z"},{"container_id":"d8023f4cbf91f9382e39eec0436c9cebc7665535b42b950e95408c03ff9bf30d","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":0,"running":true,"service":"relay","started_at":"2026-09-06T18:48:20.603414848Z"},{"container_id":"1feeca2d9428cd5a277c026bef34534db307657dcdcd63aff98ea66e44f8b9c5","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":0,"running":true,"service":"shadow","started_at":"2026-09-06T18:48:20.768190553Z"},{"container_id":"889be41d2cee9d327811da78388f834ba6eafe4c0eeae456867ed0df76832d01","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":0,"running":true,"service":"worker","started_at":"2026-09-06T18:48:20.586788319Z"}],"stage_result":{"active_env_unchanged":true,"build_context":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5","collector_source_sha256":"193dd0c7f9890fdb4026c24dbc5add825f1641d92097e881806705ca452812d5","copy_source":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/demonov_forward_map","decision":"DEPLOY_STAGE_READY","dockerfile":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/Dockerfile","helper_candidates":{"demonov_forward_map.live_prospective":[{"name":"_hash","pure_candidate":true,"signature":"(value: 'object') -> 'str'"}],"demonov_forward_map.runtime_integrity":[{"name":"canonical_hash","pure_candidate":true,"signature":"(payload: 'Any') -> 'str'"},{"name":"verify_experiment_seal_receipt","pure_candidate":true,"signature":"(*, bundle: 'FinalProspectiveSealBundle', receipt: 'ExperimentSealReceipt', collection_start_at: 'datetime', receipt_verifier: 'Callable[[ExperimentSealReceipt], bool]') -> 'None'"},{"name":"required_retained_hashes","pure_candidate":true,"signature":"(*, runtime_registry: 'RuntimeRegistry', model_registry: 'FinalModelRegistry', state_snapshots: 'Sequence[StateSnapshotManifest]' = (), predictor_runtime: 'PredictorRuntimeManifest | None' = None) -> 'Mapping[str, RetainedArtifactKind]'"}],"demonov_forward_map.runtime_manifest":[{"name":"canonical_hash","pure_candidate":true,"signature":"(payload: 'Any') -> 'str'"},{"name":"verify_runtime_manifest","pure_candidate":true,"signature":"(manifest: 'RuntimeDeploymentManifestV1', *, expected_code_identity: 'str', actual_image_id: 'str', actual_package_identity: 'str') -> 'None'"}]},"new_image":"8020-demonov-shadow:76e1f58baa544a0e208bba317f0150e5b6d74dbd","new_image_id":"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99","policy":{"close_timeout":5,"open_timeout":10,"ping_interval":20,"ping_timeout":60},"runtime_activated":false,"service_identity_unchanged":true,"stage_path":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5","websockets_version":"15.0.1"}} +SB043G_MANIFEST_CLASS_CONTRACT={"class":"RuntimeDeploymentManifestV1","decorators":["dataclass(frozen=True)"],"fields":["runtime_manifest_id","code_identity","package_identity","application_image_id","base_image_digest","compose_hash","finality_policy_id"],"identity_methods":[{"args":["self"],"decorators":["property"],"kwonly":[],"name":"content_hash","source":"def content_hash(self) -> str:\n return canonical_hash(\n {\n \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,\n \"compose_hash\": self.compose_hash,\n \"finality_policy_id\": self.finality_policy_id,\n }\n )","source_sha256":"5ca3618001bfac422d4ff365e429f2f057196f3b78d67cd666458d4db2011e4b"},{"args":["self"],"decorators":[],"kwonly":[],"name":"__post_init__","source":"def __post_init__(self) -> None:\n _sha256_hex(self.runtime_manifest_id, \"runtime manifest id\")\n _required(self.code_identity, \"code identity\")\n if _GIT_ID_RE.fullmatch(self.code_identity) is None:\n raise DemonovError(\n \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")\n _sha256_hex(self.compose_hash, \"compose hash\")\n _required(self.finality_policy_id, \"finality policy id\")\n if self.runtime_manifest_id != self.content_hash:\n raise DemonovError(\n \"runtime manifest id must be content-addressed\"\n )","source_sha256":"bb8a8ccd8a52d6d3ac094e6e8abecdc4aeb6edaf8094d2c6477a0cd0d26fa868"},{"args":["cls"],"decorators":["classmethod"],"kwonly":["code_identity","package_identity","application_image_id","base_image_digest","compose_hash","finality_policy_id"],"name":"build","source":"def build(\n cls,\n *,\n code_identity: str,\n package_identity: str,\n application_image_id: str,\n base_image_digest: str,\n compose_hash: str,\n finality_policy_id: str,\n ) -> \"RuntimeDeploymentManifestV1\":\n payload = {\n \"code_identity\": code_identity,\n \"package_identity\": package_identity,\n \"application_image_id\": application_image_id,\n \"base_image_digest\": base_image_digest,\n \"compose_hash\": compose_hash,\n \"finality_policy_id\": finality_policy_id,\n }\n runtime_manifest_id = canonical_hash(\n {\n \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n **payload,\n }\n )\n return cls(\n runtime_manifest_id=runtime_manifest_id,\n **payload,\n )","source_sha256":"1b6e558b28eb2a46959d4761d391e7e755188743919bddb6f19365278d731655"}]} +SB043G_EXPERIMENT_CLASS_CONTRACT={"class":"ExperimentProvenance","decorators":["dataclass(frozen=True)"],"fields":["experiment_id","collection_start_at","code_identity","policy_registry_id","market_bundle_id","geometry_policy_id","demonov_branch_policy_id","notification_policy_id","outcome_policy_id","experiment_version","finality_policy_id","runtime_manifest_id"],"identity_methods":[{"args":["self"],"decorators":[],"kwonly":[],"name":"_base_hash_payload","source":"def _base_hash_payload(self) -> dict:\n return {\n \"collection_start_at\": self.collection_start_at.isoformat(),\n \"code_identity\": self.code_identity,\n \"policy_registry_id\": self.policy_registry_id,\n \"market_bundle_id\": self.market_bundle_id,\n \"geometry_policy_id\": self.geometry_policy_id,\n \"demonov_branch_policy_id\": self.demonov_branch_policy_id,\n \"notification_policy_id\": self.notification_policy_id,\n \"outcome_policy_id\": self.outcome_policy_id,\n }","source_sha256":"5c0856d58b2198065cead5610b07495683872df3c1102c76275626ef39077bbe"},{"args":["self"],"decorators":["property"],"kwonly":[],"name":"content_hash","source":"def content_hash(self) -> str:\n payload = self._base_hash_payload()\n if self.experiment_version == \"LIVE_PROSPECTIVE_V1\":\n return _hash(payload)\n if self.experiment_version == \"LIVE_PROSPECTIVE_V2\":\n payload.update({\n \"experiment_version\": self.experiment_version,\n \"finality_policy_id\": self.finality_policy_id,\n \"runtime_manifest_id\": self.runtime_manifest_id,\n })\n return _hash(payload)\n raise DemonovError(\"experiment provenance version invalid\")","source_sha256":"6c1f33004948b1a62c9ae567c7556ab6d3ccb414d8fdd0ea641ad24e2577914a"},{"args":["self"],"decorators":[],"kwonly":[],"name":"__post_init__","source":"def __post_init__(self) -> None:\n if (\n self.collection_start_at.tzinfo is None\n or self.collection_start_at.utcoffset() is None\n ):\n raise DemonovError(\n \"experiment collection start must be timezone-aware\"\n )\n if self.experiment_version == \"LIVE_PROSPECTIVE_V1\":\n if self.finality_policy_id or self.runtime_manifest_id:\n raise DemonovError(\n \"V1 experiment provenance cannot bind V2 finality/runtime identity\"\n )\n elif self.experiment_version == \"LIVE_PROSPECTIVE_V2\":\n if not isinstance(self.finality_policy_id, str) or not self.finality_policy_id:\n raise DemonovError(\n \"V2 experiment finality policy id is required\"\n )\n if (\n not isinstance(self.runtime_manifest_id, str)\n or len(self.runtime_manifest_id) != 64\n or any(\n c not in \"0123456789abcdef\"\n for c in self.runtime_manifest_id\n )\n ):\n raise DemonovError(\n \"V2 experiment runtime manifest id must be lowercase sha256 hex\"\n )\n else:\n raise DemonovError(\"experiment provenance version invalid\")\n if self.experiment_id != self.content_hash:\n raise DemonovError(\n \"experiment provenance id must be content-addressed\"\n )","source_sha256":"0451d874842317d2aaad4a3f285d8e8c9531610fe507c7a6c51cb7541410a8cb"},{"args":["cls"],"decorators":["classmethod"],"kwonly":[],"name":"build","source":"def build(cls, **kwargs) -> \"ExperimentProvenance\":\n payload = dict(kwargs)\n version = payload.get(\n \"experiment_version\",\n \"LIVE_PROSPECTIVE_V1\",\n )\n payload[\"experiment_version\"] = version\n payload.setdefault(\"finality_policy_id\", \"\")\n payload.setdefault(\"runtime_manifest_id\", \"\")\n base = {\n \"collection_start_at\": payload[\"collection_start_at\"].isoformat(),\n \"code_identity\": payload[\"code_identity\"],\n \"policy_registry_id\": payload[\"policy_registry_id\"],\n \"market_bundle_id\": payload[\"market_bundle_id\"],\n \"geometry_policy_id\": payload[\"geometry_policy_id\"],\n \"demonov_branch_policy_id\": payload[\"demonov_branch_policy_id\"],\n \"notification_policy_id\": payload[\"notification_policy_id\"],\n \"outcome_policy_id\": payload[\"outcome_policy_id\"],\n }\n if version == \"LIVE_PROSPECTIVE_V1\":\n eid = _hash(base)\n elif version == \"LIVE_PROSPECTIVE_V2\":\n eid = _hash({\n **base,\n \"experiment_version\": version,\n \"finality_policy_id\": payload[\"finality_policy_id\"],\n \"runtime_manifest_id\": payload[\"runtime_manifest_id\"],\n })\n else:\n raise DemonovError(\"experiment provenance version invalid\")\n return cls(experiment_id=eid, **payload)","source_sha256":"baff34f1b0f70ebba9ab9f354e9e91523e3cfa85fcd4ec747c1d7d62d37642c6"},{"args":["cls","data"],"decorators":["classmethod"],"kwonly":[],"name":"from_json","source":"def from_json(cls, data: dict) -> \"ExperimentProvenance\":\n payload = dict(data)\n payload[\"collection_start_at\"] = datetime.fromisoformat(\n payload[\"collection_start_at\"]\n )\n payload.setdefault(\n \"experiment_version\",\n \"LIVE_PROSPECTIVE_V1\",\n )\n payload.setdefault(\"finality_policy_id\", \"\")\n payload.setdefault(\"runtime_manifest_id\", \"\")\n return cls(**payload)","source_sha256":"4b526e7094fb03b02d5e63439627dc0340040cebc9b77f557b107e475e9c4f9f"}]} +SB043G_PACKAGE_REFERENCES=[{"lineno":29,"name":"PackageCodeIdentityV1844","node":"ClassDef","path":"code_identity.py","source":"class PackageCodeIdentityV1844:\n package_name: str\n modules: Tuple[ModuleCodeIdentityV1844, ...]\n\n @property\n def package_manifest_id(self) -> str:\n return canonical_hash({\n \"package_name\": self.package_name,\n \"modules\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\n })","source_sha256":"d4faf873bec896466fdfcd7514cd453a8646994d5f998aa3bc0b84716c3118f5"},{"lineno":80,"name":"package_code_identity","node":"FunctionDef","path":"code_identity.py","source":"def package_code_identity(package_dir: str | Path) -> PackageCodeIdentityV1844:\n root = Path(package_dir)\n modules = tuple(module_code_identity(p, root=root) for p in sorted(root.rglob('*.py')))\n if not modules:\n raise DemonovError('package contains no Python modules')\n return PackageCodeIdentityV1844(root.name, modules)","source_sha256":"a45a4817fabf86fb8f47df513d780c6dfe1d3cc159fb428a36a5180f2020a607"},{"lineno":34,"name":"package_manifest_id","node":"FunctionDef","path":"code_identity.py","source":"def package_manifest_id(self) -> str:\n return canonical_hash({\n \"package_name\": self.package_name,\n \"modules\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\n })","source_sha256":"7d15a9e82d5388664fa96a527ed60716f32dadb1561284ae2f7d1024ed5edb2b"},{"lineno":40,"name":null,"node":"AnnAssign","path":"runtime_manifest.py","source":" runtime_manifest_id: str\n code_identity: str\n package_identity: str\n application_image_id: str\n base_image_digest: str","source_sha256":"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926"},{"lineno":122,"name":null,"node":"If","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":40,"name":null,"node":"Name","path":"runtime_manifest.py","source":" runtime_manifest_id: str\n code_identity: str\n package_identity: str\n application_image_id: str\n base_image_digest: str","source_sha256":"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926"},{"lineno":67,"name":null,"node":"Expr","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":113,"name":null,"node":"arg","path":"runtime_manifest.py","source":" expected_code_identity: str,\n actual_image_id: str,\n actual_package_identity: str,\n) -> None:\n if not isinstance(manifest, RuntimeDeploymentManifestV1):","source_sha256":"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d"},{"lineno":122,"name":null,"node":"Compare","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":67,"name":null,"node":"Call","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":82,"name":null,"node":"arg","path":"runtime_manifest.py","source":" *,\n code_identity: str,\n package_identity: str,\n application_image_id: str,\n base_image_digest: str,","source_sha256":"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6"},{"lineno":113,"name":null,"node":"Name","path":"runtime_manifest.py","source":" expected_code_identity: str,\n actual_image_id: str,\n actual_package_identity: str,\n) -> None:\n if not isinstance(manifest, RuntimeDeploymentManifestV1):","source_sha256":"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d"},{"lineno":122,"name":null,"node":"Attribute","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":122,"name":null,"node":"Name","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":67,"name":null,"node":"Name","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":67,"name":null,"node":"Attribute","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":67,"name":null,"node":"Constant","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":82,"name":null,"node":"Name","path":"runtime_manifest.py","source":" *,\n code_identity: str,\n package_identity: str,\n application_image_id: str,\n base_image_digest: str,","source_sha256":"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6"},{"lineno":90,"name":null,"node":"Constant","path":"runtime_manifest.py","source":" payload = {\n \"code_identity\": code_identity,\n \"package_identity\": package_identity,\n \"application_image_id\": application_image_id,\n \"base_image_digest\": base_image_digest,","source_sha256":"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157"},{"lineno":90,"name":null,"node":"Name","path":"runtime_manifest.py","source":" payload = {\n \"code_identity\": code_identity,\n \"package_identity\": package_identity,\n \"application_image_id\": application_image_id,\n \"base_image_digest\": base_image_digest,","source_sha256":"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157"},{"lineno":52,"name":null,"node":"Constant","path":"runtime_manifest.py","source":" \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,","source_sha256":"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61"},{"lineno":52,"name":null,"node":"Attribute","path":"runtime_manifest.py","source":" \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,","source_sha256":"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61"},{"lineno":52,"name":null,"node":"Name","path":"runtime_manifest.py","source":" \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,","source_sha256":"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61"}] +SB043G_OLD_PACKAGE_DIRECT={"compressed_sha256":"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32","new_dir_file_count":57,"old_dir_file_count":57,"old_package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","tar_exists":true,"tar_sha256":"431ddf9e8938d5e583553f05f9e3d019aff0b439c83b0b23c81808073b7d61a8"} +SB043G_PACKAGE_CANDIDATE_MATCHES=[] +SB043G_DERIVED_NEW_PACKAGE_CANDIDATES=[] +SB043G_OLD_MANIFEST_OBJECT={"application_image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","base_image_digest":"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","compose_hash":"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"} +SB043G_OLD_EXPERIMENT_OBJECT={"code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","collection_start_at":"2026-09-07T00:00:00+00:00","demonov_branch_policy_id":"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1","experiment_id":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","experiment_version":"LIVE_PROSPECTIVE_V2","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","geometry_policy_id":"RESEARCH_RECONSTRUCTION_8020_V1","market_bundle_id":"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae","notification_policy_id":"SIGNIFICANT_STATE_CHANGE_EMAIL_V1","outcome_policy_id":"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1","policy_registry_id":"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"} +SB043G_HOLDS=[] +SB043G_DECISION=SEAL_GENERATION_EVIDENCE_READY +SB043G_MUTATION_SCOPE=NONE_READ_ONLY +SIGNALBOT043G_HOLDS=[] +SIGNALBOT043G_DECISION=SEAL_GENERATION_EVIDENCE_READY +SIGNALBOT043G_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 2ae5fb16..2caf0726 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "NEWFI-260908-A-STAGINGEDGE-FRONTEND-FORENSIC3", + "command_id": "SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "newfi-staging-upstream-tls-frontend-forensic-readonly", - "started_at_utc": "2026-09-08T07:36:02Z", - "finished_at_utc": "2026-09-08T07:36:39Z", + "component": "signalbot-cr0116-seal-generation-rca", + "started_at_utc": "2026-09-08T07:40:38Z", + "finished_at_utc": "2026-09-08T07:40:40Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "45b9f9814c0bff698962bcdd4c06d06953e5ec76ec01c8f56e680c51218c4047", + "command_sha256": "b8040335cd6ee0ee0382570ca5ecd189293d21953c5509bd1711312a80a2d622", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "1997b836a531166d14298c77a514de124631aa8c239a2ef9b74202fb2bf9a4ff", - "sanitized_output_sha256": "24bb5f3b58f9b3919ef16ca69845f204063a88ea8ab583d4e12ed0445d64f801", + "raw_evidence_sha256": "099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c", + "sanitized_output_sha256": "099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "FORENSIC3_BEGIN=true\nCOMMAND_ID=NEWFI-260908-A-STAGINGEDGE-FRONTEND-FORENSIC3\nMODE=read-only\nMUTATIONS_PERFORMED=NO\nERROR_REGISTER_CHECK=OK\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_CHECK=OK\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nPRIOR_FORENSIC2_GATE=PASS\nPRIOR_FORENSIC2_HISTORY_SHA256=ca4539996dc20a97e98687e1c0721f53b03e9c9e0c9e68fc62d4686081053271\nPUBLIC_DNS_PTR={\"PTR\":{\"err\":\"\",\"rc\":0,\"values\":[]},\"chat.gram1.ru\":{\"A\":[\"185.225.35.6\"],\"err\":\"\",\"rc\":0},\"git.gram1.ru\":{\"A\":[\"185.225.35.6\"],\"err\":\"\",\"rc\":0},\"groups.chat.gram1.ru\":{\"A\":[\"chat.gram1.ru.\",\"185.225.35.6\"],\"err\":\"\",\"rc\":0},\"newfi-staging.gram1.ru\":{\"A\":[],\"err\":\"\",\"rc\":0},\"share.chat.gram1.ru\":{\"A\":[\"chat.gram1.ru.\",\"185.225.35.6\"],\"err\":\"\",\"rc\":0}}\nPUBLIC_CERT_GIT_GRAM1_RU={\"err\":\"\",\"out\":\"subject=CN=git.gram1.ru\\nissuer=C=US, O=Let's Encrypt, CN=YE1\\nserial=0668B385C8D6C5BBB0435761F84FADD0DB23\\nnotBefore=Aug 17 02:03:29 2026 GMT\\nnotAfter=Nov 15 02:03:28 2026 GMT\\nX509v3 Subject Alternative Name: \\n DNS:git-read.gram1.ru, DNS:git.gram1.ru\",\"rc\":0}\nPUBLIC_CURL_GIT_GRAM1_RU={\"err\":\"\",\"headers\":[\"Server: nginx/1.28.3 (Ubuntu)\"],\"http\":\"200\",\"rc\":0}\nPUBLIC_CERT_CHAT_GRAM1_RU={\"err\":\"\",\"out\":\"subject=CN=chat.gram1.ru\\nissuer=C=US, O=Let's Encrypt, CN=YE2\\nserial=05CCB33370771F433AE4E9AD47F2DB574672\\nnotBefore=Aug 17 02:54:43 2026 GMT\\nnotAfter=Nov 15 02:54:42 2026 GMT\\nX509v3 Subject Alternative Name: \\n DNS:chat.gram1.ru, DNS:groups.chat.gram1.ru, DNS:share.chat.gram1.ru\",\"rc\":0}\nPUBLIC_CURL_CHAT_GRAM1_RU={\"err\":\"\",\"headers\":[\"Server: nginx/1.28.3 (Ubuntu)\",\"location: /login\"],\"http\":\"302\",\"rc\":0}\nPUBLIC_CERT_NEWFI_STAGING_GRAM1_RU={\"err\":\"\",\"out\":\"subject=CN=chat.gram1.ru\\nissuer=C=US, O=Let's Encrypt, CN=YE2\\nserial=05CCB33370771F433AE4E9AD47F2DB574672\\nnotBefore=Aug 17 02:54:43 2026 GMT\\nnotAfter=Nov 15 02:54:42 2026 GMT\\nX509v3 Subject Alternative Name: \\n DNS:chat.gram1.ru, DNS:groups.chat.gram1.ru, DNS:share.chat.gram1.ru\",\"rc\":0}\nPUBLIC_CURL_NEWFI_STAGING_GRAM1_RU={\"err\":\"curl: (60) SSL: no alternative certificate subject name matches target hostname 'newfi-staging.gram1.ru'\\nMore details here: https://curl.se/docs/sslcerts.html\\n\\ncurl failed to verify the legitimacy of the server and therefore could not\\nestablish a secure connection to it. To learn more about this situation and\\nhow to fix it, please visit the webpage mentioned above.\\n\",\"headers\":[],\"http\":\"000\",\"rc\":60}\nCLUSTER_VM_CT_INVENTORY={\"err\":\"\",\"rc\":0,\"rows\":[{\"name\":\"dns1\",\"node\":\"pve01\",\"status\":\"running\",\"template\":0,\"type\":\"lxc\",\"vmid\":110},{\"name\":\"dns2\",\"node\":\"pve02\",\"status\":\"running\",\"template\":0,\"type\":\"lxc\",\"vmid\":111},{\"name\":\"unbound1\",\"node\":\"pve01\",\"status\":\"running\",\"template\":0,\"type\":\"lxc\",\"vmid\":112},{\"name\":\"unbound2\",\"node\":\"pve02\",\"status\":\"running\",\"template\":0,\"type\":\"lxc\",\"vmid\":113},{\"name\":\"edge-vm\",\"node\":\"pve03\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":130},{\"name\":\"snikket\",\"node\":\"pve01\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":150},{\"name\":\"forum-prod\",\"node\":\"pve02\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":160},{\"name\":\"core-apps\",\"node\":\"pve01\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":170},{\"name\":\"monitoring\",\"node\":\"pve01\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":171},{\"name\":\"homelab-ops-worker\",\"node\":\"pve03\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":190},{\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":210},{\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"template\":0,\"type\":\"qemu\",\"vmid\":211},{\"name\":\"edge-cold-standby\",\"node\":\"pve02\",\"status\":\"stopped\",\"template\":0,\"type\":\"qemu\",\"vmid\":9130}]}\nPVE01_DEFAULT_ROUTE={\"err\":\"\",\"gateway\":\"[PRIVATE_IP]\",\"line\":\"default via [PRIVATE_IP] dev vmbr0 proto kernel onlink\",\"rc\":0}\nPVE01_GATEWAY_NEIGHBOR={\"err\":\"\",\"out\":\"[PRIVATE_IP] dev vmbr0 lladdr d6:9c:53:00:2c:c3 REACHABLE\",\"rc\":0}\nGATEWAY_BASIC_PORTS={\"22\":{\"open\":false,\"rc\":124},\"443\":{\"open\":false,\"rc\":124},\"80\":{\"open\":false,\"rc\":124},\"8443\":{\"open\":false,\"rc\":124}}\nGATEWAY_SSH_KEYSCAN={\"err\":\"\",\"out\":\"\",\"rc\":1}\nGATEWAY_HTTP_HEAD={\"err\":\"curl: (28) Connection timed out after 5002 milliseconds\\n\",\"out\":\"\",\"rc\":28}\nGATEWAY_HTTPS_HEAD={\"err\":\"curl: (28) Connection timed out after 5001 milliseconds\\n\",\"out\":\"\",\"rc\":28}\nEDGE_PRIVATE_IP_DISCOVERY={\"ips\":[\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\",\"[PRIVATE_IP]\"],\"rc\":0,\"selected\":null}\nEDGE_WEB_LISTENER_OWNERSHIP={\"err\":\"\",\"out\":\"--- SS_WEB ---\\nState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess \\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=16),(\\\"nginx\\\",pid=2180089,fd=16),(\\\"nginx\\\",pid=2180083,fd=16),(\\\"nginx\\\",pid=2180082,fd=16),(\\\"nginx\\\",pid=3096,fd=16))\\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=15),(\\\"nginx\\\",pid=2180089,fd=15),(\\\"nginx\\\",pid=2180083,fd=15),(\\\"nginx\\\",pid=2180082,fd=15),(\\\"nginx\\\",pid=3096,fd=15))\\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=14),(\\\"nginx\\\",pid=2180089,fd=14),(\\\"nginx\\\",pid=2180083,fd=14),(\\\"nginx\\\",pid=2180082,fd=14),(\\\"nginx\\\",pid=3096,fd=14))\\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=7),(\\\"nginx\\\",pid=2180089,fd=7),(\\\"nginx\\\",pid=2180083,fd=7),(\\\"nginx\\\",pid=2180082,fd=7),(\\\"nginx\\\",pid=3096,fd=7)) \\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=13),(\\\"nginx\\\",pid=2180089,fd=13),(\\\"nginx\\\",pid=2180083,fd=13),(\\\"nginx\\\",pid=2180082,fd=13),(\\\"nginx\\\",pid=3096,fd=13))\\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=12),(\\\"nginx\\\",pid=2180089,fd=12),(\\\"nginx\\\",pid=2180083,fd=12),(\\\"nginx\\\",pid=2180082,fd=12),(\\\"nginx\\\",pid=3096,fd=12))\\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=11),(\\\"nginx\\\",pid=2180089,fd=11),(\\\"nginx\\\",pid=2180083,fd=11),(\\\"nginx\\\",pid=2180082,fd=11),(\\\"nginx\\\",pid=3096,fd=11))\\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=6),(\\\"nginx\\\",pid=2180089,fd=6),(\\\"nginx\\\",pid=2180083,fd=6),(\\\"nginx\\\",pid=2180082,fd=6),(\\\"nginx\\\",pid=3096,fd=6)) \\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=19),(\\\"nginx\\\",pid=2180089,fd=19),(\\\"nginx\\\",pid=2180083,fd=19),(\\\"nginx\\\",pid=2180082,fd=19),(\\\"nginx\\\",pid=3096,fd=19))\\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=18),(\\\"nginx\\\",pid=2180089,fd=18),(\\\"nginx\\\",pid=2180083,fd=18),(\\\"nginx\\\",pid=2180082,fd=18),(\\\"nginx\\\",pid=3096,fd=18))\\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=17),(\\\"nginx\\\",pid=2180089,fd=17),(\\\"nginx\\\",pid=2180083,fd=17),(\\\"nginx\\\",pid=2180082,fd=17),(\\\"nginx\\\",pid=3096,fd=17))\\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\\\"nginx\\\",pid=2180110,fd=8),(\\\"nginx\\\",pid=2180089,fd=8),(\\\"nginx\\\",pid=2180083,fd=8),(\\\"nginx\\\",pid=2180082,fd=8),(\\\"nginx\\\",pid=3096,fd=8)) \\nLISTEN 0 511 [::]:443 [::]:* users:((\\\"nginx\\\",pid=2180110,fd=10),(\\\"nginx\\\",pid=2180089,fd=10),(\\\"nginx\\\",pid=2180083,fd=10),(\\\"nginx\\\",pid=2180082,fd=10),(\\\"nginx\\\",pid=3096,fd=10))\\nLISTEN 0 511 [::]:80 [::]:* users:((\\\"nginx\\\",pid=2180110,fd=9),(\\\"nginx\\\",pid=2180089,fd=9),(\\\"nginx\\\",pid=2180083,fd=9),(\\\"nginx\\\",pid=2180082,fd=9),(\\\"nginx\\\",pid=3096,fd=9)) \\n--- PROCESS_TREE_NGINX ---\\n 1920 1674 root haproxy /usr/sbin/haproxy -f /run/haproxy/haproxy.cfg -W -db\\n 2031 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 2375 -container-ip [PRIVATE_IP] -container-port 2375 -use-listen-fd\\n 2107 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 8081 -container-ip [PRIVATE_IP] -container-port 8080 -use-listen-fd\\n 2160 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 7422 -container-ip [PRIVATE_IP] -container-port 7422 -use-listen-fd\\n 2180 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 8088 -container-ip [PRIVATE_IP] -container-port 8080 -use-listen-fd\\n 2201 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 12345 -container-ip [PRIVATE_IP] -container-port 12345 -use-listen-fd\\n 2213 1920 root haproxy /usr/sbin/haproxy -f /run/haproxy/haproxy.cfg -W -db\\n 2223 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 3100 -container-ip [PRIVATE_IP] -container-port 3100 -use-listen-fd\\n 2332 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 9999 -container-ip [PRIVATE_IP] -container-port 8080 -use-listen-fd\\n 3096 3095 root nginx nginx: master process nginx -e stderr\\n1948449 3096 root nginx nginx: worker process is shutting down\\n2180082 3096 root nginx nginx: worker process\\n2180083 3096 root nginx nginx: worker process\\n2180089 3096 root nginx nginx: worker process\\n2180110 3096 root nginx nginx: worker process\\n2183049 722 root bash /bin/bash -lc echo '--- SS_WEB ---' ss -ltnp | awk 'NR==1 || $4 ~ /:(80|81|443)$/' echo '--- PROCESS_TREE_NGINX ---' ps -eo pid,ppid,user,comm,args | grep -E '[n]ginx|[d]ocker-proxy|[h]aproxy|[c]addy|[t]raefik' echo '--- NPMPLUS_MODE ---' docker inspect npmplus --format '{{.HostConfig.NetworkMode}}' echo '--- NPMPLUS_IMAGE ---' docker inspect npmplus --format '{{.Config.Image}} {{.Image}}' echo '--- NPMPLUS_NGINX_VERSION ---' docker exec npmplus /usr/local/nginx/sbin/nginx -v 2>&1 \\n2631782 1 root sudo sudo bash -lc set -euo pipefail; IDS=\\\"30 32 33 34 35 36 37 38 39 40 43 44 47 54 55 56 57 58 59\\\"; B=\\\"/opt/npmplus/manual-backups/stale-proxy-host-retirement-$(date -u +%Y%m%dT%H%M%SZ)\\\"; install -d -m 700 \\\"$B\\\"; python3 -c \\\"import sqlite3; s=sqlite3.connect(\\\\\\\"file:/opt/npmplus/npmplus/database.sqlite?mode=ro\\\\\\\",uri=True); d=sqlite3.connect(\\\\\\\"$B/database.sqlite.before\\\\\\\"); s.backup(d); d.close(); s.close()\\\"; chmod 600 \\\"$B/database.sqlite.before\\\"; for id in $IDS; do [ ! -e \\\"/opt/npmplus/nginx/proxy_host/$id.conf\\\" ] || cp -a \\\"/opt/npmplus/nginx/proxy_host/$id.conf\\\" \\\"$B/$id.conf.before\\\"; done; docker exec npmplus grep -q \\\"is_deleted: 1\\\" /app/internal/proxy-host.js; docker exec npmplus grep -q \\\"Delete Nginx Config\\\" /app/internal/proxy-host.js; docker exec npmplus grep -q \\\"internalNginx.reload\\\" /app/internal/proxy-host.js; C=\\\"/data${B#/opt/npmplus}\\\"; printf \\\"%s\\\\n\\\" \\\"import internalProxyHost from \\\\\\\"/app/internal/proxy-host.js\\\\\\\";\\\" \\\"const ids=[30,32,33,34,35,36,37,38,39,40,43,44,47,54,55,56,57,58,59];\\\" \\\"const access={can:async()=>({permission_visibility:\\\\\\\"all\\\\\\\"}),token=;\\\" \\\"for (const id of ids) { const ok=await internalProxyHost.delete(access,{id}); console.log(\\\\\\\"DELETED=\\\\\\\"+id+\\\\\\\":\\\\\\\"+ok); }\\\" > \\\"$B/delete-stale.mjs\\\"; chmod 644 \\\"$B/delete-stale.mjs\\\"; docker exec -u 0 npmplus node --check \\\"$C/delete-stale.mjs\\\"; echo \\\"BACKUP=$B\\\"; docker exec -u 0 npmplus node \\\"$C/delete-stale.mjs\\\"; docker exec npmplus nginx -t; echo NPMPLUS_STALE_PROXY_HOST_DELETE=PASS\\n2631784 2631782 root bash bash -lc set -euo pipefail; IDS=\\\"30 32 33 34 35 36 37 38 39 40 43 44 47 54 55 56 57 58 59\\\"; B=\\\"/opt/npmplus/manual-backups/stale-proxy-host-retirement-$(date -u +%Y%m%dT%H%M%SZ)\\\"; install -d -m 700 \\\"$B\\\"; python3 -c \\\"import sqlite3; s=sqlite3.connect(\\\\\\\"file:/opt/npmplus/npmplus/database.sqlite?mode=ro\\\\\\\",uri=True); d=sqlite3.connect(\\\\\\\"$B/database.sqlite.before\\\\\\\"); s.backup(d); d.close(); s.close()\\\"; chmod 600 \\\"$B/database.sqlite.before\\\"; for id in $IDS; do [ ! -e \\\"/opt/npmplus/nginx/proxy_host/$id.conf\\\" ] || cp -a \\\"/opt/npmplus/nginx/proxy_host/$id.conf\\\" \\\"$B/$id.conf.before\\\"; done; docker exec npmplus grep -q \\\"is_deleted: 1\\\" /app/internal/proxy-host.js; docker exec npmplus grep -q \\\"Delete Nginx Config\\\" /app/internal/proxy-host.js; docker exec npmplus grep -q \\\"internalNginx.reload\\\" /app/internal/proxy-host.js; C=\\\"/data${B#/opt/npmplus}\\\"; printf \\\"%s\\\\n\\\" \\\"import internalProxyHost from \\\\\\\"/app/internal/proxy-host.js\\\\\\\";\\\" \\\"const ids=[30,32,33,34,35,36,37,38,39,40,43,44,47,54,55,56,57,58,59];\\\" \\\"const access={can:async()=>({permission_visibility:\\\\\\\"all\\\\\\\"}),token=;\\\" \\\"for (const id of ids) { const ok=await internalProxyHost.delete(access,{id}); console.log(\\\\\\\"DELETED=\\\\\\\"+id+\\\\\\\":\\\\\\\"+ok); }\\\" > \\\"$B/delete-stale.mjs\\\"; chmod 644 \\\"$B/delete-stale.mjs\\\"; docker exec -u 0 npmplus node --check \\\"$C/delete-stale.mjs\\\"; echo \\\"BACKUP=$B\\\"; docker exec -u 0 npmplus node \\\"$C/delete-stale.mjs\\\"; docker exec npmplus nginx -t; echo NPMPLUS_STALE_PROXY_HOST_DELETE=PASS\\n--- NPMPLUS_MODE ---\\nhost\\n--- NPMPLUS_IMAGE ---\\ndocker.io/zoeyvid/npmplus:2026-06-17-b1 sha256:058637924fae1dbf161d1d78c84b738d86804e9a0ddad66cf7c87cbe33337834\\n--- NPMPLUS_NGINX_VERSION ---\\nnginx version: nginx/1.31.2 (NPMplus)\",\"rc\":0}\nFOCUSED_FRONTEND_REFERENCES={\"err\":\"\",\"out\":\"[{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":951,\\\"text\\\":\\\"URL=https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":1967,\\\"text\\\":\\\"4. The only remaining access convenience item is optional: expose the cluster-admin panel via a VPN-only/internal reverse proxy route such as `cluster-admin.vpn.gram1.ru`.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":2418,\\\"text\\\":\\\"from=\\\\\\\"[PRIVATE_IP]\\\\\\\",command=\\\\\\\"...\\\\\\\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding,no-pty\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":2454,\\\"text\\\":\\\"- Optional ports 80/443 on VM150/170/171 are not hard failures because services may live behind reverse proxy or not expose direct ports.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":2803,\\\"text\\\":\\\"Configure operator-friendly VPN reverse proxy route: cluster-admin.vpn.gram1.ru -> [PRIVATE_IP]:8080\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":2832,\\\"text\\\":\\\"8. `http://[PRIVATE_IP]:8080/` is not reachable from a normal browser outside LAN/VPN. Use VPN, SSH tunnel, or internal reverse proxy.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":4810,\\\"text\\\":\\\"- likely frontend/cache;\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":5436,\\\"text\\\":\\\"- \\\\u043a\\\\u0442\\\\u043e \\\\u043e\\\\u0442\\\\u0432\\\\u0435\\\\u0447\\\\u0430\\\\u0435\\\\u0442 \\\\u0437\\\\u0430 reverse proxy;\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":6683,\\\"text\\\":\\\"| Core | Gitea | https://git.gram1.ru | public | Git |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":7096,\\\"text\\\":\\\"- line 304: `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701`\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":7161,\\\"text\\\":\\\"| 257 | `### NAT / port forwarding` |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":7455,\\\"text\\\":\\\"| 304 | `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701` |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":7540,\\\"text\\\":\\\"- `https://git.gram1.ru`\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":8263,\\\"text\\\":\\\"### NAT / port forwarding\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":8552,\\\"text\\\":\\\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":8620,\\\"text\\\":\\\"- git.gram1.ru -> [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":8631,\\\"text\\\":\\\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":8653,\\\"text\\\":\\\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":8702,\\\"text\\\":\\\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":9006,\\\"text\\\":\\\" - https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":9062,\\\"text\\\":\\\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":9305,\\\"text\\\":\\\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":9319,\\\"text\\\":\\\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":9870,\\\"text\\\":\\\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":10101,\\\"text\\\":\\\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":10113,\\\"text\\\":\\\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":10629,\\\"text\\\":\\\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":10722,\\\"text\\\":\\\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":11033,\\\"text\\\":\\\"\\\\u0410 \\\\u0441\\\\u0430\\\\u043c\\\\u0430\\\\u044f \\\\u043a\\\\u0440\\\\u0438\\\\u0442\\\\u0438\\\\u0447\\\\u043d\\\\u0430\\\\u044f VM130 edge-vm \\\\u043d\\\\u0430\\\\u0445\\\\u043e\\\\u0434\\\\u0438\\\\u0442\\\\u0441\\\\u044f \\\\u043d\\\\u0430 pve03 \\\\u0438 \\\\u0434\\\\u0435\\\\u0440\\\\u0436\\\\u0438\\\\u0442 reverse proxy, monitoring, backup automation \\\\u0438 Docker application host. \\\\u041f\\\\u0440\\\\u0438 \\\\u044d\\\\u0442\\\\u043e\\\\u043c pve03 \\\\u2014 \\\\u0441\\\\u0430\\\\u043c\\\\u044b\\\\u0439 \\\\u043e\\\\u0433\\\\u0440\\\\u0430\\\\u043d\\\\u0438\\\\u0447\\\\u0435\\\\u043d\\\\u043d\\\\u044b\\\\u0439 \\\\u043f\\\\u043e \\\\u0434\\\\u0438\\\\u0441\\\\u043a\\\\u0443: local-lvm \\\\u0443\\\\u0436\\\\u0435 \\\\u0431\\\\u044b\\\\u043b \\\\u0441\\\\u0430\\\\u043c\\\\u044b\\\\u043c constrained, \\\\u043f\\\\u043e\\\\u0442\\\\u043e\\\\u043c\\\\u0443 \\\\u0447\\\\u0442\\\\u043e VM130 \\\\u0438\\\\u043c\\\\u0435\\\\u0435\\\\u0442 96G OS + 150G media/data, \\\\u0430 pve03 staging \\\\u0434\\\\u043e\\\\u0445\\\\u043e\\\\u0434\\\\u0438\\\\u043b \\\\u0434\\\\u043e 77% \\\\u043f\\\\u0440\\\\u0438 WARN 80%. \\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\\\",\\\"line\\\":11044,\\\"text\\\":\\\"4. \\\\u0415\\\\u0441\\\\u043b\\\\u0438 \\\\u043d\\\\u0435 \\\\u043f\\\\u0435\\\\u0440\\\\u0435\\\\u043d\\\\u043e\\\\u0441\\\\u0438\\\\u0442\\\\u044c \\\\u0441\\\\u0435\\\\u0439\\\\u0447\\\\u0430\\\\u0441, \\\\u0442\\\\u043e \\\\u043c\\\\u0438\\\\u043d\\\\u0438\\\\u043c\\\\u0443\\\\u043c \\\\u0441\\\\u0434\\\\u0435\\\\u043b\\\\u0430\\\\u0442\\\\u044c **cold standby edge-vm** \\\\u043d\\\\u0430 pve01 \\\\u0438\\\\u043b\\\\u0438 pve02: \\\\u0432\\\\u043e\\\\u0441\\\\u0441\\\\u0442\\\\u0430\\\\u043d\\\\u043e\\\\u0432\\\\u043b\\\\u0435\\\\u043d\\\\u043d\\\\u0430\\\\u044f \\\\u0438\\\\u0437 \\\\u043f\\\\u043e\\\\u0441\\\\u043b\\\\u0435\\\\u0434\\\\u043d\\\\u0435\\\\u0433\\\\u043e backup, \\\\u0432\\\\u044b\\\\u043a\\\\u043b\\\\u044e\\\\u0447\\\\u0435\\\\u043d\\\\u043d\\\\u0430\\\\u044f, \\\\u0441 \\\\u043f\\\\u043e\\\\u043d\\\\u044f\\\\u0442\\\\u043d\\\\u044b\\\\u043c runbook \\\\u043f\\\\u0435\\\\u0440\\\\u0435\\\\u043a\\\\u043b\\\\u044e\\\\u0447\\\\u0435\\\\u043d\\\\u0438\\\\u044f IP/NPMplus/router port forward.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMEPAGE_BACKUP_COVERAGE_MATRIX.md\\\",\\\"line\\\":22,\\\"text\\\":\\\"| Gitea | https://git.gram1.ru | 185 | 89 | 105 | EVIDENCE_FOUND_REVIEW |\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":315,\\\"text\\\":\\\"### NAT / port forwarding\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":604,\\\"text\\\":\\\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":672,\\\"text\\\":\\\"- git.gram1.ru -> [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":683,\\\"text\\\":\\\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":705,\\\"text\\\":\\\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":754,\\\"text\\\":\\\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":1058,\\\"text\\\":\\\" - https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":1114,\\\"text\\\":\\\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":1357,\\\"text\\\":\\\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":1371,\\\"text\\\":\\\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":1922,\\\"text\\\":\\\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2153,\\\"text\\\":\\\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2165,\\\"text\\\":\\\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2515,\\\"text\\\":\\\"- Recommended future path: establish VPN/NetBird/WireGuard or reverse-proxy/private management endpoint first; then issue DNS-01 certificate on a trusted node and deploy cert/key to the router only over that private path.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2561,\\\"text\\\":\\\"- TLS terminates on edge using certbot DNS-01 cert router-taftauto.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2872,\\\"text\\\":\\\"- Primary domain: chat.gram1.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2873,\\\"text\\\":\\\"- groups.chat.gram1.ru and share.chat.gram1.ru are Snikket service domains.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2902,\\\"text\\\":\\\"- chat.gram1.ru public A is 185.225.35.6; groups.chat.gram1.ru and share.chat.gram1.ru continue through chat.gram1.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2905,\\\"text\\\":\\\"- VM150 Internet default path is via [PRIVATE_IP] and verified public egress is 185.225.35.6.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2906,\\\"text\\\":\\\"- Effective coturn external address uses 185.225.35.6 and no longer advertises 95.84.154.183.\\\"},{\\\"path\\\":\\\"/etc/pve/31_HOMELAB_REFERENCE.md\\\",\\\"line\\\":2912,\\\"text\\\":\\\"- Public DNS observed at release: 185.225.35.6; DNS was not changed during forum cutover.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":1831,\\\"text\\\":\\\"URL=https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":2847,\\\"text\\\":\\\"4. The only remaining access convenience item is optional: expose the cluster-admin panel via a VPN-only/internal reverse proxy route such as `cluster-admin.vpn.gram1.ru`.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":3298,\\\"text\\\":\\\"from=\\\\\\\"[PRIVATE_IP]\\\\\\\",command=\\\\\\\"...\\\\\\\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding,no-pty\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":3334,\\\"text\\\":\\\"- Optional ports 80/443 on VM150/170/171 are not hard failures because services may live behind reverse proxy or not expose direct ports.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":3683,\\\"text\\\":\\\"Configure operator-friendly VPN reverse proxy route: cluster-admin.vpn.gram1.ru -> [PRIVATE_IP]:8080\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":3712,\\\"text\\\":\\\"8. `http://[PRIVATE_IP]:8080/` is not reachable from a normal browser outside LAN/VPN. Use VPN, SSH tunnel, or internal reverse proxy.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":5690,\\\"text\\\":\\\"- likely frontend/cache;\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":6316,\\\"text\\\":\\\"- \\\\u043a\\\\u0442\\\\u043e \\\\u043e\\\\u0442\\\\u0432\\\\u0435\\\\u0447\\\\u0430\\\\u0435\\\\u0442 \\\\u0437\\\\u0430 reverse proxy;\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":7563,\\\"text\\\":\\\"| Core | Gitea | https://git.gram1.ru | public | Git |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":7976,\\\"text\\\":\\\"- line 304: `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701`\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":8041,\\\"text\\\":\\\"| 257 | `### NAT / port forwarding` |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":8335,\\\"text\\\":\\\"| 304 | `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701` |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":8420,\\\"text\\\":\\\"- `https://git.gram1.ru`\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9143,\\\"text\\\":\\\"### NAT / port forwarding\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9432,\\\"text\\\":\\\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9500,\\\"text\\\":\\\"- git.gram1.ru -> [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9511,\\\"text\\\":\\\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9533,\\\"text\\\":\\\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9582,\\\"text\\\":\\\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9886,\\\"text\\\":\\\" - https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":9942,\\\"text\\\":\\\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":10185,\\\"text\\\":\\\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":10199,\\\"text\\\":\\\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":10750,\\\"text\\\":\\\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":10981,\\\"text\\\":\\\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":10993,\\\"text\\\":\\\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":11509,\\\"text\\\":\\\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":11602,\\\"text\\\":\\\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":11913,\\\"text\\\":\\\"\\\\u0410 \\\\u0441\\\\u0430\\\\u043c\\\\u0430\\\\u044f \\\\u043a\\\\u0440\\\\u0438\\\\u0442\\\\u0438\\\\u0447\\\\u043d\\\\u0430\\\\u044f VM130 edge-vm \\\\u043d\\\\u0430\\\\u0445\\\\u043e\\\\u0434\\\\u0438\\\\u0442\\\\u0441\\\\u044f \\\\u043d\\\\u0430 pve03 \\\\u0438 \\\\u0434\\\\u0435\\\\u0440\\\\u0436\\\\u0438\\\\u0442 reverse proxy, monitoring, backup automation \\\\u0438 Docker application host. \\\\u041f\\\\u0440\\\\u0438 \\\\u044d\\\\u0442\\\\u043e\\\\u043c pve03 \\\\u2014 \\\\u0441\\\\u0430\\\\u043c\\\\u044b\\\\u0439 \\\\u043e\\\\u0433\\\\u0440\\\\u0430\\\\u043d\\\\u0438\\\\u0447\\\\u0435\\\\u043d\\\\u043d\\\\u044b\\\\u0439 \\\\u043f\\\\u043e \\\\u0434\\\\u0438\\\\u0441\\\\u043a\\\\u0443: local-lvm \\\\u0443\\\\u0436\\\\u0435 \\\\u0431\\\\u044b\\\\u043b \\\\u0441\\\\u0430\\\\u043c\\\\u044b\\\\u043c constrained, \\\\u043f\\\\u043e\\\\u0442\\\\u043e\\\\u043c\\\\u0443 \\\\u0447\\\\u0442\\\\u043e VM130 \\\\u0438\\\\u043c\\\\u0435\\\\u0435\\\\u0442 96G OS + 150G media/data, \\\\u0430 pve03 staging \\\\u0434\\\\u043e\\\\u0445\\\\u043e\\\\u0434\\\\u0438\\\\u043b \\\\u0434\\\\u043e 77% \\\\u043f\\\\u0440\\\\u0438 WARN 80%. \\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\\\",\\\"line\\\":11924,\\\"text\\\":\\\"4. \\\\u0415\\\\u0441\\\\u043b\\\\u0438 \\\\u043d\\\\u0435 \\\\u043f\\\\u0435\\\\u0440\\\\u0435\\\\u043d\\\\u043e\\\\u0441\\\\u0438\\\\u0442\\\\u044c \\\\u0441\\\\u0435\\\\u0439\\\\u0447\\\\u0430\\\\u0441, \\\\u0442\\\\u043e \\\\u043c\\\\u0438\\\\u043d\\\\u0438\\\\u043c\\\\u0443\\\\u043c \\\\u0441\\\\u0434\\\\u0435\\\\u043b\\\\u0430\\\\u0442\\\\u044c **cold standby edge-vm** \\\\u043d\\\\u0430 pve01 \\\\u0438\\\\u043b\\\\u0438 pve02: \\\\u0432\\\\u043e\\\\u0441\\\\u0441\\\\u0442\\\\u0430\\\\u043d\\\\u043e\\\\u0432\\\\u043b\\\\u0435\\\\u043d\\\\u043d\\\\u0430\\\\u044f \\\\u0438\\\\u0437 \\\\u043f\\\\u043e\\\\u0441\\\\u043b\\\\u0435\\\\u0434\\\\u043d\\\\u0435\\\\u0433\\\\u043e backup, \\\\u0432\\\\u044b\\\\u043a\\\\u043b\\\\u044e\\\\u0447\\\\u0435\\\\u043d\\\\u043d\\\\u0430\\\\u044f, \\\\u0441 \\\\u043f\\\\u043e\\\\u043d\\\\u044f\\\\u0442\\\\u043d\\\\u044b\\\\u043c runbook \\\\u043f\\\\u0435\\\\u0440\\\\u0435\\\\u043a\\\\u043b\\\\u044e\\\\u0447\\\\u0435\\\\u043d\\\\u0438\\\\u044f IP/NPMplus/router port forward.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":211,\\\"text\\\":\\\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":304,\\\"text\\\":\\\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":1730,\\\"text\\\":\\\"- public_dns_root: 185.225.35.6\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":1731,\\\"text\\\":\\\"- public_dns_www: 185.225.35.6\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":2603,\\\"text\\\":\\\"2026-09-03 KOW_EXTERNAL_PUBLIC_FRONT_SERVER_VERSION_DISCLOSURE OPEN public_response_Server_nginx_1_28_3_Ubuntu direct_NPMplus_Server_absent identify_external_reverse_proxy_before_mutation\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":3035,\\\"text\\\":\\\"CERT38_NARROW_MIGRATION_20260904 | CLOSED_COMMITTED_PASS | Cert38 meta/runtime credential migrated to verified narrow gram1 token; stock npm-38 renewal dry-run succeeded for chat.gram1.ru, groups.chat.gram1.ru and share.chat.gram1.ru.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":3100,\\\"text\\\":\\\"EDGE01_SSH_HOSTKEY_UNKNOWN_20260904 | OPEN | Strict SSH to 185.225.35.6 stopped before authentication because no pinned ED25519 host key exists for the IP; no remote state changed and no unverified key was accepted.\\\"},{\\\"path\\\":\\\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":3112,\\\"text\\\":\\\"PUBLIC_SERVER_VERSION_HARDENING_RUNTIME_MISMATCH_20260904 | CLOSED_PARTIAL_BLOCKED_EXTERNAL_INGRESS | VM130 NPMplus now has server_tokens off on all 13 public manual vhosts and direct-edge responses expose no Server header; public nginx/1.28.3 (Ubuntu) is emitted by EDGE01 185.225.35.6. kingofwolk.ru proves EDGE01 supports per-vhost server_tokens off, but external mutation is blocked until an authorized EDGE01 management credential is restored.\\\"},{\\\"path\\\":\\\"/root/finish_skladchik_cr_2026_0010_v2.sh\\\",\\\"line\\\":20,\\\"text\\\":\\\"API=https://git.gram1.ru/api/v1/repos/homelab-admin/homelab-ops\\\"},{\\\"path\\\":\\\"/root/774c_dockge_agent_capability_inspect.sh\\\",\\\"line\\\":70,\\\"text\\\":\\\" for f in /app/package.json /app/backend/package.json /app/frontend/package.json; do\\\"},{\\\"path\\\":\\\"/root/771h_crowdsec_capi_register_correct_sequence.sh\\\",\\\"line\\\":453,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/771d_crowdsec_capi_via_privoxy_tor.sh\\\",\\\"line\\\":64,\\\"text\\\":\\\"export DEBIAN_FRONTEND=noninteractive\\\"},{\\\"path\\\":\\\"/root/771d_crowdsec_capi_via_privoxy_tor.sh\\\",\\\"line\\\":314,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/771w_pve01_netbird_ssh_egress_crowdsec_capi.sh\\\",\\\"line\\\":586,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/HOMELAB_READONLY_SERVICE_CENSUS_20260816T065015Z.txt\\\",\\\"line\\\":4306,\\\"text\\\":\\\" \\\\\\\"out-data\\\\\\\" : \\\\\\\"GUEST_BEGIN|host=forum-prod|utc=2026-08-16T06:50:56Z\\\\\\\\nPRETTY_NAME=\\\\\\\\\\\\\\\"Debian GNU/Linux 12 (bookworm)\\\\\\\\\\\\\\\"\\\\\\\\nVERSION_ID=\\\\\\\\\\\\\\\"12\\\\\\\\\\\\\\\"\\\\\\\\nID=debian\\\\\\\\n\\\\\\\\n--- GUEST_DF ---\\\\\\\\nFilesystem Type Size Used Avail Use% Mounted on\\\\\\\\nudev devtmpfs 3.9G 0 3.9G 0% /dev\\\\\\\\ntmpfs tmpfs 796M 512K 795M 1% /run\\\\\\\\n/dev/sda1 ext4 197G 15G 175G 8% /\\\\\\\\ntmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm\\\\\\\\ntmpfs tmpfs 5.0M 0 5.0M 0% /run/lock\\\\\\\\n/dev/sda15 vfat 124M 12M 112M 10% /boot/efi\\\\\\\\n\\\\\\\\n--- GUEST_FAILED_UNITS ---\\\\\\\\nUNIT LOAD ACTIVE SUB DESCRIPTION\\\\\\\\n0 loaded units listed.\\\\\\\\n\\\\\\\\n--- GUEST_RUNNING_SERVICES ---\\\\\\\\nUNIT LOAD ACTIVE SUB DESCRIPTION\\\\\\\\nchrony.service loaded active running chrony, an NTP client/server\\\\\\\\ncron.service loaded active running Regular background program processing daemon\\\\\\\\ndbus.service loaded active running D-Bus System Message Bus\\\\\\\\ngetty@tty1.service loaded active running Getty on tty1\\\\\\\\nmariadb.service loaded active running MariaDB 10.11.18 database server\\\\\\\\nnginx.service loaded active running A high \\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":1665,\\\"text\\\":\\\"DOMAIN = git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":1668,\\\"text\\\":\\\"ROOT_URL = https://git.gram1.ru/\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":1705,\\\"text\\\":\\\"REVERSE_PROXY_LIMIT = 1\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":1706,\\\"text\\\":\\\"REVERSE_PROXY_TRUSTED_PROXIES = *\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":1902,\\\"text\\\":\\\"# Load frontend themes from the themes folder\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":1903,\\\"text\\\":\\\"frontend:\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":2955,\\\"text\\\":\\\"9 [\\\\\\\"git.gram1.ru\\\\\\\"] 1 custom 0 none 0 0 SAMEORIGIN 1 \\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":3524,\\\"text\\\":\\\"# git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":3536,\\\"text\\\":\\\" server_name git.gram1.ru;\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":10159,\\\"text\\\":\\\"dns_server=[PRIVATE_IP] domain=git.gram1.ru A=[PRIVATE_IP] \\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":10165,\\\"text\\\":\\\"dns_server=[PRIVATE_IP] domain=git.gram1.ru A=[PRIVATE_IP] \\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":23215,\\\"text\\\":\\\"git.gram1.ru,[PRIVATE_IP],optional-empty,http://127.0.0.1:3002,LAN-only,cloudflare-dns-challenge\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":23264,\\\"text\\\":\\\"| Gitea | 127.0.0.1:3002 | https://git.gram1.ru |\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":23304,\\\"text\\\":\\\"Homelab gram1.ru \\\\u043f\\\\u043e\\\\u0441\\\\u0442\\\\u0440\\\\u043e\\\\u0435\\\\u043d \\\\u0432\\\\u043e\\\\u043a\\\\u0440\\\\u0443\\\\u0433 Proxmox-\\\\u043a\\\\u043b\\\\u0430\\\\u0441\\\\u0442\\\\u0435\\\\u0440\\\\u0430, \\\\u0432\\\\u043d\\\\u0443\\\\u0442\\\\u0440\\\\u0435\\\\u043d\\\\u043d\\\\u0435\\\\u0433\\\\u043e DNS, NPMplus reverse proxy, \\\\u043c\\\\u043e\\\\u043d\\\\u0438\\\\u0442\\\\u043e\\\\u0440\\\\u0438\\\\u043d\\\\u0433\\\\u0430, backup \\\\u0438 \\\\u043d\\\\u0430\\\\u0431\\\\u043e\\\\u0440\\\\u0430 self-hosted \\\\u0441\\\\u0435\\\\u0440\\\\u0432\\\\u0438\\\\u0441\\\\u043e\\\\u0432.\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":23647,\\\"text\\\":\\\"- edge-vm hosting reverse proxy and most application containers.\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":23719,\\\"text\\\":\\\"- Purpose: reverse proxy and TLS termination.\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":23782,\\\"text\\\":\\\"- Domain: https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24054,\\\"text\\\":\\\"- Remote: https://git.gram1.ru/homelab-admin/homelab-configs\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24193,\\\"text\\\":\\\"- https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24406,\\\"text\\\":\\\"| git.gram1.ru | http://127.0.0.1:3002 | yes | LAN only | git.gram1.ru | enabled |\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24438,\\\"text\\\":\\\"| git.gram1.ru | letsencrypt | 2026-09-13 17:36:55 |\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24465,\\\"text\\\":\\\"| `git.gram1.ru` | `http://127.0.0.1:3002` | cert id 29 | yes | Gitea |\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24708,\\\"text\\\":\\\"5. Recover reverse proxy/Kuma/Auth/Gitea/Vaultwarden and service configs.\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":24721,\\\"text\\\":\\\"git clone https://git.gram1.ru/homelab-admin/homelab-configs.git\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":25074,\\\"text\\\":\\\"git clone https://git.gram1.ru/homelab-admin/homelab-configs.git\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\\\",\\\"line\\\":25411,\\\"text\\\":\\\"- reverse proxy upstream;\\\"},{\\\"path\\\":\\\"/root/771_crowdsec_capi_ipv4_restore_or_fallback.sh\\\",\\\"line\\\":326,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":211,\\\"text\\\":\\\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\\\"},{\\\"path\\\":\\\"/root/HOMELAB_ASSISTANT_ERROR_REGISTER.md\\\",\\\"line\\\":304,\\\"text\\\":\\\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\\\"},{\\\"path\\\":\\\"/root/772b_homepage_russian_normalize_apply.sh\\\",\\\"line\\\":89,\\\"text\\\":\\\" \\\\\\\"NPMplus\\\\\\\": \\\\\\\"\\\\u0410\\\\u0434\\\\u043c\\\\u0438\\\\u043d\\\\u0438\\\\u0441\\\\u0442\\\\u0440\\\\u0438\\\\u0440\\\\u043e\\\\u0432\\\\u0430\\\\u043d\\\\u0438\\\\u0435 reverse proxy.\\\\\\\",\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":1316,\\\"text\\\":\\\"IP_ROUTE|185.225.35.6 via [PRIVATE_IP] dev eth0 src [PRIVATE_IP] \\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2390,\\\"text\\\":\\\"NPM_ROW|proxy_host|{\\\\\\\"domain_names\\\\\\\":\\\\\\\"[\\\\\\\\\\\\\\\"git.gram1.ru\\\\\\\\\\\\\\\"]\\\\\\\",\\\\\\\"enabled\\\\\\\":1,\\\\\\\"forward_host\\\\\\\":\\\\\\\"127.0.0.1\\\\\\\",\\\\\\\"forward_port\\\\\\\":3002,\\\\\\\"forward_scheme\\\\\\\":\\\\\\\"http\\\\\\\",\\\\\\\"id\\\\\\\":9}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2433,\\\"text\\\":\\\"NPM_ROW|proxy_host|{\\\\\\\"domain_names\\\\\\\":\\\\\\\"[\\\\\\\\\\\\\\\"chat.gram1.ru\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"groups.chat.gram1.ru\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"share.chat.gram1.ru\\\\\\\\\\\\\\\"]\\\\\\\",\\\\\\\"enabled\\\\\\\":1,\\\\\\\"forward_host\\\\\\\":\\\\\\\"[PRIVATE_IP]\\\\\\\",\\\\\\\"forward_port\\\\\\\":443,\\\\\\\"forward_scheme\\\\\\\":\\\\\\\"https\\\\\\\",\\\\\\\"id\\\\\\\":61}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2440,\\\"text\\\":\\\"NPM_ROW|certificate|{\\\\\\\"domain_names\\\\\\\":\\\\\\\"[\\\\\\\\\\\\\\\"git.gram1.ru\\\\\\\\\\\\\\\"]\\\\\\\",\\\\\\\"id\\\\\\\":29,\\\\\\\"nice_name\\\\\\\":\\\\\\\"git.gram1.ru\\\\\\\",\\\\\\\"provider\\\\\\\":\\\\\\\"letsencrypt\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2445,\\\"text\\\":\\\"NPM_ROW|certificate|{\\\\\\\"domain_names\\\\\\\":\\\\\\\"[\\\\\\\\\\\\\\\"chat.gram1.ru\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"groups.chat.gram1.ru\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"share.chat.gram1.ru\\\\\\\\\\\\\\\"]\\\\\\\",\\\\\\\"id\\\\\\\":38,\\\\\\\"nice_name\\\\\\\":\\\\\\\"chat.gram1.ru, groups.chat.gram1.ru, share.chat.gram1.ru\\\\\\\",\\\\\\\"provider\\\\\\\":\\\\\\\"letsencrypt\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2456,\\\"text\\\":\\\"DOMAIN|chat.gram1.ru\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2464,\\\"text\\\":\\\"DOMAIN|git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2468,\\\"text\\\":\\\"DOMAIN|groups.chat.gram1.ru\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2495,\\\"text\\\":\\\"DOMAIN|share.chat.gram1.ru\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2607,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"[PRIVATE_IP]\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[\\\\\\\";;\\\\\\\",\\\\\\\"communications\\\\\\\",\\\\\\\"error\\\\\\\",\\\\\\\"to\\\\\\\",\\\\\\\"100.100.131.41#53:\\\\\\\",\\\\\\\"timed\\\\\\\",\\\\\\\"out\\\\\\\",\\\\\\\";;\\\\\\\",\\\\\\\"no\\\\\\\",\\\\\\\"servers\\\\\\\",\\\\\\\"could\\\\\\\",\\\\\\\"be\\\\\\\",\\\\\\\"reached\\\\\\\"],\\\\\\\"domain\\\\\\\":\\\\\\\"chat.gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"302|[PRIVATE_IP]|https://chat.gram1.ru/login\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2610,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"codevipe.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2615,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[\\\\\\\";;\\\\\\\",\\\\\\\"communications\\\\\\\",\\\\\\\"error\\\\\\\",\\\\\\\"to\\\\\\\",\\\\\\\"100.100.131.41#53:\\\\\\\",\\\\\\\"timed\\\\\\\",\\\\\\\"out\\\\\\\",\\\\\\\";;\\\\\\\",\\\\\\\"no\\\\\\\",\\\\\\\"servers\\\\\\\",\\\\\\\"could\\\\\\\",\\\\\\\"be\\\\\\\",\\\\\\\"reached\\\\\\\"],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"dsmods.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2617,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"gamevipe.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2618,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"git-read.gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2619,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\";;\\\\\\\",\\\\\\\"communications\\\\\\\",\\\\\\\"error\\\\\\\",\\\\\\\"to\\\\\\\",\\\\\\\"100.100.131.41#53:\\\\\\\",\\\\\\\"timed\\\\\\\",\\\\\\\"out\\\\\\\",\\\\\\\";;\\\\\\\",\\\\\\\"no\\\\\\\",\\\\\\\"servers\\\\\\\",\\\\\\\"could\\\\\\\",\\\\\\\"be\\\\\\\",\\\\\\\"reached\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"git.gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|[PRIVATE_IP]|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2623,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"303|185.225.35.6|https://gram1.ru/login\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2624,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"[PRIVATE_IP]\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[\\\\\\\";;\\\\\\\",\\\\\\\"communications\\\\\\\",\\\\\\\"error\\\\\\\",\\\\\\\"to\\\\\\\",\\\\\\\"100.100.131.41#53:\\\\\\\",\\\\\\\"timed\\\\\\\",\\\\\\\"out\\\\\\\",\\\\\\\";;\\\\\\\",\\\\\\\"no\\\\\\\",\\\\\\\"servers\\\\\\\",\\\\\\\"could\\\\\\\",\\\\\\\"be\\\\\\\",\\\\\\\"reached\\\\\\\"],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"groups.chat.gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|[PRIVATE_IP]|https://chat.gram1.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2625,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"hapusya.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2626,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"hbarhub.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2627,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"hkmods.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2635,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"kingofwolk.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2645,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"newfi.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2646,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"newfilya.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2656,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[\\\\\\\"10\\\\\\\",\\\\\\\"mail.pvepro.ru.\\\\\\\"],\\\\\\\"domain\\\\\\\":\\\\\\\"pvepro.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"303|185.225.35.6|https://pvepro.ru/login\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2659,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"[PRIVATE_IP]\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"share.chat.gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|[PRIVATE_IP]|https://chat.gram1.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2661,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"taftauto.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2666,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.codevipe.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|185.225.35.6|https://codevipe.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2667,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.dsmods.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|185.225.35.6|https://dsmods.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2668,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.gamevipe.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|185.225.35.6|https://gamevipe.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2669,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[\\\\\\\";;\\\\\\\",\\\\\\\"communications\\\\\\\",\\\\\\\"error\\\\\\\",\\\\\\\"to\\\\\\\",\\\\\\\"100.100.131.41#53:\\\\\\\",\\\\\\\"timed\\\\\\\",\\\\\\\"out\\\\\\\",\\\\\\\";;\\\\\\\",\\\\\\\"no\\\\\\\",\\\\\\\"servers\\\\\\\",\\\\\\\"could\\\\\\\",\\\\\\\"be\\\\\\\",\\\\\\\"reached\\\\\\\"],\\\\\\\"domain\\\\\\\":\\\\\\\"www.gram1.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"303|185.225.35.6|https://www.gram1.ru/login\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2670,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.hapusya.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2671,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.hbarhub.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2672,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.hkmods.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|185.225.35.6|https://hkmods.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2673,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.kingofwolk.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2674,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.newfi.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2675,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.newfilya.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2676,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.pvepro.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"303|185.225.35.6|https://www.pvepro.ru/login\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2677,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.taftauto.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2678,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"www.zakrutim.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"301|185.225.35.6|https://zakrutim.ru/\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\\\",\\\"line\\\":2679,\\\"text\\\":\\\"DOMAIN_STATE|{\\\\\\\"A\\\\\\\":[\\\\\\\"185.225.35.6\\\\\\\"],\\\\\\\"AAAA\\\\\\\":[],\\\\\\\"MX\\\\\\\":[],\\\\\\\"domain\\\\\\\":\\\\\\\"zakrutim.ru\\\\\\\",\\\\\\\"https\\\\\\\":\\\\\\\"200|185.225.35.6|\\\\\\\"}\\\"},{\\\"path\\\":\\\"/root/diag-pve03-dns2-20260615T091114Z.txt\\\",\\\"line\\\":261,\\\"text\\\":\\\"debug1: Remote: [SENSITIVE_PATH] key options: agent-forwarding port-forwarding pty user-rc x11-forwarding\\\"},{\\\"path\\\":\\\"/root/diag-pve03-dns2-20260615T091114Z.txt\\\",\\\"line\\\":263,\\\"text\\\":\\\"debug1: Remote: [SENSITIVE_PATH] key options: agent-forwarding port-forwarding pty user-rc x11-forwarding\\\"},{\\\"path\\\":\\\"/root/771x_crowdsec_capi_mtu_hardfix.sh\\\",\\\"line\\\":542,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/771f_crowdsec_capi_godebug_mss_fix.sh\\\",\\\"line\\\":344,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/771l_crowdsec_capi_netbird_vps_egress.sh\\\",\\\"line\\\":695,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/homelab_network_equipment_audit_20260623T170441Z.txt\\\",\\\"line\\\":154,\\\"text\\\":\\\"--- git.gram1.ru ---\\\"},{\\\"path\\\":\\\"/root/homelab_network_equipment_audit_20260623T170441Z.txt\\\",\\\"line\\\":155,\\\"text\\\":\\\"[PRIVATE_IP] STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/767_deep_tail_and_regression_audit.sh\\\",\\\"line\\\":40,\\\"text\\\":\\\" echo \\\\\\\"1 reverse_proxy_upstream_and_headers\\\\\\\"\\\"},{\\\"path\\\":\\\"/root/767_deep_tail_and_regression_audit.sh\\\",\\\"line\\\":70,\\\"text\\\":\\\" auth.gram1.ru photos.gram1.ru homeassistant.vpn.gram1.ru vault.gram1.ru git.gram1.ru paper.gram1.ru \\\\\\\\\\\"},{\\\"path\\\":\\\"/root/Workers2_AUDIT0_collect_2026-08-23.sh\\\",\\\"line\\\":15,\\\"text\\\":\\\"GITEA_HOST=\\\\\\\"${AUDIT_GITEA_HOST:-git.gram1.ru}\\\\\\\"\\\"},{\\\"path\\\":\\\"/root/Workers2_AUDIT0_collect_2026-08-23.sh\\\",\\\"line\\\":16,\\\"text\\\":\\\"GITEA_REPO=\\\\\\\"${AUDIT_GITEA_REPO:-https://git.gram1.ru/homelab-admin/homelab-ops.git}\\\\\\\"\\\"},{\\\"path\\\":\\\"/root/homelab-clean-machine-bootstrap-rehearsal-v1.sh\\\",\\\"line\\\":92,\\\"text\\\":\\\"export DEBIAN_FRONTEND=noninteractive\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":101,\\\"text\\\":\\\"--- git.gram1.ru ---\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":102,\\\"text\\\":\\\"[PRIVATE_IP] STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":1479,\\\"text\\\":\\\" - domain: git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":1545,\\\"text\\\":\\\"### resolve git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":1546,\\\"text\\\":\\\"95.84.154.183 STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":1739,\\\"text\\\":\\\"### resolve git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":1740,\\\"text\\\":\\\"95.84.154.183 STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":2028,\\\"text\\\":\\\" - domain: git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":2091,\\\"text\\\":\\\"### resolve git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":2092,\\\"text\\\":\\\"95.84.154.183 STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":2265,\\\"text\\\":\\\"### resolve git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":2266,\\\"text\\\":\\\"95.84.154.183 STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":3358,\\\"text\\\":\\\" GITEA__server__DOMAIN: git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":3359,\\\"text\\\":\\\" GITEA__server__ROOT_URL: https://git.gram1.ru/\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":3668,\\\"text\\\":\\\"9 [\\\\\\\"git.gram1.ru\\\\\\\"] http 127.0.0.1 3002 29 1 0 0 1 1 0 0 1 \\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":3718,\\\"text\\\":\\\"29 git.gram1.ru [\\\\\\\"git.gram1.ru\\\\\\\"] letsencrypt 2026-09-13 17:36:55\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":3855,\\\"text\\\":\\\" href: https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":3910,\\\"text\\\":\\\" description: Reverse proxy admin\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":5196,\\\"text\\\":\\\"### DNS git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":5197,\\\"text\\\":\\\"[PRIVATE_IP] STREAM git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\\\",\\\"line\\\":5322,\\\"text\\\":\\\"https://git.gram1.ru/ => 200\\\"},{\\\"path\\\":\\\"/root/CR0085_IMPLEMENTATION_INPUT_20260819.txt\\\",\\\"line\\\":1358,\\\"text\\\":\\\" \\\\\\\"out-data\\\\\\\" : \\\\\\\"UNIT_BEGIN\\\\\\\\n# /etc/systemd/system/homelab-git-read.service\\\\\\\\n[Unit]\\\\\\\\nDescription=Read-only Gitea facade for ChatGPT\\\\\\\\nAfter=network-online.target\\\\\\\\nWants=network-online.target\\\\\\\\n\\\\\\\\n[Service]\\\\\\\\nType=simple\\\\\\\\nUser=gitread\\\\\\\\nGroup=gitread\\\\\\\\nExecStart=/usr/bin/python3 /usr/local/libexec/homelab-git-read\\\\\\\\nRestart=on-failure\\\\\\\\nRestartSec=2\\\\\\\\nNoNewPrivileges=true\\\\\\\\nPrivateTmp=true\\\\\\\\nPrivateDevices=true\\\\\\\\nProtectSystem=strict\\\\\\\\nProtectHome=true\\\\\\\\nProtectKernelTunables=true\\\\\\\\nProtectKernelModules=true\\\\\\\\nProtectControlGroups=true\\\\\\\\nRestrictAddressFamilies=AF_INET AF_INET6\\\\\\\\nLockPersonality=true\\\\\\\\nMemoryDenyWriteExecute=true\\\\\\\\n\\\\\\\\n[Install]\\\\\\\\nWantedBy=multi-user.target\\\\\\\\nUNIT_END\\\\\\\\nSOURCE_BEGIN\\\\\\\\nd6110a75f789e56231196c314046263785a795ce3d220de9272777a718bca382 /usr/local/libexec/homelab-git-read\\\\\\\\n#!/usr/bin/env python3\\\\\\\\nfrom __future__ import annotations\\\\\\\\nimport base64, json, os, re\\\\\\\\nfrom http.server import BaseHTTPRequestHandler, ThreadingHTTPServer\\\\\\\\nfrom urllib.parse import parse_qs, quote, urlparse\\\\\\\\nfrom urllib.request import Request, urlopen\\\\\\\\nfrom urllib.error import HTTPError, URLError\\\\\\\\n\\\\\\\\nHOST=\\\\\\\\\\\\\\\"0.0.0.0\\\\\\\\\\\\\\\"\\\\\\\\nPORT=8787\\\\\\\\nAPI=\\\\\\\\\\\\\\\"https://git.gram1.ru/api/v1/repos/homelab-admin/homelab-ops\\\\\\\\\\\\\\\"\\\\\\\\nTOKEN_FILE=\\\\\\\\\\\"},{\\\"path\\\":\\\"/root/771j_crowdsec_capi_via_cloudflare_warp_proxy.sh\\\",\\\"line\\\":228,\\\"text\\\":\\\" export DEBIAN_FRONTEND=noninteractive\\\"},{\\\"path\\\":\\\"/root/771j_crowdsec_capi_via_cloudflare_warp_proxy.sh\\\",\\\"line\\\":567,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/771k_fix_warp_register_or_clean.sh\\\",\\\"line\\\":569,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/Workers2_AUDIT1_deep_collect_20260823_v1.py\\\",\\\"line\\\":24,\\\"text\\\":\\\"GITEA_REPO = \\\\\\\"https://git.gram1.ru/homelab-admin/homelab-ops.git\\\\\\\"\\\"},{\\\"path\\\":\\\"/root/Workers2_AUDIT1_deep_collect_20260823_v1.py\\\",\\\"line\\\":25,\\\"text\\\":\\\"GITEA_HOST = \\\\\\\"git.gram1.ru\\\\\\\"\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":257,\\\"text\\\":\\\"### NAT / port forwarding\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":546,\\\"text\\\":\\\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":614,\\\"text\\\":\\\"- git.gram1.ru -> [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":625,\\\"text\\\":\\\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":647,\\\"text\\\":\\\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":696,\\\"text\\\":\\\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":1000,\\\"text\\\":\\\" - https://git.gram1.ru\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":1056,\\\"text\\\":\\\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":1299,\\\"text\\\":\\\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":1313,\\\"text\\\":\\\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":1864,\\\"text\\\":\\\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":2095,\\\"text\\\":\\\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":2107,\\\"text\\\":\\\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":2457,\\\"text\\\":\\\"- Recommended future path: establish VPN/NetBird/WireGuard or reverse-proxy/private management endpoint first; then issue DNS-01 certificate on a trusted node and deploy cert/key to the router only over that private path.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":2503,\\\"text\\\":\\\"- TLS terminates on edge using certbot DNS-01 cert router-taftauto.ru.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":2814,\\\"text\\\":\\\"- Primary domain: chat.gram1.ru.\\\"},{\\\"path\\\":\\\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\\\",\\\"line\\\":2815,\\\"text\\\":\\\"- groups.chat.gram1.ru and share.chat.gram1.ru are Snikket service domains.\\\"},{\\\"path\\\":\\\"/root/hread-06.py\\\",\\\"line\\\":108,\\\"text\\\":\\\" if (u.scheme != 'https' or u.netloc != 'git.gram1.ru' or\\\"},{\\\"path\\\":\\\"/root/771e_abort_cleanup_verify_stable.sh\\\",\\\"line\\\":100,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/hread-04.py\\\",\\\"line\\\":104,\\\"text\\\":\\\" if (u.scheme != 'https' or u.netloc != 'git.gram1.ru' or\\\"},{\\\"path\\\":\\\"/root/771s_vps_identity_repair_netbird_capi.sh\\\",\\\"line\\\":704,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/771q_netbird_public_vps_repair_then_capi.sh\\\",\\\"line\\\":594,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\\\"},{\\\"path\\\":\\\"/root/build_full_8020_demonov_handoff.sh\\\",\\\"line\\\":351,\\\"text\\\":\\\"https://git.gram1.ru/homelab-admin/8020-demonov-shadow-bot.git\\\"},{\\\"path\\\":\\\"/root/771ae_crowdsec_capi_soak_final.sh\\\",\\\"line\\\":105,\\\"text\\\":\\\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.r...\nSSH_CONFIG_REFERENCES=[{\"line\":\"# users, and the values can be changed in per-user configuration files\",\"path\":\"/etc/ssh/ssh_config\"},{\"line\":\"Host *\",\"path\":\"/etc/ssh/ssh_config\"},{\"line\":\"# ProxyCommand ssh -q -W %h:%p gateway.example.com\",\"path\":\"/etc/ssh/ssh_config\"}]\nFINAL_DECISION=FRONTEND_FORENSIC3_COMPLETE_NO_MUTATION\nFORENSIC3_END=true\n" + "output": "ERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nSB043G_PRESTATE={\"active_env\":{\"APP_IMAGE\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"CODE_IDENTITY\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"COLLECTION_START_AT\":\"2026-09-07T00:00:00+00:00\",\"EXPERIMENT_ID\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"RUNTIME_MANIFEST_ID\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"new_image_id\":\"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99\",\"services\":[{\"container_id\":\"a546a70c3e8c263d9b590cd78ee206bcda0cfcdb6662327e8415ca0e29ad1501\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":14,\"running\":true,\"service\":\"collector\",\"started_at\":\"2026-09-08T07:38:09.79483772Z\"},{\"container_id\":\"d8023f4cbf91f9382e39eec0436c9cebc7665535b42b950e95408c03ff9bf30d\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":0,\"running\":true,\"service\":\"relay\",\"started_at\":\"2026-09-06T18:48:20.603414848Z\"},{\"container_id\":\"1feeca2d9428cd5a277c026bef34534db307657dcdcd63aff98ea66e44f8b9c5\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":0,\"running\":true,\"service\":\"shadow\",\"started_at\":\"2026-09-06T18:48:20.768190553Z\"},{\"container_id\":\"889be41d2cee9d327811da78388f834ba6eafe4c0eeae456867ed0df76832d01\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"restart_count\":0,\"running\":true,\"service\":\"worker\",\"started_at\":\"2026-09-06T18:48:20.586788319Z\"}],\"stage_result\":{\"active_env_unchanged\":true,\"build_context\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5\",\"collector_source_sha256\":\"193dd0c7f9890fdb4026c24dbc5add825f1641d92097e881806705ca452812d5\",\"copy_source\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/demonov_forward_map\",\"decision\":\"DEPLOY_STAGE_READY\",\"dockerfile\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/Dockerfile\",\"helper_candidates\":{\"demonov_forward_map.live_prospective\":[{\"name\":\"_hash\",\"pure_candidate\":true,\"signature\":\"(value: 'object') -> 'str'\"}],\"demonov_forward_map.runtime_integrity\":[{\"name\":\"canonical_hash\",\"pure_candidate\":true,\"signature\":\"(payload: 'Any') -> 'str'\"},{\"name\":\"verify_experiment_seal_receipt\",\"pure_candidate\":true,\"signature\":\"(*, bundle: 'FinalProspectiveSealBundle', receipt: 'ExperimentSealReceipt', collection_start_at: 'datetime', receipt_verifier: 'Callable[[ExperimentSealReceipt], bool]') -> 'None'\"},{\"name\":\"required_retained_hashes\",\"pure_candidate\":true,\"signature\":\"(*, runtime_registry: 'RuntimeRegistry', model_registry: 'FinalModelRegistry', state_snapshots: 'Sequence[StateSnapshotManifest]' = (), predictor_runtime: 'PredictorRuntimeManifest | None' = None) -> 'Mapping[str, RetainedArtifactKind]'\"}],\"demonov_forward_map.runtime_manifest\":[{\"name\":\"canonical_hash\",\"pure_candidate\":true,\"signature\":\"(payload: 'Any') -> 'str'\"},{\"name\":\"verify_runtime_manifest\",\"pure_candidate\":true,\"signature\":\"(manifest: 'RuntimeDeploymentManifestV1', *, expected_code_identity: 'str', actual_image_id: 'str', actual_package_identity: 'str') -> 'None'\"}]},\"new_image\":\"8020-demonov-shadow:76e1f58baa544a0e208bba317f0150e5b6d74dbd\",\"new_image_id\":\"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99\",\"policy\":{\"close_timeout\":5,\"open_timeout\":10,\"ping_interval\":20,\"ping_timeout\":60},\"runtime_activated\":false,\"service_identity_unchanged\":true,\"stage_path\":\"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5\",\"websockets_version\":\"15.0.1\"}}\nSB043G_MANIFEST_CLASS_CONTRACT={\"class\":\"RuntimeDeploymentManifestV1\",\"decorators\":[\"dataclass(frozen=True)\"],\"fields\":[\"runtime_manifest_id\",\"code_identity\",\"package_identity\",\"application_image_id\",\"base_image_digest\",\"compose_hash\",\"finality_policy_id\"],\"identity_methods\":[{\"args\":[\"self\"],\"decorators\":[\"property\"],\"kwonly\":[],\"name\":\"content_hash\",\"source\":\"def content_hash(self) -> str:\\n return canonical_hash(\\n {\\n \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\\n \\\"compose_hash\\\": self.compose_hash,\\n \\\"finality_policy_id\\\": self.finality_policy_id,\\n }\\n )\",\"source_sha256\":\"5ca3618001bfac422d4ff365e429f2f057196f3b78d67cd666458d4db2011e4b\"},{\"args\":[\"self\"],\"decorators\":[],\"kwonly\":[],\"name\":\"__post_init__\",\"source\":\"def __post_init__(self) -> None:\\n _sha256_hex(self.runtime_manifest_id, \\\"runtime manifest id\\\")\\n _required(self.code_identity, \\\"code identity\\\")\\n if _GIT_ID_RE.fullmatch(self.code_identity) is None:\\n raise DemonovError(\\n \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\\n _sha256_hex(self.compose_hash, \\\"compose hash\\\")\\n _required(self.finality_policy_id, \\\"finality policy id\\\")\\n if self.runtime_manifest_id != self.content_hash:\\n raise DemonovError(\\n \\\"runtime manifest id must be content-addressed\\\"\\n )\",\"source_sha256\":\"bb8a8ccd8a52d6d3ac094e6e8abecdc4aeb6edaf8094d2c6477a0cd0d26fa868\"},{\"args\":[\"cls\"],\"decorators\":[\"classmethod\"],\"kwonly\":[\"code_identity\",\"package_identity\",\"application_image_id\",\"base_image_digest\",\"compose_hash\",\"finality_policy_id\"],\"name\":\"build\",\"source\":\"def build(\\n cls,\\n *,\\n code_identity: str,\\n package_identity: str,\\n application_image_id: str,\\n base_image_digest: str,\\n compose_hash: str,\\n finality_policy_id: str,\\n ) -> \\\"RuntimeDeploymentManifestV1\\\":\\n payload = {\\n \\\"code_identity\\\": code_identity,\\n \\\"package_identity\\\": package_identity,\\n \\\"application_image_id\\\": application_image_id,\\n \\\"base_image_digest\\\": base_image_digest,\\n \\\"compose_hash\\\": compose_hash,\\n \\\"finality_policy_id\\\": finality_policy_id,\\n }\\n runtime_manifest_id = canonical_hash(\\n {\\n \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n **payload,\\n }\\n )\\n return cls(\\n runtime_manifest_id=runtime_manifest_id,\\n **payload,\\n )\",\"source_sha256\":\"1b6e558b28eb2a46959d4761d391e7e755188743919bddb6f19365278d731655\"}]}\nSB043G_EXPERIMENT_CLASS_CONTRACT={\"class\":\"ExperimentProvenance\",\"decorators\":[\"dataclass(frozen=True)\"],\"fields\":[\"experiment_id\",\"collection_start_at\",\"code_identity\",\"policy_registry_id\",\"market_bundle_id\",\"geometry_policy_id\",\"demonov_branch_policy_id\",\"notification_policy_id\",\"outcome_policy_id\",\"experiment_version\",\"finality_policy_id\",\"runtime_manifest_id\"],\"identity_methods\":[{\"args\":[\"self\"],\"decorators\":[],\"kwonly\":[],\"name\":\"_base_hash_payload\",\"source\":\"def _base_hash_payload(self) -> dict:\\n return {\\n \\\"collection_start_at\\\": self.collection_start_at.isoformat(),\\n \\\"code_identity\\\": self.code_identity,\\n \\\"policy_registry_id\\\": self.policy_registry_id,\\n \\\"market_bundle_id\\\": self.market_bundle_id,\\n \\\"geometry_policy_id\\\": self.geometry_policy_id,\\n \\\"demonov_branch_policy_id\\\": self.demonov_branch_policy_id,\\n \\\"notification_policy_id\\\": self.notification_policy_id,\\n \\\"outcome_policy_id\\\": self.outcome_policy_id,\\n }\",\"source_sha256\":\"5c0856d58b2198065cead5610b07495683872df3c1102c76275626ef39077bbe\"},{\"args\":[\"self\"],\"decorators\":[\"property\"],\"kwonly\":[],\"name\":\"content_hash\",\"source\":\"def content_hash(self) -> str:\\n payload = self._base_hash_payload()\\n if self.experiment_version == \\\"LIVE_PROSPECTIVE_V1\\\":\\n return _hash(payload)\\n if self.experiment_version == \\\"LIVE_PROSPECTIVE_V2\\\":\\n payload.update({\\n \\\"experiment_version\\\": self.experiment_version,\\n \\\"finality_policy_id\\\": self.finality_policy_id,\\n \\\"runtime_manifest_id\\\": self.runtime_manifest_id,\\n })\\n return _hash(payload)\\n raise DemonovError(\\\"experiment provenance version invalid\\\")\",\"source_sha256\":\"6c1f33004948b1a62c9ae567c7556ab6d3ccb414d8fdd0ea641ad24e2577914a\"},{\"args\":[\"self\"],\"decorators\":[],\"kwonly\":[],\"name\":\"__post_init__\",\"source\":\"def __post_init__(self) -> None:\\n if (\\n self.collection_start_at.tzinfo is None\\n or self.collection_start_at.utcoffset() is None\\n ):\\n raise DemonovError(\\n \\\"experiment collection start must be timezone-aware\\\"\\n )\\n if self.experiment_version == \\\"LIVE_PROSPECTIVE_V1\\\":\\n if self.finality_policy_id or self.runtime_manifest_id:\\n raise DemonovError(\\n \\\"V1 experiment provenance cannot bind V2 finality/runtime identity\\\"\\n )\\n elif self.experiment_version == \\\"LIVE_PROSPECTIVE_V2\\\":\\n if not isinstance(self.finality_policy_id, str) or not self.finality_policy_id:\\n raise DemonovError(\\n \\\"V2 experiment finality policy id is required\\\"\\n )\\n if (\\n not isinstance(self.runtime_manifest_id, str)\\n or len(self.runtime_manifest_id) != 64\\n or any(\\n c not in \\\"0123456789abcdef\\\"\\n for c in self.runtime_manifest_id\\n )\\n ):\\n raise DemonovError(\\n \\\"V2 experiment runtime manifest id must be lowercase sha256 hex\\\"\\n )\\n else:\\n raise DemonovError(\\\"experiment provenance version invalid\\\")\\n if self.experiment_id != self.content_hash:\\n raise DemonovError(\\n \\\"experiment provenance id must be content-addressed\\\"\\n )\",\"source_sha256\":\"0451d874842317d2aaad4a3f285d8e8c9531610fe507c7a6c51cb7541410a8cb\"},{\"args\":[\"cls\"],\"decorators\":[\"classmethod\"],\"kwonly\":[],\"name\":\"build\",\"source\":\"def build(cls, **kwargs) -> \\\"ExperimentProvenance\\\":\\n payload = dict(kwargs)\\n version = payload.get(\\n \\\"experiment_version\\\",\\n \\\"LIVE_PROSPECTIVE_V1\\\",\\n )\\n payload[\\\"experiment_version\\\"] = version\\n payload.setdefault(\\\"finality_policy_id\\\", \\\"\\\")\\n payload.setdefault(\\\"runtime_manifest_id\\\", \\\"\\\")\\n base = {\\n \\\"collection_start_at\\\": payload[\\\"collection_start_at\\\"].isoformat(),\\n \\\"code_identity\\\": payload[\\\"code_identity\\\"],\\n \\\"policy_registry_id\\\": payload[\\\"policy_registry_id\\\"],\\n \\\"market_bundle_id\\\": payload[\\\"market_bundle_id\\\"],\\n \\\"geometry_policy_id\\\": payload[\\\"geometry_policy_id\\\"],\\n \\\"demonov_branch_policy_id\\\": payload[\\\"demonov_branch_policy_id\\\"],\\n \\\"notification_policy_id\\\": payload[\\\"notification_policy_id\\\"],\\n \\\"outcome_policy_id\\\": payload[\\\"outcome_policy_id\\\"],\\n }\\n if version == \\\"LIVE_PROSPECTIVE_V1\\\":\\n eid = _hash(base)\\n elif version == \\\"LIVE_PROSPECTIVE_V2\\\":\\n eid = _hash({\\n **base,\\n \\\"experiment_version\\\": version,\\n \\\"finality_policy_id\\\": payload[\\\"finality_policy_id\\\"],\\n \\\"runtime_manifest_id\\\": payload[\\\"runtime_manifest_id\\\"],\\n })\\n else:\\n raise DemonovError(\\\"experiment provenance version invalid\\\")\\n return cls(experiment_id=eid, **payload)\",\"source_sha256\":\"baff34f1b0f70ebba9ab9f354e9e91523e3cfa85fcd4ec747c1d7d62d37642c6\"},{\"args\":[\"cls\",\"data\"],\"decorators\":[\"classmethod\"],\"kwonly\":[],\"name\":\"from_json\",\"source\":\"def from_json(cls, data: dict) -> \\\"ExperimentProvenance\\\":\\n payload = dict(data)\\n payload[\\\"collection_start_at\\\"] = datetime.fromisoformat(\\n payload[\\\"collection_start_at\\\"]\\n )\\n payload.setdefault(\\n \\\"experiment_version\\\",\\n \\\"LIVE_PROSPECTIVE_V1\\\",\\n )\\n payload.setdefault(\\\"finality_policy_id\\\", \\\"\\\")\\n payload.setdefault(\\\"runtime_manifest_id\\\", \\\"\\\")\\n return cls(**payload)\",\"source_sha256\":\"4b526e7094fb03b02d5e63439627dc0340040cebc9b77f557b107e475e9c4f9f\"}]}\nSB043G_PACKAGE_REFERENCES=[{\"lineno\":29,\"name\":\"PackageCodeIdentityV1844\",\"node\":\"ClassDef\",\"path\":\"code_identity.py\",\"source\":\"class PackageCodeIdentityV1844:\\n package_name: str\\n modules: Tuple[ModuleCodeIdentityV1844, ...]\\n\\n @property\\n def package_manifest_id(self) -> str:\\n return canonical_hash({\\n \\\"package_name\\\": self.package_name,\\n \\\"modules\\\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\\n })\",\"source_sha256\":\"d4faf873bec896466fdfcd7514cd453a8646994d5f998aa3bc0b84716c3118f5\"},{\"lineno\":80,\"name\":\"package_code_identity\",\"node\":\"FunctionDef\",\"path\":\"code_identity.py\",\"source\":\"def package_code_identity(package_dir: str | Path) -> PackageCodeIdentityV1844:\\n root = Path(package_dir)\\n modules = tuple(module_code_identity(p, root=root) for p in sorted(root.rglob('*.py')))\\n if not modules:\\n raise DemonovError('package contains no Python modules')\\n return PackageCodeIdentityV1844(root.name, modules)\",\"source_sha256\":\"a45a4817fabf86fb8f47df513d780c6dfe1d3cc159fb428a36a5180f2020a607\"},{\"lineno\":34,\"name\":\"package_manifest_id\",\"node\":\"FunctionDef\",\"path\":\"code_identity.py\",\"source\":\"def package_manifest_id(self) -> str:\\n return canonical_hash({\\n \\\"package_name\\\": self.package_name,\\n \\\"modules\\\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\\n })\",\"source_sha256\":\"7d15a9e82d5388664fa96a527ed60716f32dadb1561284ae2f7d1024ed5edb2b\"},{\"lineno\":40,\"name\":null,\"node\":\"AnnAssign\",\"path\":\"runtime_manifest.py\",\"source\":\" runtime_manifest_id: str\\n code_identity: str\\n package_identity: str\\n application_image_id: str\\n base_image_digest: str\",\"source_sha256\":\"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926\"},{\"lineno\":122,\"name\":null,\"node\":\"If\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":40,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" runtime_manifest_id: str\\n code_identity: str\\n package_identity: str\\n application_image_id: str\\n base_image_digest: str\",\"source_sha256\":\"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926\"},{\"lineno\":67,\"name\":null,\"node\":\"Expr\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":113,\"name\":null,\"node\":\"arg\",\"path\":\"runtime_manifest.py\",\"source\":\" expected_code_identity: str,\\n actual_image_id: str,\\n actual_package_identity: str,\\n) -> None:\\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\",\"source_sha256\":\"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d\"},{\"lineno\":122,\"name\":null,\"node\":\"Compare\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":67,\"name\":null,\"node\":\"Call\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":82,\"name\":null,\"node\":\"arg\",\"path\":\"runtime_manifest.py\",\"source\":\" *,\\n code_identity: str,\\n package_identity: str,\\n application_image_id: str,\\n base_image_digest: str,\",\"source_sha256\":\"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6\"},{\"lineno\":113,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" expected_code_identity: str,\\n actual_image_id: str,\\n actual_package_identity: str,\\n) -> None:\\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\",\"source_sha256\":\"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d\"},{\"lineno\":122,\"name\":null,\"node\":\"Attribute\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":122,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\",\"source_sha256\":\"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa\"},{\"lineno\":67,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":67,\"name\":null,\"node\":\"Attribute\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":67,\"name\":null,\"node\":\"Constant\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"code identity must be lowercase 40-64 hex\\\"\\n )\\n _sha256_hex(self.package_identity, \\\"package identity\\\")\\n _sha256_id(self.application_image_id, \\\"application image id\\\")\\n _sha256_id(self.base_image_digest, \\\"base image digest\\\")\",\"source_sha256\":\"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897\"},{\"lineno\":82,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" *,\\n code_identity: str,\\n package_identity: str,\\n application_image_id: str,\\n base_image_digest: str,\",\"source_sha256\":\"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6\"},{\"lineno\":90,\"name\":null,\"node\":\"Constant\",\"path\":\"runtime_manifest.py\",\"source\":\" payload = {\\n \\\"code_identity\\\": code_identity,\\n \\\"package_identity\\\": package_identity,\\n \\\"application_image_id\\\": application_image_id,\\n \\\"base_image_digest\\\": base_image_digest,\",\"source_sha256\":\"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157\"},{\"lineno\":90,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" payload = {\\n \\\"code_identity\\\": code_identity,\\n \\\"package_identity\\\": package_identity,\\n \\\"application_image_id\\\": application_image_id,\\n \\\"base_image_digest\\\": base_image_digest,\",\"source_sha256\":\"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157\"},{\"lineno\":52,\"name\":null,\"node\":\"Constant\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\",\"source_sha256\":\"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61\"},{\"lineno\":52,\"name\":null,\"node\":\"Attribute\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\",\"source_sha256\":\"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61\"},{\"lineno\":52,\"name\":null,\"node\":\"Name\",\"path\":\"runtime_manifest.py\",\"source\":\" \\\"schema\\\": \\\"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\\\",\\n \\\"code_identity\\\": self.code_identity,\\n \\\"package_identity\\\": self.package_identity,\\n \\\"application_image_id\\\": self.application_image_id,\\n \\\"base_image_digest\\\": self.base_image_digest,\",\"source_sha256\":\"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61\"}]\nSB043G_OLD_PACKAGE_DIRECT={\"compressed_sha256\":\"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32\",\"new_dir_file_count\":57,\"old_dir_file_count\":57,\"old_package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"tar_exists\":true,\"tar_sha256\":\"431ddf9e8938d5e583553f05f9e3d019aff0b439c83b0b23c81808073b7d61a8\"}\nSB043G_PACKAGE_CANDIDATE_MATCHES=[]\nSB043G_DERIVED_NEW_PACKAGE_CANDIDATES=[]\nSB043G_OLD_MANIFEST_OBJECT={\"application_image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"base_image_digest\":\"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"compose_hash\":\"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}\nSB043G_OLD_EXPERIMENT_OBJECT={\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"collection_start_at\":\"2026-09-07T00:00:00+00:00\",\"demonov_branch_policy_id\":\"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1\",\"experiment_id\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"experiment_version\":\"LIVE_PROSPECTIVE_V2\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"geometry_policy_id\":\"RESEARCH_RECONSTRUCTION_8020_V1\",\"market_bundle_id\":\"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae\",\"notification_policy_id\":\"SIGNIFICANT_STATE_CHANGE_EMAIL_V1\",\"outcome_policy_id\":\"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1\",\"policy_registry_id\":\"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}\nSB043G_HOLDS=[]\nSB043G_DECISION=SEAL_GENERATION_EVIDENCE_READY\nSB043G_MUTATION_SCOPE=NONE_READ_ONLY\nSIGNALBOT043G_HOLDS=[]\nSIGNALBOT043G_DECISION=SEAL_GENERATION_EVIDENCE_READY\nSIGNALBOT043G_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index a73d504e..3a0fe75b 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=NEWFI-260908-A-STAGINGEDGE-FRONTEND-FORENSIC3 +COMMAND_ID=SIGNALBOT-260908-SEAL-GENERATION-RCA-043GEN STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=newfi-staging-upstream-tls-frontend-forensic-readonly +COMPONENT=signalbot-cr0116-seal-generation-rca REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=45b9f9814c0bff698962bcdd4c06d06953e5ec76ec01c8f56e680c51218c4047 +COMMAND_SHA256=b8040335cd6ee0ee0382570ca5ecd189293d21953c5509bd1711312a80a2d622 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,40 +24,27 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=1997b836a531166d14298c77a514de124631aa8c239a2ef9b74202fb2bf9a4ff -SANITIZED_OUTPUT_SHA256=24bb5f3b58f9b3919ef16ca69845f204063a88ea8ab583d4e12ed0445d64f801 +RAW_EVIDENCE_SHA256=099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c +SANITIZED_OUTPUT_SHA256=099e5ef433eccdaae24a06982c949c13c323a1a84afd1ee9ba2bf094ffcfd10c OUTPUT_BEGIN -FORENSIC3_BEGIN=true -COMMAND_ID=NEWFI-260908-A-STAGINGEDGE-FRONTEND-FORENSIC3 -MODE=read-only -MUTATIONS_PERFORMED=NO ERROR_REGISTER_CHECK=OK -ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 REFERENCE_CHECK=OK -REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED -PRIOR_FORENSIC2_GATE=PASS -PRIOR_FORENSIC2_HISTORY_SHA256=ca4539996dc20a97e98687e1c0721f53b03e9c9e0c9e68fc62d4686081053271 -PUBLIC_DNS_PTR={"PTR":{"err":"","rc":0,"values":[]},"chat.gram1.ru":{"A":["185.225.35.6"],"err":"","rc":0},"git.gram1.ru":{"A":["185.225.35.6"],"err":"","rc":0},"groups.chat.gram1.ru":{"A":["chat.gram1.ru.","185.225.35.6"],"err":"","rc":0},"newfi-staging.gram1.ru":{"A":[],"err":"","rc":0},"share.chat.gram1.ru":{"A":["chat.gram1.ru.","185.225.35.6"],"err":"","rc":0}} -PUBLIC_CERT_GIT_GRAM1_RU={"err":"","out":"subject=CN=git.gram1.ru\nissuer=C=US, O=Let's Encrypt, CN=YE1\nserial=0668B385C8D6C5BBB0435761F84FADD0DB23\nnotBefore=Aug 17 02:03:29 2026 GMT\nnotAfter=Nov 15 02:03:28 2026 GMT\nX509v3 Subject Alternative Name: \n DNS:git-read.gram1.ru, DNS:git.gram1.ru","rc":0} -PUBLIC_CURL_GIT_GRAM1_RU={"err":"","headers":["Server: nginx/1.28.3 (Ubuntu)"],"http":"200","rc":0} -PUBLIC_CERT_CHAT_GRAM1_RU={"err":"","out":"subject=CN=chat.gram1.ru\nissuer=C=US, O=Let's Encrypt, CN=YE2\nserial=05CCB33370771F433AE4E9AD47F2DB574672\nnotBefore=Aug 17 02:54:43 2026 GMT\nnotAfter=Nov 15 02:54:42 2026 GMT\nX509v3 Subject Alternative Name: \n DNS:chat.gram1.ru, DNS:groups.chat.gram1.ru, DNS:share.chat.gram1.ru","rc":0} -PUBLIC_CURL_CHAT_GRAM1_RU={"err":"","headers":["Server: nginx/1.28.3 (Ubuntu)","location: /login"],"http":"302","rc":0} -PUBLIC_CERT_NEWFI_STAGING_GRAM1_RU={"err":"","out":"subject=CN=chat.gram1.ru\nissuer=C=US, O=Let's Encrypt, CN=YE2\nserial=05CCB33370771F433AE4E9AD47F2DB574672\nnotBefore=Aug 17 02:54:43 2026 GMT\nnotAfter=Nov 15 02:54:42 2026 GMT\nX509v3 Subject Alternative Name: \n DNS:chat.gram1.ru, DNS:groups.chat.gram1.ru, DNS:share.chat.gram1.ru","rc":0} -PUBLIC_CURL_NEWFI_STAGING_GRAM1_RU={"err":"curl: (60) SSL: no alternative certificate subject name matches target hostname 'newfi-staging.gram1.ru'\nMore details here: https://curl.se/docs/sslcerts.html\n\ncurl failed to verify the legitimacy of the server and therefore could not\nestablish a secure connection to it. To learn more about this situation and\nhow to fix it, please visit the webpage mentioned above.\n","headers":[],"http":"000","rc":60} -CLUSTER_VM_CT_INVENTORY={"err":"","rc":0,"rows":[{"name":"dns1","node":"pve01","status":"running","template":0,"type":"lxc","vmid":110},{"name":"dns2","node":"pve02","status":"running","template":0,"type":"lxc","vmid":111},{"name":"unbound1","node":"pve01","status":"running","template":0,"type":"lxc","vmid":112},{"name":"unbound2","node":"pve02","status":"running","template":0,"type":"lxc","vmid":113},{"name":"edge-vm","node":"pve03","status":"running","template":0,"type":"qemu","vmid":130},{"name":"snikket","node":"pve01","status":"running","template":0,"type":"qemu","vmid":150},{"name":"forum-prod","node":"pve02","status":"running","template":0,"type":"qemu","vmid":160},{"name":"core-apps","node":"pve01","status":"running","template":0,"type":"qemu","vmid":170},{"name":"monitoring","node":"pve01","status":"running","template":0,"type":"qemu","vmid":171},{"name":"homelab-ops-worker","node":"pve03","status":"running","template":0,"type":"qemu","vmid":190},{"name":"newfi-prod","node":"pve01","status":"running","template":0,"type":"qemu","vmid":210},{"name":"newfi-staging","node":"pve03","status":"running","template":0,"type":"qemu","vmid":211},{"name":"edge-cold-standby","node":"pve02","status":"stopped","template":0,"type":"qemu","vmid":9130}]} -PVE01_DEFAULT_ROUTE={"err":"","gateway":"[PRIVATE_IP]","line":"default via [PRIVATE_IP] dev vmbr0 proto kernel onlink","rc":0} -PVE01_GATEWAY_NEIGHBOR={"err":"","out":"[PRIVATE_IP] dev vmbr0 lladdr d6:9c:53:00:2c:c3 REACHABLE","rc":0} -GATEWAY_BASIC_PORTS={"22":{"open":false,"rc":124},"443":{"open":false,"rc":124},"80":{"open":false,"rc":124},"8443":{"open":false,"rc":124}} -GATEWAY_SSH_KEYSCAN={"err":"","out":"","rc":1} -GATEWAY_HTTP_HEAD={"err":"curl: (28) Connection timed out after 5002 milliseconds\n","out":"","rc":28} -GATEWAY_HTTPS_HEAD={"err":"curl: (28) Connection timed out after 5001 milliseconds\n","out":"","rc":28} -EDGE_PRIVATE_IP_DISCOVERY={"ips":["[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]","[PRIVATE_IP]"],"rc":0,"selected":null} -EDGE_WEB_LISTENER_OWNERSHIP={"err":"","out":"--- SS_WEB ---\nState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess \nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=16),(\"nginx\",pid=2180089,fd=16),(\"nginx\",pid=2180083,fd=16),(\"nginx\",pid=2180082,fd=16),(\"nginx\",pid=3096,fd=16))\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=15),(\"nginx\",pid=2180089,fd=15),(\"nginx\",pid=2180083,fd=15),(\"nginx\",pid=2180082,fd=15),(\"nginx\",pid=3096,fd=15))\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=14),(\"nginx\",pid=2180089,fd=14),(\"nginx\",pid=2180083,fd=14),(\"nginx\",pid=2180082,fd=14),(\"nginx\",pid=3096,fd=14))\nLISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=7),(\"nginx\",pid=2180089,fd=7),(\"nginx\",pid=2180083,fd=7),(\"nginx\",pid=2180082,fd=7),(\"nginx\",pid=3096,fd=7)) \nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=13),(\"nginx\",pid=2180089,fd=13),(\"nginx\",pid=2180083,fd=13),(\"nginx\",pid=2180082,fd=13),(\"nginx\",pid=3096,fd=13))\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=12),(\"nginx\",pid=2180089,fd=12),(\"nginx\",pid=2180083,fd=12),(\"nginx\",pid=2180082,fd=12),(\"nginx\",pid=3096,fd=12))\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=11),(\"nginx\",pid=2180089,fd=11),(\"nginx\",pid=2180083,fd=11),(\"nginx\",pid=2180082,fd=11),(\"nginx\",pid=3096,fd=11))\nLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=6),(\"nginx\",pid=2180089,fd=6),(\"nginx\",pid=2180083,fd=6),(\"nginx\",pid=2180082,fd=6),(\"nginx\",pid=3096,fd=6)) \nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=19),(\"nginx\",pid=2180089,fd=19),(\"nginx\",pid=2180083,fd=19),(\"nginx\",pid=2180082,fd=19),(\"nginx\",pid=3096,fd=19))\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=18),(\"nginx\",pid=2180089,fd=18),(\"nginx\",pid=2180083,fd=18),(\"nginx\",pid=2180082,fd=18),(\"nginx\",pid=3096,fd=18))\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=17),(\"nginx\",pid=2180089,fd=17),(\"nginx\",pid=2180083,fd=17),(\"nginx\",pid=2180082,fd=17),(\"nginx\",pid=3096,fd=17))\nLISTEN 0 511 127.0.0.1:81 0.0.0.0:* users:((\"nginx\",pid=2180110,fd=8),(\"nginx\",pid=2180089,fd=8),(\"nginx\",pid=2180083,fd=8),(\"nginx\",pid=2180082,fd=8),(\"nginx\",pid=3096,fd=8)) \nLISTEN 0 511 [::]:443 [::]:* users:((\"nginx\",pid=2180110,fd=10),(\"nginx\",pid=2180089,fd=10),(\"nginx\",pid=2180083,fd=10),(\"nginx\",pid=2180082,fd=10),(\"nginx\",pid=3096,fd=10))\nLISTEN 0 511 [::]:80 [::]:* users:((\"nginx\",pid=2180110,fd=9),(\"nginx\",pid=2180089,fd=9),(\"nginx\",pid=2180083,fd=9),(\"nginx\",pid=2180082,fd=9),(\"nginx\",pid=3096,fd=9)) \n--- PROCESS_TREE_NGINX ---\n 1920 1674 root haproxy /usr/sbin/haproxy -f /run/haproxy/haproxy.cfg -W -db\n 2031 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 2375 -container-ip [PRIVATE_IP] -container-port 2375 -use-listen-fd\n 2107 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 8081 -container-ip [PRIVATE_IP] -container-port 8080 -use-listen-fd\n 2160 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 7422 -container-ip [PRIVATE_IP] -container-port 7422 -use-listen-fd\n 2180 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 8088 -container-ip [PRIVATE_IP] -container-port 8080 -use-listen-fd\n 2201 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 12345 -container-ip [PRIVATE_IP] -container-port 12345 -use-listen-fd\n 2213 1920 root haproxy /usr/sbin/haproxy -f /run/haproxy/haproxy.cfg -W -db\n 2223 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 3100 -container-ip [PRIVATE_IP] -container-port 3100 -use-listen-fd\n 2332 888 root docker-proxy /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 9999 -container-ip [PRIVATE_IP] -container-port 8080 -use-listen-fd\n 3096 3095 root nginx nginx: master process nginx -e stderr\n1948449 3096 root nginx nginx: worker process is shutting down\n2180082 3096 root nginx nginx: worker process\n2180083 3096 root nginx nginx: worker process\n2180089 3096 root nginx nginx: worker process\n2180110 3096 root nginx nginx: worker process\n2183049 722 root bash /bin/bash -lc echo '--- SS_WEB ---' ss -ltnp | awk 'NR==1 || $4 ~ /:(80|81|443)$/' echo '--- PROCESS_TREE_NGINX ---' ps -eo pid,ppid,user,comm,args | grep -E '[n]ginx|[d]ocker-proxy|[h]aproxy|[c]addy|[t]raefik' echo '--- NPMPLUS_MODE ---' docker inspect npmplus --format '{{.HostConfig.NetworkMode}}' echo '--- NPMPLUS_IMAGE ---' docker inspect npmplus --format '{{.Config.Image}} {{.Image}}' echo '--- NPMPLUS_NGINX_VERSION ---' docker exec npmplus /usr/local/nginx/sbin/nginx -v 2>&1 \n2631782 1 root sudo sudo bash -lc set -euo pipefail; IDS=\"30 32 33 34 35 36 37 38 39 40 43 44 47 54 55 56 57 58 59\"; B=\"/opt/npmplus/manual-backups/stale-proxy-host-retirement-$(date -u +%Y%m%dT%H%M%SZ)\"; install -d -m 700 \"$B\"; python3 -c \"import sqlite3; s=sqlite3.connect(\\\"file:/opt/npmplus/npmplus/database.sqlite?mode=ro\\\",uri=True); d=sqlite3.connect(\\\"$B/database.sqlite.before\\\"); s.backup(d); d.close(); s.close()\"; chmod 600 \"$B/database.sqlite.before\"; for id in $IDS; do [ ! -e \"/opt/npmplus/nginx/proxy_host/$id.conf\" ] || cp -a \"/opt/npmplus/nginx/proxy_host/$id.conf\" \"$B/$id.conf.before\"; done; docker exec npmplus grep -q \"is_deleted: 1\" /app/internal/proxy-host.js; docker exec npmplus grep -q \"Delete Nginx Config\" /app/internal/proxy-host.js; docker exec npmplus grep -q \"internalNginx.reload\" /app/internal/proxy-host.js; C=\"/data${B#/opt/npmplus}\"; printf \"%s\\n\" \"import internalProxyHost from \\\"/app/internal/proxy-host.js\\\";\" \"const ids=[30,32,33,34,35,36,37,38,39,40,43,44,47,54,55,56,57,58,59];\" \"const access={can:async()=>({permission_visibility:\\\"all\\\"}),token=;\" \"for (const id of ids) { const ok=await internalProxyHost.delete(access,{id}); console.log(\\\"DELETED=\\\"+id+\\\":\\\"+ok); }\" > \"$B/delete-stale.mjs\"; chmod 644 \"$B/delete-stale.mjs\"; docker exec -u 0 npmplus node --check \"$C/delete-stale.mjs\"; echo \"BACKUP=$B\"; docker exec -u 0 npmplus node \"$C/delete-stale.mjs\"; docker exec npmplus nginx -t; echo NPMPLUS_STALE_PROXY_HOST_DELETE=PASS\n2631784 2631782 root bash bash -lc set -euo pipefail; IDS=\"30 32 33 34 35 36 37 38 39 40 43 44 47 54 55 56 57 58 59\"; B=\"/opt/npmplus/manual-backups/stale-proxy-host-retirement-$(date -u +%Y%m%dT%H%M%SZ)\"; install -d -m 700 \"$B\"; python3 -c \"import sqlite3; s=sqlite3.connect(\\\"file:/opt/npmplus/npmplus/database.sqlite?mode=ro\\\",uri=True); d=sqlite3.connect(\\\"$B/database.sqlite.before\\\"); s.backup(d); d.close(); s.close()\"; chmod 600 \"$B/database.sqlite.before\"; for id in $IDS; do [ ! -e \"/opt/npmplus/nginx/proxy_host/$id.conf\" ] || cp -a \"/opt/npmplus/nginx/proxy_host/$id.conf\" \"$B/$id.conf.before\"; done; docker exec npmplus grep -q \"is_deleted: 1\" /app/internal/proxy-host.js; docker exec npmplus grep -q \"Delete Nginx Config\" /app/internal/proxy-host.js; docker exec npmplus grep -q \"internalNginx.reload\" /app/internal/proxy-host.js; C=\"/data${B#/opt/npmplus}\"; printf \"%s\\n\" \"import internalProxyHost from \\\"/app/internal/proxy-host.js\\\";\" \"const ids=[30,32,33,34,35,36,37,38,39,40,43,44,47,54,55,56,57,58,59];\" \"const access={can:async()=>({permission_visibility:\\\"all\\\"}),token=;\" \"for (const id of ids) { const ok=await internalProxyHost.delete(access,{id}); console.log(\\\"DELETED=\\\"+id+\\\":\\\"+ok); }\" > \"$B/delete-stale.mjs\"; chmod 644 \"$B/delete-stale.mjs\"; docker exec -u 0 npmplus node --check \"$C/delete-stale.mjs\"; echo \"BACKUP=$B\"; docker exec -u 0 npmplus node \"$C/delete-stale.mjs\"; docker exec npmplus nginx -t; echo NPMPLUS_STALE_PROXY_HOST_DELETE=PASS\n--- NPMPLUS_MODE ---\nhost\n--- NPMPLUS_IMAGE ---\ndocker.io/zoeyvid/npmplus:2026-06-17-b1 sha256:058637924fae1dbf161d1d78c84b738d86804e9a0ddad66cf7c87cbe33337834\n--- NPMPLUS_NGINX_VERSION ---\nnginx version: nginx/1.31.2 (NPMplus)","rc":0} -FOCUSED_FRONTEND_REFERENCES={"err":"","out":"[{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":951,\"text\":\"URL=https://git.gram1.ru\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":1967,\"text\":\"4. The only remaining access convenience item is optional: expose the cluster-admin panel via a VPN-only/internal reverse proxy route such as `cluster-admin.vpn.gram1.ru`.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":2418,\"text\":\"from=\\\"[PRIVATE_IP]\\\",command=\\\"...\\\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding,no-pty\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":2454,\"text\":\"- Optional ports 80/443 on VM150/170/171 are not hard failures because services may live behind reverse proxy or not expose direct ports.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":2803,\"text\":\"Configure operator-friendly VPN reverse proxy route: cluster-admin.vpn.gram1.ru -> [PRIVATE_IP]:8080\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":2832,\"text\":\"8. `http://[PRIVATE_IP]:8080/` is not reachable from a normal browser outside LAN/VPN. Use VPN, SSH tunnel, or internal reverse proxy.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":4810,\"text\":\"- likely frontend/cache;\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":5436,\"text\":\"- \\u043a\\u0442\\u043e \\u043e\\u0442\\u0432\\u0435\\u0447\\u0430\\u0435\\u0442 \\u0437\\u0430 reverse proxy;\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":6683,\"text\":\"| Core | Gitea | https://git.gram1.ru | public | Git |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":7096,\"text\":\"- line 304: `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701`\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":7161,\"text\":\"| 257 | `### NAT / port forwarding` |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":7455,\"text\":\"| 304 | `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701` |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":7540,\"text\":\"- `https://git.gram1.ru`\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":8263,\"text\":\"### NAT / port forwarding\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":8552,\"text\":\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":8620,\"text\":\"- git.gram1.ru -> [PRIVATE_IP].\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":8631,\"text\":\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":8653,\"text\":\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":8702,\"text\":\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":9006,\"text\":\" - https://git.gram1.ru\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":9062,\"text\":\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":9305,\"text\":\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":9319,\"text\":\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":9870,\"text\":\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":10101,\"text\":\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":10113,\"text\":\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":10629,\"text\":\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":10722,\"text\":\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":11033,\"text\":\"\\u0410 \\u0441\\u0430\\u043c\\u0430\\u044f \\u043a\\u0440\\u0438\\u0442\\u0438\\u0447\\u043d\\u0430\\u044f VM130 edge-vm \\u043d\\u0430\\u0445\\u043e\\u0434\\u0438\\u0442\\u0441\\u044f \\u043d\\u0430 pve03 \\u0438 \\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 reverse proxy, monitoring, backup automation \\u0438 Docker application host. \\u041f\\u0440\\u0438 \\u044d\\u0442\\u043e\\u043c pve03 \\u2014 \\u0441\\u0430\\u043c\\u044b\\u0439 \\u043e\\u0433\\u0440\\u0430\\u043d\\u0438\\u0447\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043f\\u043e \\u0434\\u0438\\u0441\\u043a\\u0443: local-lvm \\u0443\\u0436\\u0435 \\u0431\\u044b\\u043b \\u0441\\u0430\\u043c\\u044b\\u043c constrained, \\u043f\\u043e\\u0442\\u043e\\u043c\\u0443 \\u0447\\u0442\\u043e VM130 \\u0438\\u043c\\u0435\\u0435\\u0442 96G OS + 150G media/data, \\u0430 pve03 staging \\u0434\\u043e\\u0445\\u043e\\u0434\\u0438\\u043b \\u0434\\u043e 77% \\u043f\\u0440\\u0438 WARN 80%. \"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_HISTORICAL_2026-07-09.md\",\"line\":11044,\"text\":\"4. \\u0415\\u0441\\u043b\\u0438 \\u043d\\u0435 \\u043f\\u0435\\u0440\\u0435\\u043d\\u043e\\u0441\\u0438\\u0442\\u044c \\u0441\\u0435\\u0439\\u0447\\u0430\\u0441, \\u0442\\u043e \\u043c\\u0438\\u043d\\u0438\\u043c\\u0443\\u043c \\u0441\\u0434\\u0435\\u043b\\u0430\\u0442\\u044c **cold standby edge-vm** \\u043d\\u0430 pve01 \\u0438\\u043b\\u0438 pve02: \\u0432\\u043e\\u0441\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u043d\\u0430\\u044f \\u0438\\u0437 \\u043f\\u043e\\u0441\\u043b\\u0435\\u0434\\u043d\\u0435\\u0433\\u043e backup, \\u0432\\u044b\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u043d\\u0430\\u044f, \\u0441 \\u043f\\u043e\\u043d\\u044f\\u0442\\u043d\\u044b\\u043c runbook \\u043f\\u0435\\u0440\\u0435\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u044f IP/NPMplus/router port forward.\"},{\"path\":\"/etc/pve/HOMEPAGE_BACKUP_COVERAGE_MATRIX.md\",\"line\":22,\"text\":\"| Gitea | https://git.gram1.ru | 185 | 89 | 105 | EVIDENCE_FOUND_REVIEW |\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":315,\"text\":\"### NAT / port forwarding\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":604,\"text\":\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":672,\"text\":\"- git.gram1.ru -> [PRIVATE_IP].\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":683,\"text\":\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":705,\"text\":\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":754,\"text\":\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":1058,\"text\":\" - https://git.gram1.ru\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":1114,\"text\":\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":1357,\"text\":\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":1371,\"text\":\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":1922,\"text\":\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2153,\"text\":\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2165,\"text\":\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2515,\"text\":\"- Recommended future path: establish VPN/NetBird/WireGuard or reverse-proxy/private management endpoint first; then issue DNS-01 certificate on a trusted node and deploy cert/key to the router only over that private path.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2561,\"text\":\"- TLS terminates on edge using certbot DNS-01 cert router-taftauto.ru.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2872,\"text\":\"- Primary domain: chat.gram1.ru.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2873,\"text\":\"- groups.chat.gram1.ru and share.chat.gram1.ru are Snikket service domains.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2902,\"text\":\"- chat.gram1.ru public A is 185.225.35.6; groups.chat.gram1.ru and share.chat.gram1.ru continue through chat.gram1.ru.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2905,\"text\":\"- VM150 Internet default path is via [PRIVATE_IP] and verified public egress is 185.225.35.6.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2906,\"text\":\"- Effective coturn external address uses 185.225.35.6 and no longer advertises 95.84.154.183.\"},{\"path\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"line\":2912,\"text\":\"- Public DNS observed at release: 185.225.35.6; DNS was not changed during forum cutover.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":1831,\"text\":\"URL=https://git.gram1.ru\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":2847,\"text\":\"4. The only remaining access convenience item is optional: expose the cluster-admin panel via a VPN-only/internal reverse proxy route such as `cluster-admin.vpn.gram1.ru`.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":3298,\"text\":\"from=\\\"[PRIVATE_IP]\\\",command=\\\"...\\\",no-agent-forwarding,no-X11-forwarding,no-port-forwarding,no-pty\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":3334,\"text\":\"- Optional ports 80/443 on VM150/170/171 are not hard failures because services may live behind reverse proxy or not expose direct ports.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":3683,\"text\":\"Configure operator-friendly VPN reverse proxy route: cluster-admin.vpn.gram1.ru -> [PRIVATE_IP]:8080\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":3712,\"text\":\"8. `http://[PRIVATE_IP]:8080/` is not reachable from a normal browser outside LAN/VPN. Use VPN, SSH tunnel, or internal reverse proxy.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":5690,\"text\":\"- likely frontend/cache;\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":6316,\"text\":\"- \\u043a\\u0442\\u043e \\u043e\\u0442\\u0432\\u0435\\u0447\\u0430\\u0435\\u0442 \\u0437\\u0430 reverse proxy;\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":7563,\"text\":\"| Core | Gitea | https://git.gram1.ru | public | Git |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":7976,\"text\":\"- line 304: `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701`\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":8041,\"text\":\"| 257 | `### NAT / port forwarding` |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":8335,\"text\":\"| 304 | `## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701` |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":8420,\"text\":\"- `https://git.gram1.ru`\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9143,\"text\":\"### NAT / port forwarding\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9432,\"text\":\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9500,\"text\":\"- git.gram1.ru -> [PRIVATE_IP].\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9511,\"text\":\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9533,\"text\":\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9582,\"text\":\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9886,\"text\":\" - https://git.gram1.ru\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":9942,\"text\":\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":10185,\"text\":\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":10199,\"text\":\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":10750,\"text\":\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":10981,\"text\":\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":10993,\"text\":\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":11509,\"text\":\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":11602,\"text\":\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":11913,\"text\":\"\\u0410 \\u0441\\u0430\\u043c\\u0430\\u044f \\u043a\\u0440\\u0438\\u0442\\u0438\\u0447\\u043d\\u0430\\u044f VM130 edge-vm \\u043d\\u0430\\u0445\\u043e\\u0434\\u0438\\u0442\\u0441\\u044f \\u043d\\u0430 pve03 \\u0438 \\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 reverse proxy, monitoring, backup automation \\u0438 Docker application host. \\u041f\\u0440\\u0438 \\u044d\\u0442\\u043e\\u043c pve03 \\u2014 \\u0441\\u0430\\u043c\\u044b\\u0439 \\u043e\\u0433\\u0440\\u0430\\u043d\\u0438\\u0447\\u0435\\u043d\\u043d\\u044b\\u0439 \\u043f\\u043e \\u0434\\u0438\\u0441\\u043a\\u0443: local-lvm \\u0443\\u0436\\u0435 \\u0431\\u044b\\u043b \\u0441\\u0430\\u043c\\u044b\\u043c constrained, \\u043f\\u043e\\u0442\\u043e\\u043c\\u0443 \\u0447\\u0442\\u043e VM130 \\u0438\\u043c\\u0435\\u0435\\u0442 96G OS + 150G media/data, \\u0430 pve03 staging \\u0434\\u043e\\u0445\\u043e\\u0434\\u0438\\u043b \\u0434\\u043e 77% \\u043f\\u0440\\u0438 WARN 80%. \"},{\"path\":\"/etc/pve/HOMELAB_FULL_HANDOFF_CURRENT.md\",\"line\":11924,\"text\":\"4. \\u0415\\u0441\\u043b\\u0438 \\u043d\\u0435 \\u043f\\u0435\\u0440\\u0435\\u043d\\u043e\\u0441\\u0438\\u0442\\u044c \\u0441\\u0435\\u0439\\u0447\\u0430\\u0441, \\u0442\\u043e \\u043c\\u0438\\u043d\\u0438\\u043c\\u0443\\u043c \\u0441\\u0434\\u0435\\u043b\\u0430\\u0442\\u044c **cold standby edge-vm** \\u043d\\u0430 pve01 \\u0438\\u043b\\u0438 pve02: \\u0432\\u043e\\u0441\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043b\\u0435\\u043d\\u043d\\u0430\\u044f \\u0438\\u0437 \\u043f\\u043e\\u0441\\u043b\\u0435\\u0434\\u043d\\u0435\\u0433\\u043e backup, \\u0432\\u044b\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u043d\\u0430\\u044f, \\u0441 \\u043f\\u043e\\u043d\\u044f\\u0442\\u043d\\u044b\\u043c runbook \\u043f\\u0435\\u0440\\u0435\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u044f IP/NPMplus/router port forward.\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":211,\"text\":\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":304,\"text\":\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":1730,\"text\":\"- public_dns_root: 185.225.35.6\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":1731,\"text\":\"- public_dns_www: 185.225.35.6\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":2603,\"text\":\"2026-09-03 KOW_EXTERNAL_PUBLIC_FRONT_SERVER_VERSION_DISCLOSURE OPEN public_response_Server_nginx_1_28_3_Ubuntu direct_NPMplus_Server_absent identify_external_reverse_proxy_before_mutation\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":3035,\"text\":\"CERT38_NARROW_MIGRATION_20260904 | CLOSED_COMMITTED_PASS | Cert38 meta/runtime credential migrated to verified narrow gram1 token; stock npm-38 renewal dry-run succeeded for chat.gram1.ru, groups.chat.gram1.ru and share.chat.gram1.ru.\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":3100,\"text\":\"EDGE01_SSH_HOSTKEY_UNKNOWN_20260904 | OPEN | Strict SSH to 185.225.35.6 stopped before authentication because no pinned ED25519 host key exists for the IP; no remote state changed and no unverified key was accepted.\"},{\"path\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":3112,\"text\":\"PUBLIC_SERVER_VERSION_HARDENING_RUNTIME_MISMATCH_20260904 | CLOSED_PARTIAL_BLOCKED_EXTERNAL_INGRESS | VM130 NPMplus now has server_tokens off on all 13 public manual vhosts and direct-edge responses expose no Server header; public nginx/1.28.3 (Ubuntu) is emitted by EDGE01 185.225.35.6. kingofwolk.ru proves EDGE01 supports per-vhost server_tokens off, but external mutation is blocked until an authorized EDGE01 management credential is restored.\"},{\"path\":\"/root/finish_skladchik_cr_2026_0010_v2.sh\",\"line\":20,\"text\":\"API=https://git.gram1.ru/api/v1/repos/homelab-admin/homelab-ops\"},{\"path\":\"/root/774c_dockge_agent_capability_inspect.sh\",\"line\":70,\"text\":\" for f in /app/package.json /app/backend/package.json /app/frontend/package.json; do\"},{\"path\":\"/root/771h_crowdsec_capi_register_correct_sequence.sh\",\"line\":453,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/771d_crowdsec_capi_via_privoxy_tor.sh\",\"line\":64,\"text\":\"export DEBIAN_FRONTEND=noninteractive\"},{\"path\":\"/root/771d_crowdsec_capi_via_privoxy_tor.sh\",\"line\":314,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/771w_pve01_netbird_ssh_egress_crowdsec_capi.sh\",\"line\":586,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/HOMELAB_READONLY_SERVICE_CENSUS_20260816T065015Z.txt\",\"line\":4306,\"text\":\" \\\"out-data\\\" : \\\"GUEST_BEGIN|host=forum-prod|utc=2026-08-16T06:50:56Z\\\\nPRETTY_NAME=\\\\\\\"Debian GNU/Linux 12 (bookworm)\\\\\\\"\\\\nVERSION_ID=\\\\\\\"12\\\\\\\"\\\\nID=debian\\\\n\\\\n--- GUEST_DF ---\\\\nFilesystem Type Size Used Avail Use% Mounted on\\\\nudev devtmpfs 3.9G 0 3.9G 0% /dev\\\\ntmpfs tmpfs 796M 512K 795M 1% /run\\\\n/dev/sda1 ext4 197G 15G 175G 8% /\\\\ntmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm\\\\ntmpfs tmpfs 5.0M 0 5.0M 0% /run/lock\\\\n/dev/sda15 vfat 124M 12M 112M 10% /boot/efi\\\\n\\\\n--- GUEST_FAILED_UNITS ---\\\\nUNIT LOAD ACTIVE SUB DESCRIPTION\\\\n0 loaded units listed.\\\\n\\\\n--- GUEST_RUNNING_SERVICES ---\\\\nUNIT LOAD ACTIVE SUB DESCRIPTION\\\\nchrony.service loaded active running chrony, an NTP client/server\\\\ncron.service loaded active running Regular background program processing daemon\\\\ndbus.service loaded active running D-Bus System Message Bus\\\\ngetty@tty1.service loaded active running Getty on tty1\\\\nmariadb.service loaded active running MariaDB 10.11.18 database server\\\\nnginx.service loaded active running A high \"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":1665,\"text\":\"DOMAIN = git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":1668,\"text\":\"ROOT_URL = https://git.gram1.ru/\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":1705,\"text\":\"REVERSE_PROXY_LIMIT = 1\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":1706,\"text\":\"REVERSE_PROXY_TRUSTED_PROXIES = *\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":1902,\"text\":\"# Load frontend themes from the themes folder\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":1903,\"text\":\"frontend:\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":2955,\"text\":\"9 [\\\"git.gram1.ru\\\"] 1 custom 0 none 0 0 SAMEORIGIN 1 \"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":3524,\"text\":\"# git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":3536,\"text\":\" server_name git.gram1.ru;\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":10159,\"text\":\"dns_server=[PRIVATE_IP] domain=git.gram1.ru A=[PRIVATE_IP] \"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":10165,\"text\":\"dns_server=[PRIVATE_IP] domain=git.gram1.ru A=[PRIVATE_IP] \"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":23215,\"text\":\"git.gram1.ru,[PRIVATE_IP],optional-empty,http://127.0.0.1:3002,LAN-only,cloudflare-dns-challenge\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":23264,\"text\":\"| Gitea | 127.0.0.1:3002 | https://git.gram1.ru |\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":23304,\"text\":\"Homelab gram1.ru \\u043f\\u043e\\u0441\\u0442\\u0440\\u043e\\u0435\\u043d \\u0432\\u043e\\u043a\\u0440\\u0443\\u0433 Proxmox-\\u043a\\u043b\\u0430\\u0441\\u0442\\u0435\\u0440\\u0430, \\u0432\\u043d\\u0443\\u0442\\u0440\\u0435\\u043d\\u043d\\u0435\\u0433\\u043e DNS, NPMplus reverse proxy, \\u043c\\u043e\\u043d\\u0438\\u0442\\u043e\\u0440\\u0438\\u043d\\u0433\\u0430, backup \\u0438 \\u043d\\u0430\\u0431\\u043e\\u0440\\u0430 self-hosted \\u0441\\u0435\\u0440\\u0432\\u0438\\u0441\\u043e\\u0432.\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":23647,\"text\":\"- edge-vm hosting reverse proxy and most application containers.\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":23719,\"text\":\"- Purpose: reverse proxy and TLS termination.\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":23782,\"text\":\"- Domain: https://git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24054,\"text\":\"- Remote: https://git.gram1.ru/homelab-admin/homelab-configs\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24193,\"text\":\"- https://git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24406,\"text\":\"| git.gram1.ru | http://127.0.0.1:3002 | yes | LAN only | git.gram1.ru | enabled |\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24438,\"text\":\"| git.gram1.ru | letsencrypt | 2026-09-13 17:36:55 |\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24465,\"text\":\"| `git.gram1.ru` | `http://127.0.0.1:3002` | cert id 29 | yes | Gitea |\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24708,\"text\":\"5. Recover reverse proxy/Kuma/Auth/Gitea/Vaultwarden and service configs.\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":24721,\"text\":\"git clone https://git.gram1.ru/homelab-admin/homelab-configs.git\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":25074,\"text\":\"git clone https://git.gram1.ru/homelab-admin/homelab-configs.git\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v3_20260623T195206Z.txt\",\"line\":25411,\"text\":\"- reverse proxy upstream;\"},{\"path\":\"/root/771_crowdsec_capi_ipv4_restore_or_fallback.sh\",\"line\":326,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":211,\"text\":\"- A portal card is openable only when DNS, reverse-proxy host mapping, and target content are all valid.\"},{\"path\":\"/root/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"line\":304,\"text\":\"## FORUM_PROD_BULK_IMPORT_PHP85_EMPTY_FRONTEND_20260701\"},{\"path\":\"/root/772b_homepage_russian_normalize_apply.sh\",\"line\":89,\"text\":\" \\\"NPMplus\\\": \\\"\\u0410\\u0434\\u043c\\u0438\\u043d\\u0438\\u0441\\u0442\\u0440\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 reverse proxy.\\\",\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":1316,\"text\":\"IP_ROUTE|185.225.35.6 via [PRIVATE_IP] dev eth0 src [PRIVATE_IP] \"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2390,\"text\":\"NPM_ROW|proxy_host|{\\\"domain_names\\\":\\\"[\\\\\\\"git.gram1.ru\\\\\\\"]\\\",\\\"enabled\\\":1,\\\"forward_host\\\":\\\"127.0.0.1\\\",\\\"forward_port\\\":3002,\\\"forward_scheme\\\":\\\"http\\\",\\\"id\\\":9}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2433,\"text\":\"NPM_ROW|proxy_host|{\\\"domain_names\\\":\\\"[\\\\\\\"chat.gram1.ru\\\\\\\",\\\\\\\"groups.chat.gram1.ru\\\\\\\",\\\\\\\"share.chat.gram1.ru\\\\\\\"]\\\",\\\"enabled\\\":1,\\\"forward_host\\\":\\\"[PRIVATE_IP]\\\",\\\"forward_port\\\":443,\\\"forward_scheme\\\":\\\"https\\\",\\\"id\\\":61}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2440,\"text\":\"NPM_ROW|certificate|{\\\"domain_names\\\":\\\"[\\\\\\\"git.gram1.ru\\\\\\\"]\\\",\\\"id\\\":29,\\\"nice_name\\\":\\\"git.gram1.ru\\\",\\\"provider\\\":\\\"letsencrypt\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2445,\"text\":\"NPM_ROW|certificate|{\\\"domain_names\\\":\\\"[\\\\\\\"chat.gram1.ru\\\\\\\",\\\\\\\"groups.chat.gram1.ru\\\\\\\",\\\\\\\"share.chat.gram1.ru\\\\\\\"]\\\",\\\"id\\\":38,\\\"nice_name\\\":\\\"chat.gram1.ru, groups.chat.gram1.ru, share.chat.gram1.ru\\\",\\\"provider\\\":\\\"letsencrypt\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2456,\"text\":\"DOMAIN|chat.gram1.ru\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2464,\"text\":\"DOMAIN|git.gram1.ru\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2468,\"text\":\"DOMAIN|groups.chat.gram1.ru\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2495,\"text\":\"DOMAIN|share.chat.gram1.ru\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2607,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"[PRIVATE_IP]\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[\\\";;\\\",\\\"communications\\\",\\\"error\\\",\\\"to\\\",\\\"100.100.131.41#53:\\\",\\\"timed\\\",\\\"out\\\",\\\";;\\\",\\\"no\\\",\\\"servers\\\",\\\"could\\\",\\\"be\\\",\\\"reached\\\"],\\\"domain\\\":\\\"chat.gram1.ru\\\",\\\"https\\\":\\\"302|[PRIVATE_IP]|https://chat.gram1.ru/login\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2610,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"codevipe.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2615,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[\\\";;\\\",\\\"communications\\\",\\\"error\\\",\\\"to\\\",\\\"100.100.131.41#53:\\\",\\\"timed\\\",\\\"out\\\",\\\";;\\\",\\\"no\\\",\\\"servers\\\",\\\"could\\\",\\\"be\\\",\\\"reached\\\"],\\\"MX\\\":[],\\\"domain\\\":\\\"dsmods.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2617,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"gamevipe.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2618,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"git-read.gram1.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2619,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\";;\\\",\\\"communications\\\",\\\"error\\\",\\\"to\\\",\\\"100.100.131.41#53:\\\",\\\"timed\\\",\\\"out\\\",\\\";;\\\",\\\"no\\\",\\\"servers\\\",\\\"could\\\",\\\"be\\\",\\\"reached\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"git.gram1.ru\\\",\\\"https\\\":\\\"200|[PRIVATE_IP]|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2623,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"gram1.ru\\\",\\\"https\\\":\\\"303|185.225.35.6|https://gram1.ru/login\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2624,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"[PRIVATE_IP]\\\"],\\\"AAAA\\\":[\\\";;\\\",\\\"communications\\\",\\\"error\\\",\\\"to\\\",\\\"100.100.131.41#53:\\\",\\\"timed\\\",\\\"out\\\",\\\";;\\\",\\\"no\\\",\\\"servers\\\",\\\"could\\\",\\\"be\\\",\\\"reached\\\"],\\\"MX\\\":[],\\\"domain\\\":\\\"groups.chat.gram1.ru\\\",\\\"https\\\":\\\"301|[PRIVATE_IP]|https://chat.gram1.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2625,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"hapusya.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2626,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"hbarhub.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2627,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"hkmods.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2635,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"kingofwolk.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2645,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"newfi.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2646,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"newfilya.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2656,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[\\\"10\\\",\\\"mail.pvepro.ru.\\\"],\\\"domain\\\":\\\"pvepro.ru\\\",\\\"https\\\":\\\"303|185.225.35.6|https://pvepro.ru/login\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2659,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"[PRIVATE_IP]\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"share.chat.gram1.ru\\\",\\\"https\\\":\\\"301|[PRIVATE_IP]|https://chat.gram1.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2661,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"taftauto.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2666,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.codevipe.ru\\\",\\\"https\\\":\\\"301|185.225.35.6|https://codevipe.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2667,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.dsmods.ru\\\",\\\"https\\\":\\\"301|185.225.35.6|https://dsmods.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2668,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.gamevipe.ru\\\",\\\"https\\\":\\\"301|185.225.35.6|https://gamevipe.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2669,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[\\\";;\\\",\\\"communications\\\",\\\"error\\\",\\\"to\\\",\\\"100.100.131.41#53:\\\",\\\"timed\\\",\\\"out\\\",\\\";;\\\",\\\"no\\\",\\\"servers\\\",\\\"could\\\",\\\"be\\\",\\\"reached\\\"],\\\"domain\\\":\\\"www.gram1.ru\\\",\\\"https\\\":\\\"303|185.225.35.6|https://www.gram1.ru/login\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2670,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.hapusya.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2671,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.hbarhub.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2672,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.hkmods.ru\\\",\\\"https\\\":\\\"301|185.225.35.6|https://hkmods.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2673,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.kingofwolk.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2674,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.newfi.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2675,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.newfilya.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2676,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.pvepro.ru\\\",\\\"https\\\":\\\"303|185.225.35.6|https://www.pvepro.ru/login\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2677,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.taftauto.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2678,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"www.zakrutim.ru\\\",\\\"https\\\":\\\"301|185.225.35.6|https://zakrutim.ru/\\\"}\"},{\"path\":\"/root/CLUSTER_V3_CENSUS_20260817T181842Z.txt\",\"line\":2679,\"text\":\"DOMAIN_STATE|{\\\"A\\\":[\\\"185.225.35.6\\\"],\\\"AAAA\\\":[],\\\"MX\\\":[],\\\"domain\\\":\\\"zakrutim.ru\\\",\\\"https\\\":\\\"200|185.225.35.6|\\\"}\"},{\"path\":\"/root/diag-pve03-dns2-20260615T091114Z.txt\",\"line\":261,\"text\":\"debug1: Remote: [SENSITIVE_PATH] key options: agent-forwarding port-forwarding pty user-rc x11-forwarding\"},{\"path\":\"/root/diag-pve03-dns2-20260615T091114Z.txt\",\"line\":263,\"text\":\"debug1: Remote: [SENSITIVE_PATH] key options: agent-forwarding port-forwarding pty user-rc x11-forwarding\"},{\"path\":\"/root/771x_crowdsec_capi_mtu_hardfix.sh\",\"line\":542,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/771f_crowdsec_capi_godebug_mss_fix.sh\",\"line\":344,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/771l_crowdsec_capi_netbird_vps_egress.sh\",\"line\":695,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/homelab_network_equipment_audit_20260623T170441Z.txt\",\"line\":154,\"text\":\"--- git.gram1.ru ---\"},{\"path\":\"/root/homelab_network_equipment_audit_20260623T170441Z.txt\",\"line\":155,\"text\":\"[PRIVATE_IP] STREAM git.gram1.ru\"},{\"path\":\"/root/767_deep_tail_and_regression_audit.sh\",\"line\":40,\"text\":\" echo \\\"1 reverse_proxy_upstream_and_headers\\\"\"},{\"path\":\"/root/767_deep_tail_and_regression_audit.sh\",\"line\":70,\"text\":\" auth.gram1.ru photos.gram1.ru homeassistant.vpn.gram1.ru vault.gram1.ru git.gram1.ru paper.gram1.ru \\\\\"},{\"path\":\"/root/Workers2_AUDIT0_collect_2026-08-23.sh\",\"line\":15,\"text\":\"GITEA_HOST=\\\"${AUDIT_GITEA_HOST:-git.gram1.ru}\\\"\"},{\"path\":\"/root/Workers2_AUDIT0_collect_2026-08-23.sh\",\"line\":16,\"text\":\"GITEA_REPO=\\\"${AUDIT_GITEA_REPO:-https://git.gram1.ru/homelab-admin/homelab-ops.git}\\\"\"},{\"path\":\"/root/homelab-clean-machine-bootstrap-rehearsal-v1.sh\",\"line\":92,\"text\":\"export DEBIAN_FRONTEND=noninteractive\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":101,\"text\":\"--- git.gram1.ru ---\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":102,\"text\":\"[PRIVATE_IP] STREAM git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":1479,\"text\":\" - domain: git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":1545,\"text\":\"### resolve git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":1546,\"text\":\"95.84.154.183 STREAM git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":1739,\"text\":\"### resolve git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":1740,\"text\":\"95.84.154.183 STREAM git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":2028,\"text\":\" - domain: git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":2091,\"text\":\"### resolve git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":2092,\"text\":\"95.84.154.183 STREAM git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":2265,\"text\":\"### resolve git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":2266,\"text\":\"95.84.154.183 STREAM git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":3358,\"text\":\" GITEA__server__DOMAIN: git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":3359,\"text\":\" GITEA__server__ROOT_URL: https://git.gram1.ru/\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":3668,\"text\":\"9 [\\\"git.gram1.ru\\\"] http 127.0.0.1 3002 29 1 0 0 1 1 0 0 1 \"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":3718,\"text\":\"29 git.gram1.ru [\\\"git.gram1.ru\\\"] letsencrypt 2026-09-13 17:36:55\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":3855,\"text\":\" href: https://git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":3910,\"text\":\" description: Reverse proxy admin\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":5196,\"text\":\"### DNS git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":5197,\"text\":\"[PRIVATE_IP] STREAM git.gram1.ru\"},{\"path\":\"/root/homelab_cluster_audit_supplement_v2_20260623T193322Z.txt\",\"line\":5322,\"text\":\"https://git.gram1.ru/ => 200\"},{\"path\":\"/root/CR0085_IMPLEMENTATION_INPUT_20260819.txt\",\"line\":1358,\"text\":\" \\\"out-data\\\" : \\\"UNIT_BEGIN\\\\n# /etc/systemd/system/homelab-git-read.service\\\\n[Unit]\\\\nDescription=Read-only Gitea facade for ChatGPT\\\\nAfter=network-online.target\\\\nWants=network-online.target\\\\n\\\\n[Service]\\\\nType=simple\\\\nUser=gitread\\\\nGroup=gitread\\\\nExecStart=/usr/bin/python3 /usr/local/libexec/homelab-git-read\\\\nRestart=on-failure\\\\nRestartSec=2\\\\nNoNewPrivileges=true\\\\nPrivateTmp=true\\\\nPrivateDevices=true\\\\nProtectSystem=strict\\\\nProtectHome=true\\\\nProtectKernelTunables=true\\\\nProtectKernelModules=true\\\\nProtectControlGroups=true\\\\nRestrictAddressFamilies=AF_INET AF_INET6\\\\nLockPersonality=true\\\\nMemoryDenyWriteExecute=true\\\\n\\\\n[Install]\\\\nWantedBy=multi-user.target\\\\nUNIT_END\\\\nSOURCE_BEGIN\\\\nd6110a75f789e56231196c314046263785a795ce3d220de9272777a718bca382 /usr/local/libexec/homelab-git-read\\\\n#!/usr/bin/env python3\\\\nfrom __future__ import annotations\\\\nimport base64, json, os, re\\\\nfrom http.server import BaseHTTPRequestHandler, ThreadingHTTPServer\\\\nfrom urllib.parse import parse_qs, quote, urlparse\\\\nfrom urllib.request import Request, urlopen\\\\nfrom urllib.error import HTTPError, URLError\\\\n\\\\nHOST=\\\\\\\"0.0.0.0\\\\\\\"\\\\nPORT=8787\\\\nAPI=\\\\\\\"https://git.gram1.ru/api/v1/repos/homelab-admin/homelab-ops\\\\\\\"\\\\nTOKEN_FILE=\\\\\"},{\"path\":\"/root/771j_crowdsec_capi_via_cloudflare_warp_proxy.sh\",\"line\":228,\"text\":\" export DEBIAN_FRONTEND=noninteractive\"},{\"path\":\"/root/771j_crowdsec_capi_via_cloudflare_warp_proxy.sh\",\"line\":567,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/771k_fix_warp_register_or_clean.sh\",\"line\":569,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/Workers2_AUDIT1_deep_collect_20260823_v1.py\",\"line\":24,\"text\":\"GITEA_REPO = \\\"https://git.gram1.ru/homelab-admin/homelab-ops.git\\\"\"},{\"path\":\"/root/Workers2_AUDIT1_deep_collect_20260823_v1.py\",\"line\":25,\"text\":\"GITEA_HOST = \\\"git.gram1.ru\\\"\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":257,\"text\":\"### NAT / port forwarding\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":546,\"text\":\"- Role: edge application host / reverse proxy / monitoring / backup automation host.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":614,\"text\":\"- git.gram1.ru -> [PRIVATE_IP].\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":625,\"text\":\"- Public WAN router forwards TCP/80 and TCP/443 to NPMplus on edge-vm, [PRIVATE_IP].\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":647,\"text\":\"- git.gram1.ru -> http://127.0.0.1:3002, cert=29, ssl_forced=1, enabled=1.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":696,\"text\":\"- cert=29: git.gram1.ru, expires 2026-09-13 17:36:55.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":1000,\"text\":\" - https://git.gram1.ru\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":1056,\"text\":\"- external canary checks include nc.gram1.ru, git.gram1.ru, auth.gram1.ru, backup.gram1.ru.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":1299,\"text\":\"- Reverse proxy: NPMplus on edge-vm, container npmplus, host networking, admin bound to 127.0.0.1:81.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":1313,\"text\":\"| git.gram1.ru | http://127.0.0.1:3002 | edge-vm / gitea | gitea backup/offhost/restore |\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":1864,\"text\":\"- Discovery proof records DNS, HTTPS/TLS headers, reverse-proxy candidates, compose files, domain references and homepage config candidates without printing secrets.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":2095,\"text\":\"- Bulk import of five forums reached DB/files/nginx/php-fpm ready state, but frontend body stayed empty under PHP 8.5.7.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":2107,\"text\":\"- Final result: all five frontend/admin HTTP 200, www redirects 301, internal_data 403, no new XenForo errors.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":2457,\"text\":\"- Recommended future path: establish VPN/NetBird/WireGuard or reverse-proxy/private management endpoint first; then issue DNS-01 certificate on a trusted node and deploy cert/key to the router only over that private path.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":2503,\"text\":\"- TLS terminates on edge using certbot DNS-01 cert router-taftauto.ru.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":2814,\"text\":\"- Primary domain: chat.gram1.ru.\"},{\"path\":\"/root/31_HOMELAB_REFERENCE.before-cr0079-20260817T052826Z.md\",\"line\":2815,\"text\":\"- groups.chat.gram1.ru and share.chat.gram1.ru are Snikket service domains.\"},{\"path\":\"/root/hread-06.py\",\"line\":108,\"text\":\" if (u.scheme != 'https' or u.netloc != 'git.gram1.ru' or\"},{\"path\":\"/root/771e_abort_cleanup_verify_stable.sh\",\"line\":100,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/hread-04.py\",\"line\":104,\"text\":\" if (u.scheme != 'https' or u.netloc != 'git.gram1.ru' or\"},{\"path\":\"/root/771s_vps_identity_repair_netbird_capi.sh\",\"line\":704,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/771q_netbird_public_vps_repair_then_capi.sh\",\"line\":594,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.ru mealie.vpn.gram1.ru karakeep.vpn.gram1.ru dozzle.gram1.ru npmplus.vpn.gram1.ru; do\"},{\"path\":\"/root/build_full_8020_demonov_handoff.sh\",\"line\":351,\"text\":\"https://git.gram1.ru/homelab-admin/8020-demonov-shadow-bot.git\"},{\"path\":\"/root/771ae_crowdsec_capi_soak_final.sh\",\"line\":105,\"text\":\" for h in auth.gram1.ru photos.gram1.ru git.gram1.ru n8n.vpn.gram1.r... -SSH_CONFIG_REFERENCES=[{"line":"# users, and the values can be changed in per-user configuration files","path":"/etc/ssh/ssh_config"},{"line":"Host *","path":"/etc/ssh/ssh_config"},{"line":"# ProxyCommand ssh -q -W %h:%p gateway.example.com","path":"/etc/ssh/ssh_config"}] -FINAL_DECISION=FRONTEND_FORENSIC3_COMPLETE_NO_MUTATION -FORENSIC3_END=true +SB043G_PRESTATE={"active_env":{"APP_IMAGE":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","CODE_IDENTITY":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","COLLECTION_START_AT":"2026-09-07T00:00:00+00:00","EXPERIMENT_ID":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","RUNTIME_MANIFEST_ID":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"new_image_id":"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99","services":[{"container_id":"a546a70c3e8c263d9b590cd78ee206bcda0cfcdb6662327e8415ca0e29ad1501","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":14,"running":true,"service":"collector","started_at":"2026-09-08T07:38:09.79483772Z"},{"container_id":"d8023f4cbf91f9382e39eec0436c9cebc7665535b42b950e95408c03ff9bf30d","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":0,"running":true,"service":"relay","started_at":"2026-09-06T18:48:20.603414848Z"},{"container_id":"1feeca2d9428cd5a277c026bef34534db307657dcdcd63aff98ea66e44f8b9c5","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":0,"running":true,"service":"shadow","started_at":"2026-09-06T18:48:20.768190553Z"},{"container_id":"889be41d2cee9d327811da78388f834ba6eafe4c0eeae456867ed0df76832d01","image":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","restart_count":0,"running":true,"service":"worker","started_at":"2026-09-06T18:48:20.586788319Z"}],"stage_result":{"active_env_unchanged":true,"build_context":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5","collector_source_sha256":"193dd0c7f9890fdb4026c24dbc5add825f1641d92097e881806705ca452812d5","copy_source":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/demonov_forward_map","decision":"DEPLOY_STAGE_READY","dockerfile":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5/Dockerfile","helper_candidates":{"demonov_forward_map.live_prospective":[{"name":"_hash","pure_candidate":true,"signature":"(value: 'object') -> 'str'"}],"demonov_forward_map.runtime_integrity":[{"name":"canonical_hash","pure_candidate":true,"signature":"(payload: 'Any') -> 'str'"},{"name":"verify_experiment_seal_receipt","pure_candidate":true,"signature":"(*, bundle: 'FinalProspectiveSealBundle', receipt: 'ExperimentSealReceipt', collection_start_at: 'datetime', receipt_verifier: 'Callable[[ExperimentSealReceipt], bool]') -> 'None'"},{"name":"required_retained_hashes","pure_candidate":true,"signature":"(*, runtime_registry: 'RuntimeRegistry', model_registry: 'FinalModelRegistry', state_snapshots: 'Sequence[StateSnapshotManifest]' = (), predictor_runtime: 'PredictorRuntimeManifest | None' = None) -> 'Mapping[str, RetainedArtifactKind]'"}],"demonov_forward_map.runtime_manifest":[{"name":"canonical_hash","pure_candidate":true,"signature":"(payload: 'Any') -> 'str'"},{"name":"verify_runtime_manifest","pure_candidate":true,"signature":"(manifest: 'RuntimeDeploymentManifestV1', *, expected_code_identity: 'str', actual_image_id: 'str', actual_package_identity: 'str') -> 'None'"}]},"new_image":"8020-demonov-shadow:76e1f58baa544a0e208bba317f0150e5b6d74dbd","new_image_id":"sha256:341f71a906c91d3fa9c1d50bd89df2a849dfb0b168bb4551efb444bf61c4ab99","policy":{"close_timeout":5,"open_timeout":10,"ping_interval":20,"ping_timeout":60},"runtime_activated":false,"service_identity_unchanged":true,"stage_path":"/opt/stacks/8020-demonov-shadow/.deploy/SIGNALBOT-260908-DEPLOY-STAGE-042FIX5","websockets_version":"15.0.1"}} +SB043G_MANIFEST_CLASS_CONTRACT={"class":"RuntimeDeploymentManifestV1","decorators":["dataclass(frozen=True)"],"fields":["runtime_manifest_id","code_identity","package_identity","application_image_id","base_image_digest","compose_hash","finality_policy_id"],"identity_methods":[{"args":["self"],"decorators":["property"],"kwonly":[],"name":"content_hash","source":"def content_hash(self) -> str:\n return canonical_hash(\n {\n \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,\n \"compose_hash\": self.compose_hash,\n \"finality_policy_id\": self.finality_policy_id,\n }\n )","source_sha256":"5ca3618001bfac422d4ff365e429f2f057196f3b78d67cd666458d4db2011e4b"},{"args":["self"],"decorators":[],"kwonly":[],"name":"__post_init__","source":"def __post_init__(self) -> None:\n _sha256_hex(self.runtime_manifest_id, \"runtime manifest id\")\n _required(self.code_identity, \"code identity\")\n if _GIT_ID_RE.fullmatch(self.code_identity) is None:\n raise DemonovError(\n \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")\n _sha256_hex(self.compose_hash, \"compose hash\")\n _required(self.finality_policy_id, \"finality policy id\")\n if self.runtime_manifest_id != self.content_hash:\n raise DemonovError(\n \"runtime manifest id must be content-addressed\"\n )","source_sha256":"bb8a8ccd8a52d6d3ac094e6e8abecdc4aeb6edaf8094d2c6477a0cd0d26fa868"},{"args":["cls"],"decorators":["classmethod"],"kwonly":["code_identity","package_identity","application_image_id","base_image_digest","compose_hash","finality_policy_id"],"name":"build","source":"def build(\n cls,\n *,\n code_identity: str,\n package_identity: str,\n application_image_id: str,\n base_image_digest: str,\n compose_hash: str,\n finality_policy_id: str,\n ) -> \"RuntimeDeploymentManifestV1\":\n payload = {\n \"code_identity\": code_identity,\n \"package_identity\": package_identity,\n \"application_image_id\": application_image_id,\n \"base_image_digest\": base_image_digest,\n \"compose_hash\": compose_hash,\n \"finality_policy_id\": finality_policy_id,\n }\n runtime_manifest_id = canonical_hash(\n {\n \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n **payload,\n }\n )\n return cls(\n runtime_manifest_id=runtime_manifest_id,\n **payload,\n )","source_sha256":"1b6e558b28eb2a46959d4761d391e7e755188743919bddb6f19365278d731655"}]} +SB043G_EXPERIMENT_CLASS_CONTRACT={"class":"ExperimentProvenance","decorators":["dataclass(frozen=True)"],"fields":["experiment_id","collection_start_at","code_identity","policy_registry_id","market_bundle_id","geometry_policy_id","demonov_branch_policy_id","notification_policy_id","outcome_policy_id","experiment_version","finality_policy_id","runtime_manifest_id"],"identity_methods":[{"args":["self"],"decorators":[],"kwonly":[],"name":"_base_hash_payload","source":"def _base_hash_payload(self) -> dict:\n return {\n \"collection_start_at\": self.collection_start_at.isoformat(),\n \"code_identity\": self.code_identity,\n \"policy_registry_id\": self.policy_registry_id,\n \"market_bundle_id\": self.market_bundle_id,\n \"geometry_policy_id\": self.geometry_policy_id,\n \"demonov_branch_policy_id\": self.demonov_branch_policy_id,\n \"notification_policy_id\": self.notification_policy_id,\n \"outcome_policy_id\": self.outcome_policy_id,\n }","source_sha256":"5c0856d58b2198065cead5610b07495683872df3c1102c76275626ef39077bbe"},{"args":["self"],"decorators":["property"],"kwonly":[],"name":"content_hash","source":"def content_hash(self) -> str:\n payload = self._base_hash_payload()\n if self.experiment_version == \"LIVE_PROSPECTIVE_V1\":\n return _hash(payload)\n if self.experiment_version == \"LIVE_PROSPECTIVE_V2\":\n payload.update({\n \"experiment_version\": self.experiment_version,\n \"finality_policy_id\": self.finality_policy_id,\n \"runtime_manifest_id\": self.runtime_manifest_id,\n })\n return _hash(payload)\n raise DemonovError(\"experiment provenance version invalid\")","source_sha256":"6c1f33004948b1a62c9ae567c7556ab6d3ccb414d8fdd0ea641ad24e2577914a"},{"args":["self"],"decorators":[],"kwonly":[],"name":"__post_init__","source":"def __post_init__(self) -> None:\n if (\n self.collection_start_at.tzinfo is None\n or self.collection_start_at.utcoffset() is None\n ):\n raise DemonovError(\n \"experiment collection start must be timezone-aware\"\n )\n if self.experiment_version == \"LIVE_PROSPECTIVE_V1\":\n if self.finality_policy_id or self.runtime_manifest_id:\n raise DemonovError(\n \"V1 experiment provenance cannot bind V2 finality/runtime identity\"\n )\n elif self.experiment_version == \"LIVE_PROSPECTIVE_V2\":\n if not isinstance(self.finality_policy_id, str) or not self.finality_policy_id:\n raise DemonovError(\n \"V2 experiment finality policy id is required\"\n )\n if (\n not isinstance(self.runtime_manifest_id, str)\n or len(self.runtime_manifest_id) != 64\n or any(\n c not in \"0123456789abcdef\"\n for c in self.runtime_manifest_id\n )\n ):\n raise DemonovError(\n \"V2 experiment runtime manifest id must be lowercase sha256 hex\"\n )\n else:\n raise DemonovError(\"experiment provenance version invalid\")\n if self.experiment_id != self.content_hash:\n raise DemonovError(\n \"experiment provenance id must be content-addressed\"\n )","source_sha256":"0451d874842317d2aaad4a3f285d8e8c9531610fe507c7a6c51cb7541410a8cb"},{"args":["cls"],"decorators":["classmethod"],"kwonly":[],"name":"build","source":"def build(cls, **kwargs) -> \"ExperimentProvenance\":\n payload = dict(kwargs)\n version = payload.get(\n \"experiment_version\",\n \"LIVE_PROSPECTIVE_V1\",\n )\n payload[\"experiment_version\"] = version\n payload.setdefault(\"finality_policy_id\", \"\")\n payload.setdefault(\"runtime_manifest_id\", \"\")\n base = {\n \"collection_start_at\": payload[\"collection_start_at\"].isoformat(),\n \"code_identity\": payload[\"code_identity\"],\n \"policy_registry_id\": payload[\"policy_registry_id\"],\n \"market_bundle_id\": payload[\"market_bundle_id\"],\n \"geometry_policy_id\": payload[\"geometry_policy_id\"],\n \"demonov_branch_policy_id\": payload[\"demonov_branch_policy_id\"],\n \"notification_policy_id\": payload[\"notification_policy_id\"],\n \"outcome_policy_id\": payload[\"outcome_policy_id\"],\n }\n if version == \"LIVE_PROSPECTIVE_V1\":\n eid = _hash(base)\n elif version == \"LIVE_PROSPECTIVE_V2\":\n eid = _hash({\n **base,\n \"experiment_version\": version,\n \"finality_policy_id\": payload[\"finality_policy_id\"],\n \"runtime_manifest_id\": payload[\"runtime_manifest_id\"],\n })\n else:\n raise DemonovError(\"experiment provenance version invalid\")\n return cls(experiment_id=eid, **payload)","source_sha256":"baff34f1b0f70ebba9ab9f354e9e91523e3cfa85fcd4ec747c1d7d62d37642c6"},{"args":["cls","data"],"decorators":["classmethod"],"kwonly":[],"name":"from_json","source":"def from_json(cls, data: dict) -> \"ExperimentProvenance\":\n payload = dict(data)\n payload[\"collection_start_at\"] = datetime.fromisoformat(\n payload[\"collection_start_at\"]\n )\n payload.setdefault(\n \"experiment_version\",\n \"LIVE_PROSPECTIVE_V1\",\n )\n payload.setdefault(\"finality_policy_id\", \"\")\n payload.setdefault(\"runtime_manifest_id\", \"\")\n return cls(**payload)","source_sha256":"4b526e7094fb03b02d5e63439627dc0340040cebc9b77f557b107e475e9c4f9f"}]} +SB043G_PACKAGE_REFERENCES=[{"lineno":29,"name":"PackageCodeIdentityV1844","node":"ClassDef","path":"code_identity.py","source":"class PackageCodeIdentityV1844:\n package_name: str\n modules: Tuple[ModuleCodeIdentityV1844, ...]\n\n @property\n def package_manifest_id(self) -> str:\n return canonical_hash({\n \"package_name\": self.package_name,\n \"modules\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\n })","source_sha256":"d4faf873bec896466fdfcd7514cd453a8646994d5f998aa3bc0b84716c3118f5"},{"lineno":80,"name":"package_code_identity","node":"FunctionDef","path":"code_identity.py","source":"def package_code_identity(package_dir: str | Path) -> PackageCodeIdentityV1844:\n root = Path(package_dir)\n modules = tuple(module_code_identity(p, root=root) for p in sorted(root.rglob('*.py')))\n if not modules:\n raise DemonovError('package contains no Python modules')\n return PackageCodeIdentityV1844(root.name, modules)","source_sha256":"a45a4817fabf86fb8f47df513d780c6dfe1d3cc159fb428a36a5180f2020a607"},{"lineno":34,"name":"package_manifest_id","node":"FunctionDef","path":"code_identity.py","source":"def package_manifest_id(self) -> str:\n return canonical_hash({\n \"package_name\": self.package_name,\n \"modules\": tuple((m.relative_path, m.semantic_ast_hash, m.top_level_bindings) for m in self.modules),\n })","source_sha256":"7d15a9e82d5388664fa96a527ed60716f32dadb1561284ae2f7d1024ed5edb2b"},{"lineno":40,"name":null,"node":"AnnAssign","path":"runtime_manifest.py","source":" runtime_manifest_id: str\n code_identity: str\n package_identity: str\n application_image_id: str\n base_image_digest: str","source_sha256":"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926"},{"lineno":122,"name":null,"node":"If","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":40,"name":null,"node":"Name","path":"runtime_manifest.py","source":" runtime_manifest_id: str\n code_identity: str\n package_identity: str\n application_image_id: str\n base_image_digest: str","source_sha256":"e8973e35539c5cdc865235a94aa7806032fec4558a81676bd1b6b6df120e0926"},{"lineno":67,"name":null,"node":"Expr","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":113,"name":null,"node":"arg","path":"runtime_manifest.py","source":" expected_code_identity: str,\n actual_image_id: str,\n actual_package_identity: str,\n) -> None:\n if not isinstance(manifest, RuntimeDeploymentManifestV1):","source_sha256":"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d"},{"lineno":122,"name":null,"node":"Compare","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":67,"name":null,"node":"Call","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":82,"name":null,"node":"arg","path":"runtime_manifest.py","source":" *,\n code_identity: str,\n package_identity: str,\n application_image_id: str,\n base_image_digest: str,","source_sha256":"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6"},{"lineno":113,"name":null,"node":"Name","path":"runtime_manifest.py","source":" expected_code_identity: str,\n actual_image_id: str,\n actual_package_identity: str,\n) -> None:\n if not isinstance(manifest, RuntimeDeploymentManifestV1):","source_sha256":"9ca161961de23dfb6e30851f61395e6edfa3f623e6b40f9a46812eb4fcd7311d"},{"lineno":122,"name":null,"node":"Attribute","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":122,"name":null,"node":"Name","path":"runtime_manifest.py","source":" if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")","source_sha256":"4136a5ccb7d998a38e77368dc0c3cd3dce49127799dc62951f9584f7de351faa"},{"lineno":67,"name":null,"node":"Name","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":67,"name":null,"node":"Attribute","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":67,"name":null,"node":"Constant","path":"runtime_manifest.py","source":" \"code identity must be lowercase 40-64 hex\"\n )\n _sha256_hex(self.package_identity, \"package identity\")\n _sha256_id(self.application_image_id, \"application image id\")\n _sha256_id(self.base_image_digest, \"base image digest\")","source_sha256":"eb7af820b99d09b06910fe507ce82dd3439fe2d1a325429a7c7baa3643513897"},{"lineno":82,"name":null,"node":"Name","path":"runtime_manifest.py","source":" *,\n code_identity: str,\n package_identity: str,\n application_image_id: str,\n base_image_digest: str,","source_sha256":"3318eac6352275bf21d2ce04604537ac7aa59a61c2ce6ebbc588a03acbfec5e6"},{"lineno":90,"name":null,"node":"Constant","path":"runtime_manifest.py","source":" payload = {\n \"code_identity\": code_identity,\n \"package_identity\": package_identity,\n \"application_image_id\": application_image_id,\n \"base_image_digest\": base_image_digest,","source_sha256":"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157"},{"lineno":90,"name":null,"node":"Name","path":"runtime_manifest.py","source":" payload = {\n \"code_identity\": code_identity,\n \"package_identity\": package_identity,\n \"application_image_id\": application_image_id,\n \"base_image_digest\": base_image_digest,","source_sha256":"3a24759c9d3fea5a1002cabae3ef4b398ccbafde61c4afea25ca3a997b324157"},{"lineno":52,"name":null,"node":"Constant","path":"runtime_manifest.py","source":" \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,","source_sha256":"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61"},{"lineno":52,"name":null,"node":"Attribute","path":"runtime_manifest.py","source":" \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,","source_sha256":"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61"},{"lineno":52,"name":null,"node":"Name","path":"runtime_manifest.py","source":" \"schema\": \"CR0116_RUNTIME_DEPLOYMENT_MANIFEST_V1\",\n \"code_identity\": self.code_identity,\n \"package_identity\": self.package_identity,\n \"application_image_id\": self.application_image_id,\n \"base_image_digest\": self.base_image_digest,","source_sha256":"328fe038817500e32b4271d965c5ac98a2c391baf0b753e2b1709022c6fbcc61"}] +SB043G_OLD_PACKAGE_DIRECT={"compressed_sha256":"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32","new_dir_file_count":57,"old_dir_file_count":57,"old_package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","tar_exists":true,"tar_sha256":"431ddf9e8938d5e583553f05f9e3d019aff0b439c83b0b23c81808073b7d61a8"} +SB043G_PACKAGE_CANDIDATE_MATCHES=[] +SB043G_DERIVED_NEW_PACKAGE_CANDIDATES=[] +SB043G_OLD_MANIFEST_OBJECT={"application_image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","base_image_digest":"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","compose_hash":"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"} +SB043G_OLD_EXPERIMENT_OBJECT={"code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","collection_start_at":"2026-09-07T00:00:00+00:00","demonov_branch_policy_id":"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1","experiment_id":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","experiment_version":"LIVE_PROSPECTIVE_V2","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","geometry_policy_id":"RESEARCH_RECONSTRUCTION_8020_V1","market_bundle_id":"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae","notification_policy_id":"SIGNIFICANT_STATE_CHANGE_EMAIL_V1","outcome_policy_id":"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1","policy_registry_id":"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"} +SB043G_HOLDS=[] +SB043G_DECISION=SEAL_GENERATION_EVIDENCE_READY +SB043G_MUTATION_SCOPE=NONE_READ_ONLY +SIGNALBOT043G_HOLDS=[] +SIGNALBOT043G_DECISION=SEAL_GENERATION_EVIDENCE_READY +SIGNALBOT043G_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION OUTPUT_END CHAT_OUTPUT_END