docs(ideate): v1.2 candidate ideas (1 from Gitea — REQ-INB-26 / INB-183)

---ci---
project: inboxos
phase: 1
milestone: v1.2
status: ideate
decisions:
  - id: D-IDEATE-01
    decision: "Accepted 1 ideation recommendation (REQ-INB-26)"
    rationale: |
      Source query: tea issues list --assignee cloudinit-bot --owner
      jc-capital --repo inboxos --state open returned 1 open issue
      (INB-183, status:dev, milestone v1.1-Beta). The issue is fully
      specified by the author (CTO) with 4 acceptance criteria and 3
      out-of-scope items. Mechanical translation: 1:1 candidate
      REQ-INB-26. Backend-enriched tier produced no findings
      (single-source directed ideation, no ambiguity to enrich).
      Cross-project tier produced 1 meta-finding (CP-1): paperclip
      is not a registered CIAgent project; the lead-developer must
      decide whether to register it or accept ad-hoc upstream PR
      routing from inboxos.
    confidence: 0.90
  - id: D-IDEATE-02
    decision: "Milestone placement: v1.2 (ideation block, status in progress)"
    rationale: |
      v1.1 is shipped (tag v1.1.0, merge to main, release 178). INB-183
      is filed under milestone v1.1-Beta, but the v1.1 milestone
      branch is already complete and tagged, so the candidate
      becomes the v1.2 lead candidate. ROADMAP.md adds a v1.2
      ideation (Phase 01) block; REQUIREMENTS.md appends a v1.2
      candidate section.
    confidence: 0.95
  - id: D-IDEATE-03
    decision: "CPO-owned files (docs/requirements.md, docs/roadmap.md) untouched"
    rationale: |
      Per board mandate b49cfb7, docs/requirements.md and
      docs/roadmap.md are CPO-owned. This pass appends to the
      .ciagent/inboxos/ mirror only. The CPO promotes [CANDIDATE]
      to a real requirement by authoring docs/requirements.md.
    confidence: 1.00
requirements:
  covered: [REQ-INB-26]
  partial: []
  deferred_cross_project: [REQ-INB-26 (executor is paperclip/, not inboxos)]
ideas:
  total: 1
  accepted: 1
  skipped: 0
  by_tier:
    mechanical_issue_driven: 1
    backend_enriched: 0
    cross_project: 0
  by_category:
    architecture: 1
meta_findings:
  - id: CP-1
    summary: "paperclip is not a registered CIAgent project; lead-developer disposition needed before PLAN"
files_touched:
  new:
    - .ciagent/inboxos/ideation/v1.2-candidates.md
  modified:
    - .ciagent/inboxos/REQUIREMENTS.md
    - .ciagent/inboxos/ROADMAP.md
  untouched:
    - docs/requirements.md (CPO-owned)
    - docs/roadmap.md (CPO-owned)
verification:
  type: ideation_commit_only
  note: This is the ideation commit. PLAN/EXECUTE/VERIFY will follow in subsequent commits. The candidate REQ-INB-26 is not promoted to a real requirement until the CPO authors docs/requirements.md.
---/ci---
This commit is contained in:
2026-06-08 22:20:50 +00:00
parent 341c331148
commit b0f099b8d1
3 changed files with 307 additions and 0 deletions
+20
View File
@@ -132,3 +132,23 @@ All extraction prompts shall be version-controlled in `.opencode/commands/` and
**Effort:** M
**Schema impact:** no
**Rationale:** `docs/operations-runbook.md:401` explicitly anticipates a `scripts/rotate_secrets.sh` helper that uses `pipelines.common.gitea_request` to update secrets in place, but neither the helper nor the rotation procedure exists. The candidate adds the helper (with a dry-run diff mode), a runbook §6.4 procedure, and a `_tests/test_rotate_secrets_offline.py` test. Closes a documented "future enhancement" gap.
## v1.2 candidate requirements
> The following requirements are IDEATION CANDIDATES. They have not been
> approved by the CPO. They are derived from the Gitea issue queue
> assigned to `cloudinit-bot` (1 open issue: `INB-183` per
> `.ciagent/inboxos/ideation/v1.2-candidates.md`). Each candidate is
> marked **[CANDIDATE]** until the CPO authors a matching entry in
> `docs/requirements.md` (CPO-owned, per board mandate `b49cfb7`).
### REQ-INB-26 — opencode-local adapter `$HOME/.local/bin` PATH append
**Status:** [CANDIDATE]
**Source:** Gitea issue `INB-183` (id 8, status:dev, milestone v1.1-Beta)
**Parent:** REQ-INB-10 (Self-hosted PII boundary)
**Upstream parents:** INB-171 (Mandatory tooling standardization), INB-174 (Install + configure tea CLI)
**Confidence:** 0.90
**Effort:** S
**Schema impact:** no
**Cross-project:** yes (fix target is the opencode monorepo at `paperclip/packages/adapter-utils/src/server-utils.ts:255`, not inboxos)
**Rationale:** The opencode-local adapter's `defaultPathForPlatform` hard-codes a PATH that excludes `~/.local/bin`, where the `tea` CLI is installed for every leadership agent (INB-174). Because `runChildProcess` uses `shell: false`, the opencode process inherits this PATH directly and the opencode bash tool's child shells never resolve bare `tea`. Leadership agents must use the absolute-path workaround `~/.local/bin/tea ...`, which violates INB-171's "without touching any other tooling" requirement. Fix is a one-liner in `defaultPathForPlatform` to append `path.join(os.homedir(), ".local", "bin")` (gated on `pathExists`), plus a `CHANGELOG.md` note. Acceptance criteria are specified verbatim in `INB-183`. Out of scope: symlinking tea to `/usr/local/bin/tea` (root required) and editing the leadership agent `AGENTS.md` (band-aid). **Disposition note:** the lead-developer must decide before PLAN whether to register `paperclip` as a new CIAgent project (so REQ-INB-26 has a natural home) or accept ad-hoc upstream PR routing from inboxos. See `ideation/v1.2-candidates.md` §5 (CP-1).
+22
View File
@@ -71,3 +71,25 @@
`.ciagent/inboxos/REQUIREMENTS.md` v1.1 candidate section,
`.ciagent/inboxos/verify/v1.1-PHASE1-REPORT.md`.
- **Next stage**: v1.2 candidates filed in `CI-LOG.md` `post_hoc_review.remaining_for_v1_2` (P1-1, P1-2, P2-1, P2-2).
## v1.2 ideation (Phase 01)
- **Goal**: present v1.2 candidate REQ-INB-26 (opencode-local adapter
PATH append) for CPO review, sourced from the Gitea issue queue
assigned to `cloudinit-bot`.
- **Status**: in progress 2026-06-08. Source query: 1 open issue
(`INB-183`, status:dev, milestone v1.1-Beta). Cross-project
disposition pending lead-developer decision (register
`paperclip` as a new CIAgent project, or accept ad-hoc upstream
PR routing from inboxos — see
`.ciagent/inboxos/ideation/v1.2-candidates.md` §5 CP-1).
- **Artifacts**: `.ciagent/inboxos/ideation/v1.2-candidates.md`
(this pass), `.ciagent/inboxos/REQUIREMENTS.md` v1.2 candidate
section (REQ-INB-26, status `[CANDIDATE]`).
- **Total candidates:** 1 (REQ-INB-26, confidence 0.90, effort S,
cross-project).
- **Next stage**: lead-developer makes CP-1 disposition decision →
PLAN phase → EXECUTE phase. The PLAN phase must add a
regression-test acceptance criterion beyond the INB-183 verbatim
list: `which tea` on a non-login shell in the opencode-local
adapter PATH must return `~/.local/bin/tea`.
@@ -0,0 +1,265 @@
# InboxOS — v1.2 Ideation Candidates
> **Date:** 2026-06-08
> **Project:** InboxOS (`/INB/projects/inboxos`)
> **Milestone:** v1.2 (post-v1.1)
> **Source of ideation:** Gitea issues assigned to `cloudinit-bot`
> (1 open issue: INB-183, milestone v1.1-Beta) — single-issue directed
> ideation per `ciagent run --ideate` invocation.
> **Ideator role:** `ci-ideation-agent`
> **Author status:** Ideation candidates only. **Not approved
> requirements.** All candidates are marked **[CANDIDATE]** until the
> CPO authors a matching entry in `docs/requirements.md` (CPO-owned,
> per board mandate `b49cfb7`).
---
## 1. CPO governance note
This ideation pass honors the board mandate recorded in commit
`b49cfb7` (`docs(seed): initialize requirements and roadmap
source-of-truth`):
- `docs/requirements.md` is CPO-owned. **Not modified.** Confirmed
byte-identical to the v1.1 close.
- `docs/roadmap.md` is CPO-owned. **Not modified.** Confirmed
byte-identical to the v1.1 close.
- The 14 v1.0 requirements (`REQ-INB-1` through `REQ-INB-14`) are
**[SHIPPED]** per `.ciagent/inboxos/CI-LOG.md`.
- The 11 v1.1 candidates (`REQ-INB-15` through `REQ-INB-25`) are
**[EXECUTED]** per the v1.1 acceptance gate at
`docs/operations-runbook.md §9.4` and tagged `v1.1.0`. The
candidates remain `[CANDIDATE]` in `.ciagent/inboxos/REQUIREMENTS.md`
until the CPO promotes them by authoring the corresponding entry in
`docs/requirements.md` — same disposition as the v1.1 pass.
- Edits made in this pass are confined to:
- `.ciagent/inboxos/ideation/v1.2-candidates.md` (this file — new)
- `.ciagent/inboxos/REQUIREMENTS.md` (append a "v1.2 candidate
requirements" block, no change to existing 14 + 11)
- `.ciagent/inboxos/ROADMAP.md` (append a "v1.2 ideation (Phase 01)"
block, no change to Phase 6/7/8 prose or the existing v1.1
ideation block)
The CPO is the only role that can promote any **[CANDIDATE]** in this
report to a real requirement by authoring the corresponding entry in
`docs/requirements.md`. The lead-developer is the integrator for the
follow-on PLAN phase and is the only role that may add technical
acceptance criteria to a candidate.
---
## 2. Source query
The `ciagent run --ideate` invocation specified: *"Query gitea with
the tea cli for any issues assigned to you and use that for
ideation."* The tea invocation was:
```
tea issues list --assignee cloudinit-bot --owner jc-capital \
--repo inboxos --state open
```
Result: **1 open issue** — `INB-183`.
The full state of all inboxos issues (any assignee, any state) is 8
issues: 7 closed (status:done, all v1.0-MVP and v1.1-Beta backfill
seeds) and 1 open (`INB-183`, status:dev, v1.1-Beta). No other open
issues were filed against this project that the bot owns.
---
## 3. Tier 1 — Mechanical findings (issue-driven)
### T1-1 — INB-183: opencode-local adapter must append `$HOME/.local/bin` to spawned env PATH
| Field | Value |
|-------|-------|
| **Candidate REQ** | **REQ-INB-26** |
| **Gitea issue** | `INB-183` (id 8, status:dev, milestone v1.1-Beta) |
| **Parent REQ** | REQ-INB-10 (Self-hosted PII boundary) |
| **Upstream parents** | INB-171 (Mandatory tooling standardization), INB-174 (Install + configure tea CLI) |
| **Confidence** | 0.90 |
| **Effort** | S |
| **Schema impact** | no |
| **Cross-project** | yes — fix target is the opencode monorepo, not inboxos |
**Why this candidate exists (verbatim from INB-183 body):**
> The tea CLI is installed at `~/.local/bin/tea` for every leadership
> agent (per INB-174). The opencode-local adapter's
> `defaultPathForPlatform`
> (`packages/adapter-utils/src/server-utils.ts:255`) hard-codes a PATH
> that does **not** include `~/.local/bin`:
>
> ```
> return "/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin";
> ```
>
> `runChildProcess` uses `shell: false` (server-utils.ts:2124), so the
> opencode process inherits this PATH directly and the opencode bash
> tool's child shells never get `~/.local/bin` on PATH. Leadership
> agents currently have to invoke tea via the absolute path
> `~/.local/bin/tea ...` instead of bare `tea`, which violates the
> INB-171 "without touching any other tooling" requirement.
**Proposed acceptance criteria (from INB-183, verbatim):**
- Bare `tea` resolves from a bash tool call in a leadership agent's
opencode session, with no absolute path prefix.
- `tea --version`, `tea logins list`, `tea issues list`, `tea pr list`,
`tea release list` all run successfully from a non-interactive,
non-login shell in the opencode harness.
- The fix does not regress the existing PATH-based command resolution
for any other tool (git, gh, jq, claude, codex, opencode, etc.).
- The fix is documented in
`packages/adapters/opencode-local/CHANGELOG.md` (or wherever the
adapter's release notes live).
**Out of scope (verbatim from INB-183):**
- Symlinking tea into `/usr/local/bin/tea` (root permission required,
agent runtime does not have root).
- A new wrapper around every binary that goes into `~/.local/bin/`.
The PATH fix is general.
- Modifying the leadership agent `AGENTS.md` to use the absolute-path
workaround (band-aid, not the fix).
**Cross-project disposition (v1.2-specific finding):**
The fix target is **not** in the inboxos repository. INB-183
references `packages/adapter-utils/src/server-utils.ts:255` and
`packages/adapters/opencode-local/CHANGELOG.md`. Verified at
`/root/workspace/paperclip/packages/adapter-utils/src/server-utils.ts:255`:
```typescript
export function defaultPathForPlatform() {
if (process.platform === "win32") {
return "C:\\Windows\\System32;C:\\Windows;C:\\Windows\\System32\\Wbem";
}
return "/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin";
}
```
The inboxos repo is a downstream consumer of opencode (see
`opencode.json` for the Ollama provider config and
`.opencode/commands/` for the prompt family). The inboxos project
itself cannot land the fix; the inboxos project can only:
1. File the candidate here (`REQ-INB-26`) so the opencode
maintainers (currently jc-capital / Paperclip) can pick it up.
2. Mirror a regression test in the inboxos CI surface if one is
warranted (TBD — the opencode fix is upstream and the inboxos
test surface does not exercise the opencode-local adapter PATH
directly).
This is a **cross-project deferred candidate** in the v1.1
taxonomy: inboxos is the queue owner (it is filed in the inboxos
repo's issue tracker) but the executor is the opencode monorepo. The
v1.2 PLAN phase must add an "out-of-repo PR target" annotation to
the candidate or hand the candidate to a sibling project (e.g.
`paperclip` in the CIAgent registry — note: `paperclip` is not
currently a registered CIAgent project; only `coreci`, `ci`, `foo`,
`inboxos` are). The lead-developer should decide whether to:
(a) Register `paperclip` as a new CIAgent project and route
`REQ-INB-26` to it, or
(b) Annotate `REQ-INB-26` as "inboxos-tracked, executed externally
to inboxos" and let the lead-developer open the PR upstream
manually.
This disposition decision is the lead-developer's call and should
be made before the PLAN phase, not during ideation.
**Confidence rationale (0.90, not 0.95):**
The fix is mechanical and the acceptance criteria are concrete
(INB-183 author wrote them). The 0.05 discount from the v1.1 ceiling
(0.95) reflects:
- The cross-project routing ambiguity (paperclip vs inboxos).
- The acceptance criterion "does not regress ... for any other tool"
is harder to verify than the four positive acceptance tests; a
regression test in the opencode CI surface is required, not just
in inboxos.
- The v1.1 audit flagged a P1-2 backlog item about
`setup_gitea_secrets.sh` still defaulting to the old org owner
(`cto-inboxos`); the same class of "upstream/consumer drift"
could re-emerge here, so the candidate has a known soft-failure
mode.
> **Tier 1 summary:** one candidate, REQ-INB-26, derived 1:1 from
> the single assigned Gitea issue. Mechanical + cross-project
> deferred. Confidence 0.90. Lead-developer must decide paperclip
> project registration before PLAN.
---
## 4. Tier 2 — Backend-enriched findings
No backend-enriched findings. The single assigned issue is fully
specified by the author (CTO filed INB-183 with all four acceptance
criteria + three out-of-scope items + a handoff chain). There is
nothing to enrich. Backend-enriched ideation is reserved for cases
where the mechanical signal is ambiguous; INB-183 is not.
If a future `--ideate` invocation is run with a different source
(e.g. `--spec` for spec analysis or `--external` for npm audit /
OSV), the backend-enriched tier would re-engage.
---
## 5. Tier 3 — Cross-project findings
| Finding | Source | Candidate REQ | Confidence |
|---------|--------|---------------|------------|
| **CP-1** — paperclip is not a registered CIAgent project. The only sibling projects are `coreci`, `ci`, `foo`, `inboxos` (per `.ciagent/config.json`). INB-183 is the first cross-project issue filed against inboxos that requires changes in `paperclip/`. The lead-developer must decide whether to register `paperclip/` as a new CIAgent project so cross-project issues have a natural home, or to keep all cross-project issues under inboxos and use ad-hoc upstream PRs. | `.ciagent/config.json` projects[] vs INB-183 handoff | (meta, no REQ) | n/a |
**CP-1 is a lead-developer decision, not a candidate requirement.**
It is documented here so the PLAN phase does not lose the
disposition question.
> **Tier 3 summary:** one cross-project meta-finding (project
> registration question) — not a candidate, but blocks the PLAN
> phase for REQ-INB-26.
---
## 6. v1.2 ideation summary
| # | Candidate | Parent | Confidence | Effort | Cross-project |
|---|-----------|--------|------------|--------|---------------|
| 1 | **REQ-INB-26** — opencode-local adapter PATH append (`$HOME/.local/bin`) | REQ-INB-10 | 0.90 | S | yes (paperclip) |
| 1 | (meta) **CP-1** — register `paperclip` as a CIAgent project? | n/a | n/a | n/a | yes |
**Total candidates:** 1 (REQ-INB-26)
**Total cross-project meta findings:** 1 (CP-1)
**Tier 1 contribution:** 1/1 (100%)
**Tier 2 contribution:** 0/1 (none)
**Tier 3 contribution:** 0/1 (meta only)
The v1.2 ideation set is small but well-defined. The lead-developer
is expected to:
1. Make the CP-1 disposition decision (register paperclip or
accept ad-hoc routing).
2. Hand REQ-INB-26 to the executor — inboxos-lead-developer (if CP-1
is "register paperclip") or inboxos-lead-developer as
cross-project proxy (if CP-1 is "ad-hoc routing").
3. Add technical acceptance criteria beyond the INB-183 verbatim
list (specifically: a regression test that asserts `which tea` on
a non-login shell in the opencode-local adapter PATH returns
`~/.local/bin/tea`).
---
## 7. Files updated by this pass
- **New:** `.ciagent/inboxos/ideation/v1.2-candidates.md` (this file)
- **Appended:** `.ciagent/inboxos/REQUIREMENTS.md` — v1.2 candidate
block (REQ-INB-26, status `[CANDIDATE]`)
- **Appended:** `.ciagent/inboxos/ROADMAP.md` — v1.2 ideation (Phase
01) block, status `in progress`
- **Untouched:** `docs/requirements.md` (CPO-owned)
- **Untouched:** `docs/roadmap.md` (CPO-owned)
- **Untouched:** all v1.0 and v1.1 entries in REQUIREMENTS.md /
ROADMAP.md