@agentsfleet/orly 0.9.4 → 0.10.0

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/AGENTS.md CHANGED
@@ -144,7 +144,7 @@ Guards fire pre-hoc regardless of lifecycle stage. Override: `<GATE>: SKIPPED pe
144
144
  | write auth-flow / token-minting files | `write_auth` | `dispatch/write_auth.md` — auth invariants; reads the product repo's `docs/AUTH.md` before · 🟣 delegated (product repo). |
145
145
  | write published docs / OpenAPI prose | `write_documentation` | `dispatch/write_documentation.md` → `docs/DOCUMENTATION_RULES.md` before narrower guides; page, fragment, API, changelog scopes differ · 🟣 delegated to repository pre-commit checks. |
146
146
  | write a changelog entry | `write_changelog` | `dispatch/write_changelog.md` — changelog voice (one headline, no marketing words, `**Bold lead-noun**` bullets, history append-only); reads `docs/CHANGELOG_VOICE.md` · 🤔 judgment-only. |
147
- | write/update a PR or MR body or its session notes | `write_pr_description` | `dispatch/write_pr_description.md` — append numbered `Session notes`, `Review`, and `Make`; measured fenced diagrams; review dispositions; commands with real output. |
147
+ | write/update a PR or MR body or its session notes | `write_pr_description` | `dispatch/write_pr_description.md` — append numbered `Session notes`, `Review`, and `Make`; measured fenced diagrams; visual evidence from the lane's own artifacts; review dispositions; commands with real output. |
148
148
  | claim "tests pass / ready / shipping" | `verify` | `dispatch/verify.md` — verification tiers (`make` canonical; package-scoped runners are **not** verification), done-message glyph format · 🤔 judgment-only, `VERIFY GATE: <target> skipped per environment constraint (reason: ...)` only when genuinely unrunnable. |
149
149
  | name a stream/channel/Redis namespace/queue/RPC/Postgres schema, or describe a flow | `name_architecture` | `dispatch/name_architecture.md` — architecture-consult discipline; grep relevant `docs/architecture/` (chat brainstorming counts) · **no override** — doc wins until reconciled. |
150
150
  | run a lifecycle stage (open→close a stream, worktree setup, milestone bootstrap) | `lifecycle` | `dispatch/lifecycle.md` — stage runbooks: CHORE(open/close) checklists, PLAN expansions, spec discipline, deferral format, pre-PR gates, LAND · 🤔 judgment-only. |
@@ -148,7 +148,7 @@ Guards fire pre-hoc regardless of lifecycle stage. Override: `<GATE>: SKIPPED pe
148
148
  | write auth-flow / token-minting files | `write_auth` | `dispatch/write_auth.md` — auth invariants; reads the product repo's `docs/AUTH.md` before · 🟣 delegated (product repo). | <!-- oracle-packs:domain.auth -->
149
149
  | write published docs / OpenAPI prose | `write_documentation` | `dispatch/write_documentation.md` → `docs/DOCUMENTATION_RULES.md` before narrower guides; page, fragment, API, changelog scopes differ · 🟣 delegated to repository pre-commit checks. | <!-- oracle-packs:domain.documentation -->
150
150
  | write a changelog entry | `write_changelog` | `dispatch/write_changelog.md` — changelog voice (one headline, no marketing words, `**Bold lead-noun**` bullets, history append-only); reads `docs/CHANGELOG_VOICE.md` · 🤔 judgment-only. | <!-- oracle-packs:domain.changelog -->
151
- | write/update a PR or MR body or its session notes | `write_pr_description` | `dispatch/write_pr_description.md` — append numbered `Session notes`, `Review`, and `Make`; measured fenced diagrams; review dispositions; commands with real output. | <!-- oracle-packs:universal.authoring -->
151
+ | write/update a PR or MR body or its session notes | `write_pr_description` | `dispatch/write_pr_description.md` — append numbered `Session notes`, `Review`, and `Make`; measured fenced diagrams; visual evidence from the lane's own artifacts; review dispositions; commands with real output. | <!-- oracle-packs:universal.authoring -->
152
152
  | claim "tests pass / ready / shipping" | `verify` | `dispatch/verify.md` — verification tiers (`make` canonical; package-scoped runners are **not** verification), done-message glyph format · 🤔 judgment-only, `VERIFY GATE: <target> skipped per environment constraint (reason: ...)` only when genuinely unrunnable. | <!-- oracle-packs:product.agentsfleet -->
153
153
  | name a stream/channel/Redis namespace/queue/RPC/Postgres schema, or describe a flow | `name_architecture` | `dispatch/name_architecture.md` — architecture-consult discipline; grep relevant `docs/architecture/` (chat brainstorming counts) · **no override** — doc wins until reconciled. | <!-- oracle-packs:universal.authoring -->
154
154
  | run a lifecycle stage (open→close a stream, worktree setup, milestone bootstrap) | `lifecycle` | `dispatch/lifecycle.md` — stage runbooks: CHORE(open/close) checklists, PLAN expansions, spec discipline, deferral format, pre-PR gates, LAND · 🤔 judgment-only. |
@@ -84,6 +84,37 @@ their numbers:
84
84
  0.003-0.005ms 0.1ms 1.0ms 12-21ms
85
85
  ```
86
86
 
87
+ ## Visual evidence
88
+
89
+ A change to a surface a person looks at, or a failure a picture explains faster
90
+ than a paragraph, carries the picture. A reviewer who can see the wall, the
91
+ dialog or the red run decides in seconds what a description makes them
92
+ reconstruct.
93
+
94
+ **Take it from what already ran, not from a staged pose.** A lane that failed
95
+ has already produced the image: `gh run download <id> -n <artifact>` yields
96
+ Playwright's `test-failed-*.png`, its `trace.zip` and its `error-context.md`.
97
+ Those are measured evidence of the state under review. A browser driven by hand
98
+ is the fallback, for a surface no lane photographs.
99
+
100
+ **Screenshot the claim, not the neighbourhood.** One image per assertion, and
101
+ the assertion named in the caption — "one tile, not two" beats "the fleets
102
+ page". Never crop a failure out of a frame that contained it.
103
+
104
+ **Attaching is the author's step, and say so rather than pretending.** No forge
105
+ accepts an image upload to a pull-request body over its command-line interface;
106
+ `gh` and `glab` both have no such call. So the agent hands the file to the
107
+ person and the person drags it in. What the agent MUST do in the body is make
108
+ the evidence retrievable without the image: name the run id, the artifact and
109
+ the path inside it, and quote the decisive line. A body that says
110
+ `error-context.md:27 records unexpected value "hidden"` survives a screenshot
111
+ nobody attached; a body that says "see screenshot" does not.
112
+
113
+ **A before/after belongs in a fence, not in two images**, when the difference is
114
+ countable — the diagram rules above already cover it, and a diagram diffs
115
+ better than a pair of pictures. Use images for what only rendering shows:
116
+ alignment, spacing, contrast, what a person actually sees.
117
+
87
118
  ## Review
88
119
 
89
120
  Lead with the review result. Record every finding with P0, P1, or P2 severity,
@@ -142,6 +173,11 @@ a green pipeline.
142
173
  <Useful measured diagram, at most 78 columns.>
143
174
  ```
144
175
 
176
+ <Visual evidence, when a surface changed or a picture explains a failure:
177
+ each image named with the assertion it carries and with the run, artifact and
178
+ path it came from, plus the decisive line quoted so the claim survives an
179
+ image nobody attached.>
180
+
145
181
  ## Review
146
182
 
147
183
  <P0/P1/P2 entries with dispositions, No findings., or not-run reason.>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentsfleet/orly",
3
- "version": "0.9.4",
3
+ "version": "0.10.0",
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",
package/registry.json CHANGED
@@ -296,10 +296,6 @@
296
296
  "product.agentsfleet": {
297
297
  "extensions": [],
298
298
  "managed_files": [
299
- {
300
- "source": "audits/cross-tier-rates.sh",
301
- "target": "audits/cross-tier-rates.sh"
302
- },
303
299
  {
304
300
  "source": "audits/design-tokens.sh",
305
301
  "target": "audits/design-tokens.sh"
@@ -1,105 +0,0 @@
1
- #!/usr/bin/env bash
2
- # cross-tier-rates.sh — pin numeric parity of the rate constants
3
- # across the daemon + three TypeScript surfaces.
4
- #
5
- # RULE UFS extension. The shipped billing surface depends on these constants
6
- # having identical numeric values everywhere they appear:
7
- #
8
- # RUN_NANOS_PER_SEC — per-second run rate (both postures) in nanos
9
- #
10
- # Two free-trial constants were pinned here and are both gone. FREE_TRIAL_END_MS
11
- # went when the boundary moved onto the tenant row; FREE_TRIAL_STAGE_NANOS went
12
- # when the trial mechanism was removed outright, because a rate that could
13
- # silently price a metered slice to zero was worth deleting rather than
14
- # guarding. The free allowance is wallet credit now — a balance, not a rate —
15
- # so there is no cross-tier number to pin for it.
16
- #
17
- # Files (one definition site per constant per file):
18
- #
19
- # rustd/crates/afd_billing/src/nanos.rs — server enforces the charge
20
- # ui/packages/website/src/lib/rates.ts — pricing page display
21
- # ui/packages/app/lib/types.ts — dashboard display
22
- # cli/src/constants/billing.ts — `agentsfleet doctor --json` billing block
23
- #
24
- # A drift between any two = a billing-display lie or a server-vs-CLI disagreement.
25
- # The daemon is the source of truth (server enforces); the three TS surfaces echo it.
26
- #
27
- # Fires in: make harness-verify, make harness-verify-all.
28
- # Exits 0 clean, 1 on any drift.
29
-
30
- set -euo pipefail
31
-
32
- ROOT="$(git rev-parse --show-toplevel)"
33
- cd "$ROOT"
34
-
35
- readonly NAMES=(
36
- RUN_NANOS_PER_SEC
37
- )
38
-
39
- readonly FILES=(
40
- rustd/crates/afd_billing/src/nanos.rs
41
- ui/packages/website/src/lib/rates.ts
42
- ui/packages/app/lib/types.ts
43
- cli/src/constants/billing.ts
44
- )
45
-
46
- # Extract the numeric value bound to `name` in `file`. Matches definition
47
- # sites only — `^(pub |export )?const NAME` — not usages elsewhere in the
48
- # file. Normalises: strips underscores (Zig `1_000_000`, TS `1_000_000`),
49
- # strips the bigint `n` suffix (TS `1_000_000n`), trims whitespace.
50
- extract_value() {
51
- local file="$1" name="$2"
52
- grep -E "^[[:space:]]*(pub |export )?const ${name}\\b" "$file" 2>/dev/null \
53
- | head -1 \
54
- | sed -E "s|.*=[[:space:]]*||; s|[;,].*||; s|//.*||; s|[[:space:]_n]||g"
55
- }
56
-
57
- FAIL=0
58
- violations=()
59
-
60
- printf "audit-cross-tier-rates: pinning %d constants across %d files\n" \
61
- "${#NAMES[@]}" "${#FILES[@]}"
62
-
63
- for name in "${NAMES[@]}"; do
64
- expected=""
65
- expected_file=""
66
- for file in "${FILES[@]}"; do
67
- if [[ ! -f "$file" ]]; then
68
- violations+=("MISSING_FILE: $file")
69
- FAIL=1
70
- continue
71
- fi
72
- val="$(extract_value "$file" "$name")"
73
- if [[ -z "$val" ]]; then
74
- violations+=("MISSING_CONST: $name not defined in $file")
75
- FAIL=1
76
- continue
77
- fi
78
- if [[ -z "$expected" ]]; then
79
- expected="$val"
80
- expected_file="$file"
81
- continue
82
- fi
83
- if [[ "$val" != "$expected" ]]; then
84
- violations+=("DRIFT: $name = $val in $file vs $expected in $expected_file")
85
- FAIL=1
86
- fi
87
- done
88
- if [[ -n "$expected" ]]; then
89
- printf " OK %-26s = %s\n" "$name" "$expected"
90
- fi
91
- done
92
-
93
- if [[ $FAIL -ne 0 ]]; then
94
- printf "\nFAIL: cross-tier rate drift detected:\n" >&2
95
- for v in "${violations[@]}"; do
96
- printf " %s\n" "$v" >&2
97
- done
98
- printf "\nFix: align all four files on the canonical Zig value\n" >&2
99
- printf " (rustd/crates/afd_billing/src/nanos.rs is the server-side enforcer).\n" >&2
100
- exit 1
101
- fi
102
-
103
- printf "OK: all %d rate constants pin across %d files\n" \
104
- "${#NAMES[@]}" "${#FILES[@]}"
105
- exit 0