Conversation
Signed-off-by: karenchuu <25980598+karenchuu@users.noreply.github.com>
Decided on the folded value with anchors normalized, so an anchored or assembled restatement is reported the same as a literal copy, and a construction whose value cannot be folded has to be declared. The runtime module is the owner because the provider already imports eight other connector contracts from it; a probe asserts that direction, because the whole premise rests on it. The scope and profile shapes stay separate on purpose -- they answer with a different character class, not a different spelling. Signed-off-by: karenchuu <25980598+karenchuu@users.noreply.github.com>
…premise Signed-off-by: karenchuu <25980598+karenchuu@users.noreply.github.com>
|
CI triage for exact head All three failing shards point to the same source-fingerprint churn boundary, not to this PRs connector-token changes:
Those failures are in The branch is currently 25 commits behind This explains the red checks only; it is not an approval. The updated exact head still needs review. |
Goal And Delivered Outcome
Outcome basis / anchor: no pre-existing issue. Measured on the intended base
3b73108e3, the shape[A-Za-z0-9][A-Za-z0-9._:-]{0,199}-- "may this value be carried as a connector token" -- was compiled three times:loopx/extensions/external_connector_runtime.py:31,loopx/extensions/external_connector_provider.py:41andloopx/extensions/lark/document_comment_provider.py:48. All three apply it withfullmatch, so the copies answered the same question with the same text:SAFE_TOKEN_PATTERN.Owner, by the tree's own evidence rather than preference:
external_connector_provider.pyalready imports eleven other names from it (CONNECTOR_SCHEMA_VERSION,ExternalConnectorCapability,ExternalResponsePolicy,build_external_event_response_receipt,decide_external_event_ack,settle_external_connector_eventand others) fromexternal_connector_runtime.py. The runtime module was already the place the connector boundary asked questions; only the token shape had a second local copy.Observable before → after: two local
re.compilecalls deleted, two imports added, and a guard that fails if either file restates the shape or keeps the import while deciding some other way. Every accepted and rejected value is unchanged: the guard measures the bound at its edge (200in,201out) and asserts the class rejects/,@, space, tab and non-ASCII.Intended base:
3b73108e3.Scope And Continuation
SAFE_SCOPE_PATTERN(external_connector_provider.py:42) allows/;SAFE_PROFILE_PATTERN(lark/document_comment_provider.py:48) drops:and bounds at 99. Different character classes are different answers, so a "consolidation" that swallowed them would be a product change wearing this PR's clothes.{0,127},{0,159},{0,255}-- each with its own rejection text at its own surface.^[A-Za-z0-9._:-]{1,200}$-- the opaque-reference shape -- is compiled in five modules on this base (chat_action_store.py:57,chat_actions.py:51,control_plane/goals/deletion_service.py:49,control_plane/goals/botmux_runtime.py:31,control_plane/goals/source_session_registry_state.py:14). It has no single owner yet, and it is the largest same-value family the connector shape sits next to.Validation
57e78cc04(3 commits, 3 files, +404 -2).unitpytest tests/architecture/test_connector_token_shape_owner.py-> 34 passed in 0.55s: value scan overloopx/with anchor normalization and same-file constant folding, per-consumer identity plus a real reference, an assertion that the provider still imports from the runtime (the guard's premise), 7 accept / 10 reject cases including the 200/201 boundary, and 9 spelling probes (5 must be reported, 4 must not).integrationc1cef09c8; the follow-up commit57e78cc04only rewords a docstring inside the new guard file, which was then re-run green (34 passed).regression_paritypytestover the test files that import the three touched modules -> 367 passed, 0 failed in 15s. Head has no failure to attribute, so no base replay was needed; no test file was edited.staticpython -m ruff checkon the three changed paths: clean.python -m mypy(no arguments, as CI runs it):Success: no issues found in 19 source files.staticloopx check --scan-pathfor each changed path through this tree's own entrypoint:ok: true, "public boundary scan clean: 3 files"; both warnings concern the absent local.loopx/registry.json.semantics budgetexamples/semantic-vocabulary-drift-smoke.pyon an unmodified3b73108e3worktree and on this head, same venv, same Node 22.23.2, samenode_modules: output byte-identical,conflicting_definitions=55/55. Removing two duplicate definitions moved no ratchet because are.compilevalue is not one of the inventory's counted kinds, and no new constant name is introduced here.canaryloopx canary premergewith the changed files passed explicitly:selected 13 / executed 13 / failures 0,status: passed, no manual holds.mutationfullmatchmakes them redundant); a new module assembling the shape from two same-file constants (M3); the owner tightening the bound by one character (M4, 4 cases); the owner dropping:from the class (M5, 3 cases); a consumer keeping the import while deciding with a weaker local check (M6); an unfoldable construction in a new module (M7). Survived, and why it is equivalent: M8 addsnormalized.isprintable()alongside the owner check; no value the class accepts is non-printable, so the answer is identical for every input.frontendType Of Change
LoopX Area
loopx/extensions/external_connector_provider.py,loopx/extensions/lark/document_comment_provider.py,tests/architecture/.Technical Direction
Boundary Checklist
none.