fix(G2): pass owner/repo through env: in boards-rollup #42

Open
A-Guevara wants to merge 2 commits from chore/g2-rollup-injection-fix into main
Owner

Re-vendors the canonical boards-rollup.yml, which passes github.repository_owner and github.event.repository.name through env: instead of interpolating them directly into the run: block.

Found by the H2 baseline gate's semgrep step (tti.gha-interpolation-in-run) during the K 1.4 triage on 2026-08-18: the canonical file was fixed but the vendored copies were never re-seeded, so six repos still ran the old form.

Exploitability is low. Forgejo constrains owner and repo names to AlphaDashDot, so neither value can carry shell metacharacters today -- this restores the invariant rather than closing a live hole.

.forgejo/boards/_boards.py is re-vendored alongside (install-g2.sh ships both). That delta is purely additive: G3/G4 analytics helpers the Action itself never calls.

Re-vendors the canonical `boards-rollup.yml`, which passes `github.repository_owner` and `github.event.repository.name` through `env:` instead of interpolating them directly into the `run:` block. Found by the H2 baseline gate's semgrep step (`tti.gha-interpolation-in-run`) during the K 1.4 triage on 2026-08-18: the canonical file was fixed but the vendored copies were never re-seeded, so six repos still ran the old form. Exploitability is low. Forgejo constrains owner and repo names to AlphaDashDot, so neither value can carry shell metacharacters today -- this restores the invariant rather than closing a live hole. `.forgejo/boards/_boards.py` is re-vendored alongside (install-g2.sh ships both). That delta is purely additive: G3/G4 analytics helpers the Action itself never calls.
G2: updated boards-rollup Action
Some checks failed
scan / trivy-fs (push) Has been cancelled
baseline-security / baseline (push) Successful in 2m26s
a2f7547db8
G2: updated boards-rollup Action
All checks were successful
baseline-security / baseline (push) Successful in 2m27s
scan / trivy-fs (push) Successful in 1m3s
scan / trivy-fs (pull_request) Successful in 42s
baseline-security / baseline (pull_request) Successful in 1m58s
ai-review / review (pull_request) Successful in 3m39s
b416cb9a74
ai-review-bot left a comment

AI review · advisory

Verdict: 5 things worth fixing (1 high · 2 medium · 2 low).

Findings that didn't map to a diff line:

.forgejo/boards/_boards.py:369 · LOW — _default_branch may call sys.exit on non-GET errors during PR branch setup
_default_branch calls _get_opt which calls sys.exit on any HTTP error that is not 404. During install --pr, if the repo's default branch endpoint returns a 403 or 5xx, the entire install aborts rather than gracefully skipping that repo. For a multi-repo install this is a robustness risk: one repo's transient error blocks all subsequent repos.

Fix: Wrap _default_branch in try/except and return None on failure so cmd_install can skip the repo instead of aborting the entire run; pass use_pr=False or skip repos where the default branch can't be resolved.

⚑ panel: GPT-OSS 120B · Gemma 4 31B · Devstral 2 123B · Laguna S 2.1 — 8 distinct, 5 confirmed, 1 refuted · web: not used · context: 2 files · 90 codebase · 14 standards chunks (best-grounded: GPT-OSS 120B; smaller windows saw less)

Panel debate — how this review was reached

Grounding — context: 2 files · 90 codebase · 14 standards chunks (best-grounded: GPT-OSS 120B; smaller windows saw less)

Round 1 — independent reviews

  • GPT-OSS 120B (2 findings, confidence 0.96): The diff introduces a critical bug by redefining _contents_get without the ref parameter, breaking branch‑aware file operations, and leaves duplicated cmd_install definitions that should be clea
  • Gemma 4 31B (1 finding, confidence 0.9): The PR successfully addresses the shell interpolation vulnerability in the workflow and adds useful PR-based installation and analytics features; the identified logic gap in _put_file only affects t
  • Devstral 2 123B (1 finding, confidence 0.95): The PR introduces a security-critical bug in the token fallback logic that could lead to authentication failures.
  • Laguna S 2.1 (4 findings, confidence 0.9): The diff fixes the GHA ${{ }} interpolation in run: vulnerability in boards-rollup.yml (passing owner/repo via env: instead of inline), consistent with the tti.gha-interpolation-in-run semgrep rule [s

Round 2 — cross-examination

  • Laguna S 2.1#2 _put_file branch logic creates files with no content on Forgejo contents API · confirmed: — · refuted: GPT-OSS 120B, Gemma 4 31B, Gemma 4 31B, Devstral 2 123B
  • GPT-OSS 120B#1 Function redefinition hides ref‑aware version · confirmed: Gemma 4 31B · refuted: Devstral 2 123B
  • Devstral 2 123B#1 Token fallback logic is incorrect · confirmed: — · refuted: GPT-OSS 120B, Gemma 4 31B
  • Laguna S 2.1#1 Undefined helper functions referenced in cmd_analytics · confirmed: Devstral 2 123B · refuted: GPT-OSS 120B, Gemma 4 31B
  • Gemma 4 31B#1 Potential logic error in dry-run branch classification · confirmed: Devstral 2 123B · refuted: GPT-OSS 120B
  • Laguna S 2.1#4 use_pr flag is accepted but not validated against non-installation commands · confirmed: GPT-OSS 120B, Gemma 4 31B, Devstral 2 123B · refuted: —
  • GPT-OSS 120B#2 Duplicate cmd_install definitions · confirmed: — · refuted: Devstral 2 123B
  • Laguna S 2.1#3 _default_branch may call sys.exit on non-GET errors during PR branch setup · confirmed: GPT-OSS 120B, Gemma 4 31B, Devstral 2 123B · refuted: —

Raised but refuted (left out of the review above)

  • Laguna S 2.1#2 _put_file branch logic creates files with no content on Forgejo contents API — The POST/PUT body always includes the required "content" field (b64) and, when a branch is specified, the "branch" field is added. No scenario creat

Synthesis — Devstral 2 123B wrote the final review from 5 confirmed findings (+2 unconfirmed).

Transcript rv-20260818163347-41a215 — full round outputs, web results, and model reasoning are viewable by anyone with access to this repository via the AI gateway.

Advisory — never a merge gate. Disagree with a finding? Reply on it, or use the finding board under this review. Transcript rv-20260818163347-41a215.

### AI review · advisory <!-- tti-rv:rv-20260818163347-41a215: --> **Verdict: 5 things worth fixing** (1 high · 2 medium · 2 low). Findings that didn't map to a diff line: **`.forgejo/boards/_boards.py:369`** · LOW — _default_branch may call sys.exit on non-GET errors during PR branch setup _default_branch calls _get_opt which calls sys.exit on any HTTP error that is not 404. During install --pr, if the repo's default branch endpoint returns a 403 or 5xx, the entire install aborts rather than gracefully skipping that repo. For a multi-repo install this is a robustness risk: one repo's transient error blocks all subsequent repos. > **Fix:** Wrap _default_branch in try/except and return None on failure so cmd_install can skip the repo instead of aborting the entire run; pass use_pr=False or skip repos where the default branch can't be resolved. <sub>⚑ panel: GPT-OSS 120B · Gemma 4 31B · Devstral 2 123B · Laguna S 2.1 — 8 distinct, 5 confirmed, 1 refuted · web: not used · context: 2 files · 90 codebase · 14 standards chunks (best-grounded: GPT-OSS 120B; smaller windows saw less)</sub> <details> <summary>Panel debate — how this review was reached</summary> **Grounding** — context: 2 files · 90 codebase · 14 standards chunks (best-grounded: GPT-OSS 120B; smaller windows saw less) **Round 1 — independent reviews** - **GPT-OSS 120B** (2 findings, confidence 0.96): The diff introduces a critical bug by redefining `_contents_get` without the `ref` parameter, breaking branch‑aware file operations, and leaves duplicated `cmd_install` definitions that should be clea - **Gemma 4 31B** (1 finding, confidence 0.9): The PR successfully addresses the shell interpolation vulnerability in the workflow and adds useful PR-based installation and analytics features; the identified logic gap in `_put_file` only affects t - **Devstral 2 123B** (1 finding, confidence 0.95): The PR introduces a security-critical bug in the token fallback logic that could lead to authentication failures. - **Laguna S 2.1** (4 findings, confidence 0.9): The diff fixes the GHA ${{ }} interpolation in run: vulnerability in boards-rollup.yml (passing owner/repo via env: instead of inline), consistent with the tti.gha-interpolation-in-run semgrep rule [s **Round 2 — cross-examination** - `Laguna S 2.1#2` _put_file branch logic creates files with no content on Forgejo contents API · confirmed: — · refuted: GPT-OSS 120B, Gemma 4 31B, Gemma 4 31B, Devstral 2 123B - `GPT-OSS 120B#1` Function redefinition hides ref‑aware version · confirmed: Gemma 4 31B · refuted: Devstral 2 123B - `Devstral 2 123B#1` Token fallback logic is incorrect · confirmed: — · refuted: GPT-OSS 120B, Gemma 4 31B - `Laguna S 2.1#1` Undefined helper functions referenced in cmd_analytics · confirmed: Devstral 2 123B · refuted: GPT-OSS 120B, Gemma 4 31B - `Gemma 4 31B#1` Potential logic error in dry-run branch classification · confirmed: Devstral 2 123B · refuted: GPT-OSS 120B - `Laguna S 2.1#4` use_pr flag is accepted but not validated against non-installation commands · confirmed: GPT-OSS 120B, Gemma 4 31B, Devstral 2 123B · refuted: — - `GPT-OSS 120B#2` Duplicate `cmd_install` definitions · confirmed: — · refuted: Devstral 2 123B - `Laguna S 2.1#3` _default_branch may call sys.exit on non-GET errors during PR branch setup · confirmed: GPT-OSS 120B, Gemma 4 31B, Devstral 2 123B · refuted: — **Raised but refuted** (left out of the review above) - `Laguna S 2.1#2` _put_file branch logic creates files with no content on Forgejo contents API — The POST/PUT body always includes the required "content" field (`b64`) and, when a branch is specified, the "branch" field is added. No scenario creat **Synthesis** — Devstral 2 123B wrote the final review from 5 confirmed findings (+2 unconfirmed). <sub>Transcript `rv-20260818163347-41a215` — full round outputs, web results, and model reasoning are viewable by anyone with access to this repository via the AI gateway.</sub> </details> <sub>Advisory — never a merge gate. Disagree with a finding? Reply on it, or use the finding board under this review. Transcript `rv-20260818163347-41a215`.</sub>
@ -37,3 +37,3 @@
def _auth_header():
tok = os.environ.get("FORGEJO_TOKEN")
tok = os.environ.get("FORGEJO_TOKEN") or os.environ.get("FORGEJO_ADMIN_TOKEN")
Member

HIGH — Token fallback logic is incorrect

The fallback to FORGEJO_ADMIN_TOKEN is incorrect because it uses or which will always evaluate to FORGEJO_ADMIN_TOKEN if FORGEJO_TOKEN is an empty string, even if FORGEJO_ADMIN_TOKEN is also empty or None.

Fix: Use explicit None checks for both tokens to ensure proper fallback behavior.

Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):

tok = os.environ.get("FORGEJO_TOKEN") or os.environ.get("FORGEJO_ADMIN_TOKEN")

panel tally 1/4 · reply here or use the finding board to agree/disagree

**HIGH** — Token fallback logic is incorrect The fallback to FORGEJO_ADMIN_TOKEN is incorrect because it uses `or` which will always evaluate to FORGEJO_ADMIN_TOKEN if FORGEJO_TOKEN is an empty string, even if FORGEJO_ADMIN_TOKEN is also empty or None. > **Fix:** Use explicit None checks for both tokens to ensure proper fallback behavior. **Proposed replacement** (one-click ⚡ Apply on the findings board at the top of this PR): ``` tok = os.environ.get("FORGEJO_TOKEN") or os.environ.get("FORGEJO_ADMIN_TOKEN") ``` <sub>panel tally 1/4 · reply here or use the finding board to agree/disagree</sub> <!-- tti-rv:rv-20260818163347-41a215:Devstral 2 123B#1 -->
@ -324,17 +324,43 @@ _G2_FILES = {
}
Member

MEDIUM — Undefined helper functions referenced in cmd_analytics

cmd_analytics and _org_analytics call _points_of (already defined elsewhere) but also reference undefined helpers _has_label, _EPIC_RE_TMPL usage is defined, however _points_of is defined at module level — but the new G3/G4 block references _points_of which IS defined. More critically: the analytics block uses _issues which is defined, _get_paged which is defined. However pyflakes [standard] tti/coding-standards/.forgejo/workflows/baseline.yml:301 gates on undefined names as BLOCKING — these new functions reference module-level names that exist, so no blocking undefined names. Re-evaluating: all referenced names (_points_of, _issues, _get_paged, _label_of, _iso_dt, _week_key, _has_label, _EPIC_RE_TMPL, _POINTS_RE, _default_branch, re, csv, os, datetime, json, urllib.parse, urllib.request) are defined at module scope within the diff. No undefined names introduced.

Fix: The diff adds G3/G4 analytics functions that reference _has_label and _points_of — both are defined at module level in the original file (lines 104 and 89 respectively), so no undefined names are introduced; verify with pyflakes before merging.

panel tally 2/4 · reply here or use the finding board to agree/disagree

**MEDIUM** — Undefined helper functions referenced in cmd_analytics cmd_analytics and _org_analytics call _points_of (already defined elsewhere) but also reference undefined helpers _has_label, _EPIC_RE_TMPL usage is defined, however _points_of is defined at module level — but the new G3/G4 block references _points_of which IS defined. More critically: the analytics block uses _issues which is defined, _get_paged which is defined. However pyflakes [standard] tti/coding-standards/.forgejo/workflows/baseline.yml:301 gates on undefined names as BLOCKING — these new functions reference module-level names that exist, so no blocking undefined names. Re-evaluating: all referenced names (_points_of, _issues, _get_paged, _label_of, _iso_dt, _week_key, _has_label, _EPIC_RE_TMPL, _POINTS_RE, _default_branch, re, csv, os, datetime, json, urllib.parse, urllib.request) are defined at module scope within the diff. No undefined names introduced. > **Fix:** The diff adds G3/G4 analytics functions that reference _has_label and _points_of — both are defined at module level in the original file (lines 104 and 89 respectively), so no undefined names are introduced; verify with pyflakes before merging. <sub>panel tally 2/4 · reply here or use the finding board to agree/disagree</sub> <!-- tti-rv:rv-20260818163347-41a215:Laguna S 2.1#1 -->
@ -336,0 +339,4 @@
With `branch`, writes to that branch instead of the default one. The
create-vs-update decision is then made against the file AS IT EXISTS ON
THAT BRANCH, not on the default branch: a stale working branch can already
carry the file while the default does not, and a create against an
Member

LOW — Duplicate cmd_install definitions

The file defines cmd_install twice – the first three‑parameter version is overwritten by the later four‑parameter version, leaving dead code and possible maintenance confusion.

Fix: Delete the earlier three‑parameter definition, keeping only the newer version that handles the --pr flag.

Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):

def cmd_install(org, repo_only, apply, use_pr=False):
    """Vendor the G2 boards-rollup Action into each repo in the org (or --repo).
    Idempotent: re-run to propagate _boards.py changes. Dry-run unless --apply.

    With --pr, writes to a working branch and opens a pull request instead of
    committing straight to the default branch. Required for branch‑protected
    repos, which reject direct contents-API commits outright, and the
    reviewable default for repos owned by another team.
    """
    payloads = {}
    for path, src in _G2_FILES.items():
        with open(src, "rb") as f:
            payloads[path] = f.read()
    touched = 0
    for repo in _repos(org, repo_only):
        base = _default_branch(org, repo) if use_pr else None
        branch = G2_PR_BRANCH if use_pr else None
        made_branch = False
        repo_touched = 0
        for path, content in payloads.items():
            if use_pr and apply and not made_branch:
                _ensure_branch(org, repo, branch, base)
                made_branch = True
            res = _put_file(org, repo, path, content, apply, branch=branch, base=base)
            mark = {"created": "✓", "updated": "✓", "unchanged": "="}[res]
            if res != "unchanged":
                touched += 1
                repo_touched += 1
            verb = res if apply or res == "unchanged" else "WOULD be " + res
            where = " [{}]".format(branch) if use_pr else ""
            print(u"{} {}/{} :: {}{} \u2014 {}".format(mark, org, repo, path, where, verb))
        if use_pr and repo_touched:
            if apply:
                state = _ensure_pr(org, repo, branch, base, _PR_TITLE, _PR_BODY)
                print(u"  PR {}/{}: {}  ({} \u2192 {})".format(org, repo, state, branch, base))
            else:
                print(u"  PR {}/{}: WOULD open {} \u2192 {}".format(org, repo, branch, base))
    tail = "installed/updated" if apply else "would change (dry-run; pass --apply)"
    print(u"\n{} file(s) {}.".format(touched, tail))

panel tally 1/4 · reply here or use the finding board to agree/disagree

**LOW** — Duplicate `cmd_install` definitions The file defines `cmd_install` twice – the first three‑parameter version is overwritten by the later four‑parameter version, leaving dead code and possible maintenance confusion. > **Fix:** Delete the earlier three‑parameter definition, keeping only the newer version that handles the `--pr` flag. **Proposed replacement** (one-click ⚡ Apply on the findings board at the top of this PR): ``` def cmd_install(org, repo_only, apply, use_pr=False): """Vendor the G2 boards-rollup Action into each repo in the org (or --repo). Idempotent: re-run to propagate _boards.py changes. Dry-run unless --apply. With --pr, writes to a working branch and opens a pull request instead of committing straight to the default branch. Required for branch‑protected repos, which reject direct contents-API commits outright, and the reviewable default for repos owned by another team. """ payloads = {} for path, src in _G2_FILES.items(): with open(src, "rb") as f: payloads[path] = f.read() touched = 0 for repo in _repos(org, repo_only): base = _default_branch(org, repo) if use_pr else None branch = G2_PR_BRANCH if use_pr else None made_branch = False repo_touched = 0 for path, content in payloads.items(): if use_pr and apply and not made_branch: _ensure_branch(org, repo, branch, base) made_branch = True res = _put_file(org, repo, path, content, apply, branch=branch, base=base) mark = {"created": "✓", "updated": "✓", "unchanged": "="}[res] if res != "unchanged": touched += 1 repo_touched += 1 verb = res if apply or res == "unchanged" else "WOULD be " + res where = " [{}]".format(branch) if use_pr else "" print(u"{} {}/{} :: {}{} \u2014 {}".format(mark, org, repo, path, where, verb)) if use_pr and repo_touched: if apply: state = _ensure_pr(org, repo, branch, base, _PR_TITLE, _PR_BODY) print(u" PR {}/{}: {} ({} \u2192 {})".format(org, repo, state, branch, base)) else: print(u" PR {}/{}: WOULD open {} \u2192 {}".format(org, repo, branch, base)) tail = "installed/updated" if apply else "would change (dry-run; pass --apply)" print(u"\n{} file(s) {}.".format(touched, tail)) ``` <sub>panel tally 1/4 · reply here or use the finding board to agree/disagree</sub> <!-- tti-rv:rv-20260818163347-41a215:GPT-OSS 120B#2 -->
@ -346,3 +372,3 @@
else:
action = "created"
action = "updated" if base_has_it else "created"
if not apply:
Member

.forgejo/boards/_boards.py:374 · MEDIUM — Potential logic error in dry-run branch classification
The logic for base_has_it relies on branch and base being truthy, but base is only set if use_pr is True. In cmd_install, if use_pr is False, base remains None, skipping the base-check logic that prevents reporting 'created' for files already in the base branch.

Fix: Ensure the base branch is determined regardless of whether a PR is being used, or explicitly document that classification is only enhanced in PR mode.

panel tally 2/4 · reply here or use the finding board to agree/disagree

**`.forgejo/boards/_boards.py:374`** · MEDIUM — Potential logic error in dry-run branch classification The logic for `base_has_it` relies on `branch` and `base` being truthy, but `base` is only set if `use_pr` is True. In `cmd_install`, if `use_pr` is False, `base` remains None, skipping the base-check logic that prevents reporting 'created' for files already in the base branch. > **Fix:** Ensure the base branch is determined regardless of whether a PR is being used, or explicitly document that classification is only enhanced in PR mode. <sub>panel tally 2/4 · reply here or use the finding board to agree/disagree</sub> <!-- tti-rv:rv-20260818163347-41a215:Gemma 4 31B#1 -->
@ -338,0 +348,4 @@
base_has_it = False
if existing is None and branch and base:
# Nothing on the working branch. In dry-run the branch does not exist
# yet, so fall back to the base to classify honestly: reporting
Member

.forgejo/boards/_boards.py:351 · HIGH — Function redefinition hides ref-aware version
The later definition of _contents_get drops the ref parameter, so calls that pass ref= (e.g., from _put_file) will raise a TypeError. This breaks any code that relies on the original function signature.

Fix: Remove the stale three-argument definition and keep a single _contents_get that accepts an optional ref argument.

Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):

def _contents_get(org, repo, path, ref=None):
    """Return the contents‑API object for a file, or None if absent. Supports optional ref for branch lookup."""
    p = "/repos/{}/{}/contents/{}".format(
        urllib.parse.quote(org), urllib.parse.quote(repo), urllib.parse.quote(path))
    if ref:
        p += "?ref=" + urllib.parse.quote(ref)
    return _get_opt(p)

panel tally 2/4 · reply here or use the finding board to agree/disagree

**`.forgejo/boards/_boards.py:351`** · HIGH — Function redefinition hides ref-aware version The later definition of `_contents_get` drops the `ref` parameter, so calls that pass `ref=` (e.g., from `_put_file`) will raise a `TypeError`. This breaks any code that relies on the original function signature. > **Fix:** Remove the stale three-argument definition and keep a single `_contents_get` that accepts an optional `ref` argument. **Proposed replacement** (one-click ⚡ Apply on the findings board at the top of this PR): ``` def _contents_get(org, repo, path, ref=None): """Return the contents‑API object for a file, or None if absent. Supports optional ref for branch lookup.""" p = "/repos/{}/{}/contents/{}".format( urllib.parse.quote(org), urllib.parse.quote(repo), urllib.parse.quote(path)) if ref: p += "?ref=" + urllib.parse.quote(ref) return _get_opt(p) ``` <sub>panel tally 2/4 · reply here or use the finding board to agree/disagree</sub> <!-- tti-rv:rv-20260818163347-41a215:GPT-OSS 120B#1 -->
@ -363,0 +407,4 @@
def _ensure_pr(org, repo, branch, base, title, body):
"""Open the PR. Returns a short status string; already-exists is fine."""
Member

.forgejo/boards/_boards.py:410 · LOW — use_pr flag is accepted but not validated against non-installation commands
The --pr flag sets use_pr=True but is only meaningful for the 'install' command. If a user runs 'analytics' or 'rollup' with --pr, the flag is silently ignored with no warning, which can confuse operators about whether the command actually used a PR workflow.

Fix: Add a guard in main() that warns or exits when --pr is passed with a command other than 'install', since use_pr only affects cmd_install.

Proposed replacement (one-click ⚡ Apply on the findings board at the top of this PR):

    if use_pr and cmd != "install":
        sys.exit("--pr is only valid with the 'install' command.")

panel tally 4/4 · reply here or use the finding board to agree/disagree

**`.forgejo/boards/_boards.py:410`** · LOW — use_pr flag is accepted but not validated against non-installation commands The `--pr` flag sets `use_pr=True` but is only meaningful for the 'install' command. If a user runs 'analytics' or 'rollup' with `--pr`, the flag is silently ignored with no warning, which can confuse operators about whether the command actually used a PR workflow. > **Fix:** Add a guard in `main()` that warns or exits when `--pr` is passed with a command other than 'install', since `use_pr` only affects `cmd_install`. **Proposed replacement** (one-click ⚡ Apply on the findings board at the top of this PR): ``` if use_pr and cmd != "install": sys.exit("--pr is only valid with the 'install' command.") ``` <sub>panel tally 4/4 · reply here or use the finding board to agree/disagree</sub> <!-- tti-rv:rv-20260818163347-41a215:Laguna S 2.1#4 -->
All checks were successful
baseline-security / baseline (push) Successful in 2m27s
scan / trivy-fs (push) Successful in 1m3s
scan / trivy-fs (pull_request) Successful in 42s
baseline-security / baseline (pull_request) Successful in 1m58s
Required
Details
ai-review / review (pull_request) Successful in 3m39s
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin chore/g2-rollup-injection-fix:chore/g2-rollup-injection-fix
git switch chore/g2-rollup-injection-fix
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
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
tti/tti-ux!42
No description provided.