Skip to content

config-cascade: settings resolution and convention home #7571

Open
4 of 7 issues completed
Open

Description

@kyle-sexton

Parent

Refs #7555. Source: PLAN Phase 3, topic poteto-review. Thread: Settings resolution and convention
home.

Depends on

Outcome

Every plugin setting resolves through one documented cascade: plugin default, userConfig, team
file and personal overlay in the conventions home, with policy-floor keys that a personal overlay
can only tighten.

Decisions

  • One config ADR superseding ADR 0061's paths, ADR 0064's fixed root and ADR 0015: plugin default,
    userConfig, team <home>/<concern>.yaml, personal <home>/<concern>.local.md overlay replacing
    sections by heading; personal beats team except policy-floor keys, which may only tighten (D77,
    D112, Q507, Q549, Q550). Origin: ours.
  • Instruction text beats config, config beats plugin defaults; a skill that defers says which file
    won; one AGENTS.md line says plugin defaults are fallbacks (D77, C14).
  • Default home docs/conventions/<concern>.md (+ .yaml for model-free readers) with a pointer in
    the existing AGENTS.md/CLAUDE.md; conform to an existing equivalent home; YAML never under
    .claude/; no plugin-specific convention files (D111, Q534, Q547).
  • All 15 conventions-vetting fixes adopted (D112, Q549). Rename conventions/ to standards/ in
    melodic-software/standards as a pure move (refactor: rename conventions/ to standards/ standards#790) (D111, Q548): another
    repository, so this thread stops and asks before touching it; the synced-path rename follows its
    merge as its own PR.
  • Guidance reaches consumers through the settings cascade; a setup action offers to write convention
    files; nothing always-loaded (Q578).
  • C17: preferences where reasonable consumers differ become settings with a named default, basis and
    scope. Fixed floors only tighten: D79, Q574, D96, D88, D100, Q131, the C13 intent gate (Q553).
    Setting: research depth for routine actions "cite what is in context" (Q553, Q575). Origin:
    owner's.
  • PR pipeline slice a reads the existing ADR 0061 resolver for pr_open_state; this thread migrates
    it (GUIDE 121).

Key interfaces

From the design's contracts, "Config": "One config ADR supersedes ADR 0061's paths, ADR 0064's
fixed root and ADR 0015. Layers: plugin default, userConfig, team <home>/<concern>.yaml,
personal <home>/<concern>.local.md (replaces sections by heading). Personal beats team except
policy-floor keys, which may only tighten. Instruction text beats config; config beats plugin
defaults." "Bindings: tracker <home>/work-items.yaml (schema-checked; stop and ask when
undeterminable), buffer <home>/findings-buffer.yaml (.local.yaml overlay), app driver
app-control.yaml or discovery."

Variation verdicts: "Conventions home location: contain now; docs/conventions/ default, conform to
an existing equivalent home (D111, Q547)."

Conventions followed: ADR 0015, ADR 0061, ADR 0064, the config-cascade convention.

Slices: #7934 config-adr; resolver-and-vetting-fixes and setup-writes-conventions (filed once the
verify-scripts change for scripts/sync-shared-copies.sh is open, GUIDE 134).

Done when` for #7571. Each line names the file that does the job. The current

lines point the layer and floor checks at lib/resolve-convention-home.sh, which only finds the
home directory (its header). The layers live in lib/config-cascade.mjs, and the resolver's
test already exists at plugins/harness-config/lib/resolve-convention-home.test.sh.

Done when

  • lib/config-cascade.test.mjs has a passing case, for each Floor direction value other
    than "no floor", where a personal <home>/<concern>.local.yaml value that loosens a
    policy-floor key is rejected and the team value stands
    (scripts/run-test-file.sh lib/config-cascade.test.mjs exits 0). No such case exists on main.
  • lib/config-cascade.test.mjs has a passing case where a <home>/<concern>.local.md
    section replaces the team <concern>.md section with the same heading and leaves the other
    sections. No such case exists on main.
  • lib/config-cascade.mjs no longer reads the user-global layer
    (<userHome>/docs/conventions/<plugin>), and an invalid value drops its layer (ADR 0064 D7).
    Each has a case in lib/config-cascade.test.mjs.
  • plugins/harness-config/lib/resolve-convention-home.test.sh passes with cases for root
    classification ($HOME, an ancestor of it, outside git), no duplicate: on a symlinked
    CLAUDE.md, --ref and stdin, and the declined line
    (scripts/run-test-file.sh plugins/harness-config/lib/resolve-convention-home.test.sh exits 0).
  • The config-cascade README's Implementers table has a Floor direction column whose values
    the new config ADR defines, and each file that cites ADR 0061 also cites the new config ADR.
  • CI's lint-repo job (scripts/check-convention-yaml.sh --check,
    scripts/sync-config-cascade-semantics.py --check) and check-plugins job
    (scripts/sync-shared-copies.sh --check) pass on each slice PR.
  • Every slice sub-issue is closed by a merged PR.

Out of scope

  • Writing to melodic-software/standards (owner stop).
  • Per-plugin settings content; each thread adds its own settings through this cascade.

Related

Activity

  1. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 16, 2026
  2. 51 remaining items

  3. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 24, 2026
  4. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: a Feature needs an open parent issue a listed human filed that awaits no decision; Size large: the split into sub-issues at intake is pending (owner Q93). Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  5. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: needs-decision; its comment says why.

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

    needs-specNeeds a Brief or plan before anyone can build it.priority: mediumReal value, no hard deadline; normal backlog flow.status: needs-decisionAwaiting a human or maintainer judgment call.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Fields

    Work status

    needs-spec

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions