@agentsfleet/orly 0.14.1 → 0.14.3

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.1 after its version change merges to `main`.
81
+ The release workflow publishes 0.14.3 after its version change merges to `main`.
82
82
 
83
83
  ---
84
84
 
@@ -313,6 +313,8 @@ The TypeScript-relevant gate cards (`ui-substitution`, `design-token`) dissolve
313
313
 
314
314
  The design-system package (`ui/packages/design-system/src/index.ts` exports — `Section`, `Card`, `Badge`, `Button`, `Input`, `Dialog`, `Pagination`, `EmptyState`, `Tooltip`, `List`/`ListItem`, `WakePulse`, `Terminal`, `InstallBlock`, etc.) is the source of truth for visual primitives. Raw HTML in either dashboard or marketing files drifts from those tokens silently.
315
315
 
316
+ **Record dates.** Label creation timestamps **Created** across tables and detail views. Other timestamps name their event: **Updated**, **Last used**, **Occurred**, **Expires**, or **Joined / invited**. Reuse shared app labels; avoid generic **Time** or **Date** headings. Render dates with the shared `Time` component.
317
+
316
318
  **Marketing-display typography — primitives now exist.** `<DisplayXL>` (marketing hero `<h1>`, `text-fluid-hero`) and `<DisplayLG>` (section heads `<h2>`, `text-fluid-display-lg`) ship from `@agentsfleet/design-system` and compose `font-mono` + the fluid text/leading/tracking tokens internally. Use them on marketing-display surfaces. Raw `<h1>+utilities` is no longer the carve-out — UI GATE blocks it. The dashboard's `<PageTitle>` (`text-heading ≈ 18px`) remains the correct primitive for app surfaces.
317
319
 
318
320
  This gate enforces "use the primitive when one exists" without enumerating the primitives in this rule (so the rule scales as the design-system grows).
package/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.3 — 2026-10-15
4
+
5
+ The REST API guide carries agentsfleet's conversation and reviewed-setup exceptions, and the TypeScript rules name how timestamps are labelled.
6
+
7
+ - **Conversation sends** — fleet and draft `/messages` sends take one UUIDv7 `operation_id` in the body and refuse an `Idempotency-Key` header; replay, conflict and `202` answers are defined.
8
+ - **Stale reviews** — a reviewed setup mutation refused with `409` also returns the current `review_digest` and `current_state`.
9
+ - **Record dates** — creation timestamps are labelled **Created**; other timestamps name their event.
10
+
11
+ ## 0.14.2 — 2026-10-15
12
+
13
+ The release inventory reads npm 12's pack output, and the API and logging guides cite agentsfleet's current module paths.
14
+
15
+ - **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.
16
+ - **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`.
17
+
3
18
  ## 0.14.1 — 2026-10-11
4
19
 
5
20
  The logging standard names the field for a second failure's code.
@@ -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.
@@ -142,7 +142,19 @@ If the parent ID is in the path, never repeat it in the body.
142
142
 
143
143
  **PATCH idempotency guarantee** — PATCH MUST be idempotent unless the spec's "Failure Modes" section explicitly declares otherwise with a reason. Idempotent PATCH means: issuing the same body twice in succession produces identical row state and identical 200 responses. A negative test that issues the same PATCH twice and asserts equality is required (§10).
144
144
 
145
- **Idempotency keys for non-idempotent POSTs.** Any POST that creates a billable, externally-visible, or side-effecting resource MUST accept an `Idempotency-Key` request header (UUIDv7 from the client). The server stores `(workspace_id, key) → response` for at least 24 hours and replays the prior response on duplicate. Endpoints exempt: pure RPC reads, internal-only POSTs. List which endpoints honor the key in the OpenAPI description.
145
+ **Idempotency keys for non-idempotent POSTs.** Any POST that creates a billable, externally-visible, or side-effecting resource MUST accept an `Idempotency-Key` request header (UUIDv7 from the client), except the conversation rules below. The server stores `(workspace_id, key) → response` for at least 24 hours and replays the prior response on duplicate. Endpoints exempt: pure RPC reads, internal-only POSTs. List which endpoints honor the key in the OpenAPI description.
146
+
147
+ **Owner-approved conversation exception.** Fleet and creator-private draft
148
+ `/messages` sends require one UUIDv7 `operation_id` in the JSON body. They MUST
149
+ reject an `Idempotency-Key` header. Draft creation uses the same body key and
150
+ atomically records its optional first message. Authorization and lifecycle
151
+ checks apply before replay. The same key, normalized message and actor recover
152
+ the accepted message; changed content or actor conflicts. Sends return
153
+ `202 {status, sequence, replayed}` for drafts, or the fleet's accepted event
154
+ receipt, with `Location` pointing to that conversation's messages collection.
155
+ Pending state, answers and usage are read through messages and its authorized
156
+ live stream. These resources create neither a public turn-status resource nor
157
+ a generic operation. Creator-private text never appears in workspace streams.
146
158
 
147
159
  **Owner-approved workspace exception.** `POST /v1/workspaces` accepts no replay
148
160
  key. It requires a tenant-unique name and performs one tenant-scoped insert with
@@ -156,7 +168,7 @@ generalize this exception to other POST endpoints.
156
168
 
157
169
  ### Long-running operations
158
170
 
159
- Endpoints that can't complete inside the request window MUST follow this convention — no per-endpoint reinvention:
171
+ Endpoints that can't complete inside the request window MUST follow this convention, except conversation acceptance described above:
160
172
 
161
173
  1. The kicking POST returns `202 Accepted` with `Location: /v1/operations/{operation_id}` and a body containing `operation_id` and `status: "pending"`.
162
174
  2. `GET /v1/operations/{operation_id}` returns:
@@ -347,7 +359,7 @@ documentation links. Handlers supply the code and a safe human-readable detail;
347
359
  they do not duplicate the registry's response shape.
348
360
 
349
361
  <!-- oracle-packs:start product.agentsfleet -->
350
- The `agentsfleet` registry is `rustd/crates/afd_core/src/error_code.rs` and its
362
+ The `agentsfleet` registry is `rustd/crates/afd_core/src/error_code/mod.rs` and its
351
363
  family modules. Its handlers use these refusal constructors:
352
364
 
353
365
  ```rust
@@ -434,6 +446,14 @@ the caller gets the registry's 500 and no internal detail.
434
446
  - `409` MUST include `current_state: <string>` naming the state that forbade the transition (e.g. `"current_state": "approved"` when the caller tried to approve an already-approved gate).
435
447
  - `412` MUST include `etag: <string>` carrying the resource's current ETag so the client can refetch and retry.
436
448
 
449
+ <!-- oracle-packs:start product.agentsfleet -->
450
+ Reviewed setup mutations in `agentsfleet` additionally return `review_digest`
451
+ on a stale-review `409`. The daemon computes this opaque digest from the current
452
+ effective setup and access/model resolution versions. The response also carries
453
+ `current_state`; clients fetch the current review before submitting again.
454
+ This extension grants no setup or runtime authority.
455
+ <!-- oracle-packs:end -->
456
+
437
457
  Don't invent other extensions without amending this doc.
438
458
 
439
459
  ---
@@ -626,12 +646,12 @@ When in doubt, mirror an existing handler:
626
646
  | Pattern | Look at |
627
647
  |---------|---------|
628
648
  | 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` |
649
+ | Request parsing and its refusal sentences | `rustd/crates/afd_api_tenant/src/handler/fleet/message_steer/mod.rs` |
650
+ | Keyset pagination | `rustd/crates/afd_api_tenant/src/handler/tenant/models/mod.rs` |
651
+ | Platform plane, operator-held | `rustd/crates/afd_api_operator/src/handler/admin/platform_keys/mod.rs` |
652
+ | Streaming (Server-Sent Events) | `rustd/crates/afd_api_tenant/src/handler/stream/mod.rs` |
633
653
  | 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` |
654
+ | A runner speaking for itself | `rustd/crates/afd_api_runner/src/handler/runner/lease/mod.rs` |
635
655
 
636
656
  <!-- oracle-packs:end -->
637
657
  ## §8 — Handler signature rule
@@ -7,14 +7,14 @@ regenerates this file and fails on any difference. To update it, run
7
7
  | Rule document | enforced by | judged | acknowledged | classified | trigger |
8
8
  |---|---|--:|--:|--:|---|
9
9
  | `docs/LOGGING_STANDARD.md` | `LOG` → `logging.sh` | 10 | 13 | 30/30 | mechanical |
10
- | `docs/REST_API_DESIGN_GUIDELINES.md` | — | 0 | 0 | 0/67 | mechanical |
10
+ | `docs/REST_API_DESIGN_GUIDELINES.md` | — | 0 | 0 | 0/69 | mechanical |
11
11
  | `docs/SCHEMA_CONVENTIONS.md` | — | 0 | 0 | 0/17 | mechanical |
12
12
  | `docs/DOCUMENTATION_RULES.md` | — | 0 | 0 | 0/22 | latent |
13
13
  | `docs/LIFECYCLE_PATTERNS.md` | — | 0 | 0 | 0/22 | mechanical |
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** | | | | **30/280** | |
17
+ | **corpus** | | | | **30/282** | |
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.1",
3
+ "version": "0.14.3",
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);