Skip to content

fix(posts): corrections from the final cold reads - #7

Merged
minhtt159 merged 3 commits into
mainfrom
claude/blog-migration-homelab-8a34df
Sep 16, 2026
Merged

minhtt159 merged 3 commits into
mainfrom
claude/blog-migration-homelab-8a34df

Conversation

@minhtt159

@minhtt159 minhtt159 commented Sep 16, 2026 •

Copy link
Copy Markdown
Owner

Follow-up to #6, which merged before these landed. The four posts are live with the errors below.

Two cold reads of the published text returned FIX FIRST on all four. Every count was then re-checked against the original sources: the old blog at teamkhunglong/teamkhunglong.github.io, and both revisions of the merklision gist.

Merklision

Claim published Truth
"Most lengths do not survive" the padding check All 1024 survive; they must, or the total cannot reach the ceiling
Rule two is worth "about ten" collisions 1023. Appending cascades, so every length 1026 to 2048 collides
The n=5 example yields four collisions It skipped length 7; with the rows above, eight answers in total
2047 is the exact total, and length 1 needs a preimage The gist as it stands finds 2048, one per length from 1 to 2048. The one-element answer is the root's two children concatenated, which hashes to the root directly
Written by a competitor Minh did not compete in 2020. The university team that did asked him afterwards

Where 2047 came from is now explained rather than asserted: the first revision of the solver harvested a row's rewrite only inside the padding branch, and the final pair (two elements, even) never pads, so its rewrite, the one-element answer, was never collected. The same-day tidy of the gist moved the harvest out of the branch and was never re-run. The twelve bands tile 1 to 2048 and sum to 2^11; the 2^11 - 1 in the original was that series minus the dropped term. "About five teams solved it" restores the original's hedge.

Five dollars instead of an open port

A port forward is a translation rule, not a listener on the modem, and the exposed services are the machines behind it, some on appliance firmware nobody patches. That argument leads, as it did in the original. CGNAT is the second reason and, on Minh's line, the decisive one; the "most flats in Vietnam" generalisation is gone. The camera and the LAN-routing peer are hypothetical, as the original had them, and the prose no longer implies forwards that never existed.

Also: the hub has two listeners, not one, because Algo leaves SSH running; WireGuard's silence hides the service identity, not the port; the TeamViewer comparison cannot be made without the licence's billing period.

Mining ETH in a homelab

The nodes ran bare metal. A6000 and 3090 share a die, not a core count, and the virtualisation is gated behind a licence. The device plugin advertises and allocates; NVIDIA's container runtime injects. Both the 3060 and the 3080 were bought for this. Ethermine was chosen because its floor suited a small hashrate, not because it was the lowest. Phoenix Miner's fee is 0.65 percent, T-Rex's one percent.

The hostAliases bullet is removed from this post and the anecdote from the companion post. The original line read as dodging someone else's DNS admin, and Minh chose to drop it rather than re-frame it.

The economics that make cryptojacking work

"Four GPUs per VM" was wrong when written. An inference credential does not meet the code-execution bar the post sets one paragraph earlier, and the defensive bullet now says so. "Cannot be made profitable" is downgraded to the impression it was. EIP-1559 was days away, not weeks. The heading is the original's joke again.

Verification

hugo --minify -D clean with the theme submodule present, content/ ASCII, zero hex in any post, both Merklision SVGs render in light and dark, cold read of the rewritten post by a fresh subagent with its findings applied, current gist solver re-run: 2048 collisions, lengths 1 to 2048, each once.

🤖 Generated with Claude Code

minhtt159 and others added 3 commits September 16, 2026 03:30
The previous commit derived 2047 as the size of a length range and then
overcorrected, telling the reader that reading it as 2^11 - 1 was an
incidental resemblance. It is not incidental.

The answers fill every length from 2 up to the ceiling, so the count is
ceiling - 1, and the ceiling is by construction the first power of two
at or above n. A count of 2^k - 1 therefore falls out every time. The
original intuition had the right number; what it had wrong was the
mechanism, since no per-level binary choice is involved.

Checked by running the search at n = 5, 9, 17 and 1025, which give 7,
15, 31 and 2047 answers against ceilings of 8, 16, 32 and 2048, each
covering every length from 2 to its own ceiling exactly once. Those
smaller figures are now in the post.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Two cold reads of the published text, one senior-SRE and one crypto,
returned FIX FIRST on all four. The checkable findings were verified by
running the challenge solver and by Minh confirming facts the sources
never recorded. Most were real.

