Skip to content

fix(planning): link repo paths in interview recommendations to the pinned commit #8089

Open

Description

@kyle-sexton

This was generated by AI during attend-queue.

Refs: #7753

Agent Brief

Type: Bug
Summary: Repo file paths in recommendations, commitments and alternatives link to the file at the pinned commit.

Current behavior:
Repo-relative file paths in recommendations, commitments and alternatives show as plain text: about 60 in the audited session.

Desired behavior:

  • A repo-relative path in those three places renders as a link to that file at the pinned commit that fix(planning): pin interview source-text links to a commit SHA #7752's source link introduces.
  • Text that only looks like a path (a URL, or a path that names no file at that commit) stays plain text or keeps its existing link. The agent states the rule it used in the PR.
  • With no pinned commit available, paths stay plain text.

Key interfaces:

Acceptance criteria:

  • The diff adds a UI check: a repo-relative path in a recommendation, a commitment and an alternative each renders as a link whose href contains the pinned commit SHA and the path.
  • The same check confirms that with no pinned commit in the fixture, the path renders as plain text.
  • A planning patch fragment exists (scripts/new-changelog-fragment.sh planning patch), and scripts/check-changelog-fragments.sh --check passes.
  • The PR's CI runs test-bash, including plugins/planning/surface/surface.test.sh with its browser suites, and it passes. The lane does not run scripts/run-test-file.sh (not on its allowlist).

Out of scope:

  • Decide-row markdown (the item this depends on, which touches the same renderer).
  • Changing which text the session writes.

Refs #7753


This was generated by AI during backlog shaping. Split from #7753 so each piece fits the lane's run time; the owner approved this split in an attended backlog-shaping session on 2026-10-18.

Activity

  1. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    on Oct 18, 2026
  2. added theissue type on Oct 18, 2026
  3. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    and removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 22, 2026
  4. kyle-sexton commented on Oct 22, 2026

    @kyle-sexton
    MemberAuthor

    Holding (removed status: ready). Two premises no longer hold:

    Re-brief after Phase 4 against the served renderer, with a decided SHA source (a meta field written by round.py, or the SHA already in the question's facts links).

  5. github-actions commented on Oct 25, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 2 of 2).

  6. github-actions commented on Oct 25, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: #8633, #10211, #10212

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    [quote truncated; the full decision is at the link]

    #8089 (comment)

    This decision settles the open questions: the SHA source, waiting for the served renderer, how a non-file path is detected, and the body wording. I understood the work as linking repo-relative paths in recommendations, commitments and alternatives to the pinned commit. The blockers are the ones the decision names (#8633, #10211, #10212). No duplicate found.

    Automated triage, applied by the lanes App.

  7. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 25, 2026
  8. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  9. melodic-automation-lanes commented on Oct 25, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: Repo-relative paths in recommendations, commitments and alternatives render as links to the file at a pinned commit, and stay plain text when no commit is available.

    Dependencies

    • #​8633 Phase 4 replaces inline() with one served renderer; this change should land against that renderer, not the current one.

    Related work

    Open questions

    1. Where does the pinned commit SHA come from?
      RECOMMENDED: A new meta field written by round.py (for example meta.commit), validated in the schema, because it is one explicit source that does not depend on parsing facts links. Basis: plugins/planning/surface/index.html:640 reads only meta.repo today; no SHA reaches the page.
    2. Should this wait for #​8633 Phase 4 and be re-briefed against the served renderer?
      RECOMMENDED: Yes. Hold until Phase 4 lands, then re-brief against the new renderer. Basis: plugins/planning/surface/index.html:633 inline() is the code Phase 4 replaces, per the 2026-10-22 maintainer hold.
    3. How should a path that names no file at the commit be detected, given the page cannot check the repository?
      RECOMMENDED: Link only paths with a directory separator and a file extension that are not part of a URL, and state this rule in the PR; do not verify existence at render time. Basis: judgment
    4. Should the issue's done-when be rewritten so it no longer says #​7752 introduces the pinned commit link?
      RECOMMENDED: Yes. Reword it to name the new meta SHA field and its writer in round.py as the source, and add a round.py/schema test for the field. Basis: plugins/planning/surface/test_schema.py:133

    Sources read

    • plugins/planning/surface/index.html:633: inline() renders code spans, markdown links, issue refs and bold/italic; it has no repo-path linking.
    • plugins/planning/surface/index.html:640: the only repo value the page reads is S.doc.meta.repo (owner/repo slug); no commit SHA.
    • plugins/planning/surface/round.py:631: round.py only warns about bare #N when meta.repo is unset; it writes no SHA.
    • plugins/planning/surface/test_schema.py:133: the schema tests cover meta.repo only.

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

  10. kyle-sexton commented on Oct 26, 2026

    @kyle-sexton
    MemberAuthor

    Released for re-triage under the owner's 2026-10-26 rule: a person is involved only for "1. A change in original intent/vision 2. Something comes up during implementation ... that alters intent/vision or the primary design 3. If there is a HIGH/CRITICAL security issue". None applies here, so the hold label came off and intake triage runs again now.

    To hold this issue again, add needs-human (or status: needs-decision) and name which of the three applies.

  11. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 26, 2026
  12. kyle-sexton commented on Oct 27, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner answered in the Refinement and Issue Triage sessions (2026-10-25), deciding the open items below on the facts:

    go with whatever the facts/data/metrics + /discovery:research says and ensure we're aligned with SOLID, DRY/SSOT principles

    I should only ever be in the loop ONLY when necessary (intent/vision changed, something came up during implementation that impacts trajectory/alignment, OR a high security risk) - I've covered this all before

    This answers the questions in intake's triage (#8089 (comment)) and refinement (#8089 (comment)).

    The owner ledger names this issue twice, and neither row decides the SHA source (.work/backlog-shaper-course-correction/interview-checklist.md:40, :54):

    Q10 | answered | round 2 | (part of Q8) Admit #5912 and #8083-#8089 (remove needs-human, add agent-ready) at the tab-1 admission rate, in Issue Triage's admission order, with the pace set by Issue Triage's Q2? | yes, recommendation accepted (owner, tab 6, 'go with recommendations'); revised from 'one per merge or close' after Issue Triage CONFLICT (tab 5 Q2, tab 1 Q16/Q17)

    F6 | answered-from-tool | Is the #7670 hold on #5912/#8083-#8089/#7757 still live? | No: #7670 merged 15:03Z | DECISIONS.md:111

    Q10 admitted this issue to the lane; F6 records that the #7670 hold is gone. Neither touches the questions below.

    1. Where does the pinned commit SHA come from?
      Decided: From the same source as the repo slug, one more key beside repo. Today that source is meta, written through set_meta, which accepts only META_KEYS (plugins/planning/surface/round.py:793, :796-803); the page reads meta.repo in inline() (plugins/planning/surface/index.html:648, :655); the schema lists meta.repo (plugins/planning/surface/schema/questions.schema.json:181). The facts links are not a page-wide source: they are per question and only sometimes pinned, which is why warn_branch_source_links warns on branch links (round.py:650-656). feat(planning): bring the one-on-one interview page in line with the shared page #8633's Phase 4 reads REPO from the server (feat(planning): bring the one-on-one interview page in line with the shared page #8633 (comment)); if that has landed when this is built, the SHA travels the same way. This adds no new mechanism: it reuses the existing meta path.
    2. Should this wait for feat(planning): bring the one-on-one interview page in line with the shared page #8633 Phase 4 and target the served renderer?
      Decided: Yes. The 2026-10-22 hold (fix(planning): link repo paths in interview recommendations to the pinned commit #8089 (comment)) and feat(planning): bring the one-on-one interview page in line with the shared page #8633's update ("fix(planning): link repo paths in interview recommendations to the pinned commit #8089 stays held until Phase 4", feat(planning): bring the one-on-one interview page in line with the shared page #8633 (comment)) put Phase 4's single renderer in place of inline(). The body's criteria test rendered links, so they hold for whichever renderer serves the page when this is built.
    3. How is a path that names no file at the commit detected?
      Decided: The body already leaves this to the agent: "The agent states the rule it used in the PR." No render-time existence check is added. Basis: issue body, "Desired behavior".
    4. Should the body stop saying fix(planning): pin interview source-text links to a commit SHA #7752 introduces the pinned commit?
      Decided: Yes. fix(planning): pin interview source-text links to a commit SHA #7752's fix sends no SHA to the page (hold comment above; index.html:655 reads only meta.repo). The "Key interfaces" lines become: the renderer that serves the page when this is built, and the pinned-commit key decided in item 1.

    Dependencies: #8633 (open, raw/full/8633.json), and #10211 and #10212, which Issue Triage lists as open blockers. Status: blocked on those, not status: needs-decision.

    Acceptance criteria: the body's four criteria stand unchanged, plus:

    • The pinned commit SHA reaches the page from the same source as the repo slug (today a key accepted by set_meta's META_KEYS in plugins/planning/surface/round.py and listed in schema/questions.schema.json meta), and a test in plugins/planning/surface/test_round.py (or the server's tests, if Phase 4 moved the slug there) sets it and reads it back.
  13. melodic-automation-lanes commented on Oct 27, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane yet: blocker #10211 is not closed by a listed human or a merge; blocker #10212 is not closed by a listed human or a merge; blocker #8633 is not closed by a listed human or a merge.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions