A miner that wants to make its claim VISIBLE to a fleet (an optional, public "soft claim" — e.g. an eligibility comment on the issue saying "a miner is working on this") needs a spec BUILDER, not an actuator, exactly like the existing src/mcp/local-write-tools.ts pattern: gittensory supplies the CONTENT of a shell-safe command, the miner's OWN harness runs it with its OWN GitHub credentials. This module builds the spec only — it never executes anything, so it's contributor-safe under the same reasoning local-write-tools.ts already documents.
Reuse buildPostEligibilityCommentSpec directly rather than reinventing a new comment-poster — this issue's value-add is composing a deterministic, well-formatted soft-claim comment BODY (issue number, miner identifier, claimed-at timestamp, expiry note) and handing it to the existing builder.
Deliverables
References
src/mcp/local-write-tools.ts:54 (buildPostEligibilityCommentSpec — reuse, don't duplicate)
src/mcp/local-write-tools.ts:8 (LOCAL_WRITE_BOUNDARY constant + module header explaining the spec-builder-not-actuator boundary)
src/mcp/local-write-tools.ts:23 (the sq() shell-escaping helper already used by the reused builder)
A miner that wants to make its claim VISIBLE to a fleet (an optional, public "soft claim" — e.g. an eligibility comment on the issue saying "a miner is working on this") needs a spec BUILDER, not an actuator, exactly like the existing
src/mcp/local-write-tools.tspattern: gittensory supplies the CONTENT of a shell-safe command, the miner's OWN harness runs it with its OWN GitHub credentials. This module builds the spec only — it never executes anything, so it's contributor-safe under the same reasoninglocal-write-tools.tsalready documents.Reuse
buildPostEligibilityCommentSpecdirectly rather than reinventing a new comment-poster — this issue's value-add is composing a deterministic, well-formatted soft-claim comment BODY (issue number, miner identifier, claimed-at timestamp, expiry note) and handing it to the existing builder.Deliverables
packages/gittensory-engine/src/soft-claim.ts(orsrc/miner/soft-claim.ts) exportingbuildSoftClaimCommentBody(input: { minerId: string; claimedAt: string; expiresAt?: string })— pure string formatterbuildSoftClaimSpec(input)that composes the body above and calls the EXISTINGbuildPostEligibilityCommentSpecfromsrc/mcp/local-write-tools.ts:54— do not duplicate its command-construction/escaping logicminerId)expiresAt, and the shell-injection-safety regression testLOCAL_WRITE_BOUNDARYfromlocal-write-tools.ts:8so the boundary language stays consistentReferences
src/mcp/local-write-tools.ts:54(buildPostEligibilityCommentSpec— reuse, don't duplicate)src/mcp/local-write-tools.ts:8(LOCAL_WRITE_BOUNDARYconstant + module header explaining the spec-builder-not-actuator boundary)src/mcp/local-write-tools.ts:23(thesq()shell-escaping helper already used by the reused builder)