Implement planned topic: 0042-tenuo#248
Open
skill-temporal-developer-updater[bot] wants to merge 1 commit into
Open
Implement planned topic: 0042-tenuo#248skill-temporal-developer-updater[bot] wants to merge 1 commit into
skill-temporal-developer-updater[bot] wants to merge 1 commit into
Conversation
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.
Validation Report —
tenuoSkill root:
.(branchdraft/0042-tenuooftemporalio/skill-temporal-developer)Authored artifacts under review:
references/python/integrations/tenuo.md(new, 261 lines, 33 citation tags pointing at 11 sections ofhttps://tenuo.ai/temporal)references/integrations.md(one row appended for Tenuo)Source-of-truth note: the Temporal docs clone (
../documentation/docs/) only carries a one-row catalog mention of Tenuo atdevelop/python/integrations/index.mdxand a one-line bullet atdevelop/python/index.mdx. Both link out to the external upstream guide athttps://tenuo.ai/temporal. This is consistent with how the docs treat other partner-hosted integrations (Google ADK, Pydantic AI). The validation source for Tenuo-specific API claims is therefore the upstream guide, fetched via WebFetch, plus the docs clone for Temporal-side SDK symbols.Go/no-go
@activity.defn,@workflow.defn,Client.connect,WorkflowHandle,workflow.execute_activity, etc.) verified in the docs clone.SKILL.md,references/python/python.md, orai-patterns.mdedits.Overall verdict
MINOR FIXES (strict-rubric reading is borderline RE-RUN AUTHORING because Check 4 came in at 80 %, below the 95 % threshold — but both mismatches are single-word factual edits to existing sentences, not structural problems, and Checks 1/2/3/5/6 all pass. A spot-fix commit can close them; full re-authoring would be disproportionate.)
Check 1 findings — citation audit
Result: 33/33 citations resolved cleanly. No findings.
The 33 citation tags use 11 distinct section names, all of which match the upstream guide's actual section headings verbatim (verified via WebFetch against
https://tenuo.ai/temporal):All inline cross-links are full
https://URLs (https://tenuo.ai/temporal,https://tenuo.ai/docs) — no root-relative/develop/...paths.Check 2 findings — reverse-grep audit
Result: zero unexplained grep-misses. No findings.
Token classes extracted from
references/python/integrations/tenuo.mdand verified:TenuoTemporalPlugin,TenuoPluginConfig,EnvKeyResolver,VaultKeyResolver,AWSSecretsManagerKeyResolver,AuthorizedWorkflow,SigningKey,Warrantexecute_workflow_authorized,start_workflow_authorized,tenuo_execute_child_workflow,tenuo_execute_activity,execute_authorized_activitySubpath,Pattern,Range,UrlSafe,Exact,Wildcard(see Check 4 forAnyOfomission)tenuo[temporal],tenuo,tenuo.temporal,tenuo_coreTENUO_KEY_<key_id>,TENUO_KEY_agent1@activity.defn,@workflow.defn,Client.connect,Worker,WorkflowHandle,workflow.execute_activity,start_to_close_timeout,task_queue,temporal server start-dev,SimplePlugin,plugins=,workflow_run_fn,workflow_id=develop/python/*)Argument-name tokens used inside Tenuo helper call sites (
key_resolver=,trusted_roots=,key_id=,warrant=,tools=,ttl_seconds=,summary=) all map to fields the upstream guide names explicitly.Check 3 findings — regression on known bugs
Result: zero hits. No findings.
Universal regression patterns scanned (none present):
--profileas atemporalflag,TEMPORAL_TLS_CLIENT_CERT_PATH,TEMPORAL_TLS_CLIENT_KEY_PATH,TEMPORAL_TLS_SERVER_CA_CERT_PATH,tcld service-account,--output text,--output jsonl,saas-api.tmprl.cloud:7233.Tenuo-specific anti-patterns (the wrong forms the upstream guide itself flags as mistakes) appear only inside the
## Common mistakessection explicitly labeled as wrong — that is the intended use. They do not appear as recommended forms anywhere in the file.Check 4 findings — independent re-verification (sampling)
Result: 8/10 sampled claims match upstream (80 %). Below the 95 % threshold by two findings. Both are word-level "subtle-wrong" — the kind Check 4 is built to catch.
Sampling method: deterministic every-3rd selection across the 33 citation tags (positions 1, 4, 7, 10, 13, 16, 19, 22, 25, 28), guaranteeing the Prerequisites / version-floor bullet is in the sample. Each sampled claim was re-derived from a fresh read of the cited upstream section before comparison.
Sample matrix
Python 3.10+, inherited from temporalio>=1.23.0SimplePluginrequirement)uv pip install "tenuo[temporal]"; pulls intemporalio>=1.23.0andtenuo_core(a compiled extension with prebuilt wheels)tenuo_coreis a Rust extension; omission is stylistic, not material)EnvKeyResolverreadsTENUO_KEY_<key_id>with key bytes base64- or hex-encoded@activity.defnfunctions; authorization runs in the interceptor before the function bodyexecute_workflow_authorized(client=, workflow_run_fn=, workflow_id=, warrant=, key_id=, args=, task_queue=)Subpath,Pattern,Range,UrlSafe,Exact,Wildcard"tenuo_execute_activityruns an Activity withsummary=attached to the Event History so it appears in the Temporal Web UIsummary=parameter does this; upstream confirmssummary=is the surface)from temporalio.contrib.tenuo import …— that module does not exist"tenuopackage, not intemporalio.contribFinding 4-A —
EnvKeyResolverencoding claim is broader than upstream supportsreferences/python/integrations/tenuo.md:70`EnvKeyResolver` reads holder signing keys from environment variables named `TENUO_KEY_<key_id>`, with the key bytes base64- or hex-encoded.tenuo.ai/temporal § Configure Workers to use Tenuo):`EnvKeyResolver` maps `key_id` to environment variables using the convention **`TENUO_KEY_<key_id>`** with **base64-encoded** signing key bytes.**base64-encoded**only. Theor hex-encodedalternative is not supported by the upstream text.python -c "...print(k.secret_key_bytes().hex())"); the resolver would fail to decode it at worker startup. Real divergence in generated code.or hex-encoded(and update the example on line 73 if it teaches anything but base64).Finding 4-B — Capability constraint list omits
AnyOfreferences/python/integrations/tenuo.md:185Constraint types named on the upstream guide: `Subpath`, `Pattern`, `Range`, `UrlSafe`, `Exact`, `Wildcard`.tenuo.ai/temporal § Capability constraints, full-list sentence):…the full list of constraint types (`Subpath`, `UrlSafe`, `Exact`, `Pattern`, `Range`, `AnyOf`, etc.).AnyOf(in upstream's enumerated list) forWildcard(used in upstream as the "unconstrained but declared" type but not part of the enumerated full list).AnyOfis missing.AnyOfexists as a constraint type and would either fail to express "this argument may be any of {x, y, z}" or invent a wrong constraint expression.AnyOfto the list. KeepingWildcardis fine — it is a real type and used in the file's example — but the sentence should say it is a constraint type, not that it is named "on the upstream guide" in the same list.Check 5 findings — integration-layout audit
Result: all six sub-checks pass. No findings.
references/python/integrations/tenuo.mdreferences/integrations.mdfor Tenuo, with name + extra, language, short clause, reference path, related-topic pointerSKILL.mdeditgit diff main..HEAD -- SKILL.mdis emptyreferences/python/python.mdgit diff main..HEAD -- references/python/python.mdis emptyai-patterns.md(or anywhere)git diff main..HEAD -- references/python/ai-patterns.md references/core/ai-patterns.mdis emptyCheck 6 findings — tone and scope audit
Result: zero Pattern 1 (workaround-disclosure) findings. Two minor lower-severity flags.
Pass on the mandatory pattern
No bullet in the file shows the agent how to circumvent a stated constraint. Every "Don't do X" bullet in the Common mistakes section names the supported alternative (
AuthorizedWorkflowinstead of plain@workflow.defnfor authorized Activities,execute_workflow_authorizedinstead ofclient.execute_workflow, etc.). Negatives stop at the boundary; none open a cookie jar.Minor flags (MINOR FIXES; can be bundled with the Check 4 fix)
Finding 6-A — Mild Pattern 8 (speculative common mistake):
TENUO_SIGNING_KEY_<id>env-var bulletreferences/python/integrations/tenuo.md:251- **`TENUO_SIGNING_KEY_<id>` env-var name.** The convention is `TENUO_KEY_<key_id>` — the key id is appended directly to `TENUO_KEY_`.TENUO_SIGNING_KEY_<id>as a common typo — the bullet hypothesizes the mistake (plausibly, because the package exposes aSigningKeyclass). The corrective half is fully grounded; only the wrong form is invented. Borderline acceptable; recommend either dropping the bullet or grounding it.Finding 6-B — Mild Pattern 3 (light implementation-internals inference): "Do not re-pass the parent warrant"
references/python/integrations/tenuo.md:214and the matching common-mistakes bullet at line 252.Do **not** re-pass the parent's `warrant=` to the child — delegation happens through the `tools=` and `ttl_seconds=` arguments, which produce a fresh, narrowed warrant for the child.workflow.execute_child_workflow()does not propagate warrant headers, and thattenuo_execute_child_workflow()should be used for authorized children — it does not literally instruct "don't passwarrant=". The helper's signature usestools=/ttl_seconds=(nowarrant=parameter), so the inference is correct; but the bullet is making the inference for the reader rather than restating the upstream rule. Keep, but consider rephrasing to "Passtools=/ttl_seconds=; the helper has nowarrant=parameter — it attenuates the parent's warrant for you" to stay closer to documented behavior.Other patterns — no findings
[!NOTE].)## Define authorized Activities and Workflowsand again in## Common mistakes, but the second appearance is the standard negation-form anti-pattern — that is the canonical place to repeat it.from … import …in the file sits at module scope in its example.Check 7 findings — cross-language structure
Skipped. Python-only integration; no
references/core/tenuo.mdexpected.Statistics
Recommended next step
One small follow-up commit can close every finding:
references/python/integrations/tenuo.md:70— dropor hex-encoded; ensure the example on line 73 usesbase64.b64encode(...)(it already does).references/python/integrations/tenuo.md:185— addAnyOfto the constraint-type list; soften the lead-in to acknowledgeWildcardis the "unconstrained but declared" type rather than part of upstream's enumerated full list.No structural re-authoring is needed. The skill is grounded against a real upstream source; the diff respects the catalog convention; the regression patterns are clean; and the Common-mistakes section is honest about boundaries without disclosing workarounds.