fix(orb): filter contributor-draft implementation requirements through the public-safe path - #9755
Conversation
…h the public-safe expectation path
wantedPathCandidate built two sections from the same manifest.testExpectations
array but handled them differently. testingRequirements ran the array through
isFocusManifestPublicSafe + formatContributorIssueDraftTestExpectation (via
buildContributorIssueDraftTestingRequirements), while implementationRequirements
four lines away mapped the raw entries into `Run ${entry} before requesting
review.` -- no public-safe filter and a different format. A public-unsafe
expectation was dropped from one contributor-facing list but rendered verbatim in
the other, and the two "Run" spellings diverged.
Extract the shared computation into one private publicSafeTestExpectations(manifest)
helper and use it from both buildContributorIssueDraftTestingRequirements and
wantedPathCandidate, so the filter+format is applied identically and a third
consumer cannot repeat the divergence. The GENERIC_TESTING_REQUIREMENTS fallback
stays specific to testingRequirements, and implementationRequirements keeps its
contribute-nothing-when-empty behaviour. No change to isFocusManifestPublicSafe,
formatContributorIssueDraftTestExpectation, or isContributorIssueDraftPublicSafe.
Adds tests: a public-unsafe expectation is filtered out of BOTH lists (never
reaches the draft), and a wanted-path candidate's implementationRequirements carry
the identical public-safe-filtered expectations as testingRequirements.
Closes JSONbored#9704
|
🚨 Contributor flagged. Click here for more info: Superagent Dashboard |
|
Warning ⏸️ LoopOver review result - manual review recommendedReview updated: 2026-07-29 06:38:56 UTC
Review summary Nits — 6 non-blocking
Decision drivers
Context & advisory signals — never blocks the verdict
Linked issue satisfactionPartially addressed Review context
Contributor next steps
Signal definitions
🧪 Chat with LoopOverAsk LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.
Full command reference: https://loopover.ai/docs/loopover-commands 🧪 Experimental — new and may change. Decision record
🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed 💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →. Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.
|
|
Superagent didn't find any vulnerabilities or security issues in this PR. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9755 +/- ##
===========================================
- Coverage 90.27% 76.63% -13.65%
===========================================
Files 904 283 -621
Lines 113177 59574 -53603
Branches 26840 8516 -18324
===========================================
- Hits 102171 45653 -56518
- Misses 9676 13633 +3957
+ Partials 1330 288 -1042
Flags with carried forward coverage won't be shown. Click here to find out more.
|
One import conflict in src/api/routes.ts: main widened the ledger-anchor import with `publicAnchorStatus` (#9755's empty-anchor-list reason) while this branch added the proof-summary and proof-badge imports beside it. Both sides kept -- neither change displaces the other, and `publicAnchorStatus` is used at routes.ts:1362 on main's side of the merge. Verified after resolving rather than assuming a clean textual merge means a clean semantic one: regenerated the OpenAPI spec (no drift), and ran both sides' suites -- proof-summary, ledger-anchor-persistence, the route/spec ratchet and auth -- 98 passing. docs-drift, engine-parity and dead-source-files all clean.
…nd ship the missing keypair runbook (#9719) (#9761) #9719 diagnosed the topology precisely and it holds: hosted review execution is retired (src/index.ts:61-75 acks and drops review jobs), so api.loopover.ai never decides anything, its ledger is permanently empty, and `runScheduledLedgerAnchor` early-returns `empty_ledger` on every tick forever. Verified against the code rather than taken on faith. DECISION on the issue's item 1 -- anchoring lives on self-host, and the docs say so. The alternative (ingest decision records centrally so the hosted Worker has something to anchor) was rejected on the merits: the central chain would be a re-chained AGGREGATE of many instances' records, so anchoring it proves nothing about the per-instance chain a verifier actually cares about, and every real chain would still be unanchored. It would produce a MORE authoritative-looking artifact carrying a WEAKER guarantee -- the exact "looks verified, isn't" failure this epic exists to prevent. The user-facing half of that was a genuine false claim: what-you-can-verify told verifiers to `curl https://api.loopover.ai/v1/public/decision-ledger/ anchors`, an endpoint that returns `[]` forever, as THE anchor walkthrough. Every command now runs against `$ORB` -- the instance that reviewed the PR -- with the boundary and the reasoning stated where the reader hits it. Item 2 was simply missing: no file outside src/ and test/ mentioned LEDGER_ANCHOR at all, so both halves had to be hand-produced in exact encodings, with a keyId that is computeAnchorKeyId of the public half. `npm run ledger:anchor-keygen` now emits both, deriving the id with the same function the runtime uses. The derivation is exported and returns values rather than only printing, because a generator that emits a key the runtime REFUSES would reproduce the original failure while looking like a fix -- six tests run the generated values through the real parse/select/sign/verify path, including that a signature does not verify against a different run's key. Plus the operator runbook that did not exist: what to set, which half is secret, how to read the four `status` values, and the rotation rule that a retired key is closed with notAfter and never removed. Item 3 (make the silence visible) was already closed by #9755's publicAnchorStatus -- checked before duplicating it.
What & why
Closes #9704.
wantedPathCandidateincontributor-issue-draft.tsbuilt two sections from the samemanifest.testExpectationsarray but handled them differently:testingRequirementsran it throughisFocusManifestPublicSafe+formatContributorIssueDraftTestExpectation.implementationRequirements, four lines away, mapped the raw entries intoRun ${entry} before requesting review.— no public-safe filter, a different format.So a public-unsafe expectation was dropped from one contributor-facing list but rendered verbatim in
the other, and the two "Run" spellings diverged.
Change
Extract the shared computation into one private
publicSafeTestExpectations(manifest)helper, used byboth
buildContributorIssueDraftTestingRequirementsandwantedPathCandidate, so the filter+format isapplied identically and a third consumer cannot repeat the divergence. The
GENERIC_TESTING_REQUIREMENTSfallback stays specific to
testingRequirements;implementationRequirementskeeps itscontribute-nothing-when-empty behaviour. No change to
isFocusManifestPublicSafe,formatContributorIssueDraftTestExpectation, orisContributorIssueDraftPublicSafe.Validation
"wallet seed phrase") is filtered out of both lists and neverreaches the draft (the draft is produced, not skipped, and carries no such text).
implementationRequirementscarry the identical public-safe-filteredexpectations as
testingRequirements.implementationRequirementsto the raw map fails both new tests.