@powforge/comment-witness
v0.1.0
Published
DoI-weighted comment credibility scoring. A comment from one long-tenured human outweighs 500 sock-puppet replies. Same NIP-33 + DoI pattern as @powforge/vote and @powforge/news-witness, applied to discussion threads. Sybil-resistant comment ranking with
Downloads
123
Maintainers
Readme
@powforge/comment-witness
DoI-weighted comment credibility scoring. A comment from one long-tenured human, vouched by three more, outranks one flooded by 500 fresh sock-puppets. Sybil-resistant comment ranking with no central registry.
Same DoI pattern as @powforge/vote
(proposals) and @powforge/news-witness
(stories), applied to discussion threads. The pattern is now canonical.
Install
npm install @powforge/comment-witnessQuick start
const {
submitComment,
vouchComment,
getCommentCredibility,
getTopComments,
} = require('@powforge/comment-witness');
const { commentId } = submitComment(
'This is the alpha take on PowForge.',
authorPubkey, // 64-char hex Nostr pubkey
'https://news.ycombinator.com/item?id=12345',
);
vouchComment(commentId, voucherPubkey);
const cred = await getCommentCredibility(commentId);
console.log(cred.weightedScore, cred.doiBreakdown);
const top = await getTopComments(
'https://news.ycombinator.com/item?id=12345',
10,
);Why DoI-weighted?
Reddit ranks by upvotes. HN ranks by upvotes. Twitter ranks by hearts. Every count-based ranking surface is gameable by one operator with 500 fresh accounts. Centralized identity gating (Reddit karma minimums, HN account-age throttles, blue checks) tightens the gate slightly and leaks who you are.
@powforge/comment-witness makes the credibility weight of a comment
AND each vouch on it a function of the author's
Depth-of-Identity score — accumulated
irreversible work across social, access, vouch, and economic dimensions.
A 500-account farm contributes ~500 × ~0 weight; one long-tenured human
contributes one × ~50.
Threading
submitComment(content, pubkey, topic, parentId?) accepts an optional
parentId to thread replies. By default getTopComments ranks only
top-level comments; pass { includeReplies: true } to rank the whole
tree. getReplies(parentId, { recursive }) walks descendants.
Self-vouching
An author vouching their own comment contributes doiWeight=0 to the
weighted score (same rule as @powforge/vote). Raw weight is still
surfaced in doiBreakdown.vouches[].weight for inspection.
Custom scoring
Pass { scoreFn } to getCommentCredibility or getTopComments to
inject a deterministic mock or a non-default DoI source:
const scoreFn = async (pubkey) => ({ weight: customWeights[pubkey] || 0 });
await getCommentCredibility(commentId, { scoreFn });The default scoreFn lazy-loads @powforge/identity, so the SDK is only
required when you actually use the production scoring path.
License
MIT
