docs(ideate): register 12 v1.3 candidates in REQUIREMENTS.md + ROADMAP.md

The IDEATE commit (946b744) recorded the v1.3 candidate set in
the ideation file. This commit registers the same 12 candidates
in REQUIREMENTS.md (v1.3 section, REQ-INB-28..39) and updates
ROADMAP.md (v1.3 ideation block) to reflect the 9/12 disposition
(9 ACCEPT, 3 DEFER, 0 REJECT).

Disposition by candidate:
- REQ-INB-28 ACCEPT (P0, gitea-actions.md:95 cto-inboxos drift)
- REQ-INB-29 ACCEPT (P2, runbook footer Next review → v1.3)
- REQ-INB-30 ACCEPT (P2, runbook §4.5 alerting forward-pointer)
- REQ-INB-31 ACCEPT (P2, papra-write-policy.md test count 13→15)
- REQ-INB-32 ACCEPT (P2, extraction-contract.md line-ref refresh)
- REQ-INB-33 ACCEPT (P2, .env.example 7-entry addition)
- REQ-INB-34 ACCEPT (P0, wire 6 v1.1 offline tests into ci-pr)
- REQ-INB-35 DEFER  (XS, .gitignore opencode.json shadow)
- REQ-INB-36 ACCEPT (P1, runbook §6 ordering, closes v1.1 P1-1)
- REQ-INB-37 ACCEPT (P1, setup_gitea_secrets.sh owner, closes v1.1 P1-2)
- REQ-INB-38 DEFER  (XS, apply_schemas.py papra_index --check test)
- REQ-INB-39 DEFER  (S, test_papra_link_parity imapclient shim)

CP files: docs/requirements.md and docs/roadmap.md are NOT
modified (CPO-owned, per board mandate b49cfb7). The 12
candidates remain [CANDIDATE] until the CPO authors matching
entries in docs/requirements.md.

---ci---
project: inboxos
phase: 1
milestone: v1.3
status: ideate
disposition:
  accepted: [REQ-INB-28, REQ-INB-29, REQ-INB-30, REQ-INB-31, REQ-INB-32, REQ-INB-33, REQ-INB-34, REQ-INB-36, REQ-INB-37]
  deferred: [REQ-INB-35, REQ-INB-38, REQ-INB-39]
  rejected: []
  count: 12
files_added:
  - .ciagent/inboxos/ideation/v1.3-candidates.md (in 946b744)
files_modified:
  - .ciagent/inboxos/REQUIREMENTS.md (v1.3 section, REQ-INB-28..39)
  - .ciagent/inboxos/ROADMAP.md (v1.3 ideation block, 9/12 disposition)
