[PR #6987] [MERGED] feat(elf): decode Zstandard section-name tables #7549

Closed
opened 2026-11-03 13:38:38 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/6987
Author: @ShuaixinHuang
Created: 10/24/2026
Status: ✅ Merged
Merged: 10/24/2026
Merged by: @morluto

Base: main ← Head: codex/feat-elf-zstd-section-names


📝 Commits (7)

  • 08b3c13 feat(elf): decode Zstandard section-name tables
  • 4c1fef9 Merge commit 'dd02d8ff69' into codex/feat-elf-zstd-section-names
  • 601b09b Merge commit '9895f1870c' into codex/feat-elf-zstd-section-names
  • 7c6ed2c Merge commit 'be2811e414' into codex/feat-elf-zstd-section-names
  • 4b251c2 test(verifiers): follow shared command output and identity
  • 2dc2ec1 Merge shared verifier CI test repair
  • 249729f test(ci): synchronize upstream verifier assertion repair

📊 Changes

10 files changed (+180 additions, -91 deletions)

View changed files

📝 docs/elf-notes.md (+4 -2)
📝 docs/rust-binaries.md (+2 -1)
📝 src/native/elf/ElfNoteParser.test.ts (+106 -44)
📝 src/native/elf/ElfNotes.fixture.ts (+4 -3)
📝 src/native/metadata/ElfSectionNameTable.ts (+17 -6)
📝 tests/acceptance/elfNotesCli.test.ts (+20 -16)
📝 tests/acceptance/rustBinaryCli.test.ts (+3 -2)
📝 tests/boundary/go/goBinaryProvider.test.ts (+2 -2)
📝 tests/boundary/rust/rustBinaryImage.test.ts (+19 -13)
📝 tests/fixtures/rust/image.ts (+3 -2)

📄 Description

Summary

Resolve ELF section names stored with ELFCOMPRESS_ZSTD through the existing shared string-table decoder, including ELF note names and Rust .dep-v0 discovery.

Problem and expected behavior

The gABI compressed-section specification assigns compression type 2 to Zstandard. REA currently reports these section-name tables as unsupported, even though the selected Node runtime already provides Zstandard decoding. An admitted table should provide its decoded names; unknown algorithms must continue to report names as unknown.

Change and scope

Add the algorithm to ElfSectionNameTable, which already owns compressed-name decoding for notes and the native section directory. Reuse the existing declared-size admission, output cap, and exact decoded-length checks, with an explicit 128 MiB Zstandard window limit. Existing zlib behavior remains covered. Update related fixtures, unknown-algorithm controls (now type 3), public CLI regressions, and the two owning support statements. No separate issue: this is a self-contained static-format enhancement.

Follow the contribution scope. Ordinary static format inspection and standard decompression are in scope; a separate maintainer execution/injection/mutation scope decision is not applicable.

Contract and boundary impact

  • Semantic owner and earliest changed stage: shared decodeElfSectionNameTable, before native section-name consumers resolve their semantic records.
  • Contribution scope fit and linked maintainer decision: standard compressed string-table inspection; not applicable.
  • CLI and MCP/tool-catalog contract: existing result schemas and commands; supported Zstandard names now populate existing fields instead of an unsupported-name limitation.
  • Provider, bridge, target-format, or platform compatibility: ELF32/64, both endiannesses; built-in Node Zstandard codec, no new dependency or engine integration.
  • Evidence, artifact, provenance, or reconstruction contract: original artifact bytes/digest and physical note/dependency locations are preserved; unsupported algorithms remain unknown.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): selected files are inspected statically; no target execution or mutation is added.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact (CI generates and validates ignored catalogs and skills/; edit authored instructions in .agents/skills/reverse-engineer-anything/ and never commit build outputs): no schema/dependency/package change; generated outputs remain uncommitted.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated: zlib/Zstandard × ELF32/64 × little/big-endian; expansion admission; corrupt/truncated data and mismatched declared size; an independent handcrafted frame advertising a 256 MiB window is refused under the 128 MiB allowance. Existing unknown-compression, Rust, Go, CLI, and MCP controls are retained.
  • Base reproduction or other evidence: the new algorithm matrix on the base yielded 4 Zstandard failures and 4 zlib passes; the feature makes all eight pass.
  • User-visible CLI/MCP output (if applicable): inspect-elf-notes returns table name .note.gnu.build-id and the unchanged GNU build-id for Zstandard input; Rust CLI recovers .dep-v0 packages. Unknown type 3 continues to report unavailable names and unknown dependency-section presence.
  • Remaining proof gaps: inert synthetic ELF fixtures produced with Node's codec plus a handcrafted window frame. No compiler/objcopy-generated compressed ELF or external analysis engine was exercised. Local Windows runs skip two existing POSIX-only source cases; CI owns Linux and the full suite.

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

  • New source matrix on the base — 4 expected Zstandard failures, 4 zlib passes.
  • Focused source tests (ElfNoteParser, ElfNotesProvider, Rust image and Go provider) — 92 passed, 2 existing Windows skips.
  • npm run test:focused -- src/native/elf/ElfNoteParser.test.ts src/native/elf/ElfNotesProvider.test.ts tests/boundary/rust/rustBinaryImage.test.ts tests/boundary/go/goBinaryProvider.test.ts tests/acceptance/elfNotesCli.test.ts tests/acceptance/rustBinaryCli.test.ts tests/boundary/mcp/elfNotesMcp.test.ts — 7 files, 115 passed, 2 existing Windows skips. This includes real REA CLI/stdio MCP transport with synthetic inert input; original file bytes are checked unchanged.
  • npm run check — 6 tasks, resolved module boundaries, and architecture guards passed; lint zero errors.
  • npm run docs:check — 6 generation/consistency tasks and 9 README consistency tests passed.
  • git diff --check — passed; normal commit/push hooks are enabled.

Compatibility, safety, and release

  • Breaking changes or migration steps: none; additive algorithm support. Compressed note sections themselves remain unsupported, independently of their section-name table.
  • Real Hopper/Ghidra, browser, or OS coverage: Windows CLI/MCP execution; no live analysis engine or real compiler-produced compressed ELF verification.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: check declared expansion before decoding, cap output to declared size, require exact decoded length, and cap the Zstandard window at 128 MiB. No file mutation, external process launch, extraction, or target execution is added.

Author readiness

Human owner: @ShuaixinHuang

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

The human owner instructed the assistant in this session to prepare all three changes and submit them directly for review; this PR is AI-assisted.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

Synchronization validation (2026-10-24)

Synchronized reviewed upstream 347b6e4d95 (#7002), which includes the earlier #6986, #6988 and #6994 repairs. Current head: 249729f81a. The complete feature patch is byte-for-byte identical to this PR's pre-repair feature patch and remains 10 files against that upstream revision; no verifier-test changes remain in the PR diff.

The preceding head's shard 6 had 13 failed / 1889 passed / 20 skipped from two shared test-contract mismatches. Those are historical results. A user-authorized local support patch 4b251c25 migrated the error diagnostics and run ID checks, then upstream merged #7002 concurrently. The resulting conflict was resolved by taking both upstream test files exactly. The Python cases now check VerifierCommandExitError, exit code 1 and snapshot.stderr.text. The ownership cases compare leader/descendant identities to the actual launcher-assigned nonce and distinguish the inherited identity. Archive rejection, ambient-import isolation, no extraction, process-exit-before-root-cleanup and cleanup-retry checks remain.

Clean-base comparison before the upstream merge (Windows, pinned Node 24.22.1/npm 11.16.0, Python 3.12.14, native Windows addon present): the exact focused two-file command for packedBridgeVerification.test.ts and packagedWasmVerifierOwnership.test.ts failed 10 / passed 14 / skipped 3 on be2811e414, then passed 24 / skipped 3 after the local migration. A controlled temporary bypass of ast.parse made the existing invalid-Python regression fail as intended (1 failed / 23 deselected); production bytes were restored. These are local repair evidence, not the final upstream-combination result.

On the final integrated ELF branch, npm run test:focused -- tests/boundary/process/packedBridgeVerification.test.ts tests/boundary/process/packagedWasmVerifierOwnership.test.ts tests/boundary/filesystem/verifierCommandOutput.test.ts tests/boundary/process/nativeVerifierPreflightOwnership.test.ts passed 29 / skipped 14 (four files). All 24 packed-Python cases and five command-output cases passed. Existing Windows skips cover three packaged-Wasm lifecycle cases, eight native-client preflight cases and three filesystem failure cases. No new skip was introduced; Linux CI must execute the POSIX coverage. This run does not establish real external-client/provider behavior.

Each final integrated branch passed npm run check (six tasks, module boundaries and architecture guards) and git diff --check; normal commit and push hooks passed. No CI gates, timeouts or skips were weakened. Upstream #7002's own green CI does not establish this PR's new-head result. Latest-head confirmation on 2026-10-24: CI required, Conventional PR title and PR readiness all succeeded for 249729f81a. Source tests and all eight test shards succeeded. Optional lanes retain their reported skips; the historical local Windows limits remain disclosed.

Earlier post-sync feature/shared validation passed 234 tests with 2 existing Windows skips across nine ELF/Rust/Go/CLI/MCP and shared-regression files. A broader ten-file command also ran workerOrderAudit.test.ts on Windows: that extra file passed 19 and failed 16 timing/mocked-process/cleanup assertions, so the whole command was 253 passed / 16 failed / 2 skipped, not a passing command. Those historical failures were not attributed to a verified clean Windows baseline and were not rerun or changed in this update. At that stage, npm run docs:check passed six tasks and nine README cases.

Earlier checks also passed all 113 reference-lifetime cases, six property-path regressions, and nine evaluation-gate tests. The former cyclic-path single case passed with the same 512 MiB heap / external 20 s guard (137 ms test time, 3.76 s elapsed); the baseline exhausted the heap. No completed-baseline speedup or process-family RSS claim is made.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/6987 **Author:** [@ShuaixinHuang](https://github.com/ShuaixinHuang) **Created:** 10/24/2026 **Status:** ✅ Merged **Merged:** 10/24/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `codex/feat-elf-zstd-section-names` --- ### 📝 Commits (7) - [`08b3c13`](https://github.com/morluto/rea/commit/08b3c13374cee8be655914f8cd3cedd61aaaae24) feat(elf): decode Zstandard section-name tables - [`4c1fef9`](https://github.com/morluto/rea/commit/4c1fef9a30da5e55868f74fd0555f9fe7b8e98f1) Merge commit 'dd02d8ff696385949b05459f2ab9b6ffda18a52c' into codex/feat-elf-zstd-section-names - [`601b09b`](https://github.com/morluto/rea/commit/601b09b1f37a8fbe0e70d964cc2ee94215e63200) Merge commit '9895f1870c5537e64f08e9ff145a0917696b7a50' into codex/feat-elf-zstd-section-names - [`7c6ed2c`](https://github.com/morluto/rea/commit/7c6ed2cd7b45c120d3a28d9e87da0b5b62a19941) Merge commit 'be2811e41407f0149b3e8e12cb2bf0ffd5904b2d' into codex/feat-elf-zstd-section-names - [`4b251c2`](https://github.com/morluto/rea/commit/4b251c25d75e1bc400e730ee54d7f4acd2d2504b) test(verifiers): follow shared command output and identity - [`2dc2ec1`](https://github.com/morluto/rea/commit/2dc2ec1827ef8eb2d73cde76d32a3b970321dcdf) Merge shared verifier CI test repair - [`249729f`](https://github.com/morluto/rea/commit/249729f81a0e0ed8416dece45d4849082964b887) test(ci): synchronize upstream verifier assertion repair ### 📊 Changes **10 files changed** (+180 additions, -91 deletions) <details> <summary>View changed files</summary> 📝 `docs/elf-notes.md` (+4 -2) 📝 `docs/rust-binaries.md` (+2 -1) 📝 `src/native/elf/ElfNoteParser.test.ts` (+106 -44) 📝 `src/native/elf/ElfNotes.fixture.ts` (+4 -3) 📝 `src/native/metadata/ElfSectionNameTable.ts` (+17 -6) 📝 `tests/acceptance/elfNotesCli.test.ts` (+20 -16) 📝 `tests/acceptance/rustBinaryCli.test.ts` (+3 -2) 📝 `tests/boundary/go/goBinaryProvider.test.ts` (+2 -2) 📝 `tests/boundary/rust/rustBinaryImage.test.ts` (+19 -13) 📝 `tests/fixtures/rust/image.ts` (+3 -2) </details> ### 📄 Description ## Summary Resolve ELF section names stored with `ELFCOMPRESS_ZSTD` through the existing shared string-table decoder, including ELF note names and Rust `.dep-v0` discovery. ## Problem and expected behavior The [gABI compressed-section specification](https://gabi.xinuos.com/elf/03-sheader.html#compressed-sections) assigns compression type `2` to Zstandard. REA currently reports these section-name tables as unsupported, even though the selected Node runtime already provides Zstandard decoding. An admitted table should provide its decoded names; unknown algorithms must continue to report names as unknown. ## Change and scope Add the algorithm to `ElfSectionNameTable`, which already owns compressed-name decoding for notes and the native section directory. Reuse the existing declared-size admission, output cap, and exact decoded-length checks, with an explicit 128 MiB Zstandard window limit. Existing zlib behavior remains covered. Update related fixtures, unknown-algorithm controls (now type `3`), public CLI regressions, and the two owning support statements. No separate issue: this is a self-contained static-format enhancement. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Ordinary static format inspection and standard decompression are in scope; a separate maintainer execution/injection/mutation scope decision is not applicable. ## Contract and boundary impact - Semantic owner and earliest changed stage: shared `decodeElfSectionNameTable`, before native section-name consumers resolve their semantic records. - Contribution scope fit and linked maintainer decision: standard compressed string-table inspection; not applicable. - CLI and MCP/tool-catalog contract: existing result schemas and commands; supported Zstandard names now populate existing fields instead of an unsupported-name limitation. - Provider, bridge, target-format, or platform compatibility: ELF32/64, both endiannesses; built-in Node Zstandard codec, no new dependency or engine integration. - Evidence, artifact, provenance, or reconstruction contract: original artifact bytes/digest and physical note/dependency locations are preserved; unsupported algorithms remain unknown. - Target selection, authority, upstream behavior, and cleanup details (if applicable): selected files are inspected statically; no target execution or mutation is added. - Generated metadata (`docs/public/product-catalog.json`), package, or installation impact (CI generates and validates ignored catalogs and `skills/`; edit authored instructions in `.agents/skills/reverse-engineer-anything/` and never commit build outputs): no schema/dependency/package change; generated outputs remain uncommitted. Expected effects (check known effects; use documentation-only on its own). Unchecked items do not establish absence; leave uncertainties visible. - [x] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [ ] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage - Tests added or updated: zlib/Zstandard × ELF32/64 × little/big-endian; expansion admission; corrupt/truncated data and mismatched declared size; an independent handcrafted frame advertising a 256 MiB window is refused under the 128 MiB allowance. Existing unknown-compression, Rust, Go, CLI, and MCP controls are retained. - Base reproduction or other evidence: the new algorithm matrix on the base yielded 4 Zstandard failures and 4 zlib passes; the feature makes all eight pass. - User-visible CLI/MCP output (if applicable): `inspect-elf-notes` returns table name `.note.gnu.build-id` and the unchanged GNU build-id for Zstandard input; Rust CLI recovers `.dep-v0` packages. Unknown type `3` continues to report unavailable names and unknown dependency-section presence. - Remaining proof gaps: inert synthetic ELF fixtures produced with Node's codec plus a handcrafted window frame. No compiler/objcopy-generated compressed ELF or external analysis engine was exercised. Local Windows runs skip two existing POSIX-only source cases; CI owns Linux and the full suite. For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed - New source matrix on the base — 4 expected Zstandard failures, 4 zlib passes. - Focused source tests (`ElfNoteParser`, `ElfNotesProvider`, Rust image and Go provider) — 92 passed, 2 existing Windows skips. - `npm run test:focused -- src/native/elf/ElfNoteParser.test.ts src/native/elf/ElfNotesProvider.test.ts tests/boundary/rust/rustBinaryImage.test.ts tests/boundary/go/goBinaryProvider.test.ts tests/acceptance/elfNotesCli.test.ts tests/acceptance/rustBinaryCli.test.ts tests/boundary/mcp/elfNotesMcp.test.ts` — 7 files, 115 passed, 2 existing Windows skips. This includes real REA CLI/stdio MCP transport with synthetic inert input; original file bytes are checked unchanged. - `npm run check` — 6 tasks, resolved module boundaries, and architecture guards passed; lint zero errors. - `npm run docs:check` — 6 generation/consistency tasks and 9 README consistency tests passed. - `git diff --check` — passed; normal commit/push hooks are enabled. ## Compatibility, safety, and release - Breaking changes or migration steps: none; additive algorithm support. Compressed note sections themselves remain unsupported, independently of their section-name table. - Real Hopper/Ghidra, browser, or OS coverage: Windows CLI/MCP execution; no live analysis engine or real compiler-produced compressed ELF verification. - Package or release metadata impact: none. - Security, privacy, process, or containment review: check declared expansion before decoding, cap output to declared size, require exact decoded length, and cap the Zstandard window at 128 MiB. No file mutation, external process launch, extraction, or target execution is added. ## Author readiness Human owner: @ShuaixinHuang - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. The human owner instructed the assistant in this session to prepare all three changes and submit them directly for review; this PR is AI-assisted. ## Before merge - [x] This PR addresses a concrete problem or an agreed enhancement. - [x] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [x] The PR has one focused outcome and the title follows `type(scope): outcome`. - [x] Related issue is linked, or the reason for not linking one is stated above. - [x] Tests cover changed observable behavior and meaningful failure paths. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [x] User-visible CLI/MCP changes include representative output. - [x] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. ## Synchronization validation (2026-10-24) Synchronized reviewed upstream 347b6e4d95 (#7002), which includes the earlier #6986, #6988 and #6994 repairs. Current head: 249729f81a0e0ed8416dece45d4849082964b887. The complete feature patch is byte-for-byte identical to this PR's pre-repair feature patch and remains 10 files against that upstream revision; no verifier-test changes remain in the PR diff. The preceding head's shard 6 had 13 failed / 1889 passed / 20 skipped from two shared test-contract mismatches. Those are historical results. A user-authorized local support patch 4b251c25 migrated the error diagnostics and run ID checks, then upstream merged #7002 concurrently. The resulting conflict was resolved by taking both upstream test files exactly. The Python cases now check VerifierCommandExitError, exit code 1 and snapshot.stderr.text. The ownership cases compare leader/descendant identities to the actual launcher-assigned nonce and distinguish the inherited identity. Archive rejection, ambient-import isolation, no extraction, process-exit-before-root-cleanup and cleanup-retry checks remain. Clean-base comparison before the upstream merge (Windows, pinned Node 24.22.1/npm 11.16.0, Python 3.12.14, native Windows addon present): the exact focused two-file command for packedBridgeVerification.test.ts and packagedWasmVerifierOwnership.test.ts failed 10 / passed 14 / skipped 3 on be2811e414, then passed 24 / skipped 3 after the local migration. A controlled temporary bypass of ast.parse made the existing invalid-Python regression fail as intended (1 failed / 23 deselected); production bytes were restored. These are local repair evidence, not the final upstream-combination result. On the final integrated ELF branch, npm run test:focused -- tests/boundary/process/packedBridgeVerification.test.ts tests/boundary/process/packagedWasmVerifierOwnership.test.ts tests/boundary/filesystem/verifierCommandOutput.test.ts tests/boundary/process/nativeVerifierPreflightOwnership.test.ts passed 29 / skipped 14 (four files). All 24 packed-Python cases and five command-output cases passed. Existing Windows skips cover three packaged-Wasm lifecycle cases, eight native-client preflight cases and three filesystem failure cases. No new skip was introduced; Linux CI must execute the POSIX coverage. This run does not establish real external-client/provider behavior. Each final integrated branch passed npm run check (six tasks, module boundaries and architecture guards) and git diff --check; normal commit and push hooks passed. No CI gates, timeouts or skips were weakened. Upstream #7002's own green CI does not establish this PR's new-head result. Latest-head confirmation on 2026-10-24: [CI required](https://github.com/morluto/rea/actions/runs/40096657089/job/120884384197), Conventional PR title and PR readiness all succeeded for 249729f81a0e0ed8416dece45d4849082964b887. Source tests and all eight test shards succeeded. Optional lanes retain their reported skips; the historical local Windows limits remain disclosed. Earlier post-sync feature/shared validation passed 234 tests with 2 existing Windows skips across nine ELF/Rust/Go/CLI/MCP and shared-regression files. A broader ten-file command also ran workerOrderAudit.test.ts on Windows: that extra file passed 19 and failed 16 timing/mocked-process/cleanup assertions, so the whole command was 253 passed / 16 failed / 2 skipped, not a passing command. Those historical failures were not attributed to a verified clean Windows baseline and were not rerun or changed in this update. At that stage, npm run docs:check passed six tasks and nine README cases. Earlier checks also passed all 113 reference-lifetime cases, six property-path regressions, and nine evaluation-gate tests. The former cyclic-path single case passed with the same 512 MiB heap / external 20 s guard (137 ms test time, 3.76 s elapsed); the baseline exhausted the heap. No completed-baseline speedup or process-family RSS claim is made. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-03 13:38:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#7549
No description provided.