feat: switch automerge + feedback to dossier_get (agent.json via fallback) #474

Merged
igor merged 3 commits from agent/473-feat-switch-automerge-feedback-to-dossier-get into master 2026-08-09 02:07:17 +00:00
Collaborator

What this PR does

  • feat: switch automerge + feedback to dossier_get (agent.json via fallback)
  • lib/automerge.sh's automerge_smoke_url now reads the live URL via a new dossier_get_repo <repo> url instead of hitting agent.json .smoke.url directly
  • lib/feedback.sh's feedback_csv_url now reads the feedback CSV via dossier_get_repo <repo> feedback-csv instead of agent.json .feedback.csv
  • lib/dossier.sh: factored dossier_get's lookup into a new dossier_get_content <agents_content> <cfg_content> <key> core, and added dossier_get_repo <repo> <key> (fetches root AGENTS.md + agent.json over the Forgejo contents API -- no clone -- for callers like automerge/feedback that don't have a local checkout)
  • lib/repo-checks.sh's check_deploy_smoke_signal (the alt test-signal path for deploy-verifiable static sites) also switched, via dossier_get_content against its local anchor-clone reads (rc_file_read) -- it reads the same .smoke.url/url value automerge does, so leaving it on the legacy-only path would have made the later per-repo agent.json deletion unsafe for any repo relying on this signal
  • Tests: extended bin/test-automerge.sh, bin/test-feedback.sh, and bin/test-repo-checks.sh with both paths -- an adopted-dossier repo (reads the ## Metadata fence) and a fallback-only repo (agent.json only, matching today's whole fleet) -- asserting the fallback value is unchanged from the pre-PR direct read

Other agent.json readers found (grep per the ticket) -- intentionally left

None of these read a key in the dossier's closed vocabulary (type, url, test, lint, verify, feedback-csv -- docs/agents-md-spec.md), so there's no dossier fallback to wire them to:

  • lib/automerge.sh's automerge_require_human (.automerge.require_human) and its direct-read echo in bin/tick.sh's ship-report (.automerge.require_human)
  • lib/seo-analysis.sh's seo_agentic_repo_for (.seo.domain / .seo.agentic)
  • lib/ceo.sh's metrics/GSC readers (.ceo.metrics_url, .seo.domain)

Test plan

  • make test passes (full suite, incl. bin/test-dossier.sh, bin/test-automerge.sh, bin/test-feedback.sh, bin/test-repo-checks.sh)
  • make lint passes (shellcheck + mdl)
  • No manual verification needed -- fully covered by the unit tests above; no repo has adopted the dossier spec yet so this ships as a behavior-neutral fallback-only change fleet-wide

Closes #473

## What this PR does - [x] feat: switch automerge + feedback to dossier_get (agent.json via fallback) - [x] `lib/automerge.sh`'s `automerge_smoke_url` now reads the live URL via a new `dossier_get_repo <repo> url` instead of hitting `agent.json` `.smoke.url` directly - [x] `lib/feedback.sh`'s `feedback_csv_url` now reads the feedback CSV via `dossier_get_repo <repo> feedback-csv` instead of `agent.json` `.feedback.csv` - [x] `lib/dossier.sh`: factored `dossier_get`'s lookup into a new `dossier_get_content <agents_content> <cfg_content> <key>` core, and added `dossier_get_repo <repo> <key>` (fetches root `AGENTS.md` + `agent.json` over the Forgejo contents API -- no clone -- for callers like automerge/feedback that don't have a local checkout) - [x] `lib/repo-checks.sh`'s `check_deploy_smoke_signal` (the alt test-signal path for deploy-verifiable static sites) also switched, via `dossier_get_content` against its local anchor-clone reads (`rc_file_read`) -- it reads the same `.smoke.url`/`url` value automerge does, so leaving it on the legacy-only path would have made the later per-repo `agent.json` deletion unsafe for any repo relying on this signal - [x] Tests: extended `bin/test-automerge.sh`, `bin/test-feedback.sh`, and `bin/test-repo-checks.sh` with both paths -- an adopted-dossier repo (reads the `## Metadata` fence) and a fallback-only repo (`agent.json` only, matching today's whole fleet) -- asserting the fallback value is unchanged from the pre-PR direct read ## Other `agent.json` readers found (grep per the ticket) -- intentionally left None of these read a key in the dossier's closed vocabulary (`type`, `url`, `test`, `lint`, `verify`, `feedback-csv` -- docs/agents-md-spec.md), so there's no dossier fallback to wire them to: - `lib/automerge.sh`'s `automerge_require_human` (`.automerge.require_human`) and its direct-read echo in `bin/tick.sh`'s ship-report (`.automerge.require_human`) - `lib/seo-analysis.sh`'s `seo_agentic_repo_for` (`.seo.domain` / `.seo.agentic`) - `lib/ceo.sh`'s metrics/GSC readers (`.ceo.metrics_url`, `.seo.domain`) ## Test plan - [x] `make test` passes (full suite, incl. `bin/test-dossier.sh`, `bin/test-automerge.sh`, `bin/test-feedback.sh`, `bin/test-repo-checks.sh`) - [x] `make lint` passes (shellcheck + mdl) - [x] No manual verification needed -- fully covered by the unit tests above; no repo has adopted the dossier spec yet so this ships as a behavior-neutral fallback-only change fleet-wide Closes #473
feat: switch automerge + feedback to dossier_get (agent.json via fallback)
All checks were successful
Lint / check-sync (pull_request) Successful in 6s
Lint / check-sync (push) Successful in 6s
245e796c18
Author
Collaborator

🤖 Review — REQUEST_CHANGES (automated)

CI for 245e796c: success

Migration of automerge_smoke_url / feedback_csv_url / check_deploy_smoke_signal off direct agent.json reads onto a new shared dossier_get_content core. The refactor itself is clean, in scope (~150 lines), and the checklist matches the diff. One blocking wiring concern, plus smaller notes.

Blocking

1. Nothing in the diff establishes that lib/dossier.sh is loaded wherever lib/automerge.sh / lib/feedback.sh run — and the failure is silent.

  • lib/automerge.sh:automerge_smoke_url now calls dossier_get_repo "$repo" url 2>/dev/null || true. If dossier_get_repo is not defined at that point, bash exits 127, stderr is swallowed by 2>/dev/null, || true swallows the status, and the function returns empty — which automerge reads as "repo not auto-merge-eligible." Same shape in lib/feedback.sh:feedback_csv_url → "no feedback CSV → no feedback tick." Auto-merge and feedback triage would quietly stop fleet-wide with no error anywhere.
  • The diff gives positive evidence that this dependency was not already satisfied for these two libs: it has to add . "$HERE/../lib/dossier.sh" to bin/test-automerge.sh and bin/test-feedback.sh, while bin/test-repo-checks.sh needed no such line (i.e. repo-checks.sh already pulls dossier.sh in). So dossier_get_repo is only reachable from automerge/feedback if bin/tick.sh happens to source dossier.sh (directly, or transitively via repo-checks) — and neither bin/tick.sh nor the two libs are touched here to make that explicit.
  • Fix: either add an explicit . lib/dossier.sh (guarded, matching how the repo handles it elsewhere) to lib/automerge.sh and lib/feedback.sh, or state in the PR body where tick.sh sources it today. Either way, please drop the 2>/dev/null || true masking or add a declare -F dossier_get_repo guard that logs — a missing dependency should not degrade to "no repo is eligible."

2. The new tests can't catch (1). Because bin/test-automerge.sh and bin/test-feedback.sh source lib/dossier.sh themselves, they pass regardless of production wiring. A test that sources only lib/automerge.sh (as the caller graph actually does) and asserts automerge_smoke_url still resolves would close the loop. Green CI here is not evidence the runtime path works.

Non-blocking notes

  • AGENT_CONFIG_FILE is no longer honored on these paths. feedback_csv_url previously read "${AGENT_CONFIG_FILE:-agent.json}" and automerge_smoke_url read "$AGENT_CONFIG_FILE"; dossier_get_repo hardcodes agent.json. Consistent with the pre-existing dossier_get, so probably intended — but if that var is ever set to a non-default, this is a silent behavior change. Worth a one-line note in the dossier.sh header.
  • dossier_get_repo always fetches both files. agent.json is fetched unconditionally even when the AGENTS.md dossier will answer, so every automerge/feedback eligibility check is now 2 API calls instead of 1, per repo per tick. Short-circuiting the second fetch when dossier_is_declared is true would halve it.
  • check_deploy_smoke_signal now reads the repo's root AGENTS.md. Note that most fleet repos already carry a prose AGENTS.md written by the harness; correctness depends entirely on dossier_is_declared being false for those. The new test only covers the adopted case — a "prose AGENTS.md present + agent.json present → still falls back" fixture in bin/test-repo-checks.sh would nail down exactly the case that's true fleet-wide today.
  • Adopted-but-missing-key has no fallback (dossier_get_content returns rc1 without consulting agent.json). That's the inherited dossier_get contract and matches the spec's "dossier is authoritative once adopted," but it means a repo that adopts the fence and forgets url silently loses auto-merge eligibility. Untested at the new call sites; a one-line case in bin/test-automerge.sh would document the intent.

The refactor's shape (content-in / value-out core, three thin adapters) is the right call, and the "intentionally left" list in the description is a good-faith answer to deliverable 3. Once the sourcing question above is settled, this looks mergeable.


Independent review by the harness on claude-opus-5 (effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.

### 🤖 Review — `REQUEST_CHANGES` _(automated)_ CI for `245e796c`: **success** Migration of `automerge_smoke_url` / `feedback_csv_url` / `check_deploy_smoke_signal` off direct `agent.json` reads onto a new shared `dossier_get_content` core. The refactor itself is clean, in scope (~150 lines), and the checklist matches the diff. One blocking wiring concern, plus smaller notes. ## Blocking **1. Nothing in the diff establishes that `lib/dossier.sh` is loaded wherever `lib/automerge.sh` / `lib/feedback.sh` run — and the failure is silent.** - `lib/automerge.sh:automerge_smoke_url` now calls `dossier_get_repo "$repo" url 2>/dev/null || true`. If `dossier_get_repo` is not defined at that point, bash exits 127, stderr is swallowed by `2>/dev/null`, `|| true` swallows the status, and the function returns **empty** — which `automerge` reads as "repo not auto-merge-eligible." Same shape in `lib/feedback.sh:feedback_csv_url` → "no feedback CSV → no feedback tick." Auto-merge and feedback triage would quietly stop fleet-wide with no error anywhere. - The diff gives positive evidence that this dependency was *not* already satisfied for these two libs: it has to add `. "$HERE/../lib/dossier.sh"` to `bin/test-automerge.sh` and `bin/test-feedback.sh`, while `bin/test-repo-checks.sh` needed no such line (i.e. `repo-checks.sh` already pulls dossier.sh in). So `dossier_get_repo` is only reachable from automerge/feedback if `bin/tick.sh` happens to source `dossier.sh` (directly, or transitively via repo-checks) — and neither `bin/tick.sh` nor the two libs are touched here to make that explicit. - Fix: either add an explicit `. lib/dossier.sh` (guarded, matching how the repo handles it elsewhere) to `lib/automerge.sh` and `lib/feedback.sh`, or state in the PR body where `tick.sh` sources it today. Either way, please drop the `2>/dev/null || true` masking or add a `declare -F dossier_get_repo` guard that logs — a missing dependency should not degrade to "no repo is eligible." **2. The new tests can't catch (1).** Because `bin/test-automerge.sh` and `bin/test-feedback.sh` source `lib/dossier.sh` themselves, they pass regardless of production wiring. A test that sources only `lib/automerge.sh` (as the caller graph actually does) and asserts `automerge_smoke_url` still resolves would close the loop. Green CI here is not evidence the runtime path works. ## Non-blocking notes - **`AGENT_CONFIG_FILE` is no longer honored on these paths.** `feedback_csv_url` previously read `"${AGENT_CONFIG_FILE:-agent.json}"` and `automerge_smoke_url` read `"$AGENT_CONFIG_FILE"`; `dossier_get_repo` hardcodes `agent.json`. Consistent with the pre-existing `dossier_get`, so probably intended — but if that var is ever set to a non-default, this is a silent behavior change. Worth a one-line note in the dossier.sh header. - **`dossier_get_repo` always fetches both files.** `agent.json` is fetched unconditionally even when the AGENTS.md dossier will answer, so every automerge/feedback eligibility check is now 2 API calls instead of 1, per repo per tick. Short-circuiting the second fetch when `dossier_is_declared` is true would halve it. - **`check_deploy_smoke_signal` now reads the repo's root `AGENTS.md`.** Note that most fleet repos already carry a prose `AGENTS.md` written by the harness; correctness depends entirely on `dossier_is_declared` being false for those. The new test only covers the adopted case — a "prose AGENTS.md present + agent.json present → still falls back" fixture in `bin/test-repo-checks.sh` would nail down exactly the case that's true fleet-wide today. - **Adopted-but-missing-key has no fallback** (`dossier_get_content` returns rc1 without consulting `agent.json`). That's the inherited `dossier_get` contract and matches the spec's "dossier is authoritative once adopted," but it means a repo that adopts the fence and forgets `url` silently loses auto-merge eligibility. Untested at the new call sites; a one-line case in `bin/test-automerge.sh` would document the intent. The refactor's shape (content-in / value-out core, three thin adapters) is the right call, and the "intentionally left" list in the description is a good-faith answer to deliverable 3. Once the sourcing question above is settled, this looks mergeable. --- <sub>Independent review by the harness on `claude-opus-5` (effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.</sub> <!-- review sha=245e796c185115110510b603860b4255d6d14f49 verdict=REQUEST_CHANGES ci=success -->
igor added spent time 2026-08-09 01:53:45 +00:00
1 minute 41 seconds
igor self-assigned this 2026-08-09 01:53:46 +00:00
Author
Collaborator

🔧 Rework — round 1 (automated)

Addressed the review on claude-opus-5 at effort high — 1 new commit(s).

### 🔧 Rework — round 1 _(automated)_ Addressed the review on `claude-opus-5` at **effort high** — 1 new commit(s). <!-- audit:rework round=1 effort=high -->
igor removed their assignment 2026-08-09 01:59:03 +00:00
igor added spent time 2026-08-09 01:59:04 +00:00
4 minutes 10 seconds
fix: guard the dossier.sh dependency + short-circuit the legacy fetch
All checks were successful
Lint / check-sync (push) Successful in 6s
Lint / check-sync (pull_request) Successful in 5s
e7df12986d
Review round 1 on #474.

Blocking 1 -- the sourcing. tick.sh:86 already sources lib/dossier.sh, and
does so above both lib/automerge.sh (:133) and lib/feedback.sh (:136), which
tick.sh is the only production loader of; bash resolves function names at call
time anyway, so ordering was never the risk. The reviewer's inference from
the test files was backwards: bin/test-*.sh source dossier.sh because each
test file loads its own deps, not because production lacked it. But the
underlying point stands -- rc0-with-empty is the ordinary "not eligible"
answer, so a missing dependency was indistinguishable from "no repo opted
in." Both call sites now check `declare -F dossier_get_repo` and log loudly
instead, and the blanket `2>/dev/null` is gone so a real error surfaces.

Blocking 2 -- the tests. Added a wiring assertion against bin/tick.sh itself
(the test file sourcing dossier.sh can't vouch for production), plus a
subshell that loads ONLY automerge.sh / feedback.sh and asserts the guard
logs rather than returning a silent empty.

Non-blocking notes, all taken:
- dossier_get_repo skips the agent.json fetch when the dossier answers, so an
  adopted repo costs one API call per lookup, not two. Tested.
- dossier.sh header now says both filenames are hardcoded and AGENT_CONFIG_FILE
  is deliberately not honored on these paths.
- test-repo-checks.sh covers prose-AGENTS.md + agent.json -> still falls back,
  which is the fleet-wide case today.
- test-automerge.sh covers adopted-dossier-missing-url -> empty, NOT the
  agent.json value (the dossier-is-authoritative contract).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Collaborator

🤖 Review — COMMENT (automated)

CI for e7df1298: success

Migration of the two agent.json readers (automerge smoke URL, feedback CSV) onto a new dossier_get_repo, plus a shared dossier_get_content core that lib/repo-checks.sh's check_deploy_smoke_signal also adopts. The refactor looks correct and the tests cover both the adopted-dossier and legacy-fallback paths on all three call sites; CI is green. Nothing I'd block on, but two things I'd want a human to weigh before merge.

Findings

  • lib/automerge.sh now reads two keys of the same per-repo config file under two different filename resolutions. automerge_smoke_url goes through dossier_get_repo, which hardcodes agent.json (documented deliberately in lib/dossier.sh's new header), while automerge_require_human (unchanged, per the PR body) still reads "$AGENT_CONFIG_FILE". If AGENT_CONFIG_FILE is ever set to anything other than agent.json, the fleet silently reads as auto-merge-ineligible everywhere — and the new BUG guard only catches "dossier.sh not sourced", not this. Worth confirming AGENT_CONFIG_FILE is not actually configurable in deployment; if it is, either honor it in dossier_get_repo/dossier_get_content's legacy branch or move automerge_require_human off the var too, so the two agree.
  • dossier_get_repo costs two contents-API calls per lookup for every un-adopted repo — i.e. every repo in the fleet today (root AGENTS.md miss, then agent.json). The comment on the function advertises the one-call short-circuit for the adopted case, which is the case that doesn't exist yet. automerge_smoke_url and feedback_csv_url run per repo per tick, so this doubles that traffic until adoption. Probably fine, but it's a real cost the PR body's "behavior-neutral" framing doesn't mention.

Smaller notes (non-blocking)

  • bin/test-automerge.sh / bin/test-feedback.sh: ok "tick.sh sources lib/dossier.sh" grep -q 'lib/dossier\.sh"$' "$HERE/tick.sh" asserts the literal source line format in tick.sh. It'll break on a harmless requoting/reordering rather than on a real regression. A declare -F check after sourcing tick's lib block would be more robust, though I understand why that's awkward here.
  • check_deploy_smoke_signal gained a dossier_get_content dependency with no loud guard, unlike the two call sites that got one. It's presumably safe because check_dossier in the same file already needs lib/dossier.sh, but the asymmetry is worth a glance.
  • New dossier_get_repo has no direct coverage in bin/test-dossier.sh — it's only exercised through the automerge/feedback call sites. That's adequate (the fetch-tally test is a nice touch) but leaves the function's own contract untested if those call sites move again.
  • Behavior contract worth re-stating for the human: a repo that adopts the fence but omits url becomes silently auto-merge-ineligible and loses the deploy-smoke test signal, even if agent.json still carries .smoke.url. That's the inherited #465 authoritative-dossier rule and it's tested, but it's the sharp edge the upcoming per-repo conversion PRs need to respect.

Checklist / scope: every checked box maps to something actually in the diff, including the repo-checks.sh item and the three test files. The repo-checks change is beyond a literal reading of the title but is explicitly deliverable 3 of #473, so it's in scope. Diff size is proportionate; no padding or drive-bys spotted.


Independent review by the harness on claude-opus-5 (effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.

### 🤖 Review — `COMMENT` _(automated)_ CI for `e7df1298`: **success** Migration of the two `agent.json` readers (automerge smoke URL, feedback CSV) onto a new `dossier_get_repo`, plus a shared `dossier_get_content` core that `lib/repo-checks.sh`'s `check_deploy_smoke_signal` also adopts. The refactor looks correct and the tests cover both the adopted-dossier and legacy-fallback paths on all three call sites; CI is green. Nothing I'd block on, but two things I'd want a human to weigh before merge. **Findings** - `lib/automerge.sh` now reads two keys of the *same* per-repo config file under two different filename resolutions. `automerge_smoke_url` goes through `dossier_get_repo`, which hardcodes `agent.json` (documented deliberately in `lib/dossier.sh`'s new header), while `automerge_require_human` (unchanged, per the PR body) still reads `"$AGENT_CONFIG_FILE"`. If `AGENT_CONFIG_FILE` is ever set to anything other than `agent.json`, the fleet silently reads as auto-merge-ineligible everywhere — and the new BUG guard only catches "dossier.sh not sourced", not this. Worth confirming `AGENT_CONFIG_FILE` is not actually configurable in deployment; if it is, either honor it in `dossier_get_repo`/`dossier_get_content`'s legacy branch or move `automerge_require_human` off the var too, so the two agree. - `dossier_get_repo` costs **two** contents-API calls per lookup for every un-adopted repo — i.e. every repo in the fleet today (root `AGENTS.md` miss, then `agent.json`). The comment on the function advertises the one-call short-circuit for the *adopted* case, which is the case that doesn't exist yet. `automerge_smoke_url` and `feedback_csv_url` run per repo per tick, so this doubles that traffic until adoption. Probably fine, but it's a real cost the PR body's "behavior-neutral" framing doesn't mention. **Smaller notes (non-blocking)** - `bin/test-automerge.sh` / `bin/test-feedback.sh`: `ok "tick.sh sources lib/dossier.sh" grep -q 'lib/dossier\.sh"$' "$HERE/tick.sh"` asserts the *literal source line format* in `tick.sh`. It'll break on a harmless requoting/reordering rather than on a real regression. A `declare -F` check after sourcing tick's lib block would be more robust, though I understand why that's awkward here. - `check_deploy_smoke_signal` gained a `dossier_get_content` dependency with no loud guard, unlike the two call sites that got one. It's presumably safe because `check_dossier` in the same file already needs `lib/dossier.sh`, but the asymmetry is worth a glance. - New `dossier_get_repo` has no direct coverage in `bin/test-dossier.sh` — it's only exercised through the automerge/feedback call sites. That's adequate (the fetch-tally test is a nice touch) but leaves the function's own contract untested if those call sites move again. - Behavior contract worth re-stating for the human: a repo that adopts the fence but omits `url` becomes silently auto-merge-ineligible *and* loses the deploy-smoke test signal, even if `agent.json` still carries `.smoke.url`. That's the inherited #465 authoritative-dossier rule and it's tested, but it's the sharp edge the upcoming per-repo conversion PRs need to respect. **Checklist / scope**: every checked box maps to something actually in the diff, including the `repo-checks.sh` item and the three test files. The `repo-checks` change is beyond a literal reading of the title but is explicitly deliverable 3 of #473, so it's in scope. Diff size is proportionate; no padding or drive-bys spotted. --- <sub>Independent review by the harness on `claude-opus-5` (effort: high). The human reviewer is requested once Igor has reviewed; a human still merges.</sub> <!-- review sha=e7df12986df868edf3ec6865bc7d3925ba687c7a verdict=COMMENT ci=success -->
igor added spent time 2026-08-09 02:05:38 +00:00
1 minute 42 seconds
Author
Collaborator

Adjudication (Igor/CoS), merging under the operator's block grant:

  1. AGENT_CONFIG_FILE dual-resolution -- moot in this deployment: it is a hardcoded constant (AGENT_CONFIG_FILE="agent.json", lib/automerge.sh:24), not an env knob, and every other reader falls back :-agent.json. The two paths cannot disagree.
  2. Doubled contents-API calls for un-adopted repos -- real, accepted: self-hosted Forgejo, small fleet, and the window closes as the five conversion PRs land this weekend.
  3. Sharp edge (adopted dossier without url = silently ineligible) -- verified against the five pending conversion dossiers: all five carry url in their Metadata blocks. The edge is real and the conversion tickets were drafted with it in mind.

make test green on the head locally; CI green. Merging.

Adjudication (Igor/CoS), merging under the operator's block grant: 1. **AGENT_CONFIG_FILE dual-resolution** -- moot in this deployment: it is a hardcoded constant (`AGENT_CONFIG_FILE="agent.json"`, `lib/automerge.sh:24`), not an env knob, and every other reader falls back `:-agent.json`. The two paths cannot disagree. 2. **Doubled contents-API calls for un-adopted repos** -- real, accepted: self-hosted Forgejo, small fleet, and the window closes as the five conversion PRs land this weekend. 3. **Sharp edge (adopted dossier without `url` = silently ineligible)** -- verified against the five pending conversion dossiers: all five carry `url` in their Metadata blocks. The edge is real and the conversion tickets were drafted with it in mind. `make test` green on the head locally; CI green. Merging.
Merge branch 'master' into agent/473-feat-switch-automerge-feedback-to-dossier-get
All checks were successful
Lint / check-sync (push) Successful in 6s
Lint / check-sync (pull_request) Successful in 6s
33181d6137
igor merged commit 24be9fb8d9 into master 2026-08-09 02:07:17 +00:00
igor deleted branch agent/473-feat-switch-automerge-feedback-to-dossier-get 2026-08-09 02:07:18 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Total time spent: 7 minutes 33 seconds
igor
7 minutes 33 seconds
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
joshtronic/igor!474
No description provided.