Merklision. Three claims were wrong:

- "Most lengths do not survive" the padding check. All 1024 survive -
  they have to, or the total cannot reach 2047. The step is a guard,
  not a filter.
- Rule two was described as worth about ten collisions, inherited from
  the original. Appending repeatedly cascades, so every length from
  1026 to 2048 collides: 1023, not ten. The "twenty against 2020"
  framing the post was built on was never the real situation.
- The n=5 worked example counted four collisions and silently skipped
  length 7. It is five.

Where 2047 comes from is now derived rather than asserted. Each row
yields a contiguous band of lengths up to its own ceiling, the eleven
bands tile 2 to 2048 without overlap, and the counts halve down the
tree: 1024 + 512 + ... + 1. So 2^11 - 1 is a geometric sum with one
term per row - not the coincidence the previous commit claimed, and not
the per-level binary choice originally assumed. The second diagram now
shows the tiling instead of restating the arithmetic.

The homelab posts. The worst was a mechanism error: a port forward is a
translation rule, not a listener on the modem. The listeners are the
machines behind it, most of which are the author's own and do get
patched - so "four listeners, none of them yours, on ISP firmware" was
false three ways. The real argument is stronger: one reachable service
per forward, some on appliance firmware that will never be updated.

Minh supplied the reason forwarding was not an option at all: Vietnamese
residential lines sit behind CGNAT with no public address. Dynamic DNS
does not rescue that, which the post now says, because it is the answer
people reach for. The decision was made before the security argument
entered it, and the post no longer pretends otherwise.

Also corrected: the hub has two listeners, not one, since Algo leaves
SSH running; WireGuard silence hides the service identity, not the port;
Chrome Remote Desktop relays when it cannot get direct; the cost
comparison cannot be made at all without the licence's billing period;
Algo builds a road-warrior server, so reaching the LAN needs a peer at
home routing for the subnet, which the diagram asserted and the prose
never established.

Mining: the nodes ran on bare metal, which is the condition under which
containers remove passthrough rather than moving it down a layer. A6000
and 3090 share a die, not a core count, and the virtualisation is gated
behind a licence. The device plugin advertises and allocates; NVIDIA's
container runtime injects. The ethermine payout-floor sentence implied
revenue in a post that records none.

Ownership is now explicit in both places it was ambiguous. The hardware,
the network and the cloud accounts were all Minh's. The hostAliases
workaround was against a mining-pool DNS rule he had written himself on
his own network - which is why it stays in: defeating his own detection
in a minute with a stock Kubernetes field is the evidence for the
companion post telling defenders to watch utilisation rather than names.

Cryptojacking: "four GPUs per VM" was wrong when written. An inference
credential does not meet the code-execution bar the post sets one
paragraph earlier, so the example now points at the platform around it.
"Cannot be made profitable" is downgraded to the impression it is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Merklision: the current gist solver yields 2048 collisions, one per
length from 1 to 2048, not 2047. The 2020 solver harvested rewrite rows
only inside the padding branch, so the unpadded final pair, whose
rewrite is the one-element answer, was never collected. The post now
derives 2048 as twelve tiling bands, explains the missing one, drops
the claim that a one-element answer needs a preimage, and says the
author was not competing in 2020. Stale "twenty against 2020" framing
removed from the summary, TL;DR and closing.

Five dollars: the security argument leads again, as in the original,
with CGNAT as the second and decisive reason on this line. The camera
and the LAN-routing peer are hypothetical, as the original had them.
"Most flats in Vietnam" narrowed to the author's own line.

Mining: hostAliases bullet removed. Ethermine chosen because its floor
suited a small hashrate, not because it was the lowest. Phoenix Miner's
fee is 0.65 percent. Both the 3060 and the 3080 were bought for this.

Cryptojacking: hostAliases anecdote removed, heading restored to the
original's joke, EIP-1559 was days away, not weeks.

Sources: teamkhunglong.github.io/_posts and gist af8e19e2, both
revisions.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@minhtt159
minhtt159 merged commit 8eb523e into main Sep 16, 2026
2 checks passed
@minhtt159
minhtt159 deleted the claude/blog-migration-homelab-8a34df branch September 16, 2026 02:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant