@agentsfleet/orly 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -78,7 +78,7 @@ TypeSafe's Jev model supplies runtime advice through explicit `orly judge` reque
78
78
 
79
79
  See [releases](https://github.com/agentsfleet/orly/releases) for published versions.
80
80
  The install commands below fetch the published package.
81
- The release workflow publishes 0.14.0 after its version change merges to `main`.
81
+ The release workflow publishes 0.14.2 after its version change merges to `main`.
82
82
 
83
83
  ---
84
84
 
package/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.2 — 2026-10-15
4
+
5
+ The release inventory reads npm 12's pack output, and the API and logging guides cite agentsfleet's current module paths.
6
+
7
+ - **npm 12** — `npm pack --dry-run --json` now prints one object keyed by package name instead of an array; the release inventory reads both, so `make audit` passes on npm 12.
8
+ - **Guide citations** — the REST API and logging guides cite agentsfleet's `x/mod.rs` module paths, and request parsing points at `fleet/message_steer/mod.rs`.
9
+
10
+ ## 0.14.1 — 2026-10-11
11
+
12
+ The logging standard names the field for a second failure's code.
13
+
14
+ - **Role-prefixed codes** — §5 defines `cause_error_code`, `rollback_error_code` and `config_error_code`, and the `<role>_error_code` shape for new roles.
15
+ - **Rust binding** — §8A points a record that reports a second failure at §5.
16
+
3
17
  ## 0.14.0 — 2026-10-08
4
18
 
5
19
  Retained TypeSafe Jev measurements now carry per-attempt explanations and explicit adoption limits.
@@ -37,7 +37,7 @@ Documented honestly, not aspirationally. Pre-M62 baseline (the fix-pass converge
37
37
 
38
38
  - The named module `log` (source: `src/lib/logging/mod.zig`) exposes `scoped(.tag)` returning a logger struct with `.err` / `.warn` / `.info` / `.debug` methods. M62 removed the older free-function helpers (`logErr` / `logErrWithHint` / `logWarnErr`) — there is no compat shim.
39
39
  - TypeScript (`cli/src/**`) calls `console.log`/`console.error` directly. No structure. No scope. No severity beyond err vs out.
40
- - Error-code embedding (`UZ-XXX-NNN`) appears on some `err` lines but not others. The registry (`rustd/crates/afd_core/src/error_code.rs`) is the source of truth, but enforcement is voluntary.
40
+ - Error-code embedding (`UZ-XXX-NNN`) appears on some `err` lines but not others. The registry (`rustd/crates/afd_core/src/error_code/mod.rs`) is the source of truth, but enforcement is voluntary.
41
41
  - No collector-friendly format. Logs are a mix of free-form English and ad-hoc `key={value}` fragments.
42
42
 
43
43
  The proposed standard below is what every new emit must conform to and what the fix-pass converges existing emits toward.
@@ -184,6 +184,21 @@ Embed the code as a struct field on the logger call: `log.err("event_name", .{ .
184
184
 
185
185
  System-level failures with no domain meaning (e.g. raw `EACCES` from a syscall before we attribute it to a tenant operation) emit without `error_code`. The follow-up rule: if a syscall failure surfaces to a user, it gets attributed to a registry code at the boundary.
186
186
 
187
+ **One record, two failures.** Some records report a decision about another
188
+ failure: a gate that fails open, a rollback, a refused configuration. The
189
+ record's `error_code` names the decision. The failure behind it keeps its own
190
+ registry code in a field named for its role:
191
+
192
+ | Field | Carries the code of |
193
+ |---|---|
194
+ | `cause_error_code` | the failure the decision answers |
195
+ | `rollback_error_code` | a failure in the recovery that followed |
196
+ | `config_error_code` | the configuration read that could not be used |
197
+
198
+ A new role takes the same `<role>_error_code` shape. `error_code` always names
199
+ the record's own code, so never overwrite it with the cause's code. Never
200
+ embed a code inside a reason sentence either; the field carries it.
201
+
187
202
  ## §6 · PII / secret discipline
188
203
 
189
204
  > [UNENFORCED → broad principle; no scan covers every log call site in the codebase for credential-shaped values]
@@ -324,12 +339,14 @@ arguments, never positional message formatting.
324
339
 
325
340
  > [JUDGMENT → RUST-STYLE]
326
341
 
327
- Every `warn` or `error` that maps to a registry code supplies
328
- `error_code = code` per §5. Hoist field expressions into locals before the macro
329
- call. The log bridge duplicates field expressions, and LLVM coverage
330
- instrumentation scores the dead copy; locals preserve evaluation and coverage
331
- behavior. A trailing string message is §3's optional `msg` and is always the
332
- last macro argument. Prefer fields alone when they already explain the event.
342
+ Every `warn` or `error` that maps to a registry code supplies `error_code =
343
+ code` per §5. A record that reports a second failure adds its
344
+ `<role>_error_code` per §5, for example `cause_error_code`. Hoist field
345
+ expressions into locals before the macro call. The log bridge duplicates field
346
+ expressions, and LLVM coverage instrumentation scores the dead copy; locals
347
+ preserve evaluation and coverage behavior. A trailing string message is §3's
348
+ optional `msg` and is always the last macro argument. Prefer fields alone when
349
+ they already explain the event.
333
350
 
334
351
  ```rust
335
352
  let code = error_code::INTERNAL_DB_QUERY.as_str();
@@ -347,7 +347,7 @@ documentation links. Handlers supply the code and a safe human-readable detail;
347
347
  they do not duplicate the registry's response shape.
348
348
 
349
349
  <!-- oracle-packs:start product.agentsfleet -->
350
- The `agentsfleet` registry is `rustd/crates/afd_core/src/error_code.rs` and its
350
+ The `agentsfleet` registry is `rustd/crates/afd_core/src/error_code/mod.rs` and its
351
351
  family modules. Its handlers use these refusal constructors:
352
352
 
353
353
  ```rust
@@ -626,12 +626,12 @@ When in doubt, mirror an existing handler:
626
626
  | Pattern | Look at |
627
627
  |---------|---------|
628
628
  | Read, edit and purge one resource | `rustd/crates/afd_api_tenant/src/handler/fleet/detail.rs` |
629
- | Request parsing and its refusal sentences | `rustd/crates/afd_api_tenant/src/handler/fleet/detail_request.rs` |
630
- | Keyset pagination | `rustd/crates/afd_api_tenant/src/handler/tenant/models.rs` |
631
- | Platform plane, operator-held | `rustd/crates/afd_api_operator/src/handler/admin/platform_keys.rs` |
632
- | Streaming (Server-Sent Events) | `rustd/crates/afd_api_tenant/src/handler/stream.rs` |
629
+ | Request parsing and its refusal sentences | `rustd/crates/afd_api_tenant/src/handler/fleet/message_steer/mod.rs` |
630
+ | Keyset pagination | `rustd/crates/afd_api_tenant/src/handler/tenant/models/mod.rs` |
631
+ | Platform plane, operator-held | `rustd/crates/afd_api_operator/src/handler/admin/platform_keys/mod.rs` |
632
+ | Streaming (Server-Sent Events) | `rustd/crates/afd_api_tenant/src/handler/stream/mod.rs` |
633
633
  | Signature-proven ingress | `rustd/crates/afd_api_ingress/src/handler/webhook/receive_route.rs` |
634
- | A runner speaking for itself | `rustd/crates/afd_api_runner/src/handler/runner/lease.rs` |
634
+ | A runner speaking for itself | `rustd/crates/afd_api_runner/src/handler/runner/lease/mod.rs` |
635
635
 
636
636
  <!-- oracle-packs:end -->
637
637
  ## §8 — Handler signature rule
@@ -6,7 +6,7 @@ regenerates this file and fails on any difference. To update it, run
6
6
 
7
7
  | Rule document | enforced by | judged | acknowledged | classified | trigger |
8
8
  |---|---|--:|--:|--:|---|
9
- | `docs/LOGGING_STANDARD.md` | `LOG` → `logging.sh` | 10 | 13 | 28/28 | mechanical |
9
+ | `docs/LOGGING_STANDARD.md` | `LOG` → `logging.sh` | 10 | 13 | 30/30 | mechanical |
10
10
  | `docs/REST_API_DESIGN_GUIDELINES.md` | — | 0 | 0 | 0/67 | mechanical |
11
11
  | `docs/SCHEMA_CONVENTIONS.md` | — | 0 | 0 | 0/17 | mechanical |
12
12
  | `docs/DOCUMENTATION_RULES.md` | — | 0 | 0 | 0/22 | latent |
@@ -14,7 +14,7 @@ regenerates this file and fails on any difference. To update it, run
14
14
  | `docs/CHANGELOG_VOICE.md` | — | 0 | 0 | 0/3 | latent |
15
15
  | `docs/VERIFY_TIERS.md` | — | 0 | 0 | 0/4 | uncited |
16
16
  | `docs/greptile-learnings/RULES.md` | — | 0 | 0 | 0/115 | mechanical |
17
- | **corpus** | | | | **28/278** | |
17
+ | **corpus** | | | | **30/280** | |
18
18
 
19
19
  ## How to read this
20
20
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsfleet/orly",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Repository-scoped engineering harness: renders agent rules, materialises the gates that enforce them, and proves the PR boundary \u2014 for any coding agent.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -4,6 +4,7 @@ import { dirname, join } from "node:path";
4
4
 
5
5
  import { cleanupTemporaryDirectories, git, newRepository, ROOT } from "./gates_test_support";
6
6
  import { UNSCOPED_ENVIRONMENT } from "./git_env";
7
+ import { inventory, packEntries } from "../evals/release/inventory";
7
8
 
8
9
  const INVENTORY = "evals/release/inventory.json";
9
10
  const REVIEWED_RECORD = "evals/release/reviewed.json";
@@ -78,3 +79,17 @@ test("inventory and review records require an external snapshot binding", () =>
78
79
  expect(row.package).toBeFalse();
79
80
  }
80
81
  }, TEST_TIMEOUT_MS);
82
+
83
+ test("npm pack output is read in both the array and the keyed-object shape", () => {
84
+ const entry = { files: [{ path: "bin/orly" }, { path: "README.md" }] };
85
+ expect(packEntries(JSON.stringify([entry]))).toEqual([entry]);
86
+ expect(packEntries(JSON.stringify({ "@agentsfleet/orly": entry }))).toEqual([entry]);
87
+ });
88
+
89
+ test("the inventory of this checkout marks the package manifest as packed", () => {
90
+ const result = inventory();
91
+ const manifest = result.files.find((file) => file.path === "package.json");
92
+ expect(result.totals.packed).toBeGreaterThan(0);
93
+ expect(manifest?.package).toBe(true);
94
+ expect(result.files.filter((file) => file.package).length).toBe(result.totals.packed);
95
+ }, TEST_TIMEOUT_MS);