---/ci---
This commit is contained in:
2026-06-08 23:16:04 +00:00
parent 946b744a09
commit d2f3bd561b
2 changed files with 174 additions and 0 deletions
+140
View File
@@ -164,3 +164,143 @@ All extraction prompts shall be version-controlled in `.opencode/commands/` and
**Rejection comment:** `tea comment 8` on 2026-06-08 (commit records the gitea comment URL in CI-LOG).
**Disposition note for future maintainers:** the v1.1-Beta carry of this fix is a real, well-specified 5-minute upstream change; it should be re-filed against the opencode repo (or whichever sibling owns `defaultPathForPlatform`) and tracked there. Do not bring it back into the inboxos repo.
**Original rationale (preserved for the audit trail):** 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).
## v1.3 candidate requirements
> The following requirements are IDEATION CANDIDATES. They have not been
> approved by the CPO. They are derived from the v1.3 codebase-drift
> IDEATE pass (per `.ciagent/inboxos/ideation/v1.3-candidates.md`),
> which was issued from scratch because the Gitea issue queue assigned
> to `cloudinit-bot` is now empty (the CTO has closed INB-183 and
> INB-193, the only two issues the bot previously owned). The candidate
> set is sourced from Tier 1 (mechanical / code-scraped) + Tier 2
> (v1.1 backlog carryover) ideation. Each candidate is marked
> **[CANDIDATE]** until the CPO authors a matching entry in
> `docs/requirements.md` (CPO-owned, per board mandate `b49cfb7`).
>
> **Disposition:** 9 ACCEPT, 3 DEFER, 0 REJECT. The DEFER set
> (REQ-INB-35, REQ-INB-38, REQ-INB-39) is filed for v1.4+
> follow-up. The v1.2 carry-forward REQ-INB-26 (INB-183,
> paperclip monorepo) is `[REJECTED — out of domain]` and
> remains so in v1.3; the v1.2 polite-rejection comment
> (`tea comment 8`, 2026-06-08) is the final disposition.
### REQ-INB-28 — `docs/gitea-actions.md:95` `cto-inboxos` → `jc-capital`
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-1; missed by the v1.1 P0 sweep (file last touched at Phase 4 / INB-33, before the org migration)
**Parent:** REQ-INB-6, REQ-INB-10
**Confidence:** 0.90
**Effort:** XS
**Schema impact:** no
**Disposition:** ACCEPT (P0)
**Acceptance criterion:** `docs/gitea-actions.md:95` (the verify-runner `curl` example) replaces the hardcoded `cto-inboxos/inboxos` with `jc-capital/inboxos` (and `${GITEA_OWNER:-jc-capital}/inboxos` for runtime correctness). The same fix shape as the v1.1 auto-applied P0 sweep (commits `7c20d5d`, `d530921`).
### REQ-INB-29 — Runbook footer "Next review" pointer update
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-2
**Parent:** REQ-INB-6
**Confidence:** 0.95
**Effort:** XS
**Schema impact:** no
**Disposition:** ACCEPT
**Acceptance criterion:** `docs/operations-runbook.md:823` (footer) updates "Next review: after the v1.1 ship (2026-06-08, milestone `milestone/v1.1-initial`)" to point at v1.3 (the active ideation milestone on `milestone/v1.3-initial`).
### REQ-INB-30 — Runbook §4.5 forward-pointer update (alerting)
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-3
**Parent:** REQ-INB-6, REQ-INB-23
**Confidence:** 0.80
**Effort:** XS
**Schema impact:** no
**Disposition:** ACCEPT
**Acceptance criterion:** `docs/operations-runbook.md:285-289` (the §4.5 "Forward-pointer") updates the "alert layer is the next v1.2 deliverable" claim to "alerting remains out of scope; v1.2 closed on a 0/1 disposition with no alerting deliverable; the next v1.x candidate cycle may re-evaluate per the v1.3 review's post-hoc backlog."
### REQ-INB-31 — `papra-write-policy.md:192` test count correction
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-4
**Parent:** REQ-INB-9, REQ-INB-20
**Confidence:** 0.90
**Effort:** XS
**Schema impact:** no
**Disposition:** ACCEPT
**Acceptance criterion:** `docs/papra-write-policy.md:192` updates the "covers 13 cases" claim to "covers 15 cases" (the v1.1 EXECUTE stage added 2 tests: `test_papra_dry_run_override_wins` and `test_emit_papra_write_gate_event_logs_three_fields`).
### REQ-INB-32 — `extraction-contract.md` line-ref refresh
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-5
**Parent:** REQ-INB-4, REQ-INB-14
**Confidence:** 0.85
**Effort:** S
**Schema impact:** no
**Disposition:** ACCEPT
**Acceptance criterion:** `docs/extraction-contract.md` line refs (`pipelines/common.py:414-479`, `:605-624`, `:378-407`, and the opencode backend cite) update to the post-v1.0/v1.1 line-shuffled positions: `LLMConfig.from_env()` at `pipelines/common.py:536`, `ollama_run_command` at `pipelines/common.py:609`, `_ollama_call_one_model` at `pipelines/common.py:636`, the opencode backend at `pipelines/common.py:440`. The 4-line doc edit preserves the contract semantics (model pin, prompt path, JSON parse).
### REQ-INB-33 — `.env.example` 7-entry addition
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-6
**Parent:** REQ-INB-6, REQ-INB-9, REQ-INB-11
**Confidence:** 0.80
**Effort:** S
**Schema impact:** no
**Disposition:** ACCEPT
**Acceptance criterion:** `.env.example` gains 7 commented-out entries (with the workflow-baked defaults) for: `OLLAMA_API_KEY=""`, `INBOXOS_LLM_BACKEND=ollama`, `PAPRA_DRY_RUN=true`, `PAPRA_BODY_WRITE_MODULES=crm,finance,legal`, `PAPRA_METADATA_ONLY_MODULES=intel,promotions`, `MBOX_BUCKET=`, `OPENCODE_NPM_VERSION=latest`. The new entries are grouped in a "Workflow tunables" section that the existing `IMAP_*` / `NOCODB_*` / `SEAWEEDFS_*` / `PAPRA_*` / `GITEA_*` blocks precede.
### REQ-INB-34 — Wire 6 v1.1 offline tests into `ci-pr.yml` merge gate
**Status:** [CANDIDATE]
**Source:** Mechanical scan, T1-7; absorbs v1.3 PIT-V1.3-3
**Parent:** REQ-INB-8
**Confidence:** 0.90
**Effort:** S
**Schema impact:** no
**Disposition:** ACCEPT (P0)
**Acceptance criterion:** `.gitea/workflows/ci-pr.yml` gains a new job (or extends the existing `fast-tests` job) to invoke the 6 v1.1 offline tests that the v1.1 EXECUTE stage added: `test_papra_decide_offline.py`, `test_papra_index_offline.py`, `test_papra_link_parity_offline.py`, `test_metrics_offline.py`, `test_restore_offline.py`, `test_rotate_secrets_offline.py`. The 6 tests join the existing `test_gitea_request_offline.py` / `test_mbox_stream.py` / `test_live_pipeline_offline.py` fast-tests set. The wire-up follows the existing heredoc-based pattern at `ci-pr.yml:106-134` (the historical-pipeline offline test fast-subset).
### REQ-INB-35 — `.gitignore` `opencode.json` line shadow
**Status:** [CANDIDATE — DEFERRED to v1.4+]
**Source:** Mechanical scan, T1-8
**Parent:** REQ-INB-14, REQ-INB-11
**Confidence:** 0.65
**Effort:** XS
**Schema impact:** no
**Disposition:** DEFER (low value, footgun-minor)
**Rationale:** The `opencode.json` file is tracked (5 commits) and the .gitignore pattern is intentional defense-in-depth (allows local override while still keeping a committed default). The footgun is real but minor; the fix (removing the .gitignore line) opens a separate question about whether the file should be tracked at all. Defer to v1.4 as a lead-developer judgment call.
### REQ-INB-36 — Runbook §6 ordering: `6.1 → 6.2 → 6.3 → 6.4`
**Status:** [CANDIDATE]
**Source:** v1.1 backlog P1-1, T2-1
**Parent:** REQ-INB-6
**Confidence:** 0.95
**Effort:** XS
**Schema impact:** no
**Disposition:** ACCEPT
**Acceptance criterion:** `docs/operations-runbook.md` §6 renumbers from `6.1 → 6.4 → 6.2 → 6.3` to `6.1 → 6.2 → 6.3 → 6.4`. The v1.1 insertion of §6.4 (`Secret rotation`, REQ-INB-21) between §6.1 (`Secret inventory`) and §6.2 (`Why we never commit secrets`) is moved to its proper position (after §6.3). The renumber is a 4-section edit plus the §6 / §10 cross-references at the runbook footer.
### REQ-INB-37 — `scripts/setup_gitea_secrets.sh` `cto-inboxos` → `jc-capital`
**Status:** [CANDIDATE]
**Source:** v1.1 backlog P1-2, T2-2
**Parent:** REQ-INB-10
**Confidence:** 0.90
**Effort:** XS
**Schema impact:** no
**Disposition:** ACCEPT (P1, same risk profile as v1.1 P0)
**Acceptance criterion:** `scripts/setup_gitea_secrets.sh:4,14,18,28` (header comments x2 + `GITEA_OWNER="${GITEA_OWNER:-cto-inboxos}"`) replace `cto-inboxos` with `${GITEA_OWNER:-jc-capital}` (the env-var-resolved default) — same pattern as the v1.1 auto-applied P0 sweep at commit `7c20d5d`. Pair with REQ-INB-28 in the same PR for a single-pass cto-inboxos → jc-capital migration closure.
### REQ-INB-38 — `apply_schemas.py --check` offline test for `papra_index`
**Status:** [CANDIDATE — DEFERRED to v1.4+]
**Source:** v1.1 backlog P2-1, T2-3
**Parent:** REQ-INB-5, REQ-INB-19
**Confidence:** 0.85
**Effort:** XS
**Schema impact:** no
**Disposition:** DEFER (low value)
**Rationale:** The mechanical fix is 3-5 lines, but the test would have to mock the NocoDB HTTP layer (similar to the pattern in `test_papra_index_offline.py:144`'s `FakeNoco`). The runtime path is already covered by `test_papra_index_offline.py` (3/3 pass). Defer to v1.4 unless the v1.3 PLAN bundles it with REQ-INB-34 for one-off test wiring.
### REQ-INB-39 — `test_papra_link_parity_offline.py` `imapclient` runtime shim
**Status:** [CANDIDATE — DEFERRED to v1.4+]
**Source:** v1.1 backlog P2-2, T2-4
**Parent:** REQ-INB-25, REQ-INB-8
**Confidence:** 0.55
**Effort:** S
**Schema impact:** no
**Disposition:** DEFER (accepted-precedent disposition)
**Rationale:** The v1.0 and v1.1 cycles both accepted the deferred-runtime disposition (v1.0 for `test_upsert_synthetic.py`, v1.1 for `test_papra_link_parity_offline.py`). The 5-line `sys.modules["imapclient"] = types.ModuleType(...)` shim has to satisfy the `from imapclient import IMAPClient` chain in `live_pipeline.py:49` without breaking the existing `live_pipeline` semantics. Low confidence (0.55). Defer to v1.4 unless the lead-developer is willing to take a swing at the shim.
+34
View File
@@ -102,3 +102,37 @@
- **Final candidates for PLAN/EXECUTE:** 0.
- **Tag:** v1.2.0 (no-feature delta over v1.1.0; v1.2 closes on
the 0/1 disposition).
## v1.3 ideation (Phase 01)
- **Goal**: present v1.3 candidate requirements for CPO review, sourced
from codebase-drift ideation (Tier 1 mechanical + Tier 2
v1.1-backlog carryover).
- **Status**: executed 2026-06-08. 9 candidates accepted; 3
candidates deferred to v1.4+; 0 rejected. The Gitea issue
queue assigned to `cloudinit-bot` is empty (CTO has closed
both INB-183 [rejected in v1.2] and INB-193 [the wrapper
originally planned for v1.3]), so the v1.3 IDEATE pass is
driven entirely by codebase analysis.
- **Source**: codebase mechanical scan (pipelines/,
.gitea/workflows/, docker/, scripts/, docs/,
.opencode/commands/, opencode.json, .env.example, .gitignore)
+ v1.1 backlog (`remaining_for_v1_2: [P1-1, P1-2, P2-1, P2-2]`)
+ v1.3 research PIT items.
- **Disposition**: 9 ACCEPT (REQ-INB-28..34, 36, 37), 3 DEFER
(REQ-INB-35, 38, 39), 0 REJECT. Accept ratio 9/12 (75%).
No NocoDB schema impact. v1.3 is doc-hygiene + test-wiring
+ env-file-drift + cto-inboxos closure.
- **Acceptance gate**: 9/12 disposition (9 accepted, 3
deferred). Closes v1.1 backlog P1-1 (§6 ordering) and P1-2
(setup_gitea_secrets.sh owner). The DEFER set is filed for
v1.4+ in `.ciagent/inboxos/ideation/v1.3-candidates.md §9`.
- **Cross-project**: 0 candidates. CP-1 (paperclip not a
registered CIAgent project) carries forward from v1.2
closed-by-negation.
- **Artifacts**: `.ciagent/inboxos/ideation/v1.3-candidates.md`
(646 lines, 11 sections), `.ciagent/inboxos/REQUIREMENTS.md`
v1.3 section (12 candidates REQ-INB-28..39 with full
acceptance criteria, file:line evidence, and dispositions).
- **Final candidates for PLAN/EXECUTE:** 9
(REQ-INB-28, 29, 30, 31, 32, 33, 34, 36, 37).