Skip to content

UX: show complete URL path if website domain is same as instance domain - #6

Open
everettbu wants to merge 1 commit into
url-handling-prefrom
url-handling-post
Open

UX: show complete URL path if website domain is same as instance domain#6
everettbu wants to merge 1 commit into
url-handling-prefrom
url-handling-post

Conversation

@everettbu

Copy link
Copy Markdown
Contributor

Test 6

@github-actions

Copy link
Copy Markdown

This pull request has been automatically marked as stale because it has been open for 60 days with no activity. To keep it open, remove the stale tag, push code, or add a comment. Otherwise, it will be closed in 14 days.

@mfeuerstein mfeuerstein left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review — approved

Reviewed 5 files. 0 high-severity issues found. Verdict: approved.

app/assets/javascripts/discourse/templates/user/user.hbs (low)

  • Reviewed app/assets/javascripts/discourse/templates/user/user.hbs — looks good

app/serializers/user_serializer.rb (low)

  • Reviewed app/serializers/user_serializer.rb — looks good

app/assets/javascripts/discourse/models/user.js.es6 (low)

  • Reviewed app/assets/javascripts/discourse/models/user.js.es6 — looks good

spec/serializers/user_serializer_spec.rb (low)

  • Reviewed spec/serializers/user_serializer_spec.rb — looks good

app/assets/javascripts/discourse/controllers/user.js.es6 (low)

  • Reviewed app/assets/javascripts/discourse/controllers/user.js.es6 — looks good

leehopper added a commit to liatrio-labs/claude-code-gauntlet that referenced this pull request Jul 28, 2026
, #25 PR1) (#71)

