Conversation
Refs loopx-project#4447 (Track A) DECISION_CONTEXT_CAPABILITY_ID was defined twice with different values: "decision-context" for the extension binding and "decision_context" for the capability packet contract. They are not a conflict: * the hyphenated value is the catalog/CLI/extension namespace, and every loopx/capabilities/*/catalog_entry.py id uses that spelling; * the underscore value is the packet contract, matching the sibling capability's "material_lifecycle". No consumer joins the two, so both values are retained and the constants now name their slot. Bump-safe parity is locked by a focused regression test instead of a unification that would break either namespace. Signed-off-by: BigDataDZ <76271875+BigDataDZ@users.noreply.github.com>
Refs loopx-project#4447 (Track A) The pinned mcp version was written out three times in cli.py: in MCP_REQUIREMENT, in the _compatible_python probe and in the provision failure message. A future pin bump could therefore update the install requirement while leaving a probe that still asserts the old version. MCP_SDK_VERSION is now the only place the version appears; the requirement, the probe and the message all derive from it. The pin stays exact and is not relaxed to a range: goal_mode_mcp.py imports mcp.server.fastmcp, which the MCP SDK 2.x line no longer ships, and the pin is a deliberate security pin (892faa2). It also stays independent of claude_goal_mode's "mcp<2": the two adapters provision separate venvs, so they are separate packaging boundaries. Signed-off-by: BigDataDZ <76271875+BigDataDZ@users.noreply.github.com>
Contributor
Author
|
Superseded by #4513: same two Track A items, re-pushed from the YZJF fork so the contribution lands under that account. Closing to avoid a duplicate review. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #4447 — Track A, the checklist item:
"Resolve
DECISION_CONTEXT_CAPABILITY_IDhyphen/underscore andMCP_REQUIREMENTpin/range differences after checking actual callers and packaging boundaries."This PR does not close the tracker; it addresses two checklist items and records the classification evidence for both.
1.
DECISION_CONTEXT_CAPABILITY_ID— two slots, not a conflictThe same constant name carried two values:
capabilities/decision_context/extension_provider.py:24decision-contextcapabilities/decision_context/packets.py:18decision_contextCaller check shows both spellings are conventional in their own namespace and neither is a stray:
loopx/capabilities/*/catalog_entry.pyids use it (decision-context,material-lifecycle,periodic-report, …), matching the CLI command and thedecision-contexthelp/catalog surface. The extension value is looked up by the extension runtime, so it must equalDECISION_CONTEXT_CATALOG_ENTRY["id"].material_lifecycle(capabilities/material_lifecycle/architecture.py:39,_validation.py:177), and the six decision-context emitters (architecture.py:33,profile.py:419,runtime.py:321,sources.py:314and:401,outcome_feedback.py:301) all agree.No consumer joins the two values, so both values are retained and the constants are renamed to name their slot:
DECISION_CONTEXT_EXTENSION_CAPABILITY_IDandDECISION_CONTEXT_PACKET_CAPABILITY_ID. Values, packet output and extension lookup behaviour are unchanged. This is a scope clarification, not a debt-count reduction.2.
MCP_REQUIREMENT— pin vs range is justified; the same-file triplication was notloopx/kunluncode_goal_mode/cli.py:28→mcp==1.28.1(exact)loopx/claude_goal_mode/scripts/install.py:83→mcp<2(range)The difference is justified and is kept: the two adapters provision separate venvs (
~/.local/share/loopx/kunluncode-mcp/.venvvs the Claude MCP venv), so they are separate packaging boundaries. The exact pin is also deliberate —loopx/goal_mode_mcp.py:285importsmcp.server.fastmcp, which the MCP SDK 2.x line no longer ships, and the pin came from892faa2c9fix(security): upgrade the MCP SDK pin. Relaxing it to a range would undo a security pin.The real defect was local:
1.28.1was written out three times incli.py— inMCP_REQUIREMENT, in the_compatible_pythonprobe assertion, and in the provisioning failure message. A bump could update the requirement while leaving a probe that asserts the old version.MCP_SDK_VERSIONis now the single source; the requirement, probe and message derive from it.Validation
Base
36c6d8df0(upstream/main), head531a611f3. Python 3.13.12 (repo requires >=3.11; nopython3.11on this machine).pytest -q tests/capabilities/test_decision_context_capability_id_slots.py tests/test_kunluncode_goal_mode.py tests/capabilities/test_decision_context_packets.py tests/capabilities/test_decision_context_extension_provider.pypytest -q tests/capabilitiestest_repository_change_window.py(SSH/worktree env), untouched by this PRpytest -q tests/architectureruff checkon all changed filesexamples/semantic-vocabulary-drift-smoke.pyTypeScript production parser failed; run npm ci. Not runnable here, unchanged by this PRBoundaries
semantic-vocabulary-convergence-v0.md:110/.zh-CN.md:95) still listDECISION_CONTEXT_CAPABILITY_IDas a same-name conflict. They are now historically resolved; I left the normative bilingual RFCs alone so the update can be recorded as a decision rather than smuggled into a code PR.Signed-off-by.