From c6dae5b7e80097e41200b8b3920c315bbe73cfc9 Mon Sep 17 00:00:00 2001 From: Buyurgutdev <178499136+Buyurgutdev@users.noreply.github.com> Date: Fri, 19 Jun 2026 09:12:04 -0600 Subject: [PATCH 1/7] Add diagnostic redaction regression tests --- build.py | 128 ++++++++++++++++++++++++++++- tests/test_diagnostic_redaction.py | 84 +++++++++++++++++++ 2 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 tests/test_diagnostic_redaction.py diff --git a/build.py b/build.py index 07b97c41..b9c76508 100644 --- a/build.py +++ b/build.py @@ -9,6 +9,7 @@ import shutil import subprocess import sys +import tempfile import time from dataclasses import dataclass from pathlib import Path @@ -440,6 +441,129 @@ def run_cmd(cmd: list[str], **kwargs) -> tuple[bool, str]: return False, str(e) +def _redaction_tokens() -> list[str]: + """Return local-only values that must not be written to diagnostic metadata.""" + values: set[str] = set() + + path_values = [ + ROOT, + Path.home(), + Path(tempfile.gettempdir()), + ] + for env_key in ("TMP", "TEMP", "TMPDIR"): + env_value = os.environ.get(env_key) + if env_value: + path_values.append(Path(env_value)) + + for path in path_values: + try: + resolved = path.resolve() + except OSError: + resolved = path + for candidate in {str(path), path.as_posix(), str(resolved), resolved.as_posix()}: + if candidate: + values.add(candidate) + + for env_key in ("USER", "USERNAME", "LOGNAME"): + env_value = os.environ.get(env_key) + if env_value: + values.add(env_value) + + for value in (getpass.getuser(), platform.node()): + if value: + values.add(value) + + return sorted((value for value in values if value), key=len, reverse=True) + + +def redact_diagnostic_text(value: str) -> str: + """Redact local paths, usernames, and hostnames from diagnostic metadata text.""" + redacted = value + for token in _redaction_tokens(): + redacted = redacted.replace(token, "") + return redacted + + +def repo_relative_metadata_path(path: Optional[str]) -> Optional[str]: + """Return a repository-relative `/` path when possible, otherwise redacted text.""" + if path is None: + return None + + path_obj = Path(path) + try: + relpath = path_obj.resolve().relative_to(ROOT) + return relpath.as_posix() + except (OSError, ValueError): + return redact_diagnostic_text(str(path)) + + +def _iter_metadata_strings(value): + if isinstance(value, str): + yield value + elif isinstance(value, dict): + for nested in value.values(): + yield from _iter_metadata_strings(nested) + elif isinstance(value, list): + for nested in value: + yield from _iter_metadata_strings(nested) + + +def validate_diagnostic_metadata(metadata_path: Path, root: Path = ROOT) -> list[str]: + """Validate diagnostic JSON redaction and `.logd` pairing. + + Returns a list of human-readable validation errors. An empty list means the + metadata is safe to submit with its paired encrypted diagnostic artifact. + """ + errors: list[str] = [] + if not metadata_path.exists(): + return [f"diagnostic metadata is missing: {metadata_path}"] + + try: + metadata = json.loads(metadata_path.read_text(encoding="utf-8")) + except json.JSONDecodeError as exc: + return [f"diagnostic metadata is not valid JSON: {exc}"] + + logd_value = metadata.get("diagnostic_logd") + if isinstance(logd_value, str): + logd_paths = [logd_value] + elif isinstance(logd_value, list) and all(isinstance(item, str) for item in logd_value): + logd_paths = logd_value + else: + logd_paths = [] + errors.append("diagnostic_logd must be a relative .logd path or a list of relative .logd paths") + + for relpath in logd_paths: + if "\\" in relpath: + errors.append(f"diagnostic_logd uses backslashes instead of `/`: {relpath}") + if Path(relpath).is_absolute(): + errors.append(f"diagnostic_logd must be repository-relative: {relpath}") + if ".." in Path(relpath).parts: + errors.append(f"diagnostic_logd must not traverse outside the repository: {relpath}") + if not relpath.endswith(".logd"): + errors.append(f"diagnostic_logd must point to a .logd artifact: {relpath}") + artifact_path = root / relpath + if not artifact_path.exists(): + errors.append(f"diagnostic_logd artifact is missing: {relpath}") + + sensitive_values = [value for value in _redaction_tokens() if value and value != str(root)] + for text_value in _iter_metadata_strings(metadata): + for token in sensitive_values: + if token in text_value: + errors.append(f"diagnostic metadata leaks local value `{token}`") + + for module in metadata.get("modules", []): + if not isinstance(module, dict): + continue + artifact = module.get("artifact") + if isinstance(artifact, str): + if "\\" in artifact: + errors.append(f"module artifact uses backslashes instead of `/`: {artifact}") + if Path(artifact).is_absolute(): + errors.append(f"module artifact must be repository-relative: {artifact}") + + return errors + + def collect_system_info() -> str: lines = [ "Tent of Trials - System Diagnostic Snapshot", @@ -523,8 +647,8 @@ def build_diagnostic_report( "name": name, "status": "PASS" if success else "FAIL", "elapsed_seconds": round(elapsed, 3), - "artifact": binary, - "output": output, + "artifact": repo_relative_metadata_path(binary), + "output": redact_diagnostic_text(output), } for name, success, elapsed, output, binary in results ], diff --git a/tests/test_diagnostic_redaction.py b/tests/test_diagnostic_redaction.py new file mode 100644 index 00000000..a0875a1c --- /dev/null +++ b/tests/test_diagnostic_redaction.py @@ -0,0 +1,84 @@ +import getpass +import json +import platform +import tempfile +import unittest +from pathlib import Path + +import build + + +class DiagnosticRedactionTests(unittest.TestCase): + def test_report_uses_relative_artifact_paths_and_redacts_local_output(self): + local_values = [ + str(build.ROOT), + build.ROOT.as_posix(), + str(Path.home()), + Path.home().as_posix(), + tempfile.gettempdir(), + getpass.getuser(), + platform.node(), + ] + output = "\n".join(value for value in local_values if value) + artifact = build.ROOT / "backend" / "target" / "debug" / "backend" + + report = build.build_diagnostic_report( + [("backend", True, 1.234, output, str(artifact))], + "12345678", + logd_relpaths=["diagnostic/build-12345678.logd"], + password="test-password", + ) + + module = report["modules"][0] + self.assertEqual(module["artifact"], "backend/target/debug/backend") + for value in local_values: + if value: + self.assertNotIn(value, module["output"]) + + def test_metadata_validator_accepts_relative_json_logd_pair(self): + with tempfile.TemporaryDirectory() as tmpdir: + root = Path(tmpdir) + diagnostic_dir = root / "diagnostic" + diagnostic_dir.mkdir() + logd_path = diagnostic_dir / "build-12345678.logd" + logd_path.write_bytes(b"encrypted diagnostic placeholder") + metadata_path = diagnostic_dir / "build-12345678.json" + metadata_path.write_text( + json.dumps( + { + "diagnostic_logd": "diagnostic/build-12345678.logd", + "modules": [ + { + "name": "backend", + "status": "PASS", + "artifact": "backend/target/debug/backend", + "output": "redacted output", + } + ], + } + ), + encoding="utf-8", + ) + + self.assertEqual(build.validate_diagnostic_metadata(metadata_path, root=root), []) + + def test_metadata_validator_reports_missing_json_and_mismatched_logd(self): + with tempfile.TemporaryDirectory() as tmpdir: + root = Path(tmpdir) + missing_json = root / "diagnostic" / "missing.json" + self.assertIn("diagnostic metadata is missing", build.validate_diagnostic_metadata(missing_json, root=root)[0]) + + diagnostic_dir = root / "diagnostic" + diagnostic_dir.mkdir() + metadata_path = diagnostic_dir / "build-12345678.json" + metadata_path.write_text( + json.dumps({"diagnostic_logd": "diagnostic/build-deadbeef.logd", "modules": []}), + encoding="utf-8", + ) + + errors = build.validate_diagnostic_metadata(metadata_path, root=root) + self.assertTrue(any("artifact is missing" in error for error in errors)) + + +if __name__ == "__main__": + unittest.main() From 7cf6d0713708eb39ef41c0edc076aa74fafc865b Mon Sep 17 00:00:00 2001 From: Buyurgutdev <178499136+Buyurgutdev@users.noreply.github.com> Date: Fri, 19 Jun 2026 09:27:34 -0600 Subject: [PATCH 2/7] Add diagnostic build metadata --- diagnostic/build-00000000.json | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/diagnostic/build-00000000.json b/diagnostic/build-00000000.json index 33e2ca62..7a596a30 100644 --- a/diagnostic/build-00000000.json +++ b/diagnostic/build-00000000.json @@ -1,23 +1,24 @@ { - "generated_at": "2026-06-16T15:23:47.496569+00:00", + "generated_at": "2026-06-19T15:13:15.891573+00:00", "commit": "00000000", - "diagnostic_logd": "diagnostic/build-00000000.logd", + "diagnostic_logd": null, "diagnostic_logd_error": null, + "message_blocker": null, "chunked": false, "chunk_size_bytes": null, - "password": "4c7df15ab09fbb066197", - "decrypt_command": "encryptly unpack diagnostic/build-00000000.logd --password 4c7df15ab09fbb066197", + "password": null, + "decrypt_command": null, "total_modules": 1, "passed": 0, "failed": 1, "modules": [ { - "name": "frailbox", + "name": "encryptly-preflight", "status": "FAIL", - "elapsed_seconds": 0, + "elapsed_seconds": 60.208, "artifact": null, - "output": "Command not found: [Errno 2] No such file or directory: 'make'" + "output": "You need to fix your environment so encryptly runs before building. encryptly preflight TIMEOUT (60s)" } ], - "pr_note": "Include this JSON diagnostic report and diagnostic/build-00000000.logd in your PR. Maintainers may ask you to remove these diagnostic artifacts before merging." + "pr_note": "Encrypted diagnostic logd artifact was not created; include this JSON report showing why. The encrypted .logd is the required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging." } From b97e59ad9a9b9f7d81a9c60c8983cc7f95403b16 Mon Sep 17 00:00:00 2001 From: Buyurgutdev <178499136+Buyurgutdev@users.noreply.github.com> Date: Fri, 19 Jun 2026 09:40:03 -0600 Subject: [PATCH 3/7] Refresh diagnostic metadata for PR commit --- diagnostic/{build-00000000.json => build-7cf6d071.json} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename diagnostic/{build-00000000.json => build-7cf6d071.json} (87%) diff --git a/diagnostic/build-00000000.json b/diagnostic/build-7cf6d071.json similarity index 87% rename from diagnostic/build-00000000.json rename to diagnostic/build-7cf6d071.json index 7a596a30..b28b41ef 100644 --- a/diagnostic/build-00000000.json +++ b/diagnostic/build-7cf6d071.json @@ -1,6 +1,6 @@ { - "generated_at": "2026-06-19T15:13:15.891573+00:00", - "commit": "00000000", + "generated_at": "2026-06-19T15:32:41.920612+00:00", + "commit": "7cf6d071", "diagnostic_logd": null, "diagnostic_logd_error": null, "message_blocker": null, @@ -15,7 +15,7 @@ { "name": "encryptly-preflight", "status": "FAIL", - "elapsed_seconds": 60.208, + "elapsed_seconds": 60.097, "artifact": null, "output": "You need to fix your environment so encryptly runs before building. encryptly preflight TIMEOUT (60s)" } From f883bc3f54a7114aa06bb74f879089fb5eddafa0 Mon Sep 17 00:00:00 2001 From: Buyurgutdev <178499136+Buyurgutdev@users.noreply.github.com> Date: Sat, 20 Jun 2026 09:51:51 -0600 Subject: [PATCH 4/7] Redact diagnostic bundle logs --- build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.py b/build.py index b9c76508..1d609193 100644 --- a/build.py +++ b/build.py @@ -755,7 +755,7 @@ def generate_logd( safe_dir.mkdir(parents=True, exist_ok=True) (safe_dir / "system-info.txt").write_text( - collect_system_info(), encoding="utf-8" + redact_diagnostic_text(collect_system_info()), encoding="utf-8" ) summary_lines = [ @@ -786,7 +786,7 @@ def generate_logd( if binary: log_lines.append(f"artifact: {binary}") if output: - log_lines.append(output) + log_lines.append(redact_diagnostic_text(output)) (safe_dir / "build.log").write_text("\n".join(log_lines), encoding="utf-8") sr = subprocess.run( From 5bf3062e0765d9f740e40c383cee0716074513ee Mon Sep 17 00:00:00 2001 From: Buyurgutdev <178499136+Buyurgutdev@users.noreply.github.com> Date: Sat, 20 Jun 2026 09:52:02 -0600 Subject: [PATCH 5/7] Add build diagnostics for f883bc3f --- diagnostic/build-f883bc3f.json | 24 ++++++++++++++++++++++++ diagnostic/build-f883bc3f.logd | Bin 0 -> 2520 bytes 2 files changed, 24 insertions(+) create mode 100644 diagnostic/build-f883bc3f.json create mode 100644 diagnostic/build-f883bc3f.logd diff --git a/diagnostic/build-f883bc3f.json b/diagnostic/build-f883bc3f.json new file mode 100644 index 00000000..ac30d18e --- /dev/null +++ b/diagnostic/build-f883bc3f.json @@ -0,0 +1,24 @@ +{ + "generated_at": "2026-06-20T15:52:02.140664+00:00", + "commit": "f883bc3f", + "diagnostic_logd": "diagnostic/build-f883bc3f.logd", + "diagnostic_logd_error": null, + "message_blocker": null, + "chunked": false, + "chunk_size_bytes": null, + "password": "090327197213913c415e", + "decrypt_command": "encryptly unpack diagnostic/build-f883bc3f.logd --password 090327197213913c415e", + "total_modules": 1, + "passed": 1, + "failed": 0, + "modules": [ + { + "name": "frailbox", + "status": "PASS", + "elapsed_seconds": 0.005, + "artifact": "frailbox/frailbox", + "output": "make: Nothing to be done for 'all'." + } + ], + "pr_note": "Include the encrypted diagnostic logd artifact(s): diagnostic/build-f883bc3f.logd. The encrypted .logd is the required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging." +} diff --git a/diagnostic/build-f883bc3f.logd b/diagnostic/build-f883bc3f.logd new file mode 100644 index 0000000000000000000000000000000000000000..3d4aad8ef0394f8ad317e7d5b7f0f1008a461f70 GIT binary patch literal 2520 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 im5a=8VmYq!%KF(9)n)f#-~}?cpy*BfG(K Date: Sun, 21 Jun 2026 07:25:25 -0600 Subject: [PATCH 6/7] Remove obsolete diagnostic artifacts --- diagnostic/build-7cf6d071.json | 24 ------------------------ diagnostic/build-f883bc3f.json | 24 ------------------------ diagnostic/build-f883bc3f.logd | Bin 2520 -> 0 bytes 3 files changed, 48 deletions(-) delete mode 100644 diagnostic/build-7cf6d071.json delete mode 100644 diagnostic/build-f883bc3f.json delete mode 100644 diagnostic/build-f883bc3f.logd diff --git a/diagnostic/build-7cf6d071.json b/diagnostic/build-7cf6d071.json deleted file mode 100644 index b28b41ef..00000000 --- a/diagnostic/build-7cf6d071.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "generated_at": "2026-06-19T15:32:41.920612+00:00", - "commit": "7cf6d071", - "diagnostic_logd": null, - "diagnostic_logd_error": null, - "message_blocker": null, - "chunked": false, - "chunk_size_bytes": null, - "password": null, - "decrypt_command": null, - "total_modules": 1, - "passed": 0, - "failed": 1, - "modules": [ - { - "name": "encryptly-preflight", - "status": "FAIL", - "elapsed_seconds": 60.097, - "artifact": null, - "output": "You need to fix your environment so encryptly runs before building. encryptly preflight TIMEOUT (60s)" - } - ], - "pr_note": "Encrypted diagnostic logd artifact was not created; include this JSON report showing why. The encrypted .logd is the required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging." -} diff --git a/diagnostic/build-f883bc3f.json b/diagnostic/build-f883bc3f.json deleted file mode 100644 index ac30d18e..00000000 --- a/diagnostic/build-f883bc3f.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "generated_at": "2026-06-20T15:52:02.140664+00:00", - "commit": "f883bc3f", - "diagnostic_logd": "diagnostic/build-f883bc3f.logd", - "diagnostic_logd_error": null, - "message_blocker": null, - "chunked": false, - "chunk_size_bytes": null, - "password": "090327197213913c415e", - "decrypt_command": "encryptly unpack diagnostic/build-f883bc3f.logd --password 090327197213913c415e", - "total_modules": 1, - "passed": 1, - "failed": 0, - "modules": [ - { - "name": "frailbox", - "status": "PASS", - "elapsed_seconds": 0.005, - "artifact": "frailbox/frailbox", - "output": "make: Nothing to be done for 'all'." - } - ], - "pr_note": "Include the encrypted diagnostic logd artifact(s): diagnostic/build-f883bc3f.logd. The encrypted .logd is the required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging." -} diff --git a/diagnostic/build-f883bc3f.logd b/diagnostic/build-f883bc3f.logd deleted file mode 100644 index 3d4aad8ef0394f8ad317e7d5b7f0f1008a461f70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2520 zcmV;}2`BbMNkK;f0000G>j?mI^2Neiw;EloOUnHa7Sghm7e7d!+7CU@fnS$10001M zWM(~3LQ6zOGA&3=K|?K5NI^0+HVR{DaA;+6Jws?=Lug?#FfB+;K|?K5NI^0+HVRUM zoM-=8svoUIk@KWCw3_%b_~*wbreIadJ2pY7UOa1cEi<&3as#a0z-E#m_QvmIA>y`F(RYkuwaj2 z(Ac~2yHGjS0T{uLX-5vSOzp!%=mxfBvczur;Nv^$%K^E9;e+G z2~UnGFn;{WTXr_?)7caMC^*gb3SUM@9p>6e0f^#1{r7ScA-wPIu{}rSw*-r}jqTN? zXN2MDNZ-u({GXo=E0Fb(C&IVFjh!Mo?47x-MdiwrlO6S27hBjENB=`mUOV?+ae>5N zLlKQr8XFJZo*N*MM0&1iJbrJmV98|3T0$J45af4rQH<~MHL1^Ztur^A}XwJb>die7UEuE`9)TGyF z+p>suRtS?iu9xak%-@U5M~wyb${uM?MYFs4?8BE@qH&dkx3rZLF}x916}eRhAsm*? zzIxzzCiv^KHdJl}zLe)c{8a9w+9>Wyo`c}*>H5+I=KZ-Dq>Zg?>eNSYv!oZVFw>(c zztO9B`R#UDEFK}Mq>z$5tbe`O1(_D6sq#<@fK@DBmw&gFBC-tx#PV;dfX2&OqP zI*Vncb^}@>r-8fGf_+_i{J6Wtdr6Cab+gg>=N0!8(lho%2p#HDDj85U?A< ztWwALI!?pL^?I|NXzz=&h;(8CxW(3Q;)D7=vjUoy5Hp4=i z?!JX1pd()JL+#=!1~2DjY0{R@eBA|d_v`R{ZA_D?EZzHFEDynCIN=kSE2fr|yf&s> zAb1j;vUVFkRb9n)eVz%$x#kWMbS9pVj#)yIm3o=fwj1Cxg6;BkhEEw&oIt>H)R@ns zubTue*s7o@!7rPufGwzWc6wA;G6~I)>hqmRon#1ln2yYu0=74}F1N9`C+9+RPBod2 zc)-o?U+~xlhl!KFyGy_i-_Hy+Rj#ab^t1EylRkNrnC{Y@d%Qc7{q|=nYS$3M_AF(G)}?#b z%r#VTh)#d-)YcONpjGQTWVx2X&t$#MurpV(Ypb5`+e0Wg7&-h%6pVh^fvtf$cLufc z-DR7}DrF(c+dEgY^%M$!MkrRD_0{8TYA&}TZMaKkri?pvQveAo(&hBiI@$&bw>nXa zTjzW=NQ}zGPlP(2=f{_Jy{!Ot)ih(=koR(jVNK_KVwM5X@}ZxQXs3wnRf;9eqYB7C z$W*ZpTx25`=wne_5#Yspy<1urnK()#dWgBpY1|(fX^iLu5u@HYDIP|dsBDsAVxOYm zIAA`gVPLSADl(YGk7hcz#^?y>o!iXHV^@p<1q}aAKpW1s(oO*~lBeeMTuE@YUrC zGQ+oOt@^;=GT(7^urW;~CrSXbRWA{m3`K7JlPO=xlu`AUxN4NrjlYqc(5S-sxaCW{ zr2EOSGW5Rx$zi5G;EN)1UMV#_q(a@GTJ4E*ji0xf6Iw7+BTY%_Ko3Zo@q}7WE%=IX z-0@fr?@7$7wY^b5q(_6_$FOmb`F#@}SvcoI9u8D$?Y!6Zu^BuJb|~=#{mf3*}O#XK%utb@_fmjN>Lu6ZS6WlUHmy;Nk{WDU$BU{EY zZ1*p0|L+(+w1aUwREx;+FU4@&*gPc%ET21u6?IX!u`8YmRAe!!|J=X23ae*djC=m7 z<%mm@!$#H2HMmi&w<3>iB~Oz)fe+01H@=a9r)ETHhbiGkNbdLXMk?HQDaS)m0U3O& zd3Au}-28LE?taZ^?-lw!G9Ae?|PWcA%2g()1wf`Sew z=nBWmLK^JvO&7A5NKAV9@-nD^;efnDvfwP@MzZ3oRUE=S7|h`)Tmf`+g9B4- z1XD}oSqz#u?IwR&r}P#WvKWR0qa7LdD9iV@71?U#ibE(!X z$f6ST3OejNyW3Z=J7DPM4Y^}+vm+`$MKa86ghPo(m};5JbZt^B_qXbzQABvOBPt+T zzgnYBq>nG+jgR12lhdXk;zTgZ-HR3(9uzY9;1^czo^@d$4|N*MpzfGF!t^RCGsRPaQw56BMxmWvAo0H#)2G~`B`1bi$ zT*jjboWn(#I)^I&N+T=NFT4A1~fPBTs#g*$5yNeJ1VUWq6T`Lmpt{k*UMHeq2j+?nE im5a=8VmYq!%KF(9)n)f#-~}?cpy*BfG(K Date: Sun, 21 Jun 2026 07:25:40 -0600 Subject: [PATCH 7/7] Add build diagnostics for d8514bf7 --- diagnostic/build-d8514bf7.json | 24 ++++++++++++++++++++++++ diagnostic/build-d8514bf7.logd | Bin 0 -> 2520 bytes 2 files changed, 24 insertions(+) create mode 100644 diagnostic/build-d8514bf7.json create mode 100644 diagnostic/build-d8514bf7.logd diff --git a/diagnostic/build-d8514bf7.json b/diagnostic/build-d8514bf7.json new file mode 100644 index 00000000..d87add4f --- /dev/null +++ b/diagnostic/build-d8514bf7.json @@ -0,0 +1,24 @@ +{ + "generated_at": "2026-06-21T13:25:40.784594+00:00", + "commit": "d8514bf7", + "diagnostic_logd": "diagnostic/build-d8514bf7.logd", + "diagnostic_logd_error": null, + "message_blocker": null, + "chunked": false, + "chunk_size_bytes": null, + "password": "19800841b2952655813e", + "decrypt_command": "encryptly unpack diagnostic/build-d8514bf7.logd --password 19800841b2952655813e", + "total_modules": 1, + "passed": 1, + "failed": 0, + "modules": [ + { + "name": "frailbox", + "status": "PASS", + "elapsed_seconds": 0.011, + "artifact": "frailbox/frailbox", + "output": "make: Nothing to be done for 'all'." + } + ], + "pr_note": "Include the encrypted diagnostic logd artifact(s): diagnostic/build-d8514bf7.logd. The encrypted .logd is the required diagnostic content for PR review; this JSON file is metadata. Maintainers may ask you to remove these diagnostic artifacts before merging." +} diff --git a/diagnostic/build-d8514bf7.logd b/diagnostic/build-d8514bf7.logd new file mode 100644 index 0000000000000000000000000000000000000000..d93dec70b704e7e735be760dc8b7dee31b54c0ef GIT binary patch literal 2520 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 literal 0 HcmV?d00001