* fix(verify): degrade only the failed slice, and retry it once first (#54, #25 PR1)

verifyStage's degradation was all-or-nothing: the first untrusted slice set
`failureReason`, broke the loop, and `unverifiedResult(findings, ...)` re-emitted
the ENTIRE original array with origin='unknown' — including findings from slices
that had already verified cleanly, and including slices that were never dispatched
at all. Measured live on 2026-07-27 (smoke-20260727-205454-f99d948,
ai-code-review-evaluation/discourse-graphite#6): one dropped nonce echo on slice 0
("receipt nonce mismatch (got missing, expected fb2b1ded5014dde8.0)") cost all 16
findings of a one-slice PR their surfaced-vs-introduced classification.

Now the size of the damage tracks the size of the fault:

- An untrusted slice degrades only its own findings; the loop never breaks, so a
  fault in slice 0 no longer prevents slices 1..N from being attempted.
- Each slice gets EXACTLY ONE deterministic re-dispatch before degrading
  (VERIFY_ATTEMPTS_PER_SLICE), mirroring writeArtifactsDerived's single retry — the
  executor is a sampled agent, not a function, so a second dispatch is a fresh
  sample. It retries uniformly where the persist path classifies: no verify failure
  class proves "our dispatch never reached the script". This is the part that would
  actually have saved the incident above, whose PR had only one slice.
- The retry carries a DISTINCT nonce (`{nonce}.{i}.r1`). Reusing the slice nonce
  would move the confusion trustSlice defends against from space (two equal-length
  slices satisfying each other's receipts) into time (attempt 2 satisfied by a
  replay of attempt 1's receipt) — and a fresh receipt is exactly what the
  re-dispatch exists to obtain.
- The nonce is now computed once and threaded into verifyPrompt/verifyCommand
  instead of being derived independently at both sites. An attempt-varying nonce
  turns that latent duplication into a live bug, so the duplication is removed
  rather than documented.
- A slice-input writer GROUP that fails degrades only the slices it carried;
  slices from healthy groups still reach the executor. materializeVerifySlices
  returns a sliceIndex -> {group, reason} map instead of one first-failure reason.
- One gap per degraded slice, in slice-index order, each stating its own blast
  radius ("k of n findings"). A slice recovered by its retry emits a disclosure gap
  and carries no UNVERIFIED token — nothing degraded.
- `verified` is true only when zero slices degraded.

Never-drop/never-fabricate is unchanged, now at slice granularity: every finding
leaves the stage either as its slice's trusted verified output or as itself with
origin='unknown'. Output stays in strict slice-index order because applyChallenges'
stable sort breaks ties by array position.

worstCaseAgentCount and coarsenLimits scale the verify term by
VERIFY_ATTEMPTS_PER_SLICE, since every slice can independently take its retry; the
constant is exported so the dispatch-count test asserts against it rather than a
copied literal. The remaining terms stay nominal and the comment now says so.

bench/runner/check.py needs no change: G3 already counts origin=unknown per
finding, so its stat becomes proportional to the actual fault footprint for free
(issue #54 requirement 4); its verdict stays fail-on-any-occurrence by design.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoJGv7nzXjQrw9jf7ZmmtZ

* docs(verify): correct the stale per-slice dispatch wording the review pass found

Adversarial-review follow-ups, both pre-existing text this change made misleading
rather than defects it introduced:

- verifyStage's docstring still opened with "dispatches ONE `executor` agent per
  slice", four lines above the paragraph describing the retry. This repo treats
  comments as contract, so the one-or-two count is now stated where a reader meets it.
- Four single-slice tests were titled "whole set UNVERIFIED". True only because
  baseInput() yields one slice — extensionally right, contractually wrong now that
  "whole set" and "that slice" are no longer synonyms. Retitled to say which.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoJGv7nzXjQrw9jf7ZmmtZ

* docs(verify): qualify the never-drop claim — trustSlice binds shape, not content

The adversarial review pass produced a working PoC that this change's own
documentation overclaims. trustSlice validates a slice's nonce, sha, n_in and
verified+eliminated count sum — never that the findings in the envelope are the
ones that slice dispatched. verifySliceSize is a constant, so most slices share a
length; an envelope carrying a SIBLING slice's findings clears every guard. The
real slice's findings are then dropped outright — not degraded to origin=unknown —
and the run still reports verified=true.

Reproduced end-to-end against this branch: 4 findings in two size-2 slices, slice 0
fails honestly and its retry answers with slice 1's content -> output is
[F2,F3,F2,F3], verified=true, no UNVERIFIED gap.

The hole predates per-slice degradation and is unchanged by it; the retry adds
exactly one dispatch per failed slice on which it can be hit, where before a slice
whose first attempt failed honestly could only reach the conservative degrade. Net
exposure still falls: the common case went from "one fault costs every slice its
classification" to "one fault costs one slice."

NOT fixed here, deliberately. The fix is an id-set binding — precisely #25
requirement 2, "the count guard becomes delta-id coverage" — and it changes
acceptance on the TRUSTED path: an echo that merely mangles an id character would
begin degrading runs that pass today. That is a findings-content change requiring
#25's measurement tier, and it would invalidate the claim that justifies this PR's
suites-only tier (error paths "can only prevent verify-coverage loss or surface it,
never change findings content").

So this commit changes no behavior. It removes the unqualified never-drop assertion
from verifyStage's docstring, CLAUDE.md's new section, and validation-pipeline.md,
and adds a KNOWN GAP block at trustSlice naming the mechanism and its owner.
Shipping a guarantee a PoC breaks is the silent failure this repo exists to avoid.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoJGv7nzXjQrw9jf7ZmmtZ

* docs: drop the CLAUDE.md section this change added

Reverts the 13-line "Verify-stage degradation boundary" section — 4,879 bytes,
~1,220 tokens loaded on EVERY session. CLAUDE.md is now byte-identical to main.

Anthropic's guidance is explicit that CLAUDE.md is the wrong home for this:
"Bloated CLAUDE.md files cause Claude to ignore your actual instructions", the
exclude list names "long explanations or tutorials" and "anything Claude can
figure out by reading code", and the test is "would removing this cause Claude to
make mistakes?" All 13 lines fail it — every claim was already stated in a comment
at the site where it matters (verifyStage, verifySliceWithRetry, trustSlice), plus
the PR body and issues #25/#54. It duplicated co-located comments and charged the
duplicate to every session in the repo.

Measurement worth keeping: the file is 115 lines but 23,982 bytes / ~6k tokens,
averaging 224 bytes per line. The "under 200 lines" heuristic reads as passing
while the real cost is triple. Posted to #46 (the open context-engineering audit)
along with the .claude/rules/ path-scoped decomposition — the only split that
actually saves context, since @path imports load at launch — and a proposed
forward-looking rule so the surface stops regrowing between audits.

Nothing is lost. The rationale lives in the code comments, the PR body, and the
issue threads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoJGv7nzXjQrw9jf7ZmmtZ

* docs(verify): name the right detector in the never-drop qualifier

Second adversarial pass caught the qualifier "against every failure class
trustSlice DETECTS" as inaccurate: of the four classes listed one line above, two
never reach trustSlice at all — an agent() throw is caught in dispatchVerifySlice
and a missing slice input in materializeVerifySlices. Says "this stage" now, with
the exception noted inline so the next reader does not re-derive it.

Same fix in references/validation-pipeline.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MoJGv7nzXjQrw9jf7ZmmtZ

* fix(verify): address PR #71 review comments

Flatten the nested ternary in materializeVerifySlices, and add a
runWith end-to-end test that forces one verify slice to degrade so the
mixed origin array is exercised through validate/filter/challenge/persist.

Co-authored-by: Lee Hopper <leehopper@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Lee Hopper <leehopper@users.noreply.github.com>

@zach-source zach-source left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Serializer inclusion predicate naming bug — see inline.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants