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:
@@ -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).
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user