Skip to content

History

Revisions

  • "docs: correct wiki doc behavior on queue env Signed-off-by: AlexTranAmz <167144297+AlexTranAmz@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Aug 25, 2026
    4c7eedb
  • "fix: Specify list string escaping and nested repr_pwsh arrays Chasing openjd-rs#312 showed the spec's list-to-string conversion ("the JSON string representation") was being violated by implementations that quoted list elements without escaping them, and that five conformance tests had recorded that unescaped output as the expected result on Windows, where every path separator is a backslash: ["C:\out\a.exr"] -> ["C:\\out\\a.exr"] Correct the output_windows expectations of the five tests (expr2.2.3--flatten, expr1.2.6--list-type-inference, expr2.3.1--uri-path-scheme-detection, and both 2.12--list-path-param-*-windows), and add expr2.2.1--string-conversion-list-escaping covering a double quote, a backslash, control characters, a nested list, and a list of paths -- each rendering is also handed to a JSON parser, pinning the property rather than one spelling of it. The Expression Language page (2.2.1) now states the rule directly: strings and paths are double-quoted with `"`, `\`, and characters below U+0020 escaped; format string interpolation uses this same conversion. Escaping non-ASCII is left to the implementation, since JSON accepts those characters directly. Auditing the fix surfaced a second gap: the spec did not say what repr_pwsh produces for a nested list, and the Rust implementation was rendering inner lists in JSON form -- @(["a", "b"], ["c"]) -- which is a PowerShell syntax error. Section 2.2.6 now states that nested lists render recursively as @(...) and that a one-element outer list uses the unary comma form @(,@(1, 2)), because PowerShell flattens @(@(1, 2)). The expr2.2.6--repr-pwsh test gains assertions for the nested forms, and a new Windows-only test, expr2.2.6--repr-pwsh-nested-roundtrip-windows, feeds the rendered literals to a real PowerShell interpreter and checks that it reads back the same structure with no flattening. Companion to the openjd-rs fix for openjd-rs#312; the full conformance suite (1116 tests) passes on Windows against that implementation. Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Aug 21, 2026
    7155d09
  • "fix: Restate RFC 0005 coercion as satisfaction then conversion This change started on the implementation side: we identified that the coercion code had become too complicated to understand and review properly, and evaluated how we might improve it. The improvement was to restructure coercion as two explicitly ordered steps — first check whether the result already satisfies the target, then convert it if not. Working through that split surfaced adjustments we wanted to make in the specification itself, restated here. Because EXPR isn't yet widely deployed in production, we believe this is still a good time to make a change like this. The coercion rules applied the scalar rule only "when the target types have a single scalar type (without counting `nulltype` or `list[T]`)" and the list rule only when there was a single list type, prescribing no coercion at all for a target with two or more candidates of the same shape. That leaves reachable targets undefined: a target built from several candidate signatures can carry two scalar candidates (`zfill`, `int`, `float`, and `bool` each have a `float | int | string` parameter position), and implementations coerce there rather than reporting an ambiguity. The RFC also listed `range_expr` → `string` and `range_expr` → `list[int]` as rules whose conditions both hold for a `list[int] | string` target, with no stated winner. Restate the section in the two steps an implementation actually performs: - Satisfaction. If the result's type already satisfies the target it is used unchanged. Spell out the relation, including that a union target needs one member satisfied and that `list[T]` is covariant in `T`, so `list[int]` satisfies `list[any]` and `list[int | string]`. Note it is directional and therefore not the symmetric matching used to bind type variables — using one for the other accepts a `list[T1]` target by binding `T1` and discarding the binding — and that a result's type is never itself a union, since union constraints on unresolved values are decomposed first. - Conversion. Otherwise convert toward one of the target's destinations, a union contributing each member, first success winning. This replaces the single-candidate conditions and makes a union accept at least what each member accepts on its own. Destinations are ordered non-list before list, and within each group by a per-result-type preference table set by two principles: a value prefers to stay within its own kind, so a number remains a number before it becomes text, and a conversion that can fail is attempted before one that always succeeds, since a universal fallback attempted first would make every destination after it unreachable. So `int` prefers `float` over `string`; `float` prefers `int` (exact wholes) over `string`; `string` prefers `int`, then `float`, then the selective `bool` and `range_expr` parses, then `path`, which every string trivially satisfies; and a list source orders list destinations by its element type's preference, recursively. This makes the choice fully deterministic — `5` against `float | string` is `5.0`, `"5"` against `int | float` is `5` — where a first-draft of this rewrite had left same-shape order unspecified, letting the same template produce different jobs on different conforming implementations. The non-list-first level resolves the `range_expr` overlap: against `list[int] | string` the result is the canonical string `"1-5"`, whose cost does not depend on the range size. Add `string` → `bool` (the same case-insensitive spellings as RFC 0006's explicit `bool()` conversion) and `string` → `range_expr` to the conversion list. Both are non-destructive parses that succeed only for strings that unambiguously denote a value of the target type, in the same spirit as `string` → `int` and `string` → `float`, and they slot directly into the ordering principles — after the numeric parses, before the universal `path` fallback — so `"true"` against a `bool | path` target is `Bool(true)`. Since satisfaction runs first, the conversions no longer need their "when the target types do not include ..." conditions; those were restating the first step. State that `nulltype` is never a destination, so a `string` whose text is `"null"` does not become `null`, and that the type-variable rule holds at any nesting depth: an implementation must reject a `list` destination whose element type mentions an unbound type variable rather than binding the variable and discarding the binding. Also sharpen the unresolved-value narrowing: against a union target the constraint narrows to the union of every destination with a type-level rule, rather than betting on any one of them, because the type level cannot see the payload that decides which destination wins. The narrowed constraint thus always satisfies the target and always describes the concrete result — an `unresolved[float]` narrows to `unresolved[int | string]` against `int | string`, covering both the 3.0 payload that lands on `int` and the 3.5 payload that falls through to `string`. For a non-union target exactly one destination exists, so the constraint is exactly the type evaluation will produce. Matching user-facing language in the wiki's Expression Language page. The openjd-rs implementation matches this text, with every stated example pinned by a test. Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Aug 19, 2026
    a8ea1dc
  • "fix: do not cap <IntRangeExpr> expansion at the list-form limit Signed-off-by: David Leong <leongdl@amazon.com>"

    @client-software-ci client-software-ci committed Aug 15, 2026
    adeade7
  • "fix: Sync RFC 0005 coercion rules with openjd-rs coercion fixes Ports three points from openjd-rs specs/expr/values.md that landed after the Call-dispatch clarification: - Sharpen range_expr -> list[int]: it is the only list type a range_expr implicitly coerces to. Any other element type is an error; implicit rules do not chain, so the materialized list[int] is never widened element-wise toward the target. Templates that want the widened list chain the explicit conversion list(value: range_expr) -> list[int] from RFC 0006. - State explicitly that a type-variable target (T, T1, T2, T3) has no coercion rule for concrete or unresolved values: type variables are resolved by signature matching before coercion, so reaching coercion with one unbound is always an error. - Document coercion of unresolved values: the same conversion table applies at the type level, union constraints coerce existentially (at least one member must succeed; failing possibilities are discarded), payload-dependent checks defer to resolution, and the two paths are asymmetric in exactly one direction - type-level coercion may accept what the concrete value later rejects, but must never reject what the concrete value would accept. Matching user-facing language added to the wiki's Expression Language page (Implicit Type Coercion and Static Type Checking sections). Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Aug 12, 2026
    f100018
  • "fix: Make WRAP_ACTIONS fixtures cross-platform via python; include variables: in WrappedAction.Environment Remove the runOn: [posix] gate from seven WRAP_ACTIONS job fixtures and switch them — plus the two ungated env_template validation fixtures — from bash/echo to python one-liners, the suite's portable interpreter (the convention every other ungated fixture in the conformance suite already follows — plain `echo` and `bash` are not reliably on PATH for Windows test runners). The WRAP_ACTIONS README's platform note now documents that convention: gated fixtures use POSIX shell, ungated fixtures use python. Clarify WrappedAction.Environment to carry ALL session-defined variables: `openjd_env` exports and entered environments' declarative `variables:` maps, both of which the runtime applies to the real subprocess environment. A wrap script forwarding the session's variables into a container must see everything the wrapped process would have received, however it was declared; splitting the two mechanisms made reusable wrappers silently drop `variables:`-declared values. Update RFC 0008, the 2023-09 Template Schemas wiki, and rename the pinning fixture wrap-environment-excludes-variables-map → wrap-environment-includes-variables-map with inverted assertions. Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jul 22, 2026
    ed66391
  • "test: Add 13 WRAP_ACTIONS conformance fixtures from the coverage audit (#153) * test: Add 13 WRAP_ACTIONS conformance fixtures Close the conformance coverage gaps identified by the RFC 0008 deep review and element-by-element coverage audit. Every High-severity divergence found across the review's five passes lived on a spec-mandated path that no fixture exercised; each new fixture pins one of those normative statements so cross-runtime divergences surface in CI instead of in review probes. Run-time cancelation validation (Template Schemas 5.3, "the runtime MUST fail the action" — previously zero fixtures; each derives its invalid value from WrappedAction.*, seeded per-action at host evaluation time, so the value is unknowable statically or at job creation and cannot be constant-folded away by an eager validator): - wrap-cancelation-mode-resolves-invalid-fails - wrap-cancelation-terminate-with-period-fails - wrap-cancelation-period-over-cap-fails Instantiation-time forwarding deferral (round-trip forwarding with the wrap env in jobEnvironments; every existing round-trip fixture used external env templates and never passed through job creation): - wrap-cancelation-roundtrip-job-environment Environment-template scope carried to wrap hooks (parameters and lets resolve in hooks; the wrapped step's symtab cannot supply them): - wrap-env-template-parameters-in-hooks - wrap-env-let-bindings-in-hooks WrappedAction.Environment is openjd_env-only (4.3.1; declarative variables: map excluded): - wrap-environment-excludes-variables-map Session-level single-layer rule (two wrap envs as SEPARATE environment templates — no single template is invalid, so only the runner can reject; the existing fixture stacks both inside one job template): - wrap-two-wrap-env-templates-rejected Cleanup guarantee and failure semantics (RFC scenario table, previously zero fixtures; now expressible with the runner's taskFailure assertion): - wrap-failed-enter-still-runs-wrap-exit Interception edge (nothing to replace means the hook must not fire): - wrap-inner-env-without-on-exit-skips-exit-hook Macro propagation beyond openjd_env (wrapped process's openjd_fail recognized through the wrap script's forwarded stdout): - wrap-openjd-fail-from-wrapped-process Variable-scope rule beyond action args (env-side validation fixtures): - 4--wrappedaction-in-cancelation-outside-hook.invalid - 4--wrappedaction-in-embedded-file.invalid Suite grows 59 -> 72. Current implementation status (expected, matches the audit's open findings): openjd-rs with OpenJobDescription/openjd-rs PR 265 passes 69/72 (fails lets-in-hooks, variables-map exclusion, cleanup guarantee = audit F12/F9/F15); openjd-sessions-for-python's RFC 0008 branch passes 68/72 (fails the three runtime cancelation-validation fixtures and the jobEnvironments round-trip = audit F5/F2). The conformance CI workflows tolerate implementation failures by design. Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com> * docs: State the wrap-hook nothing-to-replace rule explicitly Review feedback on the wrap-inner-env-without-on-exit-skips-exit-hook fixture: the behavior it pins — a wrap hook runs only in place of an action the inner entity actually defines, so an inner environment with no onExit (or no script at all) gets no onWrapEnvExit — was implicit in the spec's "runs instead of" phrasing rather than stated. Make it explicit in both places implementers read: - Template Schemas: new WRAP_ACTIONS constraint 5 (nothing-to-replace rule), including the variables:-only environment case and the note that onWrapTaskRun always runs because every <StepScript> defines onRun. - How-Jobs-Are-Run: one sentence in the wrap interception paragraph. - The fixture's header comment now cites the new constraint instead of deriving the behavior. The RFC document is left unchanged as the historical design record; the wiki pages are the living specification. Conformance suite re-run: matrix unchanged (the edited fixture passes on both implementations). Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com> * docs: State the nothing-to-replace rule in RFC 0008 as well Follow-up to the previous commit, which made the rule explicit in the wiki pages: mirror it in the RFC document itself so all three spec sources agree. - "Wrap ordering with multiple environments" gains a normative Nothing-to-replace rule paragraph (MUST NOT run a hook when the inner environment defines no matching action or no script at all), with the rationale that a hook is a replacement rather than a lifecycle notification, and the note that onWrapTaskRun always runs because every <StepScript> defines onRun. - The "Modifications to How Jobs Are Run" diff block is updated to match the sentence now present in the actual How-Jobs-Are-Run page, keeping the RFC's quoted diff in sync with the published text. Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com> --------- Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jul 21, 2026
    b31d6c2
  • "feat: Finalize RFC 0008 wrap-hook spec and nullable variable types Resolve review feedback deferred at RFC 0008 merge time, on PR #148, and on openjd-rs PR #261. - Make the wiki authoritative: copy RFC 0008 normative content (the WrappedAction/WrappedEnv/WrappedStep variable tables, timeout and cancelation semantics, failure and cleanup guarantees, and stdout macro rules) into 2023-09-Template-Schemas and How-Jobs-Are-Run, linking the RFC for attribution only. - Add WrappedAction.Cancelation.NotifyPeriodInSeconds (int?) so wrap scripts can honor the wrapped action's full cancelation semantics. - Retype WrappedAction.Timeout as int? and Cancelation.Mode as string? — null when the wrapped action declares no timeout or <Cancelation>, following EXPR semantics for optional data instead of 0/empty-string sentinels. Breaking change to the Timeout contract introduced earlier on this branch; both runtimes update in lockstep. - Specify round-trip forwarding under FEATURE_BUNDLE_1: a wrap hook can adopt the wrapped action's timeout and cancelation via whole-field format strings. Declared values forward verbatim; null drops the field (for mode, the entire cancelation object, since mode is the required discriminator). A format-string mode otherwise behaves like any normal format string: partial interpolation is valid, and the resolved value must be a valid mode name at run time. - Fix the RFC Basic Example (format-string timeouts require FEATURE_BUNDLE_1 and 0 is out of range), correct the WRAP_ACTIONS README timeout-sentinel bullet, and add EXPR to wrap-partial-hooks-rejected so the missing-EXPR rule cannot mask the all-or-nothing defect it tests. - Conformance: add fixtures covering cancelation mode and notify-period injection, schema-default forwarding, null sentinels with observable coalescing assertions, the round-trip cases, partial-interpolation mode, and invalid fixtures pinning the FEATURE_BUNDLE_1 gating. Round-trip and null-sentinel fixtures pin target behavior for openjd-rs 30cdf37, openjd-model-for-python 71fd0d3, and openjd-sessions-for-python 0295e21. Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jul 17, 2026
    64f7875
  • "fix(spec): allow Task.File.* in <StepScript>.let, matching Env.File.* in environments The Let Binding Scope Summary granted Env.File.* to <EnvironmentScript>.let but omitted Task.File.* from <StepScript>.let. The rationale for the Env case — embedded file paths are determined before let evaluation — applies identically to step scripts, and implementations already validate and evaluate Task.File.* in step-script let bindings (OpenJobDescription/openjd-rs#260). - Add Task.File.* to the <StepScript>.let scope row and generalize the embedded-file note to cover both contexts (2023-09 Template Schemas 3.6.2) - Align RFC 0005's ScriptTemplate let description, which granted embedded file symbols to environment scripts via example but never stated the step-script side - Exercise Task.File.* in the 3.6 let-host-context-symbols validation fixture (its header comment already claimed this coverage) and add a 7.3 runtime test mirroring the existing Env.File one Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jul 17, 2026
    5851dd3
  • "test: add conformance tests for environment template validation Environment templates share the format-string, EXPR, and FEATURE_BUNDLE_1 rules with job templates, but the suite had no coverage for them; implementations could skip those passes for environment templates entirely and still pass. - base/env_templates: undefined variable references in actions, variables, and embedded files must be rejected; Session.* and Env.File.* references are valid; Job.Name, let bindings, and complex expressions require EXPR. - EXPR/env_templates (new): let bindings valid/duplicate/undefined, complex expressions, Job.Name available, Step.Name not available, type errors caught at validation time. - FEATURE_BUNDLE_1/env_templates (new): endOfLine on embedded files requires the extension. - EXPR/job_templates: environment script let bindings and complex expressions in job/step environments require EXPR (previously only step-level let was covered). Also cover the @fmtstring stage rule (spec 7.4) for timeout and notifyPeriodInSeconds: they resolve at job creation, before any session exists, so Session.*, Env.File.*, and host functions like apply_path_mapping must be rejected in them even though the same references are valid in the surrounding action's command/args (@fmtstring[host]). Covered for step actions, environment actions in job templates, and environment templates. Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jul 14, 2026
    9b5340a
  • "rfc: Environment Wrap Actions (#130) * feat(RFC): Environment Wrap Actions Signed-off-by: David Leong <116610336+leongdl@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jul 13, 2026
    f1c2518
  • "test: Add JSON format test for unknown field rejection Ensures implementations reject unknown fields in JSON templates, mirroring the existing YAML test (1.1--unknown-extra-field.invalid.yaml). Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed May 12, 2026
    af6ea64
  • "feat: Add OPENJD_SESSION_WORKING_DIR eenvironment variable to spec Add documentation and conformance tests for the OPENJD_SESSION_WORKING_DIR environment variable, which exposes the Session working directory to nested subprocesses. Documentation changes: - New 'Session Environment Variables' section in How-Jobs-Are-Run.md with design rationale explaining why env vars are generally avoided (tooling parseability) and why this one is acceptable (same value as template var, CWD already points there) - Updated Session.WorkingDirectory description in How-Jobs-Are-Constructed.md to reference the corresponding environment variable Conformance tests: - Verify OPENJD_SESSION_WORKING_DIR is set and matches Session.WorkingDirectory - Verify the env var propagates to child processes Signed-off-by: Sean Tang <171081544+seant-aws@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Apr 24, 2026
    7f92abb
  • "fix: mark userInterface control as @optional, add conformance tests (#129) * Mark userInterface control as @optional, add conformance tests Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Apr 17, 2026
    0c7c77b
  • "fix: range_expr slicing returns range_expr for positive step Update the expression language spec and conformance test for §2.1.8: - Signature: range_expr slice returns range_expr | list[int] - Positive step (including default): returns range_expr - Negative step (reverse): returns list[int] - Add RREV test case for reverse range slice - Document the rationale (range_expr cannot represent descending order) fix(conformance): mark case-insensitive duplicate capability tests as invalid Per spec §3.3 constraints 3-4, no two amounts/attributes may have the same name. Per §3.3.1.1 and §3.3.2.1, capability names are not case-sensitive. Therefore amount.worker.vcpu and AMOUNT.WORKER.VCPU are duplicates and must be rejected. The test file comments already noted this ('capability names are case-insensitive, so these are duplicates') but the files were not named .invalid.yaml, so the conformance runner expected them to pass. Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Apr 13, 2026
    636c339
  • "fix(expr): Rename re_replace to re_sub to match Python's re.sub Our intent was to match Python's re functions generally, but we got re_replace instead of re_sub. This change renames that. Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Mar 30, 2026
    e2bcd1a
  • ""

    @client-software-ci client-software-ci committed Mar 24, 2026
    02c6bf5
  • "fix: specify that amount and attribute names must be unique (#110) Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Mar 6, 2026
    f5d7d91
  • "chore: Apply recent feedback bumping job param count to 200, add RFC 4 accepted date Signed-off-by: Mark <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jan 30, 2026
    02e0555
  • "feat(rfc): Write RFC 004 to propose a grab bag of extensions (#95) Signed-off-by: Cody Edwards <edwards@amazon.com>"

    @client-software-ci client-software-ci committed Jan 9, 2026
    68cdc2a
  • "docs: Clarify a few details of task chunking Signed-off-by: cherie-chen <58997764+Cherie-Chen@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Jan 7, 2026
    1f4a0d3
  • "docs: REDACTED_ENV_VARS should be in the extensions list Signed-off-by: Mark Wiebe <399551+mwiebe@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Oct 29, 2025
    4b01af7
  • "fix: realpath on macos doesn't work with non-existent paths (#94) Signed-off-by: Morgan Epp <60796713+epmog@users.noreply.github.com>"

    @client-software-ci client-software-ci committed Oct 9, 2025
    14b621b
  • feat: Merge RFC 0003 into the 2023-09 template schema wiki Signed-off-by: Brian Axelson <86568017+baxeaz@users.noreply.github.com>

    @client-software-ci client-software-ci committed May 15, 2025
    a630d06
  • chore: Change to make publish to wiki run with " in message Signed-off-by: Mark Wiebe <399551+mwiebe@users.noreply.github.com>

    @client-software-ci client-software-ci committed Mar 7, 2025
    fd18a8e
  • docs: Clarify a few details of task chunking (#73) * In a step parameter space, only one task parameter can be chunked. This was explained in the RFC rationale, but not made explicit in the specification language. * The minimum value of defaultTaskCount is 1. * The minimum value of targetRuntimeSeconds is 0, and the value 0 is equivalent to not specifying a value. Signed-off-by: Mark Wiebe <399551+mwiebe@users.noreply.github.com>

    @client-software-ci client-software-ci committed Feb 24, 2025
    112d6cc
  • fix!: amend default timeout for environment exit actions (#72) Signed-off-by: Josh Usiskin <56369778+jusiskin@users.noreply.github.com>

    @client-software-ci client-software-ci committed Feb 19, 2025
    7cd7647
  • feat: Merge RFC 0001 into the 2023-09 template schema wiki (#65) Signed-off-by: Mark Wiebe <399551+mwiebe@users.noreply.github.com>

    @client-software-ci client-software-ci committed Jan 30, 2025
    1556805
  • feat: Merge RFC 0002 into the 2023-09 template schema wiki (#64) Signed-off-by: Mark Wiebe <399551+mwiebe@users.noreply.github.com>

    @client-software-ci client-software-ci committed Jan 29, 2025
    b2d29e0
  • fix: Correct bash strict mode syntax (#63) Signed-off-by: Mark Wiebe <399551+mwiebe@users.noreply.github.com>

    @client-software-ci client-software-ci committed Jan 29, 2025
    f2635df